semvec/pypi-packages huggingface dataset:
dotenv-wizard-savane 0.1.0
Assistant CLI pour créer et gérer les fichiers .env dans vos projets Python
License: MIT
Requires Python: >=3.6

# dotenv-wizard-savane

**dotenv-wizard-savane** est un outil en ligne de commande (CLI) pour générer automatiquement des fichiers `.env` et `.env.example` en analysant intelligemment le code source de votre projet Python.

Il détecte les variables d'environnement utilisées avec `os.getenv()` et `os.environ[]`, puis crée les fichiers `.env` à partir de ces informations — sans configuration manuelle.

---

## 🚀 Fonctionnalités

- 🔍 Analyse automatique du code source `.py`
- 🧠 Détection des variables utilisées dans :
  - `os.getenv("VAR", default)`
  - `os.environ["VAR"]`
- ✨ Génère deux fichiers :
  - `.env` (avec valeurs par défaut si présentes)
  - `.env.example` (vide pour partage / versioning)
- 🧹 Ignore automatiquement les dossiers inutiles comme `venv/`, `__pycache__/`, `.git/`, `migrations/`, `tests/`
- 📊 Affiche un résumé clair à la fin

---

## 📦 Installation

Depuis [PyPI](https://pypi.org/project/dotenv-wizard-savane/) :

```bash
pip install dotenv-wizard-savane

Ou localement dans un projet :

pip install -e .


🛠️ Utilisation

dotenv-wizard init [chemin]
chemin (optionnel) : chemin du dossier à analyser (par défaut .)


📌 Exemples :
Analyse du dossier courant :

dotenv-wizard init

Analyse d’un sous-dossier spécifique :

dotenv-wizard init backend/


📁 Exemple de résultat

🎯 Code Python analysé :

import os

DEBUG = os.getenv("DEBUG", "false")
PORT = int(os.getenv("PORT", 8000))
SECRET_KEY = os.environ["SECRET_KEY"]
📄 Fichier .env généré :
DEBUG=false
PORT=8000
SECRET_KEY=
📄 Fichier .env.example généré :
DEBUG=
PORT=
SECRET_KEY=


📊 Résumé affiché en CLI

Analyse du dossier : .

Fichiers .env et .env.example générés.

Résumé :
  Fichiers scannés     : 7
  Fichiers ignorés     : 5
  Variables détectées  : 3
  ➤  DEBUG, PORT, SECRET_KEY


🔒 Pourquoi utiliser dotenv-wizard-savane ?

🧠 Zéro configuration, tout est automatique
✅ Gagne du temps et évite les erreurs humaines
🤝 Idéal pour travailler en équipe (génère aussi le .env.example)
📁 Convient aux projets Django, FastAPI, Flask, etc.


📚 Bonnes pratiques recommandées

Ne versionnez jamais le fichier .env (ajoutez-le à votre .gitignore)
Versionnez le fichier .env.example
Utilisez dotenv-wizard-savane à chaque fois que vous ajoutez une nouvelle variable dans le code


⚙️ Fonctionnement interne (pour les curieux)

Utilise des expressions régulières pour détecter :
os.getenv("...") (avec ou sans valeur par défaut)
os.environ["..."]
Ignore les répertoires non pertinents (virtuels, caches, migrations, etc.)
Gère les encodages automatiquement
🧑‍💻 Auteur

SAVANE Mouhamed
📧 savanemouhamed05@gmail.com
🛠️ Licence : MIT
🌍 Côte d’Ivoire
cbr-client 0.4.0
Tool for easy working with https://portal5.cbr.ru API
License: MIT
Requires Python: >=3.7
Keywords: cbr rest api client

# cbr-client
![PyPI - License](https://img.shields.io/pypi/l/cbr-client)
![PyPI - Python Version](https://img.shields.io/pypi/pyversions/cbr-client)

Клиент для работы с api ЦБ РФ

Описание АПИ - https://cbr.ru/lk_uio/guide/rest_api/

## Установка
```bash
pip install cbr-client
```

## Зависимости
* [httpx](https://github.com/encode/httpx)
* [pydantic](https://github.com/samuelcolvin/pydantic)


## Использование
```python
# необходимо запускать python -m asyncio
from cbr_client import Client

conn_params = dict(
    url='https://portal5test.cbr.ru',
    login='test',
    password='test',
    user_agent='test app'
)

client = Client(**conn_params)
# или через контекстный менеджер
# async with Client(**conn_params) as client:
#     ...

files = [
        ('report.zip.enc', b'encrypted report content'),
        ('report.zip.1.sig', b'operator signature'),
        ('report.zip.2.sig', b'client signature')
    ]

# отправка отчета на портал ЦБ
# создание сообщения
msg = await client.create_message(files, '1-ПИ')
# загрузка файлов
for f in msg.files:
    await client.upload(f)
# или опциональная загрузка чанками
for f in msg.files:
    await client.upload(f, chunked=True, chunk_size=2**16)
# финализация (закрытие сессии)
await client.finalize_message(msg)

# получение квитанций
receipts =await client.get_receipts(msg_id=msg.oid)
for rcpt in receipts:
    # получение файла из хранилища
    for f in rcpt.files:
        # сохраняется в f.content
        await client.download(f)

# получение сообщений по типу формы
messages = await client.get_messages(form='1-ПИ')
# или по статусу
messages = await client.get_messages(status='draft')
# или по типу сообщения (inbox/outbox)
messages = await client.get_messages(msg_type='outbox')
# паджинация, по умолчанию возвращается первая страница
messages = await client.get_messages(status='draft', page=4)
# или комбинировать параметры как требуется 

# получение файлов сообщения
messages = await client.get_messages()
for msg in messages:
    # получение файла из хранилища
    for f in msg.files:
        # сохраняется в f.content
        await client.download(f)

# получение списка возможных задач
tasks = await client.get_tasks()

# получение списка справочников с данными
dictionaries = await client.get_dictionaries()

# получение данных из определенного справочника
d = await client.get_dictionary(oid='dictionary_id')

# получение данных профиля
profile = await client.get_profile()

# получение доступной квоты использования хранилища
quota = await client.get_profile_quota()

# удаление сообщения 
await client.delete_message(msg_id='message_id')

# в конце работы не забываем закрывать соединение
await client.close()
```