lazy-github 0.3.2__tar.gz → 0.3.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {lazy_github-0.3.2 → lazy_github-0.3.4}/.github/workflows/publish.yaml +8 -2
- {lazy_github-0.3.2 → lazy_github-0.3.4}/PKG-INFO +1 -1
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/lib/config.py +1 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/lib/github/notifications.py +20 -1
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/lib/messages.py +21 -1
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/ui/screens/notifications.py +31 -12
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/ui/screens/primary.py +70 -20
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/ui/screens/trigger_workflow.py +3 -3
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/ui/widgets/common.py +25 -15
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/ui/widgets/conversations.py +5 -4
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/ui/widgets/pull_requests.py +3 -3
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/ui/widgets/repositories.py +1 -1
- lazy_github-0.3.4/lazy_github/version.py +1 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/uv.lock +125 -125
- lazy_github-0.3.2/lazy_github/version.py +0 -1
- {lazy_github-0.3.2 → lazy_github-0.3.4}/.devcontainer/devcontainer.json +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/.github/workflows/code-checks.yaml +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/.gitignore +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/.pre-commit-config.yaml +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/LICENSE +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/README.md +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/images/lazy-github-conversation-ui.svg +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/images/lazy-github-settings-ui.png +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/__main__.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/cli.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/lib/bindings.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/lib/constants.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/lib/context.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/lib/git_cli.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/lib/github/auth.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/lib/github/backends/cli.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/lib/github/backends/hishel.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/lib/github/backends/protocol.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/lib/github/branches.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/lib/github/checks.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/lib/github/client.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/lib/github/issues.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/lib/github/pull_requests.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/lib/github/repositories.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/lib/github/workflows.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/lib/logging.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/lib/utils.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/models/github.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/ui/app.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/ui/screens/auth.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/ui/screens/edit_issue.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/ui/screens/lookup_pull_request.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/ui/screens/lookup_repository.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/ui/screens/new_comment.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/ui/screens/new_issue.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/ui/screens/new_pull_request.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/ui/screens/settings.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/ui/widgets/command_log.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/ui/widgets/info.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/ui/widgets/issues.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lazy_github/ui/widgets/workflows.py +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/lint.sh +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/pyproject.toml +0 -0
- {lazy_github-0.3.2 → lazy_github-0.3.4}/start.sh +0 -0
|
@@ -32,13 +32,14 @@ jobs:
|
|
|
32
32
|
- name: Publish package distributions to PyPI
|
|
33
33
|
uses: pypa/gh-action-pypi-publish@release/v1
|
|
34
34
|
|
|
35
|
-
create-tag:
|
|
35
|
+
create-tag-and-release:
|
|
36
36
|
name: Create tag
|
|
37
37
|
needs: pypi-publish
|
|
38
38
|
permissions: write-all
|
|
39
39
|
runs-on: ubuntu-latest
|
|
40
40
|
steps:
|
|
41
|
-
-
|
|
41
|
+
- name: create-tag
|
|
42
|
+
uses: actions/github-script@v7
|
|
42
43
|
with:
|
|
43
44
|
script: |
|
|
44
45
|
github.rest.git.createRef({
|
|
@@ -47,6 +48,11 @@ jobs:
|
|
|
47
48
|
ref: 'refs/tags/v${{ needs.pypi-publish.outputs.new-version }}',
|
|
48
49
|
sha: context.sha
|
|
49
50
|
})
|
|
51
|
+
- name: Create release
|
|
52
|
+
run: |
|
|
53
|
+
gh release create "v${{ needs.pypi-publish.outputs.new-version }}" \
|
|
54
|
+
--title="LazyGithub ${tag#v}" \
|
|
55
|
+
--generate-notes
|
|
50
56
|
|
|
51
57
|
notify-discord:
|
|
52
58
|
name: Notify when this workflow completes (regardless of success or failure)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: lazy-github
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.4
|
|
4
4
|
Summary: A terminal UI for interacting with Github
|
|
5
5
|
Author-email: "Chris (Gizmo)" <gizmo385@users.noreply.github.com>
|
|
6
6
|
Maintainer-email: "Chris (Gizmo)" <gizmo385@users.noreply.github.com>
|
|
@@ -42,6 +42,7 @@ class NotificationSettings(BaseModel):
|
|
|
42
42
|
"""Controls the settings for the optional notification feature, which relies on the standard GitHub CLI."""
|
|
43
43
|
|
|
44
44
|
enabled: bool = False
|
|
45
|
+
mark_notification_as_read_when_selected: bool = True
|
|
45
46
|
|
|
46
47
|
|
|
47
48
|
class BindingsSettings(BaseModel):
|
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import json
|
|
2
|
+
import re
|
|
2
3
|
|
|
4
|
+
from lazy_github.lib.context import LazyGithubContext
|
|
3
5
|
from lazy_github.lib.github.backends.cli import run_gh_cli_command
|
|
6
|
+
from lazy_github.lib.github.pull_requests import get_full_pull_request
|
|
4
7
|
from lazy_github.lib.logging import lg
|
|
5
|
-
from lazy_github.models.github import Notification
|
|
8
|
+
from lazy_github.models.github import FullPullRequest, Notification, NotificationSubject
|
|
6
9
|
|
|
7
10
|
NOTIFICATIONS_PAGE_COUNT = 30
|
|
8
11
|
|
|
12
|
+
_PULL_REQUEST_URL_REGEX = re.compile(r"[^:]+:[\/]+[^\/]+\/repos\/([^\/]+)\/([^\/]+)\/pulls\/(\d+)")
|
|
13
|
+
|
|
9
14
|
|
|
10
15
|
async def fetch_notifications(all: bool) -> list[Notification]:
|
|
11
16
|
"""Fetches notifications on GitHub. If all=True, then previously read notifications will also be returned"""
|
|
@@ -30,3 +35,17 @@ async def mark_notification_as_read(notification: Notification) -> None:
|
|
|
30
35
|
async def unread_notification_count() -> int:
|
|
31
36
|
"""Returns the number of currently unread notifications on GitHub"""
|
|
32
37
|
return len(await fetch_notifications(all=False))
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
async def extract_notification_subject(subject: NotificationSubject) -> FullPullRequest | None:
|
|
41
|
+
"""Attempts to connect the specified notification subject to another Github object, such as a PR"""
|
|
42
|
+
if not (LazyGithubContext.current_repo and subject.url):
|
|
43
|
+
return
|
|
44
|
+
|
|
45
|
+
try:
|
|
46
|
+
# Try and load a PR number from the subject URL
|
|
47
|
+
if matches := _PULL_REQUEST_URL_REGEX.match(subject.url):
|
|
48
|
+
pr_number = int(matches.group(3))
|
|
49
|
+
return await get_full_pull_request(LazyGithubContext.current_repo, pr_number)
|
|
50
|
+
except Exception:
|
|
51
|
+
return None
|
|
@@ -2,7 +2,15 @@ from functools import cached_property
|
|
|
2
2
|
|
|
3
3
|
from textual.message import Message
|
|
4
4
|
|
|
5
|
-
from lazy_github.models.github import
|
|
5
|
+
from lazy_github.models.github import (
|
|
6
|
+
Branch,
|
|
7
|
+
FullPullRequest,
|
|
8
|
+
Issue,
|
|
9
|
+
IssueComment,
|
|
10
|
+
Notification,
|
|
11
|
+
PartialPullRequest,
|
|
12
|
+
Repository,
|
|
13
|
+
)
|
|
6
14
|
|
|
7
15
|
|
|
8
16
|
class RepoSelected(Message):
|
|
@@ -89,3 +97,15 @@ class BranchesLoaded(Message):
|
|
|
89
97
|
def __init__(self, branches: list[Branch]) -> None:
|
|
90
98
|
super().__init__()
|
|
91
99
|
self.branches = branches
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
class NotificationMarkedAsRead(Message):
|
|
103
|
+
def __init__(self, notification: Notification) -> None:
|
|
104
|
+
super().__init__()
|
|
105
|
+
self.notification = notification
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
class NotificationSelected(Message):
|
|
109
|
+
def __init__(self, notification: Notification) -> None:
|
|
110
|
+
super().__init__()
|
|
111
|
+
self.notification = notification
|
|
@@ -2,23 +2,19 @@ from textual import on, work
|
|
|
2
2
|
from textual.app import ComposeResult
|
|
3
3
|
from textual.containers import Container
|
|
4
4
|
from textual.coordinate import Coordinate
|
|
5
|
-
from textual.message import Message
|
|
6
5
|
from textual.screen import ModalScreen
|
|
7
|
-
from textual.widgets import Markdown, TabbedContent, TabPane
|
|
6
|
+
from textual.widgets import DataTable, Markdown, TabbedContent, TabPane
|
|
7
|
+
from textual.widgets.data_table import RowDoesNotExist
|
|
8
8
|
|
|
9
9
|
from lazy_github.lib.bindings import LazyGithubBindings
|
|
10
10
|
from lazy_github.lib.constants import BULLET_POINT, CHECKMARK
|
|
11
|
+
from lazy_github.lib.context import LazyGithubContext
|
|
11
12
|
from lazy_github.lib.github.notifications import fetch_notifications, mark_notification_as_read
|
|
13
|
+
from lazy_github.lib.messages import NotificationMarkedAsRead, NotificationSelected
|
|
12
14
|
from lazy_github.models.github import Notification
|
|
13
15
|
from lazy_github.ui.widgets.common import LazyGithubFooter, SearchableDataTable
|
|
14
16
|
|
|
15
17
|
|
|
16
|
-
class NotificationMarkedAsRead(Message):
|
|
17
|
-
def __init__(self, notification: Notification) -> None:
|
|
18
|
-
super().__init__()
|
|
19
|
-
self.notification = notification
|
|
20
|
-
|
|
21
|
-
|
|
22
18
|
class _NotificationsTableTabPane(TabPane):
|
|
23
19
|
def __init__(self, prefix: str, *args, **kwargs) -> None:
|
|
24
20
|
super().__init__(*args, **kwargs)
|
|
@@ -37,7 +33,7 @@ class _NotificationsTableTabPane(TabPane):
|
|
|
37
33
|
|
|
38
34
|
def add_notification(self, notification: Notification) -> None:
|
|
39
35
|
self.notifications[notification.id] = notification
|
|
40
|
-
self.searchable_table.
|
|
36
|
+
self.searchable_table.add_row(
|
|
41
37
|
notification.updated_at.strftime("%c"),
|
|
42
38
|
notification.subject.subject_type,
|
|
43
39
|
notification.subject.title.strip(),
|
|
@@ -45,6 +41,17 @@ class _NotificationsTableTabPane(TabPane):
|
|
|
45
41
|
notification.id,
|
|
46
42
|
key=str(notification.id),
|
|
47
43
|
)
|
|
44
|
+
self.searchable_table.sort()
|
|
45
|
+
|
|
46
|
+
def get_selected_notification(self) -> Notification:
|
|
47
|
+
current_row = self.searchable_table.table.cursor_row
|
|
48
|
+
id = self.searchable_table.table.get_cell_at(Coordinate(current_row, self.id_column))
|
|
49
|
+
return self.notifications[int(id)]
|
|
50
|
+
|
|
51
|
+
@on(DataTable.RowSelected)
|
|
52
|
+
def notification_selected(self) -> None:
|
|
53
|
+
notification = self.get_selected_notification()
|
|
54
|
+
self.post_message(NotificationSelected(notification))
|
|
48
55
|
|
|
49
56
|
def on_mount(self) -> None:
|
|
50
57
|
self.searchable_table.loading = True
|
|
@@ -102,8 +109,11 @@ class NotificationsContainer(Container):
|
|
|
102
109
|
@on(NotificationMarkedAsRead)
|
|
103
110
|
async def notification_marked_read(self, message: NotificationMarkedAsRead) -> None:
|
|
104
111
|
await mark_notification_as_read(message.notification)
|
|
105
|
-
|
|
106
|
-
|
|
112
|
+
try:
|
|
113
|
+
self.unread_tab.remove_notification(message.notification)
|
|
114
|
+
self.read_tab.add_notification(message.notification)
|
|
115
|
+
except RowDoesNotExist:
|
|
116
|
+
pass
|
|
107
117
|
|
|
108
118
|
def action_view_read(self) -> None:
|
|
109
119
|
self.query_one(TabbedContent).active = "read"
|
|
@@ -137,7 +147,7 @@ class NotificationsContainer(Container):
|
|
|
137
147
|
self.load_notifications()
|
|
138
148
|
|
|
139
149
|
|
|
140
|
-
class NotificationsModal(ModalScreen[None]):
|
|
150
|
+
class NotificationsModal(ModalScreen[Notification | None]):
|
|
141
151
|
DEFAULT_CSS = """
|
|
142
152
|
NotificationsModal {
|
|
143
153
|
height: 80%;
|
|
@@ -160,5 +170,14 @@ class NotificationsModal(ModalScreen[None]):
|
|
|
160
170
|
yield NotificationsContainer(id="notifications")
|
|
161
171
|
yield LazyGithubFooter()
|
|
162
172
|
|
|
173
|
+
@on(NotificationSelected)
|
|
174
|
+
async def handle_notification_selected(self, message: NotificationSelected) -> None:
|
|
175
|
+
if (
|
|
176
|
+
message.notification.unread
|
|
177
|
+
and LazyGithubContext.config.notifications.mark_notification_as_read_when_selected
|
|
178
|
+
):
|
|
179
|
+
await mark_notification_as_read(message.notification)
|
|
180
|
+
self.dismiss(message.notification)
|
|
181
|
+
|
|
163
182
|
async def action_close(self) -> None:
|
|
164
183
|
self.dismiss()
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from functools import partial
|
|
2
2
|
from typing import NamedTuple
|
|
3
3
|
|
|
4
|
-
from textual import work
|
|
4
|
+
from textual import on, work
|
|
5
5
|
from textual.app import ComposeResult
|
|
6
6
|
from textual.command import Hit, Hits, Provider
|
|
7
7
|
from textual.containers import Container, Horizontal
|
|
@@ -18,7 +18,7 @@ from lazy_github.lib.context import LazyGithubContext
|
|
|
18
18
|
from lazy_github.lib.github.auth import is_logged_in_to_cli
|
|
19
19
|
from lazy_github.lib.github.backends.protocol import GithubApiRequestFailed
|
|
20
20
|
from lazy_github.lib.github.issues import list_issues
|
|
21
|
-
from lazy_github.lib.github.notifications import unread_notification_count
|
|
21
|
+
from lazy_github.lib.github.notifications import extract_notification_subject, unread_notification_count
|
|
22
22
|
from lazy_github.lib.github.pull_requests import get_full_pull_request
|
|
23
23
|
from lazy_github.lib.logging import lg
|
|
24
24
|
from lazy_github.lib.messages import (
|
|
@@ -27,7 +27,7 @@ from lazy_github.lib.messages import (
|
|
|
27
27
|
PullRequestSelected,
|
|
28
28
|
RepoSelected,
|
|
29
29
|
)
|
|
30
|
-
from lazy_github.models.github import Repository
|
|
30
|
+
from lazy_github.models.github import Issue, PartialPullRequest, Repository
|
|
31
31
|
from lazy_github.ui.screens.new_issue import NewIssueModal
|
|
32
32
|
from lazy_github.ui.screens.new_pull_request import NewPullRequestModal
|
|
33
33
|
from lazy_github.ui.screens.notifications import NotificationsModal
|
|
@@ -164,7 +164,7 @@ class SelectionsPane(Container):
|
|
|
164
164
|
return
|
|
165
165
|
|
|
166
166
|
if new_issue := await self.app.push_screen_wait(NewIssueModal()):
|
|
167
|
-
self.issues.searchable_table.
|
|
167
|
+
self.issues.searchable_table.add_rows([issue_to_cell(new_issue)])
|
|
168
168
|
self.issues.issues[new_issue.number] = new_issue
|
|
169
169
|
|
|
170
170
|
async def action_open_pull_request(self) -> None:
|
|
@@ -177,7 +177,7 @@ class SelectionsPane(Container):
|
|
|
177
177
|
return
|
|
178
178
|
|
|
179
179
|
if new_pr := await self.app.push_screen_wait(NewPullRequestModal()):
|
|
180
|
-
self.pull_requests.searchable_table.
|
|
180
|
+
self.pull_requests.searchable_table.add_rows([pull_request_to_cell(new_pr)])
|
|
181
181
|
self.pull_requests.pull_requests[new_pr.number] = new_pr
|
|
182
182
|
|
|
183
183
|
@property
|
|
@@ -198,6 +198,13 @@ class SelectionsPane(Container):
|
|
|
198
198
|
|
|
199
199
|
@work
|
|
200
200
|
async def fetch_issues_and_pull_requests(self, repo: Repository) -> None:
|
|
201
|
+
"""
|
|
202
|
+
Fetches the combined issues and pull requests from the Github API and then adds them to the appropriate tables.
|
|
203
|
+
|
|
204
|
+
Pull Requests are technically issues in the Github data model, so they are fetched by loading issues and then
|
|
205
|
+
checking returned attributes to determine if those attributes indicate that an issue can be treated as a pull
|
|
206
|
+
request instead.
|
|
207
|
+
"""
|
|
201
208
|
state_filter = LazyGithubContext.config.issues.state_filter
|
|
202
209
|
owner_filter = LazyGithubContext.config.issues.owner_filter
|
|
203
210
|
try:
|
|
@@ -209,13 +216,16 @@ class SelectionsPane(Container):
|
|
|
209
216
|
self.pull_requests.post_message(issue_and_pr_message)
|
|
210
217
|
self.issues.post_message(issue_and_pr_message)
|
|
211
218
|
|
|
212
|
-
async def
|
|
213
|
-
|
|
214
|
-
LazyGithubContext.current_repo = message.repo
|
|
219
|
+
async def load_repository(self, repo: Repository) -> None:
|
|
220
|
+
"""Loads more information about the specified repository, such as the PRs, issues, and workflows"""
|
|
215
221
|
if self.pull_requests.display or self.issues.display:
|
|
216
|
-
self.fetch_issues_and_pull_requests(
|
|
222
|
+
self.fetch_issues_and_pull_requests(repo)
|
|
217
223
|
if self.workflows.display:
|
|
218
|
-
self.workflows.load_repo(
|
|
224
|
+
self.workflows.load_repo(repo)
|
|
225
|
+
|
|
226
|
+
@on(RepoSelected)
|
|
227
|
+
async def handle_repo_selection(self, message: RepoSelected) -> None:
|
|
228
|
+
await self.load_repository(message.repo)
|
|
219
229
|
|
|
220
230
|
|
|
221
231
|
class SelectionDetailsPane(Container):
|
|
@@ -269,8 +279,11 @@ class MainViewPane(Container):
|
|
|
269
279
|
def details(self) -> SelectionDetailsContainer:
|
|
270
280
|
return self.query_one("#selection_details", SelectionDetailsContainer)
|
|
271
281
|
|
|
272
|
-
async def
|
|
273
|
-
|
|
282
|
+
async def load_repository(self, repo: Repository) -> None:
|
|
283
|
+
await self.selections.load_repository(repo)
|
|
284
|
+
|
|
285
|
+
async def load_pull_request(self, pull_request: PartialPullRequest) -> None:
|
|
286
|
+
full_pr = await get_full_pull_request(pull_request.repo, pull_request.number)
|
|
274
287
|
tabbed_content = self.query_one("#selection_detail_tabs", TabbedContent)
|
|
275
288
|
await tabbed_content.clear_panes()
|
|
276
289
|
await tabbed_content.add_pane(PrOverviewTabPane(full_pr))
|
|
@@ -279,13 +292,21 @@ class MainViewPane(Container):
|
|
|
279
292
|
tabbed_content.children[0].focus()
|
|
280
293
|
self.details.border_title = f"[5] PR #{full_pr.number} Details"
|
|
281
294
|
|
|
282
|
-
async def
|
|
295
|
+
async def load_issue(self, issue: Issue) -> None:
|
|
283
296
|
tabbed_content = self.query_one("#selection_detail_tabs", TabbedContent)
|
|
284
297
|
await tabbed_content.clear_panes()
|
|
285
|
-
await tabbed_content.add_pane(IssueOverviewTabPane(
|
|
286
|
-
await tabbed_content.add_pane(IssueConversationTabPane(
|
|
298
|
+
await tabbed_content.add_pane(IssueOverviewTabPane(issue))
|
|
299
|
+
await tabbed_content.add_pane(IssueConversationTabPane(issue))
|
|
287
300
|
tabbed_content.children[0].focus()
|
|
288
|
-
self.details.border_title = f"[5] Issue #{
|
|
301
|
+
self.details.border_title = f"[5] Issue #{issue.number} Details"
|
|
302
|
+
|
|
303
|
+
@on(PullRequestSelected)
|
|
304
|
+
async def handle_pull_request_selection(self, message: PullRequestSelected) -> None:
|
|
305
|
+
await self.load_pull_request(message.pr)
|
|
306
|
+
|
|
307
|
+
@on(IssueSelected)
|
|
308
|
+
async def handle_issue_selection(self, message: IssueSelected) -> None:
|
|
309
|
+
await self.load_issue(message.issue)
|
|
289
310
|
|
|
290
311
|
|
|
291
312
|
class LazyGithubCommand(NamedTuple):
|
|
@@ -348,14 +369,37 @@ class LazyGithubMainScreen(Screen):
|
|
|
348
369
|
def compose(self):
|
|
349
370
|
with Container():
|
|
350
371
|
yield LazyGithubStatusSummary()
|
|
351
|
-
yield MainViewPane()
|
|
372
|
+
yield MainViewPane(id="main-view-pane")
|
|
352
373
|
yield LazyGithubFooter()
|
|
353
374
|
|
|
375
|
+
@property
|
|
376
|
+
def main_view_pane(self) -> MainViewPane:
|
|
377
|
+
return self.query_one("#main-view-pane", MainViewPane)
|
|
378
|
+
|
|
354
379
|
@work
|
|
355
380
|
async def action_view_notifications(self) -> None:
|
|
356
|
-
await self.app.push_screen_wait(NotificationsModal())
|
|
381
|
+
notification = await self.app.push_screen_wait(NotificationsModal())
|
|
357
382
|
self.refresh_notification_count()
|
|
358
383
|
|
|
384
|
+
if not notification:
|
|
385
|
+
return
|
|
386
|
+
|
|
387
|
+
# The thing we'll do most immediately is swap over to the repo associated with the notification
|
|
388
|
+
await self.main_view_pane.load_repository(notification.repository)
|
|
389
|
+
self.set_currently_loaded_repo(notification.repository)
|
|
390
|
+
|
|
391
|
+
# Try to determine the source of the notification more specifically than just the repo. If we can, then we'll
|
|
392
|
+
# load that more-specific subject (such as the pull request), otherwise we will settle for the already loaded
|
|
393
|
+
# repo.
|
|
394
|
+
subject = await extract_notification_subject(notification.subject)
|
|
395
|
+
match subject:
|
|
396
|
+
case None:
|
|
397
|
+
self.notify("Opening repository for notification")
|
|
398
|
+
return
|
|
399
|
+
case PartialPullRequest():
|
|
400
|
+
await self.main_view_pane.load_pull_request(subject)
|
|
401
|
+
self.notify("Opening pull request for notification")
|
|
402
|
+
|
|
359
403
|
async def on_mount(self) -> None:
|
|
360
404
|
if LazyGithubContext.config.notifications.enabled:
|
|
361
405
|
self.refresh_notification_count()
|
|
@@ -399,5 +443,11 @@ class LazyGithubMainScreen(Screen):
|
|
|
399
443
|
NOTIFICATION_REFRESH_INTERVAL, self.refresh_notification_count
|
|
400
444
|
)
|
|
401
445
|
|
|
402
|
-
def
|
|
403
|
-
|
|
446
|
+
def set_currently_loaded_repo(self, repo: Repository) -> None:
|
|
447
|
+
lg.info(f"Selected repo {repo.full_name}")
|
|
448
|
+
LazyGithubContext.current_repo = repo
|
|
449
|
+
self.query_one("#currently_selected_repo", CurrentlySelectedRepo).current_repo_name = repo.full_name
|
|
450
|
+
|
|
451
|
+
@on(RepoSelected)
|
|
452
|
+
def handle_repo_selection(self, message: RepoSelected) -> None:
|
|
453
|
+
self.set_currently_loaded_repo(message.repo)
|
|
@@ -76,11 +76,11 @@ class TriggerWorkflowContainer(Container):
|
|
|
76
76
|
class TriggerWorkflowModal(ModalScreen[bool]):
|
|
77
77
|
DEFAULT_CSS = """
|
|
78
78
|
TriggerWorkflowModal {
|
|
79
|
-
|
|
79
|
+
align: center middle;
|
|
80
|
+
content-align: center middle;
|
|
80
81
|
}
|
|
81
82
|
|
|
82
83
|
TriggerWorkflowContainer {
|
|
83
|
-
dock: top;
|
|
84
84
|
width: 60;
|
|
85
85
|
max-height: 20;
|
|
86
86
|
border: thick $background 80%;
|
|
@@ -98,7 +98,7 @@ class TriggerWorkflowModal(ModalScreen[bool]):
|
|
|
98
98
|
yield TriggerWorkflowContainer(self.workflow)
|
|
99
99
|
yield LazyGithubFooter()
|
|
100
100
|
|
|
101
|
-
@on(Button.Pressed, "#
|
|
101
|
+
@on(Button.Pressed, "#submit")
|
|
102
102
|
async def action_submit(self) -> None:
|
|
103
103
|
assert LazyGithubContext.current_repo is not None, "Unexpectedly missing current repo!"
|
|
104
104
|
branch_input = self.query_one("#branch_to_build", Input)
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from asyncio import Lock
|
|
1
2
|
from typing import Awaitable, Callable, Iterable
|
|
2
3
|
|
|
3
4
|
from textual import on, work
|
|
@@ -16,7 +17,7 @@ class LazyGithubFooter(Footer):
|
|
|
16
17
|
super().__init__(show_command_palette=False)
|
|
17
18
|
|
|
18
19
|
|
|
19
|
-
class _VimLikeDataTable(DataTable):
|
|
20
|
+
class _VimLikeDataTable(DataTable[str | int]):
|
|
20
21
|
"An data table for LazyGithub that provides some more vim-like bindings"
|
|
21
22
|
|
|
22
23
|
BINDINGS = [
|
|
@@ -83,12 +84,20 @@ class SearchableDataTable(Vertical):
|
|
|
83
84
|
self._rows_cache = []
|
|
84
85
|
self.table.clear()
|
|
85
86
|
|
|
86
|
-
def
|
|
87
|
+
def add_row(self, *cells: str | int, key: str | None = None) -> None:
|
|
88
|
+
self._rows_cache.append(tuple(cells))
|
|
89
|
+
self.table.add_row(*cells, key=key)
|
|
90
|
+
|
|
91
|
+
def add_rows(self, rows: Iterable[tuple[str | int, ...]], keys: Iterable[str] | None = None) -> None:
|
|
87
92
|
"""Add new rows to the currently displayed table and cache"""
|
|
88
93
|
self._rows_cache.extend(rows)
|
|
89
94
|
# TODO: Should this actually call handle_submitted_search so that new rows which don't match criteria aren't
|
|
90
95
|
# shown?
|
|
91
|
-
|
|
96
|
+
if keys:
|
|
97
|
+
for row, key in zip(rows, keys):
|
|
98
|
+
self.table.add_row(*row, key=key)
|
|
99
|
+
else:
|
|
100
|
+
self.table.add_rows(rows)
|
|
92
101
|
self.sort()
|
|
93
102
|
|
|
94
103
|
def set_rows(self, rows: list[tuple[str | int, ...]]) -> None:
|
|
@@ -130,6 +139,7 @@ class LazilyLoadedDataTable(SearchableDataTable):
|
|
|
130
139
|
**kwargs,
|
|
131
140
|
) -> None:
|
|
132
141
|
super().__init__(table_id, search_input_id, sort_key, *args, reverse_sort=reverse_sort, **kwargs)
|
|
142
|
+
self.fetch_lock = Lock()
|
|
133
143
|
self.load_function = load_function
|
|
134
144
|
self.batch_size = batch_size
|
|
135
145
|
self.load_more_data_buffer = load_more_data_buffer
|
|
@@ -152,22 +162,22 @@ class LazilyLoadedDataTable(SearchableDataTable):
|
|
|
152
162
|
def change_load_function(self, new_load_function: TABLE_POPULATION_FUNCTION | None) -> None:
|
|
153
163
|
self.load_function = new_load_function
|
|
154
164
|
|
|
155
|
-
@work
|
|
165
|
+
@work
|
|
156
166
|
async def load_more_data(self, row_highlighted: DataTable.RowHighlighted) -> None:
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
167
|
+
async with self.fetch_lock:
|
|
168
|
+
rows_remaining = len(self._rows_cache) - row_highlighted.cursor_row
|
|
169
|
+
if not (self.can_load_more and self.load_function):
|
|
170
|
+
return
|
|
161
171
|
|
|
162
|
-
|
|
163
|
-
|
|
172
|
+
if rows_remaining > self.load_more_data_buffer:
|
|
173
|
+
return
|
|
164
174
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
175
|
+
additional_data = await self.load_function(self.batch_size, self.current_batch + 1)
|
|
176
|
+
self.current_batch += 1
|
|
177
|
+
if len(additional_data) == 0:
|
|
178
|
+
self.can_load_more = False
|
|
169
179
|
|
|
170
|
-
|
|
180
|
+
self.add_rows(additional_data)
|
|
171
181
|
|
|
172
182
|
@on(DataTable.RowHighlighted)
|
|
173
183
|
async def check_highlighted_row_boundary(self, row_highlighted: DataTable.RowHighlighted) -> None:
|
|
@@ -111,10 +111,11 @@ class ReviewContainer(Collapsible, can_focus=True):
|
|
|
111
111
|
else:
|
|
112
112
|
review_state_text = self.review.state.title()
|
|
113
113
|
yield Label(f"Review from {self.review.user.login} ({review_state_text})")
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
114
|
+
if self.review.body:
|
|
115
|
+
yield Markdown(self.review.body)
|
|
116
|
+
for comment in self.review.comments:
|
|
117
|
+
if comment_node := self.hierarchy[comment.id]:
|
|
118
|
+
yield ReviewConversation(self.pr, comment_node)
|
|
118
119
|
|
|
119
120
|
def action_reply_to_review(self) -> None:
|
|
120
121
|
self.app.push_screen(NewCommentModal(self.pr.repo, self.pr, self.review))
|
|
@@ -67,7 +67,7 @@ class PullRequestsContainer(LazyGithubContainer):
|
|
|
67
67
|
if pr := await self.app.push_screen_wait(LookupPullRequestModal()):
|
|
68
68
|
if pr.number not in self.pull_requests:
|
|
69
69
|
self.pull_requests[pr.number] = pr
|
|
70
|
-
self.searchable_table.
|
|
70
|
+
self.searchable_table.add_row(*pull_request_to_cell(pr), str(pr.number))
|
|
71
71
|
|
|
72
72
|
self.post_message(PullRequestSelected(pr))
|
|
73
73
|
lg.info(f"Looked up PR #{pr.number}")
|
|
@@ -315,8 +315,8 @@ class PrConversationTabPane(TabPane):
|
|
|
315
315
|
for review in reviews:
|
|
316
316
|
if review.body:
|
|
317
317
|
handled_comment_node_ids.extend([c.id for c in review.comments])
|
|
318
|
-
|
|
319
|
-
|
|
318
|
+
review_container = ReviewContainer(self.pr, review, review_hierarchy)
|
|
319
|
+
self.comments_and_reviews.mount(review_container)
|
|
320
320
|
|
|
321
321
|
for comment in comments:
|
|
322
322
|
if comment.body and comment.id not in handled_comment_node_ids:
|
|
@@ -79,7 +79,7 @@ class ReposContainer(LazyGithubContainer):
|
|
|
79
79
|
|
|
80
80
|
async def add_repo_to_table(self, repo: Repository) -> None:
|
|
81
81
|
self.repos[repo.full_name] = repo
|
|
82
|
-
self.searchable_table.
|
|
82
|
+
self.searchable_table.add_row(*_repo_to_row(repo), repo.full_name)
|
|
83
83
|
|
|
84
84
|
@work
|
|
85
85
|
async def action_lookup_repository(self) -> None:
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
VERSION = "0.3.4"
|
|
@@ -12,7 +12,7 @@ wheels = [
|
|
|
12
12
|
|
|
13
13
|
[[package]]
|
|
14
14
|
name = "aiohttp"
|
|
15
|
-
version = "3.11.
|
|
15
|
+
version = "3.11.11"
|
|
16
16
|
source = { registry = "https://pypi.org/simple" }
|
|
17
17
|
dependencies = [
|
|
18
18
|
{ name = "aiohappyeyeballs" },
|
|
@@ -23,53 +23,53 @@ dependencies = [
|
|
|
23
23
|
{ name = "propcache" },
|
|
24
24
|
{ name = "yarl" },
|
|
25
25
|
]
|
|
26
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
27
|
-
wheels = [
|
|
28
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
29
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
30
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
31
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
32
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
33
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
34
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
35
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
36
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
37
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
38
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
39
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
40
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
41
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
42
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
43
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
44
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
45
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
46
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
47
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
48
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
49
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
50
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
51
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
52
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
53
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
54
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
55
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
56
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
57
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
58
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
59
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
60
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
61
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
62
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
63
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
64
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
65
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
66
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
67
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
68
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
69
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
70
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
71
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
72
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
26
|
+
sdist = { url = "https://files.pythonhosted.org/packages/fe/ed/f26db39d29cd3cb2f5a3374304c713fe5ab5a0e4c8ee25a0c45cc6adf844/aiohttp-3.11.11.tar.gz", hash = "sha256:bb49c7f1e6ebf3821a42d81d494f538107610c3a705987f53068546b0e90303e", size = 7669618 }
|
|
27
|
+
wheels = [
|
|
28
|
+
{ url = "https://files.pythonhosted.org/packages/34/ae/e8806a9f054e15f1d18b04db75c23ec38ec954a10c0a68d3bd275d7e8be3/aiohttp-3.11.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ba74ec819177af1ef7f59063c6d35a214a8fde6f987f7661f4f0eecc468a8f76", size = 708624 },
|
|
29
|
+
{ url = "https://files.pythonhosted.org/packages/c7/e0/313ef1a333fb4d58d0c55a6acb3cd772f5d7756604b455181049e222c020/aiohttp-3.11.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4af57160800b7a815f3fe0eba9b46bf28aafc195555f1824555fa2cfab6c1538", size = 468507 },
|
|
30
|
+
{ url = "https://files.pythonhosted.org/packages/a9/60/03455476bf1f467e5b4a32a465c450548b2ce724eec39d69f737191f936a/aiohttp-3.11.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ffa336210cf9cd8ed117011085817d00abe4c08f99968deef0013ea283547204", size = 455571 },
|
|
31
|
+
{ url = "https://files.pythonhosted.org/packages/be/f9/469588603bd75bf02c8ffb8c8a0d4b217eed446b49d4a767684685aa33fd/aiohttp-3.11.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81b8fe282183e4a3c7a1b72f5ade1094ed1c6345a8f153506d114af5bf8accd9", size = 1685694 },
|
|
32
|
+
{ url = "https://files.pythonhosted.org/packages/88/b9/1b7fa43faf6c8616fa94c568dc1309ffee2b6b68b04ac268e5d64b738688/aiohttp-3.11.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af41686ccec6a0f2bdc66686dc0f403c41ac2089f80e2214a0f82d001052c03", size = 1743660 },
|
|
33
|
+
{ url = "https://files.pythonhosted.org/packages/2a/8b/0248d19dbb16b67222e75f6aecedd014656225733157e5afaf6a6a07e2e8/aiohttp-3.11.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70d1f9dde0e5dd9e292a6d4d00058737052b01f3532f69c0c65818dac26dc287", size = 1785421 },
|
|
34
|
+
{ url = "https://files.pythonhosted.org/packages/c4/11/f478e071815a46ca0a5ae974651ff0c7a35898c55063305a896e58aa1247/aiohttp-3.11.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:249cc6912405917344192b9f9ea5cd5b139d49e0d2f5c7f70bdfaf6b4dbf3a2e", size = 1675145 },
|
|
35
|
+
{ url = "https://files.pythonhosted.org/packages/26/5d/284d182fecbb5075ae10153ff7374f57314c93a8681666600e3a9e09c505/aiohttp-3.11.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0eb98d90b6690827dcc84c246811feeb4e1eea683c0eac6caed7549be9c84665", size = 1619804 },
|
|
36
|
+
{ url = "https://files.pythonhosted.org/packages/1b/78/980064c2ad685c64ce0e8aeeb7ef1e53f43c5b005edcd7d32e60809c4992/aiohttp-3.11.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec82bf1fda6cecce7f7b915f9196601a1bd1a3079796b76d16ae4cce6d0ef89b", size = 1654007 },
|
|
37
|
+
{ url = "https://files.pythonhosted.org/packages/21/8d/9e658d63b1438ad42b96f94da227f2e2c1d5c6001c9e8ffcc0bfb22e9105/aiohttp-3.11.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9fd46ce0845cfe28f108888b3ab17abff84ff695e01e73657eec3f96d72eef34", size = 1650022 },
|
|
38
|
+
{ url = "https://files.pythonhosted.org/packages/85/fd/a032bf7f2755c2df4f87f9effa34ccc1ef5cea465377dbaeef93bb56bbd6/aiohttp-3.11.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:bd176afcf8f5d2aed50c3647d4925d0db0579d96f75a31e77cbaf67d8a87742d", size = 1732899 },
|
|
39
|
+
{ url = "https://files.pythonhosted.org/packages/c5/0c/c2b85fde167dd440c7ba50af2aac20b5a5666392b174df54c00f888c5a75/aiohttp-3.11.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ec2aa89305006fba9ffb98970db6c8221541be7bee4c1d027421d6f6df7d1ce2", size = 1755142 },
|
|
40
|
+
{ url = "https://files.pythonhosted.org/packages/bc/78/91ae1a3b3b3bed8b893c5d69c07023e151b1c95d79544ad04cf68f596c2f/aiohttp-3.11.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:92cde43018a2e17d48bb09c79e4d4cb0e236de5063ce897a5e40ac7cb4878773", size = 1692736 },
|
|
41
|
+
{ url = "https://files.pythonhosted.org/packages/77/89/a7ef9c4b4cdb546fcc650ca7f7395aaffbd267f0e1f648a436bec33c9b95/aiohttp-3.11.11-cp311-cp311-win32.whl", hash = "sha256:aba807f9569455cba566882c8938f1a549f205ee43c27b126e5450dc9f83cc62", size = 416418 },
|
|
42
|
+
{ url = "https://files.pythonhosted.org/packages/fc/db/2192489a8a51b52e06627506f8ac8df69ee221de88ab9bdea77aa793aa6a/aiohttp-3.11.11-cp311-cp311-win_amd64.whl", hash = "sha256:ae545f31489548c87b0cced5755cfe5a5308d00407000e72c4fa30b19c3220ac", size = 442509 },
|
|
43
|
+
{ url = "https://files.pythonhosted.org/packages/69/cf/4bda538c502f9738d6b95ada11603c05ec260807246e15e869fc3ec5de97/aiohttp-3.11.11-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e595c591a48bbc295ebf47cb91aebf9bd32f3ff76749ecf282ea7f9f6bb73886", size = 704666 },
|
|
44
|
+
{ url = "https://files.pythonhosted.org/packages/46/7b/87fcef2cad2fad420ca77bef981e815df6904047d0a1bd6aeded1b0d1d66/aiohttp-3.11.11-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3ea1b59dc06396b0b424740a10a0a63974c725b1c64736ff788a3689d36c02d2", size = 464057 },
|
|
45
|
+
{ url = "https://files.pythonhosted.org/packages/5a/a6/789e1f17a1b6f4a38939fbc39d29e1d960d5f89f73d0629a939410171bc0/aiohttp-3.11.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8811f3f098a78ffa16e0ea36dffd577eb031aea797cbdba81be039a4169e242c", size = 455996 },
|
|
46
|
+
{ url = "https://files.pythonhosted.org/packages/b7/dd/485061fbfef33165ce7320db36e530cd7116ee1098e9c3774d15a732b3fd/aiohttp-3.11.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7227b87a355ce1f4bf83bfae4399b1f5bb42e0259cb9405824bd03d2f4336a", size = 1682367 },
|
|
47
|
+
{ url = "https://files.pythonhosted.org/packages/e9/d7/9ec5b3ea9ae215c311d88b2093e8da17e67b8856673e4166c994e117ee3e/aiohttp-3.11.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d40f9da8cabbf295d3a9dae1295c69975b86d941bc20f0a087f0477fa0a66231", size = 1736989 },
|
|
48
|
+
{ url = "https://files.pythonhosted.org/packages/d6/fb/ea94927f7bfe1d86178c9d3e0a8c54f651a0a655214cce930b3c679b8f64/aiohttp-3.11.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffb3dc385f6bb1568aa974fe65da84723210e5d9707e360e9ecb51f59406cd2e", size = 1793265 },
|
|
49
|
+
{ url = "https://files.pythonhosted.org/packages/40/7f/6de218084f9b653026bd7063cd8045123a7ba90c25176465f266976d8c82/aiohttp-3.11.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8f5f7515f3552d899c61202d99dcb17d6e3b0de777900405611cd747cecd1b8", size = 1691841 },
|
|
50
|
+
{ url = "https://files.pythonhosted.org/packages/77/e2/992f43d87831cbddb6b09c57ab55499332f60ad6fdbf438ff4419c2925fc/aiohttp-3.11.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3499c7ffbfd9c6a3d8d6a2b01c26639da7e43d47c7b4f788016226b1e711caa8", size = 1619317 },
|
|
51
|
+
{ url = "https://files.pythonhosted.org/packages/96/74/879b23cdd816db4133325a201287c95bef4ce669acde37f8f1b8669e1755/aiohttp-3.11.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8e2bf8029dbf0810c7bfbc3e594b51c4cc9101fbffb583a3923aea184724203c", size = 1641416 },
|
|
52
|
+
{ url = "https://files.pythonhosted.org/packages/30/98/b123f6b15d87c54e58fd7ae3558ff594f898d7f30a90899718f3215ad328/aiohttp-3.11.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b6212a60e5c482ef90f2d788835387070a88d52cf6241d3916733c9176d39eab", size = 1646514 },
|
|
53
|
+
{ url = "https://files.pythonhosted.org/packages/d7/38/257fda3dc99d6978ab943141d5165ec74fd4b4164baa15e9c66fa21da86b/aiohttp-3.11.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d119fafe7b634dbfa25a8c597718e69a930e4847f0b88e172744be24515140da", size = 1702095 },
|
|
54
|
+
{ url = "https://files.pythonhosted.org/packages/0c/f4/ddab089053f9fb96654df5505c0a69bde093214b3c3454f6bfdb1845f558/aiohttp-3.11.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:6fba278063559acc730abf49845d0e9a9e1ba74f85f0ee6efd5803f08b285853", size = 1734611 },
|
|
55
|
+
{ url = "https://files.pythonhosted.org/packages/c3/d6/f30b2bc520c38c8aa4657ed953186e535ae84abe55c08d0f70acd72ff577/aiohttp-3.11.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:92fc484e34b733704ad77210c7957679c5c3877bd1e6b6d74b185e9320cc716e", size = 1694576 },
|
|
56
|
+
{ url = "https://files.pythonhosted.org/packages/bc/97/b0a88c3f4c6d0020b34045ee6d954058abc870814f6e310c4c9b74254116/aiohttp-3.11.11-cp312-cp312-win32.whl", hash = "sha256:9f5b3c1ed63c8fa937a920b6c1bec78b74ee09593b3f5b979ab2ae5ef60d7600", size = 411363 },
|
|
57
|
+
{ url = "https://files.pythonhosted.org/packages/7f/23/cc36d9c398980acaeeb443100f0216f50a7cfe20c67a9fd0a2f1a5a846de/aiohttp-3.11.11-cp312-cp312-win_amd64.whl", hash = "sha256:1e69966ea6ef0c14ee53ef7a3d68b564cc408121ea56c0caa2dc918c1b2f553d", size = 437666 },
|
|
58
|
+
{ url = "https://files.pythonhosted.org/packages/49/d1/d8af164f400bad432b63e1ac857d74a09311a8334b0481f2f64b158b50eb/aiohttp-3.11.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:541d823548ab69d13d23730a06f97460f4238ad2e5ed966aaf850d7c369782d9", size = 697982 },
|
|
59
|
+
{ url = "https://files.pythonhosted.org/packages/92/d1/faad3bf9fa4bfd26b95c69fc2e98937d52b1ff44f7e28131855a98d23a17/aiohttp-3.11.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:929f3ed33743a49ab127c58c3e0a827de0664bfcda566108989a14068f820194", size = 460662 },
|
|
60
|
+
{ url = "https://files.pythonhosted.org/packages/db/61/0d71cc66d63909dabc4590f74eba71f91873a77ea52424401c2498d47536/aiohttp-3.11.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0882c2820fd0132240edbb4a51eb8ceb6eef8181db9ad5291ab3332e0d71df5f", size = 452950 },
|
|
61
|
+
{ url = "https://files.pythonhosted.org/packages/07/db/6d04bc7fd92784900704e16b745484ef45b77bd04e25f58f6febaadf7983/aiohttp-3.11.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b63de12e44935d5aca7ed7ed98a255a11e5cb47f83a9fded7a5e41c40277d104", size = 1665178 },
|
|
62
|
+
{ url = "https://files.pythonhosted.org/packages/54/5c/e95ade9ae29f375411884d9fd98e50535bf9fe316c9feb0f30cd2ac8f508/aiohttp-3.11.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa54f8ef31d23c506910c21163f22b124facb573bff73930735cf9fe38bf7dff", size = 1717939 },
|
|
63
|
+
{ url = "https://files.pythonhosted.org/packages/6f/1c/1e7d5c5daea9e409ed70f7986001b8c9e3a49a50b28404498d30860edab6/aiohttp-3.11.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a344d5dc18074e3872777b62f5f7d584ae4344cd6006c17ba12103759d407af3", size = 1775125 },
|
|
64
|
+
{ url = "https://files.pythonhosted.org/packages/5d/66/890987e44f7d2f33a130e37e01a164168e6aff06fce15217b6eaf14df4f6/aiohttp-3.11.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7fb429ab1aafa1f48578eb315ca45bd46e9c37de11fe45c7f5f4138091e2f1", size = 1677176 },
|
|
65
|
+
{ url = "https://files.pythonhosted.org/packages/8f/dc/e2ba57d7a52df6cdf1072fd5fa9c6301a68e1cd67415f189805d3eeb031d/aiohttp-3.11.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c341c7d868750e31961d6d8e60ff040fb9d3d3a46d77fd85e1ab8e76c3e9a5c4", size = 1603192 },
|
|
66
|
+
{ url = "https://files.pythonhosted.org/packages/6c/9e/8d08a57de79ca3a358da449405555e668f2c8871a7777ecd2f0e3912c272/aiohttp-3.11.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed9ee95614a71e87f1a70bc81603f6c6760128b140bc4030abe6abaa988f1c3d", size = 1618296 },
|
|
67
|
+
{ url = "https://files.pythonhosted.org/packages/56/51/89822e3ec72db352c32e7fc1c690370e24e231837d9abd056490f3a49886/aiohttp-3.11.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:de8d38f1c2810fa2a4f1d995a2e9c70bb8737b18da04ac2afbf3971f65781d87", size = 1616524 },
|
|
68
|
+
{ url = "https://files.pythonhosted.org/packages/2c/fa/e2e6d9398f462ffaa095e84717c1732916a57f1814502929ed67dd7568ef/aiohttp-3.11.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a9b7371665d4f00deb8f32208c7c5e652059b0fda41cf6dbcac6114a041f1cc2", size = 1685471 },
|
|
69
|
+
{ url = "https://files.pythonhosted.org/packages/ae/5f/6bb976e619ca28a052e2c0ca7b0251ccd893f93d7c24a96abea38e332bf6/aiohttp-3.11.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:620598717fce1b3bd14dd09947ea53e1ad510317c85dda2c9c65b622edc96b12", size = 1715312 },
|
|
70
|
+
{ url = "https://files.pythonhosted.org/packages/79/c1/756a7e65aa087c7fac724d6c4c038f2faaa2a42fe56dbc1dd62a33ca7213/aiohttp-3.11.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf8d9bfee991d8acc72d060d53860f356e07a50f0e0d09a8dfedea1c554dd0d5", size = 1672783 },
|
|
71
|
+
{ url = "https://files.pythonhosted.org/packages/73/ba/a6190ebb02176c7f75e6308da31f5d49f6477b651a3dcfaaaca865a298e2/aiohttp-3.11.11-cp313-cp313-win32.whl", hash = "sha256:9d73ee3725b7a737ad86c2eac5c57a4a97793d9f442599bea5ec67ac9f4bdc3d", size = 410229 },
|
|
72
|
+
{ url = "https://files.pythonhosted.org/packages/b8/62/c9fa5bafe03186a0e4699150a7fed9b1e73240996d0d2f0e5f70f3fdf471/aiohttp-3.11.11-cp313-cp313-win_amd64.whl", hash = "sha256:c7a06301c2fb096bdb0bd25fe2011531c1453b9f2c163c8031600ec73af1cc99", size = 436081 },
|
|
73
73
|
]
|
|
74
74
|
|
|
75
75
|
[[package]]
|
|
@@ -122,11 +122,11 @@ wheels = [
|
|
|
122
122
|
|
|
123
123
|
[[package]]
|
|
124
124
|
name = "attrs"
|
|
125
|
-
version = "24.
|
|
125
|
+
version = "24.3.0"
|
|
126
126
|
source = { registry = "https://pypi.org/simple" }
|
|
127
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
127
|
+
sdist = { url = "https://files.pythonhosted.org/packages/48/c8/6260f8ccc11f0917360fc0da435c5c9c7504e3db174d5a12a1494887b045/attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff", size = 805984 }
|
|
128
128
|
wheels = [
|
|
129
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
129
|
+
{ url = "https://files.pythonhosted.org/packages/89/aa/ab0f7891a01eeb2d2e338ae8fecbe57fcebea1a24dbb64d45801bfab481d/attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308", size = 63397 },
|
|
130
130
|
]
|
|
131
131
|
|
|
132
132
|
[[package]]
|
|
@@ -321,8 +321,8 @@ wheels = [
|
|
|
321
321
|
|
|
322
322
|
[[package]]
|
|
323
323
|
name = "lazy-github"
|
|
324
|
-
version = "0.2
|
|
325
|
-
source = {
|
|
324
|
+
version = "0.3.2"
|
|
325
|
+
source = { editable = "." }
|
|
326
326
|
dependencies = [
|
|
327
327
|
{ name = "click" },
|
|
328
328
|
{ name = "hishel" },
|
|
@@ -645,69 +645,69 @@ wheels = [
|
|
|
645
645
|
|
|
646
646
|
[[package]]
|
|
647
647
|
name = "pydantic"
|
|
648
|
-
version = "2.10.
|
|
648
|
+
version = "2.10.4"
|
|
649
649
|
source = { registry = "https://pypi.org/simple" }
|
|
650
650
|
dependencies = [
|
|
651
651
|
{ name = "annotated-types" },
|
|
652
652
|
{ name = "pydantic-core" },
|
|
653
653
|
{ name = "typing-extensions" },
|
|
654
654
|
]
|
|
655
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
655
|
+
sdist = { url = "https://files.pythonhosted.org/packages/70/7e/fb60e6fee04d0ef8f15e4e01ff187a196fa976eb0f0ab524af4599e5754c/pydantic-2.10.4.tar.gz", hash = "sha256:82f12e9723da6de4fe2ba888b5971157b3be7ad914267dea8f05f82b28254f06", size = 762094 }
|
|
656
656
|
wheels = [
|
|
657
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
657
|
+
{ url = "https://files.pythonhosted.org/packages/f3/26/3e1bbe954fde7ee22a6e7d31582c642aad9e84ffe4b5fb61e63b87cd326f/pydantic-2.10.4-py3-none-any.whl", hash = "sha256:597e135ea68be3a37552fb524bc7d0d66dcf93d395acd93a00682f1efcb8ee3d", size = 431765 },
|
|
658
658
|
]
|
|
659
659
|
|
|
660
660
|
[[package]]
|
|
661
661
|
name = "pydantic-core"
|
|
662
|
-
version = "2.27.
|
|
662
|
+
version = "2.27.2"
|
|
663
663
|
source = { registry = "https://pypi.org/simple" }
|
|
664
664
|
dependencies = [
|
|
665
665
|
{ name = "typing-extensions" },
|
|
666
666
|
]
|
|
667
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
668
|
-
wheels = [
|
|
669
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
670
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
671
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
672
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
673
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
674
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
675
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
676
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
677
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
678
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
679
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
680
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
681
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
682
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
683
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
684
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
685
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
686
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
687
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
688
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
689
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
690
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
691
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
692
|
-
{ url = "https://files.pythonhosted.org/packages/f2/
|
|
693
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
694
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
695
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
696
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
697
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
698
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
699
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
700
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
701
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
702
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
703
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
704
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
705
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
706
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
707
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
708
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
709
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
710
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
667
|
+
sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 }
|
|
668
|
+
wheels = [
|
|
669
|
+
{ url = "https://files.pythonhosted.org/packages/c2/89/f3450af9d09d44eea1f2c369f49e8f181d742f28220f88cc4dfaae91ea6e/pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc", size = 1893421 },
|
|
670
|
+
{ url = "https://files.pythonhosted.org/packages/9e/e3/71fe85af2021f3f386da42d291412e5baf6ce7716bd7101ea49c810eda90/pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7", size = 1814998 },
|
|
671
|
+
{ url = "https://files.pythonhosted.org/packages/a6/3c/724039e0d848fd69dbf5806894e26479577316c6f0f112bacaf67aa889ac/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15", size = 1826167 },
|
|
672
|
+
{ url = "https://files.pythonhosted.org/packages/2b/5b/1b29e8c1fb5f3199a9a57c1452004ff39f494bbe9bdbe9a81e18172e40d3/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306", size = 1865071 },
|
|
673
|
+
{ url = "https://files.pythonhosted.org/packages/89/6c/3985203863d76bb7d7266e36970d7e3b6385148c18a68cc8915fd8c84d57/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99", size = 2036244 },
|
|
674
|
+
{ url = "https://files.pythonhosted.org/packages/0e/41/f15316858a246b5d723f7d7f599f79e37493b2e84bfc789e58d88c209f8a/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459", size = 2737470 },
|
|
675
|
+
{ url = "https://files.pythonhosted.org/packages/a8/7c/b860618c25678bbd6d1d99dbdfdf0510ccb50790099b963ff78a124b754f/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048", size = 1992291 },
|
|
676
|
+
{ url = "https://files.pythonhosted.org/packages/bf/73/42c3742a391eccbeab39f15213ecda3104ae8682ba3c0c28069fbcb8c10d/pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d", size = 1994613 },
|
|
677
|
+
{ url = "https://files.pythonhosted.org/packages/94/7a/941e89096d1175d56f59340f3a8ebaf20762fef222c298ea96d36a6328c5/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b", size = 2002355 },
|
|
678
|
+
{ url = "https://files.pythonhosted.org/packages/6e/95/2359937a73d49e336a5a19848713555605d4d8d6940c3ec6c6c0ca4dcf25/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474", size = 2126661 },
|
|
679
|
+
{ url = "https://files.pythonhosted.org/packages/2b/4c/ca02b7bdb6012a1adef21a50625b14f43ed4d11f1fc237f9d7490aa5078c/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6", size = 2153261 },
|
|
680
|
+
{ url = "https://files.pythonhosted.org/packages/72/9d/a241db83f973049a1092a079272ffe2e3e82e98561ef6214ab53fe53b1c7/pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c", size = 1812361 },
|
|
681
|
+
{ url = "https://files.pythonhosted.org/packages/e8/ef/013f07248041b74abd48a385e2110aa3a9bbfef0fbd97d4e6d07d2f5b89a/pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc", size = 1982484 },
|
|
682
|
+
{ url = "https://files.pythonhosted.org/packages/10/1c/16b3a3e3398fd29dca77cea0a1d998d6bde3902fa2706985191e2313cc76/pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4", size = 1867102 },
|
|
683
|
+
{ url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127 },
|
|
684
|
+
{ url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340 },
|
|
685
|
+
{ url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900 },
|
|
686
|
+
{ url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177 },
|
|
687
|
+
{ url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046 },
|
|
688
|
+
{ url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386 },
|
|
689
|
+
{ url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060 },
|
|
690
|
+
{ url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870 },
|
|
691
|
+
{ url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822 },
|
|
692
|
+
{ url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364 },
|
|
693
|
+
{ url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303 },
|
|
694
|
+
{ url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064 },
|
|
695
|
+
{ url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046 },
|
|
696
|
+
{ url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092 },
|
|
697
|
+
{ url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 },
|
|
698
|
+
{ url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 },
|
|
699
|
+
{ url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 },
|
|
700
|
+
{ url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 },
|
|
701
|
+
{ url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 },
|
|
702
|
+
{ url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 },
|
|
703
|
+
{ url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 },
|
|
704
|
+
{ url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 },
|
|
705
|
+
{ url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 },
|
|
706
|
+
{ url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 },
|
|
707
|
+
{ url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 },
|
|
708
|
+
{ url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 },
|
|
709
|
+
{ url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 },
|
|
710
|
+
{ url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 },
|
|
711
711
|
]
|
|
712
712
|
|
|
713
713
|
[[package]]
|
|
@@ -721,15 +721,15 @@ wheels = [
|
|
|
721
721
|
|
|
722
722
|
[[package]]
|
|
723
723
|
name = "pyright"
|
|
724
|
-
version = "1.1.
|
|
724
|
+
version = "1.1.391"
|
|
725
725
|
source = { registry = "https://pypi.org/simple" }
|
|
726
726
|
dependencies = [
|
|
727
727
|
{ name = "nodeenv" },
|
|
728
728
|
{ name = "typing-extensions" },
|
|
729
729
|
]
|
|
730
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
730
|
+
sdist = { url = "https://files.pythonhosted.org/packages/11/05/4ea52a8a45cc28897edb485b4102d37cbfd5fce8445d679cdeb62bfad221/pyright-1.1.391.tar.gz", hash = "sha256:66b2d42cdf5c3cbab05f2f4b76e8bec8aa78e679bfa0b6ad7b923d9e027cadb2", size = 21965 }
|
|
731
731
|
wheels = [
|
|
732
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
732
|
+
{ url = "https://files.pythonhosted.org/packages/ad/89/66f49552fbeb21944c8077d11834b2201514a56fd1b7747ffff9630f1bd9/pyright-1.1.391-py3-none-any.whl", hash = "sha256:54fa186f8b3e8a55a44ebfa842636635688670c6896dcf6cf4a7fc75062f4d15", size = 18579 },
|
|
733
733
|
]
|
|
734
734
|
|
|
735
735
|
[[package]]
|
|
@@ -782,27 +782,27 @@ wheels = [
|
|
|
782
782
|
|
|
783
783
|
[[package]]
|
|
784
784
|
name = "ruff"
|
|
785
|
-
version = "0.8.
|
|
786
|
-
source = { registry = "https://pypi.org/simple" }
|
|
787
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
788
|
-
wheels = [
|
|
789
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
790
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
791
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
792
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
793
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
794
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
795
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
796
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
797
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
798
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
799
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
800
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
801
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
802
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
803
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
804
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
805
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
785
|
+
version = "0.8.4"
|
|
786
|
+
source = { registry = "https://pypi.org/simple" }
|
|
787
|
+
sdist = { url = "https://files.pythonhosted.org/packages/34/37/9c02181ef38d55b77d97c68b78e705fd14c0de0e5d085202bb2b52ce5be9/ruff-0.8.4.tar.gz", hash = "sha256:0d5f89f254836799af1615798caa5f80b7f935d7a670fad66c5007928e57ace8", size = 3402103 }
|
|
788
|
+
wheels = [
|
|
789
|
+
{ url = "https://files.pythonhosted.org/packages/05/67/f480bf2f2723b2e49af38ed2be75ccdb2798fca7d56279b585c8f553aaab/ruff-0.8.4-py3-none-linux_armv6l.whl", hash = "sha256:58072f0c06080276804c6a4e21a9045a706584a958e644353603d36ca1eb8a60", size = 10546415 },
|
|
790
|
+
{ url = "https://files.pythonhosted.org/packages/eb/7a/5aba20312c73f1ce61814e520d1920edf68ca3b9c507bd84d8546a8ecaa8/ruff-0.8.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ffb60904651c00a1e0b8df594591770018a0f04587f7deeb3838344fe3adabac", size = 10346113 },
|
|
791
|
+
{ url = "https://files.pythonhosted.org/packages/76/f4/c41de22b3728486f0aa95383a44c42657b2db4062f3234ca36fc8cf52d8b/ruff-0.8.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6ddf5d654ac0d44389f6bf05cee4caeefc3132a64b58ea46738111d687352296", size = 9943564 },
|
|
792
|
+
{ url = "https://files.pythonhosted.org/packages/0e/f0/afa0d2191af495ac82d4cbbfd7a94e3df6f62a04ca412033e073b871fc6d/ruff-0.8.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e248b1f0fa2749edd3350a2a342b67b43a2627434c059a063418e3d375cfe643", size = 10805522 },
|
|
793
|
+
{ url = "https://files.pythonhosted.org/packages/12/57/5d1e9a0fd0c228e663894e8e3a8e7063e5ee90f8e8e60cf2085f362bfa1a/ruff-0.8.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf197b98ed86e417412ee3b6c893f44c8864f816451441483253d5ff22c0e81e", size = 10306763 },
|
|
794
|
+
{ url = "https://files.pythonhosted.org/packages/04/df/f069fdb02e408be8aac6853583572a2873f87f866fe8515de65873caf6b8/ruff-0.8.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c41319b85faa3aadd4d30cb1cffdd9ac6b89704ff79f7664b853785b48eccdf3", size = 11359574 },
|
|
795
|
+
{ url = "https://files.pythonhosted.org/packages/d3/04/37c27494cd02e4a8315680debfc6dfabcb97e597c07cce0044db1f9dfbe2/ruff-0.8.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:9f8402b7c4f96463f135e936d9ab77b65711fcd5d72e5d67597b543bbb43cf3f", size = 12094851 },
|
|
796
|
+
{ url = "https://files.pythonhosted.org/packages/81/b1/c5d7fb68506cab9832d208d03ea4668da9a9887a4a392f4f328b1bf734ad/ruff-0.8.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4e56b3baa9c23d324ead112a4fdf20db9a3f8f29eeabff1355114dd96014604", size = 11655539 },
|
|
797
|
+
{ url = "https://files.pythonhosted.org/packages/ef/38/8f8f2c8898dc8a7a49bc340cf6f00226917f0f5cb489e37075bcb2ce3671/ruff-0.8.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:736272574e97157f7edbbb43b1d046125fce9e7d8d583d5d65d0c9bf2c15addf", size = 12912805 },
|
|
798
|
+
{ url = "https://files.pythonhosted.org/packages/06/dd/fa6660c279f4eb320788876d0cff4ea18d9af7d9ed7216d7bd66877468d0/ruff-0.8.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5fe710ab6061592521f902fca7ebcb9fabd27bc7c57c764298b1c1f15fff720", size = 11205976 },
|
|
799
|
+
{ url = "https://files.pythonhosted.org/packages/a8/d7/de94cc89833b5de455750686c17c9e10f4e1ab7ccdc5521b8fe911d1477e/ruff-0.8.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:13e9ec6d6b55f6da412d59953d65d66e760d583dd3c1c72bf1f26435b5bfdbae", size = 10792039 },
|
|
800
|
+
{ url = "https://files.pythonhosted.org/packages/6d/15/3e4906559248bdbb74854af684314608297a05b996062c9d72e0ef7c7097/ruff-0.8.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:97d9aefef725348ad77d6db98b726cfdb075a40b936c7984088804dfd38268a7", size = 10400088 },
|
|
801
|
+
{ url = "https://files.pythonhosted.org/packages/a2/21/9ed4c0e8133cb4a87a18d470f534ad1a8a66d7bec493bcb8bda2d1a5d5be/ruff-0.8.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ab78e33325a6f5374e04c2ab924a3367d69a0da36f8c9cb6b894a62017506111", size = 10900814 },
|
|
802
|
+
{ url = "https://files.pythonhosted.org/packages/0d/5d/122a65a18955bd9da2616b69bc839351f8baf23b2805b543aa2f0aed72b5/ruff-0.8.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:8ef06f66f4a05c3ddbc9121a8b0cecccd92c5bf3dd43b5472ffe40b8ca10f0f8", size = 11268828 },
|
|
803
|
+
{ url = "https://files.pythonhosted.org/packages/43/a9/1676ee9106995381e3d34bccac5bb28df70194167337ed4854c20f27c7ba/ruff-0.8.4-py3-none-win32.whl", hash = "sha256:552fb6d861320958ca5e15f28b20a3d071aa83b93caee33a87b471f99a6c0835", size = 8805621 },
|
|
804
|
+
{ url = "https://files.pythonhosted.org/packages/10/98/ed6b56a30ee76771c193ff7ceeaf1d2acc98d33a1a27b8479cbdb5c17a23/ruff-0.8.4-py3-none-win_amd64.whl", hash = "sha256:f21a1143776f8656d7f364bd264a9d60f01b7f52243fbe90e7670c0dfe0cf65d", size = 9660086 },
|
|
805
|
+
{ url = "https://files.pythonhosted.org/packages/13/9f/026e18ca7d7766783d779dae5e9c656746c6ede36ef73c6d934aaf4a6dec/ruff-0.8.4-py3-none-win_arm64.whl", hash = "sha256:9183dd615d8df50defa8b1d9a074053891ba39025cf5ae88e8bcb52edcc4bf08", size = 9074500 },
|
|
806
806
|
]
|
|
807
807
|
|
|
808
808
|
[[package]]
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
VERSION = "0.3.2"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|