mirror of
https://github.com/ArchiveBox/ArchiveBox.git
synced 2025-05-13 06:34:25 -04:00
simplify archivebox.constants to just use benedict instead of kludgy NamedTuple
This commit is contained in:
parent
80d3def206
commit
45736036e0
1 changed files with 222 additions and 229 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue