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.12.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.12-cp314-cp314-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.14Windows x86-64

cifflow-0.1.12-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.12-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.12-cp313-cp313-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.13Windows x86-64

cifflow-0.1.12-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.12-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.12-cp312-cp312-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.12Windows x86-64

cifflow-0.1.12-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.12-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.12-cp311-cp311-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.11Windows x86-64

cifflow-0.1.12-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.12-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.12-cp310-cp310-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.10Windows x86-64

cifflow-0.1.12-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.12-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (1.7 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.12.tar.gz.

File metadata

  • Download URL: cifflow-0.1.12.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.12.tar.gz
Algorithm Hash digest
SHA256 6ae2a87dc63586d97f76bc17d9e43a666ddccee299aacabc725e0026d85a56ef
MD5 2747629c1b3ff3172da6547ddf793aca
BLAKE2b-256 c42ba4e0ee7ada720568e9b6e0fd0e9b364b2c73286ef997e27571ee77550df7

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.12.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.12-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: cifflow-0.1.12-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.12-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 b68cfeccf28d54ebdec645385ba29d39959cb6a4cb26f902c7c207b8aea3f7b0
MD5 103d7794aacf945dc67d74dc698960c7
BLAKE2b-256 e732d9f3859fab39925cceb5602e5df13917bb4978e3c09290c22fc46b3a6151

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.12-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.12-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cifflow-0.1.12-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 aea4e758ab5595a17c5192885be2e9cf27a4c947ae7bea9ea9c6dd7cdf10b62d
MD5 2f4459287bb511bd461f5e7dfb3be3e3
BLAKE2b-256 b0c614d21471b93d2aa32c0825d1bc5cf851845c9afe6e1bedc8fbe728578af8

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.12-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.12-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.12-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 b2686eaef7e87d3f382e8943d5d9d14940c87bb705b850551168bfdcd10120e0
MD5 63e83556bc7a759c6d5b8a22a1113425
BLAKE2b-256 a99af5fd3897a444b820215177186252eec05ec4092c534a4b1a55ab8938ba35

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.12-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.12-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: cifflow-0.1.12-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.12-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 92641773d8d5a0671990aa963827b095e1d02dca38486d2520d00076542e0b0b
MD5 51ae99e1ba6562735d240dfcf91c341a
BLAKE2b-256 f290055fb77b3e52cc4753d2606ecbb6bbbe1b21838ee27237a2bf789433156c

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.12-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.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cifflow-0.1.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9f04b493b0365deb34614a732ab98043e40d59e9ac42254ac3703e6db62e52c3
MD5 b09257831ce8c5acedb254246cdb41de
BLAKE2b-256 282dc0963899f3194b015681531643b7291ddce3529ed8afcdf1c776e7e56377

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.12-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.12-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.12-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 a6805d12e34a1a68e24541ab106ee76f4fdef8cb7cb550221cace55f16a98d2a
MD5 6b484d6e56f51777b720026ecca574f1
BLAKE2b-256 c802585b121f607a52599d9565cdaf138d6a09ea3a776b461c84f21a20ba294a

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.12-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.12-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: cifflow-0.1.12-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.12-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 f810ba6c312ce84820f68640a1dd4e0ad0024adaddd60d80721f21e3ead7b226
MD5 49f99e6a45772bc880742b5adea60e8d
BLAKE2b-256 1ca909ece1f3cefb071a0535a6d02eb6289593daeb14e3f8eb7afc0eb6ad7dcc

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.12-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.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cifflow-0.1.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8fd3ea672d8e0db02165ae6ce7dcf106b31319c9e5efe4429d406d9bed1d512d
MD5 473b2c0589ce0433e0e766705ce790ab
BLAKE2b-256 80727bf07577f173520580fae4b4cda88ce1c53ec9f368342f2f3e9ef1417ad2

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.12-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.12-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.12-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 1fb6357d6738d1b3e7f25426cb8665040d5c44e92e1504f33f02b64f2360cc2c
MD5 91ed725a40b3980bb814da036716534a
BLAKE2b-256 dca9ea10c0d2a806986c3c7b11581e41ca272c43feeef3a4effa9f5fc7803006

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.12-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.12-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: cifflow-0.1.12-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.12-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 ca1de5fa68fd60e18dd0810b4e989c3239affdca678c598b47602d2c812e619a
MD5 e35ac2bbae7114c6862b66f9b7fb3c30
BLAKE2b-256 1d39bae2eef1ad934b7a62da378097710e86ca52d8e97e2dbf8113895b146a5b

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.12-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.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cifflow-0.1.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5e9c1710b50b6aae89e2e95797b182391ec884498a2b870a4428f3ed983837c3
MD5 bc3d75e33eba717fbfe8c8ca606553c4
BLAKE2b-256 43013476708239c3047ecc1330ae0fc07e46d63da980c2f74363b51372bb42eb

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.12-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.12-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.12-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 f849c407c3047a3373d61199dc1eeafefaa76c1595cc18bb9321ebc50836304c
MD5 bffe1de99b307f21f0dead3b56ad760a
BLAKE2b-256 b8161fd18d50c078bef81b90d215ea78c10bfe7a38335e8557102b1e48f283b2

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.12-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.12-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: cifflow-0.1.12-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.12-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 a440c72937d6e699db2ae03c0ce50815a04737aec4621fcd6c091aa14ef9f6a9
MD5 24184d2b789a3cf84225d68fb043ee71
BLAKE2b-256 10fb80f128c92044c144d4a47419ae631ddd419520c9be236f8b822def5b5331

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.12-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.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cifflow-0.1.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2cd37295e136385e49fb8b89d4110c10fb3fb120d077677ebfefc5179027f998
MD5 3f7bcab1c7b71431ae544b52b205af4b
BLAKE2b-256 fcb25e45ba30d15fa39b5b9747db45d80db685afdafe3e4bc3cb78c64e8e480e

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.12-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.12-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.12-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 4d853cc5484faab2978c5a8992b7f90aa672dea11ab337723e79c6af4ef50132
MD5 a34396412e4d6df458196eb4218764f0
BLAKE2b-256 3a8bdfa826cdf65648acbb753b512fd43c4f74ad73ac5bac7501a6c607f8568f

See more details on using hashes here.

Provenance

The following attestation bundles were made for cifflow-0.1.12-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