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