Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add pyupgrade hook #759

Merged
merged 5 commits into from Jun 16, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
10 changes: 8 additions & 2 deletions .pre-commit-config.yaml
Expand Up @@ -3,7 +3,7 @@ default_language_version:
python: python3
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.2.0
rev: v4.3.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
Expand All @@ -16,6 +16,12 @@ repos:
rev: v3.1.0
hooks:
- id: reorder-python-imports
args: [--py37-plus, --add-import, 'from __future__ import annotations']
- repo: https://github.com/asottile/pyupgrade
rev: v2.34.0
hooks:
- id: pyupgrade
args: [--py38-plus]
- repo: https://github.com/ambv/black
rev: 22.3.0
hooks:
Expand All @@ -26,7 +32,7 @@ repos:
hooks:
- id: flake8
- repo: https://github.com/pre-commit/mirrors-mypy
rev: v0.960
rev: v0.961
hooks:
- id: mypy
files: ^dynaconf/
2 changes: 2 additions & 0 deletions dynaconf/__init__.py
@@ -1,3 +1,5 @@
from __future__ import annotations

from dynaconf.base import LazySettings # noqa
from dynaconf.constants import DEFAULT_SETTINGS_FILES
from dynaconf.contrib import DjangoDynaconf # noqa
Expand Down
12 changes: 7 additions & 5 deletions dynaconf/base.py
@@ -1,3 +1,5 @@
from __future__ import annotations

import copy
import glob
import importlib
Expand Down Expand Up @@ -66,7 +68,7 @@ def __init__(self, wrapped=None, **kwargs):
self.__resolve_config_aliases(kwargs)
compat_kwargs(kwargs)
self._kwargs = kwargs
super(LazySettings, self).__init__()
super().__init__()

if wrapped:
if self._django_override:
Expand Down Expand Up @@ -267,15 +269,15 @@ def __setattr__(self, name, value):
"""Allow `settings.FOO = 'value'` while keeping internal attrs."""

if name in RESERVED_ATTRS:
super(Settings, self).__setattr__(name, value)
super().__setattr__(name, value)
else:
self.set(name, value)

def __delattr__(self, name):
"""stores reference in `_deleted` for proper error management"""
self._deleted.add(name)
if hasattr(self, name):
super(Settings, self).__delattr__(name)
super().__delattr__(name)

def __contains__(self, item):
"""Respond to `item in settings`"""
Expand Down Expand Up @@ -902,7 +904,7 @@ def set(

self.store[key] = value
self._deleted.discard(key)
super(Settings, self).__setattr__(key, value)
super().__setattr__(key, value)

# set loader identifiers so cleaners know which keys to clean
if loader_identifier and loader_identifier in self.loaded_by_loaders:
Expand Down Expand Up @@ -1215,7 +1217,7 @@ def dynaconf(self):
internal methods and attrs.
"""

class AttrProxy(object):
class AttrProxy:
def __init__(self, obj):
self.obj = obj

Expand Down
9 changes: 5 additions & 4 deletions dynaconf/cli.py
@@ -1,3 +1,5 @@
from __future__ import annotations

import importlib
import io
import os
Expand Down Expand Up @@ -366,15 +368,14 @@ def init(ctx, fileformat, path, env, _vars, _secrets, wg, y, django):
ignore_line = ".secrets.*"
comment = "\n# Ignore dynaconf secret files\n"
if not gitignore_path.exists():
with io.open(str(gitignore_path), "w", encoding=ENC) as f:
with open(str(gitignore_path), "w", encoding=ENC) as f:
f.writelines([comment, ignore_line, "\n"])
else:
existing = (
ignore_line
in io.open(str(gitignore_path), encoding=ENC).read()
ignore_line in open(str(gitignore_path), encoding=ENC).read()
)
if not existing: # pragma: no cover
with io.open(str(gitignore_path), "a+", encoding=ENC) as f:
with open(str(gitignore_path), "a+", encoding=ENC) as f:
f.writelines([comment, ignore_line, "\n"])

click.echo(
Expand Down
2 changes: 2 additions & 0 deletions dynaconf/constants.py
@@ -1,4 +1,6 @@
# pragma: no cover
from __future__ import annotations

INI_EXTENSIONS = (".ini", ".conf", ".properties")
TOML_EXTENSIONS = (".toml", ".tml")
YAML_EXTENSIONS = (".yaml", ".yml")
Expand Down
2 changes: 2 additions & 0 deletions dynaconf/contrib/__init__.py
@@ -1,3 +1,5 @@
from __future__ import annotations

from dynaconf.contrib.django_dynaconf_v2 import DjangoDynaconf # noqa
from dynaconf.contrib.flask_dynaconf import DynaconfConfig # noqa
from dynaconf.contrib.flask_dynaconf import FlaskDynaconf # noqa
2 changes: 2 additions & 0 deletions dynaconf/contrib/django_dynaconf_v2.py
Expand Up @@ -20,6 +20,8 @@
DJANGO_ALLOWED_HOSTS='["localhost"]' \
python manage.py runserver
"""
from __future__ import annotations

import inspect
import os
import sys
Expand Down
4 changes: 3 additions & 1 deletion dynaconf/contrib/flask_dynaconf.py
@@ -1,3 +1,5 @@
from __future__ import annotations

import warnings
from collections import ChainMap
from contextlib import suppress
Expand Down Expand Up @@ -142,7 +144,7 @@ class DynaconfConfig(Config):

def __init__(self, _settings, _app, *args, **kwargs):
"""perform the initial load"""
super(DynaconfConfig, self).__init__(*args, **kwargs)
super().__init__(*args, **kwargs)

# Bring Dynaconf instance value to Flask Config
Config.update(self, _settings.store)
Expand Down
2 changes: 2 additions & 0 deletions dynaconf/default_settings.py
@@ -1,3 +1,5 @@
from __future__ import annotations

import importlib
import os
import sys
Expand Down
4 changes: 3 additions & 1 deletion dynaconf/loaders/__init__.py
@@ -1,3 +1,5 @@
from __future__ import annotations

import importlib
import os

Expand Down Expand Up @@ -266,7 +268,7 @@ def write(filename, data, env=None):
loader_name = f"{filename.rpartition('.')[-1]}_loader"
loader = globals().get(loader_name)
if not loader:
raise IOError(f"{loader_name} cannot be found.")
raise OSError(f"{loader_name} cannot be found.")

data = DynaBox(data, box_settings={}).to_dict()
if loader is not py_loader and env and env not in data:
Expand Down
6 changes: 4 additions & 2 deletions dynaconf/loaders/base.py
@@ -1,3 +1,5 @@
from __future__ import annotations

import io
import warnings

Expand Down Expand Up @@ -75,7 +77,7 @@ def get_source_data(self, files):
for source_file in files:
if source_file.endswith(self.extensions):
try:
with io.open(
with open(
source_file,
encoding=self.obj.get(
"ENCODING_FOR_DYNACONF", "utf-8"
Expand All @@ -85,7 +87,7 @@ def get_source_data(self, files):
self.obj._loaded_files.append(source_file)
if content:
data[source_file] = content
except IOError as e:
except OSError as e:
if ".local." not in source_file:
warnings.warn(
f"{self.identifier}_loader: {source_file} "
Expand Down
2 changes: 2 additions & 0 deletions dynaconf/loaders/env_loader.py
@@ -1,3 +1,5 @@
from __future__ import annotations

from os import environ

from dynaconf.utils import missing
Expand Down
4 changes: 3 additions & 1 deletion dynaconf/loaders/ini_loader.py
@@ -1,3 +1,5 @@
from __future__ import annotations

import io
from pathlib import Path

Expand Down Expand Up @@ -51,7 +53,7 @@ def write(settings_path, settings_data, merge=True):
"""
settings_path = Path(settings_path)
if settings_path.exists() and merge: # pragma: no cover
with io.open(
with open(
str(settings_path), encoding=default_settings.ENCODING_FOR_DYNACONF
) as open_file:
object_merge(ConfigObj(open_file).dict(), settings_data)
Expand Down
6 changes: 4 additions & 2 deletions dynaconf/loaders/json_loader.py
@@ -1,3 +1,5 @@
from __future__ import annotations

import io
import json
from pathlib import Path
Expand Down Expand Up @@ -58,12 +60,12 @@ def write(settings_path, settings_data, merge=True):
"""
settings_path = Path(settings_path)
if settings_path.exists() and merge: # pragma: no cover
with io.open(
with open(
str(settings_path), encoding=default_settings.ENCODING_FOR_DYNACONF
) as open_file:
object_merge(json.load(open_file), settings_data)

with io.open(
with open(
str(settings_path),
"w",
encoding=default_settings.ENCODING_FOR_DYNACONF,
Expand Down
8 changes: 5 additions & 3 deletions dynaconf/loaders/py_loader.py
@@ -1,3 +1,5 @@
from __future__ import annotations

import errno
import importlib
import inspect
Expand Down Expand Up @@ -108,12 +110,12 @@ def import_from_filename(obj, filename, silent=False): # pragma: no cover
mod._is_error = False
mod._error = None
try:
with io.open(
with open(
_find_file(filename),
encoding=default_settings.ENCODING_FOR_DYNACONF,
) as config_file:
exec(compile(config_file.read(), filename, "exec"), mod.__dict__)
except IOError as e:
except OSError as e:
e.strerror = (
f"py_loader: error loading file " f"({e.strerror} {filename})\n"
)
Expand All @@ -136,7 +138,7 @@ def write(settings_path, settings_data, merge=True):
existing = DynaconfDict()
load(existing, str(settings_path))
object_merge(existing, settings_data)
with io.open(
with open(
str(settings_path),
"w",
encoding=default_settings.ENCODING_FOR_DYNACONF,
Expand Down
2 changes: 2 additions & 0 deletions dynaconf/loaders/redis_loader.py
@@ -1,3 +1,5 @@
from __future__ import annotations

from dynaconf.utils import build_env_list
from dynaconf.utils import upperfy
from dynaconf.utils.parse_conf import parse_conf_data
Expand Down
6 changes: 4 additions & 2 deletions dynaconf/loaders/toml_loader.py
@@ -1,3 +1,5 @@
from __future__ import annotations

import io
from pathlib import Path

Expand Down Expand Up @@ -44,12 +46,12 @@ def write(settings_path, settings_data, merge=True):
"""
settings_path = Path(settings_path)
if settings_path.exists() and merge: # pragma: no cover
with io.open(
with open(
str(settings_path), encoding=default_settings.ENCODING_FOR_DYNACONF
) as open_file:
object_merge(toml.load(open_file), settings_data)

with io.open(
with open(
str(settings_path),
"w",
encoding=default_settings.ENCODING_FOR_DYNACONF,
Expand Down
2 changes: 2 additions & 0 deletions dynaconf/loaders/vault_loader.py
@@ -1,5 +1,7 @@
# docker run -e 'VAULT_DEV_ROOT_TOKEN_ID=myroot' -p 8200:8200 vault
# pip install hvac
from __future__ import annotations

from dynaconf.utils import build_env_list
from dynaconf.utils.parse_conf import parse_conf_data

Expand Down
6 changes: 4 additions & 2 deletions dynaconf/loaders/yaml_loader.py
@@ -1,3 +1,5 @@
from __future__ import annotations

import io
from pathlib import Path
from warnings import warn
Expand Down Expand Up @@ -65,12 +67,12 @@ def write(settings_path, settings_data, merge=True):
"""
settings_path = Path(settings_path)
if settings_path.exists() and merge: # pragma: no cover
with io.open(
with open(
str(settings_path), encoding=default_settings.ENCODING_FOR_DYNACONF
) as open_file:
object_merge(yaml.safe_load(open_file), settings_data)

with io.open(
with open(
str(settings_path),
"w",
encoding=default_settings.ENCODING_FOR_DYNACONF,
Expand Down
4 changes: 3 additions & 1 deletion dynaconf/strategies/filtering.py
@@ -1,11 +1,13 @@
from __future__ import annotations

from dynaconf.utils import upperfy


class PrefixFilter:
def __init__(self, prefix):
if not isinstance(prefix, str):
raise TypeError("`SETTINGS_FILE_PREFIX` must be str")
self.prefix = "{}_".format(upperfy(prefix))
self.prefix = f"{upperfy(prefix)}_"

def __call__(self, data):
"""Filter incoming data by prefix"""
Expand Down
2 changes: 2 additions & 0 deletions dynaconf/test_settings.py
@@ -1,4 +1,6 @@
# pragma: no cover
from __future__ import annotations

TESTING = True
LOADERS_FOR_DYNACONF = [
"dynaconf.loaders.env_loader",
Expand Down