From 9430e75accedb9f72d9a933301a585397c8a3094 Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Sat, 27 Jul 2024 14:38:26 -0400 Subject: [PATCH] WIP: RFC: Axis Anatomical Orientation --- rfc/x/.gitattributes | 2 + rfc/x/.gitignore | 3 + rfc/x/index.md | 589 ++++++++++++++++ rfc/x/markdown/Orientation.md | 23 + rfc/x/orientation.schema.json | 28 + rfc/x/orientation.yml | 31 + rfc/x/pixi.lock | 1245 +++++++++++++++++++++++++++++++++ rfc/x/pixi.toml | 17 + 8 files changed, 1938 insertions(+) create mode 100644 rfc/x/.gitattributes create mode 100644 rfc/x/.gitignore create mode 100644 rfc/x/index.md create mode 100644 rfc/x/markdown/Orientation.md create mode 100644 rfc/x/orientation.schema.json create mode 100644 rfc/x/orientation.yml create mode 100644 rfc/x/pixi.lock create mode 100644 rfc/x/pixi.toml diff --git a/rfc/x/.gitattributes b/rfc/x/.gitattributes new file mode 100644 index 00000000..07fe41c5 --- /dev/null +++ b/rfc/x/.gitattributes @@ -0,0 +1,2 @@ +# GitHub syntax highlighting +pixi.lock linguist-language=YAML linguist-generated=true diff --git a/rfc/x/.gitignore b/rfc/x/.gitignore new file mode 100644 index 00000000..096b5eb5 --- /dev/null +++ b/rfc/x/.gitignore @@ -0,0 +1,3 @@ +# pixi environments +.pixi +*.egg-info diff --git a/rfc/x/index.md b/rfc/x/index.md new file mode 100644 index 00000000..fcd06fd4 --- /dev/null +++ b/rfc/x/index.md @@ -0,0 +1,589 @@ +# RFC: Axis Anatomical Orientation + +Summary: An optional, explicit field for + +## Status + +Brief description of status, including, e.g., `WIP | In-Review | Approved | Withdrawn | Obsolete`. + +| Name | GitHub Handle | Institution | Date | Status | +|-----------|---------------|-------------|------------|----------------------------------------| +| David Feng | dyf | Allen Institute for Neural Dynamics | 2023-07-26 | Author | +| Matthew McCormick | thewtex | Kitware | 2024-07-27 | Author | + +## Overview + +This RFC proposes the addition of an optional `anatomicalOrientation` field to the OME-NGFF axis description. +This field will provide explicit metadata about the anatomical orientation in an image using a +controlled vocabulary. The goal is to preserve essential biological information and eliminate assumptions +about orientation which can lead to errors in downstream analysis and alignment to anatomical atlases. + +## Background + +In the current OME-Zarr draft, canonical axis names are identified, e.g. `x`, `y`, `z` anatomical orientation of a subject is not specified. This omission forces tools to make assumptions about orientation, which can result in wasted time and erroneous analysis. + +Anatomical symmetry, such as in the brain, makes it impossible to retroactively determine the orientation of acquired data. By explicitly defining anatomical orientation in the specification, we can ensure consistency and accuracy in data analysis and interpretation. + +Existing standards provide some prior art for this proposal: +- The Insight Toolkit (ITK) ecosystem uses three-letter acronyms (e.g., `RAS` for Right-Anterior-Superior) to describe anatomical orientation, but these acronyms are often ambiguous and require users to look up their meanings frequently. +- Nifti’s coordinate transforms assume data maps into `RAS`, but this relies on users being familiar with and adhering to the Nifti specification. +- The Brain Image Library uses a more explicit controlled vocabulary, asking submitters to choose orientation for each axis (e.g., `left-to-right`, `anterior-to-posterior`). This approach is used at the Allen Institute for Neural Dynamics and has been discussed in community forums. +- The open Metadata Initiative for Neuroscience Data Structures (openMINDS) Metadata Initiative defines `anatomicalAxesOrientation` to record this information in tuples like `RAS`. +- The Digital Imaging and Communications in Medicine (DICOM) standard explicitly specifies anatomical orientation for bipeds as x-axis is increasing to the left hand side of the patient, the y-axis is increasing to the posterior side of the patient, and the z-axis is increasing toward the head of the patient and has a similar dorsal, cranial, rostral, proximal, and distal for quadrupeds. + +## Proposal + +We propose adding an OPTIONAL `anatomicalOrientation` field to the `axes` metadata in the OME-Zarr specification. This field will use a controlled vocabulary to explicitly define the anatomical orientation of the image. + +This metadata data MUST only be used in cases where there is a single subject in the acquired volume or extracted image region-of-interest and the subject is roughly aligned to the imaging axes. + +### Controlled Vocabulary + +The controlled vocabulary for the `anatomicalOrientation` field will include: + +- `left-to-right` +- `right-to-left` + +- `anterior-to-posterior` +- `posterior-to-anterior` + +- `inferior-to-superior` +- `superior-to-inferior` +- `dorsal-to-ventral` +- `ventral-to-dorsal` +- `rostral-to-caudal` +- `caudal-to-rostral` + +A set of NGFF `axes` MUST only have one of the set `{ "left-to-right", "right-to-left" }` or `{ "anterior-to-posterior", "posterior-to-anterior" }` or the remaining values. + +### Default Value + +For images of biped or quadruped subjects, `anatomicalOrientation` SHOULD be explicitly specified. + +If no orientation is specified, the implicit default value will be + +```json + "axes": [ + { "name": "z", "type": "space", "unit": "micrometer", "anatomicalOrientation": "inferior-to-superior" }, + { "name": "y", "type": "space", "unit": "micrometer", "anatomicalOrientation": "posterior-to-anterior" }, + { "name": "x", "type": "space", "unit": "micrometer", "anatomicalOrientation": "left-to-right" } + ] +``` + +To maintain consistency with the Nifti standard. + +## Coding Scheme + +We define the [LinkML encoding scheme](./orientation.yml) to enumerate the possible values +and provides their descriptions: + +### Enum: Orientation + +Anatomical orientation refers to the specific arrangement and directional alignment of anatomical structures within an imaging dataset. It is crucial for ensuring accurate alignment and comparison of images to anatomical atlases, facilitating consistent analysis and interpretation of biological data. + +#### Permissible Values + +| Text | Description | Meaning | Other Information | +| :--- | :---: | :---: | ---: | +| left-to-right | Describes the directional orientation from the left side to the right side of an anatomical structure or body. | | | +| right-to-left | Describes the directional orientation from the right side to the left side of an anatomical structure or body. | | | +| anterior-to-posterior | Describes the directional orientation from the front (anterior) to the back (posterior) of an anatomical structure or body. | | | +| posterior-to-anterior | Describes the directional orientation from the back (posterior) to the front (anterior) of an anatomical structure or body. | | | +| inferior-to-superior | Describes the directional orientation from the lower (inferior) to the upper (superior) part of an anatomical structure or body. | | | +| superior-to-inferior | Describes the directional orientation from the upper (superior) to the lower (inferior) part of an anatomical structure or body. | | | +| dorsal-to-ventral | Describes the directional orientation from the back (dorsal) to the front (ventral) of an anatomical structure or body. | | | +| ventral-to-dorsal | Describes the directional orientation from the front (ventral) to the back (dorsal) of an anatomical structure or body. | | | +| rostral-to-caudal | Describes the directional orientation from the front (rostral) to the back (caudal) end of an anatomical structure, typically used in reference to the central nervous system. | | | +| caudal-to-rostral | Describes the directional orientation from the back (caudal) to the front (rostral) end of an anatomical structure, typically used in reference to the central nervous system. | | | + +Which coorresponds to the following JSON Schema, + +## Requirements + +For the problem(s) solved by this RFC, what constrains the possible solutions? +List other RFCs, or standards (ISO, etc.) which are applicable. It is suggested +that the following text SHOULD be used in all RFCs: + +The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", +"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be +interpreted as described in [IETF RFC 2119][IETF RFC 2119] + +## Stakeholders + +Who has a stake in whether this RFC is accepted? + +* Facilitator: + - Josh Moore (German Bioimaging) +* Reviewers: + - Andras Lasso (Queens University) + - Sharmishtaa Seshamani (Allen Institute for Neural Dynamics) + - Lydia Ng (Allen Institute for Brain Science) +* Consulted: + - Yaël Balbastre (University College London) + - Davis Bennett + - John Bogovic (Janelia Research) + - Steve Pieper (Isomics) + - David Clunie (PixelMed) + - Nick Tustison (University of Virginia) + - Nick Lusk (Allen Institute for Neural Dynamics) + - Cai McCann + - Camilo Laiton + - Alan Watson (University of Pittsburgh) + - Dzenan Zukica (Kitware) + - Satra Ghosh (MIT) + - Niles Grattis (Cahal Neuro) +* Socialization: + - Discussed at the [Get Your Brain Together HCK02](https://github.com/InsightSoftwareConsortium/GetYourBrainTogether/blob/main/HCK02_2023_Allen_Institute_Hybrid/BoFBreakouts/Anatomic_orientation_in_OME-Zarr_NGFF_BoF_notes.md) + - ome/ngff GitHub Issue #208 + - Discussed at the Get Your Brain Together HKC03 + +## Implementation + +The implementation will involve adding the `orientation` field to the `axes` metadata +in the NGFF schema. The field will use the controlled vocabulary specified above. + +In JSON-Schema: + +```json +{ + "$defs": { + "Orientation": { + "description": "Anatomical orientation refers to the specific arrangement and directional alignment of anatomical structures within an imaging dataset. It is crucial for ensuring accurate alignment and comparison of images to anatomical atlases, facilitating consistent analysis and interpretation of biological data.", + "enum": [ + "left-to-right", + "right-to-left", + "anterior-to-posterior", + "posterior-to-anterior", + "inferior-to-superior", + "superior-to-inferior", + "dorsal-to-ventral", + "ventral-to-dorsal", + "rostral-to-caudal", + "caudal-to-rostral" + ], + "title": "Orientation", + "type": "string" + } + }, + "$id": "https://w3id.org/ome/ngff", + "$schema": "https://json-schema.org/draft/2019-09/schema", + "additionalProperties": true, + "metamodel_version": "1.7.0", + "title": "orientation", + "type": "object", + "version": "0.1.0" +} +``` + +In Python: + +```python +``` + +## Drawbacks, risks, alternatives, and unknowns (Recommended Header) + +* What are the costs of implementing this proposal? +* What known risks exist? What factors may complicate your project? Include: + security, complexity, compatibility, latency, service immaturity, lack of + team expertise, etc. +* What other strategies might solve the same problem? +* What questions still need to be resolved, or details iterated upon, to accept + this proposal? Your answer to this is likely to evolve as the proposal + evolves. +* What parts of the design do you expect to resolve through the RFC process + before this gets merged? +* What parts of the design do you expect to resolve through the implementation + of this feature before stabilization? +* What related issues do you consider out of scope for this RFC that could be + addressed in the future independently of the solution that comes out of this + RFC? + +## Abandoned Ideas (Optional Header) + +As RFCs evolve, it is common that there are ideas that are abandoned. Rather +than simply deleting them from the document, you should try to organize them +into sections that make it clear they're abandoned while explaining why they +were abandoned. + +When sharing your RFC with others or having someone look back on your RFC in +the future, it is common to walk the same path and fall into the same pitfalls +that we've since matured from. Abandoned ideas are a way to recognize that path +and explain the pitfalls and why they were abandoned. + +## Prior art and references (Optional Header) + +Is there any background material that might be helpful when reading this +proposal? For instance, do other operating systems address the same problem +this proposal addresses? + +Discuss prior art, both the good and the bad, in relation to this proposal. A +few examples of what this can include are: + +Does this feature exist in other formats and what experiences has their +community had? + +Are there any published papers or great posts that discuss this? If you have +some relevant papers to refer to, this can serve as a more detailed theoretical +background. + +This section is intended to encourage you as an author to think about the +lessons from other domains, and provide readers of your RFC with a fuller +picture. If there is no prior art, that is fine - your ideas are interesting to +us whether they are brand new or if it is an adaptation from other languages. + +Note that while precedent set by other languages is some motivation, it does +not on its own motivate an RFC. + +## Future possibilities (Optional Header) + +Think about what the natural extension and evolution of your proposal would be +and how it would affect the specification and project as a whole in a holistic +way. Try to use this section as a tool to more fully consider all possible +interactions with the project in your proposal. Also consider how this all fits +into the roadmap for the project and of the relevant sub-team. + +This is also a good place to "dump ideas", if they are out of scope for the RFC +you are writing but otherwise related. If you have tried and cannot think of +any future possibilities, you may simply state that you cannot think of +anything. + +Note that having something written down in the future-possibilities section is +not a reason to accept the current or a future RFC; such notes should be in the +section on motivation or rationale in this or subsequent RFCs. The section +merely provides additional information. + +## Performance (Recommended Header) + +What impact will this proposal have on performance? What benchmarks should we +create to evaluate the proposal? To evaluate the implementation? Which of those +benchmarks should we monitor on an ongoing basis? + +Do you expect any (speed / memory)? How will you confirm? + +There should be microbenchmarks. Are there? + +There should be end-to-end tests and benchmarks. If there are not (since this +is still a design), how will you track that these will be created? + +## Backwards Compatibility (Recommended Header) + +Backwards compatibility comes in two flavors: FIDL file source compatibility, +and ABI or wire format compatibility. This section should speak to both. Over +time, the ability to make backwards-incompatible changes will get harder. + +If you are introducing a new data type or language feature, consider what +changes you would expect users to make to FIDL definitions without breaking +users of the generated code. If your feature places any new source +compatibility restrictions on the generated language bindings, list those here. + +## Security considerations (Optional Header) + +What impact will this proposal have on security? Does the proposal require a +security review? + +A good starting point is to think about how the system might encounter +untrusted inputs and how those inputs might be used to manipulate the system. +From there, consider how known classes of vulnerabilities might apply to the +system and what tools and techniques can be applied to avoid those +vulnerabilities. + +## Privacy considerations (Optional Header) + +What impact will this proposal have on privacy? Does the proposal require a +privacy review? + +A good starting point is to think about how user data might be collected, +stored, or processed by your system. From there, consider the lifecycle of such +data and any data protection techniques that may be employed. + +## Testing (Recommended Header) + +How will you test your feature? A typical testing strategy involves unit, +integration, and end-to-end tests. Are our existing test frameworks and +infrastructure sufficient to support these tests or does this proposal require +additional investment in those areas? + +If your proposal defines a contract implemented by other people, how will those +people test that they have implemented the contract correctly? Consider, for +example, creating a conformance test suite for this purpose. + +## UI/UX (Optional Header) + +End-users applications are SHOULD to display the encoded information. + +## Tutorials and Examples (Optional Header) + +TODO + +## Style Notes (EXAMPLE) + +All RFCs should follow similar styling and structure to ease reading. + +TODO: This section should be updated as more style decisions are made +so that users of the template can simply cut-n-paste sections. + +### Heading Styles +Anatomical Orientation Field for OME-NGFF +"Heading 2" should be used for section titles. We do not use "Heading 1" +because aesthetically the text is too large. Google Docs will use Heading 2 as +the outermost headers in the generated outline. + +"Heading 3" should be used for sub-sections. +affine1 +Further heading styles can be used for nested sections, however it is rare that +a RFC goes beyond "Heading 4," and rare itself that "Heading 4" is reached. + +### Lists + +When making lists, it is common to bold the first phrase/sentence/word to bring +some category or point to attention. For example, a list of API considerations: + +* *Format* should be widgets +* *Protocol* should be widgets-rpc +* *Backwards* compatibility should be considered. + +### Spelling + +American spelling is preferred. + +### Typeface + +Type size should use this template's default configuration (11pt for body text, +larger for headings), and the type family should be Arial. No other typeface +customization (e.g., color, highlight) should be made other than italics, bold, +and underline. + +### Code Samples + +Code samples should be indented (tab or spaces are fine as long as it is +consistent) text using the Courier New font. Syntax highlighting can be +included if possible but isn't necessary. Please ensure the highlighted syntax +is the proper font size and using the font Courier New so non-highlighted +samples don't appear out of place. + +CLI output samples are similar to code samples but should be highlighted with +the color they'll output if it is known so that the RFC could also cover +formatting as part of the user experience. + +``` + func example() { + <-make(chan struct{}) + } +``` + +Note: This document is based on the [RFC template from Hashicorp][template] +(TODO: license requested). + +[IETF RFC 2119]: https://tools.ietf.org/html/rfc2119 +[rubber duck debugging]: https://en.wikipedia.org/wiki/Rubber_duck_debugging +[template]: https://works.hashicorp.com/articles/rfc-template + +# RFC: Anatomical Orientation Field for OME-NGFF + + +## Summary + +This RFC proposes the addition of an `anatomicalOrientation` field to the OME-NGFF specification. This field will provide explicit metadata about the anatomical orientation of an array, using a controlled vocabulary. The goal is to eliminate assumptions about orientation, which can lead to errors in downstream analysis and alignment to anatomical atlases. + +## Overview + +The anatomical orientation of an array is crucial metadata for downstream analysis, especially for aligning images to anatomical atlases. The current NGFF specification includes coordinate transformations but lacks explicit information about the anatomical orientation of the sample. This proposal aims to address this gap by adding an `anatomicalOrientation` field with a controlled vocabulary to the specification. + +## Background + +In the current OME-NGFF specification, the coordinate transformations are defined, but the anatomical orientation of the sample after applying these transformations is not specified. This omission forces tools to make assumptions about orientation, which can result in wasted time and erroneous analysis. + +Anatomical symmetry, such as in the brain, makes it impossible to retroactively determine the orientation of acquired data. By explicitly defining anatomical orientation in the specification, we can ensure consistency and accuracy in data analysis and interpretation. + +Existing standards provide some prior art for this proposal: +- The ITK ecosystem uses three-letter acronyms (e.g., `RAS` for Right-Anterior-Superior) to describe anatomical orientation, but these acronyms are often ambiguous and require users to look up their meanings frequently. +- Nifti’s coordinate transforms assume data maps into `RAS`, but this relies on users being familiar with and adhering to the Nifti specification. +- The Brain Image Library uses a more explicit controlled vocabulary, asking submitters to choose orientation for each axis (e.g., `left-to-right`, `anterior-to-posterior`). This approach is used at the Allen Institute for Neural Dynamics and has been discussed in community forums. + +## Proposal + +We propose adding an `anatomicalOrientation` field to the `axes` metadata in the OME-NGFF specification. This field will use a controlled vocabulary to explicitly define the anatomical orientation of the array. + +### Controlled Vocabulary +The controlled vocabulary for the `anatomicalOrientation` field will include: +- `left-to-right` +- `right-to-left` +- `anterior-to-posterior` +- `posterior-to-anterior` +- `inferior-to-superior` +- `superior-to-inferior` +- `dorsal-to-ventral` +- `ventral-to-dorsal` +- `rostral-to-caudal` +- `caudal-to-rostral` + +### Default Value +If no orientation is specified, the default value will be `RAS` (Right-Anterior-Superior) to maintain consistency with the Nifti standard. + +### Implementation +The `anatomicalOrientation` field will be added to the `axes` metadata. This field will be separate from `longName`, which is uncontrolled. + +## Requirements + +The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [IETF RFC 2119](https://tools.ietf.org/html/rfc2119). + +## Stakeholders + +- **Facilitator:** The person appointed to shepherd this RFC through the RFC process. +- **Reviewers:** Key stakeholders and experts who will review and endorse the RFC. +- **Consulted:** Contributors and community members whose input will be considered. +- **Socialization:** This RFC was discussed at the Get Your Brain Together hackathon hosted at the Allen Institute. + +## Implementation + +The implementation will involve adding the `anatomicalOrientation` field to the `axes` metadata in the NGFF schema. The field will use the controlled vocabulary specified above, and the default value will be `RAS`. + +## Drawbacks, Risks, Alternatives, and Unknowns + +- **Costs:** Implementing this proposal will require updates to the NGFF specification and associated tools. +- **Risks:** Incorrect implementation or interpretation of the new field could lead to data misalignment. +- **Alternatives:** Continue using existing methods with assumed orientations, which is error-prone. +- **Unknowns:** The impact on existing tools and workflows needs to be evaluated. + +## Prior Art and References + +- [ITK Coordinate Systems](https://www.slicer.org/wiki/Coordinate_systems#Anatomical_coordinate_system) +- [Nifti Orientation](https://fsl.fmrib.ox.ac.uk/fsl/fslwiki/Orientation%20Explained#:~:text=A%20valid%20NIfTI%20image%20can,way%20aro) +- [Allen Institute Data Schema](https://github.com/AllenNeuralDynamics/aind-data-schema/blob/24d3899823557c7b45d1cdff844993dee3c63e9d/src/aind_data_schema/imaging/acquisition.py#L26) +- [Get Your Brain Together Hackathon Notes](https://github.com/InsightSoftwareConsortium/GetYourBrainTogether/blob/main/HCK02_2023_Allen_Institute_Hybrid/BoFBreakouts/Anatomic_orientation_in_OME-Zarr_NGFF_BoF_notes.md) + +## Future Possibilities + +Future work may include expanding the controlled vocabulary based on community feedback and evolving requirements. + +## Performance + +Explicitly defining anatomical orientation is expected to improve the accuracy and efficiency of downstream analysis, but specific performance metrics will need to be defined and evaluated. + +## Backwards Compatibility + +The proposed change is backwards compatible, as it introduces a new optional field without altering existing fields. + +## Security Considerations + +There are no known security impacts associated with this proposal. + +## Privacy Considerations + +There are no known privacy impacts associated with this proposal. + +## Testing + +Testing will include validating the presence and correctness of the `anatomicalOrientation` field in the metadata and ensuring compatibility with existing tools and workflows. + +## Tutorials and Examples + +Detailed examples and tutorials will be provided to demonstrate how to use the new `anatomicalOrientation` field in practice. + +--- + +This document is based on the [RFC template from Hashicorp](https://works.hashicorp.com/articles/rfc-template). + + +## Summary + +This RFC proposes the addition of an `anatomicalOrientation` field to the OME-NGFF specification. This field will provide explicit metadata about the anatomical orientation of an array, using a controlled vocabulary. The goal is to eliminate assumptions about orientation, which can lead to errors in downstream analysis and alignment to anatomical atlases. + +## Overview + +The anatomical orientation of an array is crucial metadata for downstream analysis, especially for aligning images to anatomical atlases. The current NGFF specification includes coordinate transformations but lacks explicit information about the anatomical orientation of the sample. This proposal aims to address this gap by adding an `anatomicalOrientation` field with a controlled vocabulary to the specification. + +## Background + +In the current OME-NGFF specification, the coordinate transformations are defined, but the anatomical orientation of the sample after applying these transformations is not specified. This omission forces tools to make assumptions about orientation, which can result in wasted time and erroneous analysis. + +Anatomical symmetry, such as in the brain, makes it impossible to retroactively determine the orientation of acquired data. By explicitly defining anatomical orientation in the specification, we can ensure consistency and accuracy in data analysis and interpretation. + +Existing standards provide some prior art for this proposal: +- The ITK ecosystem uses three-letter acronyms (e.g., `RAS` for Right-Anterior-Superior) to describe anatomical orientation, but these acronyms are often ambiguous and require users to look up their meanings frequently. +- Nifti’s coordinate transforms assume data maps into `RAS`, but this relies on users being familiar with and adhering to the Nifti specification. +- The Brain Image Library uses a more explicit controlled vocabulary, asking submitters to choose orientation for each axis (e.g., `left-to-right`, `anterior-to-posterior`). This approach is used at the Allen Institute for Neural Dynamics and has been discussed in community forums. + +## Proposal + +We propose adding an `anatomicalOrientation` field to the `axes` metadata in the OME-NGFF specification. This field will use a controlled vocabulary to explicitly define the anatomical orientation of the array. + +### Controlled Vocabulary +The controlled vocabulary for the `anatomicalOrientation` field will include: +- `left-to-right` +- `right-to-left` +- `anterior-to-posterior` +- `posterior-to-anterior` +- `inferior-to-superior` +- `superior-to-inferior` +- `dorsal-to-ventral` +- `ventral-to-dorsal` +- `rostral-to-caudal` +- `caudal-to-rostral` + +### Default Value +If no orientation is specified, the default value will be `RAS` (Right-Anterior-Superior) to maintain consistency with the Nifti standard. + +### Implementation +The `anatomicalOrientation` field will be added to the `axes` metadata. This field will be separate from `longName`, which is uncontrolled. + +## Requirements + +The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [IETF RFC 2119](https://tools.ietf.org/html/rfc2119). + +## Stakeholders + +- **Facilitator:** The person appointed to shepherd this RFC through the RFC process. +- **Reviewers:** Key stakeholders and experts who will review and endorse the RFC. +- **Consulted:** Contributors and community members whose input will be considered. +- **Socialization:** This RFC was discussed at the Get Your Brain Together hackathon hosted at the Allen Institute. + +## Implementation + +The implementation will involve adding the `anatomicalOrientation` field to the `axes` metadata in the NGFF schema. The field will use the controlled vocabulary specified above, and the default value will be `RAS`. + +## Drawbacks, Risks, Alternatives, and Unknowns + +- **Costs:** Implementing this proposal will require updates to the NGFF specification and associated tools. +- **Risks:** Incorrect implementation or interpretation of the new field could lead to data misalignment. +- **Alternatives:** Continue using existing methods with assumed orientations, which is error-prone. +- **Unknowns:** The impact on existing tools and workflows needs to be evaluated. + +## Prior Art and References + +- [ITK Coordinate Systems](https://www.slicer.org/wiki/Coordinate_systems#Anatomical_coordinate_system) +- [Nifti Orientation](https://fsl.fmrib.ox.ac.uk/fsl/fslwiki/Orientation%20Explained#:~:text=A%20valid%20NIfTI%20image%20can,way%20aro) +- [Allen Institute Data Schema](https://github.com/AllenNeuralDynamics/aind-data-schema/blob/24d3899823557c7b45d1cdff844993dee3c63e9d/src/aind_data_schema/imaging/acquisition.py#L26) +- [Get Your Brain Together Hackathon Notes](https://github.com/InsightSoftwareConsortium/GetYourBrainTogether/blob/main/HCK02_2023_Allen_Institute_Hybrid/BoFBreakouts/Anatomic_orientation_in_OME-Zarr_NGFF_BoF_notes.md) + +## Future Possibilities + +Future work may include expanding the controlled vocabulary based on community feedback and evolving requirements. + +## Performance + +Explicitly defining anatomical orientation is expected to improve the accuracy and efficiency of downstream analysis, but specific performance metrics will need to be defined and evaluated. + +## Backwards Compatibility + +The proposed change is backwards compatible, as it introduces a new optional field without altering existing fields. + +## Security Considerations + +There are no known security impacts associated with this proposal. + +## Privacy Considerations + +There are no known privacy impacts associated with this proposal. + +## Testing + +Testing will include validating the presence and correctness of the `anatomicalOrientation` field in the metadata and ensuring compatibility with existing tools and workflows. + +## Tutorials and Examples + +Detailed examples and tutorials will be provided to demonstrate how to use the new `anatomicalOrientation` field in practice. + +--- + +This document is based on the [RFC template from Hashicorp](https://works.hashicorp.com/articles/rfc-template). \ No newline at end of file diff --git a/rfc/x/markdown/Orientation.md b/rfc/x/markdown/Orientation.md new file mode 100644 index 00000000..ccd2348b --- /dev/null +++ b/rfc/x/markdown/Orientation.md @@ -0,0 +1,23 @@ + +# Enum: Orientation + +Anatomical orientation refers to the specific arrangement and directional alignment of anatomical structures within an imaging dataset. It is crucial for ensuring accurate alignment and comparison of images to anatomical atlases, facilitating consistent analysis and interpretation of biological data. + +URI: [ngff:Orientation](https://w3id.org/ome/ngff/Orientation) + + +## Permissible Values + +| Text | Description | Meaning | Other Information | +| :--- | :---: | :---: | ---: | +| left-to-right | Describes the directional orientation from the left side to the right side of an anatomical structure or body. | | | +| right-to-left | Describes the directional orientation from the right side to the left side of an anatomical structure or body. | | | +| anterior-to-posterior | Describes the directional orientation from the front (anterior) to the back (posterior) of an anatomical structure or body. | | | +| posterior-to-anterior | Describes the directional orientation from the back (posterior) to the front (anterior) of an anatomical structure or body. | | | +| inferior-to-superior | Describes the directional orientation from the lower (inferior) to the upper (superior) part of an anatomical structure or body. | | | +| superior-to-inferior | Describes the directional orientation from the upper (superior) to the lower (inferior) part of an anatomical structure or body. | | | +| dorsal-to-ventral | Describes the directional orientation from the back (dorsal) to the front (ventral) of an anatomical structure or body. | | | +| ventral-to-dorsal | Describes the directional orientation from the front (ventral) to the back (dorsal) of an anatomical structure or body. | | | +| rostral-to-caudal | Describes the directional orientation from the front (rostral) to the back (caudal) end of an anatomical structure, typically used in reference to the central nervous system. | | | +| caudal-to-rostral | Describes the directional orientation from the back (caudal) to the front (rostral) end of an anatomical structure, typically used in reference to the central nervous system. | | | + diff --git a/rfc/x/orientation.schema.json b/rfc/x/orientation.schema.json new file mode 100644 index 00000000..15954df1 --- /dev/null +++ b/rfc/x/orientation.schema.json @@ -0,0 +1,28 @@ +{ + "$defs": { + "Orientation": { + "description": "Anatomical orientation refers to the specific arrangement and directional alignment of anatomical structures within an imaging dataset. It is crucial for ensuring accurate alignment and comparison of images to anatomical atlases, facilitating consistent analysis and interpretation of biological data.", + "enum": [ + "left-to-right", + "right-to-left", + "anterior-to-posterior", + "posterior-to-anterior", + "inferior-to-superior", + "superior-to-inferior", + "dorsal-to-ventral", + "ventral-to-dorsal", + "rostral-to-caudal", + "caudal-to-rostral" + ], + "title": "Orientation", + "type": "string" + } + }, + "$id": "https://w3id.org/ome/ngff", + "$schema": "https://json-schema.org/draft/2019-09/schema", + "additionalProperties": true, + "metamodel_version": "1.7.0", + "title": "orientation", + "type": "object", + "version": "0.1.0" +} diff --git a/rfc/x/orientation.yml b/rfc/x/orientation.yml new file mode 100644 index 00000000..854b0dd5 --- /dev/null +++ b/rfc/x/orientation.yml @@ -0,0 +1,31 @@ +id: https://w3id.org/ome/ngff +name: orientation +version: 0.1.0 +description: >- + The orientation field provides explicit metadata about the anatomical orientation in an image using a + controlled vocabulary. The goal is to preserve essential biological information and eliminate assumptions + about orientation which can lead to errors in downstream analysis and alignment to anatomical atlases. +prefixes: + ome: https://w3id.org/ome/ + ngff: https://w3id.org/ome/ngff/ + linkml: https://w3id.org/linkml/ +imports: + - linkml:types +default_range: string +default_prefix: ngff + +enums: + Orientation: + description: >- + Anatomical orientation refers to the specific arrangement and directional alignment of anatomical structures within an imaging dataset. It is crucial for ensuring accurate alignment and comparison of images to anatomical atlases, facilitating consistent analysis and interpretation of biological data. + permissible_values: + left-to-right: Describes the directional orientation from the left side to the right side of an anatomical structure or body. + right-to-left: Describes the directional orientation from the right side to the left side of an anatomical structure or body. + anterior-to-posterior: Describes the directional orientation from the front (anterior) to the back (posterior) of an anatomical structure or body. + posterior-to-anterior: Describes the directional orientation from the back (posterior) to the front (anterior) of an anatomical structure or body. + inferior-to-superior: Describes the directional orientation from the lower (inferior) to the upper (superior) part of an anatomical structure or body. + superior-to-inferior: Describes the directional orientation from the upper (superior) to the lower (inferior) part of an anatomical structure or body. + dorsal-to-ventral: Describes the directional orientation from the back (dorsal) to the front (ventral) of an anatomical structure or body. + ventral-to-dorsal: Describes the directional orientation from the front (ventral) to the back (dorsal) of an anatomical structure or body. + rostral-to-caudal: Describes the directional orientation from the front (rostral) to the back (caudal) end of an anatomical structure, typically used in reference to the central nervous system. + caudal-to-rostral: Describes the directional orientation from the back (caudal) to the front (rostral) end of an anatomical structure, typically used in reference to the central nervous system. \ No newline at end of file diff --git a/rfc/x/pixi.lock b/rfc/x/pixi.lock new file mode 100644 index 00000000..ec0e4e95 --- /dev/null +++ b/rfc/x/pixi.lock @@ -0,0 +1,1245 @@ +version: 5 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4bc722e_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.4-h194c7f8_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3e/38/7859ff46355f76f8d19459005ca000b6e7012f2f1ca597746cbcd1fbfe5e/antlr4-python3-runtime-4.9.3.tar.gz + - pypi: https://files.pythonhosted.org/packages/f8/ed/e97229a566617f2ae958a6b13e7cc0f585470eac730a73e9e82c32a3cdd2/arrow-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e0/44/827b2a91a5816512fcaf3cc4ebc465ccd5d598c45cefa6703fcf4a79018f/attrs-23.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1c/d5/c84e1a17bf61d4df64ca866a1c9a913874b4e9bdc131ec689a0ad013fb36/certifi-2024.7.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/51/3e7e021920cfe2f7d18b672642e13f7dc4f53545d530b52ee6533b6681ca/CFGraph-0.2.1.tar.gz + - pypi: https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ee/fb/14d30eb4956408ee3ae09ad34299131fb383c47df355ddb428a7331cfa1e/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/8e/ee360a94aa8a2079e805044ea08cfffb61c7c30284ae784af97760e4a4ef/curies-0.7.10-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/8d/778b7d51b981a96554f29136cd59ca7880bf58094338085bcf2a979a0e6a/Deprecated-1.2.14-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/96/c2/3dd434b0108730014f1b96fd286040dc3bcb70066346f7e01ec2ac95865f/et_xmlfile-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/00/be/d59db2d1d52697c6adc9eacaf50e8965b6345cc143f671e1ed068818d5cf/graphviz-0.20.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/37/56b0da468a85e7704f3b2bc045015301bdf4be2184a44868c71f6dca6fe2/greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7b/24/61844afbf38acf419e01ca2639f7bd079584523d34471acbc4152ee991c5/hbreader-0.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/3e/741d8c82801c347547f8a2a06aa57dbb1992be9e948df2ea0eda2c8b79e8/idna-3.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b6/85/7882d311924cbcfc70b1890780763e36ff0b140c7e51c110fc59a532f087/isodate-0.6.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/00/cc/7fbd75d3362e939eb98bcf9bd22f3f7df8c237a85148899ed3d38e5614e5/json_flattener-0.1.9-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/57/38c47753c67ad67f76ba04ea673c9b77431a19e7b2601937e6872a99e841/jsonasobj-1.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/90/0d93963711f811efe528e3cead2f2bfb78c196df74d8a24fe8d655288e50/jsonasobj2-1.0.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/73/07/02e16ed01e04a374e644b575638ec7987ae846d25ad97bcc9945a3ee4b0e/jsonpatch-1.33-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/0a/3b1ee3721b4bd684b0e29c724ab82ed3b2c0e42285beb8bf9e18de8c903f/jsonpath_ng-1.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ee/07/44bd408781594c4d0a027666ef27fab1e441b109dc3b76b4f836f8fd04fe/jsonschema_specifications-2023.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d2/3e/e0dfcd090d710eb2b804f51bafafa202991c4a2388234a50f0492a4f02e5/linkml-1.8.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/48/47/cbddeb34d1ec97844465efaa55c4031267efed28de888d5c799e5396f968/linkml_dataops-0.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b1/15/b832a9b992a2934a9df312b6def412f077ee829fd795ee0fa5062482f2fc/linkml_runtime-1.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0a/0d/2454f072fae3b5a137c119abf15465d1771319dfe9e4acbb31722a0fff91/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d0/31/ba45bf0b2aa7898d81cbbfac0e88c267befb59ad91a19e36e1bc5578ddb1/parse-1.20.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/31/e8/715b09df3dab02b07809d812042dc47a46236b5603d9d3a2572dbd1d8a97/prefixcommons-0.1.12-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7c/76/41960fc3a60eb42c57075989fb5ea94fb887bb6997595410a099cf215921/prefixmaps-0.2.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1f/fa/b7f815b8c9ad021c07f88875b601222ef5e70619391ade4a49234d12d278/pydantic-2.8.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/09/b3/a5a54b47cccd1ab661ed5775235c5e06924753c2d4817737c5667bfa19a8/pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/96/ee/370c3b1908327dac967841ff723db391a02f3637c95c6898160e5ffe1060/PyJSG-0.11.10-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9d/ea/6d76df31432a0e6fdf81681a895f009a4bb47b3c39036db3e1b528191d52/pyparsing-3.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9b/48/efb1b1d3f3aee8cfc9f256738ca6e79ec362edbfc3a3abecbaf84db04643/PyShEx-0.8.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/39/7d/ff5000e0882f2b3995bef20b667945d3faa9289b556295e4cc5d2e91f104/PyShExC-0.9.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0f/f9/cf155cf32ca7d6fa3601bc4c5dd19086af4b320b706919d48a4c79081cf9/pytest-8.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/1e/fb11174c9eaebcec27d36e9e994b90ffa168bc3226925900b9dbbf16c9da/pytest-logging-2015.11.4.tar.gz + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/fd/499b261a34e9c6e39b9f5711c4b3093bca980b8db4b49de3009d808f41c9/PyTrie-0.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b4/33/720548182ffa8344418126017aa1d4ab4aeec9a2275f04ce3f3573d8ace8/PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d4/b0/7b7d8b5b0d01f1a0b12cc2e5038a868ef3a15825731b8a0d776cf47566c0/rdflib-7.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d0/d2/760527679057a7dad67f4e41f3e0c463b247f0bdbffc594e0add7c9077d6/rdflib_jsonld-0.6.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5f/97/d8a785d2c7131c731c90cb0e65af9400081af4380bea4ec04868dc21aa92/rdflib_shim-1.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/59/2056f61236782a2c86b33906c025d4f4a0b17be0161b63b70fd9e8775d36/referencing-0.35.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/65/d4/f7407c3d15d5ac779c3dd34fbbc6ea2090f77bd7dd12f207ccf881551208/rfc3987-1.3.8-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/54/91/ea027a9f835c2c59603236b451f7cb1ee5a280b9df26da7b4850e4f1a13a/rpds_py-0.19.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/73/67/8ece580cc363331d9a53055130f86b096bf16e38156e33b1d3014fffda6b/ruamel.yaml-0.18.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/30/d3/5fe978cd01a61c12efd24d65fa68c6f28f28c8073a06cf11db3a854390ca/ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/18/6e/d23bcde21d4ef0250a74e7505d2990d429f862be65810a3b650a69def7f0/ShExJSG-0.8.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/77/48ce09fce2836856588beb84f434c1f8812d1428326efd993b619d49d949/sparqlslurper-0.5.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/31/89/176e3db96e31e795d7dfd91dd67749d3d1f0316bb30c6931a6140e1a0477/SPARQLWrapper-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/60/f8/7794f3055d50e96cee04c19c7faeedacb323c7762f334660ba03bed95485/SQLAlchemy-2.0.31-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/c7/1b/af4f4c4f3f7339a4b7eb3c0ab13416db98f8ac09de3399129ee5fdfa282b/types_python_dateutil-2.9.0.20240316-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ca/1c/89ffc63a9605b583d5df2be791a27bc1a42b7c32bab68d3c8f2f73a98cd4/urllib3-2.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/24/01/a4034a94a5f1828eb050230e7cf13af3ac23cf763512b6afe008d3def97c/watchdog-4.0.1-py3-none-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/3b/45/0c30e10a2ac52606476394e4ba11cf3b12ba5823e7fbb9167f80eee6000a/webcolors-24.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/62/62/30ca2405de6a20448ee557ab2cd61ab9c5900be7cbd18a2639db595f0b98/wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl +packages: +- kind: conda + name: _libgcc_mutex + version: '0.1' + build: conda_forge + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + license: None + purls: [] + size: 2562 + timestamp: 1578324546067 +- kind: conda + name: _openmp_mutex + version: '4.5' + build: 2_gnu + build_number: 16 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 23621 + timestamp: 1650670423406 +- kind: pypi + name: annotated-types + version: 0.7.0 + url: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + sha256: 1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 + requires_dist: + - typing-extensions>=4.0.0 ; python_version < '3.9' + requires_python: '>=3.8' +- kind: pypi + name: antlr4-python3-runtime + version: 4.9.3 + url: https://files.pythonhosted.org/packages/3e/38/7859ff46355f76f8d19459005ca000b6e7012f2f1ca597746cbcd1fbfe5e/antlr4-python3-runtime-4.9.3.tar.gz + sha256: f224469b4168294902bb1efa80a8bf7855f24c99aef99cbefc1bcd3cce77881b + requires_dist: + - typing ; python_version < '3.5' +- kind: pypi + name: arrow + version: 1.3.0 + url: https://files.pythonhosted.org/packages/f8/ed/e97229a566617f2ae958a6b13e7cc0f585470eac730a73e9e82c32a3cdd2/arrow-1.3.0-py3-none-any.whl + sha256: c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80 + requires_dist: + - python-dateutil>=2.7.0 + - types-python-dateutil>=2.8.10 + - doc8 ; extra == 'doc' + - sphinx>=7.0.0 ; extra == 'doc' + - sphinx-autobuild ; extra == 'doc' + - sphinx-autodoc-typehints ; extra == 'doc' + - sphinx-rtd-theme>=1.3.0 ; extra == 'doc' + - dateparser==1.* ; extra == 'test' + - pre-commit ; extra == 'test' + - pytest ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-mock ; extra == 'test' + - pytz==2021.1 ; extra == 'test' + - simplejson==3.* ; extra == 'test' + requires_python: '>=3.8' +- kind: pypi + name: attrs + version: 23.2.0 + url: https://files.pythonhosted.org/packages/e0/44/827b2a91a5816512fcaf3cc4ebc465ccd5d598c45cefa6703fcf4a79018f/attrs-23.2.0-py3-none-any.whl + sha256: 99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1 + requires_dist: + - importlib-metadata ; python_version < '3.8' + - attrs[tests] ; extra == 'cov' + - coverage[toml]>=5.3 ; extra == 'cov' + - attrs[tests] ; extra == 'dev' + - pre-commit ; extra == 'dev' + - furo ; extra == 'docs' + - myst-parser ; extra == 'docs' + - sphinx ; extra == 'docs' + - sphinx-notfound-page ; extra == 'docs' + - sphinxcontrib-towncrier ; extra == 'docs' + - towncrier ; extra == 'docs' + - zope-interface ; extra == 'docs' + - attrs[tests-no-zope] ; extra == 'tests' + - zope-interface ; extra == 'tests' + - mypy>=1.6 ; (platform_python_implementation == 'CPython' and python_version >= '3.8') and extra == 'tests-mypy' + - pytest-mypy-plugins ; (platform_python_implementation == 'CPython' and python_version >= '3.8') and extra == 'tests-mypy' + - attrs[tests-mypy] ; extra == 'tests-no-zope' + - cloudpickle ; platform_python_implementation == 'CPython' and extra == 'tests-no-zope' + - hypothesis ; extra == 'tests-no-zope' + - pympler ; extra == 'tests-no-zope' + - pytest-xdist[psutil] ; extra == 'tests-no-zope' + - pytest>=4.3.0 ; extra == 'tests-no-zope' + requires_python: '>=3.7' +- kind: conda + name: bzip2 + version: 1.0.8 + build: h4bc722e_7 + build_number: 7 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 252783 + timestamp: 1720974456583 +- kind: conda + name: ca-certificates + version: 2024.7.4 + build: hbcca054_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda + sha256: c1548a3235376f464f9931850b64b02492f379b2f2bb98bc786055329b080446 + md5: 23ab7665c5f63cfb9f1f6195256daac6 + license: ISC + purls: [] + size: 154853 + timestamp: 1720077432978 +- kind: pypi + name: certifi + version: 2024.7.4 + url: https://files.pythonhosted.org/packages/1c/d5/c84e1a17bf61d4df64ca866a1c9a913874b4e9bdc131ec689a0ad013fb36/certifi-2024.7.4-py3-none-any.whl + sha256: c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 + requires_python: '>=3.6' +- kind: pypi + name: cfgraph + version: 0.2.1 + url: https://files.pythonhosted.org/packages/cb/51/3e7e021920cfe2f7d18b672642e13f7dc4f53545d530b52ee6533b6681ca/CFGraph-0.2.1.tar.gz + sha256: b57fe7044a10b8ff65aa3a8a8ddc7d4cd77bf511b42e57289cd52cbc29f8fe74 + requires_dist: + - rdflib>=0.4.2 +- kind: pypi + name: chardet + version: 5.2.0 + url: https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl + sha256: e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970 + requires_python: '>=3.7' +- kind: pypi + name: charset-normalizer + version: 3.3.2 + url: https://files.pythonhosted.org/packages/ee/fb/14d30eb4956408ee3ae09ad34299131fb383c47df355ddb428a7331cfa1e/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b + requires_python: '>=3.7.0' +- kind: pypi + name: click + version: 8.1.7 + url: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl + sha256: ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 + requires_dist: + - colorama ; platform_system == 'Windows' + - importlib-metadata ; python_version < '3.8' + requires_python: '>=3.7' +- kind: pypi + name: curies + version: 0.7.10 + url: https://files.pythonhosted.org/packages/dc/8e/ee360a94aa8a2079e805044ea08cfffb61c7c30284ae784af97760e4a4ef/curies-0.7.10-py3-none-any.whl + sha256: ad80f420dd76b6f3e921a245370ff6ab7473c48c29c17254970c03cd2e58af5f + requires_dist: + - pytrie + - pydantic + - requests + - sphinx ; extra == 'docs' + - sphinx-rtd-theme ; extra == 'docs' + - sphinx-automodapi ; extra == 'docs' + - fastapi ; extra == 'fastapi' + - python-multipart ; extra == 'fastapi' + - httpx ; extra == 'fastapi' + - defusedxml ; extra == 'fastapi' + - uvicorn ; extra == 'fastapi' + - flask ; extra == 'flask' + - defusedxml ; extra == 'flask' + - pandas ; extra == 'pandas' + - rdflib ; extra == 'rdflib' + - pytest ; extra == 'tests' + - coverage ; extra == 'tests' + requires_python: '>=3.8' +- kind: pypi + name: deprecated + version: 1.2.14 + url: https://files.pythonhosted.org/packages/20/8d/778b7d51b981a96554f29136cd59ca7880bf58094338085bcf2a979a0e6a/Deprecated-1.2.14-py2.py3-none-any.whl + sha256: 6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c + requires_dist: + - wrapt<2,>=1.10 + - tox ; extra == 'dev' + - pytest ; extra == 'dev' + - pytest-cov ; extra == 'dev' + - bump2version<1 ; extra == 'dev' + - sphinx<2 ; extra == 'dev' + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*' +- kind: pypi + name: et-xmlfile + version: 1.1.0 + url: https://files.pythonhosted.org/packages/96/c2/3dd434b0108730014f1b96fd286040dc3bcb70066346f7e01ec2ac95865f/et_xmlfile-1.1.0-py3-none-any.whl + sha256: a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada + requires_python: '>=3.6' +- kind: pypi + name: fqdn + version: 1.5.1 + url: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl + sha256: 3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014 + requires_dist: + - cached-property>=1.3.0 ; python_version < '3.8' + requires_python: '>=2.7,!=3.0,!=3.1,!=3.2,!=3.3,!=3.4,<4' +- kind: pypi + name: graphviz + version: 0.20.3 + url: https://files.pythonhosted.org/packages/00/be/d59db2d1d52697c6adc9eacaf50e8965b6345cc143f671e1ed068818d5cf/graphviz-0.20.3-py3-none-any.whl + sha256: 81f848f2904515d8cd359cc611faba817598d2feaac4027b266aa3eda7b3dde5 + requires_dist: + - tox>=3 ; extra == 'dev' + - flake8 ; extra == 'dev' + - pep8-naming ; extra == 'dev' + - wheel ; extra == 'dev' + - twine ; extra == 'dev' + - sphinx<7,>=5 ; extra == 'docs' + - sphinx-autodoc-typehints ; extra == 'docs' + - sphinx-rtd-theme ; extra == 'docs' + - pytest<8.1,>=7 ; extra == 'test' + - pytest-mock>=3 ; extra == 'test' + - pytest-cov ; extra == 'test' + - coverage ; extra == 'test' + requires_python: '>=3.8' +- kind: pypi + name: greenlet + version: 3.0.3 + url: https://files.pythonhosted.org/packages/bd/37/56b0da468a85e7704f3b2bc045015301bdf4be2184a44868c71f6dca6fe2/greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + sha256: fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf + requires_dist: + - sphinx ; extra == 'docs' + - furo ; extra == 'docs' + - objgraph ; extra == 'test' + - psutil ; extra == 'test' + requires_python: '>=3.7' +- kind: pypi + name: hbreader + version: 0.9.1 + url: https://files.pythonhosted.org/packages/7b/24/61844afbf38acf419e01ca2639f7bd079584523d34471acbc4152ee991c5/hbreader-0.9.1-py3-none-any.whl + sha256: 9a6e76c9d1afc1b977374a5dc430a1ebb0ea0488205546d4678d6e31cc5f6801 + requires_python: '>=3.7' +- kind: pypi + name: idna + version: '3.7' + url: https://files.pythonhosted.org/packages/e5/3e/741d8c82801c347547f8a2a06aa57dbb1992be9e948df2ea0eda2c8b79e8/idna-3.7-py3-none-any.whl + sha256: 82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 + requires_python: '>=3.5' +- kind: pypi + name: iniconfig + version: 2.0.0 + url: https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl + sha256: b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 + requires_python: '>=3.7' +- kind: pypi + name: isodate + version: 0.6.1 + url: https://files.pythonhosted.org/packages/b6/85/7882d311924cbcfc70b1890780763e36ff0b140c7e51c110fc59a532f087/isodate-0.6.1-py2.py3-none-any.whl + sha256: 0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96 + requires_dist: + - six +- kind: pypi + name: isoduration + version: 20.11.0 + url: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl + sha256: b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042 + requires_dist: + - arrow>=0.15.0 + requires_python: '>=3.7' +- kind: pypi + name: jinja2 + version: 3.1.4 + url: https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl + sha256: bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d + requires_dist: + - markupsafe>=2.0 + - babel>=2.7 ; extra == 'i18n' + requires_python: '>=3.7' +- kind: pypi + name: json-flattener + version: 0.1.9 + url: https://files.pythonhosted.org/packages/00/cc/7fbd75d3362e939eb98bcf9bd22f3f7df8c237a85148899ed3d38e5614e5/json_flattener-0.1.9-py3-none-any.whl + sha256: 6b027746f08bf37a75270f30c6690c7149d5f704d8af1740c346a3a1236bc941 + requires_dist: + - click + - pyyaml + requires_python: '>=3.7.0' +- kind: pypi + name: jsonasobj + version: 1.3.1 + url: https://files.pythonhosted.org/packages/71/57/38c47753c67ad67f76ba04ea673c9b77431a19e7b2601937e6872a99e841/jsonasobj-1.3.1-py3-none-any.whl + sha256: b9e329dc1ceaae7cf5d5b214684a0b100e0dad0be6d5bbabac281ec35ddeca65 +- kind: pypi + name: jsonasobj2 + version: 1.0.4 + url: https://files.pythonhosted.org/packages/e5/90/0d93963711f811efe528e3cead2f2bfb78c196df74d8a24fe8d655288e50/jsonasobj2-1.0.4-py3-none-any.whl + sha256: 12e86f86324d54fcf60632db94ea74488d5314e3da554c994fe1e2c6f29acb79 + requires_dist: + - hbreader + requires_python: '>=3.6' +- kind: pypi + name: jsonpatch + version: '1.33' + url: https://files.pythonhosted.org/packages/73/07/02e16ed01e04a374e644b575638ec7987ae846d25ad97bcc9945a3ee4b0e/jsonpatch-1.33-py2.py3-none-any.whl + sha256: 0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade + requires_dist: + - jsonpointer>=1.9 + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*' +- kind: pypi + name: jsonpath-ng + version: 1.6.1 + url: https://files.pythonhosted.org/packages/16/0a/3b1ee3721b4bd684b0e29c724ab82ed3b2c0e42285beb8bf9e18de8c903f/jsonpath_ng-1.6.1-py3-none-any.whl + sha256: 8f22cd8273d7772eea9aaa84d922e0841aa36fdb8a2c6b7f6c3791a16a9bc0be + requires_dist: + - ply +- kind: pypi + name: jsonpointer + version: 3.0.0 + url: https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl + sha256: 13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942 + requires_python: '>=3.7' +- kind: pypi + name: jsonschema + version: 4.23.0 + url: https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl + sha256: fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566 + requires_dist: + - attrs>=22.2.0 + - importlib-resources>=1.4.0 ; python_version < '3.9' + - jsonschema-specifications>=2023.3.6 + - pkgutil-resolve-name>=1.3.10 ; python_version < '3.9' + - referencing>=0.28.4 + - rpds-py>=0.7.1 + - fqdn ; extra == 'format' + - idna ; extra == 'format' + - isoduration ; extra == 'format' + - jsonpointer>1.13 ; extra == 'format' + - rfc3339-validator ; extra == 'format' + - rfc3987 ; extra == 'format' + - uri-template ; extra == 'format' + - webcolors>=1.11 ; extra == 'format' + - fqdn ; extra == 'format-nongpl' + - idna ; extra == 'format-nongpl' + - isoduration ; extra == 'format-nongpl' + - jsonpointer>1.13 ; extra == 'format-nongpl' + - rfc3339-validator ; extra == 'format-nongpl' + - rfc3986-validator>0.1.0 ; extra == 'format-nongpl' + - uri-template ; extra == 'format-nongpl' + - webcolors>=24.6.0 ; extra == 'format-nongpl' + requires_python: '>=3.8' +- kind: pypi + name: jsonschema-specifications + version: 2023.12.1 + url: https://files.pythonhosted.org/packages/ee/07/44bd408781594c4d0a027666ef27fab1e441b109dc3b76b4f836f8fd04fe/jsonschema_specifications-2023.12.1-py3-none-any.whl + sha256: 87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c + requires_dist: + - importlib-resources>=1.4.0 ; python_version < '3.9' + - referencing>=0.31.0 + requires_python: '>=3.8' +- kind: conda + name: ld_impl_linux-64 + version: '2.40' + build: hf3520f5_7 + build_number: 7 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda + sha256: 764b6950aceaaad0c67ef925417594dd14cd2e22fff864aeef455ac259263d15 + md5: b80f2f396ca2c28b8c14c437a4ed1e74 + constrains: + - binutils_impl_linux-64 2.40 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 707602 + timestamp: 1718625640445 +- kind: conda + name: libexpat + version: 2.6.2 + build: h59595ed_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda + sha256: 331bb7c7c05025343ebd79f86ae612b9e1e74d2687b8f3179faec234f986ce19 + md5: e7ba12deb7020dd080c6c70e7b6f6a3d + depends: + - libgcc-ng >=12 + constrains: + - expat 2.6.2.* + license: MIT + license_family: MIT + purls: [] + size: 73730 + timestamp: 1710362120304 +- kind: conda + name: libffi + version: 3.4.2 + build: h7f98852_5 + build_number: 5 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e + md5: d645c6d2ac96843a2bfaccd2d62b3ac3 + depends: + - libgcc-ng >=9.4.0 + license: MIT + license_family: MIT + purls: [] + size: 58292 + timestamp: 1636488182923 +- kind: conda + name: libgcc-ng + version: 14.1.0 + build: h77fa898_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda + sha256: b8e869ac96591cda2704bf7e77a301025e405227791a0bddf14a3dac65125538 + md5: ca0fad6a41ddaef54a153b78eccb5037 + depends: + - _libgcc_mutex 0.1 conda_forge + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.1.0 h77fa898_0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 842109 + timestamp: 1719538896937 +- kind: conda + name: libgomp + version: 14.1.0 + build: h77fa898_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda + sha256: 7699df61a1f6c644b3576a40f54791561f2845983120477a16116b951c9cdb05 + md5: ae061a5ed5f05818acdf9adab72c146d + depends: + - _libgcc_mutex 0.1 conda_forge + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 456925 + timestamp: 1719538796073 +- kind: conda + name: libnsl + version: 2.0.1 + build: hd590300_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + depends: + - libgcc-ng >=12 + license: LGPL-2.1-only + license_family: GPL + purls: [] + size: 33408 + timestamp: 1697359010159 +- kind: conda + name: libsqlite + version: 3.46.0 + build: hde9e2c9_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda + sha256: daee3f68786231dad457d0dfde3f7f1f9a7f2018adabdbb864226775101341a8 + md5: 18aa975d2094c34aef978060ae7da7d8 + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0a0 + license: Unlicense + purls: [] + size: 865346 + timestamp: 1718050628718 +- kind: conda + name: libuuid + version: 2.38.1 + build: h0b41bf4_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 33601 + timestamp: 1680112270483 +- kind: conda + name: libxcrypt + version: 4.4.36 + build: hd590300_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + license: LGPL-2.1-or-later + purls: [] + size: 100393 + timestamp: 1702724383534 +- kind: conda + name: libzlib + version: 1.3.1 + build: h4ab18f5_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda + sha256: adf6096f98b537a11ae3729eaa642b0811478f0ea0402ca67b5108fe2cb0010d + md5: 57d7dc60e9325e3de37ff8dffd18e814 + depends: + - libgcc-ng >=12 + constrains: + - zlib 1.3.1 *_1 + license: Zlib + license_family: Other + purls: [] + size: 61574 + timestamp: 1716874187109 +- kind: pypi + name: linkml + version: 1.8.1 + url: https://files.pythonhosted.org/packages/d2/3e/e0dfcd090d710eb2b804f51bafafa202991c4a2388234a50f0492a4f02e5/linkml-1.8.1-py3-none-any.whl + sha256: a68cb4f9bfa16353a4f84ae581db8272a5d151db46f1d6b601c87cb0be6e2d28 + requires_dist: + - antlr4-python3-runtime>=4.9.0,<4.10 + - black>=24.0.0 ; extra == 'black' or extra == 'tests' + - click>=7.0 + - graphviz>=0.10.1 + - hbreader + - isodate>=0.6.0 + - jinja2>=3.1.0 + - jsonasobj2>=1.0.3,<2.0.0 + - jsonschema[format]>=4.0.0 + - linkml-dataops + - linkml-runtime==1.8.0 + - openpyxl + - parse + - prefixcommons>=0.1.7 + - prefixmaps>=0.2.2 + - pydantic>=1.0.0,<3.0.0 + - pyjsg>=0.11.6 + - pyshacl>=0.25.0,<0.26.0 ; extra == 'shacl' or extra == 'tests' + - pyshex>=0.7.20 + - pyshexc>=0.8.3 + - python-dateutil + - pyyaml + - rdflib>=6.0.0 + - requests>=2.22 + - sqlalchemy>=1.4.31 + - typing-extensions>=4.4.0 ; python_version < '3.9' + - watchdog>=0.9.0 + requires_python: '>=3.8.1,<4.0.0' +- kind: pypi + name: linkml-dataops + version: 0.1.0 + url: https://files.pythonhosted.org/packages/48/47/cbddeb34d1ec97844465efaa55c4031267efed28de888d5c799e5396f968/linkml_dataops-0.1.0-py3-none-any.whl + sha256: 193cf7f659e5f07946d2c2761896910d5f7151d91282543b1363801f68307f4c + requires_dist: + - jinja2 + - jsonpatch + - jsonpath-ng + - linkml-runtime>=1.1.6 + - ruamel-yaml + requires_python: '>=3.7' +- kind: pypi + name: linkml-runtime + version: 1.8.0 + url: https://files.pythonhosted.org/packages/b1/15/b832a9b992a2934a9df312b6def412f077ee829fd795ee0fa5062482f2fc/linkml_runtime-1.8.0-py3-none-any.whl + sha256: e99a809eda52640633f07a9e8b391d1a9da863eb68a475dfd74a79335b909931 + requires_dist: + - click + - curies>=0.5.4 + - deprecated + - hbreader + - json-flattener>=0.1.9 + - jsonasobj2>=1.0.4,<2.dev0 + - jsonschema>=3.2.0 + - prefixcommons>=0.1.12 + - prefixmaps>=0.1.4 + - pydantic>=1.10.2,<3.0.0 + - pyyaml + - rdflib>=6.0.0 + - requests + requires_python: '>=3.8,<4.0' +- kind: pypi + name: markupsafe + version: 2.1.5 + url: https://files.pythonhosted.org/packages/0a/0d/2454f072fae3b5a137c119abf15465d1771319dfe9e4acbb31722a0fff91/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5 + requires_python: '>=3.7' +- kind: conda + name: ncurses + version: '6.5' + build: h59595ed_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda + sha256: 4fc3b384f4072b68853a0013ea83bdfd3d66b0126e2238e1d6e1560747aa7586 + md5: fcea371545eda051b6deafb24889fc69 + depends: + - libgcc-ng >=12 + license: X11 AND BSD-3-Clause + purls: [] + size: 887465 + timestamp: 1715194722503 +- kind: pypi + name: openpyxl + version: 3.1.5 + url: https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl + sha256: 5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2 + requires_dist: + - et-xmlfile + requires_python: '>=3.8' +- kind: conda + name: openssl + version: 3.3.1 + build: h4bc722e_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4bc722e_2.conda + sha256: b294b3cc706ad1048cdb514f0db3da9f37ae3fcc0c53a7104083dd0918adb200 + md5: e1b454497f9f7c1147fdde4b53f1b512 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc-ng >=12 + constrains: + - pyopenssl >=22.1 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2895213 + timestamp: 1721194688955 +- kind: pypi + name: packaging + version: '24.1' + url: https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl + sha256: 5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 + requires_python: '>=3.8' +- kind: pypi + name: parse + version: 1.20.2 + url: https://files.pythonhosted.org/packages/d0/31/ba45bf0b2aa7898d81cbbfac0e88c267befb59ad91a19e36e1bc5578ddb1/parse-1.20.2-py2.py3-none-any.whl + sha256: 967095588cb802add9177d0c0b6133b5ba33b1ea9007ca800e526f42a85af558 +- kind: pypi + name: pluggy + version: 1.5.0 + url: https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl + sha256: 44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 + requires_dist: + - pre-commit ; extra == 'dev' + - tox ; extra == 'dev' + - pytest ; extra == 'testing' + - pytest-benchmark ; extra == 'testing' + requires_python: '>=3.8' +- kind: pypi + name: ply + version: '3.11' + url: https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl + sha256: 096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce +- kind: pypi + name: prefixcommons + version: 0.1.12 + url: https://files.pythonhosted.org/packages/31/e8/715b09df3dab02b07809d812042dc47a46236b5603d9d3a2572dbd1d8a97/prefixcommons-0.1.12-py3-none-any.whl + sha256: 16dbc0a1f775e003c724f19a694fcfa3174608f5c8b0e893d494cf8098ac7f8b + requires_dist: + - pyyaml>=6.0,<7.0 + - click>=8.1.3,<9.0.0 + - pytest-logging>=2015.11.4,<2016.0.0 + - requests>=2.28.1,<3.0.0 + requires_python: '>=3.7,<4.0' +- kind: pypi + name: prefixmaps + version: 0.2.5 + url: https://files.pythonhosted.org/packages/7c/76/41960fc3a60eb42c57075989fb5ea94fb887bb6997595410a099cf215921/prefixmaps-0.2.5-py3-none-any.whl + sha256: 68caa04b3a6a8e058aa1c55affe32c62e44b564d031d63f768e267b796a1f3ee + requires_dist: + - curies>=0.5.3 + - pyyaml>=5.3.1 + requires_python: '>=3.8,<4.0' +- kind: pypi + name: pydantic + version: 2.8.2 + url: https://files.pythonhosted.org/packages/1f/fa/b7f815b8c9ad021c07f88875b601222ef5e70619391ade4a49234d12d278/pydantic-2.8.2-py3-none-any.whl + sha256: 73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8 + requires_dist: + - annotated-types>=0.4.0 + - pydantic-core==2.20.1 + - typing-extensions>=4.12.2 ; python_version >= '3.13' + - typing-extensions>=4.6.1 ; python_version < '3.13' + - email-validator>=2.0.0 ; extra == 'email' + requires_python: '>=3.8' +- kind: pypi + name: pydantic-core + version: 2.20.1 + url: https://files.pythonhosted.org/packages/09/b3/a5a54b47cccd1ab661ed5775235c5e06924753c2d4817737c5667bfa19a8/pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e + requires_dist: + - typing-extensions>=4.6.0,!=4.7.0 + requires_python: '>=3.8' +- kind: pypi + name: pyjsg + version: 0.11.10 + url: https://files.pythonhosted.org/packages/96/ee/370c3b1908327dac967841ff723db391a02f3637c95c6898160e5ffe1060/PyJSG-0.11.10-py3-none-any.whl + sha256: 10af60ff42219be7e85bf7f11c19b648715b0b29eb2ddbd269e87069a7c3f26d + requires_dist: + - antlr4-python3-runtime~=4.9.3 + - jsonasobj>=1.2.1 +- kind: pypi + name: pyparsing + version: 3.1.2 + url: https://files.pythonhosted.org/packages/9d/ea/6d76df31432a0e6fdf81681a895f009a4bb47b3c39036db3e1b528191d52/pyparsing-3.1.2-py3-none-any.whl + sha256: f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742 + requires_dist: + - railroad-diagrams ; extra == 'diagrams' + - jinja2 ; extra == 'diagrams' + requires_python: '>=3.6.8' +- kind: pypi + name: pyshex + version: 0.8.1 + url: https://files.pythonhosted.org/packages/9b/48/efb1b1d3f3aee8cfc9f256738ca6e79ec362edbfc3a3abecbaf84db04643/PyShEx-0.8.1-py3-none-any.whl + sha256: 6da1b10123e191abf8dcb6bf3e54aa3e1fcf771df5d1a0ed453217c8900c8e6a + requires_dist: + - cfgraph>=0.2.1 + - chardet + - pyshexc==0.9.1 + - rdflib-shim + - requests>=2.22.0 + - shexjsg>=0.8.2 + - sparqlslurper>=0.5.1 + - sparqlwrapper>=1.8.5 + - urllib3 + requires_python: '>=3.6' +- kind: pypi + name: pyshexc + version: 0.9.1 + url: https://files.pythonhosted.org/packages/39/7d/ff5000e0882f2b3995bef20b667945d3faa9289b556295e4cc5d2e91f104/PyShExC-0.9.1-py2.py3-none-any.whl + sha256: efc55ed5cb2453e9df569b03e282505e96bb06597934288f3b23dd980ef10028 + requires_dist: + - antlr4-python3-runtime~=4.9.3 + - chardet + - jsonasobj>=1.2.1 + - pyjsg>=0.11.10 + - rdflib-shim + - shexjsg>=0.8.1 + requires_python: '>=3.7' +- kind: pypi + name: pytest + version: 8.3.2 + url: https://files.pythonhosted.org/packages/0f/f9/cf155cf32ca7d6fa3601bc4c5dd19086af4b320b706919d48a4c79081cf9/pytest-8.3.2-py3-none-any.whl + sha256: 4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5 + requires_dist: + - iniconfig + - packaging + - pluggy<2,>=1.5 + - exceptiongroup>=1.0.0rc8 ; python_version < '3.11' + - tomli>=1 ; python_version < '3.11' + - colorama ; sys_platform == 'win32' + - argcomplete ; extra == 'dev' + - attrs>=19.2 ; extra == 'dev' + - hypothesis>=3.56 ; extra == 'dev' + - mock ; extra == 'dev' + - pygments>=2.7.2 ; extra == 'dev' + - requests ; extra == 'dev' + - setuptools ; extra == 'dev' + - xmlschema ; extra == 'dev' + requires_python: '>=3.8' +- kind: pypi + name: pytest-logging + version: 2015.11.4 + url: https://files.pythonhosted.org/packages/dc/1e/fb11174c9eaebcec27d36e9e994b90ffa168bc3226925900b9dbbf16c9da/pytest-logging-2015.11.4.tar.gz + sha256: cec5c85ecf18aab7b2ead5498a31b9f758680ef5a902b9054ab3f2bdbb77c896 + requires_dist: + - pytest>=2.8.1 +- kind: conda + name: python + version: 3.12.4 + build: h194c7f8_0_cpython + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.4-h194c7f8_0_cpython.conda + sha256: 97a78631e6c928bf7ad78d52f7f070fcf3bd37619fa48dc4394c21cf3058cdee + md5: d73490214f536cccb5819e9873048c92 + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.2,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc-ng >=12 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.46.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.3.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - xz >=5.2.6,<6.0a0 + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + purls: [] + size: 32073625 + timestamp: 1718621771849 +- kind: pypi + name: python-dateutil + version: 2.9.0.post0 + url: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + sha256: a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 + requires_dist: + - six>=1.5 + requires_python: '!=3.0.*,!=3.1.*,!=3.2.*,>=2.7' +- kind: pypi + name: pytrie + version: 0.4.0 + url: https://files.pythonhosted.org/packages/b9/fd/499b261a34e9c6e39b9f5711c4b3093bca980b8db4b49de3009d808f41c9/PyTrie-0.4.0-py3-none-any.whl + sha256: f687c224ee8c66cda8e8628a903011b692635ffbb08d4b39c5f92b18eb78c950 + requires_dist: + - sortedcontainers +- kind: pypi + name: pyyaml + version: 6.0.1 + url: https://files.pythonhosted.org/packages/b4/33/720548182ffa8344418126017aa1d4ab4aeec9a2275f04ce3f3573d8ace8/PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0 + requires_python: '>=3.6' +- kind: pypi + name: rdflib + version: 7.0.0 + url: https://files.pythonhosted.org/packages/d4/b0/7b7d8b5b0d01f1a0b12cc2e5038a868ef3a15825731b8a0d776cf47566c0/rdflib-7.0.0-py3-none-any.whl + sha256: 0438920912a642c866a513de6fe8a0001bd86ef975057d6962c79ce4771687cd + requires_dist: + - berkeleydb>=18.1.0,<19.0.0 ; extra == 'berkeleydb' + - html5lib>=1.0,<2.0 ; extra == 'html' + - isodate>=0.6.0,<0.7.0 + - lxml>=4.3.0,<5.0.0 ; extra == 'lxml' + - networkx>=2.0.0,<3.0.0 ; extra == 'networkx' + - pyparsing>=2.1.0,<4 + requires_python: '>=3.8.1,<4.0.0' +- kind: pypi + name: rdflib-jsonld + version: 0.6.1 + url: https://files.pythonhosted.org/packages/d0/d2/760527679057a7dad67f4e41f3e0c463b247f0bdbffc594e0add7c9077d6/rdflib_jsonld-0.6.1-py2.py3-none-any.whl + sha256: bcf84317e947a661bae0a3f2aee1eced697075fc4ac4db6065a3340ea0f10fc2 + requires_dist: + - rdflib>=5.0.0 +- kind: pypi + name: rdflib-shim + version: 1.0.3 + url: https://files.pythonhosted.org/packages/5f/97/d8a785d2c7131c731c90cb0e65af9400081af4380bea4ec04868dc21aa92/rdflib_shim-1.0.3-py3-none-any.whl + sha256: 7a853e7750ef1e9bf4e35dea27d54e02d4ed087de5a9e0c329c4a6d82d647081 + requires_dist: + - rdflib>=5.0.0 + - rdflib-jsonld==0.6.1 + requires_python: '>=3.7' +- kind: conda + name: readline + version: '8.2' + build: h8228510_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + sha256: 5435cf39d039387fbdc977b0a762357ea909a7694d9528ab40f005e9208744d7 + md5: 47d31b792659ce70f470b5c82fdfb7a4 + depends: + - libgcc-ng >=12 + - ncurses >=6.3,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 281456 + timestamp: 1679532220005 +- kind: pypi + name: referencing + version: 0.35.1 + url: https://files.pythonhosted.org/packages/b7/59/2056f61236782a2c86b33906c025d4f4a0b17be0161b63b70fd9e8775d36/referencing-0.35.1-py3-none-any.whl + sha256: eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de + requires_dist: + - attrs>=22.2.0 + - rpds-py>=0.7.0 + requires_python: '>=3.8' +- kind: pypi + name: requests + version: 2.32.3 + url: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl + sha256: 70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 + requires_dist: + - charset-normalizer<4,>=2 + - idna<4,>=2.5 + - urllib3<3,>=1.21.1 + - certifi>=2017.4.17 + - pysocks!=1.5.7,>=1.5.6 ; extra == 'socks' + - chardet<6,>=3.0.2 ; extra == 'use-chardet-on-py3' + requires_python: '>=3.8' +- kind: pypi + name: rfc3339-validator + version: 0.1.4 + url: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl + sha256: 24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa + requires_dist: + - six + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*' +- kind: pypi + name: rfc3987 + version: 1.3.8 + url: https://files.pythonhosted.org/packages/65/d4/f7407c3d15d5ac779c3dd34fbbc6ea2090f77bd7dd12f207ccf881551208/rfc3987-1.3.8-py2.py3-none-any.whl + sha256: 10702b1e51e5658843460b189b185c0366d2cf4cff716f13111b0ea9fd2dce53 +- kind: pypi + name: rpds-py + version: 0.19.1 + url: https://files.pythonhosted.org/packages/54/91/ea027a9f835c2c59603236b451f7cb1ee5a280b9df26da7b4850e4f1a13a/rpds_py-0.19.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 08ce9c95a0b093b7aec75676b356a27879901488abc27e9d029273d280438505 + requires_python: '>=3.8' +- kind: pypi + name: ruamel-yaml + version: 0.18.6 + url: https://files.pythonhosted.org/packages/73/67/8ece580cc363331d9a53055130f86b096bf16e38156e33b1d3014fffda6b/ruamel.yaml-0.18.6-py3-none-any.whl + sha256: 57b53ba33def16c4f3d807c0ccbc00f8a6081827e81ba2491691b76882d0c636 + requires_dist: + - ruamel-yaml-clib>=0.2.7 ; platform_python_implementation == 'CPython' and python_version < '3.13' + - ryd ; extra == 'docs' + - mercurial>5.7 ; extra == 'docs' + - ruamel-yaml-jinja2>=0.2 ; extra == 'jinja2' + requires_python: '>=3.7' +- kind: pypi + name: ruamel-yaml-clib + version: 0.2.8 + url: https://files.pythonhosted.org/packages/30/d3/5fe978cd01a61c12efd24d65fa68c6f28f28c8073a06cf11db3a854390ca/ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl + sha256: d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92 + requires_python: '>=3.6' +- kind: pypi + name: shexjsg + version: 0.8.2 + url: https://files.pythonhosted.org/packages/18/6e/d23bcde21d4ef0250a74e7505d2990d429f862be65810a3b650a69def7f0/ShExJSG-0.8.2-py2.py3-none-any.whl + sha256: 3b0d8432dd313bee9e1343382c5e02e9908dd941a7dd7342bf8c0200fe523766 + requires_dist: + - pyjsg>=0.11.10 +- kind: pypi + name: six + version: 1.16.0 + url: https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl + sha256: 8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*' +- kind: pypi + name: sortedcontainers + version: 2.4.0 + url: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl + sha256: a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 +- kind: pypi + name: sparqlslurper + version: 0.5.1 + url: https://files.pythonhosted.org/packages/1a/77/48ce09fce2836856588beb84f434c1f8812d1428326efd993b619d49d949/sparqlslurper-0.5.1-py3-none-any.whl + sha256: ae49b2d8ce3dd38df7a40465b228ad5d33fb7e11b3f248d195f9cadfc9cfff87 + requires_dist: + - rdflib-shim + - rdflib>=5.0.0 + - sparqlwrapper>=1.8.2 + requires_python: '>=3.7.4' +- kind: pypi + name: sparqlwrapper + version: 2.0.0 + url: https://files.pythonhosted.org/packages/31/89/176e3db96e31e795d7dfd91dd67749d3d1f0316bb30c6931a6140e1a0477/SPARQLWrapper-2.0.0-py3-none-any.whl + sha256: c99a7204fff676ee28e6acef327dc1ff8451c6f7217dcd8d49e8872f324a8a20 + requires_dist: + - rdflib>=6.1.1 + - setuptools>=3.7.1 ; extra == 'dev' + - mypy>=0.931 ; extra == 'dev' + - pandas>=1.3.5 ; extra == 'dev' + - pandas-stubs>=1.2.0.48 ; extra == 'dev' + - sphinx<5 ; extra == 'docs' + - sphinx-rtd-theme ; extra == 'docs' + - keepalive>=0.5 ; extra == 'keepalive' + - pandas>=1.3.5 ; extra == 'pandas' + requires_python: '>=3.7' +- kind: pypi + name: sqlalchemy + version: 2.0.31 + url: https://files.pythonhosted.org/packages/60/f8/7794f3055d50e96cee04c19c7faeedacb323c7762f334660ba03bed95485/SQLAlchemy-2.0.31-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 74afabeeff415e35525bf7a4ecdab015f00e06456166a2eba7590e49f8db940e + requires_dist: + - typing-extensions>=4.6.0 + - greenlet!=0.4.17 ; python_version < '3.13' and (platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))) + - importlib-metadata ; python_version < '3.8' + - greenlet!=0.4.17 ; extra == 'aiomysql' + - aiomysql>=0.2.0 ; extra == 'aiomysql' + - greenlet!=0.4.17 ; extra == 'aioodbc' + - aioodbc ; extra == 'aioodbc' + - greenlet!=0.4.17 ; extra == 'aiosqlite' + - aiosqlite ; extra == 'aiosqlite' + - typing-extensions!=3.10.0.1 ; extra == 'aiosqlite' + - greenlet!=0.4.17 ; extra == 'asyncio' + - greenlet!=0.4.17 ; extra == 'asyncmy' + - asyncmy!=0.2.4,!=0.2.6,>=0.2.3 ; extra == 'asyncmy' + - mariadb!=1.1.2,!=1.1.5,>=1.0.1 ; extra == 'mariadb-connector' + - pyodbc ; extra == 'mssql' + - pymssql ; extra == 'mssql-pymssql' + - pyodbc ; extra == 'mssql-pyodbc' + - mypy>=0.910 ; extra == 'mypy' + - mysqlclient>=1.4.0 ; extra == 'mysql' + - mysql-connector-python ; extra == 'mysql-connector' + - cx-oracle>=8 ; extra == 'oracle' + - oracledb>=1.0.1 ; extra == 'oracle-oracledb' + - psycopg2>=2.7 ; extra == 'postgresql' + - greenlet!=0.4.17 ; extra == 'postgresql-asyncpg' + - asyncpg ; extra == 'postgresql-asyncpg' + - pg8000>=1.29.1 ; extra == 'postgresql-pg8000' + - psycopg>=3.0.7 ; extra == 'postgresql-psycopg' + - psycopg2-binary ; extra == 'postgresql-psycopg2binary' + - psycopg2cffi ; extra == 'postgresql-psycopg2cffi' + - psycopg[binary]>=3.0.7 ; extra == 'postgresql-psycopgbinary' + - pymysql ; extra == 'pymysql' + - sqlcipher3-binary ; extra == 'sqlcipher' + requires_python: '>=3.7' +- kind: conda + name: tk + version: 8.6.13 + build: noxft_h4845f30_101 + build_number: 101 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3318875 + timestamp: 1699202167581 +- kind: pypi + name: types-python-dateutil + version: 2.9.0.20240316 + url: https://files.pythonhosted.org/packages/c7/1b/af4f4c4f3f7339a4b7eb3c0ab13416db98f8ac09de3399129ee5fdfa282b/types_python_dateutil-2.9.0.20240316-py3-none-any.whl + sha256: 6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b + requires_python: '>=3.8' +- kind: pypi + name: typing-extensions + version: 4.12.2 + url: https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl + sha256: 04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d + requires_python: '>=3.8' +- kind: conda + name: tzdata + version: 2024a + build: h0c530f3_0 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + sha256: 7b2b69c54ec62a243eb6fba2391b5e443421608c3ae5dbff938ad33ca8db5122 + md5: 161081fc7cec0bfda0d86d7cb595f8d8 + license: LicenseRef-Public-Domain + purls: [] + size: 119815 + timestamp: 1706886945727 +- kind: pypi + name: uri-template + version: 1.3.0 + url: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl + sha256: a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363 + requires_dist: + - types-pyyaml ; extra == 'dev' + - mypy ; extra == 'dev' + - flake8 ; extra == 'dev' + - flake8-annotations ; extra == 'dev' + - flake8-bandit ; extra == 'dev' + - flake8-bugbear ; extra == 'dev' + - flake8-commas ; extra == 'dev' + - flake8-comprehensions ; extra == 'dev' + - flake8-continuation ; extra == 'dev' + - flake8-datetimez ; extra == 'dev' + - flake8-docstrings ; extra == 'dev' + - flake8-import-order ; extra == 'dev' + - flake8-literal ; extra == 'dev' + - flake8-modern-annotations ; extra == 'dev' + - flake8-noqa ; extra == 'dev' + - flake8-pyproject ; extra == 'dev' + - flake8-requirements ; extra == 'dev' + - flake8-typechecking-import ; extra == 'dev' + - flake8-use-fstring ; extra == 'dev' + - pep8-naming ; extra == 'dev' + requires_python: '>=3.7' +- kind: pypi + name: urllib3 + version: 2.2.2 + url: https://files.pythonhosted.org/packages/ca/1c/89ffc63a9605b583d5df2be791a27bc1a42b7c32bab68d3c8f2f73a98cd4/urllib3-2.2.2-py3-none-any.whl + sha256: a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 + requires_dist: + - brotli>=1.0.9 ; platform_python_implementation == 'CPython' and extra == 'brotli' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'brotli' + - h2<5,>=4 ; extra == 'h2' + - pysocks!=1.5.7,<2.0,>=1.5.6 ; extra == 'socks' + - zstandard>=0.18.0 ; extra == 'zstd' + requires_python: '>=3.8' +- kind: pypi + name: watchdog + version: 4.0.1 + url: https://files.pythonhosted.org/packages/24/01/a4034a94a5f1828eb050230e7cf13af3ac23cf763512b6afe008d3def97c/watchdog-4.0.1-py3-none-manylinux2014_x86_64.whl + sha256: ac7041b385f04c047fcc2951dc001671dee1b7e0615cde772e84b01fbf68ee84 + requires_dist: + - pyyaml>=3.10 ; extra == 'watchmedo' + requires_python: '>=3.8' +- kind: pypi + name: webcolors + version: 24.6.0 + url: https://files.pythonhosted.org/packages/3b/45/0c30e10a2ac52606476394e4ba11cf3b12ba5823e7fbb9167f80eee6000a/webcolors-24.6.0-py3-none-any.whl + sha256: 8cf5bc7e28defd1d48b9e83d5fc30741328305a8195c29a8e668fa45586568a1 + requires_dist: + - furo ; extra == 'docs' + - sphinx ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - sphinx-inline-tabs ; extra == 'docs' + - sphinx-notfound-page ; extra == 'docs' + - sphinxext-opengraph ; extra == 'docs' + - coverage[toml] ; extra == 'tests' + requires_python: '>=3.8' +- kind: pypi + name: wrapt + version: 1.16.0 + url: https://files.pythonhosted.org/packages/62/62/30ca2405de6a20448ee557ab2cd61ab9c5900be7cbd18a2639db595f0b98/wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b + requires_python: '>=3.6' +- kind: conda + name: xz + version: 5.2.6 + build: h166bdaf_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + sha256: 03a6d28ded42af8a347345f82f3eebdd6807a08526d47899a42d62d319609162 + md5: 2161070d867d1b1204ea749c8eec4ef0 + depends: + - libgcc-ng >=12 + license: LGPL-2.1 and GPL-2.0 + purls: [] + size: 418368 + timestamp: 1660346797927 diff --git a/rfc/x/pixi.toml b/rfc/x/pixi.toml new file mode 100644 index 00000000..6580cbef --- /dev/null +++ b/rfc/x/pixi.toml @@ -0,0 +1,17 @@ +[project] +name = "ngff-anatomical-orientation" +version = "0.1.0" +description = "Build the model, schema, language bindings for the NGFF axis anatomical orientation proposal" +authors = ["Matt McCormick "] +channels = ["conda-forge"] +platforms = ["linux-64"] + +[tasks] +gen-markdown = "gen-markdown -d ./markdown ./orientation.yml" +gen-json-schema = "gen-json-schema orientation.yml > orientation.schema.json" + +[dependencies] +python = ">=3.12.4,<4" + +[pypi-dependencies] +linkml = ">=1.8.1, <2"