Marco Ricci commited on 2025-02-13 21:07:55
Zeige 3 geänderte Dateien mit 152 Einfügungen und 12 Löschungen.
| ... | ... |
@@ -16,6 +16,7 @@ Warning: |
| 16 | 16 |
from __future__ import annotations |
| 17 | 17 |
|
| 18 | 18 |
import collections |
| 19 |
+import importlib.metadata |
|
| 19 | 20 |
import inspect |
| 20 | 21 |
import logging |
| 21 | 22 |
import os |
| ... | ... |
@@ -39,6 +40,7 @@ if TYPE_CHECKING: |
| 39 | 40 |
|
| 40 | 41 |
PROG_NAME = _internals.PROG_NAME |
| 41 | 42 |
VERSION = _internals.VERSION |
| 43 |
+VERSION_OUTPUT_WRAPPING_WIDTH = 72 |
|
| 42 | 44 |
|
| 43 | 45 |
# Error messages |
| 44 | 46 |
NOT_AN_INTEGER = 'not an integer' |
| ... | ... |
@@ -957,14 +959,111 @@ def version_option_callback( |
| 957 | 959 |
) -> None: |
| 958 | 960 |
del param |
| 959 | 961 |
if value and not ctx.resilient_parsing: |
| 962 |
+ major_dependencies: list[str] = [] |
|
| 963 |
+ derivation_schemes = {'vault': True}
|
|
| 964 |
+ foreign_configuration_formats = {
|
|
| 965 |
+ 'vault storeroom': False, |
|
| 966 |
+ 'vault v0.2': False, |
|
| 967 |
+ 'vault v0.3': False, |
|
| 968 |
+ } |
|
| 969 |
+ known_extras = {
|
|
| 970 |
+ 'export': False, |
|
| 971 |
+ } |
|
| 972 |
+ try: |
|
| 973 |
+ from derivepassphrase.exporter import storeroom, vault_native # noqa: I001,PLC0415 |
|
| 974 |
+ |
|
| 975 |
+ foreign_configuration_formats[ |
|
| 976 |
+ 'vault storeroom' |
|
| 977 |
+ ] = not storeroom.STUBBED |
|
| 978 |
+ foreign_configuration_formats[ |
|
| 979 |
+ 'vault v0.2' |
|
| 980 |
+ ] = not vault_native.STUBBED |
|
| 981 |
+ foreign_configuration_formats[ |
|
| 982 |
+ 'vault v0.3' |
|
| 983 |
+ ] = not vault_native.STUBBED |
|
| 984 |
+ known_extras['export'] = ( |
|
| 985 |
+ not storeroom.STUBBED and not vault_native.STUBBED |
|
| 986 |
+ ) |
|
| 987 |
+ except ModuleNotFoundError: # pragma: no cover |
|
| 988 |
+ pass |
|
| 989 |
+ try: |
|
| 990 |
+ cryptography_version = importlib.metadata.version('cryptography')
|
|
| 991 |
+ except ModuleNotFoundError: |
|
| 992 |
+ pass |
|
| 993 |
+ else: |
|
| 994 |
+ major_dependencies.append(f'cryptography {cryptography_version}')
|
|
| 995 |
+ major_dependencies.append(f'click {click.__version__}')
|
|
| 996 |
+ |
|
| 997 |
+ click.echo( |
|
| 998 |
+ ' '.join([ |
|
| 999 |
+ click.style(PROG_NAME, bold=True), |
|
| 1000 |
+ VERSION, |
|
| 1001 |
+ ]), |
|
| 1002 |
+ color=ctx.color, |
|
| 1003 |
+ ) |
|
| 1004 |
+ for dependency in major_dependencies: |
|
| 960 | 1005 |
click.echo( |
| 961 | 1006 |
str( |
| 962 | 1007 |
_msg.TranslatedString( |
| 963 |
- _msg.Label.VERSION_INFO_TEXT, |
|
| 964 |
- PROG_NAME=PROG_NAME, |
|
| 965 |
- VERSION=VERSION, |
|
| 1008 |
+ _msg.Label.VERSION_INFO_MAJOR_LIBRARY_TEXT, |
|
| 1009 |
+ dependency_name_and_version=dependency, |
|
| 1010 |
+ ) |
|
| 1011 |
+ ), |
|
| 1012 |
+ color=ctx.color, |
|
| 966 | 1013 |
) |
| 1014 |
+ click.echo() |
|
| 1015 |
+ version_info_types = {
|
|
| 1016 |
+ _msg.Label.SUPPORTED_DERIVATION_SCHEMES: [ |
|
| 1017 |
+ k for k, v in derivation_schemes.items() if v |
|
| 1018 |
+ ], |
|
| 1019 |
+ _msg.Label.KNOWN_DERIVATION_SCHEMES: [ |
|
| 1020 |
+ k for k, v in derivation_schemes.items() if not v |
|
| 1021 |
+ ], |
|
| 1022 |
+ _msg.Label.SUPPORTED_FOREIGN_CONFIGURATION_FORMATS: [ |
|
| 1023 |
+ k for k, v in foreign_configuration_formats.items() if v |
|
| 1024 |
+ ], |
|
| 1025 |
+ _msg.Label.KNOWN_FOREIGN_CONFIGURATION_FORMATS: [ |
|
| 1026 |
+ k for k, v in foreign_configuration_formats.items() if not v |
|
| 1027 |
+ ], |
|
| 1028 |
+ _msg.Label.ENABLED_PEP508_EXTRAS: [ |
|
| 1029 |
+ k for k, v in known_extras.items() if v |
|
| 1030 |
+ ], |
|
| 1031 |
+ } |
|
| 1032 |
+ for message_label, item_list in version_info_types.items(): |
|
| 1033 |
+ if item_list: |
|
| 1034 |
+ current_length = len(str(_msg.TranslatedString(message_label))) |
|
| 1035 |
+ formatted_item_list_pieces: list[str] = [] |
|
| 1036 |
+ n = len(item_list) |
|
| 1037 |
+ for i, item in enumerate(item_list, start=1): |
|
| 1038 |
+ space = ' ' |
|
| 1039 |
+ punctuation = '.' if i == n else ',' |
|
| 1040 |
+ if ( |
|
| 1041 |
+ current_length |
|
| 1042 |
+ + len(space) |
|
| 1043 |
+ + len(item) |
|
| 1044 |
+ + len(punctuation) |
|
| 1045 |
+ <= VERSION_OUTPUT_WRAPPING_WIDTH |
|
| 1046 |
+ ): |
|
| 1047 |
+ current_length += ( |
|
| 1048 |
+ len(space) + len(item) + len(punctuation) |
|
| 1049 |
+ ) |
|
| 1050 |
+ piece = f'{space}{item}{punctuation}'
|
|
| 1051 |
+ else: |
|
| 1052 |
+ space = ' ' |
|
| 1053 |
+ current_length = ( |
|
| 1054 |
+ len(space) + len(item) + len(punctuation) |
|
| 1055 |
+ ) |
|
| 1056 |
+ piece = f'\n{space}{item}{punctuation}'
|
|
| 1057 |
+ formatted_item_list_pieces.append(piece) |
|
| 1058 |
+ click.echo( |
|
| 1059 |
+ ''.join([ |
|
| 1060 |
+ click.style( |
|
| 1061 |
+ str(_msg.TranslatedString(message_label)), |
|
| 1062 |
+ bold=True, |
|
| 967 | 1063 |
), |
| 1064 |
+ ''.join(formatted_item_list_pieces), |
|
| 1065 |
+ ]), |
|
| 1066 |
+ color=ctx.color, |
|
| 968 | 1067 |
) |
| 969 | 1068 |
ctx.exit() |
| 970 | 1069 |
|
| ... | ... |
@@ -1214,7 +1214,7 @@ class Label(enum.Enum): |
| 1214 | 1214 |
'', |
| 1215 | 1215 |
)( |
| 1216 | 1216 |
'Label :: Help text :: One-line description', |
| 1217 |
- 'Show applicable version information, then exit.', |
|
| 1217 |
+ 'Show version and feature information, then exit.', |
|
| 1218 | 1218 |
) |
| 1219 | 1219 |
"""""" |
| 1220 | 1220 |
COMMANDS_LABEL = commented( |
| ... | ... |
@@ -1273,14 +1273,60 @@ class Label(enum.Enum): |
| 1273 | 1273 |
'Storage management', |
| 1274 | 1274 |
) |
| 1275 | 1275 |
"""""" |
| 1276 |
- VERSION_INFO_TEXT = commented( |
|
| 1277 |
- '', |
|
| 1276 |
+ VERSION_INFO_MAJOR_LIBRARY_TEXT = commented( |
|
| 1277 |
+ 'This message reports on the version of a major library ' |
|
| 1278 |
+ 'currently in use, such as "cryptography".', |
|
| 1278 | 1279 |
)( |
| 1279 | 1280 |
'Label :: Info Message', |
| 1280 |
- '{PROG_NAME} {VERSION}', # noqa: RUF027
|
|
| 1281 |
+ 'Using {dependency_name_and_version}',
|
|
| 1281 | 1282 |
flags='python-brace-format', |
| 1282 | 1283 |
) |
| 1283 | 1284 |
"""""" |
| 1285 |
+ ENABLED_PEP508_EXTRAS = commented( |
|
| 1286 |
+ 'This is part of the version output, emitting lists of enabled ' |
|
| 1287 |
+ 'PEP 508 extras. A comma-separated English list of items follows, ' |
|
| 1288 |
+ 'with standard English punctuation.', |
|
| 1289 |
+ )( |
|
| 1290 |
+ 'Label :: Info Message:: Table row header', |
|
| 1291 |
+ 'PEP 508 extras:', |
|
| 1292 |
+ ) |
|
| 1293 |
+ """""" |
|
| 1294 |
+ KNOWN_DERIVATION_SCHEMES = commented( |
|
| 1295 |
+ 'This is part of the version output, emitting lists of known ' |
|
| 1296 |
+ 'derivation schemes. A comma-separated English list of items ' |
|
| 1297 |
+ 'follows, with standard English punctuation.', |
|
| 1298 |
+ )( |
|
| 1299 |
+ 'Label :: Info Message:: Table row header', |
|
| 1300 |
+ 'Known derivation schemes:', |
|
| 1301 |
+ ) |
|
| 1302 |
+ """""" |
|
| 1303 |
+ KNOWN_FOREIGN_CONFIGURATION_FORMATS = commented( |
|
| 1304 |
+ 'This is part of the version output, emitting lists of known ' |
|
| 1305 |
+ 'foreign configuration formats. A comma-separated English list ' |
|
| 1306 |
+ 'of items follows, with standard English punctuation.', |
|
| 1307 |
+ )( |
|
| 1308 |
+ 'Label :: Info Message:: Table row header', |
|
| 1309 |
+ 'Known foreign configuration formats:', |
|
| 1310 |
+ ) |
|
| 1311 |
+ """""" |
|
| 1312 |
+ SUPPORTED_DERIVATION_SCHEMES = commented( |
|
| 1313 |
+ 'This is part of the version output, emitting lists of supported ' |
|
| 1314 |
+ 'derivation schemes. A comma-separated English list of items ' |
|
| 1315 |
+ 'follows, with standard English punctuation.', |
|
| 1316 |
+ )( |
|
| 1317 |
+ 'Label :: Info Message:: Table row header', |
|
| 1318 |
+ 'Supported derivation schemes:', |
|
| 1319 |
+ ) |
|
| 1320 |
+ """""" |
|
| 1321 |
+ SUPPORTED_FOREIGN_CONFIGURATION_FORMATS = commented( |
|
| 1322 |
+ 'This is part of the version output, emitting lists of supported ' |
|
| 1323 |
+ 'foreign configuration formats. A comma-separated English list ' |
|
| 1324 |
+ 'of items follows, with standard English punctuation.', |
|
| 1325 |
+ )( |
|
| 1326 |
+ 'Label :: Info Message:: Table row header', |
|
| 1327 |
+ 'Supported foreign configuration formats:', |
|
| 1328 |
+ ) |
|
| 1329 |
+ """""" |
|
| 1284 | 1330 |
CONFIRM_THIS_CHOICE_PROMPT_TEXT = commented( |
| 1285 | 1331 |
'There is no support for "yes" or "no" in other languages ' |
| 1286 | 1332 |
'than English, so it is advised that your translation makes it ' |
| ... | ... |
@@ -1778,11 +1778,6 @@ class TestAllCLI: |
| 1778 | 1778 |
'Expected no color, but found an ANSI control sequence' |
| 1779 | 1779 |
) |
| 1780 | 1780 |
|
| 1781 |
- @pytest.mark.xfail( |
|
| 1782 |
- reason='extras output not implemented yet', |
|
| 1783 |
- raises=AssertionError, |
|
| 1784 |
- strict=True, |
|
| 1785 |
- ) |
|
| 1786 | 1781 |
@Parametrize.COMMAND_NON_EAGER_ARGUMENTS |
| 1787 | 1782 |
def test_202_version_option_output( |
| 1788 | 1783 |
self, |
| 1789 | 1784 |