Internal analytics toolkit for data pipelines
Project description
mnemosynecore
mnemosynecore — Python-библиотека для аналитиков и data-инженеров.
Главная идея: писать меньше служебного кода в DAG/ноутбуках и быстрее решать рабочие задачи:
- достать секреты и подключения,
- выполнить SQL в Vertica,
- отправить отчёт в Mattermost,
- сделать скриншот Superset,
- быстро обратиться к LLM через один вызов,
- скачать файл из SharePoint,
- добавить надёжные retry.
Зачем это аналитикам
Эта библиотека убирает рутину:
- не нужно каждый раз вручную писать код авторизации,
- одинаковый подход в проде и локально,
- проще проверять логику до выкладки в Airflow,
- меньше копипаста между задачами команды.
Установка
pip install mnemosynecore
Опциональные зависимости:
# Airflow helpers
pip install "mnemosynecore[airflow]"
# Superset API
pip install "mnemosynecore[superset]"
# SharePoint NTLM
pip install "mnemosynecore[sharepoint]"
# ClickHouse через un_conn
pip install "mnemosynecore[clickhouse]"
# Всё вместе
pip install "mnemosynecore[airflow,superset,sharepoint,clickhouse]"
Быстрый старт (2 минуты)
import mnemosynecore as mn
# 1) взять секрет
cfg = mn.get_secret("VERTICA_PROD")
print(cfg["host"])
# 2) выполнить SQL
df = mn.vertica_select(
conn_id="VERTICA_PROD",
sql="SELECT CURRENT_DATE AS dt",
)
print(df)
Готовые скрипты с рабочими примерами лежат в папке examples/:
examples/01_secrets_and_test_mode.pyexamples/02_vertica_examples.pyexamples/03_mattermost_examples.pyexamples/04_superset_examples.pyexamples/05_sharepoint_examples.pyexamples/06_superset_links_and_threads.pyexamples/07_llm_examples.py
Обычные функции и _test-функции
Почти для всех интеграционных функций есть пара:
- обычная: работает с ENV/Vault/Airflow,
_test: для локального запуска с JSON-кредами.
Пример пары:
vertica_select(...)vertica_select_test(..., dir_path=... | creds_path=...)
Как передавать креды локально
Есть 2 способа:
dir_path— путь к папке, где лежит<CONN_ID>.jsoncreds_path— прямой путь к файлу JSON
Пример:
# Файл: ./local_secrets/VERTICA_DEV.json
df = mn.vertica_select_test(
conn_id="VERTICA_DEV",
sql="SELECT 1",
dir_path="./local_secrets",
)
# Файл: /Users/me/secrets/vertica_dev.json
df = mn.vertica_select_test(
conn_id="VERTICA_DEV",
sql="SELECT 1",
creds_path="/Users/me/secrets/vertica_dev.json",
)
Формат JSON-кредов
Универсальный формат:
{
"host": "example.host",
"login": "user",
"password": "secret",
"port": 443,
"schema": "https",
"extra": "{\"basepath\":\"/api/v4\"}"
}
Mattermost
{
"host": "mattermost.company.ru",
"password": "BOT_TOKEN",
"schema": "https",
"port": 443,
"extra": "{\"basepath\":\"/api/v4\"}"
}
Superset
{
"host": "https://ss.company.ru",
"login": "svc_user",
"password": "svc_password",
"extra": "{\"auth_provider\":\"ldap\"}"
}
LLM (OpenAI-compatible gateway/API)
{
"host": "http://llm-gateway.prod.a.o3.ru/api",
"password": "LLM_TOKEN",
"model": "DeepSeek-V3-0324-AWQ[CM]",
"extra": "{\"endpoint\":\"/chat/completions\"}"
}
Для Vertica/коннектов можно указывать и login, и user:
- если есть
user, библиотека использует его, - если
userнет, беретсяlogin.
SharePoint
{
"host": "https://sharepoint.company.ru",
"login": "svc_sharepoint",
"password": "svc_password",
"schema": "O3"
}
Примеры: секреты и подключения
import mnemosynecore as mn
# Прод: ENV/Vault/Airflow
secret = mn.get_secret("MM_BOT")
# Локально: из JSON
secret_test = mn.get_secret_test("MM_BOT", dir_path="./secrets")
secret_test2 = mn.get_secret_test("MM_BOT", creds_path="./secrets/mm_bot.json")
# Универсально: сначала локально, если не нашли — прод
cfg = mn.resolve_secret("MM_BOT", dir_path="./secrets")
# Проверка обязательных полей
mn.require_secret_fields("MM_BOT", ["host", "password"])
Примеры: Vertica
import pandas as pd
import mnemosynecore as mn
# 1) SELECT
sales_df = mn.vertica_select(
conn_id="VERTICA_PROD",
sql="""
SELECT dt, revenue
FROM mart.daily_sales
WHERE dt >= CURRENT_DATE - INTERVAL '7 day'
""",
)
# 2) Scalar
row_count = mn.vertica_select_scalar(
conn_id="VERTICA_PROD",
sql="SELECT COUNT(*) FROM mart.daily_sales",
)
# 3) Выполнить SQL из файла
mn.vertica_sql_file(
file_path="./sql/rebuild_mart.sql",
conn_id="VERTICA_PROD",
)
# 4) Upsert из DataFrame
new_rows = pd.DataFrame([
{"id": 1, "dt": "2026-03-01", "revenue": 10.0},
{"id": 2, "dt": "2026-03-01", "revenue": 20.0},
])
mn.vertica_upsert(
df=new_rows,
table_name="mart.daily_sales",
unique_keys=["id", "dt"],
conn_id="VERTICA_PROD",
)
# 5) Локальный тест через JSON
test_df = mn.vertica_select_test(
conn_id="VERTICA_DEV",
sql="SELECT 1 AS x",
dir_path="./secrets",
)
Примеры: Mattermost
import pandas as pd
import mnemosynecore as mn
# Текстовое сообщение
mn.send_message(
channel_id="channel_id_here",
bot_id="MM_BOT",
text="Ежедневный отчёт готов",
)
# Файл
mn.send_file(
channel_id="channel_id_here",
bot_id="MM_BOT",
file_path="./reports/daily_sales.xlsx",
text="Отчёт во вложении",
)
# DataFrame как CSV
df = pd.DataFrame([{"country": "RU", "value": 100}])
mn.send_dataframe_as_csv(
channel_id="channel_id_here",
bot_id="MM_BOT",
df=df,
file_name="daily_metrics.csv",
)
# Локально (_test) с creds_path
mn.send_message_test(
channel_id="channel_id_here",
bot_id="MM_BOT",
text="Проверка локальной отправки",
creds_path="./secrets/mm_bot.json",
)
# Ответ в тред обычным текстом
mn.send_thread_message(
channel_id="channel_id_here",
bot_id="MM_BOT",
root_id="post_id_основного_сообщения",
text="Дополнительный комментарий в тред",
)
# Можно и файл/таблицу отправить прямо в тред через root_id
mn.send_dataframe_as_csv(
channel_id="channel_id_here",
bot_id="MM_BOT",
root_id="post_id_основного_сообщения",
df=df,
file_name="details.csv",
)
Примеры: Superset
import mnemosynecore as mn
# Скриншот дашборда (bytes)
png = mn.superset_dashboard_thumbnail(
superset_conn="SUPERSET_CONN",
dashboard_name="Финансы - ежедневный обзор",
)
# Отправить скриншот дашборда в Mattermost
mn.send_superset_dashboard_screenshot(
channel_id="channel_id_here",
bot_id="MM_BOT",
superset_conn="SUPERSET_CONN",
dashboard_name="Финансы - ежедневный обзор",
text="Скриншот утреннего дашборда",
)
# Локально (_test) с JSON кредами
mn.superset_chart_thumbnail_test(
superset_conn="SUPERSET_CONN",
chart_id=31729,
creds_path="./secrets/superset_conn.json",
)
# Ссылка на дашборд (markdown)
dash_link = mn.superset_dashboard_link(
superset_conn="SUPERSET_CONN",
dashboard_id=145,
dashboard_name="Daily KPI",
)
# Отправка только ссылки в канал
mn.send_superset_dashboard_link(
channel_id="channel_id_here",
bot_id="MM_BOT",
superset_conn="SUPERSET_CONN",
dashboard_id=145,
dashboard_name="Daily KPI",
text="Отчёт на сегодня",
)
# Ссылки на дашборды в тред + обычные текстовые сообщения в этом же треде
mn.send_superset_dashboard_links_to_thread(
channel_id="channel_id_here",
bot_id="MM_BOT",
superset_conn="SUPERSET_CONN",
dashboards=[
{"dashboard_name": "Main", "id": 145},
{"dashboard_name": "Finance", "id": 146},
],
header_text="Ежедневная подборка дашбордов",
thread_messages=[
"Если график выглядит странно, пишите в этот тред.",
"Детали по фильтрам приложу чуть позже.",
],
)
# Сохранить скриншот в конкретный файл
mn.superset_dashboard_screenshot_to_file(
superset_conn="SUPERSET_CONN",
dashboard_id=145,
output_path="./tmp/daily_kpi_dashboard.png",
)
# Новый быстрый сценарий:
# взяли permalink из UI Superset (с фильтрами) и отправили скрин + ссылку
mn.send_superset_dashboard_permalink_screenshot(
channel_id="channel_id_here",
bot_id="MM_BOT",
superset_conn="SUPERSET_CONN",
dashboard_name="Daily KPI (filtered)",
dashboard_url="https://ss.company.ru/superset/dashboard/p/AbCdEf123/?native_filters_key=...",
text="Борд с применёнными фильтрами из UI",
)
Примеры: LLM
import mnemosynecore as mn
# 1) Самый быстрый вариант: token + model + prompt параметрами
answer = mn.llm_chat(
prompt="Сделай 3 пункта summary по таблице заказов",
model="gpt-4o-mini",
token="your_token_here",
base_url="https://api.openai.com/v1",
)
print(answer)
# 2) Токен из файла (txt/json)
answer2 = mn.llm_chat(
prompt="Объясни разницу между DAU и MAU в 2 предложениях",
model="DeepSeek-V3-0324-AWQ[CM]",
token_path="./secrets/llm_token.txt",
base_url="http://llm-gateway.prod.a.o3.ru/api",
)
# 3) Через Vault/ENV/Airflow по conn_id (host/token/model в секрете)
answer3 = mn.llm_chat(
prompt="Сгенерируй чек-лист проверки витрины перед релизом",
llm_conn="LLM_GATEWAY",
)
# 4) Локально (_test): указать прямой путь к файлу с кредами
answer4 = mn.llm_chat_test(
prompt="Верни JSON: {\"ok\": true}",
llm_conn="LLM_GATEWAY",
creds_path="./secrets/LLM_GATEWAY.json",
parse_json=True,
)
print(answer4) # {'ok': True}
Примеры: SharePoint
import mnemosynecore as mn
# Скачать файл в память
content = mn.sharepoint_download_file(
sharepoint_conn="SP_CONN",
file_url="/sites/analytics/reports/plan.csv",
)
# Прочитать CSV сразу в DataFrame
df = mn.sharepoint_read_csv(
sharepoint_conn="SP_CONN",
file_url="/sites/analytics/reports/plan.csv",
)
# Сохранить файл локально
mn.sharepoint_download_to_file(
sharepoint_conn="SP_CONN",
file_url="/sites/analytics/reports/plan.csv",
output_path="./tmp/plan.csv",
)
# Локально (_test)
df_local = mn.sharepoint_read_csv_test(
sharepoint_conn="SP_CONN",
file_url="/sites/analytics/reports/plan.csv",
dir_path="./secrets",
)
Примеры готовых сценариев для аналитика
Сценарий 1: загрузить данные из SharePoint и отправить summary в Mattermost
import mnemosynecore as mn
df = mn.sharepoint_read_csv(
sharepoint_conn="SP_CONN",
file_url="/sites/analytics/input/sales.csv",
)
summary = df.groupby("country", as_index=False)["amount"].sum()
mn.send_dataframe_preview(
channel_id="channel_id_here",
bot_id="MM_BOT",
df=summary,
title="Сумма продаж по странам",
)
Сценарий 2: выполнить SQL и отправить CSV в Mattermost
import mnemosynecore as mn
df = mn.vertica_select(
conn_id="VERTICA_PROD",
sql="SELECT * FROM mart.kpi_daily WHERE dt = CURRENT_DATE - 1",
)
mn.send_dataframe_as_csv(
channel_id="channel_id_here",
bot_id="MM_BOT",
df=df,
file_name="kpi_daily.csv",
text="KPI за вчера",
)
Сценарий 3: nightly-скриншоты Superset в разные каналы
import mnemosynecore as mn
mn.send_superset_dashboards_to_channels(
bot_id="MM_BOT",
superset_conn="SUPERSET_CONN",
dashboards=[
{
"dashboard_name": "Продажи - общий",
"channel_id": "sales_channel",
"text": "Утренний срез",
},
{
"dashboard_name": "Логистика - SLA",
"channel_id": "ops_channel",
"text": "SLA на утро",
},
],
)
Основные группы API
Секреты
get_connection_as_json,get_connection_as_json_testget_secret,get_secret_testresolve_secret,resolve_secret_testhas_connection,get_secret_field,require_secret_fields,get_secret_with_defaults
Vertica
vertica_conn,vertica_conn_testvertica_sql,vertica_sql_testvertica_select,vertica_select_testvertica_select_scalar,vertica_select_scalar_testvertica_insert_dataframe,vertica_insert_dataframe_testvertica_sql_file,vertica_sql_file_testvertica_sql_dir,vertica_sql_dir_testvertica_dedupe,vertica_dedupe_testvertica_upsert,vertica_upsert_test
Mattermost
post_message,post_message_testsend_message,send_message_testsend_thread_message,send_thread_message_testsend_thread_messages,send_thread_messages_testsend_file,send_file_testsend_file_bytes,send_file_bytes_testsend_files,send_files_testsend_dataframe_as_csv,send_dataframe_as_csv_testsend_dataframe_preview,send_dataframe_preview_test
Superset
get_superset_client,get_superset_client_testsuperset_request,superset_request_testsuperset_dashboard_url,superset_dashboard_url_testsuperset_chart_url,superset_chart_url_testsuperset_dashboard_link,superset_dashboard_link_testsuperset_chart_link,superset_chart_link_testsuperset_dashboard_thumbnail,superset_dashboard_thumbnail_testsuperset_chart_thumbnail,superset_chart_thumbnail_testsuperset_dashboard_screenshot_to_file,superset_dashboard_screenshot_to_file_testsuperset_chart_screenshot_to_file,superset_chart_screenshot_to_file_testsuperset_screenshot_dashboard,superset_screenshot_dashboard_testsuperset_screenshot_charts,superset_screenshot_charts_testsend_superset_dashboard_screenshot,send_superset_dashboard_screenshot_testsend_superset_dashboard_permalink_screenshot,send_superset_dashboard_permalink_screenshot_testsend_superset_chart_screenshot,send_superset_chart_screenshot_testsend_superset_dashboard_link,send_superset_dashboard_link_testsend_superset_chart_link,send_superset_chart_link_testsend_superset_dashboard_links_to_thread,send_superset_dashboard_links_to_thread_testsend_superset_chart_links_to_thread,send_superset_chart_links_to_thread_testsend_superset_dashboards_to_channels,send_superset_dashboards_to_channels_testsend_superset_charts_to_channels,send_superset_charts_to_channels_test
SharePoint
sharepoint_download_file,sharepoint_download_file_testsharepoint_download_to_file,sharepoint_download_to_file_testsharepoint_read_text,sharepoint_read_text_testsharepoint_read_dataframe,sharepoint_read_dataframe_testsharepoint_read_csv,sharepoint_read_csv_testsharepoint_read_excel,sharepoint_read_excel_testsharepoint_read_json,sharepoint_read_json_testsharepoint_read_sql,sharepoint_read_sql_testsharepoint_download_many,sharepoint_download_many_test
LLM
llm_chat,llm_chat_test
Retry
retry_call,retry
Локальная проверка перед релизом
pytest -q
Релиз и публикация
В проекте есть скрипт release.sh:
- повышает версию,
- запускает тесты,
- собирает пакет,
- публикует в TestPyPI/PyPI,
- делает commit/push.
Примеры:
# Только TestPyPI
./release.sh --target testpypi
# TestPyPI + PyPI
./release.sh --target both
# Явно задать версию
./release.sh --version 1.2.0 --target both
Для публикации нужен токен Twine (~/.pypirc или переменные TWINE_*).
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mnemosynecore-1.1.6.tar.gz.
File metadata
- Download URL: mnemosynecore-1.1.6.tar.gz
- Upload date:
- Size: 44.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bd85675e7c0e5f3537ba47be8d83505272b922c565e5425e3bdc28d7aaffa5e3
|
|
| MD5 |
fbaa94242aa5c6427b81d227d7b7b396
|
|
| BLAKE2b-256 |
9888e1c2269da10a638ee8bf602a72379f3ee3215b32433ace5021286c2e3c14
|
File details
Details for the file mnemosynecore-1.1.6-py3-none-any.whl.
File metadata
- Download URL: mnemosynecore-1.1.6-py3-none-any.whl
- Upload date:
- Size: 32.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
930e824374732bd4a901e71ac2c8303ad98795baa3fa9702f9e63b3a9e487f99
|
|
| MD5 |
b08337faf99552eb18c02a61f3c672fb
|
|
| BLAKE2b-256 |
466e8c4c9e4c836e3e0cb22f4ca76cf7cac28d0dafea0e0b666678c4de12fc26
|