mirror of
https://github.com/Textualize/textual.git
synced 2025-10-17 02:38:12 +03:00
10
docs/examples/guide/widgets/fizzbuzz01.css
Normal file
10
docs/examples/guide/widgets/fizzbuzz01.css
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
Screen {
|
||||||
|
layout: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
FizzBuzz {
|
||||||
|
width: auto;
|
||||||
|
height: auto;
|
||||||
|
background: $primary;
|
||||||
|
color: $text;
|
||||||
|
}
|
||||||
30
docs/examples/guide/widgets/fizzbuzz01.py
Normal file
30
docs/examples/guide/widgets/fizzbuzz01.py
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
from rich.table import Table
|
||||||
|
|
||||||
|
from textual.app import App, ComposeResult
|
||||||
|
from textual.widgets import Static
|
||||||
|
|
||||||
|
|
||||||
|
class FizzBuzz(Static):
|
||||||
|
def on_mount(self) -> None:
|
||||||
|
table = Table("Number", "Fizz?", "Buzz?")
|
||||||
|
for n in range(1, 16):
|
||||||
|
fizz = not n % 3
|
||||||
|
buzz = not n % 5
|
||||||
|
table.add_row(
|
||||||
|
str(n),
|
||||||
|
"fizz" if fizz else "",
|
||||||
|
"buzz" if buzz else "",
|
||||||
|
)
|
||||||
|
self.update(table)
|
||||||
|
|
||||||
|
|
||||||
|
class FizzBuzzApp(App):
|
||||||
|
CSS_PATH = "fizzbuzz01.css"
|
||||||
|
|
||||||
|
def compose(self) -> ComposeResult:
|
||||||
|
yield FizzBuzz()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app = FizzBuzzApp()
|
||||||
|
app.run()
|
||||||
10
docs/examples/guide/widgets/fizzbuzz02.css
Normal file
10
docs/examples/guide/widgets/fizzbuzz02.css
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
Screen {
|
||||||
|
layout: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
FizzBuzz {
|
||||||
|
width: auto;
|
||||||
|
height: auto;
|
||||||
|
background: $primary;
|
||||||
|
color: $text;
|
||||||
|
}
|
||||||
35
docs/examples/guide/widgets/fizzbuzz02.py
Normal file
35
docs/examples/guide/widgets/fizzbuzz02.py
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
from rich.table import Table
|
||||||
|
|
||||||
|
from textual.app import App, ComposeResult
|
||||||
|
from textual.geometry import Size
|
||||||
|
from textual.widgets import Static
|
||||||
|
|
||||||
|
|
||||||
|
class FizzBuzz(Static):
|
||||||
|
def on_mount(self) -> None:
|
||||||
|
table = Table("Number", "Fizz?", "Buzz?", expand=True)
|
||||||
|
for n in range(1, 16):
|
||||||
|
fizz = not n % 3
|
||||||
|
buzz = not n % 5
|
||||||
|
table.add_row(
|
||||||
|
str(n),
|
||||||
|
"fizz" if fizz else "",
|
||||||
|
"buzz" if buzz else "",
|
||||||
|
)
|
||||||
|
self.update(table)
|
||||||
|
|
||||||
|
def get_content_width(self, container: Size, viewport: Size) -> int:
|
||||||
|
"""Force content width size."""
|
||||||
|
return 50
|
||||||
|
|
||||||
|
|
||||||
|
class FizzBuzzApp(App):
|
||||||
|
CSS_PATH = "fizzbuzz02.css"
|
||||||
|
|
||||||
|
def compose(self) -> ComposeResult:
|
||||||
|
yield FizzBuzz()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app = FizzBuzzApp()
|
||||||
|
app.run()
|
||||||
3
docs/examples/guide/widgets/hello01.css
Normal file
3
docs/examples/guide/widgets/hello01.css
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
Screen {
|
||||||
|
layout: center;
|
||||||
|
}
|
||||||
19
docs/examples/guide/widgets/hello01.py
Normal file
19
docs/examples/guide/widgets/hello01.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
from textual.app import App, ComposeResult, RenderResult
|
||||||
|
from textual.widget import Widget
|
||||||
|
|
||||||
|
|
||||||
|
class Hello(Widget):
|
||||||
|
"""Display a greeting."""
|
||||||
|
|
||||||
|
def render(self) -> RenderResult:
|
||||||
|
return "Hello, [b]World[/b]!"
|
||||||
|
|
||||||
|
|
||||||
|
class CustomApp(App):
|
||||||
|
def compose(self) -> ComposeResult:
|
||||||
|
yield Hello()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app = CustomApp()
|
||||||
|
app.run()
|
||||||
13
docs/examples/guide/widgets/hello02.css
Normal file
13
docs/examples/guide/widgets/hello02.css
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
Screen {
|
||||||
|
layout: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
Hello {
|
||||||
|
width: 40;
|
||||||
|
height: 9;
|
||||||
|
padding: 1 2;
|
||||||
|
background: $panel;
|
||||||
|
color: $text;
|
||||||
|
border: $secondary tall;
|
||||||
|
content-align: center middle;
|
||||||
|
}
|
||||||
21
docs/examples/guide/widgets/hello02.py
Normal file
21
docs/examples/guide/widgets/hello02.py
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
from textual.app import App, ComposeResult, RenderResult
|
||||||
|
from textual.widget import Widget
|
||||||
|
|
||||||
|
|
||||||
|
class Hello(Widget):
|
||||||
|
"""Display a greeting."""
|
||||||
|
|
||||||
|
def render(self) -> RenderResult:
|
||||||
|
return "Hello, [b]World[/b]!"
|
||||||
|
|
||||||
|
|
||||||
|
class CustomApp(App):
|
||||||
|
CSS_PATH = "hello02.css"
|
||||||
|
|
||||||
|
def compose(self) -> ComposeResult:
|
||||||
|
yield Hello()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app = CustomApp()
|
||||||
|
app.run()
|
||||||
12
docs/examples/guide/widgets/hello03.css
Normal file
12
docs/examples/guide/widgets/hello03.css
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
Screen {
|
||||||
|
layout: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
Hello {
|
||||||
|
width: 40;
|
||||||
|
height: 9;
|
||||||
|
padding: 1 2;
|
||||||
|
background: $panel;
|
||||||
|
border: $secondary tall;
|
||||||
|
content-align: center middle;
|
||||||
|
}
|
||||||
48
docs/examples/guide/widgets/hello03.py
Normal file
48
docs/examples/guide/widgets/hello03.py
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
from itertools import cycle
|
||||||
|
|
||||||
|
from textual.app import App, ComposeResult
|
||||||
|
from textual.widgets import Static
|
||||||
|
|
||||||
|
|
||||||
|
hellos = cycle(
|
||||||
|
[
|
||||||
|
"Hola",
|
||||||
|
"Bonjour",
|
||||||
|
"Guten tag",
|
||||||
|
"Salve",
|
||||||
|
"Nǐn hǎo",
|
||||||
|
"Olá",
|
||||||
|
"Asalaam alaikum",
|
||||||
|
"Konnichiwa",
|
||||||
|
"Anyoung haseyo",
|
||||||
|
"Zdravstvuyte",
|
||||||
|
"Hello",
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class Hello(Static):
|
||||||
|
"""Display a greeting."""
|
||||||
|
|
||||||
|
def on_mount(self) -> None:
|
||||||
|
self.next_word()
|
||||||
|
|
||||||
|
def on_click(self) -> None:
|
||||||
|
self.next_word()
|
||||||
|
|
||||||
|
def next_word(self) -> None:
|
||||||
|
"""Get a new hello and update the content area."""
|
||||||
|
hello = next(hellos)
|
||||||
|
self.update(f"{hello}, [b]World[/b]!")
|
||||||
|
|
||||||
|
|
||||||
|
class CustomApp(App):
|
||||||
|
CSS_PATH = "hello03.css"
|
||||||
|
|
||||||
|
def compose(self) -> ComposeResult:
|
||||||
|
yield Hello()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app = CustomApp()
|
||||||
|
app.run()
|
||||||
3
docs/examples/guide/widgets/hello04.css
Normal file
3
docs/examples/guide/widgets/hello04.css
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
Screen {
|
||||||
|
layout: center;
|
||||||
|
}
|
||||||
59
docs/examples/guide/widgets/hello04.py
Normal file
59
docs/examples/guide/widgets/hello04.py
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
from itertools import cycle
|
||||||
|
|
||||||
|
from textual.app import App, ComposeResult
|
||||||
|
from textual.widgets import Static
|
||||||
|
|
||||||
|
|
||||||
|
hellos = cycle(
|
||||||
|
[
|
||||||
|
"Hola",
|
||||||
|
"Bonjour",
|
||||||
|
"Guten tag",
|
||||||
|
"Salve",
|
||||||
|
"Nǐn hǎo",
|
||||||
|
"Olá",
|
||||||
|
"Asalaam alaikum",
|
||||||
|
"Konnichiwa",
|
||||||
|
"Anyoung haseyo",
|
||||||
|
"Zdravstvuyte",
|
||||||
|
"Hello",
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class Hello(Static):
|
||||||
|
"""Display a greeting."""
|
||||||
|
|
||||||
|
DEFAULT_CSS = """
|
||||||
|
Hello {
|
||||||
|
width: 40;
|
||||||
|
height: 9;
|
||||||
|
padding: 1 2;
|
||||||
|
background: $panel;
|
||||||
|
border: $secondary tall;
|
||||||
|
content-align: center middle;
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
|
||||||
|
def on_mount(self) -> None:
|
||||||
|
self.next_word()
|
||||||
|
|
||||||
|
def on_click(self) -> None:
|
||||||
|
self.next_word()
|
||||||
|
|
||||||
|
def next_word(self) -> None:
|
||||||
|
"""Get a new hello and update the content area."""
|
||||||
|
hello = next(hellos)
|
||||||
|
self.update(f"{hello}, [b]World[/b]!")
|
||||||
|
|
||||||
|
|
||||||
|
class CustomApp(App):
|
||||||
|
CSS_PATH = "hello03.css"
|
||||||
|
|
||||||
|
def compose(self) -> ComposeResult:
|
||||||
|
yield Hello()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app = CustomApp()
|
||||||
|
app.run()
|
||||||
12
docs/examples/guide/widgets/hello05.css
Normal file
12
docs/examples/guide/widgets/hello05.css
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
Screen {
|
||||||
|
layout: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
Hello {
|
||||||
|
width: 40;
|
||||||
|
height: 9;
|
||||||
|
padding: 1 2;
|
||||||
|
background: $panel;
|
||||||
|
border: $secondary tall;
|
||||||
|
content-align: center middle;
|
||||||
|
}
|
||||||
45
docs/examples/guide/widgets/hello05.py
Normal file
45
docs/examples/guide/widgets/hello05.py
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
from itertools import cycle
|
||||||
|
|
||||||
|
from textual.app import App, ComposeResult
|
||||||
|
from textual.widgets import Static
|
||||||
|
|
||||||
|
|
||||||
|
hellos = cycle(
|
||||||
|
[
|
||||||
|
"Hola",
|
||||||
|
"Bonjour",
|
||||||
|
"Guten tag",
|
||||||
|
"Salve",
|
||||||
|
"Nǐn hǎo",
|
||||||
|
"Olá",
|
||||||
|
"Asalaam alaikum",
|
||||||
|
"Konnichiwa",
|
||||||
|
"Anyoung haseyo",
|
||||||
|
"Zdravstvuyte",
|
||||||
|
"Hello",
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class Hello(Static):
|
||||||
|
"""Display a greeting."""
|
||||||
|
|
||||||
|
def on_mount(self) -> None:
|
||||||
|
self.action_next_word()
|
||||||
|
|
||||||
|
def action_next_word(self) -> None:
|
||||||
|
"""Get a new hello and update the content area."""
|
||||||
|
hello = next(hellos)
|
||||||
|
self.update(f"[@click='next_word']{hello}[/], [b]World[/b]!")
|
||||||
|
|
||||||
|
|
||||||
|
class CustomApp(App):
|
||||||
|
CSS_PATH = "hello05.css"
|
||||||
|
|
||||||
|
def compose(self) -> ComposeResult:
|
||||||
|
yield Hello()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app = CustomApp()
|
||||||
|
app.run()
|
||||||
@@ -9,8 +9,9 @@ Vertical {
|
|||||||
|
|
||||||
Static {
|
Static {
|
||||||
margin: 1 2;
|
margin: 1 2;
|
||||||
background: blue 20%;
|
background: green 80%;
|
||||||
border: blue wide;
|
border: green wide;
|
||||||
|
color: white 90%;
|
||||||
height: auto;
|
height: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,203 @@
|
|||||||
# Widgets
|
# Widgets
|
||||||
|
|
||||||
TODO: Widgets docs
|
In this chapter we will explore widgets in more detail, and how you can create custom widgets of your own.
|
||||||
|
|
||||||
- What is a widget
|
|
||||||
- Defining a basic widget
|
## What is a widget?
|
||||||
- Base classes Widget or Static
|
|
||||||
- Text widgets
|
A widget is a component of your UI responsible for managing a rectangular region of the screen. Widgets may respond to [events](./events.md) in much the same way as an app. In many respects, widgets are like mini-apps.
|
||||||
- Rich renderable widgets
|
|
||||||
- Complete widget
|
!!! information
|
||||||
- Render line widget API
|
|
||||||
|
Every widget runs in its own asyncio task.
|
||||||
|
|
||||||
|
## Custom widgets
|
||||||
|
|
||||||
|
There is a growing collection of [builtin widgets](../widgets/index.md) in Textual, but you can build entirely custom widgets that work in the same way.
|
||||||
|
|
||||||
|
The first step in building a widget is to import and extend a widget class. This can either be [Widget][textual.widget.Widget] which is the base class of all widgets, or one of it's subclasses.
|
||||||
|
|
||||||
|
Let's create a simple custom widget to display a greeting.
|
||||||
|
|
||||||
|
|
||||||
|
```python title="hello01.py" hl_lines="5-9"
|
||||||
|
--8<-- "docs/examples/guide/widgets/hello01.py"
|
||||||
|
```
|
||||||
|
|
||||||
|
The three highlighted lines define a custom widget class with just a [render()][textual.widget.Widget.render] method. Textual will display whatever is returned from render in the content area of your widget. We have returned a string in the code above, but there are other possible return types which we will cover later.
|
||||||
|
|
||||||
|
Note that the text contains tags in square brackets, i.e. `[b]`. This is [console markup](https://rich.readthedocs.io/en/latest/markup.html) which allows you to embed various styles within your content. If you run this you will find that `World` is in bold.
|
||||||
|
|
||||||
|
```{.textual path="docs/examples/guide/widgets/hello01.py"}
|
||||||
|
```
|
||||||
|
|
||||||
|
This (very simple) custom widget may be [styled](./styles.md) in the same was as builtin widgets, and targeted with CSS. Let's add some CSS to this app.
|
||||||
|
|
||||||
|
|
||||||
|
=== "hello02.py"
|
||||||
|
|
||||||
|
```python title="hello02.py" hl_lines="13"
|
||||||
|
--8<-- "docs/examples/guide/widgets/hello02.py"
|
||||||
|
```
|
||||||
|
|
||||||
|
=== "hello02.css"
|
||||||
|
|
||||||
|
```sass title="hello02.css"
|
||||||
|
--8<-- "docs/examples/guide/widgets/hello02.css"
|
||||||
|
```
|
||||||
|
|
||||||
|
The addition of the CSS has completely transformed our custom widget.
|
||||||
|
|
||||||
|
```{.textual path="docs/examples/guide/widgets/hello02.py"}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Static widget
|
||||||
|
|
||||||
|
While you can extend the Widget class, a subclass will typically be a better starting point. The [Static][textual.widgets.Static] class is a widget subclass which caches the result of render, and provides an [update()][textual.widgets.Static.update] method to update the content area.
|
||||||
|
|
||||||
|
Let's use Static to create a widget which cycles through "hello" in various languages.
|
||||||
|
|
||||||
|
=== "hello03.py"
|
||||||
|
|
||||||
|
```python title="hello03.py" hl_lines="24-36"
|
||||||
|
--8<-- "docs/examples/guide/widgets/hello03.py"
|
||||||
|
```
|
||||||
|
|
||||||
|
=== "hello03.css"
|
||||||
|
|
||||||
|
```sass title="hello03.css"
|
||||||
|
--8<-- "docs/examples/guide/widgets/hello03.css"
|
||||||
|
```
|
||||||
|
|
||||||
|
=== "Output"
|
||||||
|
|
||||||
|
```{.textual path="docs/examples/guide/widgets/hello03.py"}
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that there is no `render()` method on this widget. The Static class is handling the render for us. Instead we call `update()` when we want to update the content within the widget.
|
||||||
|
|
||||||
|
The `next_word` method updates the greeting. We call this method from the mount handler to get the first word, and from an click handler to cycle through the greetings when we click the widget.
|
||||||
|
|
||||||
|
### Default CSS
|
||||||
|
|
||||||
|
When building an app it is best to keep your CSS in an external file. This allows you to see all your CSS in one place, and to enable live editing. However if you intent to distribute a widget (via PyPI for instance) it can be convenient to bundle the code and CSS together. You can do this by adding a `DEFAULT_CSS` class variable inside your widget class.
|
||||||
|
|
||||||
|
Textual's builtin widgets bundle CSS in this way, which is why you can see nicely styled widgets without having to copy any CSS code.
|
||||||
|
|
||||||
|
Here's the Hello example again, this time the widget has embedded default CSS:
|
||||||
|
|
||||||
|
=== "hello04.py"
|
||||||
|
|
||||||
|
```python title="hello04.py" hl_lines="27-36"
|
||||||
|
--8<-- "docs/examples/guide/widgets/hello04.py"
|
||||||
|
```
|
||||||
|
|
||||||
|
=== "hello04.css"
|
||||||
|
|
||||||
|
```sass title="hello04.css"
|
||||||
|
--8<-- "docs/examples/guide/widgets/hello04.css"
|
||||||
|
```
|
||||||
|
|
||||||
|
=== "Output"
|
||||||
|
|
||||||
|
```{.textual path="docs/examples/guide/widgets/hello04.py"}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
#### Default specificity
|
||||||
|
|
||||||
|
CSS defined within `DEFAULT_CSS` has an automatically lower [specificity](./CSS.md#specificity) than CSS read from either the App's `CSS` class variable or an external stylesheet. In practice this means that your app's CSS will take precedence over any CSS bundled with widgets.
|
||||||
|
|
||||||
|
|
||||||
|
## Text links
|
||||||
|
|
||||||
|
Text in a widget may be marked up with links which perform an action when clicked. Links in console markup use the following format:
|
||||||
|
|
||||||
|
```
|
||||||
|
"Click [@click='app.bell']Me[/]"
|
||||||
|
```
|
||||||
|
|
||||||
|
The `@click` tag introduces a click handler, which runs the `app.bell` action.
|
||||||
|
|
||||||
|
Let's use markup links in the hello example so that the greeting becomes a link which updates the widget.
|
||||||
|
|
||||||
|
|
||||||
|
=== "hello05.py"
|
||||||
|
|
||||||
|
```python title="hello05.py" hl_lines="24-33"
|
||||||
|
--8<-- "docs/examples/guide/widgets/hello05.py"
|
||||||
|
```
|
||||||
|
|
||||||
|
=== "hello05.css"
|
||||||
|
|
||||||
|
```sass title="hello05.css"
|
||||||
|
--8<-- "docs/examples/guide/widgets/hello05.css"
|
||||||
|
```
|
||||||
|
|
||||||
|
=== "Output"
|
||||||
|
|
||||||
|
```{.textual path="docs/examples/guide/widgets/hello05.py" press="_"}
|
||||||
|
```
|
||||||
|
|
||||||
|
If you run this example you will see that the greeting has been underlined, which indicates it is clickable. If you click on the greeting it will run the `next_word` action which updates the next word.
|
||||||
|
|
||||||
|
|
||||||
|
## Rich renderables
|
||||||
|
|
||||||
|
In previous examples we've set strings as content for Widgets. You can also use special objects called [renderables](https://rich.readthedocs.io/en/latest/protocol.html) for advanced visuals. You can use any renderable defined in [Rich](https://github.com/Textualize/rich) or third party libraries.
|
||||||
|
|
||||||
|
Lets make a widget that uses a Rich table for its content. The following app is a solution to the classic [fizzbuzz](https://en.wikipedia.org/wiki/Fizz_buzz) problem often used to screen software engineers in job interviews. The problem is this: Count up from 1 to 100, when the number is divisible by 3, output "fizz"; when the number is divisible by 5, output "buzz"; and when the number is divisible by both 3 and 5 output "fizzbuzz".
|
||||||
|
|
||||||
|
This app will "play" fizz buzz by displaying a table of the first 15 numbers and columns for fizz and buzz.
|
||||||
|
|
||||||
|
=== "fizzbuzz01.py"
|
||||||
|
|
||||||
|
```python title="fizzbuzz01.py" hl_lines="18"
|
||||||
|
--8<-- "docs/examples/guide/widgets/fizzbuzz01.py"
|
||||||
|
```
|
||||||
|
|
||||||
|
=== "fizzbuzz01.css"
|
||||||
|
|
||||||
|
```sass title="fizzbuzz01.css" hl_lines="32-35"
|
||||||
|
--8<-- "docs/examples/guide/widgets/fizzbuzz01.css"
|
||||||
|
```
|
||||||
|
|
||||||
|
=== "Output"
|
||||||
|
|
||||||
|
```{.textual path="docs/examples/guide/widgets/fizzbuzz01.py"}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Content size
|
||||||
|
|
||||||
|
Textual will auto-detect the dimensions of the content area from rich renderables if width or height is set to `auto`. You can override auto dimensions by implementing [get_content_width()][textual.widget.Widget.get_content_width] or [get_content_height()][textual.widget.Widget.get_content_height].
|
||||||
|
|
||||||
|
Let's modify the default width for the fizzbuzz example. By default, the table will be just wide enough to fix the columns. Let's force it to be 50 characters wide.
|
||||||
|
|
||||||
|
|
||||||
|
=== "fizzbuzz02.py"
|
||||||
|
|
||||||
|
```python title="fizzbuzz02.py" hl_lines="10 21-23"
|
||||||
|
--8<-- "docs/examples/guide/widgets/fizzbuzz02.py"
|
||||||
|
```
|
||||||
|
|
||||||
|
=== "fizzbuzz02.css"
|
||||||
|
|
||||||
|
```sass title="fizzbuzz02.css"
|
||||||
|
--8<-- "docs/examples/guide/widgets/fizzbuzz02.css"
|
||||||
|
```
|
||||||
|
|
||||||
|
=== "Output"
|
||||||
|
|
||||||
|
```{.textual path="docs/examples/guide/widgets/fizzbuzz02.py"}
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that we've added `expand=True` to tell the Table to expand beyond the optimal width, so that it fills the 50 characters returned by `get_content_width`.
|
||||||
|
|
||||||
|
|
||||||
|
## Compound widgets
|
||||||
|
|
||||||
|
TODO: Explanation of compound widgets
|
||||||
|
|
||||||
|
## Line API
|
||||||
|
|
||||||
|
TODO: Explanation of line API
|
||||||
|
|||||||
466
poetry.lock
generated
466
poetry.lock
generated
@@ -1,6 +1,6 @@
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "aiohttp"
|
name = "aiohttp"
|
||||||
version = "3.8.1"
|
version = "3.8.3"
|
||||||
description = "Async http client/server framework (asyncio)"
|
description = "Async http client/server framework (asyncio)"
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
@@ -59,10 +59,10 @@ optional = false
|
|||||||
python-versions = ">=3.5"
|
python-versions = ">=3.5"
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
tests_no_zope = ["cloudpickle", "pytest-mypy-plugins", "mypy (>=0.900,!=0.940)", "pytest (>=4.3.0)", "pympler", "hypothesis", "coverage[toml] (>=5.0.2)"]
|
dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "mypy (>=0.900,!=0.940)", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"]
|
||||||
tests = ["cloudpickle", "zope.interface", "pytest-mypy-plugins", "mypy (>=0.900,!=0.940)", "pytest (>=4.3.0)", "pympler", "hypothesis", "coverage[toml] (>=5.0.2)"]
|
docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"]
|
||||||
docs = ["sphinx-notfound-page", "zope.interface", "sphinx", "furo"]
|
tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "mypy (>=0.900,!=0.940)", "pytest-mypy-plugins", "zope.interface", "cloudpickle"]
|
||||||
dev = ["cloudpickle", "pre-commit", "sphinx-notfound-page", "sphinx", "furo", "zope.interface", "pytest-mypy-plugins", "mypy (>=0.900,!=0.940)", "pytest (>=4.3.0)", "pympler", "hypothesis", "coverage[toml] (>=5.0.2)"]
|
tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "mypy (>=0.900,!=0.940)", "pytest-mypy-plugins", "cloudpickle"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "black"
|
name = "black"
|
||||||
@@ -212,7 +212,7 @@ python-versions = "*"
|
|||||||
python-dateutil = ">=2.8.1"
|
python-dateutil = ">=2.8.1"
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
dev = ["wheel", "flake8", "markdown", "twine"]
|
dev = ["twine", "markdown", "flake8", "wheel"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "griffe"
|
name = "griffe"
|
||||||
@@ -608,7 +608,7 @@ pytest = ">=6.1.0"
|
|||||||
pytest-asyncio = ">=0.17.2"
|
pytest-asyncio = ">=0.17.2"
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
testing = ["mypy (==0.931)", "coverage (==6.2)"]
|
testing = ["coverage (==6.2)", "mypy (==0.931)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pytest-asyncio"
|
name = "pytest-asyncio"
|
||||||
@@ -691,7 +691,7 @@ use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"]
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rich"
|
name = "rich"
|
||||||
version = "12.6.0a1"
|
version = "12.6.0a2"
|
||||||
description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
|
description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
@@ -715,8 +715,8 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syrupy"
|
name = "syrupy"
|
||||||
version = "3.0.0"
|
version = "3.0.2"
|
||||||
description = "PyTest Snapshot Test Utility"
|
description = "Pytest Snapshot Test Utility"
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.7,<4"
|
python-versions = ">=3.7,<4"
|
||||||
@@ -841,83 +841,10 @@ dev = ["aiohttp", "click", "msgpack"]
|
|||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "1.1"
|
lock-version = "1.1"
|
||||||
python-versions = "^3.7"
|
python-versions = "^3.7"
|
||||||
content-hash = "c312b35ea4349eea832cf424c2bddb76d91c3a71045760efb735c8c7308bcdb4"
|
content-hash = "b1ad14eaa7ccba5153501b10981f6910409ea084e6e6ab66364bfe362c66ae90"
|
||||||
|
|
||||||
[metadata.files]
|
[metadata.files]
|
||||||
aiohttp = [
|
aiohttp = []
|
||||||
{file = "aiohttp-3.8.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1ed0b6477896559f17b9eaeb6d38e07f7f9ffe40b9f0f9627ae8b9926ae260a8"},
|
|
||||||
{file = "aiohttp-3.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7dadf3c307b31e0e61689cbf9e06be7a867c563d5a63ce9dca578f956609abf8"},
|
|
||||||
{file = "aiohttp-3.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a79004bb58748f31ae1cbe9fa891054baaa46fb106c2dc7af9f8e3304dc30316"},
|
|
||||||
{file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12de6add4038df8f72fac606dff775791a60f113a725c960f2bab01d8b8e6b15"},
|
|
||||||
{file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f0d5f33feb5f69ddd57a4a4bd3d56c719a141080b445cbf18f238973c5c9923"},
|
|
||||||
{file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eaba923151d9deea315be1f3e2b31cc39a6d1d2f682f942905951f4e40200922"},
|
|
||||||
{file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:099ebd2c37ac74cce10a3527d2b49af80243e2a4fa39e7bce41617fbc35fa3c1"},
|
|
||||||
{file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2e5d962cf7e1d426aa0e528a7e198658cdc8aa4fe87f781d039ad75dcd52c516"},
|
|
||||||
{file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fa0ffcace9b3aa34d205d8130f7873fcfefcb6a4dd3dd705b0dab69af6712642"},
|
|
||||||
{file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:61bfc23df345d8c9716d03717c2ed5e27374e0fe6f659ea64edcd27b4b044cf7"},
|
|
||||||
{file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:31560d268ff62143e92423ef183680b9829b1b482c011713ae941997921eebc8"},
|
|
||||||
{file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:01d7bdb774a9acc838e6b8f1d114f45303841b89b95984cbb7d80ea41172a9e3"},
|
|
||||||
{file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:97ef77eb6b044134c0b3a96e16abcb05ecce892965a2124c566af0fd60f717e2"},
|
|
||||||
{file = "aiohttp-3.8.1-cp310-cp310-win32.whl", hash = "sha256:c2aef4703f1f2ddc6df17519885dbfa3514929149d3ff900b73f45998f2532fa"},
|
|
||||||
{file = "aiohttp-3.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:713ac174a629d39b7c6a3aa757b337599798da4c1157114a314e4e391cd28e32"},
|
|
||||||
{file = "aiohttp-3.8.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:473d93d4450880fe278696549f2e7aed8cd23708c3c1997981464475f32137db"},
|
|
||||||
{file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99b5eeae8e019e7aad8af8bb314fb908dd2e028b3cdaad87ec05095394cce632"},
|
|
||||||
{file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af642b43ce56c24d063325dd2cf20ee012d2b9ba4c3c008755a301aaea720ad"},
|
|
||||||
{file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3630c3ef435c0a7c549ba170a0633a56e92629aeed0e707fec832dee313fb7a"},
|
|
||||||
{file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4a4a4e30bf1edcad13fb0804300557aedd07a92cabc74382fdd0ba6ca2661091"},
|
|
||||||
{file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6f8b01295e26c68b3a1b90efb7a89029110d3a4139270b24fda961893216c440"},
|
|
||||||
{file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a25fa703a527158aaf10dafd956f7d42ac6d30ec80e9a70846253dd13e2f067b"},
|
|
||||||
{file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:5bfde62d1d2641a1f5173b8c8c2d96ceb4854f54a44c23102e2ccc7e02f003ec"},
|
|
||||||
{file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:51467000f3647d519272392f484126aa716f747859794ac9924a7aafa86cd411"},
|
|
||||||
{file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:03a6d5349c9ee8f79ab3ff3694d6ce1cfc3ced1c9d36200cb8f08ba06bd3b782"},
|
|
||||||
{file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:102e487eeb82afac440581e5d7f8f44560b36cf0bdd11abc51a46c1cd88914d4"},
|
|
||||||
{file = "aiohttp-3.8.1-cp36-cp36m-win32.whl", hash = "sha256:4aed991a28ea3ce320dc8ce655875e1e00a11bdd29fe9444dd4f88c30d558602"},
|
|
||||||
{file = "aiohttp-3.8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b0e20cddbd676ab8a64c774fefa0ad787cc506afd844de95da56060348021e96"},
|
|
||||||
{file = "aiohttp-3.8.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:37951ad2f4a6df6506750a23f7cbabad24c73c65f23f72e95897bb2cecbae676"},
|
|
||||||
{file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c23b1ad869653bc818e972b7a3a79852d0e494e9ab7e1a701a3decc49c20d51"},
|
|
||||||
{file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:15b09b06dae900777833fe7fc4b4aa426556ce95847a3e8d7548e2d19e34edb8"},
|
|
||||||
{file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:477c3ea0ba410b2b56b7efb072c36fa91b1e6fc331761798fa3f28bb224830dd"},
|
|
||||||
{file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2f2f69dca064926e79997f45b2f34e202b320fd3782f17a91941f7eb85502ee2"},
|
|
||||||
{file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ef9612483cb35171d51d9173647eed5d0069eaa2ee812793a75373447d487aa4"},
|
|
||||||
{file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6d69f36d445c45cda7b3b26afef2fc34ef5ac0cdc75584a87ef307ee3c8c6d00"},
|
|
||||||
{file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:55c3d1072704d27401c92339144d199d9de7b52627f724a949fc7d5fc56d8b93"},
|
|
||||||
{file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b9d00268fcb9f66fbcc7cd9fe423741d90c75ee029a1d15c09b22d23253c0a44"},
|
|
||||||
{file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:07b05cd3305e8a73112103c834e91cd27ce5b4bd07850c4b4dbd1877d3f45be7"},
|
|
||||||
{file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c34dc4958b232ef6188c4318cb7b2c2d80521c9a56c52449f8f93ab7bc2a8a1c"},
|
|
||||||
{file = "aiohttp-3.8.1-cp37-cp37m-win32.whl", hash = "sha256:d2f9b69293c33aaa53d923032fe227feac867f81682f002ce33ffae978f0a9a9"},
|
|
||||||
{file = "aiohttp-3.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:6ae828d3a003f03ae31915c31fa684b9890ea44c9c989056fea96e3d12a9fa17"},
|
|
||||||
{file = "aiohttp-3.8.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0c7ebbbde809ff4e970824b2b6cb7e4222be6b95a296e46c03cf050878fc1785"},
|
|
||||||
{file = "aiohttp-3.8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b7ef7cbd4fec9a1e811a5de813311ed4f7ac7d93e0fda233c9b3e1428f7dd7b"},
|
|
||||||
{file = "aiohttp-3.8.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c3d6a4d0619e09dcd61021debf7059955c2004fa29f48788a3dfaf9c9901a7cd"},
|
|
||||||
{file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:718626a174e7e467f0558954f94af117b7d4695d48eb980146016afa4b580b2e"},
|
|
||||||
{file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:589c72667a5febd36f1315aa6e5f56dd4aa4862df295cb51c769d16142ddd7cd"},
|
|
||||||
{file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ed076098b171573161eb146afcb9129b5ff63308960aeca4b676d9d3c35e700"},
|
|
||||||
{file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:086f92daf51a032d062ec5f58af5ca6a44d082c35299c96376a41cbb33034675"},
|
|
||||||
{file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:11691cf4dc5b94236ccc609b70fec991234e7ef8d4c02dd0c9668d1e486f5abf"},
|
|
||||||
{file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:31d1e1c0dbf19ebccbfd62eff461518dcb1e307b195e93bba60c965a4dcf1ba0"},
|
|
||||||
{file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:11a67c0d562e07067c4e86bffc1553f2cf5b664d6111c894671b2b8712f3aba5"},
|
|
||||||
{file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:bb01ba6b0d3f6c68b89fce7305080145d4877ad3acaed424bae4d4ee75faa950"},
|
|
||||||
{file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:44db35a9e15d6fe5c40d74952e803b1d96e964f683b5a78c3cc64eb177878155"},
|
|
||||||
{file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:844a9b460871ee0a0b0b68a64890dae9c415e513db0f4a7e3cab41a0f2fedf33"},
|
|
||||||
{file = "aiohttp-3.8.1-cp38-cp38-win32.whl", hash = "sha256:7d08744e9bae2ca9c382581f7dce1273fe3c9bae94ff572c3626e8da5b193c6a"},
|
|
||||||
{file = "aiohttp-3.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:04d48b8ce6ab3cf2097b1855e1505181bdd05586ca275f2505514a6e274e8e75"},
|
|
||||||
{file = "aiohttp-3.8.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f5315a2eb0239185af1bddb1abf472d877fede3cc8d143c6cddad37678293237"},
|
|
||||||
{file = "aiohttp-3.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a996d01ca39b8dfe77440f3cd600825d05841088fd6bc0144cc6c2ec14cc5f74"},
|
|
||||||
{file = "aiohttp-3.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:13487abd2f761d4be7c8ff9080de2671e53fff69711d46de703c310c4c9317ca"},
|
|
||||||
{file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea302f34477fda3f85560a06d9ebdc7fa41e82420e892fc50b577e35fc6a50b2"},
|
|
||||||
{file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2f635ce61a89c5732537a7896b6319a8fcfa23ba09bec36e1b1ac0ab31270d2"},
|
|
||||||
{file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e999f2d0e12eea01caeecb17b653f3713d758f6dcc770417cf29ef08d3931421"},
|
|
||||||
{file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0770e2806a30e744b4e21c9d73b7bee18a1cfa3c47991ee2e5a65b887c49d5cf"},
|
|
||||||
{file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d15367ce87c8e9e09b0f989bfd72dc641bcd04ba091c68cd305312d00962addd"},
|
|
||||||
{file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6c7cefb4b0640703eb1069835c02486669312bf2f12b48a748e0a7756d0de33d"},
|
|
||||||
{file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:71927042ed6365a09a98a6377501af5c9f0a4d38083652bcd2281a06a5976724"},
|
|
||||||
{file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:28d490af82bc6b7ce53ff31337a18a10498303fe66f701ab65ef27e143c3b0ef"},
|
|
||||||
{file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:b6613280ccedf24354406caf785db748bebbddcf31408b20c0b48cb86af76866"},
|
|
||||||
{file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:81e3d8c34c623ca4e36c46524a3530e99c0bc95ed068fd6e9b55cb721d408fb2"},
|
|
||||||
{file = "aiohttp-3.8.1-cp39-cp39-win32.whl", hash = "sha256:7187a76598bdb895af0adbd2fb7474d7f6025d170bc0a1130242da817ce9e7d1"},
|
|
||||||
{file = "aiohttp-3.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:1c182cb873bc91b411e184dab7a2b664d4fea2743df0e4d57402f7f3fa644bac"},
|
|
||||||
{file = "aiohttp-3.8.1.tar.gz", hash = "sha256:fc5471e1a54de15ef71c1bc6ebe80d4dc681ea600e68bfd1cbce40427f0b7578"},
|
|
||||||
]
|
|
||||||
aiosignal = [
|
aiosignal = [
|
||||||
{file = "aiosignal-1.2.0-py3-none-any.whl", hash = "sha256:26e62109036cd181df6e6ad646f91f0dcfd05fe16d0cb924138ff2ab75d64e3a"},
|
{file = "aiosignal-1.2.0-py3-none-any.whl", hash = "sha256:26e62109036cd181df6e6ad646f91f0dcfd05fe16d0cb924138ff2ab75d64e3a"},
|
||||||
{file = "aiosignal-1.2.0.tar.gz", hash = "sha256:78ed67db6c7b7ced4f98e495e572106d5c432a93e1ddd1bf475e1dc05f5b7df2"},
|
{file = "aiosignal-1.2.0.tar.gz", hash = "sha256:78ed67db6c7b7ced4f98e495e572106d5c432a93e1ddd1bf475e1dc05f5b7df2"},
|
||||||
@@ -930,201 +857,46 @@ asynctest = [
|
|||||||
{file = "asynctest-0.13.0-py3-none-any.whl", hash = "sha256:5da6118a7e6d6b54d83a8f7197769d046922a44d2a99c21382f0a6e4fadae676"},
|
{file = "asynctest-0.13.0-py3-none-any.whl", hash = "sha256:5da6118a7e6d6b54d83a8f7197769d046922a44d2a99c21382f0a6e4fadae676"},
|
||||||
{file = "asynctest-0.13.0.tar.gz", hash = "sha256:c27862842d15d83e6a34eb0b2866c323880eb3a75e4485b079ea11748fd77fac"},
|
{file = "asynctest-0.13.0.tar.gz", hash = "sha256:c27862842d15d83e6a34eb0b2866c323880eb3a75e4485b079ea11748fd77fac"},
|
||||||
]
|
]
|
||||||
attrs = [
|
attrs = []
|
||||||
{file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"},
|
black = []
|
||||||
{file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"},
|
|
||||||
]
|
|
||||||
black = [
|
|
||||||
{file = "black-22.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce957f1d6b78a8a231b18e0dd2d94a33d2ba738cd88a7fe64f53f659eea49fdd"},
|
|
||||||
{file = "black-22.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5107ea36b2b61917956d018bd25129baf9ad1125e39324a9b18248d362156a27"},
|
|
||||||
{file = "black-22.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8166b7bfe5dcb56d325385bd1d1e0f635f24aae14b3ae437102dedc0c186747"},
|
|
||||||
{file = "black-22.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd82842bb272297503cbec1a2600b6bfb338dae017186f8f215c8958f8acf869"},
|
|
||||||
{file = "black-22.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d839150f61d09e7217f52917259831fe2b689f5c8e5e32611736351b89bb2a90"},
|
|
||||||
{file = "black-22.8.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a05da0430bd5ced89176db098567973be52ce175a55677436a271102d7eaa3fe"},
|
|
||||||
{file = "black-22.8.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a098a69a02596e1f2a58a2a1c8d5a05d5a74461af552b371e82f9fa4ada8342"},
|
|
||||||
{file = "black-22.8.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5594efbdc35426e35a7defa1ea1a1cb97c7dbd34c0e49af7fb593a36bd45edab"},
|
|
||||||
{file = "black-22.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a983526af1bea1e4cf6768e649990f28ee4f4137266921c2c3cee8116ae42ec3"},
|
|
||||||
{file = "black-22.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b2c25f8dea5e8444bdc6788a2f543e1fb01494e144480bc17f806178378005e"},
|
|
||||||
{file = "black-22.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:78dd85caaab7c3153054756b9fe8c611efa63d9e7aecfa33e533060cb14b6d16"},
|
|
||||||
{file = "black-22.8.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:cea1b2542d4e2c02c332e83150e41e3ca80dc0fb8de20df3c5e98e242156222c"},
|
|
||||||
{file = "black-22.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5b879eb439094751185d1cfdca43023bc6786bd3c60372462b6f051efa6281a5"},
|
|
||||||
{file = "black-22.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0a12e4e1353819af41df998b02c6742643cfef58282915f781d0e4dd7a200411"},
|
|
||||||
{file = "black-22.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3a73f66b6d5ba7288cd5d6dad9b4c9b43f4e8a4b789a94bf5abfb878c663eb3"},
|
|
||||||
{file = "black-22.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:e981e20ec152dfb3e77418fb616077937378b322d7b26aa1ff87717fb18b4875"},
|
|
||||||
{file = "black-22.8.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8ce13ffed7e66dda0da3e0b2eb1bdfc83f5812f66e09aca2b0978593ed636b6c"},
|
|
||||||
{file = "black-22.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:32a4b17f644fc288c6ee2bafdf5e3b045f4eff84693ac069d87b1a347d861497"},
|
|
||||||
{file = "black-22.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ad827325a3a634bae88ae7747db1a395d5ee02cf05d9aa7a9bd77dfb10e940c"},
|
|
||||||
{file = "black-22.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53198e28a1fb865e9fe97f88220da2e44df6da82b18833b588b1883b16bb5d41"},
|
|
||||||
{file = "black-22.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:bc4d4123830a2d190e9cc42a2e43570f82ace35c3aeb26a512a2102bce5af7ec"},
|
|
||||||
{file = "black-22.8.0-py3-none-any.whl", hash = "sha256:d2c21d439b2baf7aa80d6dd4e3659259be64c6f49dfd0f32091063db0e006db4"},
|
|
||||||
{file = "black-22.8.0.tar.gz", hash = "sha256:792f7eb540ba9a17e8656538701d3eb1afcb134e3b45b71f20b25c77a8db7e6e"},
|
|
||||||
]
|
|
||||||
cached-property = [
|
cached-property = [
|
||||||
{file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"},
|
{file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"},
|
||||||
{file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"},
|
{file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"},
|
||||||
]
|
]
|
||||||
certifi = [
|
certifi = []
|
||||||
{file = "certifi-2022.9.14-py3-none-any.whl", hash = "sha256:e232343de1ab72c2aa521b625c80f699e356830fd0e2c620b465b304b17b0516"},
|
|
||||||
{file = "certifi-2022.9.14.tar.gz", hash = "sha256:36973885b9542e6bd01dea287b2b4b3b21236307c56324fcc3f1160f2d655ed5"},
|
|
||||||
]
|
|
||||||
cfgv = [
|
cfgv = [
|
||||||
{file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"},
|
{file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"},
|
||||||
{file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"},
|
{file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"},
|
||||||
]
|
]
|
||||||
charset-normalizer = [
|
charset-normalizer = []
|
||||||
{file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"},
|
|
||||||
{file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"},
|
|
||||||
]
|
|
||||||
click = [
|
click = [
|
||||||
{file = "click-8.1.2-py3-none-any.whl", hash = "sha256:24e1a4a9ec5bf6299411369b208c1df2188d9eb8d916302fe6bf03faed227f1e"},
|
{file = "click-8.1.2-py3-none-any.whl", hash = "sha256:24e1a4a9ec5bf6299411369b208c1df2188d9eb8d916302fe6bf03faed227f1e"},
|
||||||
{file = "click-8.1.2.tar.gz", hash = "sha256:479707fe14d9ec9a0757618b7a100a0ae4c4e236fac5b7f80ca68028141a1a72"},
|
{file = "click-8.1.2.tar.gz", hash = "sha256:479707fe14d9ec9a0757618b7a100a0ae4c4e236fac5b7f80ca68028141a1a72"},
|
||||||
]
|
]
|
||||||
colorama = []
|
colorama = [
|
||||||
colored = [
|
{file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"},
|
||||||
{file = "colored-1.4.3.tar.gz", hash = "sha256:b7b48b9f40e8a65bbb54813d5d79dd008dc8b8c5638d5bbfd30fc5a82e6def7a"},
|
{file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"},
|
||||||
]
|
]
|
||||||
|
colored = []
|
||||||
commonmark = [
|
commonmark = [
|
||||||
{file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"},
|
{file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"},
|
||||||
{file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"},
|
{file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"},
|
||||||
]
|
]
|
||||||
coverage = [
|
coverage = []
|
||||||
{file = "coverage-6.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e7b4da9bafad21ea45a714d3ea6f3e1679099e420c8741c74905b92ee9bfa7cc"},
|
distlib = []
|
||||||
{file = "coverage-6.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fde17bc42e0716c94bf19d92e4c9f5a00c5feb401f5bc01101fdf2a8b7cacf60"},
|
filelock = []
|
||||||
{file = "coverage-6.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdbb0d89923c80dbd435b9cf8bba0ff55585a3cdb28cbec65f376c041472c60d"},
|
frozenlist = []
|
||||||
{file = "coverage-6.4.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:67f9346aeebea54e845d29b487eb38ec95f2ecf3558a3cffb26ee3f0dcc3e760"},
|
|
||||||
{file = "coverage-6.4.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42c499c14efd858b98c4e03595bf914089b98400d30789511577aa44607a1b74"},
|
|
||||||
{file = "coverage-6.4.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c35cca192ba700979d20ac43024a82b9b32a60da2f983bec6c0f5b84aead635c"},
|
|
||||||
{file = "coverage-6.4.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9cc4f107009bca5a81caef2fca843dbec4215c05e917a59dec0c8db5cff1d2aa"},
|
|
||||||
{file = "coverage-6.4.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5f444627b3664b80d078c05fe6a850dd711beeb90d26731f11d492dcbadb6973"},
|
|
||||||
{file = "coverage-6.4.4-cp310-cp310-win32.whl", hash = "sha256:66e6df3ac4659a435677d8cd40e8eb1ac7219345d27c41145991ee9bf4b806a0"},
|
|
||||||
{file = "coverage-6.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:35ef1f8d8a7a275aa7410d2f2c60fa6443f4a64fae9be671ec0696a68525b875"},
|
|
||||||
{file = "coverage-6.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c1328d0c2f194ffda30a45f11058c02410e679456276bfa0bbe0b0ee87225fac"},
|
|
||||||
{file = "coverage-6.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61b993f3998ee384935ee423c3d40894e93277f12482f6e777642a0141f55782"},
|
|
||||||
{file = "coverage-6.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d5dd4b8e9cd0deb60e6fcc7b0647cbc1da6c33b9e786f9c79721fd303994832f"},
|
|
||||||
{file = "coverage-6.4.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7026f5afe0d1a933685d8f2169d7c2d2e624f6255fb584ca99ccca8c0e966fd7"},
|
|
||||||
{file = "coverage-6.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9c7b9b498eb0c0d48b4c2abc0e10c2d78912203f972e0e63e3c9dc21f15abdaa"},
|
|
||||||
{file = "coverage-6.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ee2b2fb6eb4ace35805f434e0f6409444e1466a47f620d1d5763a22600f0f892"},
|
|
||||||
{file = "coverage-6.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ab066f5ab67059d1f1000b5e1aa8bbd75b6ed1fc0014559aea41a9eb66fc2ce0"},
|
|
||||||
{file = "coverage-6.4.4-cp311-cp311-win32.whl", hash = "sha256:9d6e1f3185cbfd3d91ac77ea065d85d5215d3dfa45b191d14ddfcd952fa53796"},
|
|
||||||
{file = "coverage-6.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:e3d3c4cc38b2882f9a15bafd30aec079582b819bec1b8afdbde8f7797008108a"},
|
|
||||||
{file = "coverage-6.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a095aa0a996ea08b10580908e88fbaf81ecf798e923bbe64fb98d1807db3d68a"},
|
|
||||||
{file = "coverage-6.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef6f44409ab02e202b31a05dd6666797f9de2aa2b4b3534e9d450e42dea5e817"},
|
|
||||||
{file = "coverage-6.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b7101938584d67e6f45f0015b60e24a95bf8dea19836b1709a80342e01b472f"},
|
|
||||||
{file = "coverage-6.4.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14a32ec68d721c3d714d9b105c7acf8e0f8a4f4734c811eda75ff3718570b5e3"},
|
|
||||||
{file = "coverage-6.4.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6a864733b22d3081749450466ac80698fe39c91cb6849b2ef8752fd7482011f3"},
|
|
||||||
{file = "coverage-6.4.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:08002f9251f51afdcc5e3adf5d5d66bb490ae893d9e21359b085f0e03390a820"},
|
|
||||||
{file = "coverage-6.4.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a3b2752de32c455f2521a51bd3ffb53c5b3ae92736afde67ce83477f5c1dd928"},
|
|
||||||
{file = "coverage-6.4.4-cp37-cp37m-win32.whl", hash = "sha256:f855b39e4f75abd0dfbcf74a82e84ae3fc260d523fcb3532786bcbbcb158322c"},
|
|
||||||
{file = "coverage-6.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ee6ae6bbcac0786807295e9687169fba80cb0617852b2fa118a99667e8e6815d"},
|
|
||||||
{file = "coverage-6.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:564cd0f5b5470094df06fab676c6d77547abfdcb09b6c29c8a97c41ad03b103c"},
|
|
||||||
{file = "coverage-6.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cbbb0e4cd8ddcd5ef47641cfac97d8473ab6b132dd9a46bacb18872828031685"},
|
|
||||||
{file = "coverage-6.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6113e4df2fa73b80f77663445be6d567913fb3b82a86ceb64e44ae0e4b695de1"},
|
|
||||||
{file = "coverage-6.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8d032bfc562a52318ae05047a6eb801ff31ccee172dc0d2504614e911d8fa83e"},
|
|
||||||
{file = "coverage-6.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e431e305a1f3126477abe9a184624a85308da8edf8486a863601d58419d26ffa"},
|
|
||||||
{file = "coverage-6.4.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cf2afe83a53f77aec067033199797832617890e15bed42f4a1a93ea24794ae3e"},
|
|
||||||
{file = "coverage-6.4.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:783bc7c4ee524039ca13b6d9b4186a67f8e63d91342c713e88c1865a38d0892a"},
|
|
||||||
{file = "coverage-6.4.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ff934ced84054b9018665ca3967fc48e1ac99e811f6cc99ea65978e1d384454b"},
|
|
||||||
{file = "coverage-6.4.4-cp38-cp38-win32.whl", hash = "sha256:e1fabd473566fce2cf18ea41171d92814e4ef1495e04471786cbc943b89a3781"},
|
|
||||||
{file = "coverage-6.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:4179502f210ebed3ccfe2f78bf8e2d59e50b297b598b100d6c6e3341053066a2"},
|
|
||||||
{file = "coverage-6.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:98c0b9e9b572893cdb0a00e66cf961a238f8d870d4e1dc8e679eb8bdc2eb1b86"},
|
|
||||||
{file = "coverage-6.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fc600f6ec19b273da1d85817eda339fb46ce9eef3e89f220055d8696e0a06908"},
|
|
||||||
{file = "coverage-6.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a98d6bf6d4ca5c07a600c7b4e0c5350cd483c85c736c522b786be90ea5bac4f"},
|
|
||||||
{file = "coverage-6.4.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01778769097dbd705a24e221f42be885c544bb91251747a8a3efdec6eb4788f2"},
|
|
||||||
{file = "coverage-6.4.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfa0b97eb904255e2ab24166071b27408f1f69c8fbda58e9c0972804851e0558"},
|
|
||||||
{file = "coverage-6.4.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:fcbe3d9a53e013f8ab88734d7e517eb2cd06b7e689bedf22c0eb68db5e4a0a19"},
|
|
||||||
{file = "coverage-6.4.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:15e38d853ee224e92ccc9a851457fb1e1f12d7a5df5ae44544ce7863691c7a0d"},
|
|
||||||
{file = "coverage-6.4.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6913dddee2deff8ab2512639c5168c3e80b3ebb0f818fed22048ee46f735351a"},
|
|
||||||
{file = "coverage-6.4.4-cp39-cp39-win32.whl", hash = "sha256:354df19fefd03b9a13132fa6643527ef7905712109d9c1c1903f2133d3a4e145"},
|
|
||||||
{file = "coverage-6.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:1238b08f3576201ebf41f7c20bf59baa0d05da941b123c6656e42cdb668e9827"},
|
|
||||||
{file = "coverage-6.4.4-pp36.pp37.pp38-none-any.whl", hash = "sha256:f67cf9f406cf0d2f08a3515ce2db5b82625a7257f88aad87904674def6ddaec1"},
|
|
||||||
{file = "coverage-6.4.4.tar.gz", hash = "sha256:e16c45b726acb780e1e6f88b286d3c10b3914ab03438f32117c4aa52d7f30d58"},
|
|
||||||
]
|
|
||||||
distlib = [
|
|
||||||
{file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"},
|
|
||||||
{file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"},
|
|
||||||
]
|
|
||||||
filelock = [
|
|
||||||
{file = "filelock-3.8.0-py3-none-any.whl", hash = "sha256:617eb4e5eedc82fc5f47b6d61e4d11cb837c56cb4544e39081099fa17ad109d4"},
|
|
||||||
{file = "filelock-3.8.0.tar.gz", hash = "sha256:55447caa666f2198c5b6b13a26d2084d26fa5b115c00d065664b2124680c4edc"},
|
|
||||||
]
|
|
||||||
frozenlist = [
|
|
||||||
{file = "frozenlist-1.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5f271c93f001748fc26ddea409241312a75e13466b06c94798d1a341cf0e6989"},
|
|
||||||
{file = "frozenlist-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9c6ef8014b842f01f5d2b55315f1af5cbfde284eb184075c189fd657c2fd8204"},
|
|
||||||
{file = "frozenlist-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:219a9676e2eae91cb5cc695a78b4cb43d8123e4160441d2b6ce8d2c70c60e2f3"},
|
|
||||||
{file = "frozenlist-1.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b47d64cdd973aede3dd71a9364742c542587db214e63b7529fbb487ed67cddd9"},
|
|
||||||
{file = "frozenlist-1.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2af6f7a4e93f5d08ee3f9152bce41a6015b5cf87546cb63872cc19b45476e98a"},
|
|
||||||
{file = "frozenlist-1.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a718b427ff781c4f4e975525edb092ee2cdef6a9e7bc49e15063b088961806f8"},
|
|
||||||
{file = "frozenlist-1.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c56c299602c70bc1bb5d1e75f7d8c007ca40c9d7aebaf6e4ba52925d88ef826d"},
|
|
||||||
{file = "frozenlist-1.3.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:717470bfafbb9d9be624da7780c4296aa7935294bd43a075139c3d55659038ca"},
|
|
||||||
{file = "frozenlist-1.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:31b44f1feb3630146cffe56344704b730c33e042ffc78d21f2125a6a91168131"},
|
|
||||||
{file = "frozenlist-1.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c3b31180b82c519b8926e629bf9f19952c743e089c41380ddca5db556817b221"},
|
|
||||||
{file = "frozenlist-1.3.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d82bed73544e91fb081ab93e3725e45dd8515c675c0e9926b4e1f420a93a6ab9"},
|
|
||||||
{file = "frozenlist-1.3.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49459f193324fbd6413e8e03bd65789e5198a9fa3095e03f3620dee2f2dabff2"},
|
|
||||||
{file = "frozenlist-1.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:94e680aeedc7fd3b892b6fa8395b7b7cc4b344046c065ed4e7a1e390084e8cb5"},
|
|
||||||
{file = "frozenlist-1.3.1-cp310-cp310-win32.whl", hash = "sha256:fabb953ab913dadc1ff9dcc3a7a7d3dc6a92efab3a0373989b8063347f8705be"},
|
|
||||||
{file = "frozenlist-1.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:eee0c5ecb58296580fc495ac99b003f64f82a74f9576a244d04978a7e97166db"},
|
|
||||||
{file = "frozenlist-1.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0bc75692fb3770cf2b5856a6c2c9de967ca744863c5e89595df64e252e4b3944"},
|
|
||||||
{file = "frozenlist-1.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086ca1ac0a40e722d6833d4ce74f5bf1aba2c77cbfdc0cd83722ffea6da52a04"},
|
|
||||||
{file = "frozenlist-1.3.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1b51eb355e7f813bcda00276b0114c4172872dc5fb30e3fea059b9367c18fbcb"},
|
|
||||||
{file = "frozenlist-1.3.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:74140933d45271c1a1283f708c35187f94e1256079b3c43f0c2267f9db5845ff"},
|
|
||||||
{file = "frozenlist-1.3.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee4c5120ddf7d4dd1eaf079af3af7102b56d919fa13ad55600a4e0ebe532779b"},
|
|
||||||
{file = "frozenlist-1.3.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97d9e00f3ac7c18e685320601f91468ec06c58acc185d18bb8e511f196c8d4b2"},
|
|
||||||
{file = "frozenlist-1.3.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6e19add867cebfb249b4e7beac382d33215d6d54476bb6be46b01f8cafb4878b"},
|
|
||||||
{file = "frozenlist-1.3.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a027f8f723d07c3f21963caa7d585dcc9b089335565dabe9c814b5f70c52705a"},
|
|
||||||
{file = "frozenlist-1.3.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:61d7857950a3139bce035ad0b0945f839532987dfb4c06cfe160254f4d19df03"},
|
|
||||||
{file = "frozenlist-1.3.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:53b2b45052e7149ee8b96067793db8ecc1ae1111f2f96fe1f88ea5ad5fd92d10"},
|
|
||||||
{file = "frozenlist-1.3.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bbb1a71b1784e68870800b1bc9f3313918edc63dbb8f29fbd2e767ce5821696c"},
|
|
||||||
{file = "frozenlist-1.3.1-cp37-cp37m-win32.whl", hash = "sha256:ab6fa8c7871877810e1b4e9392c187a60611fbf0226a9e0b11b7b92f5ac72792"},
|
|
||||||
{file = "frozenlist-1.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f89139662cc4e65a4813f4babb9ca9544e42bddb823d2ec434e18dad582543bc"},
|
|
||||||
{file = "frozenlist-1.3.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4c0c99e31491a1d92cde8648f2e7ccad0e9abb181f6ac3ddb9fc48b63301808e"},
|
|
||||||
{file = "frozenlist-1.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:61e8cb51fba9f1f33887e22488bad1e28dd8325b72425f04517a4d285a04c519"},
|
|
||||||
{file = "frozenlist-1.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc2f3e368ee5242a2cbe28323a866656006382872c40869b49b265add546703f"},
|
|
||||||
{file = "frozenlist-1.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58fb94a01414cddcdc6839807db77ae8057d02ddafc94a42faee6004e46c9ba8"},
|
|
||||||
{file = "frozenlist-1.3.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:022178b277cb9277d7d3b3f2762d294f15e85cd2534047e68a118c2bb0058f3e"},
|
|
||||||
{file = "frozenlist-1.3.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:572ce381e9fe027ad5e055f143763637dcbac2542cfe27f1d688846baeef5170"},
|
|
||||||
{file = "frozenlist-1.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19127f8dcbc157ccb14c30e6f00392f372ddb64a6ffa7106b26ff2196477ee9f"},
|
|
||||||
{file = "frozenlist-1.3.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42719a8bd3792744c9b523674b752091a7962d0d2d117f0b417a3eba97d1164b"},
|
|
||||||
{file = "frozenlist-1.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2743bb63095ef306041c8f8ea22bd6e4d91adabf41887b1ad7886c4c1eb43d5f"},
|
|
||||||
{file = "frozenlist-1.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:fa47319a10e0a076709644a0efbcaab9e91902c8bd8ef74c6adb19d320f69b83"},
|
|
||||||
{file = "frozenlist-1.3.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:52137f0aea43e1993264a5180c467a08a3e372ca9d378244c2d86133f948b26b"},
|
|
||||||
{file = "frozenlist-1.3.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:f5abc8b4d0c5b556ed8cd41490b606fe99293175a82b98e652c3f2711b452988"},
|
|
||||||
{file = "frozenlist-1.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1e1cf7bc8cbbe6ce3881863671bac258b7d6bfc3706c600008925fb799a256e2"},
|
|
||||||
{file = "frozenlist-1.3.1-cp38-cp38-win32.whl", hash = "sha256:0dde791b9b97f189874d654c55c24bf7b6782343e14909c84beebd28b7217845"},
|
|
||||||
{file = "frozenlist-1.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:9494122bf39da6422b0972c4579e248867b6b1b50c9b05df7e04a3f30b9a413d"},
|
|
||||||
{file = "frozenlist-1.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:31bf9539284f39ff9398deabf5561c2b0da5bb475590b4e13dd8b268d7a3c5c1"},
|
|
||||||
{file = "frozenlist-1.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e0c8c803f2f8db7217898d11657cb6042b9b0553a997c4a0601f48a691480fab"},
|
|
||||||
{file = "frozenlist-1.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da5ba7b59d954f1f214d352308d1d86994d713b13edd4b24a556bcc43d2ddbc3"},
|
|
||||||
{file = "frozenlist-1.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74e6b2b456f21fc93ce1aff2b9728049f1464428ee2c9752a4b4f61e98c4db96"},
|
|
||||||
{file = "frozenlist-1.3.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:526d5f20e954d103b1d47232e3839f3453c02077b74203e43407b962ab131e7b"},
|
|
||||||
{file = "frozenlist-1.3.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b499c6abe62a7a8d023e2c4b2834fce78a6115856ae95522f2f974139814538c"},
|
|
||||||
{file = "frozenlist-1.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab386503f53bbbc64d1ad4b6865bf001414930841a870fc97f1546d4d133f141"},
|
|
||||||
{file = "frozenlist-1.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f63c308f82a7954bf8263a6e6de0adc67c48a8b484fab18ff87f349af356efd"},
|
|
||||||
{file = "frozenlist-1.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:12607804084d2244a7bd4685c9d0dca5df17a6a926d4f1967aa7978b1028f89f"},
|
|
||||||
{file = "frozenlist-1.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:da1cdfa96425cbe51f8afa43e392366ed0b36ce398f08b60de6b97e3ed4affef"},
|
|
||||||
{file = "frozenlist-1.3.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f810e764617b0748b49a731ffaa525d9bb36ff38332411704c2400125af859a6"},
|
|
||||||
{file = "frozenlist-1.3.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:35c3d79b81908579beb1fb4e7fcd802b7b4921f1b66055af2578ff7734711cfa"},
|
|
||||||
{file = "frozenlist-1.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c92deb5d9acce226a501b77307b3b60b264ca21862bd7d3e0c1f3594022f01bc"},
|
|
||||||
{file = "frozenlist-1.3.1-cp39-cp39-win32.whl", hash = "sha256:5e77a8bd41e54b05e4fb2708dc6ce28ee70325f8c6f50f3df86a44ecb1d7a19b"},
|
|
||||||
{file = "frozenlist-1.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:625d8472c67f2d96f9a4302a947f92a7adbc1e20bedb6aff8dbc8ff039ca6189"},
|
|
||||||
{file = "frozenlist-1.3.1.tar.gz", hash = "sha256:3a735e4211a04ccfa3f4833547acdf5d2f863bfeb01cfd3edaffbc251f15cec8"},
|
|
||||||
]
|
|
||||||
ghp-import = [
|
ghp-import = [
|
||||||
{file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"},
|
{file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"},
|
||||||
{file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"},
|
{file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"},
|
||||||
]
|
]
|
||||||
griffe = [
|
griffe = []
|
||||||
{file = "griffe-0.22.1-py3-none-any.whl", hash = "sha256:60b7906db5460277afdba17808ade1c9e099b20a6b8d8d1d152714daaa463cb7"},
|
identify = []
|
||||||
{file = "griffe-0.22.1.tar.gz", hash = "sha256:0130019b0b3966e9d755d9acb82fe9b64e354064ce971306e5892c098bf1a5c7"},
|
idna = []
|
||||||
|
importlib-metadata = [
|
||||||
|
{file = "importlib_metadata-4.12.0-py3-none-any.whl", hash = "sha256:7401a975809ea1fdc658c3aa4f78cc2195a0e019c5cbc4c06122884e9ae80c23"},
|
||||||
|
{file = "importlib_metadata-4.12.0.tar.gz", hash = "sha256:637245b8bab2b6502fcbc752cc4b7a6f6243bb02b31c5c26156ad103d3d45670"},
|
||||||
]
|
]
|
||||||
identify = [
|
|
||||||
{file = "identify-2.5.5-py2.py3-none-any.whl", hash = "sha256:ef78c0d96098a3b5fe7720be4a97e73f439af7cf088ebf47b620aeaa10fadf97"},
|
|
||||||
{file = "identify-2.5.5.tar.gz", hash = "sha256:322a5699daecf7c6fd60e68852f36f2ecbb6a36ff6e6e973e0d2bb6fca203ee6"},
|
|
||||||
]
|
|
||||||
idna = [
|
|
||||||
{file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"},
|
|
||||||
{file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"},
|
|
||||||
]
|
|
||||||
importlib-metadata = []
|
|
||||||
iniconfig = [
|
iniconfig = [
|
||||||
{file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"},
|
{file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"},
|
||||||
{file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"},
|
{file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"},
|
||||||
@@ -1183,18 +955,12 @@ mergedeep = [
|
|||||||
{file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"},
|
{file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"},
|
||||||
{file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"},
|
{file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"},
|
||||||
]
|
]
|
||||||
mkdocs = [
|
mkdocs = []
|
||||||
{file = "mkdocs-1.3.1-py3-none-any.whl", hash = "sha256:fda92466393127d2da830bc6edc3a625a14b436316d1caf347690648e774c4f0"},
|
|
||||||
{file = "mkdocs-1.3.1.tar.gz", hash = "sha256:a41a2ff25ce3bbacc953f9844ba07d106233cd76c88bac1f59cb1564ac0d87ed"},
|
|
||||||
]
|
|
||||||
mkdocs-autorefs = [
|
mkdocs-autorefs = [
|
||||||
{file = "mkdocs-autorefs-0.4.1.tar.gz", hash = "sha256:70748a7bd025f9ecd6d6feeba8ba63f8e891a1af55f48e366d6d6e78493aba84"},
|
{file = "mkdocs-autorefs-0.4.1.tar.gz", hash = "sha256:70748a7bd025f9ecd6d6feeba8ba63f8e891a1af55f48e366d6d6e78493aba84"},
|
||||||
{file = "mkdocs_autorefs-0.4.1-py3-none-any.whl", hash = "sha256:a2248a9501b29dc0cc8ba4c09f4f47ff121945f6ce33d760f145d6f89d313f5b"},
|
{file = "mkdocs_autorefs-0.4.1-py3-none-any.whl", hash = "sha256:a2248a9501b29dc0cc8ba4c09f4f47ff121945f6ce33d760f145d6f89d313f5b"},
|
||||||
]
|
]
|
||||||
mkdocs-material = [
|
mkdocs-material = []
|
||||||
{file = "mkdocs_material-8.5.3-py3-none-any.whl", hash = "sha256:d194c38041d1e83560221022b3f85eec4604b35e44f5c3a488c24b88542074ed"},
|
|
||||||
{file = "mkdocs_material-8.5.3.tar.gz", hash = "sha256:43b0aa707d6f9acd836024cab2dce9330957c94a4e1e41c23ee6c8ce67b4d8c5"},
|
|
||||||
]
|
|
||||||
mkdocs-material-extensions = [
|
mkdocs-material-extensions = [
|
||||||
{file = "mkdocs-material-extensions-1.0.3.tar.gz", hash = "sha256:bfd24dfdef7b41c312ede42648f9eb83476ea168ec163b613f9abd12bbfddba2"},
|
{file = "mkdocs-material-extensions-1.0.3.tar.gz", hash = "sha256:bfd24dfdef7b41c312ede42648f9eb83476ea168ec163b613f9abd12bbfddba2"},
|
||||||
{file = "mkdocs_material_extensions-1.0.3-py3-none-any.whl", hash = "sha256:a82b70e533ce060b2a5d9eb2bc2e1be201cf61f901f93704b4acf6e3d5983a44"},
|
{file = "mkdocs_material_extensions-1.0.3-py3-none-any.whl", hash = "sha256:a82b70e533ce060b2a5d9eb2bc2e1be201cf61f901f93704b4acf6e3d5983a44"},
|
||||||
@@ -1351,19 +1117,16 @@ mypy-extensions = [
|
|||||||
{file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"},
|
{file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"},
|
||||||
{file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"},
|
{file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"},
|
||||||
]
|
]
|
||||||
nanoid = [
|
nanoid = []
|
||||||
{file = "nanoid-2.0.0-py3-none-any.whl", hash = "sha256:90aefa650e328cffb0893bbd4c236cfd44c48bc1f2d0b525ecc53c3187b653bb"},
|
nodeenv = [
|
||||||
{file = "nanoid-2.0.0.tar.gz", hash = "sha256:5a80cad5e9c6e9ae3a41fa2fb34ae189f7cb420b2a5d8f82bd9d23466e4efa68"},
|
{file = "nodeenv-1.7.0-py2.py3-none-any.whl", hash = "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e"},
|
||||||
|
{file = "nodeenv-1.7.0.tar.gz", hash = "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b"},
|
||||||
]
|
]
|
||||||
nodeenv = []
|
|
||||||
packaging = [
|
packaging = [
|
||||||
{file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"},
|
{file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"},
|
||||||
{file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"},
|
{file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"},
|
||||||
]
|
]
|
||||||
pathspec = [
|
pathspec = []
|
||||||
{file = "pathspec-0.10.1-py3-none-any.whl", hash = "sha256:46846318467efc4556ccfd27816e004270a9eeeeb4d062ce5e6fc7a87c573f93"},
|
|
||||||
{file = "pathspec-0.10.1.tar.gz", hash = "sha256:7ace6161b621d31e7902eb6b5ae148d12cfd23f4a249b9ffb6b9fee12084323d"},
|
|
||||||
]
|
|
||||||
platformdirs = [
|
platformdirs = [
|
||||||
{file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"},
|
{file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"},
|
||||||
{file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"},
|
{file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"},
|
||||||
@@ -1377,10 +1140,7 @@ py = [
|
|||||||
{file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"},
|
{file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"},
|
||||||
{file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"},
|
{file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"},
|
||||||
]
|
]
|
||||||
pygments = [
|
pygments = []
|
||||||
{file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"},
|
|
||||||
{file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"},
|
|
||||||
]
|
|
||||||
pymdown-extensions = [
|
pymdown-extensions = [
|
||||||
{file = "pymdown_extensions-9.5-py3-none-any.whl", hash = "sha256:ec141c0f4983755349f0c8710416348d1a13753976c028186ed14f190c8061c4"},
|
{file = "pymdown_extensions-9.5-py3-none-any.whl", hash = "sha256:ec141c0f4983755349f0c8710416348d1a13753976c028186ed14f190c8061c4"},
|
||||||
{file = "pymdown_extensions-9.5.tar.gz", hash = "sha256:3ef2d998c0d5fa7eb09291926d90d69391283561cf6306f85cd588a5eb5befa0"},
|
{file = "pymdown_extensions-9.5.tar.gz", hash = "sha256:3ef2d998c0d5fa7eb09291926d90d69391283561cf6306f85cd588a5eb5befa0"},
|
||||||
@@ -1389,18 +1149,12 @@ pyparsing = [
|
|||||||
{file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"},
|
{file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"},
|
||||||
{file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"},
|
{file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"},
|
||||||
]
|
]
|
||||||
pytest = [
|
pytest = []
|
||||||
{file = "pytest-7.1.3-py3-none-any.whl", hash = "sha256:1377bda3466d70b55e3f5cecfa55bb7cfcf219c7964629b967c37cf0bda818b7"},
|
|
||||||
{file = "pytest-7.1.3.tar.gz", hash = "sha256:4f365fec2dff9c1162f834d9f18af1ba13062db0c708bf7b946f8a5c76180c39"},
|
|
||||||
]
|
|
||||||
pytest-aiohttp = [
|
pytest-aiohttp = [
|
||||||
{file = "pytest-aiohttp-1.0.4.tar.gz", hash = "sha256:39ff3a0d15484c01d1436cbedad575c6eafbf0f57cdf76fb94994c97b5b8c5a4"},
|
{file = "pytest-aiohttp-1.0.4.tar.gz", hash = "sha256:39ff3a0d15484c01d1436cbedad575c6eafbf0f57cdf76fb94994c97b5b8c5a4"},
|
||||||
{file = "pytest_aiohttp-1.0.4-py3-none-any.whl", hash = "sha256:1d2dc3a304c2be1fd496c0c2fb6b31ab60cd9fc33984f761f951f8ea1eb4ca95"},
|
{file = "pytest_aiohttp-1.0.4-py3-none-any.whl", hash = "sha256:1d2dc3a304c2be1fd496c0c2fb6b31ab60cd9fc33984f761f951f8ea1eb4ca95"},
|
||||||
]
|
]
|
||||||
pytest-asyncio = [
|
pytest-asyncio = []
|
||||||
{file = "pytest-asyncio-0.19.0.tar.gz", hash = "sha256:ac4ebf3b6207259750bc32f4c1d8fcd7e79739edbc67ad0c58dd150b1d072fed"},
|
|
||||||
{file = "pytest_asyncio-0.19.0-py3-none-any.whl", hash = "sha256:7a97e37cfe1ed296e2e84941384bdd37c376453912d397ed39293e0916f521fa"},
|
|
||||||
]
|
|
||||||
pytest-cov = [
|
pytest-cov = [
|
||||||
{file = "pytest-cov-2.12.1.tar.gz", hash = "sha256:261ceeb8c227b726249b376b8526b600f38667ee314f910353fa318caa01f4d7"},
|
{file = "pytest-cov-2.12.1.tar.gz", hash = "sha256:261ceeb8c227b726249b376b8526b600f38667ee314f910353fa318caa01f4d7"},
|
||||||
{file = "pytest_cov-2.12.1-py2.py3-none-any.whl", hash = "sha256:261bb9e47e65bd099c89c3edf92972865210c36813f80ede5277dceb77a4a62a"},
|
{file = "pytest_cov-2.12.1-py2.py3-none-any.whl", hash = "sha256:261bb9e47e65bd099c89c3edf92972865210c36813f80ede5277dceb77a4a62a"},
|
||||||
@@ -1448,74 +1202,14 @@ pyyaml-env-tag = [
|
|||||||
{file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"},
|
{file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"},
|
||||||
{file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"},
|
{file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"},
|
||||||
]
|
]
|
||||||
requests = [
|
requests = []
|
||||||
{file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"},
|
rich = []
|
||||||
{file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"},
|
|
||||||
]
|
|
||||||
rich = [
|
|
||||||
{file = "rich-12.6.0a1-py3-none-any.whl", hash = "sha256:e8b2ba10ed314c4c5bc30de39e0571ec4be05d23d733b6b7b286d0694f46bdc0"},
|
|
||||||
{file = "rich-12.6.0a1.tar.gz", hash = "sha256:48108142d113c5f03dd7946bfcdfe215ef06064eb3072866ea9c5799863ad17b"},
|
|
||||||
]
|
|
||||||
six = [
|
six = [
|
||||||
{file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
|
{file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
|
||||||
{file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
|
{file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
|
||||||
]
|
]
|
||||||
syrupy = [
|
syrupy = []
|
||||||
{file = "syrupy-3.0.0-py3-none-any.whl", hash = "sha256:e5e4d376766f46a52a3585365fb90aba0295611043a41a760302d2cd7aa74488"},
|
time-machine = []
|
||||||
{file = "syrupy-3.0.0.tar.gz", hash = "sha256:e1e2b6504c85c871fed89b82ce1d02442cf7b622b4b88f95c1332e71e012cd86"},
|
|
||||||
]
|
|
||||||
time-machine = [
|
|
||||||
{file = "time-machine-2.8.1.tar.gz", hash = "sha256:4779029fa192fc36f782c1032a44be76ce8b75b1f0b7ec746647cb950b620bb7"},
|
|
||||||
{file = "time_machine-2.8.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:35165f05fa95c41ecfde4c3fc1c0337c2a9aec1e98a8bb968f9b9c411b958f38"},
|
|
||||||
{file = "time_machine-2.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f2181d7b039c178afd79e99bb40044d5bdd10a42dcef5df1aec3e3a8a7a8875b"},
|
|
||||||
{file = "time_machine-2.8.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed139cf6f0d7b75a11fd6f976710d88d06b005e39aff24989b0ab62432173c40"},
|
|
||||||
{file = "time_machine-2.8.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c24b9cc934d4a6f66e9e3c04fd29afa1bafa673c36048d813cc45b871a53d998"},
|
|
||||||
{file = "time_machine-2.8.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a89019373e3ab96f190d801e20bccfe784a3b435dc4f68c92274990ec334dbc4"},
|
|
||||||
{file = "time_machine-2.8.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:461f1e5542b0f618800e25aa37bdd15d5448d16a8830bdb30bd82c6ea82501f2"},
|
|
||||||
{file = "time_machine-2.8.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:838198fb828bd0325b75aee0374506675c71b0a04a50b55a239463ee2b4a9c8d"},
|
|
||||||
{file = "time_machine-2.8.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9c9630fbaed937df18a13b89c61754cd4600b95edef9ffb74a0f55d1d44f3d1d"},
|
|
||||||
{file = "time_machine-2.8.1-cp310-cp310-win32.whl", hash = "sha256:b4c57f4d6bd02785992c55b2b7db05f391ab4bd6d94da866b88fea44cd635563"},
|
|
||||||
{file = "time_machine-2.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:4828d0b841107fe703bdfe9c6d26526c9e17e3e4a7c6a2853e9477148dce7f93"},
|
|
||||||
{file = "time_machine-2.8.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7f21b652dc8111d51272ce342d1d248b7a61c0464aac084ea819745ac53b203b"},
|
|
||||||
{file = "time_machine-2.8.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1c11710c06e32a0b559f09d15e346153afd1501af3d5dec42df2acbdfcee9072"},
|
|
||||||
{file = "time_machine-2.8.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:692082efc62d9071233a1ea558be0eb50e5fbf6db5103eee9c5ba8adebf33734"},
|
|
||||||
{file = "time_machine-2.8.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:41a5236b0a5b7301969d3d8ed69672f274ecff40392a00f2129cc9ba707ef5ab"},
|
|
||||||
{file = "time_machine-2.8.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79f82fc26078a0b0503a103ecef3830885af1950470ee6467ab22530ca99f94c"},
|
|
||||||
{file = "time_machine-2.8.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:18099c2ac06c1ce7e5dd380d86e22be4cfa58d11826ab8fd95a04c4eba54593b"},
|
|
||||||
{file = "time_machine-2.8.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0d45c2e485d8bde26f6db6188a2d760ff130c017258e8987d221fa78bcd48bee"},
|
|
||||||
{file = "time_machine-2.8.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:127ba425bed80afc16dbff97f9bae0dc3dc1584c98eed16bd4b7d935638e4a78"},
|
|
||||||
{file = "time_machine-2.8.1-cp311-cp311-win32.whl", hash = "sha256:f9f428a5308a293053d0859ed0963aff08ae530fe1ff20143c302b0f1a8bf32c"},
|
|
||||||
{file = "time_machine-2.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:53cd5c30e8624b6852aa474b359a90e6eda8d934fc57c17b62034b42c65dd4d0"},
|
|
||||||
{file = "time_machine-2.8.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:740116c5920775c0cd4b26f2c7bbf71f697974a69c42d51892d69cf224c38e76"},
|
|
||||||
{file = "time_machine-2.8.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8e39bf398d741c70f1a4e8e76ef7bca84291e85fcc438aaac9cc68a212a8235"},
|
|
||||||
{file = "time_machine-2.8.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f95fb65be15384f0ce3a39c07a2a49be2fbd81a47967d051b45daf6322a6546d"},
|
|
||||||
{file = "time_machine-2.8.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74f2a2d0fcb4fc23a128826e13d492323b5c7330502b417c1f8a1e0cb55a2c0"},
|
|
||||||
{file = "time_machine-2.8.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c68c0d18dc23aeedfb98a9497127d14cbaa464c2fbe1cdd4afe7a15e08888f18"},
|
|
||||||
{file = "time_machine-2.8.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7c6c410e8048bdfbf9167445d98f27851acfdeaf31b0cd3443f42785ab88b7f2"},
|
|
||||||
{file = "time_machine-2.8.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6b0cee816d67d1bb731cde89d765d3ca992a4aaf00f78a6bff379b3b26cc464d"},
|
|
||||||
{file = "time_machine-2.8.1-cp37-cp37m-win32.whl", hash = "sha256:61319bd1531356af556951c2ac2541fc58ff272fb6ea409cf2379bebc6c7b268"},
|
|
||||||
{file = "time_machine-2.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7ac6214c718b148b6fb50d6376b86f523d93187a27a4bbfb356988121c2dc4b3"},
|
|
||||||
{file = "time_machine-2.8.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:193c51eb48f853553ba200a08fe977101e509d5b0a682d295a8709ba04731e8f"},
|
|
||||||
{file = "time_machine-2.8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6f58954ad6cc74ee19311e80199714ff6501a64b2dd100aea187dc92f244bf88"},
|
|
||||||
{file = "time_machine-2.8.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbbd3d444fc1b7bfa6de934f4174d77e9ab3e2675eef7595974cf3f3ec04baa6"},
|
|
||||||
{file = "time_machine-2.8.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a568c829f2ca6b6e28d606bef5e428c28598ef138a9b3cc1872da188b039a81"},
|
|
||||||
{file = "time_machine-2.8.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5cd2eb0ac8af2b18b1aa6ae7437daf42bc04b6a37d7ce72a1c4da476deb0f93"},
|
|
||||||
{file = "time_machine-2.8.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e573561c37313dfc8bca45314505de58c4ccec09b7f9341d4b963ee636468993"},
|
|
||||||
{file = "time_machine-2.8.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3ec2dfe5b15cbb2f07ee615380253a002d52f171f4ec30b83cfc1d4c1ceea26c"},
|
|
||||||
{file = "time_machine-2.8.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:083cc491decacd77ab3243fb400e9f7c6554da82b23c219c2f89a193e9aa3c46"},
|
|
||||||
{file = "time_machine-2.8.1-cp38-cp38-win32.whl", hash = "sha256:6459f27eb9abe8a79cb83b52cb405db1b2c489746930707f6f4b8f34683d5a38"},
|
|
||||||
{file = "time_machine-2.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:f96d6e1ddea1569b008b97b669abbbca16aba12ef3bdf4305f441da86bd4f8ca"},
|
|
||||||
{file = "time_machine-2.8.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ecee2437cc3bb59c0bd1915bedba16cc984cf977486d24a8c1bc43bd603b1422"},
|
|
||||||
{file = "time_machine-2.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:deb94ec31124a564c8aca9ac452a550fb964f63b40cf061653f66d022d53fcb6"},
|
|
||||||
{file = "time_machine-2.8.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72f0bcb568c7dd49d664aa2b4cbe55de7817f5f5018919fbb1c423c2876bc943"},
|
|
||||||
{file = "time_machine-2.8.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:222ac1922bea9c130ea4b6865312174cb81f59ea38babfc019548847ea142fba"},
|
|
||||||
{file = "time_machine-2.8.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ce5f8ebb396f47ae4669ee050af906ff1250fe10261842ae2eba336c25c43a8"},
|
|
||||||
{file = "time_machine-2.8.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b93e83b0e870ad253ea24e96af576fc6f3b22e14cd9c24c98e3e454cfb30680e"},
|
|
||||||
{file = "time_machine-2.8.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:be9c97ad1fe277d18385f8bc110f498cfc6616b6fedc72acbabf9871d806ce32"},
|
|
||||||
{file = "time_machine-2.8.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:82681982a5d621cb0d5ac89b9dda94bc110a6aa14ee0463593273e54f51c189d"},
|
|
||||||
{file = "time_machine-2.8.1-cp39-cp39-win32.whl", hash = "sha256:e16bd078cf3ab793f4a1d778fa1765f8f1828d911b6fafb894b5ab55fe4b0d3f"},
|
|
||||||
{file = "time_machine-2.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:3a77820b5f45ba43c6823d84b0f22eb4a46e9f0dba4112fe544deb06e634d50f"},
|
|
||||||
]
|
|
||||||
toml = [
|
toml = [
|
||||||
{file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
|
{file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
|
||||||
{file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
|
{file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
|
||||||
@@ -1551,14 +1245,8 @@ typed-ast = [
|
|||||||
{file = "typed_ast-1.5.4.tar.gz", hash = "sha256:39e21ceb7388e4bb37f4c679d72707ed46c2fbf2a5609b8b8ebc4b067d977df2"},
|
{file = "typed_ast-1.5.4.tar.gz", hash = "sha256:39e21ceb7388e4bb37f4c679d72707ed46c2fbf2a5609b8b8ebc4b067d977df2"},
|
||||||
]
|
]
|
||||||
typing-extensions = []
|
typing-extensions = []
|
||||||
urllib3 = [
|
urllib3 = []
|
||||||
{file = "urllib3-1.26.12-py2.py3-none-any.whl", hash = "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"},
|
virtualenv = []
|
||||||
{file = "urllib3-1.26.12.tar.gz", hash = "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e"},
|
|
||||||
]
|
|
||||||
virtualenv = [
|
|
||||||
{file = "virtualenv-20.16.5-py3-none-any.whl", hash = "sha256:d07dfc5df5e4e0dbc92862350ad87a36ed505b978f6c39609dc489eadd5b0d27"},
|
|
||||||
{file = "virtualenv-20.16.5.tar.gz", hash = "sha256:227ea1b9994fdc5ea31977ba3383ef296d7472ea85be9d6732e42a91c04e80da"},
|
|
||||||
]
|
|
||||||
watchdog = [
|
watchdog = [
|
||||||
{file = "watchdog-2.1.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a735a990a1095f75ca4f36ea2ef2752c99e6ee997c46b0de507ba40a09bf7330"},
|
{file = "watchdog-2.1.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a735a990a1095f75ca4f36ea2ef2752c99e6ee997c46b0de507ba40a09bf7330"},
|
||||||
{file = "watchdog-2.1.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b17d302850c8d412784d9246cfe8d7e3af6bcd45f958abb2d08a6f8bedf695d"},
|
{file = "watchdog-2.1.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b17d302850c8d412784d9246cfe8d7e3af6bcd45f958abb2d08a6f8bedf695d"},
|
||||||
@@ -1586,65 +1274,5 @@ watchdog = [
|
|||||||
{file = "watchdog-2.1.9-py3-none-win_ia64.whl", hash = "sha256:ad576a565260d8f99d97f2e64b0f97a48228317095908568a9d5c786c829d428"},
|
{file = "watchdog-2.1.9-py3-none-win_ia64.whl", hash = "sha256:ad576a565260d8f99d97f2e64b0f97a48228317095908568a9d5c786c829d428"},
|
||||||
{file = "watchdog-2.1.9.tar.gz", hash = "sha256:43ce20ebb36a51f21fa376f76d1d4692452b2527ccd601950d69ed36b9e21609"},
|
{file = "watchdog-2.1.9.tar.gz", hash = "sha256:43ce20ebb36a51f21fa376f76d1d4692452b2527ccd601950d69ed36b9e21609"},
|
||||||
]
|
]
|
||||||
yarl = [
|
yarl = []
|
||||||
{file = "yarl-1.8.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:abc06b97407868ef38f3d172762f4069323de52f2b70d133d096a48d72215d28"},
|
|
||||||
{file = "yarl-1.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:07b21e274de4c637f3e3b7104694e53260b5fc10d51fb3ec5fed1da8e0f754e3"},
|
|
||||||
{file = "yarl-1.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9de955d98e02fab288c7718662afb33aab64212ecb368c5dc866d9a57bf48880"},
|
|
||||||
{file = "yarl-1.8.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ec362167e2c9fd178f82f252b6d97669d7245695dc057ee182118042026da40"},
|
|
||||||
{file = "yarl-1.8.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:20df6ff4089bc86e4a66e3b1380460f864df3dd9dccaf88d6b3385d24405893b"},
|
|
||||||
{file = "yarl-1.8.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5999c4662631cb798496535afbd837a102859568adc67d75d2045e31ec3ac497"},
|
|
||||||
{file = "yarl-1.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed19b74e81b10b592084a5ad1e70f845f0aacb57577018d31de064e71ffa267a"},
|
|
||||||
{file = "yarl-1.8.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e4808f996ca39a6463f45182e2af2fae55e2560be586d447ce8016f389f626f"},
|
|
||||||
{file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2d800b9c2eaf0684c08be5f50e52bfa2aa920e7163c2ea43f4f431e829b4f0fd"},
|
|
||||||
{file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6628d750041550c5d9da50bb40b5cf28a2e63b9388bac10fedd4f19236ef4957"},
|
|
||||||
{file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f5af52738e225fcc526ae64071b7e5342abe03f42e0e8918227b38c9aa711e28"},
|
|
||||||
{file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:76577f13333b4fe345c3704811ac7509b31499132ff0181f25ee26619de2c843"},
|
|
||||||
{file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0c03f456522d1ec815893d85fccb5def01ffaa74c1b16ff30f8aaa03eb21e453"},
|
|
||||||
{file = "yarl-1.8.1-cp310-cp310-win32.whl", hash = "sha256:ea30a42dc94d42f2ba4d0f7c0ffb4f4f9baa1b23045910c0c32df9c9902cb272"},
|
|
||||||
{file = "yarl-1.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:9130ddf1ae9978abe63808b6b60a897e41fccb834408cde79522feb37fb72fb0"},
|
|
||||||
{file = "yarl-1.8.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0ab5a138211c1c366404d912824bdcf5545ccba5b3ff52c42c4af4cbdc2c5035"},
|
|
||||||
{file = "yarl-1.8.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0fb2cb4204ddb456a8e32381f9a90000429489a25f64e817e6ff94879d432fc"},
|
|
||||||
{file = "yarl-1.8.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85cba594433915d5c9a0d14b24cfba0339f57a2fff203a5d4fd070e593307d0b"},
|
|
||||||
{file = "yarl-1.8.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ca7e596c55bd675432b11320b4eacc62310c2145d6801a1f8e9ad160685a231"},
|
|
||||||
{file = "yarl-1.8.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0f77539733e0ec2475ddcd4e26777d08996f8cd55d2aef82ec4d3896687abda"},
|
|
||||||
{file = "yarl-1.8.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:29e256649f42771829974e742061c3501cc50cf16e63f91ed8d1bf98242e5507"},
|
|
||||||
{file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7fce6cbc6c170ede0221cc8c91b285f7f3c8b9fe28283b51885ff621bbe0f8ee"},
|
|
||||||
{file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:59ddd85a1214862ce7c7c66457f05543b6a275b70a65de366030d56159a979f0"},
|
|
||||||
{file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:12768232751689c1a89b0376a96a32bc7633c08da45ad985d0c49ede691f5c0d"},
|
|
||||||
{file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:b19255dde4b4f4c32e012038f2c169bb72e7f081552bea4641cab4d88bc409dd"},
|
|
||||||
{file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6c8148e0b52bf9535c40c48faebb00cb294ee577ca069d21bd5c48d302a83780"},
|
|
||||||
{file = "yarl-1.8.1-cp37-cp37m-win32.whl", hash = "sha256:de839c3a1826a909fdbfe05f6fe2167c4ab033f1133757b5936efe2f84904c07"},
|
|
||||||
{file = "yarl-1.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:dd032e8422a52e5a4860e062eb84ac94ea08861d334a4bcaf142a63ce8ad4802"},
|
|
||||||
{file = "yarl-1.8.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:19cd801d6f983918a3f3a39f3a45b553c015c5aac92ccd1fac619bd74beece4a"},
|
|
||||||
{file = "yarl-1.8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6347f1a58e658b97b0a0d1ff7658a03cb79bdbda0331603bed24dd7054a6dea1"},
|
|
||||||
{file = "yarl-1.8.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c0da7e44d0c9108d8b98469338705e07f4bb7dab96dbd8fa4e91b337db42548"},
|
|
||||||
{file = "yarl-1.8.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5587bba41399854703212b87071c6d8638fa6e61656385875f8c6dff92b2e461"},
|
|
||||||
{file = "yarl-1.8.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31a9a04ecccd6b03e2b0e12e82131f1488dea5555a13a4d32f064e22a6003cfe"},
|
|
||||||
{file = "yarl-1.8.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:205904cffd69ae972a1707a1bd3ea7cded594b1d773a0ce66714edf17833cdae"},
|
|
||||||
{file = "yarl-1.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea513a25976d21733bff523e0ca836ef1679630ef4ad22d46987d04b372d57fc"},
|
|
||||||
{file = "yarl-1.8.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0b51530877d3ad7a8d47b2fff0c8df3b8f3b8deddf057379ba50b13df2a5eae"},
|
|
||||||
{file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d2b8f245dad9e331540c350285910b20dd913dc86d4ee410c11d48523c4fd546"},
|
|
||||||
{file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ab2a60d57ca88e1d4ca34a10e9fb4ab2ac5ad315543351de3a612bbb0560bead"},
|
|
||||||
{file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:449c957ffc6bc2309e1fbe67ab7d2c1efca89d3f4912baeb8ead207bb3cc1cd4"},
|
|
||||||
{file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a165442348c211b5dea67c0206fc61366212d7082ba8118c8c5c1c853ea4d82e"},
|
|
||||||
{file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b3ded839a5c5608eec8b6f9ae9a62cb22cd037ea97c627f38ae0841a48f09eae"},
|
|
||||||
{file = "yarl-1.8.1-cp38-cp38-win32.whl", hash = "sha256:c1445a0c562ed561d06d8cbc5c8916c6008a31c60bc3655cdd2de1d3bf5174a0"},
|
|
||||||
{file = "yarl-1.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:56c11efb0a89700987d05597b08a1efcd78d74c52febe530126785e1b1a285f4"},
|
|
||||||
{file = "yarl-1.8.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e80ed5a9939ceb6fda42811542f31c8602be336b1fb977bccb012e83da7e4936"},
|
|
||||||
{file = "yarl-1.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6afb336e23a793cd3b6476c30f030a0d4c7539cd81649683b5e0c1b0ab0bf350"},
|
|
||||||
{file = "yarl-1.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4c322cbaa4ed78a8aac89b2174a6df398faf50e5fc12c4c191c40c59d5e28357"},
|
|
||||||
{file = "yarl-1.8.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fae37373155f5ef9b403ab48af5136ae9851151f7aacd9926251ab26b953118b"},
|
|
||||||
{file = "yarl-1.8.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5395da939ffa959974577eff2cbfc24b004a2fb6c346918f39966a5786874e54"},
|
|
||||||
{file = "yarl-1.8.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:076eede537ab978b605f41db79a56cad2e7efeea2aa6e0fa8f05a26c24a034fb"},
|
|
||||||
{file = "yarl-1.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d1a50e461615747dd93c099f297c1994d472b0f4d2db8a64e55b1edf704ec1c"},
|
|
||||||
{file = "yarl-1.8.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7de89c8456525650ffa2bb56a3eee6af891e98f498babd43ae307bd42dca98f6"},
|
|
||||||
{file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4a88510731cd8d4befaba5fbd734a7dd914de5ab8132a5b3dde0bbd6c9476c64"},
|
|
||||||
{file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2d93a049d29df172f48bcb09acf9226318e712ce67374f893b460b42cc1380ae"},
|
|
||||||
{file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:21ac44b763e0eec15746a3d440f5e09ad2ecc8b5f6dcd3ea8cb4773d6d4703e3"},
|
|
||||||
{file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d0272228fabe78ce00a3365ffffd6f643f57a91043e119c289aaba202f4095b0"},
|
|
||||||
{file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:99449cd5366fe4608e7226c6cae80873296dfa0cde45d9b498fefa1de315a09e"},
|
|
||||||
{file = "yarl-1.8.1-cp39-cp39-win32.whl", hash = "sha256:8b0af1cf36b93cee99a31a545fe91d08223e64390c5ecc5e94c39511832a4bb6"},
|
|
||||||
{file = "yarl-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:de49d77e968de6626ba7ef4472323f9d2e5a56c1d85b7c0e2a190b2173d3b9be"},
|
|
||||||
{file = "yarl-1.8.1.tar.gz", hash = "sha256:af887845b8c2e060eb5605ff72b6f2dd2aab7a761379373fd89d314f4752abbf"},
|
|
||||||
]
|
|
||||||
zipp = []
|
zipp = []
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ textual = "textual.cli.cli:run"
|
|||||||
|
|
||||||
[tool.poetry.dependencies]
|
[tool.poetry.dependencies]
|
||||||
python = "^3.7"
|
python = "^3.7"
|
||||||
rich = "^12.6.0a1"
|
rich = "^12.6.0a2"
|
||||||
#rich = {path="../rich", develop=true}
|
#rich = {path="../rich", develop=true}
|
||||||
importlib-metadata = "^4.11.3"
|
importlib-metadata = "^4.11.3"
|
||||||
typing-extensions = { version = "^4.0.0", python = "<3.8" }
|
typing-extensions = { version = "^4.0.0", python = "<3.8" }
|
||||||
|
|||||||
@@ -6,6 +6,9 @@
|
|||||||
transition: color 300ms linear, background 300ms linear;
|
transition: color 300ms linear, background 300ms linear;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Tweet.tall {
|
||||||
|
height: 24;
|
||||||
|
}
|
||||||
|
|
||||||
*:hover {
|
*:hover {
|
||||||
/* tint: 30% red;
|
/* tint: 30% red;
|
||||||
@@ -47,8 +50,8 @@ DataTable {
|
|||||||
/*border:heavy red;*/
|
/*border:heavy red;*/
|
||||||
/* tint: 10% green; */
|
/* tint: 10% green; */
|
||||||
/* text-opacity: 50%; */
|
/* text-opacity: 50%; */
|
||||||
background: $surface;
|
|
||||||
padding: 1 2;
|
|
||||||
margin: 1 2;
|
margin: 1 2;
|
||||||
height: 24;
|
height: 24;
|
||||||
}
|
}
|
||||||
@@ -118,6 +121,7 @@ Tweet {
|
|||||||
.scrollable {
|
.scrollable {
|
||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
overflow-y: scroll;
|
overflow-y: scroll;
|
||||||
|
padding: 0 2;
|
||||||
margin: 1 2;
|
margin: 1 2;
|
||||||
height: 24;
|
height: 24;
|
||||||
align-horizontal: center;
|
align-horizontal: center;
|
||||||
@@ -125,8 +129,7 @@ Tweet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.code {
|
.code {
|
||||||
height: auto;
|
height: auto;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -124,17 +124,18 @@ class BasicApp(App):
|
|||||||
|
|
||||||
yield Vertical(
|
yield Vertical(
|
||||||
Tweet(TweetBody()),
|
Tweet(TweetBody()),
|
||||||
Container(
|
Tweet(
|
||||||
Static(
|
Static(
|
||||||
Syntax(
|
Syntax(
|
||||||
CODE,
|
CODE,
|
||||||
"python",
|
"python",
|
||||||
|
theme="ansi_dark",
|
||||||
line_numbers=True,
|
line_numbers=True,
|
||||||
indent_guides=True,
|
indent_guides=True,
|
||||||
),
|
),
|
||||||
classes="code",
|
classes="code",
|
||||||
),
|
),
|
||||||
classes="scrollable",
|
classes="tall",
|
||||||
),
|
),
|
||||||
Container(table, id="table-container"),
|
Container(table, id="table-container"),
|
||||||
Container(DirectoryTree("~/"), id="tree-container"),
|
Container(DirectoryTree("~/"), id="tree-container"),
|
||||||
|
|||||||
@@ -29,6 +29,35 @@ if TYPE_CHECKING:
|
|||||||
RenderLineCallback: TypeAlias = Callable[[int], List[Segment]]
|
RenderLineCallback: TypeAlias = Callable[[int], List[Segment]]
|
||||||
|
|
||||||
|
|
||||||
|
def style_links(
|
||||||
|
segments: Iterable[Segment], link_id: str, link_style: Style
|
||||||
|
) -> list[Segment]:
|
||||||
|
"""Apply a style to the given link id.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
segments (Iterable[Segment]): Segments.
|
||||||
|
link_id (str): A link id.
|
||||||
|
link_style (Style): Style to apply.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
list[Segment]: A list of new segments.
|
||||||
|
"""
|
||||||
|
|
||||||
|
_Segment = Segment
|
||||||
|
|
||||||
|
segments = [
|
||||||
|
_Segment(
|
||||||
|
text,
|
||||||
|
(style + link_style if style is not None else None)
|
||||||
|
if (style and not style._null and style._link_id == link_id)
|
||||||
|
else style,
|
||||||
|
control,
|
||||||
|
)
|
||||||
|
for text, style, control in segments
|
||||||
|
]
|
||||||
|
return segments
|
||||||
|
|
||||||
|
|
||||||
class StylesCache:
|
class StylesCache:
|
||||||
"""Responsible for rendering CSS Styles and keeping a cached of rendered lines.
|
"""Responsible for rendering CSS Styles and keeping a cached of rendered lines.
|
||||||
|
|
||||||
@@ -106,6 +135,22 @@ class StylesCache:
|
|||||||
padding=styles.padding,
|
padding=styles.padding,
|
||||||
crop=crop,
|
crop=crop,
|
||||||
)
|
)
|
||||||
|
if widget.auto_links:
|
||||||
|
_style_links = style_links
|
||||||
|
hover_style = widget.hover_style
|
||||||
|
link_hover_style = widget.link_hover_style
|
||||||
|
if (
|
||||||
|
link_hover_style
|
||||||
|
and hover_style._link_id
|
||||||
|
and hover_style._meta
|
||||||
|
and "@click" in hover_style.meta
|
||||||
|
):
|
||||||
|
if link_hover_style:
|
||||||
|
lines = [
|
||||||
|
_style_links(line, hover_style.link_id, link_hover_style)
|
||||||
|
for line in lines
|
||||||
|
]
|
||||||
|
|
||||||
return lines
|
return lines
|
||||||
|
|
||||||
def render(
|
def render(
|
||||||
|
|||||||
@@ -97,6 +97,7 @@ DEFAULT_COLORS = {
|
|||||||
|
|
||||||
|
|
||||||
ComposeResult = Iterable[Widget]
|
ComposeResult = Iterable[Widget]
|
||||||
|
RenderResult = RenderableType
|
||||||
|
|
||||||
|
|
||||||
class AppError(Exception):
|
class AppError(Exception):
|
||||||
@@ -1315,7 +1316,8 @@ class App(Generic[ReturnType], DOMNode):
|
|||||||
|
|
||||||
def bell(self) -> None:
|
def bell(self) -> None:
|
||||||
"""Play the console 'bell'."""
|
"""Play the console 'bell'."""
|
||||||
self.console.bell()
|
if not self.is_headless:
|
||||||
|
self.console.bell()
|
||||||
|
|
||||||
async def press(self, key: str) -> bool:
|
async def press(self, key: str) -> bool:
|
||||||
"""Handle a key press.
|
"""Handle a key press.
|
||||||
|
|||||||
@@ -184,6 +184,12 @@ class Color(NamedTuple):
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def inverse(self) -> Color:
|
||||||
|
"""The inverse of this color."""
|
||||||
|
r, g, b, a = self
|
||||||
|
return Color(255 - r, 255 - g, 255 - b, a)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def is_transparent(self) -> bool:
|
def is_transparent(self) -> bool:
|
||||||
"""Check if the color is transparent, i.e. has 0 alpha.
|
"""Check if the color is transparent, i.e. has 0 alpha.
|
||||||
@@ -502,12 +508,10 @@ class Color(NamedTuple):
|
|||||||
Returns:
|
Returns:
|
||||||
Color: A new color, either an off-white or off-black
|
Color: A new color, either an off-white or off-black
|
||||||
"""
|
"""
|
||||||
white = self.blend(WHITE, alpha)
|
|
||||||
black = self.blend(BLACK, alpha)
|
|
||||||
brightness = self.brightness
|
brightness = self.brightness
|
||||||
white_contrast = abs(brightness - white.brightness)
|
white_contrast = abs(brightness - WHITE.brightness)
|
||||||
black_contrast = abs(brightness - black.brightness)
|
black_contrast = abs(brightness - BLACK.brightness)
|
||||||
return white if white_contrast > black_contrast else black
|
return (WHITE if white_contrast > black_contrast else BLACK).with_alpha(alpha)
|
||||||
|
|
||||||
|
|
||||||
# Color constants
|
# Color constants
|
||||||
|
|||||||
@@ -581,8 +581,12 @@ class StylesBuilder:
|
|||||||
alpha: float | None = None
|
alpha: float | None = None
|
||||||
|
|
||||||
for token in tokens:
|
for token in tokens:
|
||||||
if name == "color" and token.name == "token" and token.value == "auto":
|
if (
|
||||||
self.styles._rules["auto_color"] = True
|
"background" not in name
|
||||||
|
and token.name == "token"
|
||||||
|
and token.value == "auto"
|
||||||
|
):
|
||||||
|
self.styles._rules[f"auto_{name}"] = True
|
||||||
elif token.name == "scalar":
|
elif token.name == "scalar":
|
||||||
alpha_scalar = Scalar.parse(token.value)
|
alpha_scalar = Scalar.parse(token.value)
|
||||||
if alpha_scalar.unit != Unit.PERCENT:
|
if alpha_scalar.unit != Unit.PERCENT:
|
||||||
@@ -616,6 +620,11 @@ class StylesBuilder:
|
|||||||
process_scrollbar_background_hover = process_color
|
process_scrollbar_background_hover = process_color
|
||||||
process_scrollbar_background_active = process_color
|
process_scrollbar_background_active = process_color
|
||||||
|
|
||||||
|
process_link_color = process_color
|
||||||
|
process_link_background = process_color
|
||||||
|
process_hover_color = process_color
|
||||||
|
process_hover_background = process_color
|
||||||
|
|
||||||
def process_text_style(self, name: str, tokens: list[Token]) -> None:
|
def process_text_style(self, name: str, tokens: list[Token]) -> None:
|
||||||
for token in tokens:
|
for token in tokens:
|
||||||
value = token.value
|
value = token.value
|
||||||
@@ -627,7 +636,10 @@ class StylesBuilder:
|
|||||||
)
|
)
|
||||||
|
|
||||||
style_definition = " ".join(token.value for token in tokens)
|
style_definition = " ".join(token.value for token in tokens)
|
||||||
self.styles.text_style = style_definition
|
self.styles._rules[name.replace("-", "_")] = style_definition
|
||||||
|
|
||||||
|
process_link_style = process_text_style
|
||||||
|
process_hover_style = process_text_style
|
||||||
|
|
||||||
def process_text_align(self, name: str, tokens: list[Token]) -> None:
|
def process_text_align(self, name: str, tokens: list[Token]) -> None:
|
||||||
"""Process a text-align declaration"""
|
"""Process a text-align declaration"""
|
||||||
|
|||||||
@@ -158,6 +158,16 @@ class RulesMap(TypedDict, total=False):
|
|||||||
|
|
||||||
text_align: TextAlign
|
text_align: TextAlign
|
||||||
|
|
||||||
|
link_color: Color
|
||||||
|
auto_link_color: bool
|
||||||
|
link_background: Color
|
||||||
|
link_style: Style
|
||||||
|
|
||||||
|
hover_color: Color
|
||||||
|
auto_hover_color: bool
|
||||||
|
hover_background: Color
|
||||||
|
hover_style: Style
|
||||||
|
|
||||||
|
|
||||||
RULE_NAMES = list(RulesMap.__annotations__.keys())
|
RULE_NAMES = list(RulesMap.__annotations__.keys())
|
||||||
RULE_NAMES_SET = frozenset(RULE_NAMES)
|
RULE_NAMES_SET = frozenset(RULE_NAMES)
|
||||||
@@ -195,6 +205,10 @@ class StylesBase(ABC):
|
|||||||
"scrollbar_background",
|
"scrollbar_background",
|
||||||
"scrollbar_background_hover",
|
"scrollbar_background_hover",
|
||||||
"scrollbar_background_active",
|
"scrollbar_background_active",
|
||||||
|
"link_color",
|
||||||
|
"link_background",
|
||||||
|
"hover_color",
|
||||||
|
"hover_background",
|
||||||
}
|
}
|
||||||
|
|
||||||
node: DOMNode | None = None
|
node: DOMNode | None = None
|
||||||
@@ -281,6 +295,16 @@ class StylesBase(ABC):
|
|||||||
|
|
||||||
text_align = StringEnumProperty(VALID_TEXT_ALIGN, "start")
|
text_align = StringEnumProperty(VALID_TEXT_ALIGN, "start")
|
||||||
|
|
||||||
|
link_color = ColorProperty("transparent")
|
||||||
|
auto_link_color = BooleanProperty(False)
|
||||||
|
link_background = ColorProperty("transparent")
|
||||||
|
link_style = StyleFlagsProperty()
|
||||||
|
|
||||||
|
hover_color = ColorProperty("transparent")
|
||||||
|
auto_hover_color = BooleanProperty(False)
|
||||||
|
hover_background = ColorProperty("transparent")
|
||||||
|
hover_style = StyleFlagsProperty()
|
||||||
|
|
||||||
def __eq__(self, styles: object) -> bool:
|
def __eq__(self, styles: object) -> bool:
|
||||||
"""Check that Styles contains the same rules."""
|
"""Check that Styles contains the same rules."""
|
||||||
if not isinstance(styles, StylesBase):
|
if not isinstance(styles, StylesBase):
|
||||||
|
|||||||
@@ -115,7 +115,6 @@ class ColorSystem:
|
|||||||
|
|
||||||
dark = self._dark
|
dark = self._dark
|
||||||
luminosity_spread = self._luminosity_spread
|
luminosity_spread = self._luminosity_spread
|
||||||
text_alpha = self._text_alpha
|
|
||||||
|
|
||||||
if dark:
|
if dark:
|
||||||
background = self.background or Color.parse(DEFAULT_DARK_BACKGROUND)
|
background = self.background or Color.parse(DEFAULT_DARK_BACKGROUND)
|
||||||
@@ -124,6 +123,8 @@ class ColorSystem:
|
|||||||
background = self.background or Color.parse(DEFAULT_LIGHT_BACKGROUND)
|
background = self.background or Color.parse(DEFAULT_LIGHT_BACKGROUND)
|
||||||
surface = self.surface or Color.parse(DEFAULT_LIGHT_SURFACE)
|
surface = self.surface or Color.parse(DEFAULT_LIGHT_SURFACE)
|
||||||
|
|
||||||
|
foreground = background.inverse
|
||||||
|
|
||||||
boost = self.boost or background.get_contrast_text(1.0).with_alpha(0.07)
|
boost = self.boost or background.get_contrast_text(1.0).with_alpha(0.07)
|
||||||
|
|
||||||
if self.panel is None:
|
if self.panel is None:
|
||||||
@@ -159,6 +160,7 @@ class ColorSystem:
|
|||||||
("primary-background", primary),
|
("primary-background", primary),
|
||||||
("secondary-background", secondary),
|
("secondary-background", secondary),
|
||||||
("background", background),
|
("background", background),
|
||||||
|
("foregroud", foreground),
|
||||||
("panel", panel),
|
("panel", panel),
|
||||||
("boost", boost),
|
("boost", boost),
|
||||||
("surface", surface),
|
("surface", surface),
|
||||||
@@ -185,7 +187,7 @@ class ColorSystem:
|
|||||||
shade_color = color.lighten(luminosity_delta)
|
shade_color = color.lighten(luminosity_delta)
|
||||||
colors[f"{name}{shade_name}"] = shade_color.hex
|
colors[f"{name}{shade_name}"] = shade_color.hex
|
||||||
|
|
||||||
colors["text"] = "auto 95%"
|
colors["text"] = "auto 90%"
|
||||||
colors["text-muted"] = "auto 50%"
|
colors["text-muted"] = "auto 50%"
|
||||||
colors["text-disabled"] = "auto 30%"
|
colors["text-disabled"] = "auto 30%"
|
||||||
|
|
||||||
|
|||||||
@@ -280,6 +280,7 @@ class Screen(Widget):
|
|||||||
screen_y=event.screen_y,
|
screen_y=event.screen_y,
|
||||||
style=event.style,
|
style=event.style,
|
||||||
)
|
)
|
||||||
|
widget.hover_style = event.style
|
||||||
mouse_event._set_forwarded()
|
mouse_event._set_forwarded()
|
||||||
await widget._forward_event(mouse_event)
|
await widget._forward_event(mouse_event)
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import rich.repr
|
|||||||
from rich.color import Color
|
from rich.color import Color
|
||||||
from rich.console import ConsoleOptions, RenderableType, RenderResult
|
from rich.console import ConsoleOptions, RenderableType, RenderResult
|
||||||
from rich.segment import Segment, Segments
|
from rich.segment import Segment, Segments
|
||||||
from rich.style import Style, StyleType
|
from rich.style import NULL_STYLE, Style, StyleType
|
||||||
|
|
||||||
from . import events
|
from . import events
|
||||||
from ._types import MessageTarget
|
from ._types import MessageTarget
|
||||||
@@ -118,8 +118,8 @@ class ScrollBarRender:
|
|||||||
start_index, start_bar = divmod(max(0, start), len_bars)
|
start_index, start_bar = divmod(max(0, start), len_bars)
|
||||||
end_index, end_bar = divmod(max(0, end), len_bars)
|
end_index, end_bar = divmod(max(0, end), len_bars)
|
||||||
|
|
||||||
upper = {"@click": "scroll_up"}
|
upper = {"@mouse.up": "scroll_up"}
|
||||||
lower = {"@click": "scroll_down"}
|
lower = {"@mouse.up": "scroll_down"}
|
||||||
|
|
||||||
upper_back_segment = Segment(blank, _Style(bgcolor=back, meta=upper))
|
upper_back_segment = Segment(blank, _Style(bgcolor=back, meta=upper))
|
||||||
lower_back_segment = Segment(blank, _Style(bgcolor=back, meta=lower))
|
lower_back_segment = Segment(blank, _Style(bgcolor=back, meta=lower))
|
||||||
@@ -189,6 +189,17 @@ class ScrollBarRender:
|
|||||||
|
|
||||||
@rich.repr.auto
|
@rich.repr.auto
|
||||||
class ScrollBar(Widget):
|
class ScrollBar(Widget):
|
||||||
|
|
||||||
|
DEFAULT_CSS = """
|
||||||
|
ScrollBar {
|
||||||
|
hover-color: ;
|
||||||
|
hover-background:;
|
||||||
|
hover-style: ;
|
||||||
|
link-color: transparent;
|
||||||
|
link-background: transparent;
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self, vertical: bool = True, name: str | None = None, *, thickness: int = 1
|
self, vertical: bool = True, name: str | None = None, *, thickness: int = 1
|
||||||
) -> None:
|
) -> None:
|
||||||
@@ -196,6 +207,7 @@ class ScrollBar(Widget):
|
|||||||
self.thickness = thickness
|
self.thickness = thickness
|
||||||
self.grabbed_position: float = 0
|
self.grabbed_position: float = 0
|
||||||
super().__init__(name=name)
|
super().__init__(name=name)
|
||||||
|
self.auto_links = False
|
||||||
|
|
||||||
window_virtual_size: Reactive[int] = Reactive(100)
|
window_virtual_size: Reactive[int] = Reactive(100)
|
||||||
window_size: Reactive[int] = Reactive(0)
|
window_size: Reactive[int] = Reactive(0)
|
||||||
|
|||||||
@@ -10,13 +10,14 @@ import rich.repr
|
|||||||
from rich.console import (
|
from rich.console import (
|
||||||
Console,
|
Console,
|
||||||
ConsoleRenderable,
|
ConsoleRenderable,
|
||||||
|
ConsoleOptions,
|
||||||
RichCast,
|
RichCast,
|
||||||
JustifyMethod,
|
JustifyMethod,
|
||||||
RenderableType,
|
RenderableType,
|
||||||
|
RenderResult,
|
||||||
)
|
)
|
||||||
from rich.segment import Segment
|
from rich.segment import Segment
|
||||||
from rich.style import Style
|
from rich.style import Style
|
||||||
from rich.styled import Styled
|
|
||||||
from rich.text import Text
|
from rich.text import Text
|
||||||
|
|
||||||
from . import errors, events, messages
|
from . import errors, events, messages
|
||||||
@@ -29,7 +30,6 @@ from ._styles_cache import StylesCache
|
|||||||
from ._types import Lines
|
from ._types import Lines
|
||||||
from .binding import NoBinding
|
from .binding import NoBinding
|
||||||
from .box_model import BoxModel, get_box_model
|
from .box_model import BoxModel, get_box_model
|
||||||
from .css.constants import VALID_TEXT_ALIGN
|
|
||||||
from .dom import DOMNode, NoScreen
|
from .dom import DOMNode, NoScreen
|
||||||
from .geometry import Offset, Region, Size, Spacing, clamp
|
from .geometry import Offset, Region, Size, Spacing, clamp
|
||||||
from .layouts.vertical import VerticalLayout
|
from .layouts.vertical import VerticalLayout
|
||||||
@@ -57,6 +57,49 @@ _JUSTIFY_MAP: dict[str, JustifyMethod] = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class _Styled:
|
||||||
|
"""Apply a style to a renderable.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
renderable (RenderableType): Any renderable.
|
||||||
|
style (StyleType): A style to apply across the entire renderable.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self, renderable: "RenderableType", style: Style, link_style: Style | None
|
||||||
|
) -> None:
|
||||||
|
self.renderable = renderable
|
||||||
|
self.style = style
|
||||||
|
self.link_style = link_style
|
||||||
|
|
||||||
|
def __rich_console__(
|
||||||
|
self, console: "Console", options: "ConsoleOptions"
|
||||||
|
) -> "RenderResult":
|
||||||
|
style = console.get_style(self.style)
|
||||||
|
result_segments = console.render(self.renderable, options)
|
||||||
|
|
||||||
|
_Segment = Segment
|
||||||
|
if style:
|
||||||
|
apply = style.__add__
|
||||||
|
result_segments = (
|
||||||
|
_Segment(text, apply(_style), control)
|
||||||
|
for text, _style, control in result_segments
|
||||||
|
)
|
||||||
|
link_style = self.link_style
|
||||||
|
if link_style:
|
||||||
|
result_segments = (
|
||||||
|
_Segment(
|
||||||
|
text,
|
||||||
|
style
|
||||||
|
if style._meta is None
|
||||||
|
else (style + link_style if "@click" in style.meta else style),
|
||||||
|
control,
|
||||||
|
)
|
||||||
|
for text, style, control in result_segments
|
||||||
|
)
|
||||||
|
return result_segments
|
||||||
|
|
||||||
|
|
||||||
class RenderCache(NamedTuple):
|
class RenderCache(NamedTuple):
|
||||||
"""Stores results of a previous render."""
|
"""Stores results of a previous render."""
|
||||||
|
|
||||||
@@ -82,6 +125,12 @@ class Widget(DOMNode):
|
|||||||
scrollbar-corner-color: $panel-darken-1;
|
scrollbar-corner-color: $panel-darken-1;
|
||||||
scrollbar-size-vertical: 2;
|
scrollbar-size-vertical: 2;
|
||||||
scrollbar-size-horizontal: 1;
|
scrollbar-size-horizontal: 1;
|
||||||
|
link-background:;
|
||||||
|
link-color: $text;
|
||||||
|
link-style: underline;
|
||||||
|
hover-background: $accent;
|
||||||
|
hover-color: $text;
|
||||||
|
hover-style: bold not underline;
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
COMPONENT_CLASSES: ClassVar[set[str]] = set()
|
COMPONENT_CLASSES: ClassVar[set[str]] = set()
|
||||||
@@ -94,6 +143,10 @@ class Widget(DOMNode):
|
|||||||
"""Rich renderable may expand."""
|
"""Rich renderable may expand."""
|
||||||
shrink = Reactive(True)
|
shrink = Reactive(True)
|
||||||
"""Rich renderable may shrink."""
|
"""Rich renderable may shrink."""
|
||||||
|
auto_links = Reactive(True)
|
||||||
|
"""Widget will highlight links automatically."""
|
||||||
|
|
||||||
|
hover_style: Reactive[Style] = Reactive(Style)
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
@@ -131,7 +184,7 @@ class Widget(DOMNode):
|
|||||||
|
|
||||||
self._styles_cache = StylesCache()
|
self._styles_cache = StylesCache()
|
||||||
self._rich_style_cache: dict[str, Style] = {}
|
self._rich_style_cache: dict[str, Style] = {}
|
||||||
|
self._stabilized_scrollbar_size: Size | None = None
|
||||||
self._lock = Lock()
|
self._lock = Lock()
|
||||||
|
|
||||||
super().__init__(
|
super().__init__(
|
||||||
@@ -312,9 +365,7 @@ class Widget(DOMNode):
|
|||||||
return box_model
|
return box_model
|
||||||
|
|
||||||
def get_content_width(self, container: Size, viewport: Size) -> int:
|
def get_content_width(self, container: Size, viewport: Size) -> int:
|
||||||
"""Gets the width of the content area.
|
"""Called by textual to get the width of the content area. May be overridden in a subclass.
|
||||||
|
|
||||||
May be overridden in a subclass.
|
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
container (Size): Size of the container (immediate parent) widget.
|
container (Size): Size of the container (immediate parent) widget.
|
||||||
@@ -344,9 +395,7 @@ class Widget(DOMNode):
|
|||||||
return width
|
return width
|
||||||
|
|
||||||
def get_content_height(self, container: Size, viewport: Size, width: int) -> int:
|
def get_content_height(self, container: Size, viewport: Size, width: int) -> int:
|
||||||
"""Gets the height (number of lines) in the content area.
|
"""Called by Textual to get the height of the content area. May be overridden in a subclass.
|
||||||
|
|
||||||
May be overridden in a subclass.
|
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
container (Size): Size of the container (immediate parent) widget.
|
container (Size): Size of the container (immediate parent) widget.
|
||||||
@@ -501,10 +550,16 @@ class Widget(DOMNode):
|
|||||||
elif overflow_y == "auto":
|
elif overflow_y == "auto":
|
||||||
show_vertical = self.virtual_size.height > height
|
show_vertical = self.virtual_size.height > height
|
||||||
|
|
||||||
if overflow_x == "auto" and show_vertical and not show_horizontal:
|
if (
|
||||||
|
overflow_x == "auto"
|
||||||
|
and show_vertical
|
||||||
|
and not show_horizontal
|
||||||
|
and self._stabilized_scrollbar_size != self.container_size
|
||||||
|
):
|
||||||
show_horizontal = (
|
show_horizontal = (
|
||||||
self.virtual_size.width + styles.scrollbar_size_vertical > width
|
self.virtual_size.width + styles.scrollbar_size_vertical > width
|
||||||
)
|
)
|
||||||
|
self._stabilized_scrollbar_size = self.container_size
|
||||||
|
|
||||||
self.show_horizontal_scrollbar = show_horizontal
|
self.show_horizontal_scrollbar = show_horizontal
|
||||||
self.show_vertical_scrollbar = show_vertical
|
self.show_vertical_scrollbar = show_vertical
|
||||||
@@ -798,6 +853,40 @@ class Widget(DOMNode):
|
|||||||
return node.styles.layers
|
return node.styles.layers
|
||||||
return ("default",)
|
return ("default",)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def link_style(self) -> Style:
|
||||||
|
"""Style of links."""
|
||||||
|
styles = self.styles
|
||||||
|
_, background = self.background_colors
|
||||||
|
link_background = background + styles.link_background
|
||||||
|
link_color = link_background + (
|
||||||
|
link_background.get_contrast_text(styles.link_color.a)
|
||||||
|
if styles.auto_link_color
|
||||||
|
else styles.link_color
|
||||||
|
)
|
||||||
|
style = styles.link_style + Style.from_color(
|
||||||
|
link_color.rich_color,
|
||||||
|
link_background.rich_color,
|
||||||
|
)
|
||||||
|
return style
|
||||||
|
|
||||||
|
@property
|
||||||
|
def link_hover_style(self) -> Style:
|
||||||
|
"""Style of links with mouse hover."""
|
||||||
|
styles = self.styles
|
||||||
|
_, background = self.background_colors
|
||||||
|
hover_background = background + styles.hover_background
|
||||||
|
hover_color = hover_background + (
|
||||||
|
hover_background.get_contrast_text(styles.hover_color.a)
|
||||||
|
if styles.auto_hover_color
|
||||||
|
else styles.hover_color
|
||||||
|
)
|
||||||
|
style = styles.hover_style + Style.from_color(
|
||||||
|
hover_color.rich_color,
|
||||||
|
hover_background.rich_color,
|
||||||
|
)
|
||||||
|
return style
|
||||||
|
|
||||||
def _set_dirty(self, *regions: Region) -> None:
|
def _set_dirty(self, *regions: Region) -> None:
|
||||||
"""Set the Widget as 'dirty' (requiring re-paint).
|
"""Set the Widget as 'dirty' (requiring re-paint).
|
||||||
|
|
||||||
@@ -1413,7 +1502,9 @@ class Widget(DOMNode):
|
|||||||
):
|
):
|
||||||
renderable.justify = text_justify
|
renderable.justify = text_justify
|
||||||
|
|
||||||
renderable = Styled(renderable, self.rich_style)
|
renderable = _Styled(
|
||||||
|
renderable, self.rich_style, self.link_style if self.auto_links else None
|
||||||
|
)
|
||||||
|
|
||||||
return renderable
|
return renderable
|
||||||
|
|
||||||
@@ -1713,6 +1804,7 @@ class Widget(DOMNode):
|
|||||||
|
|
||||||
def _on_leave(self, event: events.Leave) -> None:
|
def _on_leave(self, event: events.Leave) -> None:
|
||||||
self.mouse_over = False
|
self.mouse_over = False
|
||||||
|
self.hover_style = Style()
|
||||||
|
|
||||||
def _on_enter(self, event: events.Enter) -> None:
|
def _on_enter(self, event: events.Enter) -> None:
|
||||||
self.mouse_over = True
|
self.mouse_over = True
|
||||||
|
|||||||
@@ -107,8 +107,11 @@ class Coord(NamedTuple):
|
|||||||
class DataTable(ScrollView, Generic[CellType], can_focus=True):
|
class DataTable(ScrollView, Generic[CellType], can_focus=True):
|
||||||
|
|
||||||
DEFAULT_CSS = """
|
DEFAULT_CSS = """
|
||||||
|
App.-dark DataTable {
|
||||||
|
background:;
|
||||||
|
}
|
||||||
DataTable {
|
DataTable {
|
||||||
|
background: $surface ;
|
||||||
color: $text;
|
color: $text;
|
||||||
}
|
}
|
||||||
DataTable > .datatable--header {
|
DataTable > .datatable--header {
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import os.path
|
|||||||
|
|
||||||
from rich.console import RenderableType
|
from rich.console import RenderableType
|
||||||
import rich.repr
|
import rich.repr
|
||||||
|
|
||||||
from rich.text import Text
|
from rich.text import Text
|
||||||
|
|
||||||
from .. import events
|
from .. import events
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ class Footer(Widget):
|
|||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self._key_text: Text | None = None
|
self._key_text: Text | None = None
|
||||||
|
self.auto_links = False
|
||||||
|
|
||||||
highlight_key: Reactive[str | None] = Reactive(None)
|
highlight_key: Reactive[str | None] = Reactive(None)
|
||||||
|
|
||||||
|
|||||||
@@ -79,20 +79,20 @@ class Header(Widget):
|
|||||||
color: $text;
|
color: $text;
|
||||||
height: 1;
|
height: 1;
|
||||||
}
|
}
|
||||||
Header.tall {
|
Header.-tall {
|
||||||
height: 3;
|
height: 3;
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
tall = Reactive(True)
|
tall = Reactive(True)
|
||||||
|
|
||||||
DEFAULT_CLASSES = "tall"
|
DEFAULT_CLASSES = "-tall"
|
||||||
|
|
||||||
def watch_tall(self, tall: bool) -> None:
|
def watch_tall(self, tall: bool) -> None:
|
||||||
self.set_class(tall, "tall")
|
self.set_class(tall, "-tall")
|
||||||
|
|
||||||
async def on_click(self, event):
|
async def on_click(self, event):
|
||||||
self.toggle_class("tall")
|
self.toggle_class("-tall")
|
||||||
|
|
||||||
def on_mount(self) -> None:
|
def on_mount(self) -> None:
|
||||||
def set_title(title: str) -> None:
|
def set_title(title: str) -> None:
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ from rich.console import RenderableType
|
|||||||
from rich.protocol import is_renderable
|
from rich.protocol import is_renderable
|
||||||
from rich.text import Text
|
from rich.text import Text
|
||||||
|
|
||||||
from ..reactive import reactive
|
|
||||||
from ..errors import RenderError
|
from ..errors import RenderError
|
||||||
from ..widget import Widget
|
from ..widget import Widget
|
||||||
|
|
||||||
@@ -87,11 +86,11 @@ class Static(Widget):
|
|||||||
"""
|
"""
|
||||||
return self._renderable
|
return self._renderable
|
||||||
|
|
||||||
def update(self, renderable: RenderableType = "", home: bool = False) -> None:
|
def update(self, renderable: RenderableType = "") -> None:
|
||||||
"""Update the widget contents.
|
"""Update the widget's content area with new text or Rich renderable.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
renderable (RenderableType): A new rich renderable.
|
renderable (RenderableType, optional): A new rich renderable. Defaults to empty renderable;
|
||||||
"""
|
"""
|
||||||
_check_renderable(renderable)
|
_check_renderable(renderable)
|
||||||
self.renderable = renderable
|
self.renderable = renderable
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ from typing import ClassVar, Generic, Iterator, NewType, TypeVar
|
|||||||
|
|
||||||
import rich.repr
|
import rich.repr
|
||||||
from rich.console import RenderableType
|
from rich.console import RenderableType
|
||||||
from rich.style import Style
|
from rich.style import Style, NULL_STYLE
|
||||||
from rich.text import Text, TextType
|
from rich.text import Text, TextType
|
||||||
from rich.tree import Tree
|
from rich.tree import Tree
|
||||||
|
|
||||||
@@ -164,10 +164,10 @@ class TreeNode(Generic[NodeDataType]):
|
|||||||
class TreeControl(Generic[NodeDataType], Static, can_focus=True):
|
class TreeControl(Generic[NodeDataType], Static, can_focus=True):
|
||||||
DEFAULT_CSS = """
|
DEFAULT_CSS = """
|
||||||
TreeControl {
|
TreeControl {
|
||||||
|
|
||||||
color: $text;
|
color: $text;
|
||||||
height: auto;
|
height: auto;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
link-style: not underline;
|
||||||
}
|
}
|
||||||
|
|
||||||
TreeControl > .tree--guides {
|
TreeControl > .tree--guides {
|
||||||
@@ -219,6 +219,7 @@ class TreeControl(Generic[NodeDataType], Static, can_focus=True):
|
|||||||
id: str | None = None,
|
id: str | None = None,
|
||||||
classes: str | None = None,
|
classes: str | None = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
|
super().__init__(name=name, id=id, classes=classes)
|
||||||
self.data = data
|
self.data = data
|
||||||
|
|
||||||
self.node_id = NodeID(0)
|
self.node_id = NodeID(0)
|
||||||
@@ -231,7 +232,8 @@ class TreeControl(Generic[NodeDataType], Static, can_focus=True):
|
|||||||
|
|
||||||
self._tree.label = self.root
|
self._tree.label = self.root
|
||||||
self.nodes[NodeID(self.node_id)] = self.root
|
self.nodes[NodeID(self.node_id)] = self.root
|
||||||
super().__init__(name=name, id=id, classes=classes)
|
|
||||||
|
self.auto_links = False
|
||||||
|
|
||||||
hover_node: Reactive[NodeID | None] = Reactive(None)
|
hover_node: Reactive[NodeID | None] = Reactive(None)
|
||||||
cursor: Reactive[NodeID] = Reactive(NodeID(0))
|
cursor: Reactive[NodeID] = Reactive(NodeID(0))
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -205,3 +205,7 @@ def test_rgb_lab_rgb_roundtrip():
|
|||||||
assert c_.r == pytest.approx(r, abs=1)
|
assert c_.r == pytest.approx(r, abs=1)
|
||||||
assert c_.g == pytest.approx(g, abs=1)
|
assert c_.g == pytest.approx(g, abs=1)
|
||||||
assert c_.b == pytest.approx(b, abs=1)
|
assert c_.b == pytest.approx(b, abs=1)
|
||||||
|
|
||||||
|
|
||||||
|
def test_inverse():
|
||||||
|
assert Color(55, 0, 255, 0.1).inverse == Color(200, 255, 0, 0.1)
|
||||||
|
|||||||
Reference in New Issue
Block a user