mirror of
https://github.com/freedomofpress/dangerzone.git
synced 2025-04-28 18:02:38 +02:00
move banner() code to cli & version() to util
- display_banner() was only displayed in CLI mode so it makes sense for it to be in the CLI. - get_version(), was mvoed to util since it is a static function that is needed in multiple parts of the application.
This commit is contained in:
parent
ce57fc0449
commit
c0f0e7bf6a
5 changed files with 203 additions and 200 deletions
|
@ -5,11 +5,12 @@ import sys
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
import click
|
import click
|
||||||
from colorama import Fore, Style
|
from colorama import Back, Fore, Style
|
||||||
|
|
||||||
from .common import Common
|
from .common import Common
|
||||||
from .container import convert
|
from .container import convert
|
||||||
from .global_common import GlobalCommon
|
from .global_common import GlobalCommon
|
||||||
|
from .util import get_version
|
||||||
|
|
||||||
|
|
||||||
def print_header(s: str) -> None:
|
def print_header(s: str) -> None:
|
||||||
|
@ -28,7 +29,7 @@ def cli_main(
|
||||||
global_common = GlobalCommon()
|
global_common = GlobalCommon()
|
||||||
common = Common()
|
common = Common()
|
||||||
|
|
||||||
global_common.display_banner()
|
display_banner()
|
||||||
|
|
||||||
# Validate filename
|
# Validate filename
|
||||||
valid = True
|
valid = True
|
||||||
|
@ -127,3 +128,179 @@ def setup_logging() -> None:
|
||||||
logging.basicConfig(level=logging.DEBUG, format=fmt)
|
logging.basicConfig(level=logging.DEBUG, format=fmt)
|
||||||
else:
|
else:
|
||||||
logging.basicConfig(level=logging.ERROR, format=fmt)
|
logging.basicConfig(level=logging.ERROR, format=fmt)
|
||||||
|
|
||||||
|
|
||||||
|
def display_banner() -> None:
|
||||||
|
"""
|
||||||
|
Raw ASCII art example:
|
||||||
|
╭──────────────────────────╮
|
||||||
|
│ ▄██▄ │
|
||||||
|
│ ██████ │
|
||||||
|
│ ███▀▀▀██ │
|
||||||
|
│ ███ ████ │
|
||||||
|
│ ███ ██████ │
|
||||||
|
│ ███ ▀▀▀▀████ │
|
||||||
|
│ ███████ ▄██████ │
|
||||||
|
│ ███████ ▄█████████ │
|
||||||
|
│ ████████████████████ │
|
||||||
|
│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │
|
||||||
|
│ │
|
||||||
|
│ Dangerzone v0.1.5 │
|
||||||
|
│ https://dangerzone.rocks │
|
||||||
|
╰──────────────────────────╯
|
||||||
|
"""
|
||||||
|
|
||||||
|
print(Back.BLACK + Fore.YELLOW + Style.DIM + "╭──────────────────────────╮")
|
||||||
|
print(
|
||||||
|
Back.BLACK
|
||||||
|
+ Fore.YELLOW
|
||||||
|
+ Style.DIM
|
||||||
|
+ "│"
|
||||||
|
+ Fore.LIGHTYELLOW_EX
|
||||||
|
+ Style.NORMAL
|
||||||
|
+ " ▄██▄ "
|
||||||
|
+ Fore.YELLOW
|
||||||
|
+ Style.DIM
|
||||||
|
+ "│"
|
||||||
|
)
|
||||||
|
print(
|
||||||
|
Back.BLACK
|
||||||
|
+ Fore.YELLOW
|
||||||
|
+ Style.DIM
|
||||||
|
+ "│"
|
||||||
|
+ Fore.LIGHTYELLOW_EX
|
||||||
|
+ Style.NORMAL
|
||||||
|
+ " ██████ "
|
||||||
|
+ Fore.YELLOW
|
||||||
|
+ Style.DIM
|
||||||
|
+ "│"
|
||||||
|
)
|
||||||
|
print(
|
||||||
|
Back.BLACK
|
||||||
|
+ Fore.YELLOW
|
||||||
|
+ Style.DIM
|
||||||
|
+ "│"
|
||||||
|
+ Fore.LIGHTYELLOW_EX
|
||||||
|
+ Style.NORMAL
|
||||||
|
+ " ███▀▀▀██ "
|
||||||
|
+ Fore.YELLOW
|
||||||
|
+ Style.DIM
|
||||||
|
+ "│"
|
||||||
|
)
|
||||||
|
print(
|
||||||
|
Back.BLACK
|
||||||
|
+ Fore.YELLOW
|
||||||
|
+ Style.DIM
|
||||||
|
+ "│"
|
||||||
|
+ Fore.LIGHTYELLOW_EX
|
||||||
|
+ Style.NORMAL
|
||||||
|
+ " ███ ████ "
|
||||||
|
+ Fore.YELLOW
|
||||||
|
+ Style.DIM
|
||||||
|
+ "│"
|
||||||
|
)
|
||||||
|
print(
|
||||||
|
Back.BLACK
|
||||||
|
+ Fore.YELLOW
|
||||||
|
+ Style.DIM
|
||||||
|
+ "│"
|
||||||
|
+ Fore.LIGHTYELLOW_EX
|
||||||
|
+ Style.NORMAL
|
||||||
|
+ " ███ ██████ "
|
||||||
|
+ Fore.YELLOW
|
||||||
|
+ Style.DIM
|
||||||
|
+ "│"
|
||||||
|
)
|
||||||
|
print(
|
||||||
|
Back.BLACK
|
||||||
|
+ Fore.YELLOW
|
||||||
|
+ Style.DIM
|
||||||
|
+ "│"
|
||||||
|
+ Fore.LIGHTYELLOW_EX
|
||||||
|
+ Style.NORMAL
|
||||||
|
+ " ███ ▀▀▀▀████ "
|
||||||
|
+ Fore.YELLOW
|
||||||
|
+ Style.DIM
|
||||||
|
+ "│"
|
||||||
|
)
|
||||||
|
print(
|
||||||
|
Back.BLACK
|
||||||
|
+ Fore.YELLOW
|
||||||
|
+ Style.DIM
|
||||||
|
+ "│"
|
||||||
|
+ Fore.LIGHTYELLOW_EX
|
||||||
|
+ Style.NORMAL
|
||||||
|
+ " ███████ ▄██████ "
|
||||||
|
+ Fore.YELLOW
|
||||||
|
+ Style.DIM
|
||||||
|
+ "│"
|
||||||
|
)
|
||||||
|
print(
|
||||||
|
Back.BLACK
|
||||||
|
+ Fore.YELLOW
|
||||||
|
+ Style.DIM
|
||||||
|
+ "│"
|
||||||
|
+ Fore.LIGHTYELLOW_EX
|
||||||
|
+ Style.NORMAL
|
||||||
|
+ " ███████ ▄█████████ "
|
||||||
|
+ Fore.YELLOW
|
||||||
|
+ Style.DIM
|
||||||
|
+ "│"
|
||||||
|
)
|
||||||
|
print(
|
||||||
|
Back.BLACK
|
||||||
|
+ Fore.YELLOW
|
||||||
|
+ Style.DIM
|
||||||
|
+ "│"
|
||||||
|
+ Fore.LIGHTYELLOW_EX
|
||||||
|
+ Style.NORMAL
|
||||||
|
+ " ████████████████████ "
|
||||||
|
+ Fore.YELLOW
|
||||||
|
+ Style.DIM
|
||||||
|
+ "│"
|
||||||
|
)
|
||||||
|
print(
|
||||||
|
Back.BLACK
|
||||||
|
+ Fore.YELLOW
|
||||||
|
+ Style.DIM
|
||||||
|
+ "│"
|
||||||
|
+ Fore.LIGHTYELLOW_EX
|
||||||
|
+ Style.NORMAL
|
||||||
|
+ " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ "
|
||||||
|
+ Fore.YELLOW
|
||||||
|
+ Style.DIM
|
||||||
|
+ "│"
|
||||||
|
)
|
||||||
|
print(Back.BLACK + Fore.YELLOW + Style.DIM + "│ │")
|
||||||
|
left_spaces = (15 - len(get_version()) - 1) // 2
|
||||||
|
right_spaces = left_spaces
|
||||||
|
if left_spaces + len(get_version()) + 1 + right_spaces < 15:
|
||||||
|
right_spaces += 1
|
||||||
|
print(
|
||||||
|
Back.BLACK
|
||||||
|
+ Fore.YELLOW
|
||||||
|
+ Style.DIM
|
||||||
|
+ "│"
|
||||||
|
+ Style.RESET_ALL
|
||||||
|
+ Back.BLACK
|
||||||
|
+ Fore.LIGHTWHITE_EX
|
||||||
|
+ Style.BRIGHT
|
||||||
|
+ f"{' '*left_spaces}Dangerzone v{get_version()}{' '*right_spaces}"
|
||||||
|
+ Fore.YELLOW
|
||||||
|
+ Style.DIM
|
||||||
|
+ "│"
|
||||||
|
)
|
||||||
|
print(
|
||||||
|
Back.BLACK
|
||||||
|
+ Fore.YELLOW
|
||||||
|
+ Style.DIM
|
||||||
|
+ "│"
|
||||||
|
+ Style.RESET_ALL
|
||||||
|
+ Back.BLACK
|
||||||
|
+ Fore.LIGHTWHITE_EX
|
||||||
|
+ " https://dangerzone.rocks "
|
||||||
|
+ Fore.YELLOW
|
||||||
|
+ Style.DIM
|
||||||
|
+ "│"
|
||||||
|
)
|
||||||
|
print(Back.BLACK + Fore.YELLOW + Style.DIM + "╰──────────────────────────╯")
|
||||||
|
|
|
@ -10,7 +10,6 @@ from typing import Optional
|
||||||
|
|
||||||
import appdirs
|
import appdirs
|
||||||
import colorama
|
import colorama
|
||||||
from colorama import Back, Fore, Style
|
|
||||||
|
|
||||||
from .container import convert
|
from .container import convert
|
||||||
from .settings import Settings
|
from .settings import Settings
|
||||||
|
@ -25,15 +24,6 @@ class GlobalCommon(object):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
# Version
|
|
||||||
try:
|
|
||||||
with open(get_resource_path("version.txt")) as f:
|
|
||||||
self.version = f.read().strip()
|
|
||||||
except FileNotFoundError:
|
|
||||||
# In dev mode, in Windows, get_resource_path doesn't work properly for the container, but luckily
|
|
||||||
# it doesn't need to know the version
|
|
||||||
self.version = "unknown"
|
|
||||||
|
|
||||||
# Initialize terminal colors
|
# Initialize terminal colors
|
||||||
colorama.init(autoreset=True)
|
colorama.init(autoreset=True)
|
||||||
|
|
||||||
|
@ -210,181 +200,6 @@ class GlobalCommon(object):
|
||||||
# Load settings
|
# Load settings
|
||||||
self.settings = Settings(self)
|
self.settings = Settings(self)
|
||||||
|
|
||||||
def display_banner(self) -> None:
|
|
||||||
"""
|
|
||||||
Raw ASCII art example:
|
|
||||||
╭──────────────────────────╮
|
|
||||||
│ ▄██▄ │
|
|
||||||
│ ██████ │
|
|
||||||
│ ███▀▀▀██ │
|
|
||||||
│ ███ ████ │
|
|
||||||
│ ███ ██████ │
|
|
||||||
│ ███ ▀▀▀▀████ │
|
|
||||||
│ ███████ ▄██████ │
|
|
||||||
│ ███████ ▄█████████ │
|
|
||||||
│ ████████████████████ │
|
|
||||||
│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │
|
|
||||||
│ │
|
|
||||||
│ Dangerzone v0.1.5 │
|
|
||||||
│ https://dangerzone.rocks │
|
|
||||||
╰──────────────────────────╯
|
|
||||||
"""
|
|
||||||
|
|
||||||
print(Back.BLACK + Fore.YELLOW + Style.DIM + "╭──────────────────────────╮")
|
|
||||||
print(
|
|
||||||
Back.BLACK
|
|
||||||
+ Fore.YELLOW
|
|
||||||
+ Style.DIM
|
|
||||||
+ "│"
|
|
||||||
+ Fore.LIGHTYELLOW_EX
|
|
||||||
+ Style.NORMAL
|
|
||||||
+ " ▄██▄ "
|
|
||||||
+ Fore.YELLOW
|
|
||||||
+ Style.DIM
|
|
||||||
+ "│"
|
|
||||||
)
|
|
||||||
print(
|
|
||||||
Back.BLACK
|
|
||||||
+ Fore.YELLOW
|
|
||||||
+ Style.DIM
|
|
||||||
+ "│"
|
|
||||||
+ Fore.LIGHTYELLOW_EX
|
|
||||||
+ Style.NORMAL
|
|
||||||
+ " ██████ "
|
|
||||||
+ Fore.YELLOW
|
|
||||||
+ Style.DIM
|
|
||||||
+ "│"
|
|
||||||
)
|
|
||||||
print(
|
|
||||||
Back.BLACK
|
|
||||||
+ Fore.YELLOW
|
|
||||||
+ Style.DIM
|
|
||||||
+ "│"
|
|
||||||
+ Fore.LIGHTYELLOW_EX
|
|
||||||
+ Style.NORMAL
|
|
||||||
+ " ███▀▀▀██ "
|
|
||||||
+ Fore.YELLOW
|
|
||||||
+ Style.DIM
|
|
||||||
+ "│"
|
|
||||||
)
|
|
||||||
print(
|
|
||||||
Back.BLACK
|
|
||||||
+ Fore.YELLOW
|
|
||||||
+ Style.DIM
|
|
||||||
+ "│"
|
|
||||||
+ Fore.LIGHTYELLOW_EX
|
|
||||||
+ Style.NORMAL
|
|
||||||
+ " ███ ████ "
|
|
||||||
+ Fore.YELLOW
|
|
||||||
+ Style.DIM
|
|
||||||
+ "│"
|
|
||||||
)
|
|
||||||
print(
|
|
||||||
Back.BLACK
|
|
||||||
+ Fore.YELLOW
|
|
||||||
+ Style.DIM
|
|
||||||
+ "│"
|
|
||||||
+ Fore.LIGHTYELLOW_EX
|
|
||||||
+ Style.NORMAL
|
|
||||||
+ " ███ ██████ "
|
|
||||||
+ Fore.YELLOW
|
|
||||||
+ Style.DIM
|
|
||||||
+ "│"
|
|
||||||
)
|
|
||||||
print(
|
|
||||||
Back.BLACK
|
|
||||||
+ Fore.YELLOW
|
|
||||||
+ Style.DIM
|
|
||||||
+ "│"
|
|
||||||
+ Fore.LIGHTYELLOW_EX
|
|
||||||
+ Style.NORMAL
|
|
||||||
+ " ███ ▀▀▀▀████ "
|
|
||||||
+ Fore.YELLOW
|
|
||||||
+ Style.DIM
|
|
||||||
+ "│"
|
|
||||||
)
|
|
||||||
print(
|
|
||||||
Back.BLACK
|
|
||||||
+ Fore.YELLOW
|
|
||||||
+ Style.DIM
|
|
||||||
+ "│"
|
|
||||||
+ Fore.LIGHTYELLOW_EX
|
|
||||||
+ Style.NORMAL
|
|
||||||
+ " ███████ ▄██████ "
|
|
||||||
+ Fore.YELLOW
|
|
||||||
+ Style.DIM
|
|
||||||
+ "│"
|
|
||||||
)
|
|
||||||
print(
|
|
||||||
Back.BLACK
|
|
||||||
+ Fore.YELLOW
|
|
||||||
+ Style.DIM
|
|
||||||
+ "│"
|
|
||||||
+ Fore.LIGHTYELLOW_EX
|
|
||||||
+ Style.NORMAL
|
|
||||||
+ " ███████ ▄█████████ "
|
|
||||||
+ Fore.YELLOW
|
|
||||||
+ Style.DIM
|
|
||||||
+ "│"
|
|
||||||
)
|
|
||||||
print(
|
|
||||||
Back.BLACK
|
|
||||||
+ Fore.YELLOW
|
|
||||||
+ Style.DIM
|
|
||||||
+ "│"
|
|
||||||
+ Fore.LIGHTYELLOW_EX
|
|
||||||
+ Style.NORMAL
|
|
||||||
+ " ████████████████████ "
|
|
||||||
+ Fore.YELLOW
|
|
||||||
+ Style.DIM
|
|
||||||
+ "│"
|
|
||||||
)
|
|
||||||
print(
|
|
||||||
Back.BLACK
|
|
||||||
+ Fore.YELLOW
|
|
||||||
+ Style.DIM
|
|
||||||
+ "│"
|
|
||||||
+ Fore.LIGHTYELLOW_EX
|
|
||||||
+ Style.NORMAL
|
|
||||||
+ " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ "
|
|
||||||
+ Fore.YELLOW
|
|
||||||
+ Style.DIM
|
|
||||||
+ "│"
|
|
||||||
)
|
|
||||||
print(Back.BLACK + Fore.YELLOW + Style.DIM + "│ │")
|
|
||||||
left_spaces = (15 - len(self.version) - 1) // 2
|
|
||||||
right_spaces = left_spaces
|
|
||||||
if left_spaces + len(self.version) + 1 + right_spaces < 15:
|
|
||||||
right_spaces += 1
|
|
||||||
print(
|
|
||||||
Back.BLACK
|
|
||||||
+ Fore.YELLOW
|
|
||||||
+ Style.DIM
|
|
||||||
+ "│"
|
|
||||||
+ Style.RESET_ALL
|
|
||||||
+ Back.BLACK
|
|
||||||
+ Fore.LIGHTWHITE_EX
|
|
||||||
+ Style.BRIGHT
|
|
||||||
+ f"{' '*left_spaces}Dangerzone v{self.version}{' '*right_spaces}"
|
|
||||||
+ Fore.YELLOW
|
|
||||||
+ Style.DIM
|
|
||||||
+ "│"
|
|
||||||
)
|
|
||||||
print(
|
|
||||||
Back.BLACK
|
|
||||||
+ Fore.YELLOW
|
|
||||||
+ Style.DIM
|
|
||||||
+ "│"
|
|
||||||
+ Style.RESET_ALL
|
|
||||||
+ Back.BLACK
|
|
||||||
+ Fore.LIGHTWHITE_EX
|
|
||||||
+ " https://dangerzone.rocks "
|
|
||||||
+ Fore.YELLOW
|
|
||||||
+ Style.DIM
|
|
||||||
+ "│"
|
|
||||||
)
|
|
||||||
print(Back.BLACK + Fore.YELLOW + Style.DIM + "╰──────────────────────────╯")
|
|
||||||
|
|
||||||
def get_container_runtime(self) -> str:
|
def get_container_runtime(self) -> str:
|
||||||
if platform.system() == "Linux":
|
if platform.system() == "Linux":
|
||||||
runtime_name = "podman"
|
runtime_name = "podman"
|
||||||
|
|
|
@ -23,3 +23,14 @@ def get_resource_path(filename: str) -> str:
|
||||||
raise NotImplementedError(f"Unsupported system {platform.system()}")
|
raise NotImplementedError(f"Unsupported system {platform.system()}")
|
||||||
resource_path = prefix.joinpath(filename)
|
resource_path = prefix.joinpath(filename)
|
||||||
return str(resource_path)
|
return str(resource_path)
|
||||||
|
|
||||||
|
|
||||||
|
def get_version() -> str:
|
||||||
|
try:
|
||||||
|
with open(get_resource_path("version.txt")) as f:
|
||||||
|
version = f.read().strip()
|
||||||
|
except FileNotFoundError:
|
||||||
|
# In dev mode, in Windows, get_resource_path doesn't work properly for the container, but luckily
|
||||||
|
# it doesn't need to know the version
|
||||||
|
version = "unknown"
|
||||||
|
return version
|
||||||
|
|
|
@ -6,8 +6,9 @@ import tempfile
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from click.testing import CliRunner, Result
|
from click.testing import CliRunner, Result
|
||||||
|
from strip_ansi import strip_ansi # type: ignore
|
||||||
|
|
||||||
from dangerzone.cli import cli_main
|
from dangerzone.cli import cli_main, display_banner
|
||||||
|
|
||||||
from . import TestBase, for_each_doc
|
from . import TestBase, for_each_doc
|
||||||
|
|
||||||
|
@ -39,6 +40,17 @@ class TestCliBasic(TestCli):
|
||||||
result = self.run_cli("--help")
|
result = self.run_cli("--help")
|
||||||
assert result.exit_code == 0
|
assert result.exit_code == 0
|
||||||
|
|
||||||
|
def test_display_banner(self, capfd):
|
||||||
|
display_banner() # call the test subject
|
||||||
|
(out, err) = capfd.readouterr()
|
||||||
|
plain_lines = [strip_ansi(line) for line in out.splitlines()]
|
||||||
|
assert "╭──────────────────────────╮" in plain_lines, "missing top border"
|
||||||
|
assert "╰──────────────────────────╯" in plain_lines, "missing bottom border"
|
||||||
|
|
||||||
|
banner_width = len(plain_lines[0])
|
||||||
|
for line in plain_lines:
|
||||||
|
assert len(line) == banner_width, "banner has inconsistent width"
|
||||||
|
|
||||||
|
|
||||||
class TestCliConversion(TestCliBasic):
|
class TestCliConversion(TestCliBasic):
|
||||||
def test_invalid_lang(self):
|
def test_invalid_lang(self):
|
||||||
|
|
|
@ -3,7 +3,6 @@ import platform
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from strip_ansi import strip_ansi # type: ignore
|
|
||||||
|
|
||||||
import dangerzone.global_common
|
import dangerzone.global_common
|
||||||
|
|
||||||
|
@ -18,14 +17,3 @@ class TestGlobalCommon:
|
||||||
def test_get_subprocess_startupinfo(self, global_common):
|
def test_get_subprocess_startupinfo(self, global_common):
|
||||||
startupinfo = global_common.get_subprocess_startupinfo()
|
startupinfo = global_common.get_subprocess_startupinfo()
|
||||||
self.assertIsInstance(startupinfo, subprocess.STARTUPINFO)
|
self.assertIsInstance(startupinfo, subprocess.STARTUPINFO)
|
||||||
|
|
||||||
def test_display_banner(self, global_common, capfd):
|
|
||||||
global_common.display_banner() # call the test subject
|
|
||||||
(out, err) = capfd.readouterr()
|
|
||||||
plain_lines = [strip_ansi(line) for line in out.splitlines()]
|
|
||||||
assert "╭──────────────────────────╮" in plain_lines, "missing top border"
|
|
||||||
assert "╰──────────────────────────╯" in plain_lines, "missing bottom border"
|
|
||||||
|
|
||||||
banner_width = len(plain_lines[0])
|
|
||||||
for line in plain_lines:
|
|
||||||
assert len(line) == banner_width, "banner has inconsistent width"
|
|
||||||
|
|
Loading…
Reference in a new issue