simplify archivebox.constants to just use benedict instead of kludgy NamedTuple

This commit is contained in:
Nick Sweeting 2024-09-26 02:36:59 -07:00
parent 80d3def206
commit 45736036e0
No known key found for this signature in database

View file

@ -2,8 +2,8 @@ __package__ = 'archivebox'
import os
from types import MappingProxyType
from typing import Set, Dict, NamedTuple, Tuple
import re
from typing import Dict
from pathlib import Path
from benedict import benedict
@ -14,60 +14,61 @@ from .misc.logging import DEFAULT_CLI_COLORS
###################### Config ##########################
class ConstantsConfig(NamedTuple):
VERSION: str = archivebox.__version__
VERSION: str = archivebox.VERSION
DEFAULT_CLI_COLORS: Dict[str, str] = DEFAULT_CLI_COLORS
DISABLED_CLI_COLORS: Dict[str, str] = benedict({k: '' for k in DEFAULT_CLI_COLORS})
TIMEZONE: str = 'UTC'
DEFAULT_CLI_COLORS: Dict[str, str] = DEFAULT_CLI_COLORS
DISABLED_CLI_COLORS: Dict[str, str] = benedict({k: '' for k in DEFAULT_CLI_COLORS})
PACKAGE_DIR: Path = archivebox.PACKAGE_DIR
PACKAGE_DIR_NAME: str = archivebox.PACKAGE_DIR.name
TEMPLATES_DIR_NAME: str = 'templates'
TEMPLATES_DIR: Path = archivebox.PACKAGE_DIR / TEMPLATES_DIR_NAME
STATIC_DIR: Path = TEMPLATES_DIR / 'static'
USER_PLUGINS_DIR_NAME: str = 'user_plugins'
CUSTOM_TEMPLATES_DIR_NAME: str = 'user_templates'
PACKAGE_DIR: Path = archivebox.PACKAGE_DIR
PACKAGE_DIR_NAME: str = archivebox.PACKAGE_DIR.name
TEMPLATES_DIR_NAME: str = 'templates'
TEMPLATES_DIR: Path = archivebox.PACKAGE_DIR / TEMPLATES_DIR_NAME
STATIC_DIR: Path = TEMPLATES_DIR / 'static'
USER_PLUGINS_DIR_NAME: str = 'user_plugins'
CUSTOM_TEMPLATES_DIR_NAME: str = 'user_templates'
DATA_DIR: Path = archivebox.DATA_DIR
ARCHIVE_DIR_NAME: str = 'archive'
SOURCES_DIR_NAME: str = 'sources'
PERSONAS_DIR_NAME: str = 'personas'
CRONTABS_DIR_NAME: str = 'crontabs'
CACHE_DIR_NAME: str = 'cache'
LOGS_DIR_NAME: str = 'logs'
LIB_DIR_NAME: str = 'lib'
TMP_DIR_NAME: str = 'tmp'
OUTPUT_DIR: Path = archivebox.DATA_DIR
ARCHIVE_DIR: Path = archivebox.DATA_DIR / ARCHIVE_DIR_NAME
SOURCES_DIR: Path = archivebox.DATA_DIR / SOURCES_DIR_NAME
PERSONAS_DIR: Path = archivebox.DATA_DIR / PERSONAS_DIR_NAME
CACHE_DIR: Path = archivebox.DATA_DIR / CACHE_DIR_NAME
LOGS_DIR: Path = archivebox.DATA_DIR / LOGS_DIR_NAME
LIB_DIR: Path = archivebox.DATA_DIR / LIB_DIR_NAME
TMP_DIR: Path = archivebox.DATA_DIR / TMP_DIR_NAME
CUSTOM_TEMPLATES_DIR: Path = archivebox.DATA_DIR / CUSTOM_TEMPLATES_DIR_NAME
USER_PLUGINS_DIR: Path = archivebox.DATA_DIR / USER_PLUGINS_DIR_NAME
ARCHIVE_DIR_NAME: str = 'archive'
SOURCES_DIR_NAME: str = 'sources'
PERSONAS_DIR_NAME: str = 'personas'
CRONTABS_DIR_NAME: str = 'crontabs'
CACHE_DIR_NAME: str = 'cache'
LOGS_DIR_NAME: str = 'logs'
LIB_DIR_NAME: str = 'lib'
TMP_DIR_NAME: str = 'tmp'
OUTPUT_DIR: Path = archivebox.DATA_DIR
ARCHIVE_DIR: Path = archivebox.DATA_DIR / ARCHIVE_DIR_NAME
SOURCES_DIR: Path = archivebox.DATA_DIR / SOURCES_DIR_NAME
PERSONAS_DIR: Path = archivebox.DATA_DIR / PERSONAS_DIR_NAME
CACHE_DIR: Path = archivebox.DATA_DIR / CACHE_DIR_NAME
LOGS_DIR: Path = archivebox.DATA_DIR / LOGS_DIR_NAME
LIB_DIR: Path = archivebox.DATA_DIR / LIB_DIR_NAME
TMP_DIR: Path = archivebox.DATA_DIR / TMP_DIR_NAME
CUSTOM_TEMPLATES_DIR: Path = archivebox.DATA_DIR / CUSTOM_TEMPLATES_DIR_NAME
USER_PLUGINS_DIR: Path = archivebox.DATA_DIR / USER_PLUGINS_DIR_NAME
LIB_PIP_DIR: Path = LIB_DIR / 'pip'
LIB_NPM_DIR: Path = LIB_DIR / 'npm'
LIB_BROWSERS_DIR: Path = LIB_DIR / 'browsers'
LIB_BIN_DIR: Path = LIB_DIR / 'bin'
BIN_DIR: Path = LIB_BIN_DIR
LIB_PIP_DIR: Path = LIB_DIR / 'pip'
LIB_NPM_DIR: Path = LIB_DIR / 'npm'
LIB_BROWSERS_DIR: Path = LIB_DIR / 'browsers'
LIB_BIN_DIR: Path = LIB_DIR / 'bin'
BIN_DIR: Path = LIB_BIN_DIR
CONFIG_FILENAME: str = 'ArchiveBox.conf'
SQL_INDEX_FILENAME: str = 'index.sqlite3'
CONFIG_FILENAME: str = 'ArchiveBox.conf'
SQL_INDEX_FILENAME: str = 'index.sqlite3'
CONFIG_FILE: Path = archivebox.DATA_DIR / CONFIG_FILENAME
DATABASE_FILE: Path = archivebox.DATA_DIR / SQL_INDEX_FILENAME
QUEUE_DATABASE_FILE: Path = archivebox.DATA_DIR / SQL_INDEX_FILENAME.replace('index.', 'queue.')
CONFIG_FILE: Path = archivebox.DATA_DIR / CONFIG_FILENAME
DATABASE_FILE: Path = archivebox.DATA_DIR / SQL_INDEX_FILENAME
QUEUE_DATABASE_FILE: Path = archivebox.DATA_DIR / SQL_INDEX_FILENAME.replace('index.', 'queue.')
JSON_INDEX_FILENAME: str = 'index.json'
HTML_INDEX_FILENAME: str = 'index.html'
ROBOTS_TXT_FILENAME: str = 'robots.txt'
FAVICON_FILENAME: str = 'favicon.ico'
JSON_INDEX_FILENAME: str = 'index.json'
HTML_INDEX_FILENAME: str = 'index.html'
ROBOTS_TXT_FILENAME: str = 'robots.txt'
FAVICON_FILENAME: str = 'favicon.ico'
STATICFILE_EXTENSIONSSTATICFILE_EXTENSIONS: frozenset[str] = frozenset((
ALLOWDENYLIST_REGEX_FLAGS: int = re.IGNORECASE | re.UNICODE | re.MULTILINE
STATICFILE_EXTENSIONS: frozenset[str] = frozenset((
# 99.999% of the time, URLs ending in these extensions are static files
# that can be downloaded as-is, not html pages that need to be rendered
'gif', 'jpeg', 'jpg', 'png', 'tif', 'tiff', 'wbmp', 'ico', 'jng', 'bmp',
@ -87,9 +88,9 @@ class ConstantsConfig(NamedTuple):
# These are always treated as pages, not as static files, never add them:
# html, htm, shtml, xhtml, xml, aspx, php, cgi
))
))
INGORED_PATHS: frozenset[str] = frozenset((
INGORED_PATHS: frozenset[str] = frozenset((
".git",
".svn",
".DS_Store",
@ -98,21 +99,21 @@ class ConstantsConfig(NamedTuple):
".DS_Store",
".env",
"Dockerfile",
))
PIP_RELATED_NAMES: frozenset[str] = frozenset((
))
PIP_RELATED_NAMES: frozenset[str] = frozenset((
".venv",
"venv",
"virtualenv",
".virtualenv",
))
NPM_RELATED_NAMES: frozenset[str] = frozenset((
))
NPM_RELATED_NAMES: frozenset[str] = frozenset((
"node_modules",
"package.json",
"package-lock.json",
"yarn.lock",
))
))
DATA_DIR_NAMES: frozenset[str] = frozenset((
DATA_DIR_NAMES: frozenset[str] = frozenset((
ARCHIVE_DIR_NAME,
SOURCES_DIR_NAME,
LOGS_DIR_NAME,
@ -121,9 +122,9 @@ class ConstantsConfig(NamedTuple):
PERSONAS_DIR_NAME,
CUSTOM_TEMPLATES_DIR_NAME,
USER_PLUGINS_DIR_NAME,
))
DATA_DIRS: frozenset[Path] = frozenset(archivebox.DATA_DIR / dirname for dirname in DATA_DIR_NAMES)
DATA_FILE_NAMES: frozenset[str] = frozenset((
))
DATA_DIRS: frozenset[Path] = frozenset(archivebox.DATA_DIR / dirname for dirname in DATA_DIR_NAMES)
DATA_FILE_NAMES: frozenset[str] = frozenset((
CONFIG_FILENAME,
SQL_INDEX_FILENAME,
f"{SQL_INDEX_FILENAME}-wal",
@ -139,13 +140,13 @@ class ConstantsConfig(NamedTuple):
CONFIG_FILENAME,
f"{CONFIG_FILENAME}.bak",
"static_index.json",
))
))
# When initializing archivebox in a new directory, we check to make sure the dir is
# actually empty so that we dont clobber someone's home directory or desktop by accident.
# These files are exceptions to the is_empty check when we're trying to init a new dir,
# as they could be from a previous archivebox version, system artifacts, dependencies, etc.
ALLOWED_IN_OUTPUT_DIR: frozenset[str] = frozenset((
# When initializing archivebox in a new directory, we check to make sure the dir is
# actually empty so that we dont clobber someone's home directory or desktop by accident.
# These files are exceptions to the is_empty check when we're trying to init a new dir,
# as they could be from a previous archivebox version, system artifacts, dependencies, etc.
ALLOWED_IN_OUTPUT_DIR: frozenset[str] = frozenset((
*INGORED_PATHS,
*PIP_RELATED_NAMES,
*NPM_RELATED_NAMES,
@ -153,9 +154,9 @@ class ConstantsConfig(NamedTuple):
*DATA_FILE_NAMES,
"static", # created by old static exports <v0.6.0
"sonic", # created by docker bind mount
))
))
CODE_LOCATIONS = MappingProxyType(benedict({
CODE_LOCATIONS = benedict({
'PACKAGE_DIR': {
'path': (archivebox.PACKAGE_DIR).resolve(),
'enabled': True,
@ -181,9 +182,9 @@ class ConstantsConfig(NamedTuple):
'enabled': True,
'is_valid': CUSTOM_TEMPLATES_DIR.is_dir(),
},
}))
})
DATA_LOCATIONS = MappingProxyType(benedict({
DATA_LOCATIONS = benedict({
"OUTPUT_DIR": {
"path": archivebox.DATA_DIR.resolve(),
"enabled": True,
@ -233,17 +234,9 @@ class ConstantsConfig(NamedTuple):
"enabled": True,
"is_valid": CACHE_DIR.is_dir(),
},
}))
def items(self):
return self._asdict().items()
def keys(self):
return self._asdict().keys()
def values(self):
return self._asdict().values()
})
CONSTANTS = ConstantsConfig()
CONSTANTS = benedict({key: value for key, value in globals().items() if key.isupper()})
CONSTANTS_CONFIG = CONSTANTS