# Compspec Containment
<p align="center">
<img height="300" src="https://raw.githubusercontent.com/compspec/spec/main/img/compspec-circle.png">
</p>
[](https://badge.fury.io/py/compspec-containment)
A compspec (Composition spec) is a specification and model for comparing things. Compspec containment is
a plugin for extraction of the Flux Framework containment subsystem, which means verices (cluster, racks, nodes, sockets, cores, etc) and edges between them that describe relationships (e.g., "contains"). Other cluster types can be added and they will need to have an intermediate translation into a graph. To learn more:
- [Compspec](https://github.com/compspec/compspec): the Python library that discovers and loads this plugin.
## Usage
Install compspec and the plugin here:
```bash
pip install compspec
pip install compspec-containment
```
In the dev container, try running an extraction for the Flux instance running:
```bash
flux start --test-size=4
compspec extract containment
```
To save to file:
```bash
# This extracts a cluster named "a"
compspec extract --outfile containment-subsystem.json containment a
```
You can see the example [example/containment-subsystem.json](example/containment-subsystem.json).
<details>
<summary>compspec-containment output</summary>
```console
{
"graph": {
"directed": false,
"metadata": {
"type": "containment",
"name": "a",
"install_name": "compat-experiment"
},
"nodes": [
{
"id": "0",
"metadata": {
"type": "cluster",
"paths": {
"containment": "/cluster0"
}
}
},
{
"id": "1",
"metadata": {
"type": "node",
"name": "039b58a80799",
"rank": 0,
"paths": {
"containment": "/cluster0/039b58a80799"
}
}
},
{
"id": "2",
"metadata": {
"type": "core",
"id": 0,
"rank": 0,
"paths": {
"containment": "/cluster0/039b58a80799/core0"
}
}
},
{
"id": "3",
"metadata": {
"type": "core",
"id": 1,
"rank": 0,
"paths": {
"containment": "/cluster0/039b58a80799/core1"
}
}
},
{
"id": "4",
"metadata": {
"type": "core",
"id": 2,
"rank": 0,
"paths": {
"containment": "/cluster0/039b58a80799/core2"
}
}
},
{
"id": "5",
"metadata": {
"type": "core",
"id": 3,
"rank": 0,
"paths": {
"containment": "/cluster0/039b58a80799/core3"
}
}
},
{
"id": "6",
"metadata": {
"type": "core",
"id": 4,
"rank": 0,
"paths": {
"containment": "/cluster0/039b58a80799/core4"
}
}
},
{
"id": "7",
"metadata": {
"type": "core",
"id": 5,
"rank": 0,
"paths": {
"containment": "/cluster0/039b58a80799/core5"
}
}
},
{
"id": "8",
"metadata": {
"type": "core",
"id": 6,
"rank": 0,
"paths": {
"containment": "/cluster0/039b58a80799/core6"
}
}
},
{
"id": "9",
"metadata": {
"type": "core",
"id": 7,
"rank": 0,
"paths": {
"containment": "/cluster0/039b58a80799/core7"
}
}
},
{
"id": "10",
"metadata": {
"type": "node",
"name": "039b58a80799",
"rank": 1,
"paths": {
"containment": "/cluster0/039b58a80799"
}
}
},
{
"id": "11",
"metadata": {
"type": "core",
"id": 0,
"rank": 1,
"paths": {
"containment": "/cluster0/039b58a80799/core0"
}
}
},
{
"id": "12",
"metadata": {
"type": "core",
"id": 1,
"rank": 1,
"paths": {
"containment": "/cluster0/039b58a80799/core1"
}
}
},
{
"id": "13",
"metadata": {
"type": "core",
"id": 2,
"rank": 1,
"paths": {
"containment": "/cluster0/039b58a80799/core2"
}
}
},
{
"id": "14",
"metadata": {
"type": "core",
"id": 3,
"rank": 1,
"paths": {
"containment": "/cluster0/039b58a80799/core3"
}
}
},
{
"id": "15",
"metadata": {
"type": "core",
"id": 4,
"rank": 1,
"paths": {
"containment": "/cluster0/039b58a80799/core4"
}
}
},
{
"id": "16",
"metadata": {
"type": "core",
"id": 5,
"rank": 1,
"paths": {
"containment": "/cluster0/039b58a80799/core5"
}
}
},
{
"id": "17",
"metadata": {
"type": "core",
"id": 6,
"rank": 1,
"paths": {
"containment": "/cluster0/039b58a80799/core6"
}
}
},
{
"id": "18",
"metadata": {
"type": "core",
"id": 7,
"rank": 1,
"paths": {
"containment": "/cluster0/039b58a80799/core7"
}
}
},
{
"id": "19",
"metadata": {
"type": "node",
"name": "039b58a80799",
"rank": 2,
"paths": {
"containment": "/cluster0/039b58a80799"
}
}
},
{
"id": "20",
"metadata": {
"type": "core",
"id": 0,
"rank": 2,
"paths": {
"containment": "/cluster0/039b58a80799/core0"
}
}
},
{
"id": "21",
"metadata": {
"type": "core",
"id": 1,
"rank": 2,
"paths": {
"containment": "/cluster0/039b58a80799/core1"
}
}
},
{
"id": "22",
"metadata": {
"type": "core",
"id": 2,
"rank": 2,
"paths": {
"containment": "/cluster0/039b58a80799/core2"
}
}
},
{
"id": "23",
"metadata": {
"type": "core",
"id": 3,
"rank": 2,
"paths": {
"containment": "/cluster0/039b58a80799/core3"
}
}
},
{
"id": "24",
"metadata": {
"type": "core",
"id": 4,
"rank": 2,
"paths": {
"containment": "/cluster0/039b58a80799/core4"
}
}
},
{
"id": "25",
"metadata": {
"type": "core",
"id": 5,
"rank": 2,
"paths": {
"containment": "/cluster0/039b58a80799/core5"
}
}
},
{
"id": "26",
"metadata": {
"type": "core",
"id": 6,
"rank": 2,
"paths": {
"containment": "/cluster0/039b58a80799/core6"
}
}
},
{
"id": "27",
"metadata": {
"type": "core",
"id": 7,
"rank": 2,
"paths": {
"containment": "/cluster0/039b58a80799/core7"
}
}
},
{
"id": "28",
"metadata": {
"type": "node",
"name": "039b58a80799",
"rank": 3,
"paths": {
"containment": "/cluster0/039b58a80799"
}
}
},
{
"id": "29",
"metadata": {
"type": "core",
"id": 0,
"rank": 3,
"paths": {
"containment": "/cluster0/039b58a80799/core0"
}
}
},
{
"id": "30",
"metadata": {
"type": "core",
"id": 1,
"rank": 3,
"paths": {
"containment": "/cluster0/039b58a80799/core1"
}
}
},
{
"id": "31",
"metadata": {
"type": "core",
"id": 2,
"rank": 3,
"paths": {
"containment": "/cluster0/039b58a80799/core2"
}
}
},
{
"id": "32",
"metadata": {
"type": "core",
"id": 3,
"rank": 3,
"paths": {
"containment": "/cluster0/039b58a80799/core3"
}
}
},
{
"id": "33",
"metadata": {
"type": "core",
"id": 4,
"rank": 3,
"paths": {
"containment": "/cluster0/039b58a80799/core4"
}
}
},
{
"id": "34",
"metadata": {
"type": "core",
"id": 5,
"rank": 3,
"paths": {
"containment": "/cluster0/039b58a80799/core5"
}
}
},
{
"id": "35",
"metadata": {
"type": "core",
"id": 6,
"rank": 3,
"paths": {
"containment": "/cluster0/039b58a80799/core6"
}
}
},
{
"id": "36",
"metadata": {
"type": "core",
"id": 7,
"rank": 3,
"paths": {
"containment": "/cluster0/039b58a80799/core7"
}
}
}
],
"edges": [
{
"source": "0",
"target": "1"
},
{
"source": "1",
"target": "2"
},
{
"source": "1",
"target": "3"
},
{
"source": "1",
"target": "4"
},
{
"source": "1",
"target": "5"
},
{
"source": "1",
"target": "6"
},
{
"source": "1",
"target": "7"
},
{
"source": "1",
"target": "8"
},
{
"source": "1",
"target": "9"
},
{
"source": "0",
"target": "10"
},
{
"source": "10",
"target": "11"
},
{
"source": "10",
"target": "12"
},
{
"source": "10",
"target": "13"
},
{
"source": "10",
"target": "14"
},
{
"source": "10",
"target": "15"
},
{
"source": "10",
"target": "16"
},
{
"source": "10",
"target": "17"
},
{
"source": "10",
"target": "18"
},
{
"source": "0",
"target": "19"
},
{
"source": "19",
"target": "20"
},
{
"source": "19",
"target": "21"
},
{
"source": "19",
"target": "22"
},
{
"source": "19",
"target": "23"
},
{
"source": "19",
"target": "24"
},
{
"source": "19",
"target": "25"
},
{
"source": "19",
"target": "26"
},
{
"source": "19",
"target": "27"
},
{
"source": "0",
"target": "28"
},
{
"source": "28",
"target": "29"
},
{
"source": "28",
"target": "30"
},
{
"source": "28",
"target": "31"
},
{
"source": "28",
"target": "32"
},
{
"source": "28",
"target": "33"
},
{
"source": "28",
"target": "34"
},
{
"source": "28",
"target": "35"
},
{
"source": "28",
"target": "36"
}
]
}
}
```
</details>
## License
HPCIC DevTools is distributed under the terms of the MIT license.
All new contributions must be made under this license.
See [LICENSE](https://github.com/converged-computing/cloud-select/blob/main/LICENSE),
[COPYRIGHT](https://github.com/converged-computing/cloud-select/blob/main/COPYRIGHT), and
[NOTICE](https://github.com/converged-computing/cloud-select/blob/main/NOTICE) for details.
SPDX-License-Identifier: (MIT)
LLNL-CODE- 842614
Raw data
{
"_id": null,
"home_page": "https://github.com/compspec/compspec-containment",
"name": "compspec-containment",
"maintainer": "Vanessa Sochat",
"docs_url": null,
"requires_python": null,
"maintainer_email": null,
"keywords": "compatibility, compspec, containment, flux, subsystem, scheduling, hpc",
"author": "Vanessa Sochat",
"author_email": "vsoch@users.noreply.github.com",
"download_url": "https://files.pythonhosted.org/packages/ac/6a/0d14c1ffc7e86212b68de8ea311deb7b3fafe2fac690a9951cedcbf84be2/compspec_containment-0.0.1.tar.gz",
"platform": null,
"description": "# Compspec Containment\n\n<p align=\"center\">\n <img height=\"300\" src=\"https://raw.githubusercontent.com/compspec/spec/main/img/compspec-circle.png\">\n</p>\n\n[](https://badge.fury.io/py/compspec-containment)\n\nA compspec (Composition spec) is a specification and model for comparing things. Compspec containment is\na plugin for extraction of the Flux Framework containment subsystem, which means verices (cluster, racks, nodes, sockets, cores, etc) and edges between them that describe relationships (e.g., \"contains\"). Other cluster types can be added and they will need to have an intermediate translation into a graph. To learn more:\n\n - [Compspec](https://github.com/compspec/compspec): the Python library that discovers and loads this plugin.\n\n## Usage\n\nInstall compspec and the plugin here:\n\n```bash\npip install compspec\npip install compspec-containment\n```\n\nIn the dev container, try running an extraction for the Flux instance running:\n\n```bash\nflux start --test-size=4\ncompspec extract containment\n```\n\nTo save to file:\n\n```bash\n# This extracts a cluster named \"a\"\ncompspec extract --outfile containment-subsystem.json containment a\n```\n\nYou can see the example [example/containment-subsystem.json](example/containment-subsystem.json).\n\n<details>\n\n<summary>compspec-containment output</summary>\n\n```console\n{\n \"graph\": {\n \"directed\": false,\n \"metadata\": {\n \"type\": \"containment\",\n \"name\": \"a\",\n \"install_name\": \"compat-experiment\"\n },\n \"nodes\": [\n {\n \"id\": \"0\",\n \"metadata\": {\n \"type\": \"cluster\",\n \"paths\": {\n \"containment\": \"/cluster0\"\n }\n }\n },\n {\n \"id\": \"1\",\n \"metadata\": {\n \"type\": \"node\",\n \"name\": \"039b58a80799\",\n \"rank\": 0,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799\"\n }\n }\n },\n {\n \"id\": \"2\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 0,\n \"rank\": 0,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core0\"\n }\n }\n },\n {\n \"id\": \"3\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 1,\n \"rank\": 0,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core1\"\n }\n }\n },\n {\n \"id\": \"4\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 2,\n \"rank\": 0,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core2\"\n }\n }\n },\n {\n \"id\": \"5\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 3,\n \"rank\": 0,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core3\"\n }\n }\n },\n {\n \"id\": \"6\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 4,\n \"rank\": 0,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core4\"\n }\n }\n },\n {\n \"id\": \"7\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 5,\n \"rank\": 0,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core5\"\n }\n }\n },\n {\n \"id\": \"8\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 6,\n \"rank\": 0,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core6\"\n }\n }\n },\n {\n \"id\": \"9\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 7,\n \"rank\": 0,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core7\"\n }\n }\n },\n {\n \"id\": \"10\",\n \"metadata\": {\n \"type\": \"node\",\n \"name\": \"039b58a80799\",\n \"rank\": 1,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799\"\n }\n }\n },\n {\n \"id\": \"11\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 0,\n \"rank\": 1,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core0\"\n }\n }\n },\n {\n \"id\": \"12\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 1,\n \"rank\": 1,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core1\"\n }\n }\n },\n {\n \"id\": \"13\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 2,\n \"rank\": 1,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core2\"\n }\n }\n },\n {\n \"id\": \"14\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 3,\n \"rank\": 1,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core3\"\n }\n }\n },\n {\n \"id\": \"15\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 4,\n \"rank\": 1,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core4\"\n }\n }\n },\n {\n \"id\": \"16\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 5,\n \"rank\": 1,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core5\"\n }\n }\n },\n {\n \"id\": \"17\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 6,\n \"rank\": 1,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core6\"\n }\n }\n },\n {\n \"id\": \"18\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 7,\n \"rank\": 1,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core7\"\n }\n }\n },\n {\n \"id\": \"19\",\n \"metadata\": {\n \"type\": \"node\",\n \"name\": \"039b58a80799\",\n \"rank\": 2,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799\"\n }\n }\n },\n {\n \"id\": \"20\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 0,\n \"rank\": 2,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core0\"\n }\n }\n },\n {\n \"id\": \"21\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 1,\n \"rank\": 2,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core1\"\n }\n }\n },\n {\n \"id\": \"22\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 2,\n \"rank\": 2,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core2\"\n }\n }\n },\n {\n \"id\": \"23\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 3,\n \"rank\": 2,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core3\"\n }\n }\n },\n {\n \"id\": \"24\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 4,\n \"rank\": 2,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core4\"\n }\n }\n },\n {\n \"id\": \"25\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 5,\n \"rank\": 2,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core5\"\n }\n }\n },\n {\n \"id\": \"26\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 6,\n \"rank\": 2,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core6\"\n }\n }\n },\n {\n \"id\": \"27\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 7,\n \"rank\": 2,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core7\"\n }\n }\n },\n {\n \"id\": \"28\",\n \"metadata\": {\n \"type\": \"node\",\n \"name\": \"039b58a80799\",\n \"rank\": 3,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799\"\n }\n }\n },\n {\n \"id\": \"29\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 0,\n \"rank\": 3,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core0\"\n }\n }\n },\n {\n \"id\": \"30\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 1,\n \"rank\": 3,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core1\"\n }\n }\n },\n {\n \"id\": \"31\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 2,\n \"rank\": 3,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core2\"\n }\n }\n },\n {\n \"id\": \"32\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 3,\n \"rank\": 3,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core3\"\n }\n }\n },\n {\n \"id\": \"33\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 4,\n \"rank\": 3,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core4\"\n }\n }\n },\n {\n \"id\": \"34\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 5,\n \"rank\": 3,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core5\"\n }\n }\n },\n {\n \"id\": \"35\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 6,\n \"rank\": 3,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core6\"\n }\n }\n },\n {\n \"id\": \"36\",\n \"metadata\": {\n \"type\": \"core\",\n \"id\": 7,\n \"rank\": 3,\n \"paths\": {\n \"containment\": \"/cluster0/039b58a80799/core7\"\n }\n }\n }\n ],\n \"edges\": [\n {\n \"source\": \"0\",\n \"target\": \"1\"\n },\n {\n \"source\": \"1\",\n \"target\": \"2\"\n },\n {\n \"source\": \"1\",\n \"target\": \"3\"\n },\n {\n \"source\": \"1\",\n \"target\": \"4\"\n },\n {\n \"source\": \"1\",\n \"target\": \"5\"\n },\n {\n \"source\": \"1\",\n \"target\": \"6\"\n },\n {\n \"source\": \"1\",\n \"target\": \"7\"\n },\n {\n \"source\": \"1\",\n \"target\": \"8\"\n },\n {\n \"source\": \"1\",\n \"target\": \"9\"\n },\n {\n \"source\": \"0\",\n \"target\": \"10\"\n },\n {\n \"source\": \"10\",\n \"target\": \"11\"\n },\n {\n \"source\": \"10\",\n \"target\": \"12\"\n },\n {\n \"source\": \"10\",\n \"target\": \"13\"\n },\n {\n \"source\": \"10\",\n \"target\": \"14\"\n },\n {\n \"source\": \"10\",\n \"target\": \"15\"\n },\n {\n \"source\": \"10\",\n \"target\": \"16\"\n },\n {\n \"source\": \"10\",\n \"target\": \"17\"\n },\n {\n \"source\": \"10\",\n \"target\": \"18\"\n },\n {\n \"source\": \"0\",\n \"target\": \"19\"\n },\n {\n \"source\": \"19\",\n \"target\": \"20\"\n },\n {\n \"source\": \"19\",\n \"target\": \"21\"\n },\n {\n \"source\": \"19\",\n \"target\": \"22\"\n },\n {\n \"source\": \"19\",\n \"target\": \"23\"\n },\n {\n \"source\": \"19\",\n \"target\": \"24\"\n },\n {\n \"source\": \"19\",\n \"target\": \"25\"\n },\n {\n \"source\": \"19\",\n \"target\": \"26\"\n },\n {\n \"source\": \"19\",\n \"target\": \"27\"\n },\n {\n \"source\": \"0\",\n \"target\": \"28\"\n },\n {\n \"source\": \"28\",\n \"target\": \"29\"\n },\n {\n \"source\": \"28\",\n \"target\": \"30\"\n },\n {\n \"source\": \"28\",\n \"target\": \"31\"\n },\n {\n \"source\": \"28\",\n \"target\": \"32\"\n },\n {\n \"source\": \"28\",\n \"target\": \"33\"\n },\n {\n \"source\": \"28\",\n \"target\": \"34\"\n },\n {\n \"source\": \"28\",\n \"target\": \"35\"\n },\n {\n \"source\": \"28\",\n \"target\": \"36\"\n }\n ]\n }\n}\n```\n\n</details>\n\n\n\n## License\n\nHPCIC DevTools is distributed under the terms of the MIT license.\nAll new contributions must be made under this license.\n\nSee [LICENSE](https://github.com/converged-computing/cloud-select/blob/main/LICENSE),\n[COPYRIGHT](https://github.com/converged-computing/cloud-select/blob/main/COPYRIGHT), and\n[NOTICE](https://github.com/converged-computing/cloud-select/blob/main/NOTICE) for details.\n\nSPDX-License-Identifier: (MIT)\n\nLLNL-CODE- 842614\n",
"bugtrack_url": null,
"license": "LICENSE",
"summary": "Subsystem graph generation for the Flux containment subsystem",
"version": "0.0.1",
"project_urls": {
"Homepage": "https://github.com/compspec/compspec-containment"
},
"split_keywords": [
"compatibility",
" compspec",
" containment",
" flux",
" subsystem",
" scheduling",
" hpc"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "94d573ec3748e3b82eb435c6a79e49768af54255ce21ea6b42154fe6f5caaa13",
"md5": "72339ee28f28b03286758c03c3d89841",
"sha256": "5485ccd0d64b0d24ae7aac9d151e9aa8ef1d80ae578da6ba40cd04ff45327eb8"
},
"downloads": -1,
"filename": "compspec_containment-0.0.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "72339ee28f28b03286758c03c3d89841",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 6959,
"upload_time": "2025-09-15T18:16:28",
"upload_time_iso_8601": "2025-09-15T18:16:28.020274Z",
"url": "https://files.pythonhosted.org/packages/94/d5/73ec3748e3b82eb435c6a79e49768af54255ce21ea6b42154fe6f5caaa13/compspec_containment-0.0.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ac6a0d14c1ffc7e86212b68de8ea311deb7b3fafe2fac690a9951cedcbf84be2",
"md5": "d629f60f3ceba2245985a60ff05ba0e3",
"sha256": "1e6e24072bb362764ff5cd2a2acba9509309792ce5a0780014a9d10be4007a52"
},
"downloads": -1,
"filename": "compspec_containment-0.0.1.tar.gz",
"has_sig": false,
"md5_digest": "d629f60f3ceba2245985a60ff05ba0e3",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 9016,
"upload_time": "2025-09-15T18:16:29",
"upload_time_iso_8601": "2025-09-15T18:16:29.317672Z",
"url": "https://files.pythonhosted.org/packages/ac/6a/0d14c1ffc7e86212b68de8ea311deb7b3fafe2fac690a9951cedcbf84be2/compspec_containment-0.0.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-09-15 18:16:29",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "compspec",
"github_project": "compspec-containment",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "compspec-containment"
}