diff --git a/docs/Background/images/bloat-growth-problem.png b/docs/Background/images/bloat-growth-problem.png deleted file mode 100644 index 2eb434f..0000000 Binary files a/docs/Background/images/bloat-growth-problem.png and /dev/null differ diff --git a/docs/Background/images/toolset_simple.drawio.png b/docs/Background/images/toolset_simple.drawio.png deleted file mode 100644 index 70d6353..0000000 Binary files a/docs/Background/images/toolset_simple.drawio.png and /dev/null differ diff --git a/docs/Background/motivation.md b/docs/Background/motivation.md deleted file mode 100644 index a7980e4..0000000 --- a/docs/Background/motivation.md +++ /dev/null @@ -1,24 +0,0 @@ -# Motivation - -In recent years, energy modelling research has made efforts to improve the transparency of the modelling process, with multiple open-source workflows surfacing as proposed approaches to salvage this gap. Unfortunately, such workflows do not always lead to scientific refinement, either due to lack of maintenance, due to model-specific characteristics impeding their reuse, or due an ever-growing complexity turning them into black boxes where assumptions are difficult to ascertain. - -![Example workflow](./../images/not_modular.png) - -## Challenges - -Although each model has its own needs and characteristics, the data needed by them is often similar (demand profiles, existing capacity, land availability limits, etc). -The current approach of model-specific workflows hampers progress in two ways. - -1. **By making sharing methodological improvements more difficult** since processes are "locked-in" to a specific framework, leading to a lot of re-implementation between communities, which is error prone and makes studies difficult to evaluate. -2. **By making model workflows less comprehensible over time** since they tend to grow in size and complexity as more studies are conducted with them, eventually turning into [black boxes](https://doi.org/10.1088/2516-1083/ad371e), increasing the risk of combining incompatible assumptions or using depreciated data. - -![Bloat example](images/bloat-growth-problem.png) - -## Our solution - -This project aims to outline a framework for a modular approach to generating the constituent data for energy system models as well tying them together into a feature-complete, ready-to-run model. - -We focus in particular on: - -- Separating valuable software tools, datasets, and data processing steps into modular components that improve their potential reusability. Defining a set of requirements that increase the cross-compatibility and ease of understanding of software tools, datasets, and data processing steps in a model-agnostic way, following the standards of FAIR science. -- Reducing the duplication of work by allowing a mix-and-match approach to consuming data from independently maintained and updated modular data generation workflows. diff --git a/docs/Background/our_framework.md b/docs/Background/our_framework.md deleted file mode 100644 index ed19e42..0000000 --- a/docs/Background/our_framework.md +++ /dev/null @@ -1,91 +0,0 @@ -# Our Framework - -We distinguish four main types of components, all of which are stand alone projects. -Ensuring modularity and containerisation implies a shared approach to the way these access one another. - -Below is a general description of how our set of components achieves this, and how they interface with one another. - -![Our framework](images/toolset_simple.drawio.png) - -## Components - -### Software tools - -These are general-purpose libraries or tools that can be used in other projects via package managers, offering standardised solutions to commonly seen problems. Since users interact with them through code, they must focus on portability, good documentation, and exhaustive testing. - -??? info "Interfacing" - - The default method of access for these is [conda-forge](https://conda-forge.org/). This allows these tools to integrate into other components in a platform independent way via [environment files](https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html). Additionally, [snakemake wrappers](https://snakemake.readthedocs.io/en/stable/snakefiles/modularization.html#wrappers) may be created to avoid the need to rewrite common uses of a software tool between data modules. - -### Dataset tools - -These tools are used to create data for reuse in a broad range of cases. The key distinguishing feature of dataset tools as opposed to other components is that they generate a single set of versioned data as output, with no user configuration. -They can vary widely on their methodological complexity, so the choice of programming language or tool used for them should be assessed in a case-by-case basis. -A higher focus is put on following [FAIR principles](https://www.go-fair.org/fair-principles/), solid metadata standards, and thorough data validation. - -??? info "Interfacing" - - Users usually only ever need to interact with the resulting data and will rarely need to run these tools directly. - - The datasets produced by these tools are accessed via downloads, so the size and structure of the data should be kept in mind when choosing how to distribute them. - - - For smaller datasets (< 1 GB), non-queryable databases such as [Zenodo](https://zenodo.org/) are sufficient. - - For larger datasets (> 1 GB), developers should consult with their respective institutions for the possibility of using chunked and queryable data access methods, such as [THREADS](https://www.unidata.ucar.edu/software/tds/), enabling efficient data access via protocols like [OPeNDAP](https://www.opendap.org/). - -### Data modules - -These are topic-specific data-generating [`snakemake`](https://snakemake.github.io/) workflows that can be configured to produce case-specific data, allowing users to tune certain assumptions via configuration files or by through input data. These modules follow a commonly agreed input/output structure, their methodology is well documented, and they rely on datasets and software libraries that are trustworthy and stable. This is achieved through a standardised template that all data modules must follow. - -??? info "Interfacing" - - These are accessed by other workflows via [snakemake’s module functionality](https://snakemake.readthedocs.io/en/stable/snakefiles/modularization.html#modules). - Below is an example of how a data module can be accessed by another workflow. - - ```python - # Load the module configuration - with open(workflow.source_path("config/geoboundaries.yaml"), "r") as file: - config_geoboundaries = yaml.safe_load(file.read()) - - module geoboundaries: - # Request a specific module version. - snakefile: - github( - "modelblocks-org/module_geo_boundaries", - path="workflow/Snakefile", - tag="v0.1.9" - ) - # Specify the module configuration. - config: config_geoboundaries - # Pathvars let you tune input/output file location. - pathvars: - shapes="results/module_geoboundaries/shapes.parquet" - - # Rewrite rule names to avoid naming conflicts - use rule * from geoboundaries as module_geoboundaries_* - ``` - -??? note "Template" - - All data modules should follow [our standardised template](https://github.com/modelblocks-org/data-module-template). - This template provides a baseline for developers to ensure the following. - - - Version-specific access via version tags. - - Isolated configuration between modules. - - Standardised documentation for module interfacing. - -### Model builders - -These are study-specific workflows that combine the outputs of all other types of components to produce an energy systems model aiming to answer a particular research question. They are highly heterogeneous in their components and are tailored to generating a model for a specific modelling framework. - -??? info "Interfacing" - - Model builders may access all other components above as needed. - Since they tend to be study-specific, they will rarely (if ever) be accessed by other tools or components. - It is perfectly possible to ensure that a model builder can be accessed modularly, but this is not required. - -## The `clio_tools` integration utility - -To save time and enable component developers to check against the latest `modelblocks` standards, we provide the `clio_tools` library. -This is a set of useful utility functions, geared towards ensuring smooth interfacing. - -For more information, check [`clio_tools`](https://github.com/modelblocks-org/clio-tools). diff --git a/docs/Developer_guidelines/getting_started.md b/docs/Developer_guidelines/getting_started.md deleted file mode 100644 index 6de7b61..0000000 --- a/docs/Developer_guidelines/getting_started.md +++ /dev/null @@ -1,31 +0,0 @@ -# How to get started - -Make sure to read about [our framework](../Background/our_framework.md) to familiarise yourself with each type of component -and decide the type of project that best fits your goals. - -We assume you already have `conda` or `mamba` installed in your system. -If you don't, we recommend following `mamba`'s [installation advice](https://github.com/mamba-org/mamba). - -1. Create a new environment and install `copier` in it. - - ```shell - mamba env create -n my_new_module - mamba install -c conda-forge copier - ``` - -2. Call the `copier` template of the type of component you wish to make. Currently, we only support [data modules](https://github.com/modelblocks-org/data-module-template). - - ```shell - copier copy 'https://github.com/modelblocks-org/data-module-template' - ``` - -3. You'll be prompted with some questions. After answering them, `copier` will auto-generate the module for you. - - ```html - >🎀 Please enter the name of your tool in snake_case. - my_new_module - ... - ``` - -You are ready to go! -Please look into our general [requirements and conventions](./requirements.md#requirements-and-conventions) and familiarise yourself with the [templates](./templates.md). diff --git a/docs/Developer_guidelines/requirements.md b/docs/Developer_guidelines/requirements.md deleted file mode 100644 index 65564a0..0000000 --- a/docs/Developer_guidelines/requirements.md +++ /dev/null @@ -1,102 +0,0 @@ -# Requirements and conventions - -## Component requirements - -We enforce the following requirements in all projects. - -1. **Open-source code**: projects must use either Apache 2.0 or MIT open-source licenses, which are [OSI approved](https://opensource.org/licenses), and they must be openly available in platforms such as GitHub. -2. **Open data**: data produced by projects (dataset tools and data modules in particular) should use a [CC-BY-4.0 license](https://creativecommons.org/licenses/by/4.0/) whenever possible. -3. **Versioning**: projects must be version controlled with official releases, which can be used to specify the version of the project used in a study and/or dataset, and an accompanying CHANGELOG. Project developers are free to choose their preferred approach (e.g., [SemVer](https://semver.org/) or [CalVer](https://calver.org/)). -4. **Testing**: projects must employ some type of testing to ensure quality and long-term stability. The approach will vary depending on the type of project: - - 1. **Software tools**: these require using testing frameworks (e.g., [pytest](https://docs.pytest.org/en/stable/)). The chosen approach (e.g., unit testing, functional testing) is up to the developer, but some kind of testing must be present. - 2. **Dataset tools**: the method used to produce the data must contain some kind of assurance or evaluation to ensure its quality. The choice of method is up to the maintainers in a case-by-case basis. - 3. **Data modules**: a minimal set of tests, provided by our template. These will fulfill two goals: - 1. Verifying that module inputs/outputs are placed in the right locations. - 2. Serve as a small example of the module’s operation, which will be used to build standardised module documentation. We recommend delegating more complex testing to the software tools and datasets used by the module. - 4. **Model builders**: we refrain from requiring a specific testing method for these repositories. Nevertheless, we recommend at least using lightweight snakemake [unit tests](https://snakemake.readthedocs.io/en/stable/snakefiles/testing.html) to verify that the steps of the workflow work as intended. - -5. **Documentation**: projects must provide documentation to ensure the methods and reasoning behind their code can be understood: - 1. **Software tools**: versioned domaximum_roof_ratio: 0.80 # unit for a value cumentation website with, at minimum, API documentation and useful examples. - 2. **Dataset tools**: either versioned documentation or a README file explaining the methodology and assumptions employed, to allow others to reuse the tool in the future to reproduce or update the dataset when necessary. - 3. **Data modules**: projects must have versioned and standardised documentation with the following in mind: - 1. A README file explaining the different steps of the workflow, citing relevant material, and detailing their methodology. - 2. To follow our templating, which requires explanations of key components (configuration options, input/output files, wildcards) and will enable standardised documentation generation. - 4. **Model builders**: no specific requirements, but documentation is nevertheless recommended. - -## File conventions - -The following is a list of general advice on how to format files to help tools interact seamlessly. We encourage developers to employ validation for user inputted files, either through [built-in snakemake functionality](https://snakemake.readthedocs.io/en/stable/snakefiles/configuration.html#validation), or through libraries like [pydantic](https://docs.pydantic.dev/latest/) and [pandera](https://pandera.readthedocs.io/en/stable/). - -1. **Configuration data**: we prefer to use YAML (.yaml) files. - 1. These files must always be validated to detect invalid user settings. - 2. Unit-specific configuration settings must state the unit explicitly in their naming. - - ???+ example "Naming configuration variables clearly" - - ```yaml - maximum_installable_mw_per_km2: # unit for the section - pv_tilted: 160 - pv_flat: 80 - maximum_roof_ratio: 0.80 # unit for a value - ``` - -2. **Tabular data**: we prefer [Apache Parquet](https://parquet.apache.org/) (.parquet) files due to their performance, storage efficiency and [metadata compatibility](https://parquet.apache.org/docs/file-format/metadata/), with the following requirements: - 1. Follow [tidy data](https://vita.had.co.nz/papers/tidy-data.pdf) principles (columns are variables, rows are observations) to make data machine-readable. - - ???+ example "Example of a tidy table" - - | year | country_id | shape_id | demand_mwh | - |---------------|------------------|------------------|--------------| - | 2020 | ITA | North | 4500 | - | 2020 | ITA | East | 4800 | - | 2020 | ITA | South | 3000 | - - 2. Embed important metadata within the file, with at minimum the following values: - 1. `units`: a dictionary specifying per-column units, using `no_unit` for unitless cases. Used to simplify parsing and enabling easier integration of unit-checking tools like [pint](https://pint.readthedocs.io/en/stable/). - 2. `source`: a string specifying the source and/or author of a dataset. - 3. `license`: a string specifying the license of the dataset. - - ??? example "Embedding metadata in `pandas`" - - `pandas` will automatically convert data in `df.attrs` into [file-level metadata](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.attrs.html#pandas.DataFrame.attrs) when saving to `.parquet`: - - ```python - dataframe.attrs["units"] = { - "year": "yr", - "country_id": "no_unit", - "shape_id": "no_unit", - "demand": "mwh" - } - dataframe.attrs["source"] = "github.com/modelblocks-org/docs" - dataframe.attrs["license"] = "CC-BY-4.0" - dataframe.to_parquet('my_data.parquet') - ``` - -3. **Raster data**: we prefer to use GeoTIFF (.tiff) files. -4. **Polygon data**: we prefer [GeoParquet](https://geoparquet.org/) (.parquet) files. -5. **Gridded data**: we prefer to use [netCDF](https://www.unidata.ucar.edu/software/netcdf/) (.nc) files. - -## Metadata conventions - -1. For all data: use snake case (`foo_bar`) for headers, keys, indexes, variables, etc. Avoid hyphens (`foo-bar`) and camel case (`FooBar`). -2. For timeseries data: timeseries must follow [ISO 8601 UTC](https://en.wikipedia.org/wiki/ISO_8601) spec (e.g., 2024-08-01T15:00:00Z). -3. For national / subnational data: - 1. Country IDs should always be under the `country_id` naming and follow [ISO 3166-1 alpha-3](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3) (e.g., CHE, CHN, GBR, MEX, etc). - 2. Sub-regions must be under the `shape_id` naming. This applies even in cases where national resolution is requested (i.e., `country_id` and `shape_id` should match). - 3. A `shape_spec` key or header should be present, specifying the version of the subregion standard used (e.g., NUTS2024, GADM4.1, ISO 3166-2:2013). This aids in replicability since subregion codes [change quite often](https://ec.europa.eu/eurostat/web/nuts/history). - - ???+ example "Example of tabular subnational data" - - | country_id | shape_id | shape_spec | demand_mwh | - |------------------|------------------|------------------|--------------| - | DEU | DE13 | NUTS2024 | 4500 | - | DEU | DE14 | NUTS2024 | 4800 | - | ITA | ITA0 | GADM4.1 | 20000 | - -4. For spatial data: - 1. Use `longitude` | `latitude` to express position and avoid ambiguous values like `x` | `y`. - 2. Make sure to save the CRS with the spatial data. With the recommended file types for GIS data, see above, this is guaranteed. - 3. For geodetic data, where preserving position matters, use a geodetic CRS (e.g. [EPSG:4326](https://epsg.io/4326)). - 4. For projected data, where preserving distance or area matters, allow users to specify the reference system that best fits the needs of the calculation (e.g. [EPSG:3035](https://epsg.io/3035) for Europe). -5. For currency data: currency codes must follow [ISO 4217 alpha-3](https://en.wikipedia.org/wiki/ISO_4217) codes in combination with the year of the currency (e.g., CHF2024, EUR2015, USD2020) to allow for inflation adjustments. diff --git a/docs/Developer_guidelines/templates.md b/docs/Developer_guidelines/templates.md deleted file mode 100644 index c7be271..0000000 --- a/docs/Developer_guidelines/templates.md +++ /dev/null @@ -1,32 +0,0 @@ -# Templates - -## Software tool template - -For now, we do not provide templates for software tools. -Stay tuned! - -## Dataset tool template - -Dataset tools are run sparingly, often once every couple of years or so. -Since users do not need to interact with these tools themselves, our focus is on ensuring long-term stability of the software. -This can be achieved via lock-files, which "freeze" the specific python libraries used for a tool. -Our preferred tool to achieve this is [pixi](https://pixi.sh/latest/) due to its conda integration and ease of use. - -A template for these tools is in development. -Stay tuned! - -## Data module template - -Data modules will experience higher user interaction due to their user configurable nature. -This would quickly become confusing without some level of standardisation, so our template focuses on the following features: - -- Standardised folder and file names for user inputs and module outputs. -- Automatically generated documentation in a standard format, providing a familiar structure across all data modules. -- Automatic checks for template updates, aiding module developers in keeping up with the latest standard. - -URL: - -## Model builder template - -For now, we do not provide templates for model builders. -Stay tuned for example models using our approach! diff --git a/docs/Modules/modules.md b/docs/Modules/modules.md deleted file mode 100644 index 7d11212..0000000 --- a/docs/Modules/modules.md +++ /dev/null @@ -1,17 +0,0 @@ -# Modules - -Currently, the following data modules are available. - -!!! note "More extensive docs are coming soon" - - The modules are currently in active development. A more detailed documentation showing the capability of each module will be coming soon. - -- [module_area_potentials](https://github.com/modelblocks-org/module_area_potentials) -- [module_demand_electricity](https://github.com/modelblocks-org/module_demand_electricity) -- [module_electricity_grid](https://github.com/modelblocks-org/module_electricity_grid) -- [module_geoboundaries](https://github.com/modelblocks-org/module_geo_boundaries) -- [module_hydropower](https://github.com/modelblocks-org/module_hydropower) -- [module_powerplants](https://github.com/modelblocks-org/module_powerplants) -- [module_pv_wind](https://github.com/modelblocks-org/module_pv_wind) - -If you think that an important topic is not covered by the modules above, feel free to develop your own module! Please read the [developer guidelines](../Developer_guidelines/getting_started.md) to learn how to get started. Our templates and recommended good practices are ready to help you, so your module will work smoothly from the start. diff --git a/docs/background/images/bloat.drawio.png b/docs/background/images/bloat.drawio.png new file mode 100644 index 0000000..0287f14 Binary files /dev/null and b/docs/background/images/bloat.drawio.png differ diff --git a/docs/images/modular.png b/docs/background/images/modular.png similarity index 100% rename from docs/images/modular.png rename to docs/background/images/modular.png diff --git a/docs/images/not_modular.png b/docs/background/images/not_modular.png similarity index 100% rename from docs/images/not_modular.png rename to docs/background/images/not_modular.png diff --git a/docs/background/index.md b/docs/background/index.md new file mode 100644 index 0000000..1c9eb47 --- /dev/null +++ b/docs/background/index.md @@ -0,0 +1,52 @@ +# Background + +Modelblocks grew out of the principle of modularising the [building blocks of energy system models](https://doi.org/10.1088/2516-1083/ad371e "Pfenninger-Lee, 2024. Open code and data are not enough: understandability as design goal for energy system models") to allow research teams to share methodologies without prioritising a specific model or tool in particular. + +However, in practice it can be applied to any field or modelling domain where the data fed into models is generally similar. +Each model has its own needs and characteristics, but more often than not it will benefit from having access to well structured and standardised input data. + + +## Challenges + +Modelblocks started a response to [challenges seen in energy modelling research](https://doi.org/10.1016/j.enpol.2016.11.046. "Pfenninger-Lee et al, 2017. The importance of open data and software: Is energy research lagging behind?") and similar fields. + +1. **Models often become too complex for their own good.** +This complexity makes them difficult to evaluate and replicate, even to the [modellers themselves](https://history.ucsd.edu/_files/faculty/oreskes-naomi/VerificationConfirmationofModels.pdf "Oreskes et al, 1994. Verification, Validation and Confirmation of Numerical Models in the Earth Sciences"). +1. **Models have their own nuances and quirks.** +Data produced with exclusively one model in mind is often difficult to reuse in later exercises. +1. **Models and data deteriorate over time.** +Human and natural systems are dynamic by nature, meaning data and methodologies need periodical revision. +Depreciated data, lack of understandibility, and maintenance burdens can ultimately turn a good model into a black box that can be misused. + +Over time, models can turn into monoliths that are difficult to maintain, and increasingly harder to understand and share with other researchers. + +![Bloat example](./images/bloat.drawio.png) + +## Our solution + +Modelblocks aims to develop and maintain a collection of reusable, composable data workflows designed with modularity mind from the onset. +We focus on the following core ideals: + +- **Model agnostic**: modules should focus on providing good data to the best of their ability. +Model nuances can be added later by users if needed. +- **Replicable, reusable, and reconfigurable**: modules should be easy to reuse and reapply on different contexts, with different assumptions, and on different computer systems. +- **Easily adoptable**: modules should use well established tools in the field of energy systems and be easy to integrate into pre-existing projects. +- **Improvable and manageable**: modules should allow researchers to collaborate on targeted improvements with minimal complications. + +Ultimately, Modelblocks aids in turning monolithic workflows into modular ones that are easier to improve and share. + + +??? info "Compare modular and monolithic modelling approaches" + + === "Modular model" + + Example based on [Euro-Calliope](https://github.com/calliope-project/euro-calliope) with some components abstracted into modules. + + [![Modular model workflow](./images/modular.png){ .workflow-comparison-image }](./images/modular.png){ target="_blank" rel="noopener" } + === "Monolithic model" + + [Euro-Calliope](https://github.com/calliope-project/euro-calliope) in full. + This version includes additional rules for transport and geopolitical region construction. + How do they interact with other rules? + + [![Monolithic model workflow](./images/not_modular.png){ .workflow-comparison-image }](./images/not_modular.png){ target="_blank" rel="noopener" } diff --git a/docs/css/extra.css b/docs/css/extra.css new file mode 100644 index 0000000..88a48af --- /dev/null +++ b/docs/css/extra.css @@ -0,0 +1,100 @@ +.rst-badge { + font-size: 0.7rem; +} + +/* reduce font size of rendered math */ +.katex-html { + font-size: 0.8rem; +} + +/* Set this to match the logo */ +:root { + --md-primary-fg-color: #0e9c81ff; + --md-primary-fg-color--light: #23b89cff; + --md-primary-fg-color--dark: #026353ff; +} + +.md-typeset, .md-nav, .md-tabs__link, .md-typeset .admonition, .md-typeset details, .md-typeset table:not([class]) { + font-size: 0.8rem; +} + +.md-typeset h1, .md-typeset h2 { + font-weight: normal; + color: var(--md-typeset-color); +} + +.doc-function h3 { + /* font-size: 1.0rem; */ + margin-top: 3.0rem; +} + +.bubble { + border-radius: 2px; + padding: 1px 4px 1px 4px; +} + + +/* Allow tables to be horizontally scrollable. */ +.md-typeset__scrollwrap { + overflow-x: auto; +} + + +.md-typeset li.xr-var-item, .md-typeset ul.xr-var-list { + display: contents; +} + +.md-typeset .xr-section-details { + display: none; +} + +.md-typeset ul.xr-dim-list li { + margin-bottom: 0; + margin-left: 0; +} + +.md-typeset ul.xr-dim-list { + margin-bottom: 0; + margin-top: 0; +} + +/* Make card links cover the entire grid card. */ +.md-typeset .grid.cards > ul > li { + position: relative; +} + +.md-typeset .grid.cards a.card-link::after { + position: absolute; + inset: 0; + content: ""; +} + +.md-typeset img.workflow-comparison-image { + display: block; + width: 100%; + aspect-ratio: 1236 / 635; + object-fit: contain; + background: white; +} + +/* Module type badges. */ +.badge-core, +.badge-community { + display: inline-block; + font-size: 0.7rem; + font-weight: 600; + line-height: 1.5; + padding: 0.12rem 0.55rem; + border-radius: 999px; + text-transform: capitalize; +} + +.badge-core { + background: #ede7fb; + color: #5a32b0; +} + +.badge-community { + background: #fff3e0; + color: #8a5a00; +} diff --git a/docs/developer/best.md b/docs/developer/best.md new file mode 100644 index 0000000..2463c5e --- /dev/null +++ b/docs/developer/best.md @@ -0,0 +1,276 @@ +# Best practices + +The following is a list of general advice on how to help your module interact seamlessly with other workflows. +Although not obligatory, **Core**{ .badge-core } modules should strive to comply with these guidelines. + +## Metadata recommendations + +The structure of the configuration, user provided resources, and module results should be clearly structured. +Here are some general recommendations on how to achieve this. + +### Embedded metadata + +When possible, save important metadata within files instead of producing separate ones. +This can vary from adding a `source` column to a table, to adding metadata to a file's attributes. + +The following metadata values are often useful: + +- `units`: a dictionary specifying per-column units, using `no_unit` for unitless cases. +- `source`: a string specifying the source and/or author of a dataset. +- `license`: a string specifying the license of the dataset. + +??? example "Example: embedding metadata with `pandas`" + + `pandas` will automatically convert data in `df.attrs` into [file-level metadata](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.attrs.html#pandas.DataFrame.attrs) when saving to `.parquet`: + + ```python + dataframe.attrs["units"] = { + "year": "yr", + "country_id": "no_unit", + "shape_id": "no_unit", + "demand": "mwh" + } + dataframe.attrs["source"] = "github.com/modelblocks-org/docs" + dataframe.attrs["license"] = "CC-BY-4.0" + dataframe.to_parquet('my_data.parquet') + ``` + +### Consistent naming + +Follow these principles to avoid confusion and reduce the need for extensive documentation. + +- **Naming convention**: use snake_case (`foo_bar`) for columns, configuration keys, file names, parameters, etc. +Avoid hyphens (`foo-bar`) and camel case (`FooBar`). +- **Prefer explicit names over implicit ones**: A value's purpose should be clear from its name. For example, use `longitude` and `latitude` to represent a position rather than ambiguous labels such as `x` and `y`. +- **Ensure units are explicit**: configuration values and file attributes should state units explicitly in their naming. + + ???+ example "Example: clear naming of configuration values" + + ```yaml + maximum_installable_mw_per_km2: # (1)! + pv_tilted: 160 + pv_flat: 80 + maximum_roof_ratio: 0.80 # (2)! + ``` + + 1. Sections should state the unit of their subitems. + 2. Use clear names even for unitless cases like ratios. + +- **Use consistent country / subregion identifiers**: do the following when dealing with national and sub-national identification codes. + + - **Country identifiers**: national IDs should be under the `country_id` key and follow [ISO 3166-1 alpha-3](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3) (e.g., CHE, CHN, GBR, MEX, etc). + - **Subnational region identifiers**: identifiers related to (sub)national regions/polygons should be under the `shape_id` key. + This applies even in cases where national resolution is requested (i.e., `country_id` and `shape_id` should match). + + ??? example "Example: table with country and subnational identifiers" + + | country_id | shape_id | demand_mwh | + |------------|----------|--------------| + | DEU | DE13 | 4500 | + | DEU | DE14 | 4800 | + | ITA | ITA0 | 20000 | + +- **Standardise currencies**: currency codes must follow [ISO 4217 alpha-3](https://en.wikipedia.org/wiki/ISO_4217) codes in combination with the year of the currency (e.g., CHF2024, EUR2015, USD2020) to allow for clear currency adjustments. + + +## Timeseries recommendations + +### Timestamp ISO standard + +Follow [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) specifications and ensure timeseries include UTC date and time (e.g., `2026-07-15 12:00:00+00:00`) specifications to avoid time interval issues. + +??? example "Example: convert timeseries to UTC with `pandas`" + + ```python + # if the timeseries is already recorded in UTC. + df["timestamp"] = pd.to_datetime(df["timestamp"], utc=True) # (1)! + # if the timeseries was recorded for a different timezone + df["timestamp"] = ( + pd.to_datetime(df["timestamp"]) + .dt.tz_localize("Australia/Sydney") # (2)! + .dt.tz_convert("UTC") + ) + ``` + + 1. Non-ISO (UTC) -> ISO (UTC) + 2. Non-ISO (Sydney) -> ISO (Sydney) -> ISO (UTC) + +### Time period standard + +As a general convention, we interpret timestamp periods in a **start-of-period** fashion. +E.g. 00:00 should be the first timestep of the day (covering from 0:00 until 00:59), and 23:00 the last (from 23:00 to 23:59). + +Timeseries generally represent parameters that are either _instantaneous_ or _computed_. +Our start-of-period convention applies to both cases. + +- **Instantaneous parameters**: these represent the value _at exactly_ the specified timestamp. + + ??? example "Example: instantaneous samples" + + Imagine we are sampling temperature using a sensor in a periodic fashion at 1-hour intervals. + + Assuming instantaneous sampling, the 09:00 timestamp would represent the parameter _at exactly 09:00_. + + ![instant](./images/instant_timepoint.drawio.png) + +- **Computed parameters**: these represent the result of an operation over a collection of instantaneous samples. +This could be a cumulative sum, mean, maximum, minimum, etc. + + ??? example "Example: computed maximum" + + Assume our parameter is the computed maximum temperature over a period of 1-hour. + + Under a start-of-period convention, the 08:00 value would represent the maximum _from_ 08:00 _to_ 09:00. + + ![mean](./images/max_timepoint.drawio.png) + + +??? warning "Adjusting end-of-period timeseries" + + Some datasets and tools, such as [ERA5 reanalysis dataset](https://confluence.ecmwf.int/spaces/CKB/pages/85402030/ERA5+terminology+analysis+and+forecast+time+and+steps+instantaneous+and+accumulated+and+mean+rates+and+min+max+parameters) and the [`atlite` library](https://atlite.readthedocs.io/en/latest/conventions.html#time-points) provide data in an end-of-period fashion. + + Adjusting to start-of-period is trivial with [`pandas`](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.shift.html). + + ```python + start_of_period = end_of_period.shift(freq="-1h") # (1)! + ``` + + 1. Assumes the data already has a `DatetimeIndex`. + + +## Configuration recommendations + +These recommendations relate to the configuration files provided by users (`config/config.yaml`). + +### Extra validation + +Configuration YAML files should always be validated to detect invalid user settings using the latest [JSON-schema specification](https://json-schema.org/). +However, it might be necessary to write additional tests to catch problems that regular JSON-schema logic cannot guard against. +You can write these tests in a separate validation function. + +```python title="Snakefile" +include: "rules/_utils.smk" # (1) +configfile: workflow.source_path("../config/config.yaml") +validate(config, workflow.source_path("internal/config.schema.yaml")) +additional_validation(config) # (2) +``` + +1. Defines `additional_validation`. +2. Used for validation checks with more detailed logic. + +### Common structures + +Here are some recommended structures for configuration settings commonly needed by modules. + +1. **Coordinate reference systems**: request users to specify their CRS of choice, and group these under the `crs` key. + + ```yaml + crs: + geographic: "EPSG:4326" # (1)! + projected: "EPSG:3035" # (2)! + ``` + + 1. Geographic operations where preserving position matters. + 1. Projected operations where preserving distance or area matters. + +1. **Temporal scopes**: if your module supports a flexible temporal scope, define the date range using an _inclusive_ start date and an _exclusive_ end date. + + The range below includes data from `2017` up to, but not including, `2020` (i.e., 2017, 2018, and 2019). + + ```yaml + temporal_scope: + start: "2017" # (1)! + end: "2020" # (2)! + ``` + + 1. Will be included in data. + 2. Won't be included in the data. + + +## Tabular file recommendations + +These recommendations relate to tabular data consumed / produced by modules. + +### Storage format + +We _highly_ recommend the use of [Apache Parquet](https://parquet.apache.org/) (`.parquet`) over other formats (such as `.csv`). + +- Very good read/write performance. +- High storage efficiency and [metadata compatibility](https://parquet.apache.org/docs/file-format/metadata/). +- Supports geospatial data thanks to the [Geoparquet standard](https://geoparquet.org/). + +### Tidy data principles + +We also recommend to follow [tidy data](https://vita.had.co.nz/papers/tidy-data.pdf) principles to make data machine-readable (prefer "long" tables over "wide" ones when applicable). + +???+ example "Example of a tidy table" + + | year | country_id | shape_id | demand_mwh | + |---------------|------------------|------------------|--------------| + | 2020 | ITA | North | 4500 | + | 2020 | ITA | East | 4800 | + | 2020 | ITA | South | 3000 | + + +### Validation + +As stated in our [Convention][convention], modules should validate inputs whenever possible. +In the case of tabular data, we highly recommend to also validate intermediate tabular files produced by the module. + +[`pandera`](https://pandera.readthedocs.io/en/stable/) DataFrame models offer a simple, pragmatic way to achieve this. + +??? example "Validating input shapes" + + Input shape files, a.k.a. (sub)national regions are a common input to many modules. + Below you can find a simple schema that follows the structure of the [Geo-boundaries module](https://github.com/modelblocks-org/module_geo_boundaries). + + + ```python + from pandera import pandas as pa + from pandera.typing.geopandas import GeoSeries + from pandera.typing.pandas import Series + from shapely.geometry import MultiPolygon, Polygon + + class ShapesSchema(pa.DataFrameModel): + """Schema for geographic shapes.""" + + class Config: + coerce = True # (1)! + strict = "filter" # (2)! + + shape_id: Series[str] = pa.Field(unique=True) + "A unique identifier for this shape." + country_id: Series[str] pa.Field(str_length=3) + "Country ISO alpha-3 code." + shape_class: Series[str] = pa.Field(isin=["land", "maritime"]) + "Identifier of the shape's context." + geometry: GeoSeries + + @pa.check("geometry", element_wise=True) + def check_geometries(cls, geom) -> bool: # (3)! + return ( + isinstance(geom, (Polygon, MultiPolygon)) + and not geom.is_empty + and geom.is_valid + ) + ``` + + 1. Attempt to coerce values before raising failures. + 2. Remove columns not specified in the schema. + 3. Check that input geometries are healthy. + + +## Other GIS file formats + +These recommendations relate to non-vectorised GIS files. + +### Raster data + +For raster data we recommend to use GeoTIFF (`.tiff`, `.tif`) files. +When possible, users should rely on Cloud Optimised GeoTIFF (COG) files, which allow [downloads of specific spatial extents](https://cogeo.org/), saving download bandwidth. + +### Gridded data + +For gridded data we prefer to use [netCDF](https://www.unidata.ucar.edu/software/netcdf/) (`.nc`) files. + +We recommend to follow similar conventions as the [`atlite` library](https://atlite.readthedocs.io/en/latest/conventions.html#grid-coordinates), where coordinates represent points in the **center** of each grid cell. diff --git a/docs/developer/convention.md b/docs/developer/convention.md new file mode 100644 index 0000000..0cc3fdc --- /dev/null +++ b/docs/developer/convention.md @@ -0,0 +1,154 @@ +# Convention + +This page specifies the Modelblocks convention related to this documentation release version. + +It should be followed by both **Core**{ .badge-core } and **Community**{ .badge-community } modules. + +## Software requirements + +All modules should comply with the following requirements at a software design / execution level. + +### Environment management + +#### `pixi` centralisation + +The `pixi.lock` file should be the primary source of truth when it comes to all the dependencies of the software. + +Other dependency definitions (such as `Snakemake`'s pinned environment files) should be generated using `pixi.lock`. + +The software should export the necessary environments to `Snakemake` via the `pixi run export-snakemake-env [environment_name]` task command. + +#### Environment separation + +The project should separate the environment used for module development (`default`) from the environment used during rule execution (`module`) to keep module execution lean on the user side. + +#### `conda` exclusivity + +The module's `Snakemake` workflow should exclusively rely on `conda` as a software package repository. + +Other indexers, such as `pypi`/`pip` are **explicitly discouraged** as the long-term stability of the software is not guaranteed when repository sources are mixed. + +### Interfacing + +#### Standardised default input / output locations + +Modules should expect user inputs and place processed outputs in the following locations by default. + +- User inputs should be placed in `resources/user/`. +- Intermediate module files should be placed in `resources/automatic/`. +- Module outputs should be placed in `results/`. +- Log files should be placed in `logs/`. + +#### `pathvar` rewiring + +All the input / output files of the module should have the ability to be easily rewired using `Snakemake`'s `pathvar` functionality, with the following characteristics. + +- Each user input file should have its own exclusive `pathvar`. +- Each module output file should have its own exclusive `pathvar`. +- The module should provide directory-wide `pathvars` for `resources/`, `results/` and `logs/`. + +### Input validation + +#### Configuration + +Projects should validate input configurations using a standardised schema located in `workflow/internal/config.schema.yaml`, and provide a configuration example with recommended defaults in `config/config.yaml`. + +Following `Snakemake` specifications, the configuration schema should follow the latest [JSON-schema specification](https://json-schema.org/) + +#### User files + +When possible, modules should validate input files using data tools like [`pandera`](https://pandera.readthedocs.io/en/stable/) or equivalents. + +## Repository requirements + +All modules show comply with the following requirements at a repository level. + +### Licensing + +Projects should use either Apache-2.0 or MIT open-source licenses, which are [OSI approved](https://opensource.org/licenses). + +Projects should maintain an `AUTHORS` file detailing licensing attribution of the software. + +### Code hosting + +Projects must be openly available on platforms compatible with [`Snakemake`'s code hosting calls](https://snakemake.readthedocs.io/en/stable/snakefiles/modularization.html#code-hosting-providers). +At the time of writing this includes only GitHub and GitLab. + +### Versioning + +Projects must be version controlled with official releases, which can be used to specify the version of the project used in a study and/or dataset. +Project developers are free to choose their preferred approach (e.g., [SemVer](https://semver.org/) or [CalVer](https://calver.org/)). + +### Documentation + +Projects must provide documentation to ensure the methods and reasoning behind their code can be understood. +We recommend a pragmatic approach that balances explainability against maintenance burdens. + +#### General README + +This file, located in `README.md`, should provide the following sections: + +- A summary of the module's purpose with a brief mention of `Snakemake` to aid in automated indexing in the [workflow catalog](https://snakemake.github.io/snakemake-workflow-catalog/). +- An overview of the module's processing stages. +- An overview or reference to the module's interfacing and configuration requirements. +- An brief description of how to initialise the software for development tasks and local testing. +- References related to the module's methodology. +- Contributor attribution following [All Contributors](https://allcontributors.org/) standards. + +#### Configuration README + +This file, located in `config/README.md`, should provide an overview of the module's configuration options and point users to the relevant schema files. + +#### INTERFACE.yaml + +This file should detail the module's input/output file structure from a user's perspective, with the following structure: + +- `pathvars`: describes the pathvars provided by the module in terms of default value and description, grouped into: + - `snakemake_defaults`: defines logs, resources and results. + - `user_resources`: user input files starting with the prefix `/user/`. + - `results`: module outputs starting with the prefix `/`. +- `wildcards`: Descriptions of {wildcards} used in resource or result paths. Every declared wildcard must be used, and every used wildcard must be declared. +- `convention_version`: The Modelblocks convention version, validated as semantic versioning. + +### Continuous integration + +Projects must comply with the following testing requirements at minimum. +These tests should execute successfully before changes are integrated into the repository. +The template should provide pre-configured pull request test setups in `.github/workflows/pr-ci.yml`. + +#### Module testing + +Projects must ensure that the provided `integration_test.py` file executes successfully on **all major platforms** (Linux, MacOS, Windows). + +This test should evaluate the following: + +- The module's `conda` environments match their `pixi` counterparts. +- The module's `INTERFACE.yaml` file complies with the schema defined in this convention. +- Essential interfacing and documentation files (as defined by the template) are present in the repository. +- A minimal integration test simulating a user importing and executing the module, defined in `tests/integration/Snakefile`. + +#### Repository health + +Projects should comply with a set of minimal linting and formatting tests to aid in the mantainability of the codebase. +These tests are defined in `.pre-commit-config.yaml`, and make use of [pre-commit.ci](https://pre-commit.ci/). + +Among other things, these tests evaluate the following: + +- Machine readability issues such as removing trailing whitespaces and adding end-of-file newlines. +- Repository quality issues such as large files, the use of GitHub submodules, illegal Windows filenames, and malformed configuration files (e.g., .json or .yaml). +- Code quality for python files (using [`ruff`](https://docs.astral.sh/ruff/)) and `Snakemake` files (using [`snakefmt`](https://github.com/snakemake/snakefmt)). +- Spelling mistakes (using [`codespell`](https://github.com/codespell-project/codespell)). + + +## Templating requirements + +The Modelblocks initiative should maintain a template that respects this Convention with the goal of avoiding chores and reduce human errors. + +### Answers file + +Projects should retain the `.copier-answers.yml` file generated by the templater. +This file should **not** be modified manually to prevent issues during template updates. + +### Periodic updates + +The template should provide automated scheduled checks to identify if a new version of the template has been released. diff --git a/docs/developer/images/instant_timepoint.drawio.png b/docs/developer/images/instant_timepoint.drawio.png new file mode 100644 index 0000000..44d4287 Binary files /dev/null and b/docs/developer/images/instant_timepoint.drawio.png differ diff --git a/docs/developer/images/max_timepoint.drawio.png b/docs/developer/images/max_timepoint.drawio.png new file mode 100644 index 0000000..8c0a0c1 Binary files /dev/null and b/docs/developer/images/max_timepoint.drawio.png differ diff --git a/docs/developer/index.md b/docs/developer/index.md new file mode 100644 index 0000000..1c7559c --- /dev/null +++ b/docs/developer/index.md @@ -0,0 +1,28 @@ +# Development guidelines + +This section explains the rules to follow when developing a Modelblocks module in order to comply with our Convention. +If you are new to `Snakemake` workflows, we recommend familiarising yourself with the [`Snakemake` documentation](https://snakemake.readthedocs.io/en/stable/) first. + +??? info "Required reading" + + We assume you are familiar with the basics of [using Modelblocks modules][using-modelblocks] and have a good grasp of [`Snakemake`](https://snakemake.readthedocs.io/en/stable/) basics: + + - [Rules and `wildcards`](https://snakemake.readthedocs.io/en/stable/snakefiles/rules.html#snakefiles-and-rules) + - [Modules and `pathvars`](https://snakemake.readthedocs.io/en/stable/snakefiles/modularization.html#modularization) + + +
+ +- :fontawesome-solid-rocket:{ .lg .middle } __[Setting up](setup.md){ .card-link }__ + + How to install all the necessary tools to develop your own Modelblocks module. + +- :fontawesome-solid-handshake:{ .lg .middle } __[Convention](./convention.md){ .card-link }__ + + An in depth dive into the Modelblocks convention. + +- :fontawesome-solid-worm:{ .lg .middle } __[Best practices](./best.md){ .card-link }__ + + Our preferences for long-lived, successful modules. + +
diff --git a/docs/developer/setup.md b/docs/developer/setup.md new file mode 100644 index 0000000..66c9db5 --- /dev/null +++ b/docs/developer/setup.md @@ -0,0 +1,60 @@ +# Setting up + +Developing a Modelblocks modelblocks module requires careful handling of software dependencies, `Snakemake` requirements, and datasource locations. +This section details how a Modelblocks developer should handle each of these cases to ensure their module is reproducible in the long term. + +## Software environments: `pixi` + +The first step is ensuring you have an appropriate tool to manage your software environments. +We _require_ developers to use [`pixi`](https://pixi.prefix.dev/latest/) as their package management tool because it provides much needed stability to software projects. +In particular: + +- It automatically maintains a stable lockfile (`pixi.lock`). +This helps ensure that modules can be rerun using the _exact_ versions of installed packages, and avoids human errors when updating dependencies. +- It provides multi-platform support which helps with our aim to develop modules that can run on the most popular operating systems (Windows, MacOS, Linux). + +???+ info "Installing `pixi`" + + Follow the installation instructions on the [`pixi` documentation](https://pixi.prefix.dev/latest/). + + For unix-like systems, you can do: + + ```shell + curl -fsSL https://pixi.sh/install.sh | sh + ``` + +## Project templating: Modelblocks template + +The second step is to ensure that your module has little friction with other modules. +We _require_ developers to use our standardised [`Snakemake` project template](https://github.com/modelblocks-org/data-module-template), which has the following advantages: + +- It follows our [Convention][convention] in terms of file structure, interfacing, tests, and environment management. +- Provides pre-made continuous integration via [pre-commit.ci](https://pre-commit.ci/) and [GitHub actions](https://github.com/features/actions), tested in all major platforms. +- Enables developers to easily keep up with the [Convention][convention] via [`copier`'s update functionality](https://copier.readthedocs.io/en/stable/). +- Allows your module to be featured in the [Modelblocks website](https://www.modelblocks.org/). + + +??? info "Running the template" + + Up to date instructions are available in the [template's README](https://github.com/modelblocks-org/data-module-template#how-to-use-this-template). + + Generally: + + ```shell + pixi global install copier # (1)! + mkdir module_name & cd module_name # (2)! + copier copy https://github.com/modelblocks-org/data-module-template.git # (3)! + ``` + + 1. Install `copier` as a global tool in your machine via `pixi`. + 2. Create and open your project folder + 3. Start the templating process + + The templater will ask you a few questions, which will be used to pre-fill files in your project. + + ```html + >🎀 Please enter your module's human readable name. + module_hydropower_potential + >🎀 Please enter your module's human readable name. + Hydropower potential + ``` diff --git a/docs/index.md b/docs/index.md index 4766520..2e16100 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,16 +1,25 @@ # Home -Welcome to the [`modelblocks`](https://www.modelblocks.org/) documentation! -Our main purpose is enabling energy researchers and institutions to share, reuse and improve the data workflows used to construct Energy System Models in a decentralised way. -We aim to do this by providing an expanding collection of high-quality modular workflows used for peer-reviewed research, inspired by `snakemake`'s [workflow catalog](https://snakemake.github.io/snakemake-workflow-catalog/). +Welcome to the **Modelblocks** documentation! -We wish to turn very complex models that are hard to maintain and reuse into a range of digestible, well supported tools that get better and better over time! +**Modelblocks** is a collection of reusable, composable data modules for energy system modelling. +Each module is a self-contained `Snakemake` workflow that turns raw data into harmonised, model-ready datasets, and can be dropped into any larger workflow. +This documentation is meant to guide users and developers on how to follow our Convention. -![modules](./images/modular.png) +??? info "Looking for details on available modules?" -Learn about the full list of available [modules](./Modules/modules.md). + Please consult the official [Modelblocks website](https://www.modelblocks.org/) for a full list of **Core**{ .badge-core } and **Community**{ .badge-community } developed modules. -## For developers -If you want to start creating your own data modules, check out our [developer guidelines](./Developer_guidelines/getting_started.md). +
+ +- :fontawesome-solid-rocket:{ .lg .middle } __[Using Modelblocks](./user/index.md){ .card-link }__ + + Learn how to use existing Modelblocks modules in your research. + +- :fontawesome-solid-screwdriver-wrench:{ .lg .middle } __[Development guidelines](./developer/index.md){ .card-link }__ + + Learn about the Modelblocks Convention to create new Modelblocks modules and share your research with others. + +
diff --git a/docs/user/basics.md b/docs/user/basics.md new file mode 100644 index 0000000..54c8a68 --- /dev/null +++ b/docs/user/basics.md @@ -0,0 +1,178 @@ +# Basic concepts + +Here we explain, in broad strokes, how Modelblocks modules are structured and how to interact with them. +We only focus on aspects that regular users will interact with when using a module for their own research. + +??? info "Required reading" + + This section assumes users are familiar with [`Snakemake`](https://doi.org/10.12688/f1000research.29032.2 "MΓΆlder et al., 2021. Sustainable data analysis with Snakemake"). + We recommend reading the following sections in the `Snakemake` documentation before continuing: + + - [Rules and `wildcards`](https://snakemake.readthedocs.io/en/stable/snakefiles/rules.html#snakefiles-and-rules) + - [Modules and `pathvars`](https://snakemake.readthedocs.io/en/stable/snakefiles/modularization.html#modularization) + + +??? tip "Looking for more in-depth information on modules?" + + Please consult our [development guidelines][development-guidelines]. + +## General structure + +At their core, Modelblocks modules consist of a sequence of rules that download, filter and transform data. + +The behaviour of each rule is determined by the module’s internal code, and a user-specified configuration file which alters code behaviour. +Each module also defines how to interface with it through a standardised interface. The location of configuration and interface files is standard across all Modelblocks modules, and is defined by our [Convention][convention]. + +![simple module](./images/simple_module.drawio.png) + + +### Configuration + +Configuration values allow users to tweak module behaviour. +Modules will generally provide example configurations and recommended defaults in the `config/` directory. + +You should expect modules to validate the provided configuration against a schema (`config.schema.yaml`) during execution, with incorrect configurations raising errors. +The schema file itself is also a useful resource to understand a module's capabilities. + + +```bash +.module_name/ +β”œβ”€β”€ config/ +β”‚ β”œβ”€β”€ README.md # (1)! +β”‚ └── config.yaml # (2)! +└── workflow/ + └── internal/ + └── config.schema.yaml # (3)! +``` + +1. Configuration documentation. +2. Example configuration file. +3. Configuration schema file. + +### Interfacing + +The interface file (`INTERFACE.yaml`) defines the placement and naming of the files needed by the module. + +```shell +module_name/ +└── INTERFACE.yaml # (1)! +``` + +1. Always located at the top level of the module's repository. + +The interface file will always specify the version of our [Convention][convention] that the module complies with, multiple sets of `pathvars` that can re-wire the location of the files consumed / produced by the module, and a set of `wildcards` which can be used to process multiple files using the same module. + +In general, the interface file will define three different sets of `pathvars`: + +- `snakemake_defaults`: composed of logs, resources and results directories. +These are pre-defined by `Snakemake` +- `user_resources`: these are the "input" files that users must provide to the module before execution. +- `results`: the module "output" files that are relevant to users. + +??? example "Interface file example" + + Interface requirements will vary per module. + The following is a generic example of a module with one input and one output file. + + ```yaml + convention_version: v1.0.0 # (1)! + pathvars: + snakemake_defaults: # (2)! + logs: + default: "" + description: "location of rule log files." + resources: + default: "" + description: "location of module resource files." + results: + default: "" + description: "location of module results." + user_resources: # (3)! + shapes: + default: "/user/{shapes}/shapes.parquet" + description: "region-specific polygons to process." + results: # (4)! + proxy: + default: "/{shapes}/proxy.parquet" + description: "proxied statistics using the provided shapes." + wildcards: # (5)! + shapes: geo-political regions to process + ``` + + 1. [Convention][convention] version, based on this documentation. + 2. Default `pathvars` defined by `Snakemake`. + Used to re-wire the location of _all_ files in these directories. + 3. Notice that these reuse the `` pathvar! + 4. Notice that these reuse the `` pathvar! + 5. Available wildcards. + These are used in either `user_resources` or `results`. + +## Importing + +Modules can be directly imported by other workflows with minimal effort using the `module` command. + +At minimum, users must specify the module's GitHub repository and version tag under `snakefile`, and provide the necessary module configuration under `config`. + +```python +module module_example: + snakefile: + github( + "modelblocks-org/module_example", + path="workflow/Snakefile", + tag="v1.0.3" # (1)! + ) + config: config["example"] # (2)! + +use rule * from module_example as module_example_* # (3)! +``` + +1. The tag should be an official module release. +This ensures the module is not impacted by future updates, which may alter its behaviour or resource/configuration requirements. +2. We recommend storing module configuration under module-specific keys, or in separate files. +3. Adding a prefix to the module's rules avoids naming conflicts. + + +## File placement + +When imported, modules will also follow a convention on the default location of files they expect to consume and/or produce. + +```bash +.my_project/ +β”œβ”€β”€ logs/ # (1)! +β”œβ”€β”€ resources/ +β”‚ β”œβ”€β”€ automatic/ # (2)! +β”‚ └── user/ # (3)! +└── results/ # (4)! +``` + +1. Per-rule log files, useful for debugging. +2. Automatic resources are all the intermediary files created by module rules. +3. User resources are all the input files that a module needs before execution. +These might be optional in some cases. +4. Output files relevant to users. + + +### Rewiring files + +You will often want to modify the expected locations of module logs, resources, and results. +This can avoid file name conflicts, as snakemake does not allow multiple rules to produce the same file, and allows you easily run intermediate rules on module outputs before feeding their results into other modules. + +This can be easily handled by re-defining `pathvars` when importing modules. + +??? example "Rewiring module logs and results" + + ```python + module module_example: + snakefile: + github( + "modelblocks-org/module_example", + path="workflow/Snakefile", + tag="v1.0.3" + ) + config: config["example"] + pathvars: + logs="modules/example/logs/" + proxy="results/modules/example/proxies/{shapes}.parquet" # (1)! + ``` + + 1. Notice how the "shapes" `wildcard` was changed to be the filename instead of the directory name. diff --git a/docs/user/images/simple_module.drawio.png b/docs/user/images/simple_module.drawio.png new file mode 100644 index 0000000..ca2f7e1 Binary files /dev/null and b/docs/user/images/simple_module.drawio.png differ diff --git a/docs/user/images/toolset_simple.drawio.png b/docs/user/images/toolset_simple.drawio.png new file mode 100644 index 0000000..7083389 Binary files /dev/null and b/docs/user/images/toolset_simple.drawio.png differ diff --git a/docs/user/index.md b/docs/user/index.md new file mode 100644 index 0000000..236cbd3 --- /dev/null +++ b/docs/user/index.md @@ -0,0 +1,28 @@ +# Using Modelblocks + +This section explains the necessary steps to import, reconfigure and execute a Modelblocks module. + +There are two types of Modelblocks modules: + +- **Core**{ .badge-core } modules are maintained by the Modelblocks organisation. +- **Community**{ .badge-community } modules comply with our [Convention][convention], but may be hosted anywhere. + +This documentation applies to both. +An up-to-date list of modules is kept on the [Modelblocks website](https://www.modelblocks.org). + + +
+ +- :fontawesome-solid-rocket:{ .lg .middle } __[Setting up](setup.md){ .card-link }__ + + How to install all the necessary tools to be ready to use Modelblocks. + +- :fontawesome-solid-cubes:{ .lg .middle } __[Basic concepts](./basics.md){ .card-link }__ + + General concepts behind Modelblocks and how to use modular workflows. + + + +
diff --git a/docs/user/setup.md b/docs/user/setup.md new file mode 100644 index 0000000..7d89bd8 --- /dev/null +++ b/docs/user/setup.md @@ -0,0 +1,60 @@ +# Setting up + +Modelblocks relies on a core set of tools to ensure modules can be run on most platforms. +This section details which these tools are, why they are needed, and how to install them. + +## Software environments: `pixi` or `miniconda` + +The first step is ensuring you have an appropriate tool to manage your software environments. +We highly recommend `pixi` because it is a fast and modern tool. +Alternatively, you can use `miniconda`. + +Modelblocks modules rely on [`Snakemake`](https://snakemake.readthedocs.io/en/stable/index.html) and `conda` during execution. +Below are examples of how to install both tools using either `pixi` or `miniconda`. + +???+ info "Setting up a project with `pixi`" + + Follow the installation instructions on the [`pixi` documentation](https://pixi.prefix.dev/latest/). + + Once installed: + + ```shell + # Create and open your project directory + pixi init my_project & cd my_project + # Install snakemake at the project level + pixi workspace channel add conda-forge bioconda + pixi add snakemake-minimal conda + ``` + + +??? info "Setting up a project with `conda`" + + Follow the installation instructions on the [`conda` documentation](https://docs.conda.io/en/latest/). + We recommend `miniconda` for a lightweight, minimal installation. + + Once installed: + + ```shell + # Create and open your project directory + mkdir ./my_project & cd ./my_project + # Create a conda environment for your project + conda create -n my_project -c conda-forge -c bioconda --strict-channel-priority snakemake-minimal + conda activate my_project + ``` + +## Using modelblocks: `Snakemake` + +You can import Modelblocks modules into your own `Snakemake` workflow using the [`module`](https://snakemake.readthedocs.io/en/stable/snakefiles/modularization.html#modules) command. +No other manual tool installation is required. + +??? info "Creating a new `Snakemake` project?" + + To save time, you can setup your `Snakemake` project following a template. + These offer standardised structures, which helps in maintainability. + + If you are using `pixi`, we recommend using [our own project template](https://github.com/modelblocks-org/data-module-template). + If you are using `miniconda`, you can instead use the [official `Snakemake` template](https://github.com/snakemake-workflows/snakemake-workflow-template). + Instructions for either template are available in their respective repositories. + +To start processing data with the module, you will need to interface with by configuring it, then providing input files (if needed), and requesting results. +We explain how to do this in [basic concepts][basic-concepts]. diff --git a/mkdocs.yaml b/mkdocs.yaml index 72341d7..24229fc 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -1,75 +1,66 @@ # yaml-language-server: $schema=https://squidfunk.github.io/mkdocs-material/schema.json -site_name: modelblocks +site_name: Modelblocks documentation site_url: https://modelblocks.readthedocs.io/ repo_name: docs repo_url: https://github.com/modelblocks-org/docs/ edit_uri: edit/main/docs/ +extra_css: + - css/extra.css theme: + font: + text: Lato + code: Fira Code name: material features: - - navigation.footer - - navigation.instant + - navigation.indexes + - navigation.top - navigation.tabs - navigation.tabs.sticky - - navigation.indexes + - content.code.copy + - content.code.annotate + - content.tooltips - search.suggest - search.highlight + - search.share - toc.follow - palette: - # Palette toggle for automatic mode - - media: "(prefers-color-scheme)" - toggle: - icon: material/brightness-auto - name: Switch to light mode - primary: teal - accent: blue grey - # Palette toggle for light mode - - media: "(prefers-color-scheme: light)" - scheme: default - toggle: - icon: material/weather-sunny - name: Switch to dark mode - primary: teal - accent: blue grey - # Palette toggle for dark mode - - media: "(prefers-color-scheme: dark)" - scheme: slate - toggle: - icon: material/weather-night - name: Switch to system preference - primary: teal - accent: blue grey markdown_extensions: - admonition - - pymdownx.tasklist: - custom_checkbox: true + - attr_list + - md_in_html + - def_list + - tables - pymdownx.arithmatex: generic: true + - pymdownx.details - pymdownx.betterem: smart_enable: all - - pymdownx.details - pymdownx.emoji: emoji_index: !!python/name:material.extensions.emoji.twemoji emoji_generator: !!python/name:material.extensions.emoji.to_svg - pymdownx.highlight: anchor_linenums: true + line_spans: __span + pygments_lang_class: true + - pymdownx.inlinehilite - pymdownx.snippets: - check_paths: true - restrict_base_path: true + dedent_subsections: true - pymdownx.superfences: - custom_fences: - - name: mermaid - class: mermaid - format: !!python/name:mermaid2.fence_mermaid_custom + preserve_tabs: true + - pymdownx.tabbed: + alternate_style: true + - pymdownx.tasklist: + clickable_checkbox: true - toc: - anchorlink: true + anchorlink: false + permalink: "ΒΆ" + toc_depth: 4 plugins: + - autorefs - git-committers: enabled: true repository: modelblocks-org/docs branch: main - - search - mkdocstrings: default_handler: python handlers: @@ -78,30 +69,37 @@ plugins: show_bases: true filters: - "!^_" - heading_level: 2 + heading_level: 1 show_root_heading: true merge_init_into_class: true show_if_no_docstring: true signature_crossrefs: true - show_root_toc_entry: true + show_root_toc_entry: false show_signature_annotations: true inherited_members: false show_labels: false paths: [src] inventories: - https://docs.python.org/3/objects.inv - - https://pandas.pydata.org/docs/objects.inv - - https://docs.xarray.dev/en/stable/objects.inv - + - enumerate-headings: + include: + - developer/convention.md + start_level: 2 + increment_across_pages: false + toc_depth: 4 + - search nav: - Home: index.md - Background: - - Background/motivation.md - - Background/our_framework.md - - Modules: Modules/modules.md - - Developer guidelines: - - Developer_guidelines/getting_started.md - - Developer_guidelines/requirements.md - - Developer_guidelines/templates.md + - background/index.md + - Using Modelblocks: + - user/index.md + - user/setup.md + - user/basics.md + - Development guidelines: + - developer/index.md + - developer/setup.md + - developer/convention.md + - developer/best.md -copyright: Copyright © since 2025 modelblocks contributors (Apache 2.0 licensed) +copyright: Copyright © since 2025 Modelblocks contributors (Apache 2.0 licensed) diff --git a/pixi.lock b/pixi.lock index d58870f..5d06fcd 100644 --- a/pixi.lock +++ b/pixi.lock @@ -1,25 +1,49 @@ -version: 6 +version: 7 +platforms: +- name: linux-64 +- name: osx-arm64 +- name: win-64 environments: default: channels: - url: https://conda.anaconda.org/conda-forge/ - options: - pypi-prerelease-mode: if-necessary-or-explicit + indexes: + - https://pypi.org/simple packages: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/watchdog-6.0.0-py314h9e666f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backrefs-6.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.2.1-pyh707e725_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/editorconfig-0.17.1-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda @@ -30,25 +54,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsbeautifier-1.15.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-autorefs-1.4.4-pyhd8ed1ab_0.conda @@ -56,11 +66,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-git-committers-plugin-2-2.5.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.7.6-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-mermaid2-plugin-1.2.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocstrings-1.0.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocstrings-python-2.0.2-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda @@ -70,40 +77,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.21.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/watchdog-6.0.0-py314h9e666f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - pypi: https://files.pythonhosted.org/packages/08/6c/2b9fe10a9e2a27e72f88291f6f6957db09215d6782a758785cf1ce40ba6f/mkdocs_enumerate_headings_plugin-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5e/f5/0c41cb68dcae6b7de4fac4188a3a9589e21fb31df21ea3a2e888db95e6c9/soupsieve-2.8.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/c6/92fcd42f1ba33e1184263f25bfabf3d27c383410470f169e4b8163bf9c17/beautifulsoup4-4.15.0-py3-none-any.whl osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backrefs-6.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.2.1-pyh707e725_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/editorconfig-0.17.1-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda @@ -114,21 +111,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsbeautifier-1.15.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.5-hf6b4638_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py314h6e9b3f0_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-autorefs-1.4.4-pyhd8ed1ab_0.conda @@ -136,11 +123,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-git-committers-plugin-2-2.5.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.7.6-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-mermaid2-plugin-1.2.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocstrings-1.0.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocstrings-python-2.0.2-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda @@ -150,40 +134,50 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.21.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.3-h4c637c5_101_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.5-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py314h6e9b3f0_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.3-h4c637c5_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/watchdog-6.0.0-py314ha14b1ff_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda + - pypi: https://files.pythonhosted.org/packages/08/6c/2b9fe10a9e2a27e72f88291f6f6957db09215d6782a758785cf1ce40ba6f/mkdocs_enumerate_headings_plugin-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5e/f5/0c41cb68dcae6b7de4fac4188a3a9589e21fb31df21ea3a2e888db95e6c9/soupsieve-2.8.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/c6/92fcd42f1ba33e1184263f25bfabf3d27c383410470f169e4b8163bf9c17/beautifulsoup4-4.15.0-py3-none-any.whl win-64: - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backrefs-6.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.2.1-pyh7428d3b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/editorconfig-0.17.1-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda @@ -198,15 +192,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsbeautifier-1.15.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.5-hac47afa_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-autorefs-1.4.4-pyhd8ed1ab_0.conda @@ -214,10 +200,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-git-committers-plugin-2-2.5.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.7.6-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-mermaid2-plugin-1.2.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocstrings-1.0.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocstrings-python-2.0.2-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda @@ -227,31 +211,42 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.21.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.3-h4b44e0e_101_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py314h2359020_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.5-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.3-h4b44e0e_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py314h2359020_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda - conda: https://conda.anaconda.org/conda-forge/win-64/watchdog-6.0.0-py314hb821551_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda + - pypi: https://files.pythonhosted.org/packages/08/6c/2b9fe10a9e2a27e72f88291f6f6957db09215d6782a758785cf1ce40ba6f/mkdocs_enumerate_headings_plugin-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5e/f5/0c41cb68dcae6b7de4fac4188a3a9589e21fb31df21ea3a2e888db95e6c9/soupsieve-2.8.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/c6/92fcd42f1ba33e1184263f25bfabf3d27c383410470f169e4b8163bf9c17/beautifulsoup4-4.15.0-py3-none-any.whl packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda build_number: 20 @@ -264,49 +259,9 @@ packages: - openmp_impl <0.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 28948 timestamp: 1770939786096 -- conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - sha256: a14a9ad02101aab25570543a59c5193043b73dc311a25650134ed9e6cb691770 - md5: f1976ce927373500cc19d3c0b2c85177 - depends: - - python >=3.10 - - python - constrains: - - pytz >=2015.7 - license: BSD-3-Clause - license_family: BSD - size: 7684321 - timestamp: 1772555330347 -- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda - noarch: generic - sha256: c31ab719d256bc6f89926131e88ecd0f0c5d003fe8481852c6424f4ec6c7eb29 - md5: a2ac7763a9ac75055b68f325d3255265 - depends: - - python >=3.14 - license: BSD-3-Clause AND MIT AND EPL-2.0 - size: 7514 - timestamp: 1767044983590 -- conda: https://conda.anaconda.org/conda-forge/noarch/backrefs-6.2-pyhd8ed1ab_0.conda - sha256: ea22e1ae38622c7872a41708a248ef0b1917ca3d91a0672995a0c8cbfc85c04e - md5: d78c9304d873002ca50e65c33ed6ff0e - depends: - - python >=3.10 - license: MIT - license_family: MIT - size: 144933 - timestamp: 1771286293210 -- conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - sha256: bf1e71c3c0a5b024e44ff928225a0874fc3c3356ec1a0b6fe719108e6d1288f6 - md5: 5267bef8efea4127aacd1f4e1f149b6e - depends: - - python >=3.10 - - soupsieve >=1.2 - - typing-extensions - license: MIT - license_family: MIT - size: 90399 - timestamp: 1764520638652 - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda sha256: 3ad3500bff54a781c29f16ce1b288b36606e2189d0b0ef2f67036554f47f12b0 md5: 8910d2c46f7e7b519129f486e0fe927a @@ -320,38 +275,10 @@ packages: - libbrotlicommon 1.2.0 hb03c661_1 license: MIT license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping size: 367376 timestamp: 1764017265553 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda - sha256: 5c2e471fd262fcc3c5a9d5ea4dae5917b885e0e9b02763dbd0f0d9635ed4cb99 - md5: f9501812fe7c66b6548c7fcaa1c1f252 - depends: - - __osx >=11.0 - - libcxx >=19 - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 - constrains: - - libbrotlicommon 1.2.0 hc919400_1 - license: MIT - license_family: MIT - size: 359854 - timestamp: 1764018178608 -- conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda - sha256: 6854ee7675135c57c73a04849c29cbebc2fb6a3a3bfee1f308e64bf23074719b - md5: 1302b74b93c44791403cbeee6a0f62a3 - depends: - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - constrains: - - libbrotlicommon 1.2.0 hfd05255_1 - license: MIT - license_family: MIT - size: 335782 - timestamp: 1764018443683 - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6 md5: d2ffd7602c02f2b316fd921d39876885 @@ -360,532 +287,574 @@ packages: - libgcc >=14 license: bzip2-1.0.6 license_family: BSD + purls: [] size: 260182 timestamp: 1771350215188 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda - sha256: 540fe54be35fac0c17feefbdc3e29725cce05d7367ffedfaaa1bdda234b019df - md5: 620b85a3f45526a8bc4d23fd78fc22f0 - depends: - - __osx >=11.0 - license: bzip2-1.0.6 - license_family: BSD - size: 124834 - timestamp: 1771350416561 -- conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - sha256: 76dfb71df5e8d1c4eded2dbb5ba15bb8fb2e2b0fe42d94145d5eed4c75c35902 - md5: 4cb8e6b48f67de0b018719cdf1136306 - depends: - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - license: bzip2-1.0.6 - license_family: BSD - size: 56115 - timestamp: 1771350256444 -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda - sha256: 37950019c59b99585cee5d30dbc2cc9696ed4e11f5742606a4db1621ed8f94d6 - md5: f001e6e220355b7f87403a4d0e5bf1ca - depends: - - __win - license: ISC - size: 147734 - timestamp: 1772006322223 -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - sha256: 67cc7101b36421c5913a1687ef1b99f85b5d6868da3abbf6ec1a4181e79782fc - md5: 4492fd26db29495f0ba23f146cd5638d +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda + sha256: fbf86c4a59c2ed05bbffb2ba25c7ed94f6185ec30ecb691615d42342baa1a16a + md5: c80d8a3b84358cb967fa81e7075fbc8a depends: - - __unix - license: ISC - size: 147413 - timestamp: 1772006283803 -- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda - sha256: a6b118fd1ed6099dc4fc03f9c492b88882a780fadaef4ed4f93dc70757713656 - md5: 765c4d97e877cdbbb88ff33152b86125 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + size: 12723451 + timestamp: 1773822285671 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda + sha256: 3d584956604909ff5df353767f3a2a2f60e07d070b328d109f30ac40cd62df6c + md5: 18335a698559cdbcd86150a48bf54ba6 depends: - - python >=3.10 - license: ISC - size: 151445 - timestamp: 1772001170301 -- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda - sha256: d86dfd428b2e3c364fa90e07437c8405d635aa4ef54b25ab51d9c712be4112a5 - md5: 49ee13eb9b8f44d63879c69b8a40a74b + - __glibc >=2.17,<3.0.a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - binutils_impl_linux-64 2.45.1 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 728002 + timestamp: 1774197446916 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda + sha256: e8c2b57f6aacabdf2f1b0924bd4831ce5071ba080baa4a9e8c0d720588b6794c + md5: 49f570f3bc4c874a06ea69b7225753af depends: - - python >=3.10 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - expat 2.7.5.* license: MIT license_family: MIT - size: 58510 - timestamp: 1773660086450 -- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.2.1-pyh707e725_0.conda - sha256: 8aee789c82d8fdd997840c952a586db63c6890b00e88c4fb6e80a38edd5f51c0 - md5: 94b550b8d3a614dbd326af798c7dfb40 + purls: [] + size: 76624 + timestamp: 1774719175983 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 + md5: a360c33a5abe61c07959e449fa1453eb depends: - - __unix - - python >=3.10 - license: BSD-3-Clause - license_family: BSD - size: 87749 - timestamp: 1747811451319 -- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.2.1-pyh7428d3b_0.conda - sha256: 20c2d8ea3d800485245b586a28985cba281dd6761113a49d7576f6db92a0a891 - md5: 3a59475037bc09da916e4062c5cad771 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 58592 + timestamp: 1769456073053 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda + sha256: faf7d2017b4d718951e3a59d081eb09759152f93038479b768e3d612688f83f5 + md5: 0aa00f03f9e39fb9876085dee11a85d4 depends: - - __win - - colorama - - python >=3.10 - license: BSD-3-Clause - license_family: BSD - size: 88117 - timestamp: 1747811467132 -- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 - md5: 962b9857ee8e7018c22f2776ffa0b2d7 + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==15.2.0=*_18 + - libgomp 15.2.0 he0feb66_18 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1041788 + timestamp: 1771378212382 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda + sha256: 21337ab58e5e0649d869ab168d4e609b033509de22521de1bfed0c031bfc5110 + md5: 239c5e9546c38a1e884d69effcf4c882 depends: - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - size: 27011 - timestamp: 1733218222191 -- conda: https://conda.anaconda.org/conda-forge/noarch/editorconfig-0.17.1-pyhe01879c_1.conda - sha256: 8a09b54f6fe1b7a8d87c8da5426bf295aeb0cdd6e509fa3af02d3eb5675da87a - md5: 946b7c3d528a3d231874322efdc25ed6 + - __glibc >=2.17,<3.0.a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 603262 + timestamp: 1771378117851 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + sha256: 755c55ebab181d678c12e49cced893598f2bab22d582fbbf4d8b83c18be207eb + md5: c7c83eecbb72d88b940c249af56c8b17 depends: - - python >=3.9 - - python - license: BSD-2-Clause AND PSF-2.0 - size: 23884 - timestamp: 1752059551405 -- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - sha256: ee6cf346d017d954255bbcbdb424cddea4d14e4ed7e9813e429db1d795d01144 - md5: 8e662bd460bda79b1ea39194e3c4c9ab + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - xz 5.8.2.* + license: 0BSD + purls: [] + size: 113207 + timestamp: 1768752626120 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda + sha256: fe171ed5cf5959993d43ff72de7596e8ac2853e9021dec0344e583734f1e0843 + md5: 2c21e66f50753a083cbe6b80f38268fa depends: - - python >=3.10 - - typing_extensions >=4.6.0 - license: MIT and PSF-2.0 - size: 21333 - timestamp: 1763918099466 -- conda: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda - sha256: 40fdf5a9d5cc7a3503cd0c33e1b90b1e6eab251aaaa74e6b965417d089809a15 - md5: 93f742fe078a7b34c29a182958d4d765 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 92400 + timestamp: 1769482286018 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda + sha256: d716847b7deca293d2e49ed1c8ab9e4b9e04b9d780aea49a97c26925b28a7993 + md5: fd893f6a3002a635b5e50ceb9dd2c0f4 depends: - - python >=3.9 - - python-dateutil >=2.8.1 - license: Apache-2.0 - license_family: APACHE - size: 16538 - timestamp: 1734344477841 -- conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda - sha256: dbbec21a369872c8ebe23cb9a3b9d63638479ee30face165aa0fccc96e93eec3 - md5: 7c14f3706e099f8fcd47af2d494616cc + - __glibc >=2.17,<3.0.a0 + - icu >=78.2,<79.0a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: blessing + purls: [] + size: 951405 + timestamp: 1772818874251 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda + sha256: 78668020064fdaa27e9ab65cd2997e2c837b564ab26ce3bf0e58a2ce1a525c6e + md5: 1b08cd684f34175e4514474793d44bcb depends: - - python >=3.9 - - smmap >=3.0.1,<6 - license: BSD-3-Clause - license_family: BSD - size: 53136 - timestamp: 1735887290843 -- conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.46-pyhd8ed1ab_0.conda - sha256: 8043bcb4f59d17467c6c2f8259e7ded18775de5d62a8375a27718554d9440641 - md5: 74c0cfdd5359cd2a1f178a4c3d0bd3a5 + - __glibc >=2.17,<3.0.a0 + - libgcc 15.2.0 he0feb66_18 + constrains: + - libstdcxx-ng ==15.2.0=*_18 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 5852330 + timestamp: 1771378262446 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + sha256: 1a7539cfa7df00714e8943e18de0b06cceef6778e420a5ee3a2a145773758aee + md5: db409b7c1720428638e7c0d509d3e1b5 depends: - - gitdb >=4.0.1,<5 - - python >=3.10 - - typing_extensions >=3.10.0.2 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 license: BSD-3-Clause license_family: BSD - size: 158433 - timestamp: 1767358832407 -- conda: https://conda.anaconda.org/conda-forge/noarch/griffe-2.0.2-pyhcf101f3_0.conda - sha256: 14cc12f55b19ddf164fb5df96dd156eaa6a8ab60b8ded337deda43fdcf70c369 - md5: 48dc0933013b4d09bd14373bbca33a44 - depends: - - python >=3.10 - - griffelib >=2.0.2,<2.0.3.0a0 - - griffecli >=2.0.2,<2.0.3.0a0 - - python - license: ISC - size: 17094 - timestamp: 1774621473366 -- conda: https://conda.anaconda.org/conda-forge/noarch/griffecli-2.0.2-pyhcf101f3_0.conda - sha256: 4d54de99b3cf5589bf12e761e704aa00c54e5d567e934871a2d794e0772ab0b3 - md5: df88cbe27def353593a53b8b47adf780 - depends: - - python >=3.10 - - colorama >=0.4 - - griffelib >=2.0.2,<2.0.3.0a0 - - python - license: ISC - size: 19703 - timestamp: 1774621473366 -- conda: https://conda.anaconda.org/conda-forge/noarch/griffelib-2.0.2-pyhcf101f3_0.conda - sha256: f4d0fe5835a6d1e3e828320a1df2117c96a769c788429d78a75ddcafda3cec67 - md5: f7b9e67b788f78c6facf79b3e12b1e13 - depends: - - python >=3.10 - - python - license: ISC - size: 117111 - timestamp: 1774621473366 -- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3 - md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 - depends: - - python >=3.10 - - hyperframe >=6.1,<7 - - hpack >=4.1,<5 - - python - license: MIT - license_family: MIT - size: 95967 - timestamp: 1756364871835 -- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba - md5: 0a802cb9888dd14eeefc611f05c40b6e - depends: - - python >=3.9 - license: MIT - license_family: MIT - size: 30731 - timestamp: 1737618390337 -- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 - md5: 8e6923fc12f1fe8f8c4e5c9f343256ac + purls: [] + size: 40311 + timestamp: 1766271528534 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + sha256: 55044c403570f0dc26e6364de4dc5368e5f3fc7ff103e867c487e2b5ab2bcda9 + md5: d87ff7921124eccd67248aa483c23fec depends: - - python >=3.9 - license: MIT - license_family: MIT - size: 17397 - timestamp: 1737618427549 -- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - sha256: fbf86c4a59c2ed05bbffb2ba25c7ed94f6185ec30ecb691615d42342baa1a16a - md5: c80d8a3b84358cb967fa81e7075fbc8a + - __glibc >=2.17,<3.0.a0 + constrains: + - zlib 1.3.2 *_2 + license: Zlib + license_family: Other + purls: [] + size: 63629 + timestamp: 1774072609062 +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda + sha256: c279be85b59a62d5c52f5dd9a4cd43ebd08933809a8416c22c3131595607d4cf + md5: 9a17c4307d23318476d7fbf0fedc0cde depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - libstdcxx >=14 - license: MIT - license_family: MIT - size: 12723451 - timestamp: 1773822285671 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - sha256: 3a7907a17e9937d3a46dfd41cffaf815abad59a569440d1e25177c15fd0684e5 - md5: f1182c91c0de31a7abd40cedf6a5ebef - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - size: 12361647 - timestamp: 1773822915649 -- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - sha256: ae89d0299ada2a3162c2614a9d26557a92aa6a77120ce142f8e0109bbf0342b0 - md5: 53abe63df7e10a6ba605dc5f9f961d36 - depends: - - python >=3.10 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + constrains: + - jinja2 >=3.0.0 license: BSD-3-Clause license_family: BSD - size: 50721 - timestamp: 1760286526795 -- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - sha256: 82ab2a0d91ca1e7e63ab6a4939356667ef683905dea631bc2121aa534d347b16 - md5: 080594bf4493e6bae2607e65390c520a + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 27424 + timestamp: 1772445227915 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 depends: - - python >=3.10 - - zipp >=3.20 - - python - license: Apache-2.0 - license_family: APACHE - size: 34387 - timestamp: 1773931568510 -- conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - sha256: e1a9e3b1c8fe62dc3932a616c284b5d8cbe3124bbfbedcf4ce5c828cb166ee19 - md5: 9614359868482abba1bd15ce465e3c42 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: X11 AND BSD-3-Clause + purls: [] + size: 891641 + timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + sha256: 44c877f8af015332a5d12f5ff0fb20ca32f896526a7d0cdb30c769df1144fb5c + md5: f61eb8cd60ff9057122a3d338b99c00f depends: - - python >=3.10 - license: MIT - license_family: MIT - size: 13387 - timestamp: 1760831448842 -- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - sha256: fc9ca7348a4f25fed2079f2153ecdcf5f9cf2a0bc36c4172420ca09e1849df7b - md5: 04558c96691bed63104678757beb4f8d + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3164551 + timestamp: 1769555830639 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda + build_number: 101 + sha256: cb0628c5f1732f889f53a877484da98f5a0e0f47326622671396fb4f2b0cd6bd + md5: c014ad06e60441661737121d3eae8a60 depends: - - markupsafe >=2.0 - - python >=3.10 - - python - license: BSD-3-Clause - license_family: BSD - size: 120685 - timestamp: 1764517220861 -- conda: https://conda.anaconda.org/conda-forge/noarch/jsbeautifier-1.15.4-pyhd8ed1ab_0.conda - sha256: a0b319d71492e2b0b78307e0575b4c5a43a10e0a59da36d5627e5447335bedce - md5: 60c0e0783e98da236b4e0f55242f10c7 + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.7.3,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - liblzma >=5.8.2,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.51.2,<4.0a0 + - libuuid >=2.41.3,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.5,<4.0a0 + - python_abi 3.14.* *_cp314 + - readline >=8.3,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - zstd >=1.5.7,<1.6.0a0 + license: Python-2.0 + purls: [] + size: 36702440 + timestamp: 1770675584356 + python_site_packages_path: lib/python3.14/site-packages +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda + sha256: b318fb070c7a1f89980ef124b80a0b5ccf3928143708a85e0053cde0169c699d + md5: 2035f68f96be30dc60a5dfd7452c7941 depends: - - editorconfig >=0.12.2 - - python >=3.9 - - six >=1.13.0 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - yaml >=0.2.5,<0.3.0a0 license: MIT license_family: MIT - size: 74352 - timestamp: 1743602210010 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda - sha256: 3d584956604909ff5df353767f3a2a2f60e07d070b328d109f30ac40cd62df6c - md5: 18335a698559cdbcd86150a48bf54ba6 + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 202391 + timestamp: 1770223462836 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 + md5: d7d95fc8287ea7bf33e0e7116d2b95ec depends: - __glibc >=2.17,<3.0.a0 - - zstd >=1.5.7,<1.6.0a0 - constrains: - - binutils_impl_linux-64 2.45.1 + - libgcc >=14 + - ncurses >=6.5,<7.0a0 license: GPL-3.0-only license_family: GPL - size: 728002 - timestamp: 1774197446916 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda - sha256: d1402087c8792461bfc081629e8aa97e6e577a31ae0b84e6b9cc144a18f48067 - md5: 4280e0a7fd613b271e022e60dea0138c - depends: - - __osx >=11.0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 568094 - timestamp: 1774439202359 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda - sha256: e8c2b57f6aacabdf2f1b0924bd4831ce5071ba080baa4a9e8c0d720588b6794c - md5: 49f570f3bc4c874a06ea69b7225753af + purls: [] + size: 345073 + timestamp: 1765813471974 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda + sha256: cafeec44494f842ffeca27e9c8b0c27ed714f93ac77ddadc6aaf726b5554ebac + md5: cffd3bdd58090148f4cfcd831f4b26ab depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 constrains: - - expat 2.7.5.* - license: MIT - license_family: MIT - size: 76624 - timestamp: 1774719175983 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.5-hf6b4638_0.conda - sha256: 06780dec91dd25770c8cf01e158e1062fbf7c576b1406427475ce69a8af75b7e - md5: a32123f93e168eaa4080d87b0fb5da8a + - xorg-libx11 >=1.8.12,<2.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3301196 + timestamp: 1769460227866 +- conda: https://conda.anaconda.org/conda-forge/linux-64/watchdog-6.0.0-py314h9e666f3_3.conda + sha256: 19605181aa56af8aeef977ec99614194420c96e929eaad2c1d858e5fcb16414c + md5: d0003e6427d81d247aa5ef84ba814d47 + depends: + - python + - pyyaml >=3.10 + - python_abi 3.14.* *_cp314 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/watchdog?source=hash-mapping + size: 162474 + timestamp: 1772608179138 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + sha256: 6d9ea2f731e284e9316d95fa61869fe7bbba33df7929f82693c121022810f4ad + md5: a77f85f77be52ff59391544bfe73390a depends: - - __osx >=11.0 - constrains: - - expat 2.7.5.* + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 license: MIT license_family: MIT - size: 68192 - timestamp: 1774719211725 -- conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.5-hac47afa_0.conda - sha256: 6850c3a4d5dc215b86f58518cfb8752998533d6569b08da8df1da72e7c68e571 - md5: bfb43f52f13b7c56e7677aa7a8efdf0c + purls: [] + size: 85189 + timestamp: 1753484064210 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 + md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 depends: - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 + - __glibc >=2.17,<3.0.a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 601375 + timestamp: 1764777111296 +- conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda + sha256: a14a9ad02101aab25570543a59c5193043b73dc311a25650134ed9e6cb691770 + md5: f1976ce927373500cc19d3c0b2c85177 + depends: + - python >=3.10 + - python constrains: - - expat 2.7.5.* - license: MIT - license_family: MIT - size: 70609 - timestamp: 1774719377850 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 - md5: a360c33a5abe61c07959e449fa1453eb + - pytz >=2015.7 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/babel?source=hash-mapping + size: 7684321 + timestamp: 1772555330347 +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda + noarch: generic + sha256: c31ab719d256bc6f89926131e88ecd0f0c5d003fe8481852c6424f4ec6c7eb29 + md5: a2ac7763a9ac75055b68f325d3255265 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: MIT - license_family: MIT - size: 58592 - timestamp: 1769456073053 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - sha256: 6686a26466a527585e6a75cc2a242bf4a3d97d6d6c86424a441677917f28bec7 - md5: 43c04d9cb46ef176bb2a4c77e324d599 + - python >=3.14 + license: BSD-3-Clause AND MIT AND EPL-2.0 + purls: [] + size: 7514 + timestamp: 1767044983590 +- conda: https://conda.anaconda.org/conda-forge/noarch/backrefs-6.2-pyhd8ed1ab_0.conda + sha256: ea22e1ae38622c7872a41708a248ef0b1917ca3d91a0672995a0c8cbfc85c04e + md5: d78c9304d873002ca50e65c33ed6ff0e depends: - - __osx >=11.0 + - python >=3.10 license: MIT license_family: MIT - size: 40979 - timestamp: 1769456747661 -- conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - sha256: 59d01f2dfa8b77491b5888a5ab88ff4e1574c9359f7e229da254cdfe27ddc190 - md5: 720b39f5ec0610457b725eb3f396219a + purls: + - pkg:pypi/backrefs?source=hash-mapping + size: 144933 + timestamp: 1771286293210 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + sha256: 37950019c59b99585cee5d30dbc2cc9696ed4e11f5742606a4db1621ed8f94d6 + md5: f001e6e220355b7f87403a4d0e5bf1ca depends: - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 + - __win + license: ISC + purls: [] + size: 147734 + timestamp: 1772006322223 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + sha256: 67cc7101b36421c5913a1687ef1b99f85b5d6868da3abbf6ec1a4181e79782fc + md5: 4492fd26db29495f0ba23f146cd5638d + depends: + - __unix + license: ISC + purls: [] + size: 147413 + timestamp: 1772006283803 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda + sha256: a6b118fd1ed6099dc4fc03f9c492b88882a780fadaef4ed4f93dc70757713656 + md5: 765c4d97e877cdbbb88ff33152b86125 + depends: + - python >=3.10 + license: ISC + purls: + - pkg:pypi/certifi?source=hash-mapping + size: 151445 + timestamp: 1772001170301 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda + sha256: d86dfd428b2e3c364fa90e07437c8405d635aa4ef54b25ab51d9c712be4112a5 + md5: 49ee13eb9b8f44d63879c69b8a40a74b + depends: + - python >=3.10 license: MIT license_family: MIT - size: 45831 - timestamp: 1769456418774 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - sha256: faf7d2017b4d718951e3a59d081eb09759152f93038479b768e3d612688f83f5 - md5: 0aa00f03f9e39fb9876085dee11a85d4 + purls: + - pkg:pypi/charset-normalizer?source=hash-mapping + size: 58510 + timestamp: 1773660086450 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.2.1-pyh707e725_0.conda + sha256: 8aee789c82d8fdd997840c952a586db63c6890b00e88c4fb6e80a38edd5f51c0 + md5: 94b550b8d3a614dbd326af798c7dfb40 depends: - - __glibc >=2.17,<3.0.a0 - - _openmp_mutex >=4.5 - constrains: - - libgcc-ng ==15.2.0=*_18 - - libgomp 15.2.0 he0feb66_18 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 1041788 - timestamp: 1771378212382 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda - sha256: 21337ab58e5e0649d869ab168d4e609b033509de22521de1bfed0c031bfc5110 - md5: 239c5e9546c38a1e884d69effcf4c882 + - __unix + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/click?source=hash-mapping + size: 87749 + timestamp: 1747811451319 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.2.1-pyh7428d3b_0.conda + sha256: 20c2d8ea3d800485245b586a28985cba281dd6761113a49d7576f6db92a0a891 + md5: 3a59475037bc09da916e4062c5cad771 depends: - - __glibc >=2.17,<3.0.a0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 603262 - timestamp: 1771378117851 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda - sha256: 755c55ebab181d678c12e49cced893598f2bab22d582fbbf4d8b83c18be207eb - md5: c7c83eecbb72d88b940c249af56c8b17 + - __win + - colorama + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/click?source=hash-mapping + size: 88117 + timestamp: 1747811467132 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - constrains: - - xz 5.8.2.* - license: 0BSD - size: 113207 - timestamp: 1768752626120 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - sha256: 7bfc7ffb2d6a9629357a70d4eadeadb6f88fa26ebc28f606b1c1e5e5ed99dc7e - md5: 009f0d956d7bfb00de86901d16e486c7 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/colorama?source=hash-mapping + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + sha256: ee6cf346d017d954255bbcbdb424cddea4d14e4ed7e9813e429db1d795d01144 + md5: 8e662bd460bda79b1ea39194e3c4c9ab depends: - - __osx >=11.0 - constrains: - - xz 5.8.2.* - license: 0BSD - size: 92242 - timestamp: 1768752982486 -- conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda - sha256: f25bf293f550c8ed2e0c7145eb404324611cfccff37660869d97abf526eb957c - md5: ba0bfd4c3cf73f299ffe46ff0eaeb8e3 + - python >=3.10 + - typing_extensions >=4.6.0 + license: MIT and PSF-2.0 + purls: + - pkg:pypi/exceptiongroup?source=hash-mapping + size: 21333 + timestamp: 1763918099466 +- conda: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda + sha256: 40fdf5a9d5cc7a3503cd0c33e1b90b1e6eab251aaaa74e6b965417d089809a15 + md5: 93f742fe078a7b34c29a182958d4d765 depends: - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - constrains: - - xz 5.8.2.* - license: 0BSD - size: 106169 - timestamp: 1768752763559 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - sha256: fe171ed5cf5959993d43ff72de7596e8ac2853e9021dec0344e583734f1e0843 - md5: 2c21e66f50753a083cbe6b80f38268fa + - python >=3.9 + - python-dateutil >=2.8.1 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/ghp-import?source=hash-mapping + size: 16538 + timestamp: 1734344477841 +- conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda + sha256: dbbec21a369872c8ebe23cb9a3b9d63638479ee30face165aa0fccc96e93eec3 + md5: 7c14f3706e099f8fcd47af2d494616cc depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: BSD-2-Clause + - python >=3.9 + - smmap >=3.0.1,<6 + license: BSD-3-Clause license_family: BSD - size: 92400 - timestamp: 1769482286018 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda - sha256: 1089c7f15d5b62c622625ec6700732ece83be8b705da8c6607f4dabb0c4bd6d2 - md5: 57c4be259f5e0b99a5983799a228ae55 + purls: + - pkg:pypi/gitdb?source=hash-mapping + size: 53136 + timestamp: 1735887290843 +- conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.46-pyhd8ed1ab_0.conda + sha256: 8043bcb4f59d17467c6c2f8259e7ded18775de5d62a8375a27718554d9440641 + md5: 74c0cfdd5359cd2a1f178a4c3d0bd3a5 depends: - - __osx >=11.0 - license: BSD-2-Clause + - gitdb >=4.0.1,<5 + - python >=3.10 + - typing_extensions >=3.10.0.2 + license: BSD-3-Clause license_family: BSD - size: 73690 - timestamp: 1769482560514 -- conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda - sha256: 40dcd0b9522a6e0af72a9db0ced619176e7cfdb114855c7a64f278e73f8a7514 - md5: e4a9fc2bba3b022dad998c78856afe47 + purls: + - pkg:pypi/gitpython?source=hash-mapping + size: 158433 + timestamp: 1767358832407 +- conda: https://conda.anaconda.org/conda-forge/noarch/griffe-2.0.2-pyhcf101f3_0.conda + sha256: 14cc12f55b19ddf164fb5df96dd156eaa6a8ab60b8ded337deda43fdcf70c369 + md5: 48dc0933013b4d09bd14373bbca33a44 depends: - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - license: BSD-2-Clause - license_family: BSD - size: 89411 - timestamp: 1769482314283 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - sha256: d716847b7deca293d2e49ed1c8ab9e4b9e04b9d780aea49a97c26925b28a7993 - md5: fd893f6a3002a635b5e50ceb9dd2c0f4 + - python >=3.10 + - griffelib >=2.0.2,<2.0.3.0a0 + - griffecli >=2.0.2,<2.0.3.0a0 + - python + license: ISC + purls: + - pkg:pypi/griffe?source=hash-mapping + size: 17094 + timestamp: 1774621473366 +- conda: https://conda.anaconda.org/conda-forge/noarch/griffecli-2.0.2-pyhcf101f3_0.conda + sha256: 4d54de99b3cf5589bf12e761e704aa00c54e5d567e934871a2d794e0772ab0b3 + md5: df88cbe27def353593a53b8b47adf780 depends: - - __glibc >=2.17,<3.0.a0 - - icu >=78.2,<79.0a0 - - libgcc >=14 - - libzlib >=1.3.1,<2.0a0 - license: blessing - size: 951405 - timestamp: 1772818874251 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda - sha256: beb0fd5594d6d7c7cd42c992b6bb4d66cbb39d6c94a8234f15956da99a04306c - md5: f6233a3fddc35a2ec9f617f79d6f3d71 + - python >=3.10 + - colorama >=0.4 + - griffelib >=2.0.2,<2.0.3.0a0 + - python + license: ISC + purls: + - pkg:pypi/griffecli?source=hash-mapping + size: 19703 + timestamp: 1774621473366 +- conda: https://conda.anaconda.org/conda-forge/noarch/griffelib-2.0.2-pyhcf101f3_0.conda + sha256: f4d0fe5835a6d1e3e828320a1df2117c96a769c788429d78a75ddcafda3cec67 + md5: f7b9e67b788f78c6facf79b3e12b1e13 depends: - - __osx >=11.0 - - icu >=78.2,<79.0a0 - - libzlib >=1.3.1,<2.0a0 - license: blessing - size: 918420 - timestamp: 1772819478684 -- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda - sha256: 5fccf1e4e4062f8b9a554abf4f9735a98e70f82e2865d0bfdb47b9de94887583 - md5: 8830689d537fda55f990620680934bb1 + - python >=3.10 + - python + license: ISC + purls: + - pkg:pypi/griffelib?source=hash-mapping + size: 117111 + timestamp: 1774621473366 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3 + md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 depends: - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - license: blessing - size: 1297302 - timestamp: 1772818899033 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - sha256: 78668020064fdaa27e9ab65cd2997e2c837b564ab26ce3bf0e58a2ce1a525c6e - md5: 1b08cd684f34175e4514474793d44bcb + - python >=3.10 + - hyperframe >=6.1,<7 + - hpack >=4.1,<5 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/h2?source=hash-mapping + size: 95967 + timestamp: 1756364871835 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba + md5: 0a802cb9888dd14eeefc611f05c40b6e depends: - - __glibc >=2.17,<3.0.a0 - - libgcc 15.2.0 he0feb66_18 - constrains: - - libstdcxx-ng ==15.2.0=*_18 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 5852330 - timestamp: 1771378262446 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda - sha256: 1a7539cfa7df00714e8943e18de0b06cceef6778e420a5ee3a2a145773758aee - md5: db409b7c1720428638e7c0d509d3e1b5 + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/hpack?source=hash-mapping + size: 30731 + timestamp: 1737618390337 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 + md5: 8e6923fc12f1fe8f8c4e5c9f343256ac depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/hyperframe?source=hash-mapping + size: 17397 + timestamp: 1737618427549 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + sha256: ae89d0299ada2a3162c2614a9d26557a92aa6a77120ce142f8e0109bbf0342b0 + md5: 53abe63df7e10a6ba605dc5f9f961d36 + depends: + - python >=3.10 license: BSD-3-Clause license_family: BSD - size: 40311 - timestamp: 1766271528534 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - sha256: 55044c403570f0dc26e6364de4dc5368e5f3fc7ff103e867c487e2b5ab2bcda9 - md5: d87ff7921124eccd67248aa483c23fec + purls: + - pkg:pypi/idna?source=hash-mapping + size: 50721 + timestamp: 1760286526795 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda + sha256: 82ab2a0d91ca1e7e63ab6a4939356667ef683905dea631bc2121aa534d347b16 + md5: 080594bf4493e6bae2607e65390c520a depends: - - __glibc >=2.17,<3.0.a0 - constrains: - - zlib 1.3.2 *_2 - license: Zlib - license_family: Other - size: 63629 - timestamp: 1774072609062 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - sha256: 361415a698514b19a852f5d1123c5da746d4642139904156ddfca7c922d23a05 - md5: bc5a5721b6439f2f62a84f2548136082 + - python >=3.10 + - zipp >=3.20 + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/importlib-metadata?source=hash-mapping + size: 34387 + timestamp: 1773931568510 +- conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + sha256: e1a9e3b1c8fe62dc3932a616c284b5d8cbe3124bbfbedcf4ce5c828cb166ee19 + md5: 9614359868482abba1bd15ce465e3c42 depends: - - __osx >=11.0 - constrains: - - zlib 1.3.2 *_2 - license: Zlib - license_family: Other - size: 47759 - timestamp: 1774072956767 -- conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - sha256: 88609816e0cc7452bac637aaf65783e5edf4fee8a9f8e22bdc3a75882c536061 - md5: dbabbd6234dea34040e631f87676292f + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/iniconfig?source=hash-mapping + size: 13387 + timestamp: 1760831448842 +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + sha256: fc9ca7348a4f25fed2079f2153ecdcf5f9cf2a0bc36c4172420ca09e1849df7b + md5: 04558c96691bed63104678757beb4f8d depends: - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - constrains: - - zlib 1.3.2 *_2 - license: Zlib - license_family: Other - size: 58347 - timestamp: 1774072851498 + - markupsafe >=2.0 + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jinja2?source=hash-mapping + size: 120685 + timestamp: 1764517220861 - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda sha256: 20e0892592a3e7c683e3d66df704a9425d731486a97c34fc56af4da1106b2b6b md5: ba0a9221ce1063f31692c07370d062f3 @@ -895,51 +864,10 @@ packages: - python license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/markdown?source=hash-mapping size: 85893 timestamp: 1770694658918 -- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda - sha256: c279be85b59a62d5c52f5dd9a4cd43ebd08933809a8416c22c3131595607d4cf - md5: 9a17c4307d23318476d7fbf0fedc0cde - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 - constrains: - - jinja2 >=3.0.0 - license: BSD-3-Clause - license_family: BSD - size: 27424 - timestamp: 1772445227915 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py314h6e9b3f0_1.conda - sha256: 411153d14ee0d98be6e3751cf5cc0502db17bce2deebebb8779e33d29d0e525f - md5: d33c0a15882b70255abdd54711b06a45 - depends: - - __osx >=11.0 - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 - constrains: - - jinja2 >=3.0.0 - license: BSD-3-Clause - license_family: BSD - size: 27256 - timestamp: 1772445397216 -- conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda - sha256: 02805a0f3cd168dbf13afc5e4aed75cc00fe538ce143527a6471485b36f5887c - md5: 8de7b40f8b30a8fcaa423c2537fe4199 - depends: - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - constrains: - - jinja2 >=3.0.0 - license: BSD-3-Clause - license_family: BSD - size: 30022 - timestamp: 1772445159549 - conda: https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda sha256: e5b555fd638334a253d83df14e3c913ef8ce10100090e17fd6fb8e752d36f95d md5: d9a8fc1f01deae61735c88ec242e855c @@ -947,6 +875,8 @@ packages: - python >=3.9 license: MIT license_family: MIT + purls: + - pkg:pypi/mergedeep?source=hash-mapping size: 11676 timestamp: 1734157119152 - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda @@ -972,6 +902,8 @@ packages: - babel >=2.9.0 license: BSD-2-Clause license_family: BSD + purls: + - pkg:pypi/mkdocs?source=hash-mapping size: 3524754 timestamp: 1734344673481 - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-autorefs-1.4.4-pyhd8ed1ab_0.conda @@ -984,6 +916,9 @@ packages: - pymdown-extensions - python >=3.10 license: ISC + purls: + - pkg:pypi/mkdocs-autorefs?source=hash-mapping + run_exports: {} size: 35803 timestamp: 1770749168710 - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.2-pyhd8ed1ab_0.conda @@ -997,6 +932,8 @@ packages: - pyyaml >=5.1 license: MIT license_family: MIT + purls: + - pkg:pypi/mkdocs-get-deps?source=hash-mapping size: 15572 timestamp: 1773570672864 - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-git-committers-plugin-2-2.5.0-pyhcf101f3_1.conda @@ -1010,6 +947,8 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/mkdocs-git-committers-plugin-2?source=hash-mapping size: 18907 timestamp: 1770590187571 - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.7.6-pyhcf101f3_1.conda @@ -1031,6 +970,8 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/mkdocs-material?source=hash-mapping size: 4800629 timestamp: 1774620149583 - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda @@ -1042,24 +983,10 @@ packages: - mkdocs-material >=5.0.0 license: MIT license_family: MIT + purls: + - pkg:pypi/mkdocs-material-extensions?source=hash-mapping size: 16122 timestamp: 1734641109286 -- conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-mermaid2-plugin-1.2.3-pyhcf101f3_0.conda - sha256: 19af4ad7ac8e23f9a573cf98d8fb2f159f22d12aea054dbde9c8dbc7d1d2c730 - md5: fb9749b701beef30f355b002b6d547e2 - depends: - - python >=3.10 - - beautifulsoup4 >=4.6.3 - - jsbeautifier - - mkdocs >=1.0.4 - - pymdown-extensions >=8.0 - - requests - - setuptools >=18.5 - - python - license: MIT - license_family: MIT - size: 21859 - timestamp: 1768506910902 - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocstrings-1.0.3-pyhd8ed1ab_0.conda sha256: 01aa08456b569680394caa883b5a02f54e247142b6897e537abee2998ba1de1e md5: 97f68128ed142b9d918d44c785674932 @@ -1075,6 +1002,8 @@ packages: - python >=3.10,<4.0 - typing-extensions >=4.1 license: ISC + purls: + - pkg:pypi/mkdocstrings?source=hash-mapping size: 36266 timestamp: 1770555720575 - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocstrings-python-2.0.2-pyh332efcf_0.conda @@ -1087,58 +1016,10 @@ packages: - python >=3.10 - typing_extensions >=4.0 license: ISC + purls: + - pkg:pypi/mkdocstrings-python?source=hash-mapping size: 57013 timestamp: 1770730332317 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 - md5: 47e340acb35de30501a76c7c799c41d7 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - license: X11 AND BSD-3-Clause - size: 891641 - timestamp: 1738195959188 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 - md5: 068d497125e4bf8a66bf707254fff5ae - depends: - - __osx >=11.0 - license: X11 AND BSD-3-Clause - size: 797030 - timestamp: 1738196177597 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - sha256: 44c877f8af015332a5d12f5ff0fb20ca32f896526a7d0cdb30c769df1144fb5c - md5: f61eb8cd60ff9057122a3d338b99c00f - depends: - - __glibc >=2.17,<3.0.a0 - - ca-certificates - - libgcc >=14 - license: Apache-2.0 - license_family: Apache - size: 3164551 - timestamp: 1769555830639 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda - sha256: 361f5c5e60052abc12bdd1b50d7a1a43e6a6653aab99a2263bf2288d709dcf67 - md5: f4f6ad63f98f64191c3e77c5f5f29d76 - depends: - - __osx >=11.0 - - ca-certificates - license: Apache-2.0 - license_family: Apache - size: 3104268 - timestamp: 1769556384749 -- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda - sha256: 53a5ad2e5553b8157a91bb8aa375f78c5958f77cb80e9d2ce59471ea8e5c0bd6 - md5: eb585509b815415bc964b2c7e11c7eb3 - depends: - - ca-certificates - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - license: Apache-2.0 - license_family: Apache - size: 9343023 - timestamp: 1769557547888 - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda sha256: c1fc0f953048f743385d31c468b4a678b3ad20caffdeaa94bed85ba63049fd58 md5: b76541e68fea4d511b1ac46a28dcd2c6 @@ -1147,6 +1028,8 @@ packages: - python license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/packaging?source=hash-mapping size: 72010 timestamp: 1769093650580 - conda: https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda @@ -1156,6 +1039,8 @@ packages: - python >=3.9 license: MIT license_family: MIT + purls: + - pkg:pypi/paginate?source=hash-mapping size: 18865 timestamp: 1734618649164 - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda @@ -1165,6 +1050,8 @@ packages: - python >=3.10 license: MPL-2.0 license_family: MOZILLA + purls: + - pkg:pypi/pathspec?source=hash-mapping size: 53739 timestamp: 1769677743677 - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda @@ -1175,6 +1062,8 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/platformdirs?source=hash-mapping size: 25646 timestamp: 1773199142345 - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda @@ -1185,6 +1074,8 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/pluggy?source=hash-mapping size: 25877 timestamp: 1764896838868 - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda @@ -1193,6 +1084,8 @@ packages: depends: - python >=3.10 license: BSD-2-Clause + purls: + - pkg:pypi/pygments?source=hash-mapping size: 893031 timestamp: 1774796815820 - conda: https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.21.2-pyhd8ed1ab_0.conda @@ -1204,6 +1097,8 @@ packages: - pyyaml license: MIT license_family: MIT + purls: + - pkg:pypi/pymdown-extensions?source=hash-mapping size: 173156 timestamp: 1774803071462 - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda @@ -1215,6 +1110,8 @@ packages: - win_inet_pton license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/pysocks?source=hash-mapping size: 21784 timestamp: 1733217448189 - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda @@ -1225,6 +1122,8 @@ packages: - python >=3.9 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/pysocks?source=hash-mapping size: 21085 timestamp: 1733217331982 - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda @@ -1244,35 +1143,315 @@ packages: - pytest-faulthandler >=2 license: MIT license_family: MIT + purls: + - pkg:pypi/pytest?source=hash-mapping size: 299581 timestamp: 1765062031645 -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda - build_number: 101 - sha256: cb0628c5f1732f889f53a877484da98f5a0e0f47326622671396fb4f2b0cd6bd - md5: c014ad06e60441661737121d3eae8a60 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664 + md5: 5b8d21249ff20967101ffa321cab24e8 depends: - - __glibc >=2.17,<3.0.a0 - - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-64 >=2.36.1 - - libexpat >=2.7.3,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 - - libgcc >=14 - - liblzma >=5.8.2,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.51.2,<4.0a0 - - libuuid >=2.41.3,<3.0a0 + - python >=3.9 + - six >=1.5 + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/python-dateutil?source=hash-mapping + size: 233310 + timestamp: 1751104122689 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + build_number: 8 + sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 + md5: 0539938c55b6b1a59b560e843ad864a4 + constrains: + - python 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6989 + timestamp: 1752805904792 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda + sha256: 69ab63bd45587406ae911811fc4d4c1bf972d643fa57a009de7c01ac978c4edd + md5: e8e53c4150a1bba3b160eacf9d53a51b + depends: + - python >=3.9 + - pyyaml + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml-env-tag?source=hash-mapping + size: 11137 + timestamp: 1747237061448 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.0-pyhcf101f3_0.conda + sha256: fbc7183778e1f9976ae7d812986c227f9d43f841326ac03b5f43f1ac93fa8f3b + md5: bee5ed456361bfe8af502beaf5db82e2 + depends: + - python >=3.10 + - certifi >=2023.5.7 + - charset-normalizer >=2,<4 + - idna >=2.5,<4 + - urllib3 >=1.26,<3 + - python + constrains: + - chardet >=3.0.2,<6 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/requests?source=hash-mapping + size: 63788 + timestamp: 1774462091279 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d + md5: 3339e3b65d58accf4ca4fb8748ab16b3 + depends: + - python >=3.9 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/six?source=hash-mapping + size: 18455 + timestamp: 1753199211006 +- conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda + sha256: eb92d0ad94b65af16c73071cc00cc0e10f2532be807beb52758aab2b06eb21e2 + md5: 87f47a78808baf2fa1ea9c315a1e48f1 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/smmap?source=hash-mapping + size: 26051 + timestamp: 1739781801801 +- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + sha256: 91cafdb64268e43e0e10d30bd1bef5af392e69f00edd34dfaf909f69ab2da6bd + md5: b5325cf06a000c5b14970462ff5e4d58 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/tomli?source=hash-mapping + size: 21561 + timestamp: 1774492402955 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + sha256: 7c2df5721c742c2a47b2c8f960e718c930031663ac1174da67c1ed5999f7938c + md5: edd329d7d3a4ab45dcf905899a7a6115 + depends: + - typing_extensions ==4.15.0 pyhcf101f3_0 + license: PSF-2.0 + license_family: PSF + purls: [] + size: 91383 + timestamp: 1756220668932 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731 + md5: 0caa1af407ecff61170c9437a808404d + depends: + - python >=3.10 + - python + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/typing-extensions?source=hash-mapping + size: 51692 + timestamp: 1756220668932 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c + md5: ad659d0a2b3e47e38d829aa8cad2d610 + license: LicenseRef-Public-Domain + purls: [] + size: 119135 + timestamp: 1767016325805 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda + sha256: af641ca7ab0c64525a96fd9ad3081b0f5bcf5d1cbb091afb3f6ed5a9eee6111a + md5: 9272daa869e03efe68833e3dc7a02130 + depends: + - backports.zstd >=1.0.0 + - brotli-python >=1.2.0 + - h2 >=4,<5 + - pysocks >=1.5.6,<2.0,!=1.5.7 + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/urllib3?source=hash-mapping + size: 103172 + timestamp: 1767817860341 +- conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda + sha256: 93807369ab91f230cf9e6e2a237eaa812492fe00face5b38068735858fba954f + md5: 46e441ba871f524e2b067929da3051c2 + depends: + - __win + - python >=3.9 + license: LicenseRef-Public-Domain + purls: + - pkg:pypi/win-inet-pton?source=hash-mapping + size: 9555 + timestamp: 1733130678956 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + sha256: b4533f7d9efc976511a73ef7d4a2473406d7f4c750884be8e8620b0ce70f4dae + md5: 30cd29cb87d819caead4d55184c1d115 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/zipp?source=hash-mapping + size: 24194 + timestamp: 1764460141901 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda + sha256: 5c2e471fd262fcc3c5a9d5ea4dae5917b885e0e9b02763dbd0f0d9635ed4cb99 + md5: f9501812fe7c66b6548c7fcaa1c1f252 + depends: + - __osx >=11.0 + - libcxx >=19 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 + constrains: + - libbrotlicommon 1.2.0 hc919400_1 + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 359854 + timestamp: 1764018178608 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + sha256: 540fe54be35fac0c17feefbdc3e29725cce05d7367ffedfaaa1bdda234b019df + md5: 620b85a3f45526a8bc4d23fd78fc22f0 + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 124834 + timestamp: 1771350416561 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda + sha256: 3a7907a17e9937d3a46dfd41cffaf815abad59a569440d1e25177c15fd0684e5 + md5: f1182c91c0de31a7abd40cedf6a5ebef + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 12361647 + timestamp: 1773822915649 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda + sha256: d1402087c8792461bfc081629e8aa97e6e577a31ae0b84e6b9cc144a18f48067 + md5: 4280e0a7fd613b271e022e60dea0138c + depends: + - __osx >=11.0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 568094 + timestamp: 1774439202359 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.5-hf6b4638_0.conda + sha256: 06780dec91dd25770c8cf01e158e1062fbf7c576b1406427475ce69a8af75b7e + md5: a32123f93e168eaa4080d87b0fb5da8a + depends: + - __osx >=11.0 + constrains: + - expat 2.7.5.* + license: MIT + license_family: MIT + purls: [] + size: 68192 + timestamp: 1774719211725 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda + sha256: 6686a26466a527585e6a75cc2a242bf4a3d97d6d6c86424a441677917f28bec7 + md5: 43c04d9cb46ef176bb2a4c77e324d599 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 40979 + timestamp: 1769456747661 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda + sha256: 7bfc7ffb2d6a9629357a70d4eadeadb6f88fa26ebc28f606b1c1e5e5ed99dc7e + md5: 009f0d956d7bfb00de86901d16e486c7 + depends: + - __osx >=11.0 + constrains: + - xz 5.8.2.* + license: 0BSD + purls: [] + size: 92242 + timestamp: 1768752982486 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda + sha256: 1089c7f15d5b62c622625ec6700732ece83be8b705da8c6607f4dabb0c4bd6d2 + md5: 57c4be259f5e0b99a5983799a228ae55 + depends: + - __osx >=11.0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 73690 + timestamp: 1769482560514 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + sha256: beb0fd5594d6d7c7cd42c992b6bb4d66cbb39d6c94a8234f15956da99a04306c + md5: f6233a3fddc35a2ec9f617f79d6f3d71 + depends: + - __osx >=11.0 + - icu >=78.2,<79.0a0 - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.5.5,<4.0a0 + license: blessing + purls: [] + size: 918420 + timestamp: 1772819478684 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + sha256: 361415a698514b19a852f5d1123c5da746d4642139904156ddfca7c922d23a05 + md5: bc5a5721b6439f2f62a84f2548136082 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.2 *_2 + license: Zlib + license_family: Other + purls: [] + size: 47759 + timestamp: 1774072956767 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py314h6e9b3f0_1.conda + sha256: 411153d14ee0d98be6e3751cf5cc0502db17bce2deebebb8779e33d29d0e525f + md5: d33c0a15882b70255abdd54711b06a45 + depends: + - __osx >=11.0 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 - python_abi 3.14.* *_cp314 - - readline >=8.3,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - zstd >=1.5.7,<1.6.0a0 - license: Python-2.0 - size: 36702440 - timestamp: 1770675584356 - python_site_packages_path: lib/python3.14/site-packages + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 27256 + timestamp: 1772445397216 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + license: X11 AND BSD-3-Clause + purls: [] + size: 797030 + timestamp: 1738196177597 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda + sha256: 361f5c5e60052abc12bdd1b50d7a1a43e6a6653aab99a2263bf2288d709dcf67 + md5: f4f6ad63f98f64191c3e77c5f5f29d76 + depends: + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3104268 + timestamp: 1769556384749 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.3-h4c637c5_101_cp314.conda build_number: 101 sha256: fccce2af62d11328d232df9f6bbf63464fd45f81f718c661757f9c628c4378ce @@ -1294,80 +1473,243 @@ packages: - tzdata - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 + purls: [] size: 13522698 timestamp: 1770675365241 python_site_packages_path: lib/python3.14/site-packages -- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.3-h4b44e0e_101_cp314.conda - build_number: 101 - sha256: 3f99d83bfd95b9bdae64a42a1e4bf5131dc20b724be5ac8a9a7e1ac2c0f006d7 - md5: 7ec2be7eaf59f83f3e5617665f3fbb2e +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda + sha256: 95f385f9606e30137cf0b5295f63855fd22223a4cf024d306cf9098ea1c4a252 + md5: dcf51e564317816cb8d546891019b3ab depends: - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.7.3,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 - - liblzma >=5.8.2,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.51.2,<4.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.5,<4.0a0 + - __osx >=11.0 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 - python_abi 3.14.* *_cp314 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - - zstd >=1.5.7,<1.6.0a0 - license: Python-2.0 - size: 18273230 - timestamp: 1770675442998 - python_site_packages_path: Lib/site-packages -- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664 - md5: 5b8d21249ff20967101ffa321cab24e8 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 189475 + timestamp: 1770223788648 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + sha256: a77010528efb4b548ac2a4484eaf7e1c3907f2aec86123ed9c5212ae44502477 + md5: f8381319127120ce51e081dce4865cf4 + depends: + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 313930 + timestamp: 1765813902568 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda + sha256: 799cab4b6cde62f91f750149995d149bc9db525ec12595e8a1d91b9317f038b3 + md5: a9d86bc62f39b94c4661716624eb21b0 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3127137 + timestamp: 1769460817696 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/watchdog-6.0.0-py314ha14b1ff_3.conda + sha256: dfdd3d45401568c164cc54d12c455bb740c84ad08cee04c13aa22855d91242f0 + md5: 2519c58dc35157f1b1a044041934815a depends: - - python >=3.9 - - six >=1.5 - python + - pyyaml >=3.10 + - python 3.14.* *_cp314 + - __osx >=11.0 + - python_abi 3.14.* *_cp314 license: Apache-2.0 license_family: APACHE - size: 233310 - timestamp: 1751104122689 -- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - build_number: 8 - sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 - md5: 0539938c55b6b1a59b560e843ad864a4 - constrains: - - python 3.14.* *_cp314 + purls: + - pkg:pypi/watchdog?source=hash-mapping + size: 176720 + timestamp: 1772608060730 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda + sha256: b03433b13d89f5567e828ea9f1a7d5c5d697bf374c28a4168d71e9464f5dafac + md5: 78a0fe9e9c50d2c381e8ee47e3ea437d + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 83386 + timestamp: 1753484079473 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda + sha256: 9485ba49e8f47d2b597dd399e88f4802e100851b27c21d7525625b0b4025a5d9 + md5: ab136e4c34e97f34fb621d2592a393d8 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD - size: 6989 - timestamp: 1752805904792 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda - sha256: b318fb070c7a1f89980ef124b80a0b5ccf3928143708a85e0053cde0169c699d - md5: 2035f68f96be30dc60a5dfd7452c7941 + purls: [] + size: 433413 + timestamp: 1764777166076 +- conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda + sha256: 6854ee7675135c57c73a04849c29cbebc2fb6a3a3bfee1f308e64bf23074719b + md5: 1302b74b93c44791403cbeee6a0f62a3 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - python >=3.14,<3.15.0a0 - python_abi 3.14.* *_cp314 - - yaml >=0.2.5,<0.3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - libbrotlicommon 1.2.0 hfd05255_1 license: MIT license_family: MIT - size: 202391 - timestamp: 1770223462836 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda - sha256: 95f385f9606e30137cf0b5295f63855fd22223a4cf024d306cf9098ea1c4a252 - md5: dcf51e564317816cb8d546891019b3ab + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 335782 + timestamp: 1764018443683 +- conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda + sha256: 76dfb71df5e8d1c4eded2dbb5ba15bb8fb2e2b0fe42d94145d5eed4c75c35902 + md5: 4cb8e6b48f67de0b018719cdf1136306 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 56115 + timestamp: 1771350256444 +- conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.5-hac47afa_0.conda + sha256: 6850c3a4d5dc215b86f58518cfb8752998533d6569b08da8df1da72e7c68e571 + md5: bfb43f52f13b7c56e7677aa7a8efdf0c + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - expat 2.7.5.* + license: MIT + license_family: MIT + purls: [] + size: 70609 + timestamp: 1774719377850 +- conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda + sha256: 59d01f2dfa8b77491b5888a5ab88ff4e1574c9359f7e229da254cdfe27ddc190 + md5: 720b39f5ec0610457b725eb3f396219a + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 45831 + timestamp: 1769456418774 +- conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda + sha256: f25bf293f550c8ed2e0c7145eb404324611cfccff37660869d97abf526eb957c + md5: ba0bfd4c3cf73f299ffe46ff0eaeb8e3 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - xz 5.8.2.* + license: 0BSD + purls: [] + size: 106169 + timestamp: 1768752763559 +- conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda + sha256: 40dcd0b9522a6e0af72a9db0ced619176e7cfdb114855c7a64f278e73f8a7514 + md5: e4a9fc2bba3b022dad998c78856afe47 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 89411 + timestamp: 1769482314283 +- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + sha256: 5fccf1e4e4062f8b9a554abf4f9735a98e70f82e2865d0bfdb47b9de94887583 + md5: 8830689d537fda55f990620680934bb1 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: blessing + purls: [] + size: 1297302 + timestamp: 1772818899033 +- conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda + sha256: 88609816e0cc7452bac637aaf65783e5edf4fee8a9f8e22bdc3a75882c536061 + md5: dbabbd6234dea34040e631f87676292f + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - zlib 1.3.2 *_2 + license: Zlib + license_family: Other + purls: [] + size: 58347 + timestamp: 1774072851498 +- conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda + sha256: 02805a0f3cd168dbf13afc5e4aed75cc00fe538ce143527a6471485b36f5887c + md5: 8de7b40f8b30a8fcaa423c2537fe4199 + depends: + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 30022 + timestamp: 1772445159549 +- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda + sha256: 53a5ad2e5553b8157a91bb8aa375f78c5958f77cb80e9d2ce59471ea8e5c0bd6 + md5: eb585509b815415bc964b2c7e11c7eb3 + depends: + - ca-certificates + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 9343023 + timestamp: 1769557547888 +- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.3-h4b44e0e_101_cp314.conda + build_number: 101 + sha256: 3f99d83bfd95b9bdae64a42a1e4bf5131dc20b724be5ac8a9a7e1ac2c0f006d7 + md5: 7ec2be7eaf59f83f3e5617665f3fbb2e depends: - - __osx >=11.0 - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.3,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.2,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.51.2,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 - python_abi 3.14.* *_cp314 - - yaml >=0.2.5,<0.3.0a0 - license: MIT - license_family: MIT - size: 189475 - timestamp: 1770223788648 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - zstd >=1.5.7,<1.6.0a0 + license: Python-2.0 + purls: [] + size: 18273230 + timestamp: 1770675442998 + python_site_packages_path: Lib/site-packages - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py314h2359020_1.conda sha256: a2aff34027aa810ff36a190b75002d2ff6f9fbef71ec66e567616ac3a679d997 md5: 0cd9b88826d0f8db142071eb830bce56 @@ -1380,115 +1722,10 @@ packages: - yaml >=0.2.5,<0.3.0a0 license: MIT license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping size: 181257 timestamp: 1770223460931 -- conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda - sha256: 69ab63bd45587406ae911811fc4d4c1bf972d643fa57a009de7c01ac978c4edd - md5: e8e53c4150a1bba3b160eacf9d53a51b - depends: - - python >=3.9 - - pyyaml - license: MIT - license_family: MIT - size: 11137 - timestamp: 1747237061448 -- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 - md5: d7d95fc8287ea7bf33e0e7116d2b95ec - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - ncurses >=6.5,<7.0a0 - license: GPL-3.0-only - license_family: GPL - size: 345073 - timestamp: 1765813471974 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - sha256: a77010528efb4b548ac2a4484eaf7e1c3907f2aec86123ed9c5212ae44502477 - md5: f8381319127120ce51e081dce4865cf4 - depends: - - __osx >=11.0 - - ncurses >=6.5,<7.0a0 - license: GPL-3.0-only - license_family: GPL - size: 313930 - timestamp: 1765813902568 -- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.0-pyhcf101f3_0.conda - sha256: fbc7183778e1f9976ae7d812986c227f9d43f841326ac03b5f43f1ac93fa8f3b - md5: bee5ed456361bfe8af502beaf5db82e2 - depends: - - python >=3.10 - - certifi >=2023.5.7 - - charset-normalizer >=2,<4 - - idna >=2.5,<4 - - urllib3 >=1.26,<3 - - python - constrains: - - chardet >=3.0.2,<6 - license: Apache-2.0 - license_family: APACHE - size: 63788 - timestamp: 1774462091279 -- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda - sha256: 82088a6e4daa33329a30bc26dc19a98c7c1d3f05c0f73ce9845d4eab4924e9e1 - md5: 8e194e7b992f99a5015edbd4ebd38efd - depends: - - python >=3.10 - license: MIT - license_family: MIT - size: 639697 - timestamp: 1773074868565 -- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d - md5: 3339e3b65d58accf4ca4fb8748ab16b3 - depends: - - python >=3.9 - - python - license: MIT - license_family: MIT - size: 18455 - timestamp: 1753199211006 -- conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda - sha256: eb92d0ad94b65af16c73071cc00cc0e10f2532be807beb52758aab2b06eb21e2 - md5: 87f47a78808baf2fa1ea9c315a1e48f1 - depends: - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - size: 26051 - timestamp: 1739781801801 -- conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda - sha256: 23b71ecf089967d2900126920e7f9ff18cdcef82dbff3e2f54ffa360243a17ac - md5: 18de09b20462742fe093ba39185d9bac - depends: - - python >=3.10 - license: MIT - license_family: MIT - size: 38187 - timestamp: 1769034509657 -- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - sha256: cafeec44494f842ffeca27e9c8b0c27ed714f93ac77ddadc6aaf726b5554ebac - md5: cffd3bdd58090148f4cfcd831f4b26ab - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libzlib >=1.3.1,<2.0a0 - constrains: - - xorg-libx11 >=1.8.12,<2.0a0 - license: TCL - license_family: BSD - size: 3301196 - timestamp: 1769460227866 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - sha256: 799cab4b6cde62f91f750149995d149bc9db525ec12595e8a1d91b9317f038b3 - md5: a9d86bc62f39b94c4661716624eb21b0 - depends: - - __osx >=11.0 - - libzlib >=1.3.1,<2.0a0 - license: TCL - license_family: BSD - size: 3127137 - timestamp: 1769460817696 - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda sha256: 0e79810fae28f3b69fe7391b0d43f5474d6bd91d451d5f2bde02f55ae481d5e3 md5: 0481bfd9814bf525bd4b3ee4b51494c4 @@ -1498,43 +1735,9 @@ packages: - vc14_runtime >=14.44.35208 license: TCL license_family: BSD + purls: [] size: 3526350 timestamp: 1769460339384 -- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - sha256: 91cafdb64268e43e0e10d30bd1bef5af392e69f00edd34dfaf909f69ab2da6bd - md5: b5325cf06a000c5b14970462ff5e4d58 - depends: - - python >=3.10 - - python - license: MIT - license_family: MIT - size: 21561 - timestamp: 1774492402955 -- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - sha256: 7c2df5721c742c2a47b2c8f960e718c930031663ac1174da67c1ed5999f7938c - md5: edd329d7d3a4ab45dcf905899a7a6115 - depends: - - typing_extensions ==4.15.0 pyhcf101f3_0 - license: PSF-2.0 - license_family: PSF - size: 91383 - timestamp: 1756220668932 -- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731 - md5: 0caa1af407ecff61170c9437a808404d - depends: - - python >=3.10 - - python - license: PSF-2.0 - license_family: PSF - size: 51692 - timestamp: 1756220668932 -- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c - md5: ad659d0a2b3e47e38d829aa8cad2d610 - license: LicenseRef-Public-Domain - size: 119135 - timestamp: 1767016325805 - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda sha256: 3005729dce6f3d3f5ec91dfc49fc75a0095f9cd23bab49efb899657297ac91a5 md5: 71b24316859acd00bdb8b38f5e2ce328 @@ -1542,21 +1745,9 @@ packages: - vc14_runtime >=14.29.30037 - vs2015_runtime >=14.29.30037 license: LicenseRef-MicrosoftWindowsSDK10 + purls: [] size: 694692 timestamp: 1756385147981 -- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - sha256: af641ca7ab0c64525a96fd9ad3081b0f5bcf5d1cbb091afb3f6ed5a9eee6111a - md5: 9272daa869e03efe68833e3dc7a02130 - depends: - - backports.zstd >=1.0.0 - - brotli-python >=1.2.0 - - h2 >=4,<5 - - pysocks >=1.5.6,<2.0,!=1.5.7 - - python >=3.10 - license: MIT - license_family: MIT - size: 103172 - timestamp: 1767817860341 - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda sha256: 9dc40c2610a6e6727d635c62cced5ef30b7b30123f5ef67d6139e23d21744b3a md5: 1e610f2416b6acdd231c5f573d754a0f @@ -1566,6 +1757,7 @@ packages: - vc14 license: BSD-3-Clause license_family: BSD + purls: [] size: 19356 timestamp: 1767320221521 - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda @@ -1578,6 +1770,7 @@ packages: - vs2015_runtime 14.44.35208.* *_34 license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime license_family: Proprietary + purls: [] size: 683233 timestamp: 1767320219644 - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda @@ -1589,32 +1782,9 @@ packages: - vs2015_runtime 14.44.35208.* *_34 license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime license_family: Proprietary + purls: [] size: 115235 timestamp: 1767320173250 -- conda: https://conda.anaconda.org/conda-forge/linux-64/watchdog-6.0.0-py314h9e666f3_3.conda - sha256: 19605181aa56af8aeef977ec99614194420c96e929eaad2c1d858e5fcb16414c - md5: d0003e6427d81d247aa5ef84ba814d47 - depends: - - python - - pyyaml >=3.10 - - python_abi 3.14.* *_cp314 - license: Apache-2.0 - license_family: APACHE - size: 162474 - timestamp: 1772608179138 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/watchdog-6.0.0-py314ha14b1ff_3.conda - sha256: dfdd3d45401568c164cc54d12c455bb740c84ad08cee04c13aa22855d91242f0 - md5: 2519c58dc35157f1b1a044041934815a - depends: - - python - - pyyaml >=3.10 - - python 3.14.* *_cp314 - - __osx >=11.0 - - python_abi 3.14.* *_cp314 - license: Apache-2.0 - license_family: APACHE - size: 176720 - timestamp: 1772608060730 - conda: https://conda.anaconda.org/conda-forge/win-64/watchdog-6.0.0-py314hb821551_3.conda sha256: 881b1218e8e4a4b28b4b67b4226e490281a16a14ca8f10edd58eddd65ed23872 md5: fb3b994d1855ef29ec5c49dc02708384 @@ -1624,36 +1794,10 @@ packages: - python_abi 3.14.* *_cp314 license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/watchdog?source=hash-mapping size: 203875 timestamp: 1772608056341 -- conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda - sha256: 93807369ab91f230cf9e6e2a237eaa812492fe00face5b38068735858fba954f - md5: 46e441ba871f524e2b067929da3051c2 - depends: - - __win - - python >=3.9 - license: LicenseRef-Public-Domain - size: 9555 - timestamp: 1733130678956 -- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - sha256: 6d9ea2f731e284e9316d95fa61869fe7bbba33df7929f82693c121022810f4ad - md5: a77f85f77be52ff59391544bfe73390a - depends: - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - license: MIT - license_family: MIT - size: 85189 - timestamp: 1753484064210 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - sha256: b03433b13d89f5567e828ea9f1a7d5c5d697bf374c28a4168d71e9464f5dafac - md5: 78a0fe9e9c50d2c381e8ee47e3ea437d - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - size: 83386 - timestamp: 1753484079473 - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda sha256: 80ee68c1e7683a35295232ea79bcc87279d31ffeda04a1665efdb43cbd50a309 md5: 433699cba6602098ae8957a323da2664 @@ -1666,38 +1810,9 @@ packages: - ucrt >=10.0.20348.0 license: MIT license_family: MIT + purls: [] size: 63944 timestamp: 1753484092156 -- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - sha256: b4533f7d9efc976511a73ef7d4a2473406d7f4c750884be8e8620b0ce70f4dae - md5: 30cd29cb87d819caead4d55184c1d115 - depends: - - python >=3.10 - - python - license: MIT - license_family: MIT - size: 24194 - timestamp: 1764460141901 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 - md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 - depends: - - __glibc >=2.17,<3.0.a0 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - size: 601375 - timestamp: 1764777111296 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - sha256: 9485ba49e8f47d2b597dd399e88f4802e100851b27c21d7525625b0b4025a5d9 - md5: ab136e4c34e97f34fb621d2592a393d8 - depends: - - __osx >=11.0 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - size: 433413 - timestamp: 1764777166076 - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda sha256: 368d8628424966fd8f9c8018326a9c779e06913dd39e646cf331226acc90e5b2 md5: 053b84beec00b71ea8ff7a4f84b55207 @@ -1708,5 +1823,32 @@ packages: - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 388453 timestamp: 1764777142545 +- pypi: https://files.pythonhosted.org/packages/08/6c/2b9fe10a9e2a27e72f88291f6f6957db09215d6782a758785cf1ce40ba6f/mkdocs_enumerate_headings_plugin-0.7.0-py3-none-any.whl + name: mkdocs-enumerate-headings-plugin + version: 0.7.0 + sha256: d3c644cdf736d0bfc3468dc7b5b4838870462038039e7fa3b2fd6910e9519c32 + requires_dist: + - mkdocs>=1.0.4 + - beautifulsoup4>=4.9.0 + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/5e/f5/0c41cb68dcae6b7de4fac4188a3a9589e21fb31df21ea3a2e888db95e6c9/soupsieve-2.8.4-py3-none-any.whl + name: soupsieve + version: 2.8.4 + sha256: e7e6b0769c8f51ed59acab6e994b00621096cfb1c640a7509295987388fbaf65 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/88/c6/92fcd42f1ba33e1184263f25bfabf3d27c383410470f169e4b8163bf9c17/beautifulsoup4-4.15.0-py3-none-any.whl + name: beautifulsoup4 + version: 4.15.0 + sha256: d6f88de62e1d4e38ecb1077eb9724cd0eff29d2a08ca16a401e9b9e93f117cf9 + requires_dist: + - soupsieve>=1.6.1 + - typing-extensions>=4.0.0 + - cchardet ; extra == 'cchardet' + - chardet ; extra == 'chardet' + - charset-normalizer ; extra == 'charset-normalizer' + - html5lib ; extra == 'html5lib' + - lxml ; extra == 'lxml' + requires_python: '>=3.7.0' diff --git a/pixi.toml b/pixi.toml index 1b4605f..06965a6 100644 --- a/pixi.toml +++ b/pixi.toml @@ -15,6 +15,9 @@ test = { cmd = "pytest" } mkdocs-material = ">=9.7.6" mkdocs-git-committers-plugin-2 = ">=2.5.0" mkdocstrings = ">=1.0.3" -mkdocs-mermaid2-plugin = ">=1.2.3" mkdocstrings-python = ">=2.0.2" pytest = ">=9.0.2" +mkdocs-autorefs = ">=1.4.4,<2" + +[pypi-dependencies] +mkdocs-enumerate-headings-plugin = ">=0.7.0, <0.8" diff --git a/resources/shapes/README.md b/resources/shapes/README.md deleted file mode 100644 index 44ea1d6..0000000 --- a/resources/shapes/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Shapes - -Lightweight [GeoParquet](https://geoparquet.org/) files to be used for light testing of components. -Generated using [Natural Earth](naturalearthdata.com) data. - - -- **mne_admin0.parquet**: Montenegro at a country-level resolution (i.e., a single shape). Recommended for lightweight testing. -- **prt_admin1.parquet**: Portugal at a regional resolution (20 sub-regions). Recommended for light to medium testing. - diff --git a/tests/data_module_test/docs_test.py b/tests/data_module_test/docs_test.py index 4ea0a84..0498d13 100644 --- a/tests/data_module_test/docs_test.py +++ b/tests/data_module_test/docs_test.py @@ -4,7 +4,7 @@ def test_mkdocs_builds(tmp_path, pytestconfig): - """Run a basic check on the""" + """Basic check to see if the docs build.""" project_root = pytestconfig.rootpath result = subprocess.run(