Roadmap¶
Organised by package layout (src/mayutils/*). Priority tags: #critical, #high, #medium, #low; difficulty tags: #hard.
core¶
Lazy imports (PEP 810)¶
Priority: #low
- Adopt PEP 810 – Lazy imports once it lands in CPython. PEP 810 proposes a stdlib
importlib.lazymechanism (building on the earlierimportlib.util.LazyLoaderand thelazy-loader/slothyecosystem) that defers execution of a module's body until one of its attributes is accessed. This would letmayutilsdrop themay_require_extrasguard boilerplate for optional extras and instead rely on the interpreter to defer the import cost — only loading a heavy dependency (e.g.snowflake-connector,plotly) when the caller first touches it. Track the PEP status; revisit when the reference implementation ships.
data¶
Async reading and streaming¶
Priority: #low
-
AsyncQueryReaderandAsyncQueryStreamerprotocols indata/read.py— define the interface for native-async readers (e.g. Snowflakeaioconnector,asyncpg) so they can slot intoasync_read_query/async_stream_querywithout thread overhead. Until a real async driver exists, callers can useasyncio.to_thread(read_query, ...)instead.
environment¶
Logging¶
Priority: #critical
- Classmethod / staticmethod to change the default logging level.
- Re-add a file handler to the logger.
- Surface
logger.namein the rich handler output (rich#850).
interfaces.data¶
snowflake¶
Priority: #medium
- Stream management via the Snowflake Python API (
snowflake.core) — add thesnowflake.coredependency to thesnowflakeextra (wired throughmay_require_extras), ato_root()adapter onSnowflakeConfig/SnowparkExtendedSessionfollowing the existingto_connection()/to_snowpark_session()pattern, and a thin streams helper module (buildStreamSourceTable/StreamSourceView/StreamSourceStage+PointOfTimefrom plain typed arguments; resolvedb.schema.nametoStreamResource/StreamCollectionwith defaults from the config).Rootalso unlocks tasks, dynamic tables, warehouses, etc. for later.- Reference: Managing streams (Snowflake Python API)
dbt¶
Priority: #medium
- Build an interface to interact with dbt programmatically.
- Reference: dbt programmatic invocations (Fusion)
interfaces.filetypes¶
Cross-format conversion¶
Priority: #high
-
docs↔docx— round-trip between Google Docs and Word documents (via Drive export/import or a shared intermediate representation). -
slides↔pptx— round-trip between Google Slides and PowerPoint decks. -
sheets↔xlsx— round-trip between Google Sheets and Excel workbooks (sheet-by-sheet, preserving formulas/formatting where feasible).
markdown¶
Priority: #high
- Pandoc wrapper — shell out to
pandocfor format conversion (md ↔ docx / pptx / pdf / html / latex) with a typed Python API.- Reference: Pandoc user guide
- Reference: pypandoc
latex¶
Priority: #medium
- LaTeX wrapper — programmatic authoring of
.texdocuments with a fluent API (document class, preamble, sections, tables, figures) and a compile helper (pdflatex/tectonic) that mirrors thepptx → pdfLibreOffice pattern.
pptx¶
Priority: #critical
- Improve the Presentation text interface
- Ingest text directly from Markdown
- Reference: python-pptx#1019
- Reference: md2pptx user guide
- Reference: python-pptx bullet search
- Reference: python-pptx movie analysis
docx¶
Priority: #medium
- Flesh out the
python-docxfaçade (placeholder today) — document authoring, tables, images, styles.
docs¶
Priority: #medium
- Flesh out the Google Docs v1 wrapper (placeholder today), mirroring the
sheets/slidesergonomics.
visualisation.graphs.plotly¶
Priority: #critical
-
trace_info@propertyto infer colour / trace type from a trace, and refactor callers to consume it. #critical -
Subplot.from_plots@classmethodusing double-nested array notation for rows/columns. #critical -
Error bounds #critical
-
Fan Chart — new
Fantrace type -
Scatter-style error bounds
-
-
Marginals and rugs #critical
- Rugs — add histogram type (2D histogram contour)
- Convert rugs to work independently for x and y axis depending on trace type
- 2D: Scatter (2D histogram contour)
- 1D: Histogram
-
3D Histogram #critical #high — heatmap / contour alternative.
-
Categorical 3D axes #critical #medium (docs)
-
Animations #low
-
Subplot enlargement #low #hard
- Plot from subplot axis + traces (forum)
- Zoom-in behaviour
- Full-screen button (Streamlit parity)
Classification plots¶
Priority: #low
Maps¶
Priority: #low
- Map subplots & small multiples
- Tile county choropleths
- Tile scatter maps
- Map configuration
- Scatter plots on maps
- Density heatmaps
- Choropleth maps
visualisation.notebook / tables¶
Priority: #low
- Add
itablessupport- Reference: quick start
- Reference: formatting
- Great Tables theming (theme options)
objects.dataframes¶
Priority: #low
- Polars functionality (wait until the surrounding code is more familiar with it).
objects (Pydantic, decorators, classes)¶
Priority: #low
- Reference:
model_construct - Reference: ecosystem
- Set up a couple of things using pydantic.
- Translate dataclasses to pydantic dataclasses where helpful.
- Explore
BaseModel. - Implement other broadly-useful decorators as they come up.
- Add default class methods.
mathematics¶
Priority: #low
- JIT compilation with numba.
interfaces.cloud / webdrivers¶
Priority: #low
- Fix Chrome webdriver #hard — fix all Chromium variants.
- Fix Firefox webdriver #hard.
interfaces.code.tui¶
Priority: #low
-
tuiplotfixes- App name sometimes obscured with a black bar when out of focus.
- Ideally, half the Plotly chart wouldn't be squished.
Apps¶
Priority: #low
- Typer
- Streamlit exploration
- Reference: SQL connection (
st.connections.SQLConnection) - Reference: Connecting to data
- Reference: SQL connection (
Research / understand¶
Priority: #low