mirror of
https://github.com/bellingcat/octosuite.git
synced 2026-06-13 05:48:34 +03:00
Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eed3ee8e1c | ||
|
|
5bb0b6db6b | ||
|
|
1916a7e1a6 | ||
|
|
400829c6ec | ||
|
|
914e320b9e | ||
|
|
170148172d | ||
|
|
4d589beda5 |
@@ -7,7 +7,6 @@ TUI-based toolkit for GitHub data analysis.
|
|||||||

|

|
||||||

|

|
||||||

|

|
||||||
[](https://github.com/bellingcat/octosuite/actions/workflows/codeql.yml)
|
|
||||||

|

|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "octosuite"
|
name = "octosuite"
|
||||||
version = "4.0.1beta2"
|
version = "4.0.0"
|
||||||
description = "TUI-based toolkit for GitHub data analysis."
|
description = "TUI-based toolkit for GitHub data analysis."
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
@@ -12,10 +12,11 @@ dependencies = [
|
|||||||
"rich>=14.2.0",
|
"rich>=14.2.0",
|
||||||
"questionary>=2.1.1",
|
"questionary>=2.1.1",
|
||||||
"pyfiglet>=1.0.4",
|
"pyfiglet>=1.0.4",
|
||||||
"update-checker>=0.18.0"
|
"update-checker>=0.18.0",
|
||||||
|
"black>=25.12.0",
|
||||||
]
|
]
|
||||||
classifiers = [
|
classifiers = [
|
||||||
"Development Status :: 4 - Beta",
|
"Development Status :: 5 - Production/Stable",
|
||||||
"Programming Language :: Python :: 3",
|
"Programming Language :: Python :: 3",
|
||||||
"Intended Audience :: End Users/Desktop",
|
"Intended Audience :: End Users/Desktop",
|
||||||
"Operating System :: OS Independent",
|
"Operating System :: OS Independent",
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
__pkg__ = "octosuite"
|
__pkg__ = "octosuite"
|
||||||
__version__ = "4.0.1beta2"
|
__version__ = "4.0.0"
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ def preview_response(data: t.Union[dict, list], source: str, _type: str):
|
|||||||
item.get("full_name")
|
item.get("full_name")
|
||||||
or item.get("name")
|
or item.get("name")
|
||||||
or item.get("login")
|
or item.get("login")
|
||||||
|
or item.get("type")
|
||||||
or item.get("id")
|
or item.get("id")
|
||||||
or "Item"
|
or "Item"
|
||||||
)
|
)
|
||||||
@@ -215,12 +216,12 @@ def fill_tree(tree: Tree, data: t.Union[dict, list]) -> Tree:
|
|||||||
def check_updates():
|
def check_updates():
|
||||||
"""Check for available package updates and display the result."""
|
"""Check for available package updates and display the result."""
|
||||||
|
|
||||||
with console.status("[dim]Checking for updates...[/dim]") as status:
|
with console.status("[dim]Checking for updates[/dim]…") as status:
|
||||||
checker = UpdateChecker()
|
checker = UpdateChecker()
|
||||||
result = checker.check(__pkg__, __version__)
|
result = checker.check(__pkg__, __version__)
|
||||||
if result is not None:
|
if result is not None:
|
||||||
status.stop()
|
status.stop()
|
||||||
message_dialog(title="Update Available", text=result).run()
|
message_dialog(title="Update Available", text=str(result)).run()
|
||||||
else:
|
else:
|
||||||
status.stop()
|
status.stop()
|
||||||
message_dialog(
|
message_dialog(
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ class BaseMenu:
|
|||||||
target_type = "org"
|
target_type = "org"
|
||||||
|
|
||||||
with Status(
|
with Status(
|
||||||
f"[dim]Validating {target_type} ({identifier})[/dim]...",
|
f"[dim]Validating {target_type} ({identifier})[/dim]…",
|
||||||
console=console,
|
console=console,
|
||||||
) as status:
|
) as status:
|
||||||
exists, response = instance.exists()
|
exists, response = instance.exists()
|
||||||
@@ -110,7 +110,7 @@ class BaseMenu:
|
|||||||
console.print(
|
console.print(
|
||||||
f"[bold][yellow]✘[/yellow] {response['message']}[/bold]"
|
f"[bold][yellow]✘[/yellow] {response['message']}[/bold]"
|
||||||
)
|
)
|
||||||
console.input(" Press [bold]ENTER[/bold] to continue ...")
|
console.input(" Press [bold]ENTER[/bold] to continue …")
|
||||||
callback(*callback_args)
|
callback(*callback_args)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@@ -135,7 +135,7 @@ class BaseMenu:
|
|||||||
valid_methods = self.paginated_methods | self.non_paginated_methods
|
valid_methods = self.paginated_methods | self.non_paginated_methods
|
||||||
if method_name in valid_methods:
|
if method_name in valid_methods:
|
||||||
with Status(
|
with Status(
|
||||||
status=f"[dim]Initialising {target_type} {method_name}[/dim]...",
|
status=f"[dim]Initialising {target_type} {method_name}[/dim]…",
|
||||||
console=console,
|
console=console,
|
||||||
) as status:
|
) as status:
|
||||||
data = self.execute_selection(
|
data = self.execute_selection(
|
||||||
@@ -168,7 +168,7 @@ class BaseMenu:
|
|||||||
prompts.pagination_params() if method_name in self.paginated_methods else {}
|
prompts.pagination_params() if method_name in self.paginated_methods else {}
|
||||||
)
|
)
|
||||||
status.start()
|
status.start()
|
||||||
status.update(f"[dim]Getting {method_name} from {source}[/dim]...")
|
status.update(f"[dim]Getting {method_name} from {source}[/dim]…")
|
||||||
return method(**params)
|
return method(**params)
|
||||||
|
|
||||||
def response_handler(self, data: t.Union[dict, list], data_type: str, source: str):
|
def response_handler(self, data: t.Union[dict, list], data_type: str, source: str):
|
||||||
@@ -259,7 +259,7 @@ class BaseMenu:
|
|||||||
file_formats=file_formats,
|
file_formats=file_formats,
|
||||||
)
|
)
|
||||||
|
|
||||||
console.input(" Press [bold]ENTER[/bold] to continue ...")
|
console.input(" Press [bold]ENTER[/bold] to continue …")
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
console.print("\nExport cancelled")
|
console.print("\nExport cancelled")
|
||||||
|
|
||||||
@@ -470,7 +470,7 @@ class Menus(BaseMenu):
|
|||||||
# Execute search if it's a valid method
|
# Execute search if it's a valid method
|
||||||
if option in self.search_methods:
|
if option in self.search_methods:
|
||||||
with Status(
|
with Status(
|
||||||
status=f"[dim]Initialising {option} search[/dim]...", console=console
|
status=f"[dim]Initialising {option} search[/dim]…", console=console
|
||||||
) as status:
|
) as status:
|
||||||
status.stop()
|
status.stop()
|
||||||
params = prompts.pagination_params()
|
params = prompts.pagination_params()
|
||||||
@@ -484,7 +484,7 @@ class Menus(BaseMenu):
|
|||||||
)
|
)
|
||||||
|
|
||||||
method = getattr(search, option)
|
method = getattr(search, option)
|
||||||
status.update(f"[dim]Searching {option} for {query}[/dim]...")
|
status.update(f"[dim]Searching {option} for {query}[/dim]…")
|
||||||
data = method()
|
data = method()
|
||||||
|
|
||||||
if data:
|
if data:
|
||||||
|
|||||||
2
uv.lock
generated
2
uv.lock
generated
@@ -144,6 +144,7 @@ name = "octosuite"
|
|||||||
version = "4.0.0"
|
version = "4.0.0"
|
||||||
source = { virtual = "." }
|
source = { virtual = "." }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
{ name = "black" },
|
||||||
{ name = "pyfiglet" },
|
{ name = "pyfiglet" },
|
||||||
{ name = "questionary" },
|
{ name = "questionary" },
|
||||||
{ name = "rich" },
|
{ name = "rich" },
|
||||||
@@ -157,6 +158,7 @@ dev = [
|
|||||||
|
|
||||||
[package.metadata]
|
[package.metadata]
|
||||||
requires-dist = [
|
requires-dist = [
|
||||||
|
{ name = "black", specifier = ">=25.12.0" },
|
||||||
{ name = "black", marker = "extra == 'dev'", specifier = ">=25.12.0" },
|
{ name = "black", marker = "extra == 'dev'", specifier = ">=25.12.0" },
|
||||||
{ name = "pyfiglet", specifier = ">=1.0.4" },
|
{ name = "pyfiglet", specifier = ">=1.0.4" },
|
||||||
{ name = "questionary", specifier = ">=2.1.1" },
|
{ name = "questionary", specifier = ">=2.1.1" },
|
||||||
|
|||||||
Reference in New Issue
Block a user