From 456adf2dd7f458fab93272fe72c3b1420184a6ad Mon Sep 17 00:00:00 2001
From: Yash Rathi <57002207+yashrathi-git@users.noreply.github.com>
Date: Tue, 14 Sep 2021 23:01:42 +0530
Subject: [PATCH 001/351] Update codecov version
v1 is deprecated
---
.github/workflows/pythonpackage.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/pythonpackage.yml b/.github/workflows/pythonpackage.yml
index f2c7c61b3a..1e375ef1d7 100644
--- a/.github/workflows/pythonpackage.yml
+++ b/.github/workflows/pythonpackage.yml
@@ -40,7 +40,7 @@ jobs:
source $VENV
pytest tests -v --cov=./rich --cov-report=xml:./coverage.xml --cov-report term-missing
- name: Upload code coverage
- uses: codecov/codecov-action@v1.0.10
+ uses: codecov/codecov-action@v2
with:
token: ${{ secrets.CODECOV_TOKEN }}
file: ./coverage.xml
From 67710ab5c323e0f21817cc5f4cdd10a178da1e05 Mon Sep 17 00:00:00 2001
From: Yash Rathi <57002207+yashrathi-git@users.noreply.github.com>
Date: Wed, 15 Sep 2021 08:43:51 +0530
Subject: [PATCH 002/351] Bump actions/checkout version
---
.github/workflows/pythonpackage.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/pythonpackage.yml b/.github/workflows/pythonpackage.yml
index 1e375ef1d7..cdb1730cdb 100644
--- a/.github/workflows/pythonpackage.yml
+++ b/.github/workflows/pythonpackage.yml
@@ -13,7 +13,7 @@ jobs:
run:
shell: bash
steps:
- - uses: actions/checkout@v1
+ - uses: actions/checkout@v2
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v2
with:
From 92e1b7ac7026142aeec36ff2f54ffd7c2875c8d2 Mon Sep 17 00:00:00 2001
From: toto6038 <50100922+toto6038@users.noreply.github.com>
Date: Tue, 18 Jan 2022 03:57:27 +0800
Subject: [PATCH 003/351] Rename `README.cn.md`, and apply link change
---
README.de-ch.md | 3 ++-
README.de.md | 3 ++-
README.es.md | 3 ++-
README.fr.md | 3 ++-
README.hi.md | 3 ++-
README.it.md | 3 ++-
README.ja.md | 3 ++-
README.kr.md | 3 ++-
README.pt-br.md | 3 ++-
README.ru.md | 3 ++-
README.sv.md | 3 ++-
README.cn.md => README.zh-cn.md | 3 ++-
12 files changed, 24 insertions(+), 12 deletions(-)
rename README.cn.md => README.zh-cn.md (98%)
diff --git a/README.de-ch.md b/README.de-ch.md
index e965753221..4d6359ff52 100644
--- a/README.de-ch.md
+++ b/README.de-ch.md
@@ -7,7 +7,8 @@

[English readme](https://github.com/willmcgugan/rich/blob/master/README.md)
- • [中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md)
+ • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-cn.md)
+ • [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md)
• [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md)
• [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md)
• [Läs på svenska](https://github.com/willmcgugan/rich/blob/master/README.sv.md)
diff --git a/README.de.md b/README.de.md
index 38cf845d79..148f146f21 100644
--- a/README.de.md
+++ b/README.de.md
@@ -7,7 +7,8 @@

[English readme](https://github.com/willmcgugan/rich/blob/master/README.md)
- • [中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md)
+ • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-cn.md)
+ • [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md)
• [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md)
• [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md)
• [Läs på svenska](https://github.com/willmcgugan/rich/blob/master/README.sv.md)
diff --git a/README.es.md b/README.es.md
index a3aa631cab..ec4e4f4253 100644
--- a/README.es.md
+++ b/README.es.md
@@ -7,7 +7,8 @@

[English readme](https://github.com/willmcgugan/rich/blob/master/README.md)
- • [中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md)
+ • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-cn.md)
+ • [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md)
• [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md)
• [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md)
• [Läs på svenska](https://github.com/willmcgugan/rich/blob/master/README.sv.md)
diff --git a/README.fr.md b/README.fr.md
index 394f03bf83..0fbea94fc0 100644
--- a/README.fr.md
+++ b/README.fr.md
@@ -7,7 +7,8 @@

[English readme](https://github.com/willmcgugan/rich/blob/master/README.md)
- • [中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md)
+ • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-cn.md)
+ • [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md)
• [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md)
• [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md)
• [Läs på svenska](https://github.com/willmcgugan/rich/blob/master/README.sv.md)
diff --git a/README.hi.md b/README.hi.md
index 9c3009f4fa..443472c5c8 100644
--- a/README.hi.md
+++ b/README.hi.md
@@ -7,7 +7,8 @@

[English readme](https://github.com/willmcgugan/rich/blob/master/README.md)
- • [中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md)
+ • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-cn.md)
+ • [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md)
• [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md)
• [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md)
• [Läs på svenska](https://github.com/willmcgugan/rich/blob/master/README.sv.md)
diff --git a/README.it.md b/README.it.md
index 7d0b68d714..cf2e2c5fe0 100644
--- a/README.it.md
+++ b/README.it.md
@@ -6,7 +6,8 @@

[English readme](https://github.com/willmcgugan/rich/blob/master/README.md)
- • [中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md)
+ • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-cn.md)
+ • [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md)
• [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md)
• [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md)
• [Läs på svenska](https://github.com/willmcgugan/rich/blob/master/README.sv.md)
diff --git a/README.ja.md b/README.ja.md
index 1bec484597..0429d11509 100644
--- a/README.ja.md
+++ b/README.ja.md
@@ -7,7 +7,8 @@

[English readme](https://github.com/willmcgugan/rich/blob/master/README.md)
- • [中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md)
+ • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-cn.md)
+ • [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md)
• [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md)
• [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md)
• [Läs på svenska](https://github.com/willmcgugan/rich/blob/master/README.sv.md)
diff --git a/README.kr.md b/README.kr.md
index a1a67ea95d..e3aa03134e 100644
--- a/README.kr.md
+++ b/README.kr.md
@@ -7,7 +7,8 @@

[English readme](https://github.com/willmcgugan/rich/blob/master/README.md)
- • [中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md)
+ • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-cn.md)
+ • [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md)
• [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md)
• [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md)
• [Läs på svenska](https://github.com/willmcgugan/rich/blob/master/README.sv.md)
diff --git a/README.pt-br.md b/README.pt-br.md
index c2294502ea..3d888ee449 100644
--- a/README.pt-br.md
+++ b/README.pt-br.md
@@ -7,7 +7,8 @@

[English readme](https://github.com/willmcgugan/rich/blob/master/README.md)
- • [中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md)
+ • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-cn.md)
+ • [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md)
• [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md)
• [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md)
• [Läs på svenska](https://github.com/willmcgugan/rich/blob/master/README.sv.md)
diff --git a/README.ru.md b/README.ru.md
index 4223309d97..d9a02c21c4 100644
--- a/README.ru.md
+++ b/README.ru.md
@@ -8,7 +8,8 @@

[English readme](https://github.com/willmcgugan/rich/blob/master/README.md)
- • [中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md)
+ • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-cn.md)
+ • [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md)
• [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md)
• [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md)
• [Läs på svenska](https://github.com/willmcgugan/rich/blob/master/README.sv.md)
diff --git a/README.sv.md b/README.sv.md
index 35b2669791..b630b3e7f9 100644
--- a/README.sv.md
+++ b/README.sv.md
@@ -7,7 +7,8 @@

[English readme](https://github.com/willmcgugan/rich/blob/master/README.md)
- • [中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md)
+ • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-cn.md)
+ • [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md)
• [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md)
• [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md)
• [Läs på svenska](https://github.com/willmcgugan/rich/blob/master/README.sv.md)
diff --git a/README.cn.md b/README.zh-cn.md
similarity index 98%
rename from README.cn.md
rename to README.zh-cn.md
index 3fc571cd72..97f0996340 100644
--- a/README.cn.md
+++ b/README.zh-cn.md
@@ -7,7 +7,8 @@

[English readme](https://github.com/willmcgugan/rich/blob/master/README.md)
- • [中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md)
+ • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-cn.md)
+ • [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md)
• [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md)
• [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md)
• [Läs på svenska](https://github.com/willmcgugan/rich/blob/master/README.sv.md)
From 506432672b0ad481db18de3b2c8cb9c0fbb69827 Mon Sep 17 00:00:00 2001
From: toto6038 <50100922+toto6038@users.noreply.github.com>
Date: Tue, 18 Jan 2022 03:58:06 +0800
Subject: [PATCH 004/351] Add `README.zh-tw.md`
---
README.zh-tw.md | 457 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 457 insertions(+)
create mode 100644 README.zh-tw.md
diff --git a/README.zh-tw.md b/README.zh-tw.md
new file mode 100644
index 0000000000..189b1fadad
--- /dev/null
+++ b/README.zh-tw.md
@@ -0,0 +1,457 @@
+[](https://pepy.tech/project/rich)
+[](https://badge.fury.io/py/rich)
+[](https://codecov.io/gh/willmcgugan/rich)
+[](https://www.willmcgugan.com/tag/rich/)
+[](https://twitter.com/willmcgugan)
+
+
+
+[English readme](https://github.com/willmcgugan/rich/blob/master/README.md)
+ • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-cn.md)
+ • [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md)
+ • [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md)
+ • [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md)
+ • [Läs på svenska](https://github.com/willmcgugan/rich/blob/master/README.sv.md)
+ • [日本語 readme](https://github.com/willmcgugan/rich/blob/master/README.ja.md)
+ • [한국어 readme](https://github.com/willmcgugan/rich/blob/master/README.kr.md)
+ • [Français readme](https://github.com/willmcgugan/rich/blob/master/README.fr.md)
+ • [Schwizerdütsch readme](https://github.com/willmcgugan/rich/blob/master/README.de-ch.md)
+ • [हिन्दी readme](https://github.com/willmcgugan/rich/blob/master/README.hi.md)
+ • [Português brasileiro readme](https://github.com/willmcgugan/rich/blob/master/README.pt-br.md)
+ • [Italian readme](https://github.com/willmcgugan/rich/blob/master/README.it.md)
+ • [Русский readme](https://github.com/willmcgugan/rich/blob/master/README.ru.md)
+
+Rich is a Python library for _rich_ text and beautiful formatting in the terminal.
+
+The [Rich API](https://rich.readthedocs.io/en/latest/) makes it easy to add color and style to terminal output. Rich can also render pretty tables, progress bars, markdown, syntax highlighted source code, tracebacks, and more — out of the box.
+
+
+
+For a video introduction to Rich see [calmcode.io](https://calmcode.io/rich/introduction.html) by [@fishnets88](https://twitter.com/fishnets88).
+
+See what [people are saying about Rich](https://www.willmcgugan.com/blog/pages/post/rich-tweets/).
+
+## Compatibility
+
+Rich works with Linux, OSX, and Windows. True color / emoji works with new Windows Terminal, classic terminal is limited to 16 colors. Rich requires Python 3.6.1 or later.
+
+Rich works with [Jupyter notebooks](https://jupyter.org/) with no additional configuration required.
+
+## Installing
+
+Install with `pip` or your favorite PyPI package manager.
+
+```sh
+python -m pip install rich
+```
+
+Run the following to test Rich output on your terminal:
+
+```sh
+python -m rich
+```
+
+## Rich Print
+
+To effortlessly add rich output to your application, you can import the [rich print](https://rich.readthedocs.io/en/latest/introduction.html#quick-start) method, which has the same signature as the builtin Python function. Try this:
+
+```python
+from rich import print
+
+print("Hello, [bold magenta]World[/bold magenta]!", ":vampire:", locals())
+```
+
+
+
+## Rich REPL
+
+Rich can be installed in the Python REPL, so that any data structures will be pretty printed and highlighted.
+
+```python
+>>> from rich import pretty
+>>> pretty.install()
+```
+
+
+
+## Using the Console
+
+For more control over rich terminal content, import and construct a [Console](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console) object.
+
+```python
+from rich.console import Console
+
+console = Console()
+```
+
+The Console object has a `print` method which has an intentionally similar interface to the builtin `print` function. Here's an example of use:
+
+```python
+console.print("Hello", "World!")
+```
+
+As you might expect, this will print `"Hello World!"` to the terminal. Note that unlike the builtin `print` function, Rich will word-wrap your text to fit within the terminal width.
+
+There are a few ways of adding color and style to your output. You can set a style for the entire output by adding a `style` keyword argument. Here's an example:
+
+```python
+console.print("Hello", "World!", style="bold red")
+```
+
+The output will be something like the following:
+
+
+
+That's fine for styling a line of text at a time. For more finely grained styling, Rich renders a special markup which is similar in syntax to [bbcode](https://en.wikipedia.org/wiki/BBCode). Here's an example:
+
+```python
+console.print("Where there is a [bold cyan]Will[/bold cyan] there [u]is[/u] a [i]way[/i].")
+```
+
+
+
+You can use a Console object to generate sophisticated output with minimal effort. See the [Console API](https://rich.readthedocs.io/en/latest/console.html) docs for details.
+
+## Rich Inspect
+
+Rich has an [inspect](https://rich.readthedocs.io/en/latest/reference/init.html?highlight=inspect#rich.inspect) function which can produce a report on any Python object, such as class, instance, or builtin.
+
+```python
+>>> my_list = ["foo", "bar"]
+>>> from rich import inspect
+>>> inspect(my_list, methods=True)
+```
+
+
+
+See the [inspect docs](https://rich.readthedocs.io/en/latest/reference/init.html#rich.inspect) for details.
+
+# Rich Library
+
+Rich contains a number of builtin _renderables_ you can use to create elegant output in your CLI and help you debug your code.
+
+Click the following headings for details:
+
+
+Log
+
+The Console object has a `log()` method which has a similar interface to `print()`, but also renders a column for the current time and the file and line which made the call. By default Rich will do syntax highlighting for Python structures and for repr strings. If you log a collection (i.e. a dict or a list) Rich will pretty print it so that it fits in the available space. Here's an example of some of these features.
+
+```python
+from rich.console import Console
+console = Console()
+
+test_data = [
+ {"jsonrpc": "2.0", "method": "sum", "params": [None, 1, 2, 4, False, True], "id": "1",},
+ {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]},
+ {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": "2"},
+]
+
+def test_log():
+ enabled = False
+ context = {
+ "foo": "bar",
+ }
+ movies = ["Deadpool", "Rise of the Skywalker"]
+ console.log("Hello from", console, "!")
+ console.log(test_data, log_locals=True)
+
+
+test_log()
+```
+
+The above produces the following output:
+
+
+
+Note the `log_locals` argument, which outputs a table containing the local variables where the log method was called.
+
+The log method could be used for logging to the terminal for long running applications such as servers, but is also a very nice debugging aid.
+
+
+
+Logging Handler
+
+You can also use the builtin [Handler class](https://rich.readthedocs.io/en/latest/logging.html) to format and colorize output from Python's logging module. Here's an example of the output:
+
+
+
+
+
+
+Emoji
+
+To insert an emoji in to console output place the name between two colons. Here's an example:
+
+```python
+>>> console.print(":smiley: :vampire: :pile_of_poo: :thumbs_up: :raccoon:")
+😃 🧛 💩 👍 🦝
+```
+
+Please use this feature wisely.
+
+
+
+
+Tables
+
+Rich can render flexible [tables](https://rich.readthedocs.io/en/latest/tables.html) with unicode box characters. There is a large variety of formatting options for borders, styles, cell alignment etc.
+
+
+
+The animation above was generated with [table_movie.py](https://github.com/willmcgugan/rich/blob/master/examples/table_movie.py) in the examples directory.
+
+Here's a simpler table example:
+
+```python
+from rich.console import Console
+from rich.table import Table
+
+console = Console()
+
+table = Table(show_header=True, header_style="bold magenta")
+table.add_column("Date", style="dim", width=12)
+table.add_column("Title")
+table.add_column("Production Budget", justify="right")
+table.add_column("Box Office", justify="right")
+table.add_row(
+ "Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$275,000,000", "$375,126,118"
+)
+table.add_row(
+ "May 25, 2018",
+ "[red]Solo[/red]: A Star Wars Story",
+ "$275,000,000",
+ "$393,151,347",
+)
+table.add_row(
+ "Dec 15, 2017",
+ "Star Wars Ep. VIII: The Last Jedi",
+ "$262,000,000",
+ "[bold]$1,332,539,889[/bold]",
+)
+
+console.print(table)
+```
+
+This produces the following output:
+
+
+
+Note that console markup is rendered in the same way as `print()` and `log()`. In fact, anything that is renderable by Rich may be included in the headers / rows (even other tables).
+
+The `Table` class is smart enough to resize columns to fit the available width of the terminal, wrapping text as required. Here's the same example, with the terminal made smaller than the table above:
+
+
+
+
+
+
+Progress Bars
+
+Rich can render multiple flicker-free [progress](https://rich.readthedocs.io/en/latest/progress.html) bars to track long-running tasks.
+
+For basic usage, wrap any sequence in the `track` function and iterate over the result. Here's an example:
+
+```python
+from rich.progress import track
+
+for step in track(range(100)):
+ do_step(step)
+```
+
+It's not much harder to add multiple progress bars. Here's an example taken from the docs:
+
+
+
+The columns may be configured to show any details you want. Built-in columns include percentage complete, file size, file speed, and time remaining. Here's another example showing a download in progress:
+
+
+
+To try this out yourself, see [examples/downloader.py](https://github.com/willmcgugan/rich/blob/master/examples/downloader.py) which can download multiple URLs simultaneously while displaying progress.
+
+
+
+
+Status
+
+For situations where it is hard to calculate progress, you can use the [status](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console.status) method which will display a 'spinner' animation and message. The animation won't prevent you from using the console as normal. Here's an example:
+
+```python
+from time import sleep
+from rich.console import Console
+
+console = Console()
+tasks = [f"task {n}" for n in range(1, 11)]
+
+with console.status("[bold green]Working on tasks...") as status:
+ while tasks:
+ task = tasks.pop(0)
+ sleep(1)
+ console.log(f"{task} complete")
+```
+
+This generates the following output in the terminal.
+
+
+
+The spinner animations were borrowed from [cli-spinners](https://www.npmjs.com/package/cli-spinners). You can select a spinner by specifying the `spinner` parameter. Run the following command to see the available values:
+
+```
+python -m rich.spinner
+```
+
+The above command generates the following output in the terminal:
+
+
+
+
+
+
+Tree
+
+Rich can render a [tree](https://rich.readthedocs.io/en/latest/tree.html) with guide lines. A tree is ideal for displaying a file structure, or any other hierarchical data.
+
+The labels of the tree can be simple text or anything else Rich can render. Run the following for a demonstration:
+
+```
+python -m rich.tree
+```
+
+This generates the following output:
+
+
+
+See the [tree.py](https://github.com/willmcgugan/rich/blob/master/examples/tree.py) example for a script that displays a tree view of any directory, similar to the linux `tree` command.
+
+
+
+
+Columns
+
+Rich can render content in neat [columns](https://rich.readthedocs.io/en/latest/columns.html) with equal or optimal width. Here's a very basic clone of the (MacOS / Linux) `ls` command which displays a directory listing in columns:
+
+```python
+import os
+import sys
+
+from rich import print
+from rich.columns import Columns
+
+directory = os.listdir(sys.argv[1])
+print(Columns(directory))
+```
+
+The following screenshot is the output from the [columns example](https://github.com/willmcgugan/rich/blob/master/examples/columns.py) which displays data pulled from an API in columns:
+
+
+
+
+
+
+Markdown
+
+Rich can render [markdown](https://rich.readthedocs.io/en/latest/markdown.html) and does a reasonable job of translating the formatting to the terminal.
+
+To render markdown import the `Markdown` class and construct it with a string containing markdown code. Then print it to the console. Here's an example:
+
+```python
+from rich.console import Console
+from rich.markdown import Markdown
+
+console = Console()
+with open("README.md") as readme:
+ markdown = Markdown(readme.read())
+console.print(markdown)
+```
+
+This will produce output something like the following:
+
+
+
+
+
+
+Syntax Highlighting
+
+Rich uses the [pygments](https://pygments.org/) library to implement [syntax highlighting](https://rich.readthedocs.io/en/latest/syntax.html). Usage is similar to rendering markdown; construct a `Syntax` object and print it to the console. Here's an example:
+
+```python
+from rich.console import Console
+from rich.syntax import Syntax
+
+my_code = '''
+def iter_first_last(values: Iterable[T]) -> Iterable[Tuple[bool, bool, T]]:
+ """Iterate and generate a tuple with a flag for first and last value."""
+ iter_values = iter(values)
+ try:
+ previous_value = next(iter_values)
+ except StopIteration:
+ return
+ first = True
+ for value in iter_values:
+ yield first, False, previous_value
+ first = False
+ previous_value = value
+ yield first, True, previous_value
+'''
+syntax = Syntax(my_code, "python", theme="monokai", line_numbers=True)
+console = Console()
+console.print(syntax)
+```
+
+This will produce the following output:
+
+
+
+
+
+
+Tracebacks
+
+Rich can render [beautiful tracebacks](https://rich.readthedocs.io/en/latest/traceback.html) which are easier to read and show more code than standard Python tracebacks. You can set Rich as the default traceback handler so all uncaught exceptions will be rendered by Rich.
+
+Here's what it looks like on OSX (similar on Linux):
+
+
+
+
+
+All Rich renderables make use of the [Console Protocol](https://rich.readthedocs.io/en/latest/protocol.html), which you can also use to implement your own Rich content.
+
+# Rich for enterprise
+
+Available as part of the Tidelift Subscription.
+
+The maintainers of Rich and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use. [Learn more.](https://tidelift.com/subscription/pkg/pypi-rich?utm_source=pypi-rich&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)
+
+# Projects using Rich
+
+Here are a few projects using Rich:
+
+- [BrancoLab/BrainRender](https://github.com/BrancoLab/BrainRender)
+ a python package for the visualization of three dimensional neuro-anatomical data
+- [Ciphey/Ciphey](https://github.com/Ciphey/Ciphey)
+ Automated decryption tool
+- [emeryberger/scalene](https://github.com/emeryberger/scalene)
+ a high-performance, high-precision CPU and memory profiler for Python
+- [hedythedev/StarCli](https://github.com/hedythedev/starcli)
+ Browse GitHub trending projects from your command line
+- [intel/cve-bin-tool](https://github.com/intel/cve-bin-tool)
+ This tool scans for a number of common, vulnerable components (openssl, libpng, libxml2, expat and a few others) to let you know if your system includes common libraries with known vulnerabilities.
+- [nf-core/tools](https://github.com/nf-core/tools)
+ Python package with helper tools for the nf-core community.
+- [cansarigol/pdbr](https://github.com/cansarigol/pdbr)
+ pdb + Rich library for enhanced debugging
+- [plant99/felicette](https://github.com/plant99/felicette)
+ Satellite imagery for dummies.
+- [seleniumbase/SeleniumBase](https://github.com/seleniumbase/SeleniumBase)
+ Automate & test 10x faster with Selenium & pytest. Batteries included.
+- [smacke/ffsubsync](https://github.com/smacke/ffsubsync)
+ Automagically synchronize subtitles with video.
+- [tryolabs/norfair](https://github.com/tryolabs/norfair)
+ Lightweight Python library for adding real-time 2D object tracking to any detector.
+- [ansible/ansible-lint](https://github.com/ansible/ansible-lint) Ansible-lint checks playbooks for practices and behaviour that could potentially be improved
+- [ansible-community/molecule](https://github.com/ansible-community/molecule) Ansible Molecule testing framework
+- +[Many more](https://github.com/willmcgugan/rich/network/dependents)!
+
+
From 9c0eab6a64595af994248635070ae5c84641ca8e Mon Sep 17 00:00:00 2001
From: Vitor Barbosa
Date: Wed, 19 Jan 2022 14:38:37 -0300
Subject: [PATCH 005/351] Fix version tags on the changelog
---
CHANGELOG.md | 295 +++++++++++++++++++++++++--------------------------
1 file changed, 146 insertions(+), 149 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 34ef0c3b81..363cd48882 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -81,8 +81,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Fixed issue with progress bar not rendering markup https://github.com/willmcgugan/rich/issues/1721
- Fixed race condition when exiting Live https://github.com/willmcgugan/rich/issues/1530
-[10.15.0]: https://github.com/willmcgugan/rich/compare/v10.14.0...v10.15.0
-
## [10.14.0] - 2021-11-16
### Fixed
@@ -379,7 +377,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [9.12.1] - 2021-02-27
-### Fixed
+### Fixed
- Fixed deadlock in Progress https://github.com/willmcgugan/rich/issues/1061
@@ -436,7 +434,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Fixed error message for tracebacks with broken `__str__` https://github.com/willmcgugan/rich/issues/980
- Fixed markup edge case https://github.com/willmcgugan/rich/issues/987
-### Added
+### Added
- Added cheeky sponsorship request to test card
- Added `quiet` argument to Console constructor
@@ -495,7 +493,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [9.8.0] - 2021-01-11
-### Added
+### Added
- Added **rich_measure** for tree
- Added rich.align.VerticalCenter
@@ -584,7 +582,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [9.4.0] - 2020-12-12
-### Added
+### Added
- Added rich.live https://github.com/willmcgugan/rich/pull/382
- Added algin parameter to Rule and Console.rule
@@ -593,7 +591,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Added style parameter to Console.log
- Added rich.diagnose command
-### Changed
+### Changed
- Table.add_row style argument now applies to entire line and not just cells
- Added end_section parameter to Table.add_row to force a line underneath row
@@ -604,7 +602,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [9.3.0] - 2020-12-1
-### Added
+### Added
- Added get_datetime parameter to Console, to allow for repeatable tests
- Added get_time parameter to Console
@@ -704,7 +702,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [8.0.0] - 2020-10-03
-### Added
+### Added
- Added Console.bell method
- Added Set to types that Console.print will automatically pretty print
@@ -729,7 +727,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Added Console.begin_capture, Console.end_capture and Console.capture
- Added Table.title_justify and Table.caption_justify https://github.com/willmcgugan/rich/issues/301
-### Changed
+### Changed
- Improved formatting of exceptions
- Enabled Rich exceptions in logging https://github.com/taliraj
@@ -748,7 +746,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Added Text.remove_suffix
- Added Text.append_tokens
-### Changed
+### Changed
- Text.tabs_to_spaces was renamed to Text.expand_tabs, which works in place rather than returning a new instance
- Renamed Column.index to Column.\_index
@@ -1032,7 +1030,7 @@ Major version bump for a breaking change to `Text.stylize signature`, which corr
## [3.0.2] - 2020-07-02
-### Added
+### Added
- Added rich.styled.Styled class to apply styles to renderable
- Table.add_row now has an optional style parameter
@@ -1145,7 +1143,7 @@ Major version bump for a breaking change to `Text.stylize signature`, which corr
- Added 'transient' option to Progress
-### Changed
+### Changed
- Truncated overly long text in Rule with ellipsis overflow
@@ -1267,7 +1265,7 @@ Major version bump for a breaking change to `Text.stylize signature`, which corr
- Optimizations for Segment, Console and Table
-### Added
+### Added
- Added Console.clear method
- Added exporting of links to HTML
@@ -1289,7 +1287,7 @@ Major version bump for a breaking change to `Text.stylize signature`, which corr
## [1.1.6] - 2020-05-17
-### Added
+### Added
- Added rich.align.Align class
- Added justify argument to Console.print and console.log
@@ -1308,7 +1306,7 @@ Major version bump for a breaking change to `Text.stylize signature`, which corr
- Fixes for legacy windows: Bar, Panel, and Rule now use ASCII characters
- show_cursor is now a no-op on legacy windows
-### Added
+### Added
- Added Console.input
@@ -1610,140 +1608,139 @@ Major version bump for a breaking change to `Text.stylize signature`, which corr
- First official release, API still to be stabilized
-[11.0.0]: https://github.com/willmcgugan/rich/compare/v10.16.1...v11.0.0
+[11.0.0]: https://github.com/willmcgugan/rich/compare/v10.16.2...v11.0.0
+[10.16.2]: https://github.com/willmcgugan/rich/compare/v10.16.1...v10.16.2
[10.16.1]: https://github.com/willmcgugan/rich/compare/v10.16.0...v10.16.1
[10.16.0]: https://github.com/willmcgugan/rich/compare/v10.15.2...v10.16.0
[10.15.2]: https://github.com/willmcgugan/rich/compare/v10.15.1...v10.15.2
[10.15.1]: https://github.com/willmcgugan/rich/compare/v10.15.0...v10.15.1
-[10.14.0]: https://github.com/willmcgugan/rich/compare/v10.14.0...v10.15.0
-[10.13.0]: https://github.com/willmcgugan/rich/compare/v10.13.0...v10.14.0
-[10.12.0]: https://github.com/willmcgugan/rich/compare/v10.12.0...v10.13.0
-[10.11.0]: https://github.com/willmcgugan/rich/compare/v10.11.0...v10.12.0
-[10.10.0]: https://github.com/willmcgugan/rich/compare/v10.10.0...v10.11.0
-[10.9.0]: https://github.com/willmcgugan/rich/compare/v10.9.0...v10.10.0
-[10.8.0]: https://github.com/willmcgugan/rich/compare/v10.8.0...v10.9.0
-[10.7.0]: https://github.com/willmcgugan/rich/compare/v10.7.0...v10.8.0
-[10.6.0]: https://github.com/willmcgugan/rich/compare/v10.6.0...v10.7.0
-[10.5.0]: https://github.com/willmcgugan/rich/compare/v10.5.0...v10.6.0
-[10.4.0]: https://github.com/willmcgugan/rich/compare/v10.4.0...v10.5.0
-[10.3.0]: https://github.com/willmcgugan/rich/compare/v10.3.0...v10.4.0
-[10.2.2]: https://github.com/willmcgugan/rich/compare/v10.2.2...v10.3.0
-[10.2.1]: https://github.com/willmcgugan/rich/compare/v10.2.1...v10.2.2
-[10.2.0]: https://github.com/willmcgugan/rich/compare/v10.2.0...v10.2.1
-[10.1.0]: https://github.com/willmcgugan/rich/compare/v10.1.0...v10.2.0
-[10.0.1]: https://github.com/willmcgugan/rich/compare/v10.0.1...v10.1.0
-[10.0.0]: https://github.com/willmcgugan/rich/compare/v10.0.0...v10.0.1
-[9.13.0]: https://github.com/willmcgugan/rich/compare/v9.13.0...v10.0.0
-[9.12.4]: https://github.com/willmcgugan/rich/compare/v9.12.4...v9.13.0
-[9.12.3]: https://github.com/willmcgugan/rich/compare/v9.12.3...v9.12.4
-[9.12.2]: https://github.com/willmcgugan/rich/compare/v9.12.2...v9.12.3
-[9.12.1]: https://github.com/willmcgugan/rich/compare/v9.12.1...v9.12.2
-[9.12.0]: https://github.com/willmcgugan/rich/compare/v9.12.0...v9.12.1
-[9.11.1]: https://github.com/willmcgugan/rich/compare/v9.11.1...v9.12.0
-[9.11.0]: https://github.com/willmcgugan/rich/compare/v9.11.0...v9.11.1
-[9.10.0]: https://github.com/willmcgugan/rich/compare/v9.10.0...v9.11.0
-[9.9.0]: https://github.com/willmcgugan/rich/compare/v9.9.0...v9.10.0
-[9.8.2]: https://github.com/willmcgugan/rich/compare/v9.8.2...v9.9.0
-[9.8.1]: https://github.com/willmcgugan/rich/compare/v9.8.1...v9.8.2
-[9.8.0]: https://github.com/willmcgugan/rich/compare/v9.8.0...v9.8.1
-[9.7.0]: https://github.com/willmcgugan/rich/compare/v9.7.0...v9.8.0
-[9.6.2]: https://github.com/willmcgugan/rich/compare/v9.6.2...v9.7.0
-[9.6.1]: https://github.com/willmcgugan/rich/compare/v9.6.1...v9.6.2
-[9.6.0]: https://github.com/willmcgugan/rich/compare/v9.6.0...v9.6.1
-[9.5.1]: https://github.com/willmcgugan/rich/compare/v9.5.1...v9.6.0
-[9.5.0]: https://github.com/willmcgugan/rich/compare/v9.5.0...v9.5.1
-[9.4.0]: https://github.com/willmcgugan/rich/compare/v9.4.0...v9.5.0
-[9.3.0]: https://github.com/willmcgugan/rich/compare/v9.3.0...v9.4.0
-[9.2.0]: https://github.com/willmcgugan/rich/compare/v9.2.0...v9.3.0
-[9.1.0]: https://github.com/willmcgugan/rich/compare/v9.1.0...v9.2.0
-[9.0.1]: https://github.com/willmcgugan/rich/compare/v9.0.1...v9.1.0
-[9.0.0]: https://github.com/willmcgugan/rich/compare/v9.0.0...v9.0.1
-[8.0.0]: https://github.com/willmcgugan/rich/compare/v8.0.0...v9.0.0
-[7.1.0]: https://github.com/willmcgugan/rich/compare/v7.1.0...v8.0.0
-[7.0.0]: https://github.com/willmcgugan/rich/compare/v7.0.0...v7.1.0
-[6.2.0]: https://github.com/willmcgugan/rich/compare/v6.2.0...v7.0.0
-[6.1.2]: https://github.com/willmcgugan/rich/compare/v6.1.2...v6.2.0
-[6.1.1]: https://github.com/willmcgugan/rich/compare/v6.1.1...v6.1.2
-[6.1.0]: https://github.com/willmcgugan/rich/compare/v6.1.0...v6.1.1
-[6.0.0]: https://github.com/willmcgugan/rich/compare/v6.0.0...v6.1.0
-[5.2.1]: https://github.com/willmcgugan/rich/compare/v5.2.1...v6.0.0
-[5.2.0]: https://github.com/willmcgugan/rich/compare/v5.2.0...v5.2.1
-[5.1.2]: https://github.com/willmcgugan/rich/compare/v5.1.2...v5.2.0
-[5.1.1]: https://github.com/willmcgugan/rich/compare/v5.1.1...v5.1.2
-[5.1.0]: https://github.com/willmcgugan/rich/compare/v5.1.0...v5.1.1
-[5.0.0]: https://github.com/willmcgugan/rich/compare/v5.0.0...v5.1.0
-[4.2.2]: https://github.com/willmcgugan/rich/compare/v4.2.2...v5.0.0
-[4.2.1]: https://github.com/willmcgugan/rich/compare/v4.2.1...v4.2.2
-[4.2.0]: https://github.com/willmcgugan/rich/compare/v4.2.0...v4.2.1
-[4.1.0]: https://github.com/willmcgugan/rich/compare/v4.1.0...v4.2.0
-[4.0.0]: https://github.com/willmcgugan/rich/compare/v4.0.0...v4.1.0
-[3.4.1]: https://github.com/willmcgugan/rich/compare/v3.4.1...v4.0.0
-[3.4.0]: https://github.com/willmcgugan/rich/compare/v3.4.0...v3.4.1
-[3.3.2]: https://github.com/willmcgugan/rich/compare/v3.3.2...v3.4.0
-[3.3.1]: https://github.com/willmcgugan/rich/compare/v3.3.1...v3.3.2
-[3.3.0]: https://github.com/willmcgugan/rich/compare/v3.3.0...v3.3.1
-[3.2.0]: https://github.com/willmcgugan/rich/compare/v3.2.0...v3.3.0
-[3.1.0]: https://github.com/willmcgugan/rich/compare/v3.1.0...v3.2.0
-[3.0.5]: https://github.com/willmcgugan/rich/compare/v3.0.5...v3.1.0
-[3.0.4]: https://github.com/willmcgugan/rich/compare/v3.0.4...v3.0.5
-[3.0.3]: https://github.com/willmcgugan/rich/compare/v3.0.3...v3.0.4
-[3.0.2]: https://github.com/willmcgugan/rich/compare/v3.0.2...v3.0.3
-[3.0.1]: https://github.com/willmcgugan/rich/compare/v3.0.1...v3.0.2
-[3.0.0]: https://github.com/willmcgugan/rich/compare/v3.0.0...v3.0.1
-[2.3.1]: https://github.com/willmcgugan/rich/compare/v2.3.1...v3.0.0
-[2.3.0]: https://github.com/willmcgugan/rich/compare/v2.3.0...v2.3.1
-[2.2.6]: https://github.com/willmcgugan/rich/compare/v2.2.6...v2.3.0
-[2.2.5]: https://github.com/willmcgugan/rich/compare/v2.2.5...v2.2.6
-[2.2.4]: https://github.com/willmcgugan/rich/compare/v2.2.4...v2.2.5
-[2.2.3]: https://github.com/willmcgugan/rich/compare/v2.2.3...v2.2.4
-[2.2.2]: https://github.com/willmcgugan/rich/compare/v2.2.2...v2.2.3
-[2.2.1]: https://github.com/willmcgugan/rich/compare/v2.2.1...v2.2.2
-[2.2.0]: https://github.com/willmcgugan/rich/compare/v2.2.0...v2.2.1
-[2.1.0]: https://github.com/willmcgugan/rich/compare/v2.1.0...v2.2.0
-[2.0.1]: https://github.com/willmcgugan/rich/compare/v2.0.1...v2.1.0
-[2.0.0]: https://github.com/willmcgugan/rich/compare/v2.0.0...v2.0.1
-[1.3.1]: https://github.com/willmcgugan/rich/compare/v1.3.1...v2.0.0
-[1.3.0]: https://github.com/willmcgugan/rich/compare/v1.3.0...v1.3.1
-[1.2.3]: https://github.com/willmcgugan/rich/compare/v1.2.3...v1.3.0
-[1.2.2]: https://github.com/willmcgugan/rich/compare/v1.2.2...v1.2.3
-[1.2.1]: https://github.com/willmcgugan/rich/compare/v1.2.1...v1.2.2
-[1.2.0]: https://github.com/willmcgugan/rich/compare/v1.2.0...v1.2.1
-[1.1.9]: https://github.com/willmcgugan/rich/compare/v1.1.9...v1.2.0
-[1.1.8]: https://github.com/willmcgugan/rich/compare/v1.1.8...v1.1.9
-[1.1.7]: https://github.com/willmcgugan/rich/compare/v1.1.7...v1.1.8
-[1.1.6]: https://github.com/willmcgugan/rich/compare/v1.1.6...v1.1.7
-[1.1.5]: https://github.com/willmcgugan/rich/compare/v1.1.5...v1.1.6
-[1.1.4]: https://github.com/willmcgugan/rich/compare/v1.1.4...v1.1.5
-[1.1.3]: https://github.com/willmcgugan/rich/compare/v1.1.3...v1.1.4
-[1.1.2]: https://github.com/willmcgugan/rich/compare/v1.1.2...v1.1.3
-[1.1.1]: https://github.com/willmcgugan/rich/compare/v1.1.1...v1.1.2
-[1.1.0]: https://github.com/willmcgugan/rich/compare/v1.1.0...v1.1.1
-[1.0.3]: https://github.com/willmcgugan/rich/compare/v1.0.3...v1.1.0
-[1.0.2]: https://github.com/willmcgugan/rich/compare/v1.0.2...v1.0.3
-[1.0.1]: https://github.com/willmcgugan/rich/compare/v1.0.1...v1.0.2
-[1.0.0]: https://github.com/willmcgugan/rich/compare/v1.0.0...v1.0.1
-[0.8.13]: https://github.com/willmcgugan/rich/compare/v0.8.13...v1.0.0
-[0.8.12]: https://github.com/willmcgugan/rich/compare/v0.8.12...v0.8.13
-[0.8.11]: https://github.com/willmcgugan/rich/compare/v0.8.11...v0.8.12
-[0.8.10]: https://github.com/willmcgugan/rich/compare/v0.8.10...v0.8.11
-[0.8.9]: https://github.com/willmcgugan/rich/compare/v0.8.9...v0.8.10
-[0.8.8]: https://github.com/willmcgugan/rich/compare/v0.8.8...v0.8.9
-[0.8.7]: https://github.com/willmcgugan/rich/compare/v0.8.7...v0.8.8
-[0.8.6]: https://github.com/willmcgugan/rich/compare/v0.8.6...v0.8.7
-[0.8.5]: https://github.com/willmcgugan/rich/compare/v0.8.5...v0.8.6
-[0.8.4]: https://github.com/willmcgugan/rich/compare/v0.8.4...v0.8.5
-[0.8.3]: https://github.com/willmcgugan/rich/compare/v0.8.3...v0.8.4
-[0.8.2]: https://github.com/willmcgugan/rich/compare/v0.8.2...v0.8.3
-[0.8.1]: https://github.com/willmcgugan/rich/compare/v0.8.1...v0.8.2
-[0.8.0]: https://github.com/willmcgugan/rich/compare/v0.8.0...v0.8.1
-[0.7.2]: https://github.com/willmcgugan/rich/compare/v0.7.2...v0.8.0
-[0.7.1]: https://github.com/willmcgugan/rich/compare/v0.7.1...v0.7.2
-[0.7.0]: https://github.com/willmcgugan/rich/compare/v0.7.0...v0.7.1
-[0.6.0]: https://github.com/willmcgugan/rich/compare/v0.6.0...v0.7.0
-[0.5.0]: https://github.com/willmcgugan/rich/compare/v0.5.0...v0.6.0
-[0.4.1]: https://github.com/willmcgugan/rich/compare/v0.4.1...v0.5.0
-[0.4.0]: https://github.com/willmcgugan/rich/compare/v0.4.0...v0.4.1
-[0.3.3]: https://github.com/willmcgugan/rich/compare/v0.3.3...v0.4.0
-[0.3.2]: https://github.com/willmcgugan/rich/compare/v0.3.2...v0.3.3
-[0.3.1]: https://github.com/willmcgugan/rich/compare/v0.3.1...v0.3.2
-[0.3.0]: https://github.com/willmcgugan/rich/compare/v0.3.0...v0.3.1
+[10.15.0]: https://github.com/willmcgugan/rich/compare/v10.14.0...v10.15.0
+[10.14.0]: https://github.com/willmcgugan/rich/compare/v10.13.0...v10.14.0
+[10.13.0]: https://github.com/willmcgugan/rich/compare/v10.12.0...v10.13.0
+[10.12.0]: https://github.com/willmcgugan/rich/compare/v10.11.0...v10.12.0
+[10.11.0]: https://github.com/willmcgugan/rich/compare/v10.10.0...v10.11.0
+[10.10.0]: https://github.com/willmcgugan/rich/compare/v10.9.0...v10.10.0
+[10.9.0]: https://github.com/willmcgugan/rich/compare/v10.8.0...v10.9.0
+[10.8.0]: https://github.com/willmcgugan/rich/compare/v10.7.0...v10.8.0
+[10.7.0]: https://github.com/willmcgugan/rich/compare/v10.6.0...v10.7.0
+[10.6.0]: https://github.com/willmcgugan/rich/compare/v10.5.0...v10.6.0
+[10.5.0]: https://github.com/willmcgugan/rich/compare/v10.4.0...v10.5.0
+[10.4.0]: https://github.com/willmcgugan/rich/compare/v10.3.0...v10.4.0
+[10.3.0]: https://github.com/willmcgugan/rich/compare/v10.2.2...v10.3.0
+[10.2.2]: https://github.com/willmcgugan/rich/compare/v10.2.1...v10.2.2
+[10.2.1]: https://github.com/willmcgugan/rich/compare/v10.2.0...v10.2.1
+[10.2.0]: https://github.com/willmcgugan/rich/compare/v10.1.0...v10.2.0
+[10.1.0]: https://github.com/willmcgugan/rich/compare/v10.0.1...v10.1.0
+[10.0.1]: https://github.com/willmcgugan/rich/compare/v10.0.0...v10.0.1
+[10.0.0]: https://github.com/willmcgugan/rich/compare/v9.13.0...v10.0.0
+[9.13.0]: https://github.com/willmcgugan/rich/compare/v9.12.4...v9.13.0
+[9.12.4]: https://github.com/willmcgugan/rich/compare/v9.12.3...v9.12.4
+[9.12.3]: https://github.com/willmcgugan/rich/compare/v9.12.2...v9.12.3
+[9.12.2]: https://github.com/willmcgugan/rich/compare/v9.12.1...v9.12.2
+[9.12.1]: https://github.com/willmcgugan/rich/compare/v9.12.0...v9.12.1
+[9.12.0]: https://github.com/willmcgugan/rich/compare/v9.11.1...v9.12.0
+[9.11.1]: https://github.com/willmcgugan/rich/compare/v9.11.0...v9.11.1
+[9.11.0]: https://github.com/willmcgugan/rich/compare/v9.10.0...v9.11.0
+[9.10.0]: https://github.com/willmcgugan/rich/compare/v9.9.0...v9.10.0
+[9.9.0]: https://github.com/willmcgugan/rich/compare/v9.8.2...v9.9.0
+[9.8.2]: https://github.com/willmcgugan/rich/compare/v9.8.1...v9.8.2
+[9.8.1]: https://github.com/willmcgugan/rich/compare/v9.8.0...v9.8.1
+[9.8.0]: https://github.com/willmcgugan/rich/compare/v9.7.0...v9.8.0
+[9.7.0]: https://github.com/willmcgugan/rich/compare/v9.6.2...v9.7.0
+[9.6.2]: https://github.com/willmcgugan/rich/compare/v9.6.1...v9.6.2
+[9.6.1]: https://github.com/willmcgugan/rich/compare/v9.6.0...v9.6.1
+[9.6.0]: https://github.com/willmcgugan/rich/compare/v9.5.1...v9.6.0
+[9.5.1]: https://github.com/willmcgugan/rich/compare/v9.5.0...v9.5.1
+[9.5.0]: https://github.com/willmcgugan/rich/compare/v9.4.0...v9.5.0
+[9.4.0]: https://github.com/willmcgugan/rich/compare/v9.3.0...v9.4.0
+[9.3.0]: https://github.com/willmcgugan/rich/compare/v9.2.0...v9.3.0
+[9.2.0]: https://github.com/willmcgugan/rich/compare/v9.1.0...v9.2.0
+[9.1.0]: https://github.com/willmcgugan/rich/compare/v9.0.1...v9.1.0
+[9.0.1]: https://github.com/willmcgugan/rich/compare/v9.0.0...v9.0.1
+[9.0.0]: https://github.com/willmcgugan/rich/compare/v8.0.0...v9.0.0
+[8.0.0]: https://github.com/willmcgugan/rich/compare/v7.1.0...v8.0.0
+[7.1.0]: https://github.com/willmcgugan/rich/compare/v7.0.0...v7.1.0
+[7.0.0]: https://github.com/willmcgugan/rich/compare/v6.2.0...v7.0.0
+[6.2.0]: https://github.com/willmcgugan/rich/compare/v6.1.2...v6.2.0
+[6.1.2]: https://github.com/willmcgugan/rich/compare/v6.1.1...v6.1.2
+[6.1.1]: https://github.com/willmcgugan/rich/compare/v6.1.0...v6.1.1
+[6.1.0]: https://github.com/willmcgugan/rich/compare/v6.0.0...v6.1.0
+[6.0.0]: https://github.com/willmcgugan/rich/compare/v5.2.1...v6.0.0
+[5.2.1]: https://github.com/willmcgugan/rich/compare/v5.2.0...v5.2.1
+[5.2.0]: https://github.com/willmcgugan/rich/compare/v5.1.2...v5.2.0
+[5.1.2]: https://github.com/willmcgugan/rich/compare/v5.1.1...v5.1.2
+[5.1.1]: https://github.com/willmcgugan/rich/compare/v5.1.0...v5.1.1
+[5.1.0]: https://github.com/willmcgugan/rich/compare/v5.0.0...v5.1.0
+[5.0.0]: https://github.com/willmcgugan/rich/compare/v4.2.2...v5.0.0
+[4.2.2]: https://github.com/willmcgugan/rich/compare/v4.2.1...v4.2.2
+[4.2.1]: https://github.com/willmcgugan/rich/compare/v4.2.0...v4.2.1
+[4.2.0]: https://github.com/willmcgugan/rich/compare/v4.1.0...v4.2.0
+[4.1.0]: https://github.com/willmcgugan/rich/compare/v4.0.0...v4.1.0
+[4.0.0]: https://github.com/willmcgugan/rich/compare/v3.4.1...v4.0.0
+[3.4.1]: https://github.com/willmcgugan/rich/compare/v3.4.0...v3.4.1
+[3.4.0]: https://github.com/willmcgugan/rich/compare/v3.3.2...v3.4.0
+[3.3.2]: https://github.com/willmcgugan/rich/compare/v3.3.1...v3.3.2
+[3.3.1]: https://github.com/willmcgugan/rich/compare/v3.3.0...v3.3.1
+[3.3.0]: https://github.com/willmcgugan/rich/compare/v3.2.0...v3.3.0
+[3.2.0]: https://github.com/willmcgugan/rich/compare/v3.1.0...v3.2.0
+[3.1.0]: https://github.com/willmcgugan/rich/compare/v3.0.5...v3.1.0
+[3.0.5]: https://github.com/willmcgugan/rich/compare/v3.0.4...v3.0.5
+[3.0.4]: https://github.com/willmcgugan/rich/compare/v3.0.3...v3.0.4
+[3.0.3]: https://github.com/willmcgugan/rich/compare/v3.0.2...v3.0.3
+[3.0.2]: https://github.com/willmcgugan/rich/compare/v3.0.1...v3.0.2
+[3.0.1]: https://github.com/willmcgugan/rich/compare/v3.0.0...v3.0.1
+[3.0.0]: https://github.com/willmcgugan/rich/compare/v2.3.1...v3.0.0
+[2.3.1]: https://github.com/willmcgugan/rich/compare/v2.3.0...v2.3.1
+[2.3.0]: https://github.com/willmcgugan/rich/compare/v2.2.6...v2.3.0
+[2.2.6]: https://github.com/willmcgugan/rich/compare/v2.2.5...v2.2.6
+[2.2.5]: https://github.com/willmcgugan/rich/compare/v2.2.4...v2.2.5
+[2.2.4]: https://github.com/willmcgugan/rich/compare/v2.2.3...v2.2.4
+[2.2.3]: https://github.com/willmcgugan/rich/compare/v2.2.2...v2.2.3
+[2.2.2]: https://github.com/willmcgugan/rich/compare/v2.2.1...v2.2.2
+[2.2.1]: https://github.com/willmcgugan/rich/compare/v2.2.0...v2.2.1
+[2.2.0]: https://github.com/willmcgugan/rich/compare/v2.1.0...v2.2.0
+[2.1.0]: https://github.com/willmcgugan/rich/compare/v2.0.1...v2.1.0
+[2.0.1]: https://github.com/willmcgugan/rich/compare/v2.0.0...v2.0.1
+[2.0.0]: https://github.com/willmcgugan/rich/compare/v1.3.1...v2.0.0
+[1.3.1]: https://github.com/willmcgugan/rich/compare/v1.3.0...v1.3.1
+[1.3.0]: https://github.com/willmcgugan/rich/compare/v1.2.3...v1.3.0
+[1.2.3]: https://github.com/willmcgugan/rich/compare/v1.2.2...v1.2.3
+[1.2.2]: https://github.com/willmcgugan/rich/compare/v1.2.1...v1.2.2
+[1.2.1]: https://github.com/willmcgugan/rich/compare/v1.2.0...v1.2.1
+[1.2.0]: https://github.com/willmcgugan/rich/compare/v1.1.9...v1.2.0
+[1.1.9]: https://github.com/willmcgugan/rich/compare/v1.1.8...v1.1.9
+[1.1.8]: https://github.com/willmcgugan/rich/compare/v1.1.7...v1.1.8
+[1.1.7]: https://github.com/willmcgugan/rich/compare/v1.1.6...v1.1.7
+[1.1.6]: https://github.com/willmcgugan/rich/compare/v1.1.5...v1.1.6
+[1.1.5]: https://github.com/willmcgugan/rich/compare/v1.1.4...v1.1.5
+[1.1.4]: https://github.com/willmcgugan/rich/compare/v1.1.3...v1.1.4
+[1.1.3]: https://github.com/willmcgugan/rich/compare/v1.1.2...v1.1.3
+[1.1.2]: https://github.com/willmcgugan/rich/compare/v1.1.1...v1.1.2
+[1.1.1]: https://github.com/willmcgugan/rich/compare/v1.1.0...v1.1.1
+[1.1.0]: https://github.com/willmcgugan/rich/compare/v1.0.3...v1.1.0
+[1.0.3]: https://github.com/willmcgugan/rich/compare/v1.0.2...v1.0.3
+[1.0.2]: https://github.com/willmcgugan/rich/compare/v1.0.1...v1.0.2
+[1.0.1]: https://github.com/willmcgugan/rich/compare/v1.0.0...v1.0.1
+[1.0.0]: https://github.com/willmcgugan/rich/compare/0v.8.13...v1.0.0
+[0.8.13]: https://github.com/willmcgugan/rich/compare/v0.8.12...v0.8.13
+[0.8.12]: https://github.com/willmcgugan/rich/compare/v0.8.11...v0.8.12
+[0.8.11]: https://github.com/willmcgugan/rich/compare/v0.8.10...v0.8.11
+[0.8.10]: https://github.com/willmcgugan/rich/compare/v0.8.9...v0.8.10
+[0.8.9]: https://github.com/willmcgugan/rich/compare/v0.8.8...v0.8.9
+[0.8.8]: https://github.com/willmcgugan/rich/compare/v0.8.7...v0.8.8
+[0.8.7]: https://github.com/willmcgugan/rich/compare/v0.8.6...v0.8.7
+[0.8.6]: https://github.com/willmcgugan/rich/compare/v0.8.5...v0.8.6
+[0.8.5]: https://github.com/willmcgugan/rich/compare/v0.8.4...v0.8.5
+[0.8.4]: https://github.com/willmcgugan/rich/compare/v0.8.3...v0.8.4
+[0.8.3]: https://github.com/willmcgugan/rich/compare/v0.8.2...v0.8.3
+[0.8.2]: https://github.com/willmcgugan/rich/compare/v0.8.1...v0.8.2
+[0.8.1]: https://github.com/willmcgugan/rich/compare/v0.8.0...v0.8.1
+[0.8.0]: https://github.com/willmcgugan/rich/compare/v0.7.2...v0.8.0
+[0.7.2]: https://github.com/willmcgugan/rich/compare/v0.7.1...v0.7.2
+[0.7.1]: https://github.com/willmcgugan/rich/compare/v0.7.0...v0.7.1
+[0.7.0]: https://github.com/willmcgugan/rich/compare/v0.6.0...v0.7.0
+[0.6.0]: https://github.com/willmcgugan/rich/compare/v0.5.0...v0.6.0
+[0.5.0]: https://github.com/willmcgugan/rich/compare/v0.4.1...v0.5.0
+[0.4.1]: https://github.com/willmcgugan/rich/compare/v0.4.0...v0.4.1
+[0.4.0]: https://github.com/willmcgugan/rich/compare/v0.3.3...v0.4.0
+[0.3.3]: https://github.com/willmcgugan/rich/compare/v0.3.2...v0.3.3
From 578f5ed849e7ca786ef470375637a120c6b533d0 Mon Sep 17 00:00:00 2001
From: Vitor Barbosa
Date: Wed, 19 Jan 2022 14:41:56 -0300
Subject: [PATCH 006/351] Add link for unreleased section
---
CHANGELOG.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 363cd48882..3841b740a1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1608,6 +1608,7 @@ Major version bump for a breaking change to `Text.stylize signature`, which corr
- First official release, API still to be stabilized
+[Unreleased]: https://github.com/willmcgugan/rich/compare/v11.0.0...HEAD
[11.0.0]: https://github.com/willmcgugan/rich/compare/v10.16.2...v11.0.0
[10.16.2]: https://github.com/willmcgugan/rich/compare/v10.16.1...v10.16.2
[10.16.1]: https://github.com/willmcgugan/rich/compare/v10.16.0...v10.16.1
From f9acb89a6df2e6960c0d197e44af8e1d14957c2b Mon Sep 17 00:00:00 2001
From: Vitor Barbosa
Date: Thu, 20 Jan 2022 10:20:33 -0300
Subject: [PATCH 007/351] Fix link for 1.0.0 version
---
CHANGELOG.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3841b740a1..a7eded24cd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1722,7 +1722,7 @@ Major version bump for a breaking change to `Text.stylize signature`, which corr
[1.0.3]: https://github.com/willmcgugan/rich/compare/v1.0.2...v1.0.3
[1.0.2]: https://github.com/willmcgugan/rich/compare/v1.0.1...v1.0.2
[1.0.1]: https://github.com/willmcgugan/rich/compare/v1.0.0...v1.0.1
-[1.0.0]: https://github.com/willmcgugan/rich/compare/0v.8.13...v1.0.0
+[1.0.0]: https://github.com/willmcgugan/rich/compare/v0.8.13...v1.0.0
[0.8.13]: https://github.com/willmcgugan/rich/compare/v0.8.12...v0.8.13
[0.8.12]: https://github.com/willmcgugan/rich/compare/v0.8.11...v0.8.12
[0.8.11]: https://github.com/willmcgugan/rich/compare/v0.8.10...v0.8.11
From 8f6b52f2df0715f4d99ef727d4bd6a0e68cdd2d4 Mon Sep 17 00:00:00 2001
From: Leron Gray
Date: Fri, 21 Jan 2022 14:25:49 -0800
Subject: [PATCH 008/351] add suppress to RichHandler
---
docs/source/logging.rst | 20 ++++++++++++++++++++
rich/logging.py | 7 ++++++-
2 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/docs/source/logging.rst b/docs/source/logging.rst
index 2b1d853f63..3dd86c330c 100644
--- a/docs/source/logging.rst
+++ b/docs/source/logging.rst
@@ -49,3 +49,23 @@ The :class:`~rich.logging.RichHandler` class may be configured to use Rich's :cl
There are a number of other options you can use to configure logging output, see the :class:`~rich.logging.RichHandler` reference for details.
+
+Suppressing Frames
+------------------
+
+If you are working with a framework (click, django etc), you may only be interested in seeing the code from your own application within the traceback. You can exclude framework code by setting the `suppress` argument on `Traceback`, `install`, and `Console.print_exception`, which should be a list of modules or str paths.
+
+Here's how you would exclude `click `_ from Rich exceptions::
+
+ import click
+ import logging
+ from rich.logging import RichHandler
+
+ logging.basicConfig(
+ level="NOTSET",
+ format="%(message)s",
+ datefmt="[%X]",
+ handlers=[RichHandler(rich_tracebacks=True, tracebacks_suppress)]
+ )
+
+Suppressed frames will show the line and file only, without any code.
\ No newline at end of file
diff --git a/rich/logging.py b/rich/logging.py
index 002f1f7bf1..3da71e2dcd 100644
--- a/rich/logging.py
+++ b/rich/logging.py
@@ -2,7 +2,8 @@
from datetime import datetime
from logging import Handler, LogRecord
from pathlib import Path
-from typing import ClassVar, List, Optional, Type, Union
+from types import ModuleType
+from typing import ClassVar, List, Optional, Iterable, Type, Union
from . import get_console
from ._log_render import LogRender, FormatTimeCallable
@@ -37,6 +38,7 @@ class RichHandler(Handler):
tracebacks_theme (str, optional): Override pygments theme used in traceback.
tracebacks_word_wrap (bool, optional): Enable word wrapping of long tracebacks lines. Defaults to True.
tracebacks_show_locals (bool, optional): Enable display of locals in tracebacks. Defaults to False.
+ tracebacks_suppress (Sequence[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback.
locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation.
Defaults to 10.
locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80.
@@ -73,6 +75,7 @@ def __init__(
tracebacks_theme: Optional[str] = None,
tracebacks_word_wrap: bool = True,
tracebacks_show_locals: bool = False,
+ tracebacks_suppress: Iterable[Union[str, ModuleType]] = (),
locals_max_length: int = 10,
locals_max_string: int = 80,
log_time_format: Union[str, FormatTimeCallable] = "[%x %X]",
@@ -96,6 +99,7 @@ def __init__(
self.tracebacks_theme = tracebacks_theme
self.tracebacks_word_wrap = tracebacks_word_wrap
self.tracebacks_show_locals = tracebacks_show_locals
+ self.tracebacks_suppress = tracebacks_suppress
self.locals_max_length = locals_max_length
self.locals_max_string = locals_max_string
@@ -137,6 +141,7 @@ def emit(self, record: LogRecord) -> None:
show_locals=self.tracebacks_show_locals,
locals_max_length=self.locals_max_length,
locals_max_string=self.locals_max_string,
+ suppress=self.tracebacks_suppress,
)
message = record.getMessage()
if self.formatter:
From 607f160e27995f7cd8b491def2a07fbd4ecba1d6 Mon Sep 17 00:00:00 2001
From: Leron Gray
Date: Fri, 21 Jan 2022 14:38:48 -0800
Subject: [PATCH 009/351] update CONTRIBUTORS.md
---
CONTRIBUTORS.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index c29cd79049..9662ea9c51 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -4,11 +4,13 @@ The following people have contributed to the development of Rich:
+- [Patrick Arminio](https://github.com/patrick91)
- [Gregory Beauregard](https://github.com/GBeauregard/pyffstream)
- [Darren Burns](https://github.com/darrenburns)
- [Pete Davison](https://github.com/pd93)
- [James Estevez](https://github.com/jstvz)
- [Oleksis Fraga](https://github.com/oleksis)
+- [Leron Gray](https://github.com/daddycocoaman)
- [Kenneth Hoste](https://github.com/boegel)
- [Finn Hughes](https://github.com/finnhughes)
- [Josh Karpel](https://github.com/JoshKarpel)
@@ -26,4 +28,3 @@ The following people have contributed to the development of Rich:
- [Tim Savage](https://github.com/timsavage)
- [Nicolas Simonds](https://github.com/0xDEC0DE)
- [Gabriele N. Tornetta](https://github.com/p403n1x87)
-- [Patrick Arminio](https://github.com/patrick91)
From 317125a86046c06e8da422c92b6d089aa79f4083 Mon Sep 17 00:00:00 2001
From: toto6038 <50100922+toto6038@users.noreply.github.com>
Date: Sun, 23 Jan 2022 03:27:34 +0800
Subject: [PATCH 010/351] Add Traditional Chinese text
---
rich/__main__.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/rich/__main__.py b/rich/__main__.py
index 132e809412..78f3f7b006 100644
--- a/rich/__main__.py
+++ b/rich/__main__.py
@@ -97,7 +97,7 @@ def comparison(renderable1: RenderableType, renderable2: RenderableType) -> Tabl
table.add_row(
"Asian\nlanguage\nsupport",
- ":flag_for_china: 该库支持中文,日文和韩文文本!\n:flag_for_japan: ライブラリは中国語、日本語、韓国語のテキストをサポートしています\n:flag_for_south_korea: 이 라이브러리는 중국어, 일본어 및 한국어 텍스트를 지원합니다",
+ ":flag_for_china: 该库支持中文,日文和韩文文本!\n:flag_for_japan: ライブラリは中国語、日本語、韓国語のテキストをサポートしています\n:flag_for_south_korea: 이 라이브러리는 중국어, 일본어 및 한국어 텍스트를 지원합니다\n:flag_for_taiwan: 本函式庫支援中日韓文字元!",
)
markup_example = (
From ecb18d4c9323ccfb71a4030b3ab4261a46f84ddc Mon Sep 17 00:00:00 2001
From: toto6038 <50100922+toto6038@users.noreply.github.com>
Date: Sun, 23 Jan 2022 03:28:48 +0800
Subject: [PATCH 011/351] Translate Traditional Chinese readme
---
README.zh-tw.md | 144 ++++++++++++++++++++++++------------------------
1 file changed, 72 insertions(+), 72 deletions(-)
diff --git a/README.zh-tw.md b/README.zh-tw.md
index 189b1fadad..2e4b857b02 100644
--- a/README.zh-tw.md
+++ b/README.zh-tw.md
@@ -21,31 +21,31 @@
• [Italian readme](https://github.com/willmcgugan/rich/blob/master/README.it.md)
• [Русский readme](https://github.com/willmcgugan/rich/blob/master/README.ru.md)
-Rich is a Python library for _rich_ text and beautiful formatting in the terminal.
+Rich 是一款 Python 函式庫,提供終端機介面中 _豐富的_ 文字效果及精美的格式設定。
-The [Rich API](https://rich.readthedocs.io/en/latest/) makes it easy to add color and style to terminal output. Rich can also render pretty tables, progress bars, markdown, syntax highlighted source code, tracebacks, and more — out of the box.
+[Rich API](https://rich.readthedocs.io/en/latest/) 讓終端機介面加上色彩及樣式變得易如反掌。Rich 也可以繪製漂亮的表格、進度條、Markdown、語法突顯的程式碼、Traceback(追溯)……。

-For a video introduction to Rich see [calmcode.io](https://calmcode.io/rich/introduction.html) by [@fishnets88](https://twitter.com/fishnets88).
+關於 Rich 的介紹,請參見 [@fishnets88](https://twitter.com/fishnets88) 在 [calmcode.io](https://calmcode.io/rich/introduction.html) 錄製的影片。
-See what [people are saying about Rich](https://www.willmcgugan.com/blog/pages/post/rich-tweets/).
+[看看其他人對於 Rich 的討論](https://www.willmcgugan.com/blog/pages/post/rich-tweets/)。
-## Compatibility
+## 相容性
-Rich works with Linux, OSX, and Windows. True color / emoji works with new Windows Terminal, classic terminal is limited to 16 colors. Rich requires Python 3.6.1 or later.
+Rich 可在 Linux、macOS、Windows 上運作。在新的 Windows Terminal 中可支援顯示全彩及 Emoji,但傳統的終端機中僅支援 16 色。Rich 需要的 Python 最低版本為 3.6.1。
-Rich works with [Jupyter notebooks](https://jupyter.org/) with no additional configuration required.
+Rich 可在 [Jupyter notebooks](https://jupyter.org/) 上使用,無須額外設定。
-## Installing
+## 安裝
-Install with `pip` or your favorite PyPI package manager.
+以 `pip` 或 PyPI 套件管理器安裝。
```sh
python -m pip install rich
```
-Run the following to test Rich output on your terminal:
+以此命令測試 Rich 在終端機的輸出效果:
```sh
python -m rich
@@ -53,7 +53,7 @@ python -m rich
## Rich Print
-To effortlessly add rich output to your application, you can import the [rich print](https://rich.readthedocs.io/en/latest/introduction.html#quick-start) method, which has the same signature as the builtin Python function. Try this:
+匯入 [rich print](https://rich.readthedocs.io/en/latest/introduction.html#quick-start) 方法就可以輕鬆地讓程式進行 rich 輸出,rich print 與 Python 內建的函式用法相似。試試:
```python
from rich import print
@@ -65,7 +65,7 @@ print("Hello, [bold magenta]World[/bold magenta]!", ":vampire:", locals())
## Rich REPL
-Rich can be installed in the Python REPL, so that any data structures will be pretty printed and highlighted.
+Rich 可以安裝在 Python REPL 中,如此一來任何資料結構都能被漂亮的輸出及突顯標示。
```python
>>> from rich import pretty
@@ -74,9 +74,9 @@ Rich can be installed in the Python REPL, so that any data structures will be pr

-## Using the Console
+## 使用 Console
-For more control over rich terminal content, import and construct a [Console](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console) object.
+匯入並建構 [Console](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console) 物件,以更全面地控制 rich 終端機內容。
```python
from rich.console import Console
@@ -84,25 +84,25 @@ from rich.console import Console
console = Console()
```
-The Console object has a `print` method which has an intentionally similar interface to the builtin `print` function. Here's an example of use:
+Console 物件有個 `print` 方法,且刻意設計的與內建 `print` 函式相似。參考此範例:
```python
console.print("Hello", "World!")
```
-As you might expect, this will print `"Hello World!"` to the terminal. Note that unlike the builtin `print` function, Rich will word-wrap your text to fit within the terminal width.
+如同預期的,這會將 `"Hello World!"` 印在終端機。須注意不同於內建的 `print` 函式,Rich 會自動將過長的文字換行,以符合終端機的寬度。
-There are a few ways of adding color and style to your output. You can set a style for the entire output by adding a `style` keyword argument. Here's an example:
+有幾種加上顏色及樣式的方式。您可以用 `style` 引數設定輸出內容的樣式,參考此範例:
```python
console.print("Hello", "World!", style="bold red")
```
-The output will be something like the following:
+輸出結果如下圖:

-That's fine for styling a line of text at a time. For more finely grained styling, Rich renders a special markup which is similar in syntax to [bbcode](https://en.wikipedia.org/wiki/BBCode). Here's an example:
+介紹完了如何對整行文字設定樣式,接著來看看更細部的使用。Rich 可以接受類似 [bbcode](https://en.wikipedia.org/wiki/BBCode) 的語法,對個別文字設定樣式。參考此範例:
```python
console.print("Where there is a [bold cyan]Will[/bold cyan] there [u]is[/u] a [i]way[/i].")
@@ -110,11 +110,11 @@ console.print("Where there is a [bold cyan]Will[/bold cyan] there [u]is[/u] a [i

-You can use a Console object to generate sophisticated output with minimal effort. See the [Console API](https://rich.readthedocs.io/en/latest/console.html) docs for details.
+您可以用 Console 物件不費吹灰之力地達成細膩的輸出效果。參閱 [Console API](https://rich.readthedocs.io/en/latest/console.html) 說明文件以了解細節。
## Rich Inspect
-Rich has an [inspect](https://rich.readthedocs.io/en/latest/reference/init.html?highlight=inspect#rich.inspect) function which can produce a report on any Python object, such as class, instance, or builtin.
+Rich 提供了 [inspect](https://rich.readthedocs.io/en/latest/reference/init.html?highlight=inspect#rich.inspect) 函式,可以對任何 Python 物件,如 class、instance 或 builtin ,為其產生一份報告。
```python
>>> my_list = ["foo", "bar"]
@@ -124,18 +124,18 @@ Rich has an [inspect](https://rich.readthedocs.io/en/latest/reference/init.html?

-See the [inspect docs](https://rich.readthedocs.io/en/latest/reference/init.html#rich.inspect) for details.
+參閱 [inspect 說明文件](https://rich.readthedocs.io/en/latest/reference/init.html#rich.inspect) 以了解細節。
-# Rich Library
+# Rich 函式庫
Rich contains a number of builtin _renderables_ you can use to create elegant output in your CLI and help you debug your code.
-Click the following headings for details:
+按一下子標題以了解細節:
Log
-The Console object has a `log()` method which has a similar interface to `print()`, but also renders a column for the current time and the file and line which made the call. By default Rich will do syntax highlighting for Python structures and for repr strings. If you log a collection (i.e. a dict or a list) Rich will pretty print it so that it fits in the available space. Here's an example of some of these features.
+Console 物件提供了 `log()` 方法,使用方式與 `print()` 類似,但還多了一欄來顯示目前時間、進行呼叫的檔案及行號。預設情況下 Rich 會語法突顯標示 Python 的結構及 repr 字串。若使用於字典或串列這類集合性物件,Rich 會將其漂亮地印出來,以符合可用空間。此範例示範了這些功能。
```python
from rich.console import Console
@@ -160,19 +160,19 @@ def test_log():
test_log()
```
-The above produces the following output:
+上面的程式碼會產生下圖結果:

-Note the `log_locals` argument, which outputs a table containing the local variables where the log method was called.
+注意到 `log_locals` 引數,可用來輸出一張表格,用來顯示 log 方法被呼叫時,區域變數的內容。
-The log method could be used for logging to the terminal for long running applications such as servers, but is also a very nice debugging aid.
+log 方法可用於伺服器上長時間運作的程式,也很適合一般程式偵錯用途。
Logging Handler
-You can also use the builtin [Handler class](https://rich.readthedocs.io/en/latest/logging.html) to format and colorize output from Python's logging module. Here's an example of the output:
+您也可以使用內建的 [Handler 類別](https://rich.readthedocs.io/en/latest/logging.html) 來將 Python logging 模組的輸出內容格式化並賦予色彩:

@@ -181,27 +181,27 @@ You can also use the builtin [Handler class](https://rich.readthedocs.io/en/late
Emoji
-To insert an emoji in to console output place the name between two colons. Here's an example:
+以一對冒號包住表情符號的名稱,來透過 console 插入 Emoji。參考範例:
```python
>>> console.print(":smiley: :vampire: :pile_of_poo: :thumbs_up: :raccoon:")
😃 🧛 💩 👍 🦝
```
-Please use this feature wisely.
+請謹慎使用此功能。
-Tables
+表格
-Rich can render flexible [tables](https://rich.readthedocs.io/en/latest/tables.html) with unicode box characters. There is a large variety of formatting options for borders, styles, cell alignment etc.
+Rich 可以用 unicode box 字元繪製彈性的 [表格](https://rich.readthedocs.io/en/latest/tables.html)。格式設定十分多元,包含框線、樣式、儲存格對齊……。

-The animation above was generated with [table_movie.py](https://github.com/willmcgugan/rich/blob/master/examples/table_movie.py) in the examples directory.
+上圖的動畫效果是以 [table_movie.py](https://github.com/willmcgugan/rich/blob/master/examples/table_movie.py) 產生的,該檔案位於 examples 資料夾。
-Here's a simpler table example:
+參考這個簡單的表格範例:
```python
from rich.console import Console
@@ -233,24 +233,24 @@ table.add_row(
console.print(table)
```
-This produces the following output:
+執行結果如圖:

-Note that console markup is rendered in the same way as `print()` and `log()`. In fact, anything that is renderable by Rich may be included in the headers / rows (even other tables).
+請留意,主控台標記的呈現方式與 `print()`、`log()` 相同。事實上,由 Rich 繪製的任何東西都可以被放在任何標題、列,甚至其他表格裡。
-The `Table` class is smart enough to resize columns to fit the available width of the terminal, wrapping text as required. Here's the same example, with the terminal made smaller than the table above:
+`Table` 類別很聰明,能夠自動調整欄寬來配合終端機的大小,也會在需要時自動將文字換行。此範例的程式碼與上一個相同,然而終端機變小了一點:

-Progress Bars
+進度條
-Rich can render multiple flicker-free [progress](https://rich.readthedocs.io/en/latest/progress.html) bars to track long-running tasks.
+Rich 可繪製多個不閃爍的 [進度條](https://rich.readthedocs.io/en/latest/progress.html),以追蹤需時較久的工作。
-For basic usage, wrap any sequence in the `track` function and iterate over the result. Here's an example:
+基本的使用方式,是將序列放在 `track` 函式中,再對其結果疊代。參考此範例:
```python
from rich.progress import track
@@ -259,22 +259,22 @@ for step in track(range(100)):
do_step(step)
```
-It's not much harder to add multiple progress bars. Here's an example taken from the docs:
+新增多個進度條也不是難事,來看看說明文件中的範例:

-The columns may be configured to show any details you want. Built-in columns include percentage complete, file size, file speed, and time remaining. Here's another example showing a download in progress:
+您可以調整要顯示的狀態欄位。內建的欄位包含完成百分比、檔案大小、讀寫速度及剩餘時間。來看看另一個用來顯示下載進度的範例:

-To try this out yourself, see [examples/downloader.py](https://github.com/willmcgugan/rich/blob/master/examples/downloader.py) which can download multiple URLs simultaneously while displaying progress.
+想嘗試看看嗎?您可以在 [examples/downloader.py](https://github.com/willmcgugan/rich/blob/master/examples/downloader.py) 取得此範例程式。此程式可以在下載多個檔案時顯示各自的進度。
-Status
+狀態
-For situations where it is hard to calculate progress, you can use the [status](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console.status) method which will display a 'spinner' animation and message. The animation won't prevent you from using the console as normal. Here's an example:
+有些狀況下很難估計進度,就可以使用 [status](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console.status) 方法,此方法會顯示「spinner」動畫及訊息。該動畫播放時,仍可正常操作主控台。參考此範例:
```python
from time import sleep
@@ -290,45 +290,45 @@ with console.status("[bold green]Working on tasks...") as status:
console.log(f"{task} complete")
```
-This generates the following output in the terminal.
+終端機的顯示效果如下:

-The spinner animations were borrowed from [cli-spinners](https://www.npmjs.com/package/cli-spinners). You can select a spinner by specifying the `spinner` parameter. Run the following command to see the available values:
+該 spinner 動畫乃借用自 [cli-spinners](https://www.npmjs.com/package/cli-spinners)。可以用 `spinner` 參數指定 spinner 樣式。執行此命令以顯示可用的值:
```
python -m rich.spinner
```
-The above command generates the following output in the terminal:
+此命令在終端機的輸出結果如下圖:

-Tree
+樹
-Rich can render a [tree](https://rich.readthedocs.io/en/latest/tree.html) with guide lines. A tree is ideal for displaying a file structure, or any other hierarchical data.
+Rich 可以用導引線繪製一棵 [樹](https://rich.readthedocs.io/en/latest/tree.html)。樹很適合用來顯示檔案結構,或其他繼承性的資料。
-The labels of the tree can be simple text or anything else Rich can render. Run the following for a demonstration:
+可以用文字或其他 Rich 能繪製的元素作為樹的標籤。執行下列程式碼來看看效果:
```
python -m rich.tree
```
-This generates the following output:
+這會產生下圖的結果:

-See the [tree.py](https://github.com/willmcgugan/rich/blob/master/examples/tree.py) example for a script that displays a tree view of any directory, similar to the linux `tree` command.
+您可以參考 [tree.py](https://github.com/willmcgugan/rich/blob/master/examples/tree.py) 範例程式,此程式可以樹狀圖展示目錄結構,如同 Linux 的 `tree` 命令。
-Columns
+資料欄
-Rich can render content in neat [columns](https://rich.readthedocs.io/en/latest/columns.html) with equal or optimal width. Here's a very basic clone of the (MacOS / Linux) `ls` command which displays a directory listing in columns:
+Rich 可以將內容呈現於整齊的 [資料欄](https://rich.readthedocs.io/en/latest/columns.html) 中,其欄寬可為等寬或最適寬度。此範例仿作了 macOS / Linux 系統中 `ls` 命令的基本功能,可以用資料欄列出目錄:
```python
import os
@@ -341,7 +341,7 @@ directory = os.listdir(sys.argv[1])
print(Columns(directory))
```
-The following screenshot is the output from the [columns example](https://github.com/willmcgugan/rich/blob/master/examples/columns.py) which displays data pulled from an API in columns:
+此螢幕截圖為 [資料欄範例](https://github.com/willmcgugan/rich/blob/master/examples/columns.py) 的輸出結果。此程式從某 API 取得資料,並以資料欄呈現:

@@ -350,9 +350,9 @@ The following screenshot is the output from the [columns example](https://github
Markdown
-Rich can render [markdown](https://rich.readthedocs.io/en/latest/markdown.html) and does a reasonable job of translating the formatting to the terminal.
+Rich 可以繪製 [Markdown](https://rich.readthedocs.io/en/latest/markdown.html) 並處理了將其轉換為終端機格式的大量工作。
-To render markdown import the `Markdown` class and construct it with a string containing markdown code. Then print it to the console. Here's an example:
+先匯入 `Markdown` 類別,再以內容為 Markdown 語言的字串建構一個物件,接著將其印到 console。參考此範例:
```python
from rich.console import Console
@@ -364,16 +364,16 @@ with open("README.md") as readme:
console.print(markdown)
```
-This will produce output something like the following:
+執行結果如下圖:

-Syntax Highlighting
+語法突顯
-Rich uses the [pygments](https://pygments.org/) library to implement [syntax highlighting](https://rich.readthedocs.io/en/latest/syntax.html). Usage is similar to rendering markdown; construct a `Syntax` object and print it to the console. Here's an example:
+Rich 使用了 [pygments](https://pygments.org/) 函式庫來實作 [語法突顯](https://rich.readthedocs.io/en/latest/syntax.html) 功能。使用方式與繪製 Markdown 相似,先建構 `Syntax` 物件並將其印到 console。參考此範例:
```python
from rich.console import Console
@@ -399,34 +399,34 @@ console = Console()
console.print(syntax)
```
-This will produce the following output:
+執行結果如下圖:

-Tracebacks
+Tracebacks(追溯)
-Rich can render [beautiful tracebacks](https://rich.readthedocs.io/en/latest/traceback.html) which are easier to read and show more code than standard Python tracebacks. You can set Rich as the default traceback handler so all uncaught exceptions will be rendered by Rich.
+Rich 可以繪製 [漂亮的 tracebacks](https://rich.readthedocs.io/en/latest/traceback.html),相較標準的 Python traceback 顯示了更多程式碼且更好懂。您可以將 Rich 設為預設的 traceback handler(處理常式),如此一來所有未接住的例外都由 Rich 呈現。
-Here's what it looks like on OSX (similar on Linux):
+它在 macOS 上執行的效果如圖(Linux 上差異不大):

-All Rich renderables make use of the [Console Protocol](https://rich.readthedocs.io/en/latest/protocol.html), which you can also use to implement your own Rich content.
+所有可由 Rich 繪製的物件都用到了 [Console 協定](https://rich.readthedocs.io/en/latest/protocol.html),您也可以依此實作自訂的 Rich 內容。
-# Rich for enterprise
+# Rich 企業版
-Available as part of the Tidelift Subscription.
+可在 Tidelift 訂閱方案取得。
-The maintainers of Rich and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use. [Learn more.](https://tidelift.com/subscription/pkg/pypi-rich?utm_source=pypi-rich&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)
+Rich 及其他數以千計的套件維護者正與 Tidelift 合作,以提供開放原始碼套件的商業性支援。此計畫能協助您節省時間、避開風險,同時也讓套件的維護者獲得報酬。[了解更多。](https://tidelift.com/subscription/pkg/pypi-rich?utm_source=pypi-rich&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)
-# Projects using Rich
+# 使用 Rich 的專案
-Here are a few projects using Rich:
+以下列出幾個使用 Rich 的專案:
- [BrancoLab/BrainRender](https://github.com/BrancoLab/BrainRender)
a python package for the visualization of three dimensional neuro-anatomical data
From 7fe872bc9f659e9fc18bc4d9a6c093c28bd5c138 Mon Sep 17 00:00:00 2001
From: toto6038 <50100922+toto6038@users.noreply.github.com>
Date: Sun, 23 Jan 2022 03:48:32 +0800
Subject: [PATCH 012/351] Update `README.zh-tw.md`
---
README.zh-tw.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.zh-tw.md b/README.zh-tw.md
index 2e4b857b02..8ff4b4c00f 100644
--- a/README.zh-tw.md
+++ b/README.zh-tw.md
@@ -128,7 +128,7 @@ Rich 提供了 [inspect](https://rich.readthedocs.io/en/latest/reference/init.ht
# Rich 函式庫
-Rich contains a number of builtin _renderables_ you can use to create elegant output in your CLI and help you debug your code.
+Rich 包含了一系列可繪製的物件,您可以使用它們來印出精美的畫面,或者協助偵錯程式碼。
按一下子標題以了解細節:
From 14333a49daf18fc504403578db2708eec790fde0 Mon Sep 17 00:00:00 2001
From: toto6038 <50100922+toto6038@users.noreply.github.com>
Date: Sun, 23 Jan 2022 23:55:44 +0800
Subject: [PATCH 013/351] Change wording and update `README.zh-tw.md`
---
README.zh-tw.md | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/README.zh-tw.md b/README.zh-tw.md
index 8ff4b4c00f..29b5e10281 100644
--- a/README.zh-tw.md
+++ b/README.zh-tw.md
@@ -21,9 +21,9 @@
• [Italian readme](https://github.com/willmcgugan/rich/blob/master/README.it.md)
• [Русский readme](https://github.com/willmcgugan/rich/blob/master/README.ru.md)
-Rich 是一款 Python 函式庫,提供終端機介面中 _豐富的_ 文字效果及精美的格式設定。
+Rich 是一款提供終端機介面中 _豐富的_ 文字效果及精美的格式設定的 Python 函式庫。
-[Rich API](https://rich.readthedocs.io/en/latest/) 讓終端機介面加上色彩及樣式變得易如反掌。Rich 也可以繪製漂亮的表格、進度條、Markdown、語法突顯的程式碼、Traceback(追溯)……。
+[Rich API](https://rich.readthedocs.io/en/latest/) 讓終端機介面加上色彩及樣式變得易如反掌。Rich 也可以繪製漂亮的表格、進度條、Markdown、語法醒目標示的程式碼、Traceback(追溯)……。

@@ -33,7 +33,7 @@ Rich 是一款 Python 函式庫,提供終端機介面中 _豐富的_ 文字效
## 相容性
-Rich 可在 Linux、macOS、Windows 上運作。在新的 Windows Terminal 中可支援顯示全彩及 Emoji,但傳統的終端機中僅支援 16 色。Rich 需要的 Python 最低版本為 3.6.1。
+Rich 可在 Linux、macOS、Windows 上運作。在新的 Windows Terminal 中可支援顯示全彩及 Emoji,但傳統的終端機中僅支援 16 色。Rich 最低需要的 Python 版本為 3.6.1。
Rich 可在 [Jupyter notebooks](https://jupyter.org/) 上使用,無須額外設定。
@@ -65,7 +65,7 @@ print("Hello, [bold magenta]World[/bold magenta]!", ":vampire:", locals())
## Rich REPL
-Rich 可以安裝在 Python REPL 中,如此一來任何資料結構都能被漂亮的輸出及突顯標示。
+Rich 可以安裝在 Python REPL 中,如此一來就可以漂亮的輸出與突顯標示任何資料結構。
```python
>>> from rich import pretty
@@ -135,7 +135,7 @@ Rich 包含了一系列可繪製的物件,您可以使用它們來印出精美
Log
-Console 物件提供了 `log()` 方法,使用方式與 `print()` 類似,但還多了一欄來顯示目前時間、進行呼叫的檔案及行號。預設情況下 Rich 會語法突顯標示 Python 的結構及 repr 字串。若使用於字典或串列這類集合性物件,Rich 會將其漂亮地印出來,以符合可用空間。此範例示範了這些功能。
+Console 物件提供了 `log()` 方法,使用方式與 `print()` 類似,但還多了一欄來顯示目前時間、進行呼叫的檔案及行號。預設情況下 Rich 會語法醒目標示 Python 的結構及 repr 字串。若使用於字典或串列這類集合性物件,Rich 會將其漂亮地印出來,以符合可用空間。此範例示範了這些功能。
```python
from rich.console import Console
@@ -371,9 +371,9 @@ console.print(markdown)
-語法突顯
+語法醒目標示
-Rich 使用了 [pygments](https://pygments.org/) 函式庫來實作 [語法突顯](https://rich.readthedocs.io/en/latest/syntax.html) 功能。使用方式與繪製 Markdown 相似,先建構 `Syntax` 物件並將其印到 console。參考此範例:
+Rich 使用了 [pygments](https://pygments.org/) 函式庫來實作 [語法醒目標示](https://rich.readthedocs.io/en/latest/syntax.html) 功能。使用方式與繪製 Markdown 相似,先建構 `Syntax` 物件並將其印到 console。參考此範例:
```python
from rich.console import Console
From 31bd59ec7137c8117c5075f02f9553a70a3b6bb1 Mon Sep 17 00:00:00 2001
From: toto6038 <50100922+toto6038@users.noreply.github.com>
Date: Mon, 24 Jan 2022 00:07:34 +0800
Subject: [PATCH 014/351] Update CHANGELOG
---
CHANGELOG.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f3819a7813..b861718303 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
- Workaround for edge case of object from Faiss with no `__class__` https://github.com/Textualize/rich/issues/1838
+- Add Traditional Chinese readme
### Added
@@ -27,6 +28,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- **breaking** Deprecated rich.console.RenderGroup, now named rich.console.Group
- **breaking** `Syntax.__init__` parameter `lexer_name` renamed to `lexer`
- Syntax constructor accepts both str and now a pygments lexer https://github.com/Textualize/rich/pull/1748
+- Rename the file name of Simplified Chinese readme to `README.zh-cn.md` (original `README.cn.md`) to reflect the variants of Chinese.
## [10.16.2] - 2021-01-02
From de093e5552cd3909778c52d411786746f2508f5c Mon Sep 17 00:00:00 2001
From: toto6038 <50100922+toto6038@users.noreply.github.com>
Date: Mon, 24 Jan 2022 21:10:31 +0800
Subject: [PATCH 015/351] Update link in `README.md`
---
README.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index f5365e7d0f..23822026d7 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,8 @@

[English readme](https://github.com/willmcgugan/rich/blob/master/README.md)
- • [中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md)
+ • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-cn.md)
+ • [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md)
• [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md)
• [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md)
• [Läs på svenska](https://github.com/willmcgugan/rich/blob/master/README.sv.md)
From c87b1a075975a0063d64e31a205be0b42293b3fb Mon Sep 17 00:00:00 2001
From: Leron Gray
Date: Tue, 25 Jan 2022 16:58:56 -0800
Subject: [PATCH 016/351] update docs for RichHandler suppress
---
docs/source/logging.rst | 2 +-
docs/source/traceback.rst | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/docs/source/logging.rst b/docs/source/logging.rst
index 3dd86c330c..67a999922b 100644
--- a/docs/source/logging.rst
+++ b/docs/source/logging.rst
@@ -65,7 +65,7 @@ Here's how you would exclude `click `_ from Rich exceptions::
From 70ebda06ee3d924c5c2d647adc148430127b4075 Mon Sep 17 00:00:00 2001
From: toto6038 <50100922+toto6038@users.noreply.github.com>
Date: Wed, 26 Jan 2022 20:38:13 +0800
Subject: [PATCH 017/351] Revert Simplified Chinese readme to old name
---
CHANGELOG.md | 1 -
README.zh-cn.md => README.cn.md | 2 +-
README.de-ch.md | 2 +-
README.de.md | 2 +-
README.es.md | 2 +-
README.fr.md | 2 +-
README.hi.md | 2 +-
README.it.md | 2 +-
README.ja.md | 2 +-
README.kr.md | 2 +-
README.md | 2 +-
README.pt-br.md | 2 +-
README.ru.md | 2 +-
README.sv.md | 2 +-
README.zh-tw.md | 2 +-
15 files changed, 14 insertions(+), 15 deletions(-)
rename README.zh-cn.md => README.cn.md (99%)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8272ba6407..f7dfca3565 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -29,7 +29,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- **breaking** Deprecated rich.console.RenderGroup, now named rich.console.Group
- **breaking** `Syntax.__init__` parameter `lexer_name` renamed to `lexer`
- Syntax constructor accepts both str and now a pygments lexer https://github.com/Textualize/rich/pull/1748
-- Rename the file name of Simplified Chinese readme to `README.zh-cn.md` (original `README.cn.md`) to reflect the variants of Chinese.
## [10.16.2] - 2021-01-02
diff --git a/README.zh-cn.md b/README.cn.md
similarity index 99%
rename from README.zh-cn.md
rename to README.cn.md
index 97f0996340..a5c7c5b66a 100644
--- a/README.zh-cn.md
+++ b/README.cn.md
@@ -7,7 +7,7 @@

[English readme](https://github.com/willmcgugan/rich/blob/master/README.md)
- • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-cn.md)
+ • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md)
• [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md)
• [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md)
• [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md)
diff --git a/README.de-ch.md b/README.de-ch.md
index 4d6359ff52..6c1d7d278b 100644
--- a/README.de-ch.md
+++ b/README.de-ch.md
@@ -7,7 +7,7 @@

[English readme](https://github.com/willmcgugan/rich/blob/master/README.md)
- • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-cn.md)
+ • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md)
• [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md)
• [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md)
• [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md)
diff --git a/README.de.md b/README.de.md
index 148f146f21..34a99a64e8 100644
--- a/README.de.md
+++ b/README.de.md
@@ -7,7 +7,7 @@

[English readme](https://github.com/willmcgugan/rich/blob/master/README.md)
- • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-cn.md)
+ • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md)
• [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md)
• [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md)
• [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md)
diff --git a/README.es.md b/README.es.md
index ec4e4f4253..c9cb2af141 100644
--- a/README.es.md
+++ b/README.es.md
@@ -7,7 +7,7 @@

[English readme](https://github.com/willmcgugan/rich/blob/master/README.md)
- • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-cn.md)
+ • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md)
• [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md)
• [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md)
• [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md)
diff --git a/README.fr.md b/README.fr.md
index 0fbea94fc0..1a09c054a1 100644
--- a/README.fr.md
+++ b/README.fr.md
@@ -7,7 +7,7 @@

[English readme](https://github.com/willmcgugan/rich/blob/master/README.md)
- • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-cn.md)
+ • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md)
• [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md)
• [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md)
• [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md)
diff --git a/README.hi.md b/README.hi.md
index 443472c5c8..c3c62f5321 100644
--- a/README.hi.md
+++ b/README.hi.md
@@ -7,7 +7,7 @@

[English readme](https://github.com/willmcgugan/rich/blob/master/README.md)
- • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-cn.md)
+ • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md)
• [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md)
• [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md)
• [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md)
diff --git a/README.it.md b/README.it.md
index cf2e2c5fe0..c6e8b5620c 100644
--- a/README.it.md
+++ b/README.it.md
@@ -6,7 +6,7 @@

[English readme](https://github.com/willmcgugan/rich/blob/master/README.md)
- • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-cn.md)
+ • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md)
• [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md)
• [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md)
• [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md)
diff --git a/README.ja.md b/README.ja.md
index 0429d11509..300f779d31 100644
--- a/README.ja.md
+++ b/README.ja.md
@@ -7,7 +7,7 @@

[English readme](https://github.com/willmcgugan/rich/blob/master/README.md)
- • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-cn.md)
+ • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md)
• [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md)
• [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md)
• [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md)
diff --git a/README.kr.md b/README.kr.md
index e3aa03134e..b55529af72 100644
--- a/README.kr.md
+++ b/README.kr.md
@@ -7,7 +7,7 @@

[English readme](https://github.com/willmcgugan/rich/blob/master/README.md)
- • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-cn.md)
+ • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md)
• [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md)
• [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md)
• [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md)
diff --git a/README.md b/README.md
index 23822026d7..f7cf6368fa 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@

[English readme](https://github.com/willmcgugan/rich/blob/master/README.md)
- • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-cn.md)
+ • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md)
• [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md)
• [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md)
• [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md)
diff --git a/README.pt-br.md b/README.pt-br.md
index 3d888ee449..55f366cafd 100644
--- a/README.pt-br.md
+++ b/README.pt-br.md
@@ -7,7 +7,7 @@

[English readme](https://github.com/willmcgugan/rich/blob/master/README.md)
- • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-cn.md)
+ • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md)
• [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md)
• [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md)
• [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md)
diff --git a/README.ru.md b/README.ru.md
index d9a02c21c4..b6ff2d255e 100644
--- a/README.ru.md
+++ b/README.ru.md
@@ -8,7 +8,7 @@

[English readme](https://github.com/willmcgugan/rich/blob/master/README.md)
- • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-cn.md)
+ • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md)
• [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md)
• [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md)
• [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md)
diff --git a/README.sv.md b/README.sv.md
index b630b3e7f9..b2685a705e 100644
--- a/README.sv.md
+++ b/README.sv.md
@@ -7,7 +7,7 @@

[English readme](https://github.com/willmcgugan/rich/blob/master/README.md)
- • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-cn.md)
+ • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md)
• [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md)
• [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md)
• [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md)
diff --git a/README.zh-tw.md b/README.zh-tw.md
index 29b5e10281..207f3260f7 100644
--- a/README.zh-tw.md
+++ b/README.zh-tw.md
@@ -7,7 +7,7 @@

[English readme](https://github.com/willmcgugan/rich/blob/master/README.md)
- • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-cn.md)
+ • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md)
• [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md)
• [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md)
• [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md)
From 1ea00c3c473e6f187b8a24963bef0682fac81142 Mon Sep 17 00:00:00 2001
From: toto6038 <50100922+toto6038@users.noreply.github.com>
Date: Thu, 27 Jan 2022 20:13:46 +0800
Subject: [PATCH 018/351] Remove Trad. Chinese texts in `__main__.py`
---
rich/__main__.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/rich/__main__.py b/rich/__main__.py
index 78f3f7b006..5b69ac354d 100644
--- a/rich/__main__.py
+++ b/rich/__main__.py
@@ -97,7 +97,7 @@ def comparison(renderable1: RenderableType, renderable2: RenderableType) -> Tabl
table.add_row(
"Asian\nlanguage\nsupport",
- ":flag_for_china: 该库支持中文,日文和韩文文本!\n:flag_for_japan: ライブラリは中国語、日本語、韓国語のテキストをサポートしています\n:flag_for_south_korea: 이 라이브러리는 중국어, 일본어 및 한국어 텍스트를 지원합니다\n:flag_for_taiwan: 本函式庫支援中日韓文字元!",
+ ":flag_for_china: 该库支持中文,日文和韩文文本!\n:flag_for_japan: ライブラリは中国語、日本語、韓国語のテキストをサポートしています\n:flag_for_south_korea: 이 라이브러리는 중국어, 일본어 및 한국어 텍스트를 지원합니다\n",
)
markup_example = (
From e9cf4caa5836fa721af8c967eb63289c499af45e Mon Sep 17 00:00:00 2001
From: toto6038 <50100922+toto6038@users.noreply.github.com>
Date: Thu, 27 Jan 2022 20:18:26 +0800
Subject: [PATCH 019/351] Remove trailing LF character
---
rich/__main__.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/rich/__main__.py b/rich/__main__.py
index 5b69ac354d..132e809412 100644
--- a/rich/__main__.py
+++ b/rich/__main__.py
@@ -97,7 +97,7 @@ def comparison(renderable1: RenderableType, renderable2: RenderableType) -> Tabl
table.add_row(
"Asian\nlanguage\nsupport",
- ":flag_for_china: 该库支持中文,日文和韩文文本!\n:flag_for_japan: ライブラリは中国語、日本語、韓国語のテキストをサポートしています\n:flag_for_south_korea: 이 라이브러리는 중국어, 일본어 및 한국어 텍스트를 지원합니다\n",
+ ":flag_for_china: 该库支持中文,日文和韩文文本!\n:flag_for_japan: ライブラリは中国語、日本語、韓国語のテキストをサポートしています\n:flag_for_south_korea: 이 라이브러리는 중국어, 일본어 및 한국어 텍스트를 지원합니다",
)
markup_example = (
From 5c4b4e6dc64c207bb67d3fc980679c5adab3482c Mon Sep 17 00:00:00 2001
From: Alex Strick van Linschoten
<90610017+alex-zenml@users.noreply.github.com>
Date: Fri, 28 Jan 2022 13:15:50 +0100
Subject: [PATCH 020/351] Fix codecov badge
Used a badge from shields.io which wasn't failing.
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index f5365e7d0f..acfed7e92b 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
[](https://pypi.org/project/rich/) [](https://badge.fury.io/py/rich)
[](https://pepy.tech/project/rich)
-[](https://codecov.io/gh/willmcgugan/rich)
+[](https://codecov.io/gh/willmcgugan/rich)
[](https://www.willmcgugan.com/tag/rich/)
[](https://twitter.com/willmcgugan)
From 1e6fb1876b338be091a8a80b3141833ad518a267 Mon Sep 17 00:00:00 2001
From: Yuval Ben Arie
Date: Sat, 29 Jan 2022 15:50:09 +0200
Subject: [PATCH 021/351] Table no_wrap documentation fix
---
docs/source/tables.rst | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/source/tables.rst b/docs/source/tables.rst
index 967a573825..7429ac66ac 100644
--- a/docs/source/tables.rst
+++ b/docs/source/tables.rst
@@ -139,7 +139,7 @@ There are a number of options you can set on a column to modify how it will look
- ``min_width`` When set to an integer will prevent the column from shrinking below this amount.
- ``max_width`` When set to an integer will prevent the column from growing beyond this amount.
- ``ratio`` Defines a ratio to set the column width. For instance, if there are 3 columns with a total of 6 ratio, and ``ratio=2`` then the column will be a third of the available size.
-- ``no_wrap`` Set to False to prevent this column from wrapping.
+- ``no_wrap`` Set to True to prevent this column from wrapping.
Vertical Alignment
~~~~~~~~~~~~~~~~~~
From b90c33eae76453dc8893bcc9aefd56a725fb9401 Mon Sep 17 00:00:00 2001
From: Darren Burns
Date: Mon, 31 Jan 2022 14:24:33 +0000
Subject: [PATCH 022/351] Fix test in traceback, remove the no-eval pre-commit
hook
---
.pre-commit-config.yaml | 1 -
tests/test_traceback.py | 2 +-
2 files changed, 1 insertion(+), 2 deletions(-)
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 892dc79187..bbae40c844 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -21,7 +21,6 @@ repos:
rev: v1.9.0
hooks:
- id: python-check-mock-methods
- - id: python-no-eval
- id: python-no-log-warn
- id: python-use-type-annotations
- id: rst-directive-colons
diff --git a/tests/test_traceback.py b/tests/test_traceback.py
index e3342ca13c..8bcc8922fa 100644
--- a/tests/test_traceback.py
+++ b/tests/test_traceback.py
@@ -110,7 +110,7 @@ def test_syntax_error():
console = Console(width=100, file=io.StringIO())
try:
# raises SyntaxError: unexpected EOF while parsing
- compile("(2+2")
+ eval("(2+2")
except Exception:
console.print_exception()
exception_text = console.file.getvalue()
From b1673d029b08e0463c447a02dcd9847ce838235a Mon Sep 17 00:00:00 2001
From: Darren Burns
Date: Mon, 31 Jan 2022 14:25:36 +0000
Subject: [PATCH 023/351] Prevent too broad `except` clause in test
---
tests/test_traceback.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/test_traceback.py b/tests/test_traceback.py
index 8bcc8922fa..31658c5a43 100644
--- a/tests/test_traceback.py
+++ b/tests/test_traceback.py
@@ -111,7 +111,7 @@ def test_syntax_error():
try:
# raises SyntaxError: unexpected EOF while parsing
eval("(2+2")
- except Exception:
+ except SyntaxError:
console.print_exception()
exception_text = console.file.getvalue()
assert "SyntaxError" in exception_text
From b0794522a6a8f85d9110db2c1768d1c4f48162d9 Mon Sep 17 00:00:00 2001
From: ptmcg
Date: Mon, 31 Jan 2022 08:29:01 -0600
Subject: [PATCH 024/351] Add default_columns classmethod to Progress class
---
rich/progress.py | 21 +++++++++++----------
tests/test_progress.py | 26 ++++++++++++++++++++++++++
2 files changed, 37 insertions(+), 10 deletions(-)
diff --git a/rich/progress.py b/rich/progress.py
index 1f670db438..8b9713c7a3 100644
--- a/rich/progress.py
+++ b/rich/progress.py
@@ -588,12 +588,7 @@ def __init__(
refresh_per_second is None or refresh_per_second > 0
), "refresh_per_second must be > 0"
self._lock = RLock()
- self.columns = columns or (
- TextColumn("[progress.description]{task.description}"),
- BarColumn(),
- TextColumn("[progress.percentage]{task.percentage:>3.0f}%"),
- TimeRemainingColumn(),
- )
+ self.columns = columns or self.default_columns()
self.speed_estimate_period = speed_estimate_period
self.disable = disable
@@ -613,6 +608,15 @@ def __init__(
self.print = self.console.print
self.log = self.console.log
+ @classmethod
+ def default_columns(cls) -> Tuple[ProgressColumn, ...]:
+ return (
+ TextColumn("[progress.description]{task.description}"),
+ BarColumn(),
+ TextColumn("[progress.percentage]{task.percentage:>3.0f}%"),
+ TimeRemainingColumn(),
+ )
+
@property
def console(self) -> Console:
return self.live.console
@@ -1015,10 +1019,7 @@ def remove_task(self, task_id: TaskID) -> None:
with Progress(
SpinnerColumn(),
- TextColumn("[progress.description]{task.description}"),
- BarColumn(),
- TextColumn("[progress.percentage]{task.percentage:>3.0f}%"),
- TimeRemainingColumn(),
+ *Progress.default_columns(),
TimeElapsedColumn(),
console=console,
transient=True,
diff --git a/tests/test_progress.py b/tests/test_progress.py
index 2020f91ffb..876e5d99b1 100644
--- a/tests/test_progress.py
+++ b/tests/test_progress.py
@@ -334,6 +334,32 @@ def test_columns() -> None:
assert result == expected
+def test_using_default_columns() -> None:
+ # can only check types, as the instances do not '==' each other
+ expected_default_types = [
+ TextColumn,
+ BarColumn,
+ TextColumn,
+ TimeRemainingColumn,
+ ]
+
+ progress = Progress()
+ assert [type(c) for c in progress.columns] == expected_default_types
+
+ progress = Progress(
+ SpinnerColumn(),
+ *Progress.default_columns(),
+ "Elapsed:",
+ TimeElapsedColumn(),
+ )
+ assert [type(c) for c in progress.columns] == [
+ SpinnerColumn,
+ *expected_default_types,
+ str,
+ TimeElapsedColumn,
+ ]
+
+
def test_task_create() -> None:
task = Task(TaskID(1), "foo", 100, 0, _get_time=lambda: 1)
assert task.elapsed is None
From ec1ec9d30a4882fc5678672e9dcf6875701a89f3 Mon Sep 17 00:00:00 2001
From: Darren Burns
Date: Mon, 31 Jan 2022 14:35:58 +0000
Subject: [PATCH 025/351] Add US spelling of "gray" to colour names
---
rich/color.py | 38 ++++++++++++++++++++++++++++++++++++--
1 file changed, 36 insertions(+), 2 deletions(-)
diff --git a/rich/color.py b/rich/color.py
index f0fa026d64..b6c56a1ee4 100644
--- a/rich/color.py
+++ b/rich/color.py
@@ -7,7 +7,7 @@
from ._palettes import EIGHT_BIT_PALETTE, STANDARD_PALETTE, WINDOWS_PALETTE
from .color_triplet import ColorTriplet
-from .repr import rich_repr, Result
+from .repr import Result, rich_repr
from .terminal_theme import DEFAULT_TERMINAL_THEME
if TYPE_CHECKING: # pragma: no cover
@@ -61,6 +61,7 @@ def __repr__(self) -> str:
"bright_cyan": 14,
"bright_white": 15,
"grey0": 16,
+ "gray0": 16,
"navy_blue": 17,
"dark_blue": 18,
"blue3": 20,
@@ -96,6 +97,7 @@ def __repr__(self) -> str:
"blue_violet": 57,
"orange4": 94,
"grey37": 59,
+ "gray37": 59,
"medium_purple4": 60,
"slate_blue3": 62,
"royal_blue1": 63,
@@ -128,7 +130,9 @@ def __repr__(self) -> str:
"yellow4": 106,
"wheat4": 101,
"grey53": 102,
+ "gray53": 102,
"light_slate_grey": 103,
+ "light_slate_gray": 103,
"medium_purple": 104,
"light_slate_blue": 105,
"dark_olive_green3": 149,
@@ -155,11 +159,13 @@ def __repr__(self) -> str:
"light_salmon3": 173,
"rosy_brown": 138,
"grey63": 139,
+ "gray63": 139,
"medium_purple1": 141,
"gold3": 178,
"dark_khaki": 143,
"navajo_white3": 144,
"grey69": 145,
+ "gray69": 145,
"light_steel_blue3": 146,
"light_steel_blue": 147,
"yellow3": 184,
@@ -189,6 +195,7 @@ def __repr__(self) -> str:
"light_goldenrod2": 222,
"light_yellow3": 187,
"grey84": 188,
+ "gray84": 188,
"light_steel_blue1": 189,
"yellow2": 190,
"dark_olive_green1": 192,
@@ -223,30 +230,55 @@ def __repr__(self) -> str:
"wheat1": 229,
"cornsilk1": 230,
"grey100": 231,
+ "gray100": 231,
"grey3": 232,
+ "gray3": 232,
"grey7": 233,
+ "gray7": 233,
"grey11": 234,
+ "gray11": 234,
"grey15": 235,
+ "gray15": 235,
"grey19": 236,
+ "gray19": 236,
"grey23": 237,
+ "gray23": 237,
"grey27": 238,
+ "gray27": 238,
"grey30": 239,
+ "gray30": 239,
"grey35": 240,
+ "gray35": 240,
"grey39": 241,
+ "gray39": 241,
"grey42": 242,
+ "gray42": 242,
"grey46": 243,
+ "gray46": 243,
"grey50": 244,
+ "gray50": 244,
"grey54": 245,
+ "gray54": 245,
"grey58": 246,
+ "gray58": 246,
"grey62": 247,
+ "gray62": 247,
"grey66": 248,
+ "gray66": 248,
"grey70": 249,
+ "gray70": 249,
"grey74": 250,
+ "gray74": 250,
"grey78": 251,
+ "gray78": 251,
"grey82": 252,
+ "gray82": 252,
"grey85": 253,
+ "gray85": 253,
"grey89": 254,
+ "gray89": 254,
"grey93": 255,
+ "gray93": 255,
}
@@ -279,8 +311,8 @@ class Color(NamedTuple):
def __rich__(self) -> "Text":
"""Dispays the actual color if Rich printed."""
- from .text import Text
from .style import Style
+ from .text import Text
return Text.assemble(
f"
Date: Mon, 31 Jan 2022 14:38:04 +0000
Subject: [PATCH 026/351] Update CHANGELOG.md r.e. support for US ANSI gray
---
CHANGELOG.md | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8b49b5c57c..858101987e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,10 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## Unreleased
+
+- Add support for US spelling of "gray" in ANSI color names https://github.com/Textualize/rich/issues/1890
+
## [11.1.0] - 2022-01-28
### Added
From c17cf5ae7476fdacbfe470f0074b0ee8f9f46e47 Mon Sep 17 00:00:00 2001
From: Darren Burns
Date: Mon, 31 Jan 2022 14:49:41 +0000
Subject: [PATCH 027/351] Add `Added` header to `Unreleased` section of
changelog
---
CHANGELOG.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 858101987e..4997ae3258 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased
+### Added
+
- Add support for US spelling of "gray" in ANSI color names https://github.com/Textualize/rich/issues/1890
## [11.1.0] - 2022-01-28
From 5c586b67efd358a35f3796712c01686da5c086bb Mon Sep 17 00:00:00 2001
From: Matthias Bussonnier
Date: Mon, 31 Jan 2022 18:57:47 +0100
Subject: [PATCH 028/351] Typo: THe -> The
---
rich/markdown.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/rich/markdown.py b/rich/markdown.py
index 92d0d3c010..186e103697 100644
--- a/rich/markdown.py
+++ b/rich/markdown.py
@@ -25,7 +25,7 @@ def create(cls, markdown: "Markdown", node: Any) -> "MarkdownElement":
"""Factory to create markdown element,
Args:
- markdown (Markdown): THe parent Markdown object.
+ markdown (Markdown): The parent Markdown object.
node (Any): A node from Pygments.
Returns:
@@ -312,7 +312,7 @@ def create(cls, markdown: "Markdown", node: Any) -> "MarkdownElement":
"""Factory to create markdown element,
Args:
- markdown (Markdown): THe parent Markdown object.
+ markdown (Markdown): The parent Markdown object.
node (Any): A node from Pygments.
Returns:
From 76e234b79d8e8ae2c922c6576856bb5c613ce1e0 Mon Sep 17 00:00:00 2001
From: ptmcg
Date: Mon, 31 Jan 2022 13:09:51 -0600
Subject: [PATCH 029/351] Rename default_columns to get_default_columns, and
add docstring
---
rich/progress.py | 28 +++++++++++++++++++++++++---
tests/test_progress.py | 2 +-
2 files changed, 26 insertions(+), 4 deletions(-)
diff --git a/rich/progress.py b/rich/progress.py
index 8b9713c7a3..fe35b6c175 100644
--- a/rich/progress.py
+++ b/rich/progress.py
@@ -588,7 +588,7 @@ def __init__(
refresh_per_second is None or refresh_per_second > 0
), "refresh_per_second must be > 0"
self._lock = RLock()
- self.columns = columns or self.default_columns()
+ self.columns = columns or self.get_default_columns()
self.speed_estimate_period = speed_estimate_period
self.disable = disable
@@ -609,7 +609,29 @@ def __init__(
self.log = self.console.log
@classmethod
- def default_columns(cls) -> Tuple[ProgressColumn, ...]:
+ def get_default_columns(cls) -> Tuple[ProgressColumn, ...]:
+ """Get the default columns used for a new Progress instance:
+ - a text column for the description (TextColumn)
+ - the bar itself (BarColumn)
+ - a text column showing completion percentage (TextColumn)
+ - an estimated-time-remaining column (TimeRemainingColumn)
+ If the Progress instance is created without passing a columns argument,
+ the default columns defined here will be used.
+
+ You can also create a Progress instance using custom columns before
+ and/or after the defaults, as in this example:
+
+ progress = Progress(
+ SpinnerColumn(),
+ *Progress.default_columns(),
+ "Elapsed:",
+ TimeElapsedColumn(),
+ )
+
+ This code shows the creation of a Progress display, containing
+ a spinner to the left, the default columns, and a labeled elapsed
+ time column.
+ """
return (
TextColumn("[progress.description]{task.description}"),
BarColumn(),
@@ -1019,7 +1041,7 @@ def remove_task(self, task_id: TaskID) -> None:
with Progress(
SpinnerColumn(),
- *Progress.default_columns(),
+ *Progress.get_default_columns(),
TimeElapsedColumn(),
console=console,
transient=True,
diff --git a/tests/test_progress.py b/tests/test_progress.py
index 876e5d99b1..20b9d32ed4 100644
--- a/tests/test_progress.py
+++ b/tests/test_progress.py
@@ -348,7 +348,7 @@ def test_using_default_columns() -> None:
progress = Progress(
SpinnerColumn(),
- *Progress.default_columns(),
+ *Progress.get_default_columns(),
"Elapsed:",
TimeElapsedColumn(),
)
From 8e3a0be6fbb9186fa45cc42ec833d0895d2313ba Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?=
Date: Tue, 1 Feb 2022 12:24:18 +0100
Subject: [PATCH 030/351] Fix test_syntax not to use identity comparison on
string
Fix test_syntax to compare strings via "==" rather than "is", in order
to fix test failure on PyPy3.
---
CHANGELOG.md | 4 ++++
CONTRIBUTORS.md | 1 +
tests/test_syntax.py | 2 +-
3 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4997ae3258..17f3028b46 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,6 +11,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Add support for US spelling of "gray" in ANSI color names https://github.com/Textualize/rich/issues/1890
+### Fixed
+
+- Fixed `test_syntax.py::test_from_path_lexer_override` test failure on PyPy3 https://github.com/Textualize/rich/pull/1904
+
## [11.1.0] - 2022-01-28
### Added
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index c29cd79049..06e0618fd8 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -27,3 +27,4 @@ The following people have contributed to the development of Rich:
- [Nicolas Simonds](https://github.com/0xDEC0DE)
- [Gabriele N. Tornetta](https://github.com/p403n1x87)
- [Patrick Arminio](https://github.com/patrick91)
+- [Michał Górny](https://github.com/mgorny)
diff --git a/tests/test_syntax.py b/tests/test_syntax.py
index 46d0126e14..e5d904f363 100644
--- a/tests/test_syntax.py
+++ b/tests/test_syntax.py
@@ -277,7 +277,7 @@ def test_from_path_lexer_override():
try:
os.write(fh, b"import this\n")
syntax = Syntax.from_path(path, lexer="rust")
- assert syntax.lexer.name is "Rust"
+ assert syntax.lexer.name == "Rust"
assert syntax.code == "import this\n"
finally:
os.remove(path)
From f15dc3ea0b59d5fc04341d3f634f0e61c05a84db Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?=
Date: Tue, 1 Feb 2022 15:10:32 +0100
Subject: [PATCH 031/351] Fix test_inspect failures on PyPy3
Mark the test_inspect tests failing on PyPy3 due to different output
to be skipped appropriately.
---
CHANGELOG.md | 2 +-
tests/test_inspect.py | 9 +++++++++
2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 17f3028b46..1a75bf3766 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,7 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed
-- Fixed `test_syntax.py::test_from_path_lexer_override` test failure on PyPy3 https://github.com/Textualize/rich/pull/1904
+- Fixed test failures on PyPy3 https://github.com/Textualize/rich/pull/1904
## [11.1.0] - 2022-01-28
diff --git a/tests/test_inspect.py b/tests/test_inspect.py
index 63c5f06244..b4c1d2a709 100644
--- a/tests/test_inspect.py
+++ b/tests/test_inspect.py
@@ -32,6 +32,11 @@
reason="rendered differently on py3.10",
)
+skip_pypy3 = pytest.mark.skipif(
+ hasattr(sys, "pypy_version_info"),
+ reason="rendered differently on pypy3",
+)
+
def render(obj, methods=False, value=False, width=50) -> str:
console = Console(file=io.StringIO(), width=width, legacy_windows=False)
@@ -81,6 +86,7 @@ def test_render():
assert expected == result
+@skip_pypy3
def test_inspect_text():
expected = (
"╭──────────────── ─────────────────╮\n"
@@ -98,6 +104,7 @@ def test_inspect_text():
@skip_py36
@skip_py37
+@skip_pypy3
def test_inspect_empty_dict():
expected = (
"╭──────────────── ────────────────╮\n"
@@ -119,6 +126,7 @@ def test_inspect_empty_dict():
assert render({}).startswith(expected)
+@skip_pypy3
def test_inspect_builtin_function():
expected = (
"╭────────── ───────────╮\n"
@@ -237,6 +245,7 @@ def test_inspect_integer_with_methods():
@skip_py36
@skip_py37
+@skip_pypy3
def test_broken_call_attr():
class NotCallable:
__call__ = 5 # Passes callable() but isn't really callable
From 7df2aaccc135e6f38ba7fc00e837f0cd85d158ba Mon Sep 17 00:00:00 2001
From: "Paulo S. Costa"
Date: Thu, 3 Feb 2022 22:29:03 -0800
Subject: [PATCH 032/351] Document '{stylesheet}' in code_format
---
rich/console.py | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/rich/console.py b/rich/console.py
index fbf87bd5c1..e2d7a6d52a 100644
--- a/rich/console.py
+++ b/rich/console.py
@@ -2060,8 +2060,8 @@ def export_html(
Args:
theme (TerminalTheme, optional): TerminalTheme object containing console colors.
clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``.
- code_format (str, optional): Format string to render HTML, should contain {foreground}
- {background} and {code}.
+ code_format (str, optional): Format string to render HTML. In addition to '{foreground}',
+ '{background}', and '{code}', should contain '{stylesheet}' if inline_styles is ``False``.
inline_styles (bool, optional): If ``True`` styles will be inlined in to spans, which makes files
larger but easier to cut and paste markup. If ``False``, styles will be embedded in a style tag.
Defaults to False.
@@ -2137,8 +2137,8 @@ def save_html(
path (str): Path to write html file.
theme (TerminalTheme, optional): TerminalTheme object containing console colors.
clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``.
- code_format (str, optional): Format string to render HTML, should contain {foreground}
- {background} and {code}.
+ code_format (str, optional): Format string to render HTML. In addition to '{foreground}',
+ '{background}', and '{code}', should contain '{stylesheet}' if inline_styles is ``False``.
inline_styles (bool, optional): If ``True`` styles will be inlined in to spans, which makes files
larger but easier to cut and paste markup. If ``False``, styles will be embedded in a style tag.
Defaults to False.
From 731f9848228e4cffede54ed2056b606b27a35ecb Mon Sep 17 00:00:00 2001
From: Darren Burns
Date: Fri, 4 Feb 2022 13:51:58 +0000
Subject: [PATCH 033/351] Expose diagnose.report as a function add a little
more info to hint at environment
---
.coveragerc | 3 ++-
rich/diagnose.py | 35 ++++++++++++++++++++++++++++++++---
2 files changed, 34 insertions(+), 4 deletions(-)
diff --git a/.coveragerc b/.coveragerc
index ff1a046c08..2afac8dc60 100644
--- a/.coveragerc
+++ b/.coveragerc
@@ -2,7 +2,8 @@
omit = rich/jupyter.py
rich/_windows.py
rich/_timer.py
-
+ rich/diagnose.py
+
[report]
exclude_lines =
pragma: no cover
diff --git a/rich/diagnose.py b/rich/diagnose.py
index 455e11dc02..7ecdff97ff 100644
--- a/rich/diagnose.py
+++ b/rich/diagnose.py
@@ -1,6 +1,35 @@
-if __name__ == "__main__": # pragma: no cover
- from rich.console import Console
- from rich import inspect
+import os
+import platform
+
+from rich import inspect
+from rich.console import Console, get_windows_console_features
+from rich.panel import Panel
+from rich.text import Text
+
+
+def report(): # pragma: no cover
+ """Print a report to the terminal with debugging information"""
+ console = Console()
+ inspect(console)
+ features = get_windows_console_features()
+ inspect(features)
+
+ if console.is_jupyter:
+ jpy_parent_pid = os.getenv("JPY_PARENT_PID")
+ vs_code_verbose = os.getenv("VSCODE_VERBOSE_LOGGING")
+ console.print(
+ Panel(
+ title="Jupyter Environment Hints",
+ renderable=Text(
+ f"JPY_PARENT_PID = {jpy_parent_pid}\n"
+ f"VSCODE_VERBOSE_LOGGING = {vs_code_verbose}"
+ ),
+ ),
+ )
+
+ console.print(f'platform="{platform.system()}"')
+
+if __name__ == "__main__": # pragma: no cover
console = Console()
inspect(console)
From 96eef2d2b179b68ccb5bfe17508f35686c4c9774 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 4 Feb 2022 13:56:25 +0000
Subject: [PATCH 034/351] Bump pytest from 6.2.5 to 7.0.0
Bumps [pytest](https://github.com/pytest-dev/pytest) from 6.2.5 to 7.0.0.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/6.2.5...7.0.0)
---
updated-dependencies:
- dependency-name: pytest
dependency-type: direct:development
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
---
poetry.lock | 38 +++++++++++++++++++-------------------
pyproject.toml | 2 +-
2 files changed, 20 insertions(+), 20 deletions(-)
diff --git a/poetry.lock b/poetry.lock
index 59c3236d6d..fcfe395fc3 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -3,7 +3,7 @@ name = "appnope"
version = "0.1.2"
description = "Disable App Nap on macOS >= 10.9"
category = "main"
-optional = false
+optional = true
python-versions = "*"
[[package]]
@@ -74,7 +74,7 @@ name = "backcall"
version = "0.2.0"
description = "Specifications for callback functions passed in to an API"
category = "main"
-optional = false
+optional = true
python-versions = "*"
[[package]]
@@ -195,7 +195,7 @@ name = "decorator"
version = "5.1.0"
description = "Decorators for Humans"
category = "main"
-optional = false
+optional = true
python-versions = ">=3.5"
[[package]]
@@ -309,7 +309,7 @@ name = "ipython"
version = "7.16.3"
description = "IPython: Productive Interactive Computing"
category = "main"
-optional = false
+optional = true
python-versions = ">=3.6"
[package.dependencies]
@@ -340,7 +340,7 @@ name = "ipython-genutils"
version = "0.2.0"
description = "Vestigial utilities from IPython"
category = "main"
-optional = false
+optional = true
python-versions = "*"
[[package]]
@@ -368,7 +368,7 @@ name = "jedi"
version = "0.17.2"
description = "An autocompletion tool for Python that can be used for text editors."
category = "main"
-optional = false
+optional = true
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
[package.dependencies]
@@ -641,7 +641,7 @@ name = "parso"
version = "0.7.1"
description = "A Python Parser"
category = "main"
-optional = false
+optional = true
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
[package.extras]
@@ -660,7 +660,7 @@ name = "pexpect"
version = "4.8.0"
description = "Pexpect allows easy control of interactive console applications."
category = "main"
-optional = false
+optional = true
python-versions = "*"
[package.dependencies]
@@ -671,7 +671,7 @@ name = "pickleshare"
version = "0.7.5"
description = "Tiny 'shelve'-like database with concurrency support"
category = "main"
-optional = false
+optional = true
python-versions = "*"
[[package]]
@@ -735,7 +735,7 @@ name = "prompt-toolkit"
version = "3.0.24"
description = "Library for building powerful interactive command lines in Python"
category = "main"
-optional = false
+optional = true
python-versions = ">=3.6.2"
[package.dependencies]
@@ -746,7 +746,7 @@ name = "ptyprocess"
version = "0.7.0"
description = "Run a subprocess in a pseudo terminal"
category = "main"
-optional = false
+optional = true
python-versions = "*"
[[package]]
@@ -794,7 +794,7 @@ python-versions = ">=3.6"
[[package]]
name = "pytest"
-version = "6.2.5"
+version = "7.0.0"
description = "pytest: simple powerful testing with Python"
category = "dev"
optional = false
@@ -809,10 +809,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"
@@ -953,7 +953,7 @@ name = "traitlets"
version = "4.3.3"
description = "Traitlets Python config system"
category = "main"
-optional = false
+optional = true
python-versions = "*"
[package.dependencies]
@@ -1013,7 +1013,7 @@ name = "wcwidth"
version = "0.2.5"
description = "Measures the displayed width of unicode strings in a terminal"
category = "main"
-optional = false
+optional = true
python-versions = "*"
[[package]]
@@ -1053,7 +1053,7 @@ jupyter = ["ipywidgets"]
[metadata]
lock-version = "1.1"
python-versions = "^3.6.2"
-content-hash = "d642a2a33643ec67d8ec48fef8ac01b7226829d0dcc3a14b10c3140005cbd0f0"
+content-hash = "74159f2d5dbb53418204e0fd27ef544256648663c41d0a2841c11c34589c52f6"
[metadata.files]
appnope = [
@@ -1525,8 +1525,8 @@ pyrsistent = [
{file = "pyrsistent-0.18.0.tar.gz", hash = "sha256:773c781216f8c2900b42a7b638d5b517bb134ae1acbebe4d1e8f1f41ea60eb4b"},
]
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.0-py3-none-any.whl", hash = "sha256:42901e6bd4bd4a0e533358a86e848427a49005a3256f657c5c8f8dd35ef137a9"},
+ {file = "pytest-7.0.0.tar.gz", hash = "sha256:dad48ffda394e5ad9aa3b7d7ddf339ed502e5e365b1350e0af65f4a602344b11"},
]
pytest-cov = [
{file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"},
diff --git a/pyproject.toml b/pyproject.toml
index e8ea9bf99c..c574de2fc8 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -39,7 +39,7 @@ ipywidgets = { version = "^7.5.1", optional = true }
jupyter = ["ipywidgets"]
[tool.poetry.dev-dependencies]
-pytest = "^6.2.5"
+pytest = "^7.0.0"
black = "^21.11b1"
mypy = "^0.930"
pytest-cov = "^3.0.0"
From bdad740de91368814c331ea807f362e5bec73336 Mon Sep 17 00:00:00 2001
From: Darren Burns
Date: Fri, 4 Feb 2022 14:10:12 +0000
Subject: [PATCH 035/351] Update issue template
---
.github/ISSUE_TEMPLATE/bug_report.md | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index 05cd2cd112..723781db8f 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -20,12 +20,21 @@ Provide a minimal code example that demonstrates the issue if you can. If the is
What platform (Win/Linux/Mac) are you running on? What terminal software are you using?
-I may ask you to cut and paste the output of the following commands. It may save some time if you do it now.
+I may ask you to copy and paste the output of the following commands. It may save some time if you do it now.
+
+If you're using Rich in a terminal:
```
-python -m rich.diagnose
-python -m rich._windows
+python -c "from rich.diagnose import report; report()"
pip freeze | grep rich
```
-
+
+If you're using Rich in a Jupyter Notebook, run the following snippet in a cell
+and paste the output in your bug report.
+
+```python
+from rich.diagnose import report
+report()
+```
+
From 29bc5dd4905c6bf8ec8d4fd8d789abbdfe5d6b92 Mon Sep 17 00:00:00 2001
From: Darren Burns
Date: Fri, 4 Feb 2022 14:19:15 +0000
Subject: [PATCH 036/351] Add missing return type annotation to diagnose.report
---
rich/diagnose.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/rich/diagnose.py b/rich/diagnose.py
index 7ecdff97ff..7e8ad989bd 100644
--- a/rich/diagnose.py
+++ b/rich/diagnose.py
@@ -7,7 +7,7 @@
from rich.text import Text
-def report(): # pragma: no cover
+def report() -> None: # pragma: no cover
"""Print a report to the terminal with debugging information"""
console = Console()
inspect(console)
From bcbaed2b95b3f0ce4d5a72a5fc40274158d96bc9 Mon Sep 17 00:00:00 2001
From: Darren Burns
Date: Fri, 4 Feb 2022 14:23:32 +0000
Subject: [PATCH 037/351] Added `rich.diagnose.report` note to CHANGELOG.md
---
CHANGELOG.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4997ae3258..0887ed3941 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
- Add support for US spelling of "gray" in ANSI color names https://github.com/Textualize/rich/issues/1890
+- Added `rich.diagnose.report` to expose environment debugging logic as function https://github.com/Textualize/rich/pull/1917
## [11.1.0] - 2022-01-28
From bdd1fd77ab6f9bec289f6a69f66ca734d22b6589 Mon Sep 17 00:00:00 2001
From: Aaron Stephens
Date: Fri, 4 Feb 2022 13:25:56 -0800
Subject: [PATCH 038/351] feat: optional RichHandler keywords
---
CONTRIBUTORS.md | 1 +
rich/logging.py | 7 ++++++-
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index c29cd79049..4508d9a695 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -25,5 +25,6 @@ The following people have contributed to the development of Rich:
- [Tushar Sadhwani](https://github.com/tusharsadhwani)
- [Tim Savage](https://github.com/timsavage)
- [Nicolas Simonds](https://github.com/0xDEC0DE)
+- [Aaron Stephens](https://github.com/aaronst)
- [Gabriele N. Tornetta](https://github.com/p403n1x87)
- [Patrick Arminio](https://github.com/patrick91)
diff --git a/rich/logging.py b/rich/logging.py
index 002f1f7bf1..7f7b499a5a 100644
--- a/rich/logging.py
+++ b/rich/logging.py
@@ -41,6 +41,7 @@ class RichHandler(Handler):
Defaults to 10.
locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80.
log_time_format (Union[str, TimeFormatterCallable], optional): If ``log_time`` is enabled, either string for strftime or callable that formats the time. Defaults to "[%x %X] ".
+ keywords (List[str], optional): List of words to highlight instead of ``RichHandler.KEYWORDS``.
"""
KEYWORDS: ClassVar[Optional[List[str]]] = [
@@ -76,6 +77,7 @@ def __init__(
locals_max_length: int = 10,
locals_max_string: int = 80,
log_time_format: Union[str, FormatTimeCallable] = "[%x %X]",
+ keywords: Optional[List[str]] = None
) -> None:
super().__init__(level=level)
self.console = console or get_console()
@@ -98,6 +100,7 @@ def __init__(
self.tracebacks_show_locals = tracebacks_show_locals
self.locals_max_length = locals_max_length
self.locals_max_string = locals_max_string
+ self.keywords = keywords
def get_level_text(self, record: LogRecord) -> Text:
"""Get the level name from the record.
@@ -171,7 +174,9 @@ def render_message(self, record: LogRecord, message: str) -> "ConsoleRenderable"
if highlighter:
message_text = highlighter(message_text)
- if self.KEYWORDS:
+ if self.keywords:
+ message_text.highlight_words(self.keywords, "logging.keyword")
+ elif self.KEYWORDS:
message_text.highlight_words(self.KEYWORDS, "logging.keyword")
return message_text
From 07403709b9caaac3672e0efa3d827975cd5f8f61 Mon Sep 17 00:00:00 2001
From: Aaron Stephens
Date: Fri, 4 Feb 2022 13:55:00 -0800
Subject: [PATCH 039/351] chore: black formatting
---
rich/logging.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/rich/logging.py b/rich/logging.py
index 7f7b499a5a..f4fbcf0411 100644
--- a/rich/logging.py
+++ b/rich/logging.py
@@ -77,7 +77,7 @@ def __init__(
locals_max_length: int = 10,
locals_max_string: int = 80,
log_time_format: Union[str, FormatTimeCallable] = "[%x %X]",
- keywords: Optional[List[str]] = None
+ keywords: Optional[List[str]] = None,
) -> None:
super().__init__(level=level)
self.console = console or get_console()
From eb6b5ef87a762a2480981b616a49cf0bba617daf Mon Sep 17 00:00:00 2001
From: Dennis Brakhane
Date: Sat, 5 Feb 2022 19:12:21 +0100
Subject: [PATCH 040/351] Add support for enum.Flag in ReprHighlighter
enum.Flag allows more than one bit to be set, and its repr will show
something like .
For this to display correctly, we need to add the pipe symbol to the
tag regex.
---
rich/highlighter.py | 2 +-
tests/test_highlighter.py | 10 ++++++++++
2 files changed, 11 insertions(+), 1 deletion(-)
diff --git a/rich/highlighter.py b/rich/highlighter.py
index 8afdd017b6..e2ef9d7b1f 100644
--- a/rich/highlighter.py
+++ b/rich/highlighter.py
@@ -81,7 +81,7 @@ class ReprHighlighter(RegexHighlighter):
base_style = "repr."
highlights = [
- r"(?P\<)(?P[\w\-\.\:]*)(?P[\w\W]*?)(?P\>)",
+ r"(?P\<)(?P[\w\-\.\:\|]*)(?P[\w\W]*?)(?P\>)",
r"(?P[\w_]{1,50})=(?P\"?[\w_]+\"?)?",
r"(?P[\{\[\(\)\]\}])",
_combine_regex(
diff --git a/tests/test_highlighter.py b/tests/test_highlighter.py
index 99793723c8..c5303b5c0c 100644
--- a/tests/test_highlighter.py
+++ b/tests/test_highlighter.py
@@ -40,6 +40,16 @@ def test_wrong_type():
Span(4, 9, "repr.str"),
],
),
+ (
+ "",
+ [
+ Span(0, 1, "repr.tag_start"),
+ Span(1, 23, "repr.tag_name"),
+ Span(23, 25, "repr.tag_contents"),
+ Span(25, 26, "repr.tag_end"),
+ Span(24, 25, "repr.number"),
+ ],
+ ),
("( )", [Span(0, 1, "repr.brace"), Span(2, 3, "repr.brace")]),
("[ ]", [Span(0, 1, "repr.brace"), Span(2, 3, "repr.brace")]),
("{ }", [Span(0, 1, "repr.brace"), Span(2, 3, "repr.brace")]),
From 68d3dfce34c19894b2f6dd047a8002ea1177691d Mon Sep 17 00:00:00 2001
From: Dennis Brakhane
Date: Sat, 5 Feb 2022 19:39:39 +0100
Subject: [PATCH 041/351] Cleanup regex
Special characters lose their special meaning in character sets, so
there's no need to escape them with a backslash. Furthermore,
some backslash escaped characters have no special meaning,
so the backslash can be removed as well.
"]" does normally close a set, except when it's the first character.
Similarly, "-" has no special meaning at the beginning or the end.
Therefore, the order in a few character sets had to be slightly
modified.
Just to be sure, the old and new versions of the regexp were confirmed
to be equivalent via re.compile with the re.DEBUG flag and comparing the
output.
---
rich/highlighter.py | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/rich/highlighter.py b/rich/highlighter.py
index e2ef9d7b1f..69d3260213 100644
--- a/rich/highlighter.py
+++ b/rich/highlighter.py
@@ -81,22 +81,22 @@ class ReprHighlighter(RegexHighlighter):
base_style = "repr."
highlights = [
- r"(?P\<)(?P[\w\-\.\:\|]*)(?P[\w\W]*?)(?P\>)",
- r"(?P[\w_]{1,50})=(?P\"?[\w_]+\"?)?",
- r"(?P[\{\[\(\)\]\}])",
+ r"(?P<)(?P[-\w.:|]*)(?P[\w\W]*?)(?P>)",
+ r'(?P[\w_]{1,50})=(?P"?[\w_]+"?)?',
+ r"(?P[][{}()])",
_combine_regex(
r"(?P[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})",
r"(?P([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4})",
r"(?P(?:[0-9A-Fa-f]{1,2}-){7}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{1,2}:){7}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{4}\.){3}[0-9A-Fa-f]{4})",
r"(?P(?:[0-9A-Fa-f]{1,2}-){5}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{1,2}:){5}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})",
- r"(?P[\w\.]*?)\(",
+ r"(?P[\w.]*?)\(",
r"\b(?PTrue)\b|\b(?PFalse)\b|\b(?PNone)\b",
r"(?P\.\.\.)",
- r"(?P(?\B(\/[\w\.\-\_\+]+)*\/)(?P[\w\.\-\_\+]*)?",
- r"(?b?\'\'\'.*?(?[a-fA-F0-9]{8}\-[a-fA-F0-9]{4}\-[a-fA-F0-9]{4}\-[a-fA-F0-9]{4}\-[a-fA-F0-9]{12})",
- r"(?P(file|https|http|ws|wss):\/\/[0-9a-zA-Z\$\-\_\+\!`\(\)\,\.\?\/\;\:\&\=\%\#]*)",
+ r"(?P(?\B(/[-\w._+]+)*\/)(?P[-\w._+]*)?",
+ r"(?b?'''.*?(?[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})",
+ r"(?P(file|https|http|ws|wss)://[-0-9a-zA-Z$_+!`(),.?/;:&=%#]*)",
),
]
From eec7110b4590400ac070c065fd438a2088c842df Mon Sep 17 00:00:00 2001
From: Dennis Brakhane
Date: Sat, 5 Feb 2022 19:45:26 +0100
Subject: [PATCH 042/351] Update changelog and contributers
---
CHANGELOG.md | 2 +-
CONTRIBUTORS.md | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0ece575abd..65aa4f2adc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,7 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
- Add support for US spelling of "gray" in ANSI color names https://github.com/Textualize/rich/issues/1890
-
+- Add support for enum.Flag in ReprHighlighter
## [11.1.0] - 2022-01-28
### Added
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index c29cd79049..1e06144828 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -27,3 +27,4 @@ The following people have contributed to the development of Rich:
- [Nicolas Simonds](https://github.com/0xDEC0DE)
- [Gabriele N. Tornetta](https://github.com/p403n1x87)
- [Patrick Arminio](https://github.com/patrick91)
+- [Dennis Brakhane](https://github.com/brakhane)
From e1c595c7e5bd00fc7900471ea13f6de2fa8d165d Mon Sep 17 00:00:00 2001
From: ptmcg
Date: Sun, 6 Feb 2022 13:53:06 -0600
Subject: [PATCH 043/351] task._progress change default_factory to create
deque(maxlen=1000), to avoid run-time while loop to trim to length 1000
---
rich/progress.py | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/rich/progress.py b/rich/progress.py
index fe35b6c175..115ae81608 100644
--- a/rich/progress.py
+++ b/rich/progress.py
@@ -475,7 +475,7 @@ class Task:
"""Optional[float]: The last speed for a finished task."""
_progress: Deque[ProgressSample] = field(
- default_factory=deque, init=False, repr=False
+ default_factory=lambda: deque(maxlen=1000), init=False, repr=False
)
_lock: RLock = field(repr=False, default_factory=RLock)
@@ -813,8 +813,6 @@ def update(
popleft = _progress.popleft
while _progress and _progress[0].timestamp < old_sample_time:
popleft()
- while len(_progress) > 1000:
- popleft()
if update_completed > 0:
_progress.append(ProgressSample(current_time, update_completed))
if task.completed >= task.total and task.finished_time is None:
From e4f48cc612e35d2fb6bfe9c8c946a80aa2dad564 Mon Sep 17 00:00:00 2001
From: ptmcg
Date: Sun, 6 Feb 2022 14:03:39 -0600
Subject: [PATCH 044/351] Update CONTRIBUTORS.md and CHANGELOG.md with changes
related to adding Progress.get_default_columns
---
CHANGELOG.md | 1 +
CONTRIBUTORS.md | 1 +
2 files changed, 2 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0ece575abd..154decdc24 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
- Add support for US spelling of "gray" in ANSI color names https://github.com/Textualize/rich/issues/1890
+- Added classmethod `Progress.get_default_columns()` to get the default list of progress bar columns https://github.com/Textualize/rich/pull/1894
## [11.1.0] - 2022-01-28
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index c29cd79049..0c0f891fdc 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -16,6 +16,7 @@ The following people have contributed to the development of Rich:
- [Hedy Li](https://github.com/hedythedev)
- [Alexander Mancevice](https://github.com/amancevice)
- [Will McGugan](https://github.com/willmcgugan)
+- [Paul McGuire](https://github.com/ptmcg)
- [Nathan Page](https://github.com/nathanrpage97)
- [Avi Perl](https://github.com/avi-perl)
- [Laurent Peuch](https://github.com/psycojoker)
From c8c2cf117f3510b1105c3fa5a93a811855f7f0b5 Mon Sep 17 00:00:00 2001
From: Darren Burns
Date: Mon, 7 Feb 2022 10:06:36 +0000
Subject: [PATCH 045/351] Add more diagnose.report env variables, invoke from
__main__
---
.github/ISSUE_TEMPLATE/bug_report.md | 2 +-
rich/diagnose.py | 30 ++++++++++++++--------------
2 files changed, 16 insertions(+), 16 deletions(-)
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index 723781db8f..6d6f45677f 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -25,7 +25,7 @@ I may ask you to copy and paste the output of the following commands. It may sav
If you're using Rich in a terminal:
```
-python -c "from rich.diagnose import report; report()"
+python -m rich.diagnose
pip freeze | grep rich
```
diff --git a/rich/diagnose.py b/rich/diagnose.py
index 7e8ad989bd..09c4e0622b 100644
--- a/rich/diagnose.py
+++ b/rich/diagnose.py
@@ -4,7 +4,7 @@
from rich import inspect
from rich.console import Console, get_windows_console_features
from rich.panel import Panel
-from rich.text import Text
+from rich.pretty import Pretty
def report() -> None: # pragma: no cover
@@ -14,22 +14,22 @@ def report() -> None: # pragma: no cover
features = get_windows_console_features()
inspect(features)
- if console.is_jupyter:
- jpy_parent_pid = os.getenv("JPY_PARENT_PID")
- vs_code_verbose = os.getenv("VSCODE_VERBOSE_LOGGING")
- console.print(
- Panel(
- title="Jupyter Environment Hints",
- renderable=Text(
- f"JPY_PARENT_PID = {jpy_parent_pid}\n"
- f"VSCODE_VERBOSE_LOGGING = {vs_code_verbose}"
- ),
- ),
- )
+ env_names = (
+ "TERM",
+ "COLORTERM",
+ "CLICOLOR",
+ "NO_COLOR",
+ "TERM_PROGRAM",
+ "COLUMNS",
+ "LINES",
+ "JPY_PARENT_PID",
+ "VSCODE_VERBOSE_LOGGING",
+ )
+ env = {name: os.getenv(name) for name in env_names}
+ console.print(Panel.fit((Pretty(env)), title="[b]Environment Variables"))
console.print(f'platform="{platform.system()}"')
if __name__ == "__main__": # pragma: no cover
- console = Console()
- inspect(console)
+ report()
From 232fade573401688ccc40e42756c7a4022c5e8ac Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 7 Feb 2022 13:31:20 +0000
Subject: [PATCH 046/351] Bump sphinx-copybutton from 0.4.0 to 0.5.0
Bumps [sphinx-copybutton](https://github.com/executablebooks/sphinx-copybutton) from 0.4.0 to 0.5.0.
- [Release notes](https://github.com/executablebooks/sphinx-copybutton/releases)
- [Changelog](https://github.com/executablebooks/sphinx-copybutton/blob/master/CHANGELOG.md)
- [Commits](https://github.com/executablebooks/sphinx-copybutton/compare/v0.4.0...v0.5.0)
---
updated-dependencies:
- dependency-name: sphinx-copybutton
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
---
docs/requirements.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/requirements.txt b/docs/requirements.txt
index 849854779e..193114721b 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -1,4 +1,4 @@
alabaster==0.7.12
Sphinx==4.4.0
sphinx-rtd-theme==1.0.0
-sphinx-copybutton==0.4.0
+sphinx-copybutton==0.5.0
From ba0262b94afcae4d03ec177ccb20834c78ea4431 Mon Sep 17 00:00:00 2001
From: Dennis Brakhane
Date: Tue, 8 Feb 2022 13:12:54 +0100
Subject: [PATCH 047/351] Add link to PR
---
CHANGELOG.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 65aa4f2adc..8d7f0f3ee3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,7 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
- Add support for US spelling of "gray" in ANSI color names https://github.com/Textualize/rich/issues/1890
-- Add support for enum.Flag in ReprHighlighter
+- Add support for enum.Flag in ReprHighlighter https://github.com/Textualize/rich/pull/1920
## [11.1.0] - 2022-01-28
### Added
From 429c6d38614072d574e22d7aabbe08ff566ab60c Mon Sep 17 00:00:00 2001
From: Will McGugan
Date: Tue, 8 Feb 2022 20:05:39 +0000
Subject: [PATCH 048/351] optimization for measure
---
CHANGELOG.md | 8 ++++++--
pyproject.toml | 2 +-
rich/measure.py | 6 ++++--
3 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 99a53bb620..9c1416a5bf 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-## Unreleased
+## [11.2.0] - 2022-02-08
### Added
@@ -13,11 +13,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Added `rich.diagnose.report` to expose environment debugging logic as function https://github.com/Textualize/rich/pull/1917
- Added classmethod `Progress.get_default_columns()` to get the default list of progress bar columns https://github.com/Textualize/rich/pull/1894
+### Fixed
+
+- Fixed performance issue in measuring text
+
## [11.1.0] - 2022-01-28
### Added
-
- Workaround for edge case of object from Faiss with no `__class__` https://github.com/Textualize/rich/issues/1838
- Add Traditional Chinese readme
- Add `Syntax.guess_lexer`, add support for more lexers (e.g. Django templates etc.) https://github.com/Textualize/rich/pull/1869
@@ -1627,6 +1630,7 @@ Major version bump for a breaking change to `Text.stylize signature`, which corr
- First official release, API still to be stabilized
+[11.2.0]: https://github.com/willmcgugan/rich/compare/v11.1.0...v11.2.0
[11.1.0]: https://github.com/willmcgugan/rich/compare/v11.0.0...v11.1.0
[11.0.0]: https://github.com/willmcgugan/rich/compare/v10.16.1...v11.0.0
[10.16.1]: https://github.com/willmcgugan/rich/compare/v10.16.0...v10.16.1
diff --git a/pyproject.toml b/pyproject.toml
index e8ea9bf99c..4b221c35b6 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -2,7 +2,7 @@
name = "rich"
homepage = "https://github.com/willmcgugan/rich"
documentation = "https://rich.readthedocs.io/en/latest/"
-version = "11.1.0"
+version = "11.2.0"
description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
authors = ["Will McGugan "]
license = "MIT"
diff --git a/rich/measure.py b/rich/measure.py
index aea238df93..e12787c8be 100644
--- a/rich/measure.py
+++ b/rich/measure.py
@@ -1,5 +1,5 @@
from operator import itemgetter
-from typing import Callable, Iterable, NamedTuple, Optional, TYPE_CHECKING
+from typing import TYPE_CHECKING, Callable, Iterable, NamedTuple, Optional
from . import errors
from .protocol import is_renderable, rich_cast
@@ -96,7 +96,9 @@ def get(
if _max_width < 1:
return Measurement(0, 0)
if isinstance(renderable, str):
- renderable = console.render_str(renderable, markup=options.markup)
+ renderable = console.render_str(
+ renderable, markup=options.markup, highlight=False
+ )
renderable = rich_cast(renderable)
if is_renderable(renderable):
get_console_width: Optional[
From 32e437a47d6af8f5c6ec9bcdd38cb896a3949a81 Mon Sep 17 00:00:00 2001
From: ptmcg
Date: Wed, 9 Feb 2022 05:39:10 -0600
Subject: [PATCH 049/351] Add MofNCompleteColumn ProgressColumn type
---
CHANGELOG.md | 9 +++++++++
rich/progress.py | 27 +++++++++++++++++++++++++++
tests/test_progress.py | 6 +++++-
3 files changed, 41 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f1d04a55d9..1386aae0c2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,15 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## Unreleased
+
+### Added
+
+- Added ProgressColumn `MofNCompleteColumn` to display raw `completed/total` column (similar to DownloadColumn,
+ but displays values as ints, does not convert to floats or add bit/bytes units).
+ https://github.com/Textualize/rich/discussions/1899
+
+
## [11.2.0] - 2022-02-08
### Added
diff --git a/rich/progress.py b/rich/progress.py
index 115ae81608..bbbdf70ef7 100644
--- a/rich/progress.py
+++ b/rich/progress.py
@@ -375,6 +375,33 @@ def render(self, task: "Task") -> Text:
return Text(data_size, style="progress.filesize.total")
+class MofNCompleteColumn(ProgressColumn):
+ """Renders completed count/total, e.g. ' 10/1000'.
+
+ Best for bounded tasks with int quantities.
+
+ Space pads the completed count so that progress length does not change as task progresses
+ past powers of 10.
+
+ Args:
+ separator (str, optional): Text to separate completed and total values. Defaults to "/".
+ """
+
+ def __init__(self, separator: str = "/", table_column: Optional[Column] = None):
+ self.separator = separator
+ super().__init__(table_column=table_column)
+
+ def render(self, task: "Task") -> Text:
+ """Show completed/total."""
+ completed = int(task.completed)
+ total = int(task.total)
+ total_width = len(str(total))
+ return Text(
+ f"{completed:{total_width}d}{self.separator}{total}",
+ style="progress.download",
+ )
+
+
class DownloadColumn(ProgressColumn):
"""Renders file size downloaded and total, e.g. '0.5/2.3 GB'.
diff --git a/tests/test_progress.py b/tests/test_progress.py
index 20b9d32ed4..2dd53ccd2c 100644
--- a/tests/test_progress.py
+++ b/tests/test_progress.py
@@ -16,6 +16,7 @@
TransferSpeedColumn,
RenderableColumn,
SpinnerColumn,
+ MofNCompleteColumn,
Progress,
Task,
TextColumn,
@@ -311,6 +312,8 @@ def test_columns() -> None:
TotalFileSizeColumn(),
DownloadColumn(),
TransferSpeedColumn(),
+ MofNCompleteColumn(),
+ MofNCompleteColumn(separator=" of "),
transient=True,
console=console,
auto_refresh=False,
@@ -330,7 +333,8 @@ def test_columns() -> None:
result = replace_link_ids(console.file.getvalue())
print(repr(result))
- expected = "\x1b[?25ltest foo \x1b[38;5;237m━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m \x1b[36m-:--:--\x1b[0m \x1b[33m0:00:07\x1b[0m \x1b[32m0 bytes\x1b[0m \x1b[32m10 bytes\x1b[0m \x1b[32m0/10 bytes\x1b[0m \x1b[31m?\x1b[0m\ntest bar \x1b[38;5;237m━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m \x1b[36m-:--:--\x1b[0m \x1b[33m0:00:16\x1b[0m \x1b[32m0 bytes\x1b[0m \x1b[32m7 bytes \x1b[0m \x1b[32m0/7 bytes \x1b[0m \x1b[31m?\x1b[0m\r\x1b[2K\x1b[1A\x1b[2Kfoo\ntest foo \x1b[38;5;237m━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m \x1b[36m-:--:--\x1b[0m \x1b[33m0:00:07\x1b[0m \x1b[32m0 bytes\x1b[0m \x1b[32m10 bytes\x1b[0m \x1b[32m0/10 bytes\x1b[0m \x1b[31m?\x1b[0m\ntest bar \x1b[38;5;237m━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m \x1b[36m-:--:--\x1b[0m \x1b[33m0:00:16\x1b[0m \x1b[32m0 bytes\x1b[0m \x1b[32m7 bytes \x1b[0m \x1b[32m0/7 bytes \x1b[0m \x1b[31m?\x1b[0m\r\x1b[2K\x1b[1A\x1b[2K\x1b[2;36m[TIME]\x1b[0m\x1b[2;36m \x1b[0mhello \ntest foo \x1b[38;5;237m━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m \x1b[36m-:--:--\x1b[0m \x1b[33m0:00:07\x1b[0m \x1b[32m0 bytes\x1b[0m \x1b[32m10 bytes\x1b[0m \x1b[32m0/10 bytes\x1b[0m \x1b[31m?\x1b[0m\ntest bar \x1b[38;5;237m━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m \x1b[36m-:--:--\x1b[0m \x1b[33m0:00:16\x1b[0m \x1b[32m0 bytes\x1b[0m \x1b[32m7 bytes \x1b[0m \x1b[32m0/7 bytes \x1b[0m \x1b[31m?\x1b[0m\r\x1b[2K\x1b[1A\x1b[2Kworld\ntest foo \x1b[38;5;237m━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m \x1b[36m-:--:--\x1b[0m \x1b[33m0:00:07\x1b[0m \x1b[32m0 bytes\x1b[0m \x1b[32m10 bytes\x1b[0m \x1b[32m0/10 bytes\x1b[0m \x1b[31m?\x1b[0m\ntest bar \x1b[38;5;237m━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m \x1b[36m-:--:--\x1b[0m \x1b[33m0:00:16\x1b[0m \x1b[32m0 bytes\x1b[0m \x1b[32m7 bytes \x1b[0m \x1b[32m0/7 bytes \x1b[0m \x1b[31m?\x1b[0m\r\x1b[2K\x1b[1A\x1b[2Ktest foo \x1b[38;2;114;156;31m━━━━━━━━━━━━━━━\x1b[0m \x1b[36m0:00:00\x1b[0m \x1b[33m0:00:30\x1b[0m \x1b[32m12 bytes\x1b[0m \x1b[32m10 bytes\x1b[0m \x1b[32m12/10 bytes\x1b[0m \x1b[31m1 byte/s \x1b[0m\ntest bar \x1b[38;2;114;156;31m━━━━━━━━━━━━━━━\x1b[0m \x1b[36m0:00:00\x1b[0m \x1b[33m0:00:25\x1b[0m \x1b[32m16 bytes\x1b[0m \x1b[32m7 bytes \x1b[0m \x1b[32m16/7 bytes \x1b[0m \x1b[31m2 bytes/s\x1b[0m\r\x1b[2K\x1b[1A\x1b[2Ktest foo \x1b[38;2;114;156;31m━━━━━━━━━━━━━━━\x1b[0m \x1b[36m0:00:00\x1b[0m \x1b[33m0:00:30\x1b[0m \x1b[32m12 bytes\x1b[0m \x1b[32m10 bytes\x1b[0m \x1b[32m12/10 bytes\x1b[0m \x1b[31m1 byte/s \x1b[0m\ntest bar \x1b[38;2;114;156;31m━━━━━━━━━━━━━━━\x1b[0m \x1b[36m0:00:00\x1b[0m \x1b[33m0:00:25\x1b[0m \x1b[32m16 bytes\x1b[0m \x1b[32m7 bytes \x1b[0m \x1b[32m16/7 bytes \x1b[0m \x1b[31m2 bytes/s\x1b[0m\n\x1b[?25h\r\x1b[1A\x1b[2K\x1b[1A\x1b[2K"
+ expected = "\x1b[?25ltest foo \x1b[38;5;237m━━━━━━━━━━\x1b[0m \x1b[36m-:--:--\x1b[0m \x1b[33m0:00:07\x1b[0m \x1b[32m0 bytes\x1b[0m \x1b[32m10 bytes\x1b[0m \x1b[32m0/10 bytes\x1b[0m \x1b[31m?\x1b[0m \x1b[32m 0/10\x1b[0m \x1b[32m 0 of 10\x1b[0m\ntest bar \x1b[38;5;237m━━━━━━━━━━\x1b[0m \x1b[36m-:--:--\x1b[0m \x1b[33m0:00:18\x1b[0m \x1b[32m0 bytes\x1b[0m \x1b[32m7 bytes \x1b[0m \x1b[32m0/7 bytes \x1b[0m \x1b[31m?\x1b[0m \x1b[32m0/7 \x1b[0m \x1b[32m0 of 7 \x1b[0m\r\x1b[2K\x1b[1A\x1b[2Kfoo\ntest foo \x1b[38;5;237m━━━━━━━━━━\x1b[0m \x1b[36m-:--:--\x1b[0m \x1b[33m0:00:07\x1b[0m \x1b[32m0 bytes\x1b[0m \x1b[32m10 bytes\x1b[0m \x1b[32m0/10 bytes\x1b[0m \x1b[31m?\x1b[0m \x1b[32m 0/10\x1b[0m \x1b[32m 0 of 10\x1b[0m\ntest bar \x1b[38;5;237m━━━━━━━━━━\x1b[0m \x1b[36m-:--:--\x1b[0m \x1b[33m0:00:18\x1b[0m \x1b[32m0 bytes\x1b[0m \x1b[32m7 bytes \x1b[0m \x1b[32m0/7 bytes \x1b[0m \x1b[31m?\x1b[0m \x1b[32m0/7 \x1b[0m \x1b[32m0 of 7 \x1b[0m\r\x1b[2K\x1b[1A\x1b[2K\x1b[2;36m[TIME]\x1b[0m\x1b[2;36m \x1b[0mhello \ntest foo \x1b[38;5;237m━━━━━━━━━━\x1b[0m \x1b[36m-:--:--\x1b[0m \x1b[33m0:00:07\x1b[0m \x1b[32m0 bytes\x1b[0m \x1b[32m10 bytes\x1b[0m \x1b[32m0/10 bytes\x1b[0m \x1b[31m?\x1b[0m \x1b[32m 0/10\x1b[0m \x1b[32m 0 of 10\x1b[0m\ntest bar \x1b[38;5;237m━━━━━━━━━━\x1b[0m \x1b[36m-:--:--\x1b[0m \x1b[33m0:00:18\x1b[0m \x1b[32m0 bytes\x1b[0m \x1b[32m7 bytes \x1b[0m \x1b[32m0/7 bytes \x1b[0m \x1b[31m?\x1b[0m \x1b[32m0/7 \x1b[0m \x1b[32m0 of 7 \x1b[0m\r\x1b[2K\x1b[1A\x1b[2Kworld\ntest foo \x1b[38;5;237m━━━━━━━━━━\x1b[0m \x1b[36m-:--:--\x1b[0m \x1b[33m0:00:07\x1b[0m \x1b[32m0 bytes\x1b[0m \x1b[32m10 bytes\x1b[0m \x1b[32m0/10 bytes\x1b[0m \x1b[31m?\x1b[0m \x1b[32m 0/10\x1b[0m \x1b[32m 0 of 10\x1b[0m\ntest bar \x1b[38;5;237m━━━━━━━━━━\x1b[0m \x1b[36m-:--:--\x1b[0m \x1b[33m0:00:18\x1b[0m \x1b[32m0 bytes\x1b[0m \x1b[32m7 bytes \x1b[0m \x1b[32m0/7 bytes \x1b[0m \x1b[31m?\x1b[0m \x1b[32m0/7 \x1b[0m \x1b[32m0 of 7 \x1b[0m\r\x1b[2K\x1b[1A\x1b[2Ktest foo \x1b[38;2;114;156;31m━━━━━━━\x1b[0m \x1b[36m0:00:00\x1b[0m \x1b[33m0:00:34\x1b[0m \x1b[32m12 \x1b[0m \x1b[32m10 \x1b[0m \x1b[32m12/10 \x1b[0m \x1b[31m1 \x1b[0m \x1b[32m12/10\x1b[0m \x1b[32m12 of 10\x1b[0m\n \x1b[32mbytes \x1b[0m \x1b[32mbytes \x1b[0m \x1b[32mbytes \x1b[0m \x1b[31mbyte/s \x1b[0m \ntest bar \x1b[38;2;114;156;31m━━━━━━━\x1b[0m \x1b[36m0:00:00\x1b[0m \x1b[33m0:00:29\x1b[0m \x1b[32m16 \x1b[0m \x1b[32m7 bytes\x1b[0m \x1b[32m16/7 \x1b[0m \x1b[31m2 \x1b[0m \x1b[32m16/7 \x1b[0m \x1b[32m16 of 7 \x1b[0m\n \x1b[32mbytes \x1b[0m \x1b[32mbytes \x1b[0m \x1b[31mbytes/s\x1b[0m \r\x1b[2K\x1b[1A\x1b[2K\x1b[1A\x1b[2K\x1b[1A\x1b[2Ktest foo \x1b[38;2;114;156;31m━━━━━━━\x1b[0m \x1b[36m0:00:00\x1b[0m \x1b[33m0:00:34\x1b[0m \x1b[32m12 \x1b[0m \x1b[32m10 \x1b[0m \x1b[32m12/10 \x1b[0m \x1b[31m1 \x1b[0m \x1b[32m12/10\x1b[0m \x1b[32m12 of 10\x1b[0m\n \x1b[32mbytes \x1b[0m \x1b[32mbytes \x1b[0m \x1b[32mbytes \x1b[0m \x1b[31mbyte/s \x1b[0m \ntest bar \x1b[38;2;114;156;31m━━━━━━━\x1b[0m \x1b[36m0:00:00\x1b[0m \x1b[33m0:00:29\x1b[0m \x1b[32m16 \x1b[0m \x1b[32m7 bytes\x1b[0m \x1b[32m16/7 \x1b[0m \x1b[31m2 \x1b[0m \x1b[32m16/7 \x1b[0m \x1b[32m16 of 7 \x1b[0m\n \x1b[32mbytes \x1b[0m \x1b[32mbytes \x1b[0m \x1b[31mbytes/s\x1b[0m \n\x1b[?25h\r\x1b[1A\x1b[2K\x1b[1A\x1b[2K\x1b[1A\x1b[2K\x1b[1A\x1b[2K"
+
assert result == expected
From c787271970768bdeee0dc134931a9ada3e676a7b Mon Sep 17 00:00:00 2001
From: losuler
Date: Thu, 10 Feb 2022 00:09:25 +1100
Subject: [PATCH 050/351] Fix keyword argument names
---
docs/source/tables.rst | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/docs/source/tables.rst b/docs/source/tables.rst
index 7429ac66ac..22236358f4 100644
--- a/docs/source/tables.rst
+++ b/docs/source/tables.rst
@@ -62,14 +62,14 @@ There are a number of keyword arguments on the Table constructor you can use to
- ``expand`` Set to True to expand the table to the full available size.
- ``show_header`` Set to True to show a header, False to disable it.
- ``show_footer`` Set to True to show a footer, False to disable it.
-- ``show edge`` Set to False to disable the edge line around the table.
+- ``show_edge`` Set to False to disable the edge line around the table.
- ``show_lines`` Set to True to show lines between rows as well as header / footer.
- ``leading`` Additional space between rows.
- ``style`` A Style to apply to the entire table, e.g. "on blue"
- ``row_styles`` Set to a list of styles to style alternating rows. e.g. ``["dim", ""]`` to create *zebra stripes*
- ``header_style`` Set the default style for the header.
- ``footer_style`` Set the default style for the footer.
-- ``border style`` Set a style for border characters.
+- ``border_style`` Set a style for border characters.
- ``title_style`` Set a style for the title.
- ``caption_style`` Set a style for the caption.
- ``title_justify`` Set the title justify method ("left", "right", "center", or "full")
From 6216ee0fccb6c40fc363ae69ea353c2e77c487fb Mon Sep 17 00:00:00 2001
From: Wasi Master <63045920+wasi-master@users.noreply.github.com>
Date: Wed, 9 Feb 2022 22:32:54 +0600
Subject: [PATCH 051/351] In Jupyter mode have the link target set to "_blank"
---
rich/jupyter.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/rich/jupyter.py b/rich/jupyter.py
index bedf5cb19a..97340d004a 100644
--- a/rich/jupyter.py
+++ b/rich/jupyter.py
@@ -63,7 +63,7 @@ def escape(text: str) -> str:
rule = style.get_html_style(theme)
text = f'{text}' if rule else text
if style.link:
- text = f'{text}'
+ text = f'{text}'
append_fragment(text)
code = "".join(fragments)
From 821c0ce2ebc947d34328a375d7714a07b7ef3c24 Mon Sep 17 00:00:00 2001
From: Wasi Master <63045920+wasi-master@users.noreply.github.com>
Date: Thu, 10 Feb 2022 17:17:16 +0600
Subject: [PATCH 052/351] Modify CHANGELOG.md and CONTRIBUTORS.md
---
CHANGELOG.md | 6 ++++++
CONTRIBUTORS.md | 1 +
2 files changed, 7 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f1d04a55d9..fcf58cd7a1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## Unreleased
+
+### Fixed
+
+- In Jupyter mode make the link target be set to "_blank"
+
## [11.2.0] - 2022-02-08
### Added
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index 61c67de9de..23109df837 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -29,3 +29,4 @@ The following people have contributed to the development of Rich:
- [Gabriele N. Tornetta](https://github.com/p403n1x87)
- [Patrick Arminio](https://github.com/patrick91)
- [Michał Górny](https://github.com/mgorny)
+- [Arian Mollik Wasi](https://github.com/wasi-master)
From c235bd6b3d77343e12d7c74d1aaad7bf4264e47d Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 10 Feb 2022 12:15:55 +0000
Subject: [PATCH 053/351] Bump black from 21.12b0 to 22.1.0
Bumps [black](https://github.com/psf/black) from 21.12b0 to 22.1.0.
- [Release notes](https://github.com/psf/black/releases)
- [Changelog](https://github.com/psf/black/blob/main/CHANGES.md)
- [Commits](https://github.com/psf/black/commits/22.1.0)
---
updated-dependencies:
- dependency-name: black
dependency-type: direct:development
...
Signed-off-by: dependabot[bot]
---
poetry.lock | 41 +++++++++++++++++++++++++++++------------
pyproject.toml | 2 +-
2 files changed, 30 insertions(+), 13 deletions(-)
diff --git a/poetry.lock b/poetry.lock
index fcfe395fc3..38171bea9d 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -79,30 +79,26 @@ python-versions = "*"
[[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"
dataclasses = {version = ">=0.6", markers = "python_version < \"3.7\""}
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]]
@@ -1053,7 +1049,7 @@ jupyter = ["ipywidgets"]
[metadata]
lock-version = "1.1"
python-versions = "^3.6.2"
-content-hash = "74159f2d5dbb53418204e0fd27ef544256648663c41d0a2841c11c34589c52f6"
+content-hash = "656a91a327289529d8bb9135fef6c66486a192e7a7e8ed682d7c3e7bf5f7b239"
[metadata.files]
appnope = [
@@ -1104,8 +1100,29 @@ backcall = [
{file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"},
]
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"},
]
bleach = [
{file = "bleach-4.1.0-py2.py3-none-any.whl", hash = "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994"},
diff --git a/pyproject.toml b/pyproject.toml
index d110cf38ce..4f7d8dd26f 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -40,7 +40,7 @@ jupyter = ["ipywidgets"]
[tool.poetry.dev-dependencies]
pytest = "^7.0.0"
-black = "^21.11b1"
+black = "^22.1"
mypy = "^0.930"
pytest-cov = "^3.0.0"
attrs = "^21.4.0"
From 71325bb5bbb194ae0c09256c3035187354e042c2 Mon Sep 17 00:00:00 2001
From: Darren Burns
Date: Thu, 10 Feb 2022 14:31:37 +0000
Subject: [PATCH 054/351] Fix issue with markup escaping
---
rich/markup.py | 15 ++++++++-------
tests/test_markup.py | 8 ++++++--
2 files changed, 14 insertions(+), 9 deletions(-)
diff --git a/rich/markup.py b/rich/markup.py
index 58903f6bbb..c7c587cfca 100644
--- a/rich/markup.py
+++ b/rich/markup.py
@@ -1,21 +1,20 @@
+import re
from ast import literal_eval
from operator import attrgetter
-import re
from typing import Callable, Iterable, List, Match, NamedTuple, Optional, Tuple, Union
+from ._emoji_replace import _emoji_replace
+from .emoji import EmojiVariant
from .errors import MarkupError
from .style import Style
from .text import Span, Text
-from .emoji import EmojiVariant
-from ._emoji_replace import _emoji_replace
-
RE_TAGS = re.compile(
- r"""((\\*)\[([a-z#\/@].*?)\])""",
+ r"""((\\*)\[([a-z#/@][^[]*?)])""",
re.VERBOSE,
)
-RE_HANDLER = re.compile(r"^([\w\.]*?)(\(.*?\))?$")
+RE_HANDLER = re.compile(r"^([\w.]*?)(\(.*?\))?$")
class Tag(NamedTuple):
@@ -146,6 +145,8 @@ def pop_style(style_name: str) -> Tuple[int, Tag]:
for position, plain_text, tag in _parse(markup):
if plain_text is not None:
+ # Capture open brace escapes, where the brace is not part of a tag.
+ plain_text = plain_text.replace("\\[", "[")
append(emoji_replace(plain_text) if emoji else plain_text)
elif tag is not None:
if tag.name.startswith("/"): # Closing tag
@@ -233,8 +234,8 @@ def pop_style(style_name: str) -> Tuple[int, Tag]:
":warning-emoji: [bold red blink] DANGER![/]",
]
- from rich.table import Table
from rich import print
+ from rich.table import Table
grid = Table("Markup", "Result", padding=(0, 1))
diff --git a/tests/test_markup.py b/tests/test_markup.py
index 5a0acbbf09..106738bdb5 100644
--- a/tests/test_markup.py
+++ b/tests/test_markup.py
@@ -1,7 +1,7 @@
import pytest
from rich.console import Console
-from rich.markup import escape, MarkupError, _parse, render, Tag, RE_TAGS
+from rich.markup import RE_TAGS, MarkupError, Tag, _parse, escape, render
from rich.text import Span
@@ -139,6 +139,11 @@ def test_markup_error():
assert render("[foo]hello[/bar]")
+def test_markup_escape():
+ result = str(render("[dim white]\[url=[/]"))
+ assert result == "[url="
+
+
def test_escape_escape():
# Escaped escapes (i.e. double backslash)should be treated as literal
result = render(r"\\[bold]FOO")
@@ -165,7 +170,6 @@ def test_escape_escape():
def test_events():
-
result = render("[@click]Hello[/@click] [@click='view.toggle', 'left']World[/]")
assert str(result) == "Hello World"
From fa927d9e8a679be59ae1d84462be4b02e3800c50 Mon Sep 17 00:00:00 2001
From: Darren Burns
Date: Thu, 10 Feb 2022 14:38:21 +0000
Subject: [PATCH 055/351] Add info about markup fixes to changelog
---
CHANGELOG.md | 1 +
rich/markup.py | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fcf58cd7a1..407c9f158b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed
- In Jupyter mode make the link target be set to "_blank"
+- Fix some issues with markup handling around "[" characters https://github.com/Textualize/rich/pull/1950
## [11.2.0] - 2022-02-08
diff --git a/rich/markup.py b/rich/markup.py
index c7c587cfca..a0201dfe2e 100644
--- a/rich/markup.py
+++ b/rich/markup.py
@@ -145,7 +145,7 @@ def pop_style(style_name: str) -> Tuple[int, Tag]:
for position, plain_text, tag in _parse(markup):
if plain_text is not None:
- # Capture open brace escapes, where the brace is not part of a tag.
+ # Handle open brace escapes, where the brace is not part of a tag.
plain_text = plain_text.replace("\\[", "[")
append(emoji_replace(plain_text) if emoji else plain_text)
elif tag is not None:
From 93ad00dffb8f348661f55b3aeb353f72e6869fc2 Mon Sep 17 00:00:00 2001
From: ptmcg
Date: Thu, 10 Feb 2022 09:33:30 -0600
Subject: [PATCH 056/351] Add MofNCompleteColumn ProgressColumn and
Progress.get_default_column notes to docs
---
CHANGELOG.md | 2 +-
docs/source/progress.rst | 10 ++++++++++
2 files changed, 11 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1386aae0c2..9bbd63799b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,7 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Added ProgressColumn `MofNCompleteColumn` to display raw `completed/total` column (similar to DownloadColumn,
but displays values as ints, does not convert to floats or add bit/bytes units).
- https://github.com/Textualize/rich/discussions/1899
+ https://github.com/Textualize/rich/pull/1941
## [11.2.0] - 2022-02-08
diff --git a/docs/source/progress.rst b/docs/source/progress.rst
index 1a4e02ed7d..4ce3588368 100644
--- a/docs/source/progress.rst
+++ b/docs/source/progress.rst
@@ -113,12 +113,21 @@ The defaults are roughly equivalent to the following::
TimeRemainingColumn(),
)
+To create a Progress with your own columns in addition to the defaults, use :meth:`~rich.progress.Progress.get_default_columns`::
+
+ progress = Progress(
+ SpinnerColumn(),
+ *Progress.get_default_columns(),
+ TimeElapsedColumn(),
+ )
+
The following column objects are available:
- :class:`~rich.progress.BarColumn` Displays the bar.
- :class:`~rich.progress.TextColumn` Displays text.
- :class:`~rich.progress.TimeElapsedColumn` Displays the time elapsed.
- :class:`~rich.progress.TimeRemainingColumn` Displays the estimated time remaining.
+- :class:`~rich.progress.MofNCompleteColumn` Displays completion progress as ``"{task.completed}/{task.total}"`` (works best if completed and total are ints).
- :class:`~rich.progress.FileSizeColumn` Displays progress as file size (assumes the steps are bytes).
- :class:`~rich.progress.TotalFileSizeColumn` Displays total file size (assumes the steps are bytes).
- :class:`~rich.progress.DownloadColumn` Displays download progress (assumes the steps are bytes).
@@ -128,6 +137,7 @@ The following column objects are available:
To implement your own columns, extend the :class:`~rich.progress.ProgressColumn` class and use it as you would the other columns.
+
Table Columns
~~~~~~~~~~~~~
From c1496f83fd4c196fda09b63f4b58bd230f8659e3 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 11 Feb 2022 11:12:37 +0000
Subject: [PATCH 057/351] Bump pre-commit from 2.16.0 to 2.17.0
Bumps [pre-commit](https://github.com/pre-commit/pre-commit) from 2.16.0 to 2.17.0.
- [Release notes](https://github.com/pre-commit/pre-commit/releases)
- [Changelog](https://github.com/pre-commit/pre-commit/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pre-commit/pre-commit/compare/v2.16.0...v2.17.0)
---
updated-dependencies:
- dependency-name: pre-commit
dependency-type: direct:development
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
---
poetry.lock | 8 ++++----
pyproject.toml | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/poetry.lock b/poetry.lock
index 38171bea9d..00236f63ec 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -699,7 +699,7 @@ testing = ["pytest", "pytest-benchmark"]
[[package]]
name = "pre-commit"
-version = "2.16.0"
+version = "2.17.0"
description = "A framework for managing and maintaining multi-language pre-commit hooks."
category = "dev"
optional = false
@@ -1049,7 +1049,7 @@ jupyter = ["ipywidgets"]
[metadata]
lock-version = "1.1"
python-versions = "^3.6.2"
-content-hash = "656a91a327289529d8bb9135fef6c66486a192e7a7e8ed682d7c3e7bf5f7b239"
+content-hash = "52b9945e394bf17a621aafd1d844a9c2f467d0fdb28d28d68b601d1a5caf4c82"
[metadata.files]
appnope = [
@@ -1487,8 +1487,8 @@ pluggy = [
{file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"},
]
pre-commit = [
- {file = "pre_commit-2.16.0-py2.py3-none-any.whl", hash = "sha256:758d1dc9b62c2ed8881585c254976d66eae0889919ab9b859064fc2fe3c7743e"},
- {file = "pre_commit-2.16.0.tar.gz", hash = "sha256:fe9897cac830aa7164dbd02a4e7b90cae49630451ce88464bca73db486ba9f65"},
+ {file = "pre_commit-2.17.0-py2.py3-none-any.whl", hash = "sha256:725fa7459782d7bec5ead072810e47351de01709be838c2ce1726b9591dad616"},
+ {file = "pre_commit-2.17.0.tar.gz", hash = "sha256:c1a8040ff15ad3d648c70cc3e55b93e4d2d5b687320955505587fd79bbaed06a"},
]
prometheus-client = [
{file = "prometheus_client-0.12.0-py2.py3-none-any.whl", hash = "sha256:317453ebabff0a1b02df7f708efbab21e3489e7072b61cb6957230dd004a0af0"},
diff --git a/pyproject.toml b/pyproject.toml
index 4f7d8dd26f..4faf29818c 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -45,7 +45,7 @@ mypy = "^0.930"
pytest-cov = "^3.0.0"
attrs = "^21.4.0"
types-dataclasses = "^0.6.4"
-pre-commit = "^2.16.0"
+pre-commit = "^2.17.0"
[build-system]
requires = ["poetry-core>=1.0.0"]
From 8e80282b59068cd92f5b7f4760e0bcae2cde2654 Mon Sep 17 00:00:00 2001
From: Aaron Stephens
Date: Fri, 11 Feb 2022 09:45:42 -0800
Subject: [PATCH 058/351] feat: allow empty keywords list
---
rich/logging.py | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/rich/logging.py b/rich/logging.py
index f4fbcf0411..83ad2cc5ef 100644
--- a/rich/logging.py
+++ b/rich/logging.py
@@ -174,10 +174,10 @@ def render_message(self, record: LogRecord, message: str) -> "ConsoleRenderable"
if highlighter:
message_text = highlighter(message_text)
- if self.keywords:
- message_text.highlight_words(self.keywords, "logging.keyword")
- elif self.KEYWORDS:
- message_text.highlight_words(self.KEYWORDS, "logging.keyword")
+ message_text.highlight_words(
+ self.KEYWORDS if self.keywords is None else self.keywords, "logging.keyword"
+ )
+
return message_text
def render(
From 5425ba37d05a031a47f20907c365ca9a3fcf3990 Mon Sep 17 00:00:00 2001
From: Aaron Stephens
Date: Fri, 11 Feb 2022 09:52:34 -0800
Subject: [PATCH 059/351] style: black formatting
---
examples/exception.py | 2 +-
rich/filesize.py | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/examples/exception.py b/examples/exception.py
index 548432d669..6c693df2e8 100644
--- a/examples/exception.py
+++ b/examples/exception.py
@@ -34,7 +34,7 @@ def divide_all(divides: List[Tuple[float, float]]) -> None:
(0, 1000000),
(3.1427, 2),
(888, 0),
- (2 ** 32, 2 ** 16),
+ (2**32, 2**16),
]
divide_all(DIVIDES)
diff --git a/rich/filesize.py b/rich/filesize.py
index b3a0996b05..bcaea34572 100644
--- a/rich/filesize.py
+++ b/rich/filesize.py
@@ -30,7 +30,7 @@ def _to_str(
return "{:,} bytes".format(size)
for i, suffix in enumerate(suffixes, 2): # noqa: B007
- unit = base ** i
+ unit = base**i
if size < unit:
break
return "{:,.{precision}f}{separator}{}".format(
@@ -44,7 +44,7 @@ def _to_str(
def pick_unit_and_suffix(size: int, suffixes: List[str], base: int) -> Tuple[int, str]:
"""Pick a suffix and base for the given size."""
for i, suffix in enumerate(suffixes):
- unit = base ** i
+ unit = base**i
if size < unit * base:
break
return unit, suffix
From 6caaa1595498f0ccb13905d6befaea42b299323f Mon Sep 17 00:00:00 2001
From: Aaron Stephens
Date: Fri, 11 Feb 2022 11:12:19 -0800
Subject: [PATCH 060/351] fix: change keywords type to Iterable
---
rich/logging.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/rich/logging.py b/rich/logging.py
index 83ad2cc5ef..d5cdffd220 100644
--- a/rich/logging.py
+++ b/rich/logging.py
@@ -2,7 +2,7 @@
from datetime import datetime
from logging import Handler, LogRecord
from pathlib import Path
-from typing import ClassVar, List, Optional, Type, Union
+from typing import ClassVar, Iterable, List, Optional, Type, Union
from . import get_console
from ._log_render import LogRender, FormatTimeCallable
@@ -77,7 +77,7 @@ def __init__(
locals_max_length: int = 10,
locals_max_string: int = 80,
log_time_format: Union[str, FormatTimeCallable] = "[%x %X]",
- keywords: Optional[List[str]] = None,
+ keywords: Optional[Iterable[str]] = None,
) -> None:
super().__init__(level=level)
self.console = console or get_console()
From ae8afcaf430ab1226f414c967cd2d4a2a854fc8d Mon Sep 17 00:00:00 2001
From: Aaron Stephens
Date: Fri, 11 Feb 2022 12:12:29 -0800
Subject: [PATCH 061/351] fix: remove Optional from self.KEYWORDS
---
rich/logging.py | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/rich/logging.py b/rich/logging.py
index d5cdffd220..1a7775bbe1 100644
--- a/rich/logging.py
+++ b/rich/logging.py
@@ -2,7 +2,7 @@
from datetime import datetime
from logging import Handler, LogRecord
from pathlib import Path
-from typing import ClassVar, Iterable, List, Optional, Type, Union
+from typing import ClassVar, List, Optional, Type, Union
from . import get_console
from ._log_render import LogRender, FormatTimeCallable
@@ -44,7 +44,7 @@ class RichHandler(Handler):
keywords (List[str], optional): List of words to highlight instead of ``RichHandler.KEYWORDS``.
"""
- KEYWORDS: ClassVar[Optional[List[str]]] = [
+ KEYWORDS: ClassVar[List[str]] = [
"GET",
"POST",
"HEAD",
@@ -77,7 +77,7 @@ def __init__(
locals_max_length: int = 10,
locals_max_string: int = 80,
log_time_format: Union[str, FormatTimeCallable] = "[%x %X]",
- keywords: Optional[Iterable[str]] = None,
+ keywords: Optional[List[str]] = None,
) -> None:
super().__init__(level=level)
self.console = console or get_console()
From e00a07966e642dd931a0e59f177e242d6dfe99c5 Mon Sep 17 00:00:00 2001
From: Sourajyoti Basak
Date: Sat, 12 Feb 2022 07:30:07 +0000
Subject: [PATCH 062/351] docs(style): fix typo
---
docs/source/style.rst | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/source/style.rst b/docs/source/style.rst
index 5b8c390d58..18d4bf16ba 100644
--- a/docs/source/style.rst
+++ b/docs/source/style.rst
@@ -20,7 +20,7 @@ You may also use the color's number (an integer between 0 and 255) with the synt
console.print("Hello", style="color(5)")
-Alteratively you can use a CSS-like syntax to specify a color with a "#" followed by three pairs of hex characters, or in RGB form with three decimal integers. The following two lines both print "Hello" in the same color (purple)::
+Alternatively you can use a CSS-like syntax to specify a color with a "#" followed by three pairs of hex characters, or in RGB form with three decimal integers. The following two lines both print "Hello" in the same color (purple)::
console.print("Hello", style="#af00ff")
console.print("Hello", style="rgb(175,0,255)")
From 9a8021cc3963d133138e73a4d78571cefe4adbdf Mon Sep 17 00:00:00 2001
From: "imgbot[bot]" <31301654+imgbot[bot]@users.noreply.github.com>
Date: Sat, 12 Feb 2022 11:32:08 +0000
Subject: [PATCH 063/351] image optimizations (#2)
*Total -- 10,179.46kb -> 8,582.96kb (15.68%)
/imgs/traceback.png -- 807.33kb -> 497.99kb (38.32%)
/imgs/progress.gif -- 3,310.30kb -> 2,318.08kb (29.97%)
/imgs/downloader.gif -- 2,852.89kb -> 2,574.85kb (9.75%)
/imgs/status.gif -- 587.96kb -> 576.18kb (2%)
/imgs/logo.svg -- 43.99kb -> 43.84kb (0.33%)
/imgs/spinners.gif -- 1,461.22kb -> 1,456.46kb (0.33%)
/assets/logo.svg -- 1,115.77kb -> 1,115.56kb (0.02%)
Signed-off-by: ImgBotApp
Co-authored-by: ImgBotApp
---
assets/logo.svg | 75 +-------------------------------------------
imgs/downloader.gif | Bin 2921360 -> 2636646 bytes
imgs/logo.svg | 70 +----------------------------------------
imgs/progress.gif | Bin 3389749 -> 2373713 bytes
imgs/spinners.gif | Bin 1496288 -> 1491413 bytes
imgs/status.gif | Bin 602073 -> 590010 bytes
imgs/traceback.png | Bin 826711 -> 509944 bytes
7 files changed, 2 insertions(+), 143 deletions(-)
diff --git a/assets/logo.svg b/assets/logo.svg
index c4be1c5bc2..5e17c97d4b 100644
--- a/assets/logo.svg
+++ b/assets/logo.svg
@@ -1,74 +1 @@
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/imgs/downloader.gif b/imgs/downloader.gif
index 2033d7b98115adb0d0f1db2e90ae8977440e2cfe..dad59f25881e036142ef11a580d76b47e248577a 100644
GIT binary patch
literal 2636646
zcmd3Mg#56FogW8=R4e4bINS&dSaX
zhr?k^Flu^wJ~%NqJ0mAM2M-$@1!Iw7WRaqQ!Vx4KocG{da5ipc8W9qHUWg=$NLB{S
z&Be~g%OoyNN6Cid;NXO_^T65BjBI>N?2=S$Qk?9Z+;ARVHl#R{00$QroSO&EgJwb?
znfaulC^1e>PF`MK1OkOZp@oEm1ki#=etszwk`FC~l#-Q@kWf%ikdcv-6cg5=hN;Vv
z8Zz^FQ48pbiTj~t1IVf5)M(_DrSF+h8R}BGSx^UfLG|>+A3qjo#a(DWHc;R02*{<1X;`Iem
z?G4fe+3@L3$+Rq^h64SZD%0M2&E9&8_7;PTY_IwPufi(N?k2DC4x{l-@3AtYnK6f%
zQAGut7;V=CbFX-t;6&>u`G!8(t|1A|VR^v;F;<~f7LTiJTvDU_V?E*%LlP20atnM@
za|3d#?Gv(+Q&Qp*5^{2KN=i!d3kuS*G8*d(a!V_#tE-!vo9pZAy1Kds2M7E5dOO-%
zi_1$#1_uZ|@vn!w$HoR;zaANRGdem-n3cyv0gmYC=nt~mhf+F#|DTHMjzV9})I>$eP)%G|lnD4gY+Scs
zFazKYAozbc|4$|W(mQ~EA7;nNAsR2tN2^*sJgQ7b&Ma-4kg=y6M@?casA*UcmxN^H
z^h>~SDaUi5J!ds(t0$9KMY&1)FP&6#NjWQDt@-T`l4zmcC7PXlTIqsDe-W^tgV}r`
zvLs2X&Xb{9jo3Zg&sU#~YY;EhZKne`^ZBrQ9H{Klqc&DAVWh>UE-m$XOAyRMNi^djG94Y9rX(>x~Bex;8DF
zF2SF&`ehud5_duHkbS#p+zzK8c|)0l4o?{#5DaLi_KQZ6DB
z`&x=ID>9Vom`w}3*J~3|Jk_)19gFH^SGyKE%!?+o0y{;sZcp4ZX9zRhO6a@fw=<{i
z;pg`Lgk38(A@(I~#D#|)tcC3?xN^FPmAi8K1V9NJF@McWSHWGb1iCB>sRl!rG_mSk
ztrR0IL*0%VgsBTPaqhelw|;18mb!oLrjaLBbPbGneNaY`g-uZQ?wwM153qa#hCOE)
zLvTLf_U|!t5sL0ouvd|skWyfH(u~3Z`w_fk;w%2xS
z&__=lykPqLS*bbyyb$g1#`wdKQC!lOb`{wCqv>&li@8OODzCgNT^)K#fYXMxT4yVc6iVs)=83&I
zhw}?_f{=l~r=(!pdZTInEYCyqi^3)I`jwZ{dcj7ymog7Kpl<+WJwU&qoT8
z?|x)D&<0A%fiw3*8%dbcBAbX8^jZWwzx?dNTa|zDKYeCYH*$*zd=bIU5u(+iQd9E<
z!*_HPxoyz3@ceT)d7)n{?GIN04GZ$w?<4%RP*+v?ho@VIvUa!a8iE>yol?swvcaHZF|;Vn&)67oBx+%Y-{O
zj}o?NgP69$1X_)Q>f;Es7#_cLvE7|LUH#4?37G5?396-RF?e7d#`O;#qdMt0V+add
z)(aia`;wTDkdS23SVmf)UHUjkczNiO5~4UHHJSR~==Q(uU$EGr%V(uJI)7NBmDbN*
zB9J?b`g{4B1e~C{TZLiobbwY?3L-w|7BQIDS2Wck5Grl82N38f88SKu)#F}zMA}df
z+%|CJa52+o6&EyL&oVe(EHy;RwM@~bBGUrrV7p6WT{{QyKMG4ZUIx>->kBBBIFgZy
zO!4|0&IuBSEl75+v58?x(}XoHn+q=
z3HLPc26}@)69dn7(F(Ar8xRxo&}oY%;oAE*z`+CGYxzoUVhCJaG+_t2V{^w)|OA
z0F2C19Vewyy=I(XY@0B!W3^xy-hy|AQhokz3Sn|Xmw
z5cPAxT%j>h%a@~ezP?wBWq#(2Jqwi3>>;Ekb#}Ll!tQ~S3tir!%h&9^#T}&%P!>gFSPSTwB3vdydiw82}f#?0C^
zZ=pQVo^s$@b*O-$|6W%Yr!lGCtcLA1Tr)$jpWH>pbr#Txy36L}fU@bVj0HdslN&v2
zgoMz9GrHT%G+kI8IA}$Z?-;jQ*_J)j{6Bqu>EE+0aAMZ@>Z%WhsLr6r7z9>W8KfVsT
zFN|hZBnB20YiT{S6=+p@T}>`{x~}_#zqgNfGfn9v7yd+ICg7acvcH?IFi7ZciUc=o
zFq!QWdd0*KwPn^>KlN5eKr3d7(f!<>K_Ix1PtoJ9u85MbT16oI=xz@(~Wn1UKXRz{e>x;KOFbv
zLArL*b(;4C3S9nm6org#rjrTADhtlaZV0f?uCNL8*~VrJZmCZaU<#8xd6kg_h1z`;
zk))JaZc{bx*5!jxg%mB$0%l*mWG)S?J@n_@Qb4O(UCv!}{nM{%p+_xhd=!Mnba6-f
zxc0PaJ2M29uh#=*c&9p{oM4VNBo4LG;FbW3A+p0)v!s5xvixuqklT~`Ud=dv?d^8N
zw;E`&Pp2Cw{+v2g5_!!%ucmg7NW$sRZj?dO-92h_T&_vQ^jV!Ze%H+5l6?@U?3Epe
ztqrufVx@I^+8f{i<}2E&<<=B$@oq;78S
zgH>e5Sw||=fC!z8EL0r9?Ol|a&)tG}tF*y|qg|$p#7vb1Qo}S}A~Zjg-R4jfAd5yY
znttSQzfm(S-D78!;ITY3d>dqHrv{&6crxv;mbc*P>=YeXufNnTvF0xN?2`UfXh5S3
z*Y`^OdkFU6F^(~iMToNtpA3(xgq+pU)A|@4E#tVo1&&9#K_R)yDj$*yNW7TbtQ|ub
zl4EU0TnzR@g#@9Rm&bB!Ad!0`=qqqiJB&xo4MQ4g;btt-NU#f7!<2Ew>spHR)5ZRS
zN-~pJ5tb|;$)-pF)88b}ZV|J{1S*Lfa>p>JyoRAnhXuR+1taLN&Qj`;nw~z35`M?#
z#FbKrTTLjb&%0O{&mpJv9YMFO$J%H@;Hi3wXdiUwM(Gy`-G^h9o9h5xSlVX|iK`QF
zAD%>~UgxhSN%%mibz_-Rbw2W7#?5>-=CG)cf@Iz?GsCGM@%?}~Nimf%j^avM5>X(-
zMc#RP%!mpcxeL7K0H|Z;h`be*ie_TvV!pQ+gSv$78pT$QS>!K2ZD@b!=7AW};QZ3}
zKz+hmY|=>_&%+AVYPmw5-d|gXgw{ERG(eq_B5ssgeF{o(;vk@dU?YY
z?dU>UsG_ID=>ti@xd%=2>m`n@yBo_I5h7Q}E1R23R0h|=tvW_8YEe=Hqu(pwIo2
z!}P1RCQ40@IlstY%KMy!r^qPCMJuf*3egx|&!wuZx~eR?uGwNO?T26sHsLt!@!t#0
zW)Jaw&8(ffsu6MER~KbeH!Pxbh%hl0D2v47O0OjT37oV`p72{YDApz
zaG-HFoM~~yXcir7K*t;2Rr~2!dU+BmMDNZ?q-?OF)&~rNk%us`x@LoFRu&&rP3vZQ
z#CCaD%&BD-<{`9+n1ijuw^>DeSIc~ON{F6Ft{1xdA4+VZeV$1OvxGH+ogZJh((8ce
z+wKqoLf~jEe_n823n>Q33(Y6N8N{u?_rBL~0zmgJfCvC6ABGV%r)5`>M;dlxX7s0B
z?mrasJ!P)ZwMKVAQFEROQJvl(W_1z|WJhnd?lH%+T<_v~cs$p`(P75ppobmi?RIPr
z9Rd_O_RyW9OqLBu-(|XRF0(4Kq%R{chE0&J!}xA79DF)ZaQY=7J7OyCdGJPH?h>uj
zvcXGp2VnrzS5>2>Qt7;1DO}d1aX9_`F{?GXn<100KJr0p$5X6QPjff3Gq~DfNoUkZ
zetopmY|3n5fK%+UuWz`{p*C~$gWzGm7N$Tm@khx_ZGjFccf6E8Yk}^uEPUXOqJe(T
zcP-A_eP0uTsy?(tAEN46xns1%O(4?AZM?7C*4{`Q7!+vqk|Q4&#=X+e;oOYnryr+H~+f?1p@VvwJZJ=A(k>&+R4;9;}R%Ob25=dDDRoAGUc4P{5
zw!4%y2-8fFo~R<7|R;#XEZqy$xpFI6g
zsf&>wcXdWOjQZPn@;vd%HiM_qCkNxD6~#^(7B$+kyg0B1)w4tIqqQdybOH+VN4
z6j!av{9xe6jX2qfhZDVp!b$LAkn7&TGgsq#C{G#UkZg)rv)wG|`pp=YO6dqMbY@Sr
z-%r_YF?YDqTgljGu%3F_Nij+(-Rfs8Sh_sN%2xc3l;B10ClKtihd$AyUL=U2m`K}tS!}RJ9xu(G*p^QNf7@eiq5S9|^XX-f)rxATKJd0gVjeu58dl~op
zESt@GbBn~HPdzCQ1xZ}>6g%lPi)cTRz+7y(r;6L%rz{2gRTAU6UrA>2wkP<@jgoQ#
zip0XUrS5ZOzIvd_Ms@+LaJKs`AU5+;0Rq*c29A38Pi-@@INq^53Fa|@{*#>xq-#T%
z{Yfk}=EiNpIXkNc#PQFk
z2TH>*Zlg7MX_@ou$P%D|mrz>57pzt4pk`Lad4x+!Pt;paz%FkGI7Q<
z#XjN&
zilJ;fWj(@Js!wU@>&pD%o_^b^f?6OC*<$`v_1pC6qSIj)p<@o7eRqy90>`uOjL)sJ
z7wK7r+LIKTd!-3VD#%RzAIkRBm2sgno$7>y&S+SU~IlJ2Yu9s
zb}Dg^z`D}*-IbH4SoqUy3kmt1Jhg)q+tyk=^1E|%-i&^`S5muE8MxbzSk5NpAkE=w
zPp?KOqW;u0o=q*4uQ%Cjjo+I~S}zOXut3#Xt`h#QPEym@hZ%3WLpK?}xAvFE_@~nI
zrr>^0{dd*X4w)t1tR3h%geIc-P|!6hdS5@)xKfyB`oX`7fzzpp*{nML=5cE?Njsr)
zC7V}I^kjM;W->)!3dj}{;3li`<&sR4lTAq&l
zNnfF3$_FfYo$UCFK3)k;KonIfzPWdFx0*XvANihWTmoe)l5OuM!FK!SwJJI<(k0C?
zd4EBNi;*-kk5#A2CvrA#V#%b>uq^7c66|+`g$(p*sy@#4J)&7SofXFTw)6Y6PllFU
z^w4QOwz%BrxKsH`Og8dimx4c@x`n*{>cl(DN-1s!=VQ
z^r|=ep)02?UZh4=*RJ~EzaeU6Nq2`vjL&dwN_>cU0KyMMGY_C@1Jcj}6^Do(ijq7j
zC%Jk=qBKPGIbHprWt6=UNClv!5EdMAP@Sq!iwC2`qLfsK=n$;soVy^r8V#vrWr3(t
zG$cbUN%V_J2Tdk76RiiP0;&{EOe$`_?6JT%SIi-qG3nv&I$kD%)t~JDzNhyB=1R?r
zUqUU`iTmj1G*lcdmTPBP^M(gDP}D!b%g-e_fDDuAi^9#Cj8x`p9zR$A=();gQS6A_
zyDs{GTItccrCyPhxG?FrKHm0j_|7}uP
z>4(P%fe%DxMO4o`=l?MB+V9=<;?gs
zNL>HWieBaQ@0CMvfqVM-NBD@sNpdz9Pe@AFztG_ntUiZ+_AT~Z*4G#DUJ@s|O_u*N
zwdWZD!b6u#$=Y=vJBo!{h{vyV#OMer@3|Xuu5b#a%YmoLB^f4XLzTW8-aRQnfnIzo
z>ds&9GnaWaG$#EVKy`Nf{GM`uYkp8zb|yT)SE=Ewaa!|Suu-gmzIgLnE#*{ES}lh~
zwRiVgrPpjdvxe!p`d;I}Hzn$R+iAgfPSupt4Lz^O6}OvtfFSvM9u7ntp|spA4=OI{
zi(Ja4h)5|(X+Nv8lUd&3IC)61wS`XHLUDAOKLM37^r2T6lTvYId=!Yhp0k=ePwa=O
z2~bNJLT-F>4LB{zGLvKAPN8@!vRf>Ugk$$KKlC0n=5|oOG;K#3)OgU!}Fn}7Tt#4Wwjbo^%gUASp8
zj?RxS-)|8}>UV$f{9%M$Mp{4Agm{KO-+G#YxD9N$LqxAFiy?X8V&kbpzxl(!{zJ*0
z#p$N6MDy$RNcOuvX~#e8vV#R*XAIpSkUv^3(f`;jx5`xC4akjq|2uo-ua}~y)qgf7
z*vN8;AHLC%4j#hN`K^C6N{u
zwzo#XwPl_G{B#_$!!aZrILv#wETHMrheQ$T=_t-NdZ!d|ItL@l45X^@PySd{C=V>*
z!s@r2PDPZF5KODkIoAiL>VuJji8?j2q~j0^ue58r7V<@N-sV$j57W+Z;0#6N2*b!3`SQ@
z$h-1oe-%zXXxL$OCWigp@|MdzGmz^W^;t40MkEyG-E({L|>H(lX{vqHo(wpZS)n4Zz3?3Y*+ksXZ7nJhv~M!L+UZ{
zGJ!kwlrW?~o;gD_g6+qI(!a&DcZgbD-t{S{{W?-g6y^?AjvD(WbsOl1Jwy
zFbO#(H6d+kDK8^Cuu&i{RBA%(zEQfKXZ|ZsW!}P0D7OIrL~Q~~L*nfzzc4>3JxR_`
zICPEv*MHai-%gb%X*B^vuR7@c^v*!1*$mYi#}Bj+jzm|+!aA2(PMvAp;~6iX^m^k>a$
z?RWP36N*;19AgTx>%NGMRM9e!`@@OsBG&&}6rOLUB!Hg~x+7;i29_NH2#ox{kzej~
z`nf%hXJgAaa(R7>P+QUx^*PUL#dHmHQopeN(smbDZyEb8h{rU&lBjU&%x%{$*Bk3i8<9xGVM
zM)6=0lh&D;a%9_kuU5*{vhc@-6DW@XNY(rx5?WEGDU-83P7(CzbB@gx5Bz1DKuW@o
z8k-GPYqmF%HqKb`+>2E?)tVWHI9=+Hgqsb~`>R@4N$}M?_jb$n&7mS6OrTa
z2|*169x1;Qq#t_mUlPXj4!B|Z_xq?gfQtki(*-U98M9h7)JlBzl92qls`kXRpfq$W
zR|Y}xY#&_w)C`+6drPkRh@taCt%l-@t$BKq*{YkHxYqOa64y$p(l3fL*r?&;1jmCe
zpopZK9Yxxu{Spisf0%zNSaeY9k>|7iM0{j%f$~n-n_MS*Oh#;JapcH=Z@gMwOP=n#
zdSDCGE<1xK(1UElrmu)Lx
zl2?#c(;r1wL;T4L^SJ7$eNx~nPj|eK>(VCUOiORDnVL0o)T{$>GvVXmvyiEgGjxbv
zHAUuT*`cs#(PFm((^1oiaYvrppAl}=ZfMM9&fY+BEhd=8=={sif!3p_)?6=&teL~(
zNjM3=$CN4_Z}dm9u-@H0SjhhbZrm
zA+^Im4_vWZ&OVc+E-?z9usa2-S2
z&7TqYIH~Taq%UVS%|9vK`R;4+n(nmLXy`~8Z9-ef9){s5#(<@>rXRj$FOJ
zMBh&Jm45q^$er{cWK`^Tcmm515J(FEmjib}6m+^cm>(Gw4g*c%BS-N-QYF@*USe7t
zOjBvP9M1}tOSM!218~He00^xTh*l}zZ`g7zs%i)*n-MGfzst5C*+yuTRUd?9hmsq68-j#R*T#Qm0$<7ZK_z@yFby0wbO%)#xdm%ovHYKo%6pc#V!Au-h>{x4GLZz
z{-YtWeopBl3Zal_A)pxRFejeV_`$C$xLZG*wqHQoM6hV4qP~rFd0jGInQQBWM#~%i
zPe+)TVX%pObgPX`>)=gBXQL}?S)Duq^S4HU8$ql^;M>9vVbE-WmM22(salttC6+mGk@b*qYSQ7yc=&FU
zMZpAoBFk79rMQ@Y&S2JHD1SAgGQWzn*cR?6ULv>A0>=>vuYqJWV@(Z-BG>?MKO&hS
ze9l6Y%o<2U6LO*rF(oAe%md96`lL=|WDJRzHI-Ot0dT`=)6i(C`KY2vyu<~F9Yf-Vsc
zwzQsOla5U3>gToTS<<>`X}?G5wJA~0&`GV!^R_rZ$*cJJD{3@4yU<4LbK2CV-_v}w
z275d?Ly`!2s@ln6C{mLFN6%De`egND7`JDKbrB5{Pgzt~W-o1>|8RPfr69yk;H=s(
z?~ET4!*6VCfW`udLvf@->e*4mz6a`DlV#@%ME3z8h0Kw3<=4U9_ll#yT7W1>0_lI>
zDKpvtZaXiYzM61FqN}r_S!4k(2E-qC=HA-&jw&Z@Dk;=)85P6w7Bt_D7`{6UWpnLJ
zn`@I_tw#?PK4|(qdbi!6?WRyMqFFnd*^cHBNx^W<%1&Gr9Gk
zWpx%8h5o{DevM&z>+Psp;Uwi*O%N?T>xWo4#nSz&G*#LN(4X&Gyo5NmS*V)Kr*TLbX~;bqDp1GW&$3t>w?BH%pU
zCLz|`5aOH)vAh96%JHyy9<0==l>=lv2>-vfTi{x)&H50Q3d}e>SQEgCi?-PTu};ze
zG(o0@|BG_*v14;-#8~w|$;m1lYoFHiZuji)+u+h+4)Jaz?zv
zDDG@k?w+42>&^=F&~-oDB9+=mpe#;rHcEPORSA-;=4PWgG^AN#NrC(8&5Lo>%yUJR
zu!P;}Z#cfB{x-@2#1cf^<9J7IhS58_pV31`w|S-U*;Em)T6E(agM^-=NW~
zeq@vQ!~g1dbn
z&JCZMYw{5TZ<9_ehL2KodXig=7!s!@A<5`;{=h9<$%YHM*5qxHAy5)Tft+CRPX!vs
zE9kV6NJF94_^lQ5JjfD2Y&wqz`vIkKu`(GznzblP+S%bQ*;OzAUhn}vp8y`ho0Z3!
zPXej@S}idUTH6n3(-GKB)c?33#0g*~jeTELSs!Qfo%X9_&ktZ6C_&?k@dra
z3#w~G0c;LLRt~X3Yd}$l|1kyBb~Arv*96C^zNY7x1F1%{jqTr7|CXR<`eHj$U@+=I
zPJ$&%Z`4+Cp)Yr_OytfW4$^O!&6`7F-iDjGZArCV<)6e7h!f?s1)cA>QBE;nn9QY<
z=rX{W?IVvc?Xps~ukw4NppS-2@|%^c0_#2OwF;kC7!OYNnB-_B9p!FAw?)9+viJ3g(-{)v9Yvfigr_zRA^ieT92#Zr_v*8L|@ZBnNr;VnVm%4HQz*8mU*ld3#
z#tFFj?HE?*Kp45QlYH-GIyBDD5u=D7=_8c8>E)sHi8?w7W7N
z=QjFw;Ny?30=aAMz|+Ohz$FGS?
z&HxTJN9FX(SmRp%b9KxC;)D!iEz2R+$epabDto1qJH@Q$K5WR91gs8IT6m_m07XaQ
zSRU2MmzJ>}V>W#T)rSKq$$00h*eu&qv`KK8y^F_)Ur8#64bsqJ(0qJ;^JN>k+}*$u
z@rJoxz9r^|d}8C^Tffofa`uOn&aF@S7ZWuRHe)VqpG4-^iE>mor;Fy;m)D`Xd+XVHF5nVZub*E5@b5%<_)@;5PW=Ui=0f|78zLf0toTB
z67V7_IStRWLuADnrI3U-#QkrYlEH7HL~eBMe)E2Yr^yJl&0s%*WXjE?<~^8?C9wg#
zC|(-+PoE#?6@y#Ix;cANYNW1eI_y<>=0SWHDe3z5@CgCY@9;tCF)Jx>-HIMf(KY!M
zr$1QotPJor!Oo*;vQYw?H7RUXBU$`?Ae9wcd4PKLs@=+MiP`yyWT#e{Z}LNpkfpKp
zIuZQE&Yh)OA4jc^sd0&_XCUkxwD)3>u}&G1i?iXo~T8%miX^Fgu0&g
zcb4N4ukC>Muu-VsW<`gWfZNZ<=QoMrzokyAyzHYC>bp0ntxwi|q+hr}JxX52g)sA4
z57-brrhi1paSi(|`jSw@`EGYiOwvH1WttpMy-|)Ax|z*^;zY`0MdnFG%0E%rL(CF@
zbxC+@Du>j0pqU4ReTXVDI#yIv*BW_RndZ6CHdCAimBqy(P5?8@I9MntbA1$t2BZW_
zMudS_YeFIdfh-pwo0eG`V{(&Xbovhp6Xv|5gR!Q$?N1Gj(;oUtzNX?=Jug;D2nEY*
z4Ra5>`98V8PYomT83f7SQr=;^4kmR5C}srA2VVM8bB);(tSh|_Y?{5enj4&^3U#G!
zHz|aJKfXCf?=xyeGHL;Dx#OB?WMlZGW)`h@{uQ+|wj!*~JkqDo`r`8C`q#{=pKAD7
zCV47TZGrEaP)kw}QZT74<+3O(o|uN@KCP~-9|#mnstHGU_;V`J5tAvuIuY9=B#^U}
z7hp2WNur@r8GUO2$7o_&roZ#w&)md4=8rCPk4)S<+{17sJIMJla4e7;jyk%=w!0bE
zJcwmzFrow_87cvC6;Tk1*}q5uFZ1<|F3)@*D2EUW%&;?h^Vg$;TQi>HoSQSubWbgo
z{HyshvPI|r{cG{u5s&}5Y{yI_n{YITw)<&hzbfOtl#7@=
zX&wxTe%~cm{AAewoG{+VSoP%g6{k;foXtI-mthsFv+piFk9^w%$SC{E)dW2eJ5c~)
ztWq*7DJgCg-PpGS5%g7!BSJSG&{|P9R%fkX#Hv9$FdDil^&rqLfC3FlEg+&2gMs4(
zj0q4{Dl*dYXrV@zF$>D3p{!9I$urCdYkOa2F2$RE2g6YOX^m1qD%rvCvyCtZR{NY&
zjg2S!RLgfI0mP`D{O8G1R#stCO4lC?vf1;FT#<-_8V9YyFb?nI+y=hq8x^&6E(w>%
z2acXuR@SbM&qIuY=&7o8F&!!5f9<-_K
zwwG%a#&`L1Gte#IXx{7MN6~^)*>B$3$8UdjFZ#o+z}Tv(k4Z(U^p{UcBYF!_1z|4&
zRLfe+vx1Cjt0VgFmEG0U+q)teNa%?u6)ylZfm_w|uYWwKT9ODqfR5^*d{6P}6b^=jsyOUruDOjWVL9Ky9=Neq6uQor;S*&So>7|4
zM1JQH`j;`jrq5eHhs7gpy{@5-`qG+tZhuC3J-rgsO#o_-oi8|p5<#pt$hPuNk%4?HJl0~8JI6apA*oWmAPZ}
z;kNX;Q0)#X{coZKKrG14_xvnKg9DOuj=M5CAERRs~tV
z1Bjv~+u7Morzc#*3ECqvhy>dRqIdw~tDP}HFHVdKQe~W$NXc)g5(2Oux`cqpXv>`h
z26zAfB`QM3AEu*zoZ^L-VA}Phn@!wT6{6DR#~vi>^6-6yEpq=3Q&vHP2>P-?#L+K~pI;%tlzs138_CCSvrsLKPT0kOjTY
z4MGxP3QGgpp^g7uA-JLzbvkYW1(qmj{jDTEX?UOX>8NFR&;cE1F$u^&p`!9YN*0TZ
z8tE1}u-Cc@%{qru>ED|g<0&nzN%H(LV67-lUS-vpiIJ|g!A&n3x}p?BPfyk51yrOR
zVaH`bw@h>}LDxuW&8U_73HsOM@V5W5PDB_SZM(>p~d
zz+-sAh3EyOr-57y}x5NR4=nAx(6izF7$nBt*^_T$98Il*XZY2q;Q*Iap=4o^Brqk*EP6enau
z5P3s2!5&V)-Y|${+iQpoLxK|}L@`?X0jZ=}puDyYJT$ZLsrQnSZR(-dg54gQ)YaYaJjRfm2TiYe#Mff%va(JN#$g2;>C
zC{hYjb-$P&H+k?5Pa2L{Ys&E!eeP(wC9I-FC+VbR91X3@brGIN`Is;&K$B`Ga{c
z{Y7TC>xeEow$b`$u;E9g$!+y!V6h#cXEU{CqSA0RW`?n<~deHvb81
zPNK{qh>pb(czWgmv^g#!nMy-IBtVOT0nd^xIb#hUPGQsqaBD4@YM}!KNRp1M+EC5y
zNhib8%VW~i=55ZLm9Ur6Q0#*1`*;#(0_^I0a%Ap{JJ|{yM?$!#)bGT1$x6H>_@U1(
zyyr(6vuwKf0k9eVdqRD4P7C>GxA8D7)&juc@XYm>`(h?yo#s*XBID+f$fXuXC`EDJ
zsZU~K6!o+!N}H>=#gh)p2~D*;DD0l^5w4$!!n$z`QYA39WQ;NQv=Lj*J2iev##1X_
zk~gTUKlQDLaE_D{0fR^x#Q?hcuSM^djqg#(?I(Piue0t|75ycpKS?8vw$h%
zhu}i=zrE$(M_`@IK_xh|i^?zK71?d}i
ziwLasq$N8>We#G75Km()ebZ)cs06(2ZSt^Z32l$!1ah$5I#0=c(`&LDIMXk3&K0el
z7Syd$D4t^LuVlO2z7*$N4<;=1WJjb&+Z;v`de2L&imK*jqL{TevczV=8?koxW_PK#
z{)HJ1Da2A4qWD%T=iX9cK*WOOBryeGUQ#WxCPigRUe00emj{|HhMW-k^RIHzaRL*Sdqbf}q|c$T@rKWSt7~`;i>#!rRbCir4!P+P
zH&gC^C_~2`kQBj5vqjPX=3qo&9Tc_D=oh4FE&lo4LL60l#+V?k0wF}Z^YpQ$n(^y8
zMIjgl(3yNEXn9YNphN}0Q1%TA*6ZK3;L!*AfYuRo%&?dlG@zwqcwxd3Wq8sOR}re^
z6iPLO9B=U}4thy|Wd2Y6u4^LEjBtEkJ4A7F!)ToCYK?q5wml~I7B{c1nYf|5D#^8*vrFH^i6im`
zfG;qw4hXNeRNqiSs7x`CY7AsD&VfP07>6U11aPtdxfqni43)WFF+XF8qFx4s6$0}5
z0RI72%_S)8)i1%Kkv6i%yyuvo$Xsp={~bw`_-|
zXd~&oMV)2YwbdBr9dx&2e=s^#Y(;QZ*aHjw9T}_ZQy6&*fw2_K>{TA^G<~I+>6u#9
z1u;e!?-L43SpK~yUA#;EPmtLIQ9$g!gnXT3ahj34#r0gY_r;5btC&>^GPVfy7yOhGgf*kLA48c+C&TI)f?AwWAk
zonfdNLjW*`;#r^JnRkXFb^*pK6Gjok`o4I*hP}}8egA~{&aPDv`A?#BRBZ`sMz--#
zI}J~~wr8ek2|$C+O`Z9p&H7(sxgXpX1U)6zyqVLFpx0Z>rAuxs#0;w|0rToqb8Pmm
z=G&9;)L)G{mB|m-CYjuFdl+
z)m`O_LFDg5?=}Hs6QcKPJd_R}@A7(rp<0Z^S+^CRZdM%hdCnI|v_n<3VRl5a7$QZ$
z6Gsf~^%ncd3&EdbvqT41wtCBLah5d8?Yb0p4y7j?
zl*;kBIqS5g+fyRBOOcRFvilZ4
z+stU+Bqr%qJZ!Wb|9(?(BtavBxM8EVbd0Wn(8qj?H$yIM3?Sz;=bd^4EdjyG
zQgDPUaGNPi!e)1AC}*fDo7E@>EH${8I}h>sbCtSMQN*h0vT99zlFa8nOtpyhcqw{t
zkB=|5LH93dK7%Xlw6wN($6aX^%iuHbEw(ktSl`Q4`{p12a4=yy(PKty|0UI?O5Q|F
z@HDgedNa&(o0BBh6Qw*MKY!7y4
zDG)gXG{pckhak2?#I!@i|1*)fUKZf88dGLA=#YSV7Q}RjydGB)l&1tkef#0$!oYx%
zLi-JoJ=Bgb!H`2^wZ7}+Q(|MkV&Mffj?x{rCH3h$vFbrzZ65j2nnfl}obI}RCGUoO
zD#r47tGdu_J7hs7&`#buG3$P}f}RC7^bIAOmgWE5co&2UJ_xh*;oGgBReQu}ysXL3xoJ8~j
zhsF)Ri=SDnZ@rlsTOuVNw`p3smOZ*1k#nB`ngfEt^8j@^pRJ3L`>d0Vk|9iG}AD?Dh_*xML`HMgm#
zZ)xR=zdN9+zM6hN4GYw?+{KzdF3JBsu1@{g?ODbU+07BCYu>^G2GZrO%i$0Fxd29<
zz4gTbXoueZ)f<#uDe*UdNedtr@P>HfM&-|l|LU|7d!hQj&KxAVKup6*gxo*x@36mc
zndDbIbWV#{U~;p3@RcM7Ue?;PPtha#jf~30f1+>Wlz_7JNnMXwy<^;&PxVP!9Jt8!
zXE8k~T2Nok-4KMG`D<8Huh;zbU=&8vYJ2V{aBaNd(pg?9Gj!gr5rJW00$<~8@Qy0~
zeXJ4X0C@m;VulN@n^h4?rZvjH&PN7)fl_d^WU>0Myi55ImYSf+Fg&1keN{}Cq_an
z0b@61RIc`%4XRZ=zUe5SKuw5h+
zgCA}pHqGBS93!T+ds~hn_a5W^NX*v=pe(>q00fD2X#&>O@hmaK#ri}9HSjO!2IaP}
z{(I?m*T@xs@RM|=EUMDW!ImrEfy6%mXL|!X0F=G$205~kW?LV{E7G4
zrq$=Fh{!MDvfuu+cKt4)IP9QI?Gf?}aNZbMgipLQdZuS#UV#c;&7j*(x!vD&JbQ|3
zKN#?3CA-IAO_;h#IV^N69U@!EsI7t7F(U9(e<7u}Yn=N_oS!~e3kf6AVKmWL9n6d3
zN;mVGABs^WHJt7L5$o7D_-Bb9&_^dWnfl&5F!`r{XAj7A6ln4JoTc;gV7&OIPCdbp
ziP5mCx(r!(9#HUuN5Ha{fp&U4aVAHV8pYc=EN;?jSV|`%<+w%pNzj6C$)S-jvnuUd
zr%_|B^`J!~8@u|Kfw<;bPv-sg-PkynA0G3#v*qohIm=%&aG}5T4l<=FgJFlOIpyjX
zRm6L07gn{CAdeNv7l$oJs^2Ro3B3U5B>A$*(F~l9!7C>B%db$Z?XwluwCJ
zQ7)eu^8Yymoa2R@lZY&v{g=ETdSo$)4mZuCJ1Hiy^QW)Id7su42`*uX1+ES={vSp6
z{ZHll#{v9o$1ytg*0DFoJ|rD`bL`ErXC*61I@8|s5OwS=Dj<6n%-^B{O)hB_$x{`M0crV(fL|T&O&mkQGv4m6#i=M|;q6UU`IhI;
zU8J>_{rNuXMN4_De(MVRa8x;Ei)BHj=A7%N5J;@Ft5<3XGrvgtgD-@%`|lYA)}p`q
zy&A=?`S~F=p7X|-&Zd1jOptlQEi>@f9>yayZ&NK_OLR>2Q6n(5%#E`(`Xfd{k5}H^
zUk?%dJyhsz|6K=xt<^D)>L40$FJDyC34JLA(K5h?`Kq?#i*^3qr6)f?U)R1M
zuZ(c~+FY^^TeiK~s-b9qGG)x_9-3V@XR#w$lOuHnU6%xe03j@Ds0g34jww3}uLc$k
z1R_$!@jVCFVIyM}sAiw^&U+CML|8JEMjxsGGJu6NB9w=y1{4N8QuU34bpv*|$nrD>
zxow%t!M`Y|#aV?bGiMX_H0RjGQuyy`2bkwKTDM#@(*L(xaf-*aozu&s;qB|^%N>J4
z+e$dXUgoeWa90a-?CPbMuw_xxk;XhfYcZ(WUYn+}PDZsBQS)b!rKC0P2mR{@e
z@k9K)&_SQgFIC#~-&0W<882zlz`l2Vzf@B5=dF=^uA<9}HltAEeRUC2^57;+J)Qdy
z%V{Ca%Qu!s{mnyMfW(UdQVtqsb=y
ze>g_pzzRS7GI8l`9}Uj8>FnS3`}FV~!a$++C5ZWo^eVQp<#7-FQIi%K<%@foEN|Y_
z&wPV_r;}`oWFD?TP#Tqbbvk4;xXHe3eO)Py;Zm!2!E&dU-Y0HO485WEeb%kny0fdb
z9V+{cF7!cPq2dz_#DaxbcgZ}aWNq#>Gz#xszR#unU0#*v=AXRjy4ke6y6U2h?1Am!
zf|f>ko-y)0QnVO$U5)^fi=9FBqctk2vtrwxg3QcD-(3Si2
z=IY64@gz~%6iAMjpLCsxy@z@QLgZw=IVVg0>wTAtVpk?>@NeYCx#fQBKB0Sf{zPvF
zHa2MKF?HG1H-k77pMt)NEz{NcZhddY9iFhg>L?}UIrWAs%ot2dT1=Xn8|ZUeclj#d
z4An~}XGhMDmRVOTjP`3N-_JO?w#3X;#bGElbJ6_t9mpz1-ekdFHQl|&+(1qFPfE+e
zXvl+dwg)fc_Y^LC@jp3k{hatoR;x*4jj
zsGtGIO-&~-jv!jf@NTDNNv*+)t>UzLFhfyz^(bq3i-E_UC&%k<#G-TUol^Ea<*Jc=
z2i(k9;*w`=Nf)n5mF0BobMR89iq<9f=J5M`E%SZ4J!JJzyKcZ;&b0x?+rK7yrV|wp
zYZEgHF-mi#u~vky8t2*-9*xRcWLYXq$_8GOWeHixH=h1dr8A}-J3MLCfxYzP#RF4l
zo&WNT(rUb^<3>%Wxp=XI*aW%T+x)@rLu*C((@SM=MDOqBSpB_@hs>|Nj2^Yho=9lw
zF+DL_@1J3GXmd!oq;GQ#)U~YQ>>VcmDl&4%qD%61pUuFv%-dsmEiLN1UN1hG{}PAQ
zF0rL0ltoT^>)6%s$7H$^M1+3RRJi3wjYG8D-1D}#)LXd1B0BP)ztCP1X9x+tX%1W@
zye<-))qzv3uVs2d)KtMNl4`5*B2{-Cv@nGhPGRwB2QT~^pI~H7gg0N9I6Uk$O-=QZ
zoSeSWXq=zNCN8R|JyAC4C?w1!lO#Lu&f7k$QB&AtlL1Qq^Iv{HIQME2RSdYvi)a|OC`uYn$$0n6B*e#uGZB$vxG?i6MvnI#tD}6!P
zi~2KKos2A3LyJ_UDt^4e7j4uVoHWX2xbwHV1q|D&NQyr9$u-I9=2e@^zT5OI_cJ&5
z>`5D=_+!;Hy}L_XSEys|UMhYJFX5Iimx7`ys-+Sju4f_9?PN&{juJKWqxZ*Gm9lq(
zq_e9p`dr*IU=dy0P8*gA9D+MA$RbZUh~L|t%)iTDkr5a|tm-!z!i;$BJ+Dl1E0;D0
zW|@OIyHLK5e}CX#CBJ?cq=<=aZ`{nyz~)9X!zCuUd5E&u1poNBeA5*ed)_Dr6e6
zfKF1cmwRJ90x^2pD72jGj|l4fTg+ny`Yt6E@0Ki^)UH_}9m~nYlRarZ)GX_i89eIj
z`*3x2S#k7gNj#VPnv?0*-`_)2{Z>OHHam86$L)td*|jB2>W-|dhb{jNymMt#6aO|Z
zlV@Q0&3dI_BP&-;GW4_rK6K8TYim{jF>Ls#NYLo>h{q5$YZFpRFGDb
zRY-lX8|6U85n#@KF+|#Y+6zixsO4-cJ#l-btSEoIcMbCK!N7~(HU*}L&s4HB*VB?@
z{VQx8Iy@)F8w6S03d^CTPOQMiP@{qO)vRaRq7FR)HT|O*_5OcTRGDKZ(Uc~}b04Lp
z7o~sP^VV9+3T-e2yj;Q#3>P~mV;&A+x(Nyz;+8YA15cfR;f)NONVKs0ax
z|9D+E>x^3&`li-&&1yf4O*u=56<-)|5;)PXv;Vs>SKtuC*Q!(F?B-#6d*LZZ-^vZI
z0hx~0jDB86cG+PDZSLFx+5S_MQ*F(9f?B|Gmk5wgver~?H)W;no9
zpKD1i3|yOaq_+s-H>eewR&QjYI7^;d%E^trV0`X&Q!qamqWsrAx2?>rv$PhMd48EI
z%d>02z}v2z_Ve3f7H643Znjpv!O=qEnCsePOlW-9OW;D&!|Kv)Z-Iczt%+QXnp1Tl
zUWqC_Rlb(J3Ds(+w?g!V_$@K+FB52z&I|Id?6Two-8Mm8CwBGa7um-};=X?meJvx9
zd8^GQ*?@!f=8i3%Pi10HnY(f{ETph+FHf@ZO|sl|jlY?}<1IcS;;L@0Tthk^CafzS
zV;eDZp;u%VCePL7|0!-mpN3jwbp%;cGvpav15Bz(LeIWBxlTJasXSf?w+xu7mEJTN
zgUE7pJP#3GQOvYbF=O?;)NlOQGUI?psMUbYk@vEjnJ(ljewHcGZQ_O2)q1(u_ecF|
zxFNIamkev0rOvm~05=m6OzR3V&)-z;EJhIDuaEun`*Zh7LB{%nwWQJ#G26aZ{V9{;Wc;QOXO$OJnOg%|vzO*$QgB+W=xV<0HBG
z&sW^BG_w?$bp^)YwKlpYU9-2tWNz&X5~1GNhe-LtCor<}lR@GU)3M_p!s&|3xDr6ZryYsz96fAfcwq8M-ZQ^_dB|aiwNpzP8Zq^F>&-H571RW58U9b$rj>R7
z?X+YstBrY2-A#ayklucZFml7a@fJ}v_I&kv~A>uadC98owm|5
zO7i1%W|i=LWmKBXk1v^PGuqOj3GzzbDw{RII}-`14T_=D@T@i6t2sFILv4h<>Fm8h
zmZoT9nF48DjI_upO5(;_q)&p8OEhA(amU|M!eT2ai{C`Nb@a7^xxBden-iAF!Cc>c
zqk^-f9K7YAbUHsyKdd!GY1#Km{RgFEW}n2g*P<37`jc6Lnb~mYNSt{)B2<8E6E4|t
z>GccUB7bvJbZZ`)Ea5BQDaA;ip+8(d0voyGPwA^Q%<2ve`eNSII66`)iq4xgN^0-W
zvGrJnZ|6K~e2bQgyf3yejk-SrrP+#to0=Q5#KQ8*O7~iISi4}Kl5x8mu{a#gpTYiq
z1ZLzR?!ZMhR}lb}yWPH|Kc6`sFwCAd7HApEDfNyytjF>jI&tjBa8jAt3l(Olgldw3
z;Ed44DVEcvuhM;KqX|Z5FG8!bCe6df4`s^n-n4_X5rky74GwwLlhpW)#XPVBVvwq+
z9I{GCy8PdBrM(^L?;T#^SCwu-9^~yU*2|+FSiUnw^wj&$fSP1?T15h+-d69RI)g6D
zR~F{fxbr`i{8p7WG6lZ_a-067GxAaOSoC1>o4Zb+*?&s!6#Yg_v$`LT;LTf&)pCEJ
z%#K!!wD37ecSHAwl|9Alj5W6O=1128M`G7IgX07C7Nv(KrKymX-*-h1bYTzwYp9YZ
z#Rli-GFfT!&b2kN|8fXR?XlMAgKLX-T4O_bhw@{YlZf31`gQ&z;uA7zb!%_g^h%zJ
zeN7HK<;qJ2R?lj|<@zAcn9i8J-upI;we@{|YV``CpI3qcesrc=SuAP||
z=)iJ$qtv(h`eaHfEqL)QC3G!-?SAKMPj-rLD*iF6j$g9=Pk&3nto!r`OQnLJC&Nmw
zJGEYB3way(5hO#RSyQI>F0o8Vzf1{7smKI3w7k|=&1(JF_M!j3rc&v4V@=j~mDZE6
zuThIQUD6_!l4QbVY-(BP7@J0rWwa$%R{1jMzqOS1#OeAMe(C?ZW&P{}QoJT%^D=^?
z`&4k-P-iCmlkJWU@{2B$s#0c9xD;CG&}UrwffMVU7n?4pS+ND8J1IY-dPYT+M)btZ
zECZS6)(Xa)@*VhF7a~a8BVhHT36z|Q%eTUIR+Ctj3DGywcm@;UOEq^k3=E?zOyWl|
zZh5k0sitVjE5o~Pm;8_v%7*>(S`s`F3!v-VSCFsGSU)jt(V(%PcEQ|iPQ
z8O}dW?Q46-5b+ZI+^|6zBYU-&OK36YhuU>N>K%}OI9rs(zbKOB)L4s|nG9?~GVewn
zl*rZ*-rA7zDYJ%TgVUVOM2fBFY!
zbg3RZ10#%D20y-9tMW`uU?m~jKYy{i)MfLgkBiY@sNrd=>lpYsGQ-XT+>&6?f(5m~
zO~x(5d{lB(EHz3&DVKfc39v5ls1EB9&GSs0`pDYM(kc}I^X*;^LCrl6Y=iu#Sc%&f
z&%c4a^BI)px}~$fwxoUe6FPRpt!mG|l&;y$^OA+E?P4{*{U0;hP)%LDvLmV`^VVR&
zW@}`xsOSWH_Pfc^fKIe>{?C7kc{hfd(^Al-$1)^px+S3{Dxu&=^0QLVCy_Ux^DQw#
z%I&C^eiCow9^o9CugDAC8oQ}KeEtqkEbFK@i@wc`jwBnH=3n-xBbj^hxXjaiTebM=
zZ9Dc8-_Wd6B^qp7LY;>Skd*C>u=I8!7*@$lEgq0SrLZxjQ&6GF-gnV23u=hhNhAIH
z#&bPKmxRHCuM2MZ>#JlgtCyR0B-PzzQ92(r8qLod*ax~G^;|z)ix!*KC
zaWR0sBxq8d`TkWqg^c8!_WzKO>ulY;c6?J?k53{O4nV27a+5h553U5?^;o2TZy2G)
z$wr*pqS=c?Og?kyB^-mk>t5b8XS3-$x)BgM?%;Q!ColKAp|96Y{rN0nhyiXTQl27i
zQ3S?v4&OIlp8I<}Zm{`%eV3wm+vMU=nM1hO>+jQRRgzP|uEOcRnP;a?VVi#6pL_lE
z)fsil5f5>t=Gl}dGd*ev%T`tHFglWr{jFQjlfj~PlsfFzRko3I`?72-`}Y)9jKYeW
zc@#%mv1HJf<-}!p$j=YC5Bx6%;TU+XSNBosSt^O;M)rQWUI@8=L-_@m(@f}%`|44u1Z1v1-XqD-#rhLlxU=*|9
zF7ND>KXZ-gnhuhQKCV(S*E07_xqw6Hsgk~@844u&`FJ=qTU
znV%ezYHoc^8f=w~Q4blU1d8@M`K;2f&8#154@+qF>zakum
zQp2ds58ALmXtm6G~iynN`~T?&`r%7)qS@^
zThwoWD*HhhKjth~URahEcWf}&ijVrL8OLo|VLvm)0QO@Eqaf8#H^WC%tJYFq8J!gM
z-e!^*Y5e;7>kCGPg={x2_a9U9O+Wkcs{WG2SQa|{He}obS;{wDT6N6*$q{?`^Jyzr
zGJGwc!FO^g!1Xj&vbNUliE`S@y`lJQ-#6;UOn0s}C#B_q`(q031u2DBRY^v7c}uP~
z$)9
zwe*p+r@Nyu*OK)D{Fj}YUdYLWvK{5%|Tq~u{T8>u}$4ZG*0Y=q7kn=|BhJTm}EmC_(tXf-M
zmRen&Dlsa1Iyy<&GH**>|FfMQX0*LLn#L&`x~<~76(a>UHHhD819`61*_duHEfgDg
zjeC_%JSqS4_Q+Bj5tW-5$NYYCyCCb*ghJM2nPlOAt0XZ!A4Gg+Q<9LeDGbqyX#}&U#3tu^3XqvG^9ITwiJ$h1R4)f{IkikSy
zPjqgAaK@I4);$I)x(ckdhLRRa#|EQYx{JsWZ5B!@XX*!uIV{D<8zK|(*n>Bp~qBk-n{J=EpSMsr?i
z7w*j5l)Q5FL8owBTAi!pPo@B`%Xse_l`KZauFIbOIk0@nL(EhjP*$#R{|^c|SIsWV
zZ;g^-if^C1&F@6cH|{xrTX>XcIY>Yy2_OJz7|01%i^Hyih{F^`c59cES&@+>xRfZy
z6m-UyGRsB&rL|Wvk@?T{#nBEnAm^kdb;_`V5{B7`Q%z$Bm&5m?Fkvgv@Pi0H{e0b+
zv}Rs*ks*?JHn+~o55Gx@&c&XC!SA2+I2H2U{`LG61##+gom7`DH0w2E_~K`04^bpW
zgJ=5U*9xm_8!kzm^!F5u7~hM$AQ?lf)HCn7Ub7}xif$hsV5;L*W8xI`?BrmL@~3f$
z7(b3QYu>sO{rz>iEl25pZZE&v4q59}mASu^2Mtl5a_^5v?R%{>OGti+D`~#MQ!A8o
zG}|kB?TzN5NbKkKw7#p5qyCPivXlONi
zXiBO2QXa#x{&S%+LGqXwImpSE~HfCB~Dt!nEl3gI8y;s3V{E&rHW6
zJ7GSUQ~2sqv~aqxj7F}tH*p-P$7^n!OES1jnd>7?g}GAy{96*uy?4tW
znQd^x*v~9}qKG5u)^fl{8ke0Z7b5IMP=&sNW9lG~1BaD?s{HoP$waEt8)yMz59UHf
z${EWF^OZ~4&1DoM?4jmwqdmMp=B8|*GIPe-hRnC2I|e7IT;*xEKbyRV=z59cJHqwU
z>W#bE`PP!pzlq%o^|#V2cK)W-#2aY~T+2PJ|jW`?)s4rV0*32gaOt=ZB?B!KU
z`=w5Xl?O;ibB30u^M$%TcoIKl`^1UA=ZkIGm91*mwTrLn4K9#mow~bOllQGlzx4=r
ze%0XGHto*pEldoQj0ub8^1NAoKX#I<*(*fD{9d&4TgHvR)mzDx<8nn|KAnm}MeNsb
z0jsvtCe)=3kJ&VLJWuOP=9t802Sj?$uf<&bePmw^e33t}oJTpL
z4Lqs|n$3Ky7E;4~A+*V5B))q0mH=Og*DhA-jn8sGs2S3E{Lxk@)Y`qEnF;M8fj9VM
zGLdW3_$2*xSnc))P#NuE`d)3&e|&1B}%318<)n)
zrU7L2Re+$tjK7nbR|PJbv|v5%WK2)y3>6uz8fP!2-QjAvY#_e6Y-?yD0uR_#pdK!N
zM?J)hq>fm-G{g5xe^tDwmi5RSA@<59=7B^&w@KwC$9s1T90$l
z7aYy?zS8vG0cKyMluLjVb-wofFS4`*?Jrhlhw~=DYF>?>yI}e1jh$g-{%o|o;hq)wtncrU>2_#cwmnNP5O}uURJk?(VsY3ywwL57HezfP?5&9Gjf&oN2=#5wf!%N
zRDa@^@^dV&lr)I9t3-Nh3|&z{QIO(gnpt8(celL-#DBEx#?F(~Xp!>&?6!`O#om
z(84P!1Zx^7#;un(bKPIoH^}9B&A9*QRdVVoJsxBD0PsoPD!)7-;RZKAeN;2!u-uGU
zWw{-Nll@8z4!I^-R-5{P!q?1Yjla-8HfLBrc!7n9g^TNNFhUl$73NjsD>pj34iuNx
z0}JD(V4U}{DEH@W;n!_WxrEs8(KiwPERW7-^7}{i2-H2@j$OJp9Hct0la|mh@oa)H
z=YCqs%wu+A=&qunZBzvoDldVm8Z=9_-4B{*%YV%|8K4kXx||aW))u;zTnoL(=(!=I
zx1EEkK#Vd)t=T;>EIE|?v1?xlLkRHzt?wE(;lu*OQApY#7=;2(e{%wU_JycDNXKP_
zu;*^#S%@=Yd%iS=hcDMV#WQ5!MpD(9$sQQpX`P@IMOYwX)|LL-(GrNTLcNIPS`sg}
z+1G;*&J|;S*~hz=m!tJHWZPYxkXqpdNN%a7Z3Onv@67A~JpdSS8EAB8yR~lyete*1
zR+hgu|6@aYr13O)ba?J(T2ID)~@?@=!7lQyd)%%C
z3aN#rEHO9oe}=vcQ)|qJUEvV2o@^Rj+1hf{kE!#zqC}3>|0(meTwld?yDGKF-Y9kEnp_cQP6i(a~ks7C$uNH*%19&KCx9>OMPO-KLtstbss
zc_o)-jjE&p{8_)he1W5Hyv
zXT7>d*5${a5<{#DXFI1}%WKfSSdMZLlrg|K_Byx#xb
zXa|ikMk7Xq2<(6HyH`)`$B!jSHO?6;_$ZnvrheQ}`FT&@lhJlri0_KX?b|#uPnH!}
zL>$UQIUePnhVnA#WaP)I9*TERwcMrbB1PGP$?OtFiEqBU`@ARiEud71POa^-H%BCc
zeRlwE$8TGE5p3#%pKXBTFXw=)$5ML^#g9w7n@U`;e%%pHhG!LWHV)Q#zi~`ld=Jf;;
zollj|Ee2`&nTwf3xxc>Z(VVTiJ(M1nnPw2W%ulD
zYT2D49%_OhJYp66{G5V2n%oxRSSdTq4`;pGA8eHy-4U)cj&r`o_1(!L)8DGom%}kyYu6yfh+G^|@98yv72XEq
z8UzaBzygDSuZE>`A`huO{G18E+tdR7zW9RyTh{2EU{QxUe=X~V80VKdUDeX;%Gb_I
zV1<4aG!K#8o^e;Np2dLEw?C2}RZzS(&!dmn3)d(T{)1
zwH3&IVpP4Jmn!BU{yQlB%aCC7VamT9`Nx4Nm%o*-c1qQ?tC8E$i`&`1oKIuR+rw`V
z1KSUC>Gz8_aylnt^Tp7n@CPrEg)=Au%+SzqX=@b|OURF}e;5|WQ?BEO3Y
zRLLz|le0R!^HS1;Yth?C%<6G>^-5=!iEJP|=&tZVjv^8)=+A5MK}T&JT2F_CHA=kd
z;8u6NU_}1
zYuB>)2W}?h#yd`MomHy*d)u&`i)q7Ls
zFD7{SlHgWBuq{V!2!*MRq&-A4jw}9L>X~m#JEQ8%@$d{ZOl*ucB;(8Cqs5%#**Q;J
zm9S7Grks;X+UZNOOTP0*n>M5e@Uo-v;O{4)VFK&as@3F92v1f3?JQT$gKSsBf<>2$
z&qH~%8O$jhwBpp_&uPV0y*Ui^ya#X7JFk(r1}n(gWc;+2WP5`RGr+>0(2e6f4oo
zh&qZGQOmpj>HdGkQu2M_R?_^CxeCzWL)D77_w{@_zss4bO4!(v+ERE$qtzejDcM%=
z<3@#%rP*nILDz}RAUc2%*)A8zCG?6i*eI#`o#MY#8Nwi$a1wSz)d;#CAsc_s&sbGv
z&;DIey3m%8rN6PQNr7??#_3v=X;Bi_SohkH_ye&-MnXU1dTq)h3-3kFi#z>4*-*np
zon#1i{4ZPSIeOnyb`B|iT$hDu;iVDdM{0EfjJViJnyCC7zyrlJ*amwXqha1v93+O?
z=+KRFPE3g;?1}Mh=jC?qKpW|ZdhDPI`c&m}HUI2rf|oux49VO<2M;x9tEgN=rw@H@
z1PM%oFcB~>IvAG%@|cAM;fI6pU<9#V1_kzEoZ5{1S<3i^Jw#P)--r`W-;c
z&>BBE`!j2rp8Sj$Olx~{!YLx+zi$p=ZUdfqhX#+@U5QVXhKe)H@+I*gQ9S6t4aI>2
zKIjDyk&M~1@WPT-;%@PYEHC8d6C(=?CiJr?=C;S_PosufIA8nm*#e9D0nyEcI14~z
zGq5EUz=Q(wA>ru<@C@83*x(Tmo`Xx=FP4k|sbK+pbci1s=79&m+GugT?P9gSs03hi
zKM-0teJOVc{i;B-sWT&0emAsJ;l`aycObX14ADsVO*G6bf=w0=LJxAl)&b{d$E#hR
z0hroYkTcHLec=Rf109B#5NqvK;1=U~)2YE$c|GRZ1LGlR{Q*o11qe0o&TCj)wJjg47`
zQ$fvb2mu^HK)6TT3qFb|K2mw4Dz=rZIQPKp?vkOwjVFkb-1nm{@%9G31Gy&!NM$#7_l;$~uq%2jrRsspP<_BM>z>L?repTJ;nt
zhX%^Dfm-!t7;pgNG7x6BQC|Mdg}>4_n$LIoD;oFsRh)p@`i4~6Kx%j(V(=YPRz7Be
zOJ;CGz`CgUWQ4N~#DE`xqL3#0Ko9^R-gXAs0NGIhpF10&wlPU1K)-c(Bo63wbL295<<}Gr
zF>8ZZ0D$M#pUDzHTnC_AZ@Zdz#~BOR*xLZc5%BCm26eRWC&AOJk%E9uuRF}h4jwE#
z9nF}52X}FP=$1b#Gq4mMBoP4`Q3M(j;OVn)KP*@h3l>I>$1A>#x&nfrfV_Bk)*xH}
zkN@L2Mcf6Z-rb3B_1h?COI3W%8BV#G*oDG_)c|kbE4*bs1~4OcyE_1!7Z?k$jHEVr
z8j1me2FnZEyuY>mT;VP3000~WQ2E+pET4J#?x^J~gVv#42Qd5&s6EZ8$gGr$+QcuO
z@?3)bED4KWhYI|2SER$b&`cf#ka7+HkW(AOl4RMc+i1V4j0FGI%<>85n|*`40$^^V
zL;p+X72C}}%VYA>r3b2c8ww;YSMXvEV1w(YOivD&I@{*EIZ!kepIud4iH{Of1GF8@
zB=96haMzSK^`15`7__E6BRSh^AQ&*zlB)u4Xk)5xo9i98K79xcrNcB(A0zL6ly3*S
z9Y9I{klx3<$_F4j3;M_#q}jyM$CU|nqpx3gQ4B>}HP~>64J`kJ
zzki5}cE7g%fN2=OJOE&7ZC$;ZpWF4pTKb{Gbg{24cS>LB((4M|QpC@E5t*WI%^0n3
z1w1qm7Scvw3M903<^3i6;9Fu$QlZ1{DYz^CTNG(4C--Lk-4Twm`eUcchkb{ibdOuTns
zJXY4@Df6S|Me>?~9=|IC^noDDP;C3Wp9PPa$GArWQ7Vl`g>AlVcQ88Tq(Lz&W0z_U#6IaL>QyPd29
zI}1Onpo{H?v@-c>*xw;lN7#+FIiCe)`
zA&TUjGqxh6L)C|fr>x!goqBS7m@CD(AkvuiSTWEVJW#qil!QQ{=!278-{=aj`a04f
zP!63YAfxI$0SMy8Y~&gr(}#c@x&R>X?DNxAI2b4gis#NSCLq5lMvrn%7dJ@c5Dcap
za_|fiSdBzOs?V5C)gcN}7fT2Bi6_vB!@{!w5=@QivfW}c4m}73v0F&b53vhN
zM}irXkdR!HG4xOp|B>hru*dvhP?b>}U5PVRGX+w)ZGx`>FADWoP&m@6r-%%K;v!O~
z_sjh0a%b*}T*WzN-tK{OI+vA+5SS@}z*da)&(*6Pa3F9y(9QMhg^veK`^+N-^_?FG
zwVO$B!~m0(d@H1rG9cs96WkJyvDI)ZkMhI5!gK!60780uWcE#RJk!zCiP|0
zfFhUfV3brQC6Y*C3|^3Zi*x>@89du%J`ScoNC_y?Wc|`iTsAk?_APonU@BMHY1}8)
zsu8%`o!HRfyx(a6?RAE*(nL7%xYZ%?B7*)PlUHEwhS)j%l?kW=<%R+H6tuXZ)Kq9*
zS)x%a&&t1DbWz`;{;oQPpD1K#2W7}g8H-PMO>{jw#Tpr@y;;~b?6y%vS=(Sj+X1(^
z$6b`P!!s3YpMT7An1n0v5UgKoyxtEe4Zm$)i3?n-H4g(dfvOXOZ_kC!L4l1a&|)QA
z1dm+t@dqB?H=7ct?vgPng66`+Jd;3V#xH;lR6zx{i8L$8l8+wS*VI9PR5TkQ-4Q4t^Q>7zNRgh>pNN9&3uz*if
zn#Lx6GawS$>J-Az^DO9in!fWowNx
zS*;$_)8%`CNZBAU66~}n9z($nC^C2)#Z2H8QVMNn^2!o{anXnfJOIpa%_!%vWQJW9
zOF#lX<_QylAkMaX@2%)I&qZ?}m^NT$#x+@AwIN=;S)+c#aWnY3Ig~qxhy}6v9*m|H)(H;+PT@Lu;05*qw%Rrb>Td{87)fOGbs)m}2k-H`
z83g~g2)JlgkA)9ffE5W8qu_cNm_UMuqjfkwM}fFb@?joo*2r)a;G!uchtS5uu`=l@
zme*j+H%MS80D!PaGA98K$`bCXQtOe1oXIC}k3l%eg(8PG0t=ugA#NUQK*b0mR%e*a
z3_XbW;R|BJI#!X`IWr7VO`?1NC-EMx7*iar8B<@M&Cl-G(~-wFTMNX17JVvIL|NsB
z;4uVXEG3k5;|FBs`3QjhqtQ4uawY#@-yp`Pf+SmOLig?)V2
zcK!DGUBnhm(mpf%%>OjRe=t(ZLA%rCVVGc_ep=B5&gL5L!c7qiw`UsJKf^9Dc}xgc
z7J)nT7?Sh$&qqrFgjinJN+=lc8~^u_r0{pc-|aB%jT4Rj@A73yt7vbg3JoSraY(Q-
zZo)0x?@9VU2$aEeDN#eTD=W^@U)aOz3OP(UqhL$*n=ipBJSWYw-j_j%?C};4WD*LV
zzdCD1RpK=5OvhiAWRPQ=wcCFBXmCGB#qj>ri}iHZo}=)8!+KyJA8opiVxE%mJA@Jp
zs|4^HXJiyN8Hf3vE1*bCD3~Q^eKWjw3nw}8&&|StyZoEz*UKCjtlKw7wG_u2eh3su
zKB5A~IgJlEwR%J=G{|@?c<&cJG{;CjlAs16v1NSA&!M^*;&Uo;ZmServy}XMDg6zf
ze|RSf?VtzY4ff&s`;)};I0xYi*hIkxhxieBX^L?`?qR?fzizkl?~tu*Roti|&X&Bq
z${(dXuGf~!^t1(fVMQ!G>rtc~SWxXkufhmw;7M9Sbh89Y(o
z&LD`Jwri>8qBrc0rP%4z=82%Hq2E?WYB?KB%HvaT_gUjDloWK_mQ`4xjU<31!WEoP
zUmy^(M84Mm2F)HK3q?zxvwjf#gmDOQK>ogkN`@=+3~{~2d|QmBV>AY}UbqjIZJ_F)
z<9vG4j#UKN3}2oR{Len2b|z1G;yuCjK^ILNknsnHuHX(>v}pE7BpmShKgtYL90_1W
z`oIO-uz+X>BIYv|1feSdFZph0n2pPY@ino*=HSNRfYu11ux+8qnQ3nTSP%_b6ZkYU
z<40%U9R!@?UZ3gCjsddu{9WV0lAr)0*nn3bmNsiMrL=wqK(c*OMgP6*_V$Olbc1L{
z8=!&p{&!y9L>Q(GEXBsC^jBwClwTQ!S|q@jA}$_3OFNqKUjIo#4Cb5yKKz;aH3;v0
zhh;${2~CRnY!-urkI+KbK2(G2tO>;f&OU3$IV(UC9w!_uJRyq89+Ks5_Ys8G0g&lS
z-#h!KIdpgSh~n#nCDluMdKVWr38eTlu=%1GhN6dqD4__PSPn8tZefooTu
zRjI3>a{vvYxE5LtPzbAduAW!UFV(t<Osov
zVhlu}z#!1!7-|e?D^63wmT4%a6vt1b8chTF2gmr4ohIoeLP&k5gEG<~O^^otuY<8L
zxP%Y)P$7r-!(1@t+Ngwm3hdf`}Px(2IPk3J2r3OwB18rfrBW3<
z7!?jkFai${uJUV*)GzbQp&kx!0lU(u4#%`bE!tfdg{L6tZ#E0=!h)9^!4etUc2V
zTL46Ahaic8+GC)WNT?{LTE!N~#jAxGw&J9*L2<;wsj9IYvH)HVi6_cqsP;(cS4*;*
zG!$z}=B@{5_5tNiO~F_s^k|w?6$WJLA*msub||U_hKlJRfqIBpdnB$M0GkU@E*PwW
z>r36V#sVOgxLLJv(s4KldJ$?DJYykE768ot$4Rw9+SsG17H2%`Y?j6`)fEF?-vK}g
zK;v0ii5>DKG=(?DmKO>U?IDQZK!!VDaX7>fPSHh!2INR0$7Ed`$N)>ZbWB!WKWm;L
z@AMHQ@DO7>nI|~?CA%UEx{iAy?Krq@0;H#B3em%YBnBIe&=h7kKyR0b%_+j7AkFhg
zJk#3-0zOeYJw0J-vlGsO37n0G(I~bbU@mCXJ>$$?Gbh06>
zNDo7~h#9zuftV2}h8T(=of4um0#Do{@QUlgQE*Rn%bj9GqnMx}
z$}2MLrZhJ=Rf$HmK2uU%z*)A#+=mDr3}CLGiaRAx=b0@O>xqnTa^w$E^$=0Bp6av$
z#H8?3OQ52EsV))Z3{zfb0@)g68JnvQ!rw2mrS;~55JNy0e6e)|%AG(}qPJ4Uxy+fk
zlw6=xBGr-hs%W1_U0UBa0@bPp5CSB*@v1>q%VSchXj7_J57Ysf8p#Y5T&XC8gM9{H
zG3K0S=LPVaLMP?toB&|HgI07f)Lr_y8x88XLQ2g=3eCECpx-<%hhlKt=TAT`(sQJ^
zvsihtAnJ{J9J$_+R~PxTB!!3PCfEx{)!d;nH&WHnz&pVxM;ZWC3IL`69RNuUMCIek
zdte;VVG!yV0d_?u)l6h>FKu%-^76{+7