Skip to main content

Parse, store, validate, and emit Crystallographic Information Files (CIF)

Project description

cifflow

Parse, store, validate, and emit Crystallographic Information Files (CIF).

PyPI CI PyPI - Python Version License


What it does

  • Focused on multi-block powder CIF files, but generally applicable
  • Constructs CIF files
    • Parses CIF 1.1 and CIF 2.0 files, including all string types (triple-quoted, multiline text fields, embedded quotes) and save frames
    • Constructs CifFile objects programmatically from Python values (CifWriter), and performs arbitrary edits: add/remove/rename tags, loops, blocks, and save frames
    • Populate default values as defined in the dictionary
  • Loads DDLm dictionaries with full _import.get resolution, producing a typed schema
  • Removes common parse-time artefacts automatically (clean): orphan error tags, duplicate blocks/save frames/tags, loop padding; for anything beyond these automatic fixes, use CifWriter
  • Ingests parsed or constructed CIF data into DuckDB using the dictionary-derived schema: one table per category, foreign keys enforced, unknown tags routed to a fallback tier
  • Emits valid CIF from a populated database in four modes: ORIGINAL, GROUPED, ONE_BLOCK, ALL_BLOCKS
  • Trusts the user — if you pass in multiple blocks, cifflow assumes they all belong together and, failing key value clashes, can be interpreted as a single database/experiment
  • Visualises a schema as a Graphviz DOT string or a self-contained interactive HTML file

Documentation

The full API reference is at rowlesmr.github.io/cifflow.


Key properties

Error-tolerant. The parser never raises on malformed input. Every structural problem produces an explicit error event; parsing continues and all recoverable data is preserved.

No silent data loss. Duplicate tag values are preserved. Tags not mapped by the dictionary go to a fallback table, not a discard pile.

Round-trip fidelity. For well-formed input, emitted CIF re-parses to the same data. All values are stored and emitted as raw strings; ValueType provenance (placeholder . and ? vs quoted equivalents) is preserved throughout.

Canonical caseless names. Block names, save frame names, and tag names are stored in Unicode canonical caseless form (NFC(casefold(NFD(x)))). Lookups are automatically casefolded: cif["ABC"] finds a block stored as "abc".

Streaming parser. The parser is event-driven. CIF source is consumed in a single pass; the IR accumulates events incrementally. The Rust extension provides high-throughput Arrow output without any Python file objects.


Installation

Prebuilt wheels are available for Python 3.10 -- 3.14 with MacOS, Windows, and Linux.

pip install cifflow

To install from source (includes the Rust extension):

git clone https://github.com/rowlesmr/cifflow.git
cd cifflow
pip install -e ".[dev]"
maturin develop

Quick start

Parse a CIF file

from cifflow import build

text = open('structure.cif', encoding='utf-8').read()
cif, errors = build(text)   # never raises; errors is a list[ParseError]

for block_name in cif.blocks:          # block names are always lowercase
    block = cif[block_name]
    print(f'{block_name}: {len(block.tags)} tags, {len(block.loops)} loops')

The best way to resolve errors is to inspect the list of errors, edit the file accordingly, and try again. No assumptions are made about how to correct errors automatically.

Full pipeline: dictionary → DuckDB → CIF

To see what is going on in the lexing, parsing, ingestion, and schema generation phases, see the inspect module.

import pathlib
from cifflow import (
    DictionaryLoader, directory_resolver,
    save_dictionary, load_dictionary,
    generate_schema,
    build, ingest, emit, EmitMode,
)
from cifflow.types import CifVersion

# 1. Load dictionary (with JSON cache to avoid re-parsing on every run)
cache = pathlib.Path('cif_pow_cache.json')
resolver = directory_resolver('data/dictionaries')
if cache.exists():
    dictionary = load_dictionary(cache)
else:
    dictionary = DictionaryLoader(resolver=resolver).load(
        open('data/dictionaries/cif_pow.dic', encoding='utf-8').read())
    save_dictionary(dictionary, cache)

# 2. Derive schema
schema = generate_schema(dictionary)

# 3. Parse CIF
cif, errors = build(open('all_the_data.cif', encoding='utf-8').read())

# # 3.5 Edit CIF - to fix errors or alter content
# writer = CifWriter(cif.version, cif)
# for block in writer.blocks:
#    # Do alterations
# cif = writer.build() # raises ValueError if any errors present

# 4. Ingest into an in-memory DuckDB database
#    Pass a file path string to persist: ingest(cif, 'output.db', schema=schema)
conn, warnings = ingest(cif, schema=schema)

# # 4.5 Generate any default values
# generate_defaults(conn, schema)

# 5. Emit CIF
output = emit(conn, schema, mode=EmitMode.ORIGINAL, version=CifVersion.CIF_2_0)
open('output.cif', 'w', encoding='utf-8').write(output)

See example_workflow.py in the repository root for a fully annotated end-to-end demonstration covering all four emission modes, type-cast export, and fidelity checking.

The full API reference is at rowlesmr.github.io/cifflow.


Architecture

Parser → Event Stream → IR → Dictionary-aware Mapping → DuckDB → Output/API
Layer Responsibility
Lexer Tokenisation, ValueType assignment
Parser Token sequence interpretation, error recovery, event emission
IR (CIFModel) Event accumulation, loop validation, multiline text transformation
Dictionary DDLm parsing, schema derivation
DuckDB Persistent storage: structured tables when a dictionary is present, fallback tier otherwise
Output Valid CIF regeneration

Layer responsibilities are strictly separated. The parser does not know about the dictionary. The dictionary does not know about the IR. The output layer only reads from DuckDB.


Status

Everything should work. Issues, suggestions, and requests gladly recieved.


Development

Run the fast test suite (excludes tests that load large real-world CIF files):

python -m pytest -m "not slow"

Run the full suite including slow tests:

python -m pytest

After modifying the Rust extension, recompile before running Python tests:

maturin develop

License

Apache 2.0. See LICENSE.

The bundled JavaScript files (viz.js 2.1.2 and svg-pan-zoom 3.6.1) used by visualise_schema_html are MIT-licensed. Licence notices are in src/cifflow/dictionary/js/LICENSES.txt.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cifflow-0.1.10.tar.gz (10.6 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

cifflow-0.1.10-cp314-cp314-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.14Windows x86-64

cifflow-0.1.10-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

cifflow-0.1.10-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (1.6 MB view details)

Uploaded CPython 3.14macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

cifflow-0.1.10-cp313-cp313-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.13Windows x86-64

cifflow-0.1.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

cifflow-0.1.10-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (1.6 MB view details)

Uploaded CPython 3.13macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

cifflow-0.1.10-cp312-cp312-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.12Windows x86-64

cifflow-0.1.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

cifflow-0.1.10-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (1.6 MB view details)

Uploaded CPython 3.12macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

cifflow-0.1.10-cp311-cp311-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.11Windows x86-64

cifflow-0.1.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

cifflow-0.1.10-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (1.6 MB view details)

Uploaded CPython 3.11macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

cifflow-0.1.10-cp310-cp310-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.10Windows x86-64

cifflow-0.1.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

cifflow-0.1.10-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (1.6 MB view details)

Uploaded CPython 3.10macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

File details

Details for the file cifflow-0.1.10.tar.gz.

File metadata

  • Download URL: cifflow-0.1.10.tar.gz
  • Upload date:
  • Size: 10.6 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for cifflow-0.1.10.tar.gz
Algorithm Hash digest
SHA256 5ef8b9d627c90cf1e5e9ea464232e77f8521db3909d3a5af22ea50c86ed5f7a9
MD5 e877f7fe3fa8266d95d81d61a61cbfcc
BLAKE2b-256 351774f0d9a3d5294294c15d8923112955e0a751bd2911a48313918d6be8d7c2

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.10.tar.gz:

Publisher: release.yml on rowlesmr/cifflow

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file cifflow-0.1.10-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: cifflow-0.1.10-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for cifflow-0.1.10-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 0ecd711c86e077b29fee2fb62aa357964945e4d212149c6be92153a3cd9da47e
MD5 7b6aec1e91af7c96817bdd1c716aa8fa
BLAKE2b-256 95f20a7ceb64f17f16b45453795c2f517037b39509b0e36bdcb73ff11a558eb6

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.10-cp314-cp314-win_amd64.whl:

Publisher: release.yml on rowlesmr/cifflow

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file cifflow-0.1.10-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cifflow-0.1.10-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 dd2586ccaaac2c5e79cd10e673205f72aa98694333649ba481f1db40405d4877
MD5 69777a03f2348ffeff402a962bf47993
BLAKE2b-256 c4ae365f3866ce3b490ac7005f28e30c6e50a18fa0b87ec9fb30a5360951ec9e

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.10-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on rowlesmr/cifflow

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file cifflow-0.1.10-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for cifflow-0.1.10-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 470c88ff01e233c1d2e2ae631562e94094965acbf5e626055bec17d000b4ce8d
MD5 44b2111dcf1394020219dc291502bfe6
BLAKE2b-256 ff7d780faf2137e8cf7f458aa13bbc46ad0686c74c42425cb5ebe4137b7cb7bb

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.10-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl:

Publisher: release.yml on rowlesmr/cifflow

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file cifflow-0.1.10-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: cifflow-0.1.10-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for cifflow-0.1.10-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 821cc01277b534ef77ea845f799a5735e19bf55f0ee3341068b4f19d7f9c5e35
MD5 29861af909b26b9b0b8b265c241b7aa0
BLAKE2b-256 dc34aace1b46a5c954062b5f4dece9436b32c86da533d1f3224cf8599fe14046

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.10-cp313-cp313-win_amd64.whl:

Publisher: release.yml on rowlesmr/cifflow

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file cifflow-0.1.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cifflow-0.1.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 39c70c3517a89e721ce5180bb8614ecf35166946b76ebf3464a3c2783d56db79
MD5 22ec594b424c43dd86622934d8279ad7
BLAKE2b-256 e00222cacd410551e4a7a3390a9aa725b91e202b7c34bb95e532d8188e2765b0

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on rowlesmr/cifflow

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file cifflow-0.1.10-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for cifflow-0.1.10-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 7ee25d924e555096d06c53e4467506620eb860bafb40dc548a3f5c3f20f88103
MD5 5e0d42c1cff66c1ac8a92e54061e4d72
BLAKE2b-256 11d929d3cdc2720aff6a15c43505ef9f6291bfcb71907a0ec0d5e412edc0393b

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.10-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl:

Publisher: release.yml on rowlesmr/cifflow

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file cifflow-0.1.10-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: cifflow-0.1.10-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for cifflow-0.1.10-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 271b9e3d183da4c1b4c529a5eab715822c799211396039176538190817deee0e
MD5 38747d83186baa9fa8e61562fb47251f
BLAKE2b-256 ac0ce6acdc07a860860ce8ecdc4a37d46384c46276739c932f900d9f90d28443

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.10-cp312-cp312-win_amd64.whl:

Publisher: release.yml on rowlesmr/cifflow

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file cifflow-0.1.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cifflow-0.1.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 17c98a11b95f2102609d0c01858910be1ec9d8935fe71dc516ee7b9b5910412f
MD5 2cdd2d5469189d2d4aed874b6f2f3d82
BLAKE2b-256 cfc58dd50d69e29437ca71832b9060a525bac27e1cb04aad0ed98060886a3373

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on rowlesmr/cifflow

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file cifflow-0.1.10-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for cifflow-0.1.10-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 68c14329493901416cd96809d5ccd0f91aaf569326edd401ca64455025310d9f
MD5 800bd8cee98cf7f9572098c0b091290c
BLAKE2b-256 2a7eaa9e4c002e30ef79f4638384fd72fcfa4ce5cb163462ddb2d0a1fa38b7de

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.10-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl:

Publisher: release.yml on rowlesmr/cifflow

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file cifflow-0.1.10-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: cifflow-0.1.10-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for cifflow-0.1.10-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 d9a25654d1f407450dd0347d5eabf910845f46b4fb096e4cb1552a46f9342915
MD5 07e7630242615d2672499d4994ca9145
BLAKE2b-256 0a23fc76656651872712115b1af9e9c781a46da2a1b71efac84c6c110a9c8100

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.10-cp311-cp311-win_amd64.whl:

Publisher: release.yml on rowlesmr/cifflow

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file cifflow-0.1.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cifflow-0.1.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1b6498ae50f5bd9d71c034c6d1edfbb0b24e9420f473a3c423f54d1048e5f7fe
MD5 4bab852cac550d2dca88a6118f845a1f
BLAKE2b-256 99da2ab47d251e68001fc49d6b42dfd34ba7ee3fdad4bce1340b98ccdcb3a5c4

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on rowlesmr/cifflow

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file cifflow-0.1.10-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for cifflow-0.1.10-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 94cc941cca86824d175ffa7df7ed91e7e31199fe5ee343039e0cbcb62f4e6d8d
MD5 852f73b9f51fba1abe5d9b3abc5e84df
BLAKE2b-256 93eb7771480949a5f50421daaf936b90dd8cd0f945398709a05b6e1f41202b48

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.10-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl:

Publisher: release.yml on rowlesmr/cifflow

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file cifflow-0.1.10-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: cifflow-0.1.10-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for cifflow-0.1.10-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 9cec2e2f95688067e4514ee5e412c0019ff8ff75de09362043e97a010994e664
MD5 ad86c7a65b5c50a6fa73d6dd34b76cd6
BLAKE2b-256 bbed538433bf773fe72d1ed1aa3630477d0f8a6033b982144a981953d6588836

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.10-cp310-cp310-win_amd64.whl:

Publisher: release.yml on rowlesmr/cifflow

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file cifflow-0.1.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cifflow-0.1.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 55ce2c9692452fd4683c2846b498e18184c05e926823ce7264ba0216810c9526
MD5 fb654152d6d81be264de73bf6cc59d55
BLAKE2b-256 d9766bca5498af3bb402e909978260a0ed156fe134fbc9b06b8b005b6b50ee88

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on rowlesmr/cifflow

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file cifflow-0.1.10-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for cifflow-0.1.10-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 b5a01ee89b806b44580049847e950bc24ca0953470b394a754f284c75362a360
MD5 c80efe657c97cbc5d44962c620974dc3
BLAKE2b-256 a230505e4e6b223f478d0c49413f34278e4bb509a515b24fea05922a1aa025cc

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.10-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl:

Publisher: release.yml on rowlesmr/cifflow

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page