Skip to content

Commit 0787ea8

Browse files
authored
Merge branch 'master' into vendored_licenses
2 parents 4ea9f6c + a19f970 commit 0787ea8

12 files changed

Lines changed: 226 additions & 27 deletions

File tree

.github/workflows/main.yml

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -90,15 +90,6 @@ jobs:
9090
files: coverage.xml
9191
fail_ci_if_error: true
9292

93-
- name: Run codacy-coverage-reporter
94-
if: ${{ matrix.python-version == '3.10' }}
95-
uses: codacy/codacy-coverage-reporter-action@v1
96-
with:
97-
project-token: ${{ secrets.CODACY_PROJECT_TOKEN }}
98-
# or
99-
# api-token: ${{ secrets.CODACY_API_TOKEN }}
100-
coverage-reports: coverage.xml
101-
10293
unit_tests_mac:
10394
needs: install_test
10495
strategy:

.pre-commit-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ repos:
2727
hooks:
2828
- id: black
2929
args: [--line-length=79]
30-
- repo: https://gitlab.com/pycqa/flake8
30+
- repo: https://github.com/pycqa/flake8
3131
rev: 3.9.2
3232
hooks:
3333
- id: flake8

docs/advanced.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ from dynaconf.strategies.filtering import PrefixFilter
8383

8484
settings = Dynaconf(
8585
settings_file="settings.toml",
86-
environments=False
86+
environments=False,
8787
filter_strategy=PrefixFilter("prefix")
8888
)
8989
```

docs/pt-br/docs/flask.md

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
# Extensão Flask
2+
3+
4+
O Flask incentiva a substituição do atributo `config_class` por uma extensão que siga os padrões [definidos](http://flask.pocoo.org/docs/0.12/patterns/subclassing/).
5+
Neste caso o Dynaconf fornece um substituto para o `app.config`, sendo assim o `app.config` passa ser uma instância de Dynaconf e usufrui das funcionalidades de gerenciamento de configuração.
6+
7+
## Inicialize a Extensão
8+
9+
Inicialize a extensão **FlaskDynaconf** para o seu `app`.
10+
11+
```python
12+
from flask import Flask
13+
from dynaconf import FlaskDynaconf
14+
15+
app = Flask(__name__)
16+
FlaskDynaconf(app)
17+
```
18+
19+
> Você pode opcionalmente usar `init_app`.
20+
21+
## Variáveis de Ambiente `FLASK_`
22+
23+
O `app.config` funcionará como uma instância `dynaconf.settings` e `FLASK_` será o prefixo global para exportar variáveis de ambiente.
24+
25+
Exemplo:
26+
27+
```bash
28+
export FLASK_DEBUG=true # app.config.DEBUG
29+
export FLASK_INTVALUE=1 # app.config['INTVALUE']
30+
export FLASK_MAIL_SERVER='host.com' # app.config.get('MAIL_SERVER')
31+
```
32+
33+
Você também pode definir um prefixo customizado para as variáveis de ambiente, assim como é feito na classe padrão (Dynaconf).
34+
35+
Exemplo:
36+
37+
```python
38+
from flask import Flask
39+
from dynaconf import FlaskDynaconf
40+
41+
app = Flask(__name__)
42+
FlaskDynaconf(app, envvar_prefix="PEANUT")
43+
```
44+
45+
Desta forma é possível exportar as variáveis usando o prefixo definido na declaração do objeto FlaskDynaconf.
46+
47+
```bash
48+
export PEANUT_DEBUG=true # app.config.DEBUG
49+
export PEANUT_INTVALUE=1 # app.config['INTVALUE']
50+
export PEANUT_MAIL_SERVER='host.com' # app.config.get('MAIL_SERVER')
51+
```
52+
53+
!!! info
54+
Na versão 3.1.7 era feita diferenciação entre maiúsculas e minúsculas na definição do `ENVVAR_PREFIX` e só aceitaria kwargs em letras maiúsculas (diferente de `Dynaconf(envvar_prefix)`). A partir da versão X.X.X, os kwargs não devem diferenciar maiúsculas de minúsculas para melhorar a consistência entre as extensões Dynaconf e Flask/Django, mantendo a compatibilidade com versões anteriores.
55+
56+
## Arquivos de Configuração
57+
58+
Você também pode ter seus arquivos de configuração para a sua aplicação Flask. Coloque os arquivos `settings.toml` e `.secrets.toml`, no diretório raiz (mesmo lugar onde é executado `flask run`) e então os ambientes da aplicação `[default]`, `[development]` e `[production]`.
59+
60+
Use a variável `FLASK_ENV` para alternar entre os ambientes definidos no arquivo de configuração. Por exemplo, definir `FLASK_ENV=development` fará com que a aplicação opere com os valores definidos do ambiente de desenvolvimento, já `FLASK_ENV=production` substituirá para os
61+
valores definidos para o ambiente de produção.
62+
63+
> **IMPORTANTE**: Para usar `$ dynaconf` CLI a varável `FLASK_APP` deve ser definida previamente.
64+
65+
Se você não quer criar os seus arquivos de configuração manualmente considere dar uma olhada em [CLI](/cli/)
66+
67+
## Carregando Extensões Flask Dinamicamente
68+
69+
Você pode pedir ao Dynaconf para carregar suas extensões Flask dinamicamente, desde que elas sigam os padrões das extensões convencionada pelo Flask.
70+
71+
O único requisito é que a extensão deva ser do tipo `callable` e deve receber o `app` como primeiro argumento (`flask_admin:Admin` ou `custom_extension.module:instance.init_app`), e por fim a extensão deve ser
72+
73+
The only requirement is that the extension must be a `callable` that accepts `app` as first argument. e.g: `flask_admin:Admin` or `custom_extension.module:instance.init_app` and of course the extension must be in Python namespace to be imported.
74+
75+
Para que a extensão seja inicializada basta usar uma referência para o [*entry point*](https://packaging.python.org/specifications/entry-points/), por exemplo: "flask_admin:Admin" or "extension.module:instance.init_app".
76+
77+
Definição do arquivo `settings.toml`
78+
79+
```toml
80+
[default]
81+
EXTENSIONS = [
82+
"flask_admin:Admin",
83+
"flask_bootstrap:Bootstrap",
84+
"custom_extension.module:init_app"
85+
]
86+
```
87+
88+
No arquivo `app.py`:
89+
```py
90+
from flask import Flask
91+
from dynaconf import FlaskDynaconf
92+
93+
app = Flask(__name__)
94+
flask_dynaconf = FlaskDynaconf(app, extensions_list="EXTENSIONS")
95+
```
96+
No trecho acima ele irá carregar todas as extensões Flask listadas na chave `EXTENSIONS` dentro do arquivo de configuração.
97+
98+
Você também pode carregar as configurações usando *lazy loading*.
99+
100+
```py
101+
# at any point in your app startup
102+
app.config.load_extensions()
103+
```
104+
105+
Opcionalmente você pode chamar `load_extensions(key="OTHER_NAME")` apontando para a sua lista de extensões.
106+
107+
Outra forma de carregar as extensões é por meio de variáveis de ambiente, por exemplo:
108+
109+
```bash
110+
# .env
111+
export FLASK_EXTENSIONS="['flask_admin:Admin']"
112+
```
113+
114+
As extensões serão carregadas em ordem.
115+
116+
### Extensões de desenvolvimento
117+
118+
É possível carregar extensões de desenvolvimento usadas somente em ambiente de desenvolvimento.
119+
120+
```toml
121+
[default]
122+
EXTENSIONS = [
123+
"flask_admin:Admin",
124+
"flask_bootstrap:Bootstrap",
125+
"custom_extension.module:init_app"
126+
]
127+
128+
[development]
129+
EXTENSIONS = [
130+
"dynaconf_merge",
131+
"flask_debugtoolbar:DebugToolbar"
132+
]
133+
```
134+
135+
### Problemas Frequentes
136+
137+
Caso você encontre um problema no momento do carregamento das variáveis do arquivo `.env` ou na importação do app, ou create_app,
138+
é recomendado desativar o suporte do Flask para dotenv.
139+
140+
```bash
141+
export FLASK_SKIP_DOTENV=1
142+
```

dynaconf/cli.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,11 @@
2929

3030
os.environ["PYTHONIOENCODING"] = "utf-8"
3131

32-
CWD = Path.cwd()
32+
CWD = None
33+
try:
34+
CWD = Path.cwd()
35+
except FileNotFoundError:
36+
pass
3337
EXTS = ["ini", "toml", "yaml", "json", "py", "env"]
3438
WRITERS = ["ini", "toml", "yaml", "json", "py", "redis", "vault", "env"]
3539

@@ -116,6 +120,8 @@ def import_settings(dotted_path):
116120
module = importlib.import_module(module)
117121
except ImportError as e:
118122
raise click.UsageError(e)
123+
except FileNotFoundError:
124+
return
119125
try:
120126
return getattr(module, name)
121127
except AttributeError as e:

dynaconf/default_settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ def reload(load_dotenv=None, *args, **kwargs):
172172
"timeout": get("VAULT_TIMEOUT_FOR_DYNACONF", None),
173173
"proxies": get("VAULT_PROXIES_FOR_DYNACONF", None),
174174
"allow_redirects": get("VAULT_ALLOW_REDIRECTS_FOR_DYNACONF", None),
175+
"namespace": get("VAULT_NAMESPACE_FOR_DYNACONF", None),
175176
}
176177
VAULT_FOR_DYNACONF = get("VAULT_FOR_DYNACONF", default_vault)
177178
VAULT_ENABLED_FOR_DYNACONF = get("VAULT_ENABLED_FOR_DYNACONF", False)

dynaconf/loaders/env_loader.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,16 @@
55
from dynaconf.utils import missing
66
from dynaconf.utils import upperfy
77
from dynaconf.utils.parse_conf import parse_conf_data
8-
from dynaconf.vendor.dotenv import cli as dotenv_cli
8+
9+
DOTENV_IMPORTED = False
10+
try:
11+
from dynaconf.vendor.dotenv import cli as dotenv_cli
12+
13+
DOTENV_IMPORTED = True
14+
except ImportError:
15+
pass
16+
except FileNotFoundError:
17+
pass
918

1019

1120
IDENTIFIER = "env"
@@ -84,6 +93,8 @@ def load_from_env(
8493

8594
def write(settings_path, settings_data, **kwargs):
8695
"""Write data to .env file"""
96+
if not DOTENV_IMPORTED:
97+
return
8798
for key, value in settings_data.items():
8899
quote_mode = (
89100
isinstance(value, str)

dynaconf/utils/files.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,10 @@ def find_file(filename=".env", project_root=None, skip_files=None, **kwargs):
4747
additional `./config` folder.
4848
"""
4949
search_tree = []
50-
work_dir = os.getcwd()
50+
try:
51+
work_dir = os.getcwd()
52+
except FileNotFoundError:
53+
return ""
5154
skip_files = skip_files or []
5255

5356
# If filename is an absolute path and exists, just return it

tests_functional/full_test/app.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
"timeout": None,
2828
"proxies": None,
2929
"allow_redirects": None,
30+
"namespace": None,
3031
# "session": None,
3132
},
3233
"VAULT_ENABLED_FOR_DYNACONF": False,
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#!/bin/bash
2+
3+
set -e
4+
5+
rm -rf /tmp/foobar
6+
mkdir -p /tmp/foobar
7+
cd /tmp/foobar
8+
rm -rf /tmp/foobar
9+
10+
dynaconf -i config.settings list
11+
RC=$?
12+
exit $RC

0 commit comments

Comments
 (0)