{ "info": { "author": "Dell inc.", "author_email": "opx-infra@openswitch.net", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License" ], "description": "# controlgraph\n\n[![PyPI version](https://badge.fury.io/py/controlgraph.svg)](https://pypi.org/project/controlgraph/)\n[![Build status](https://badge.buildkite.com/81c4e486b5f9ff5d3bf3f3da820201cefad4965207f4e2a8c2.svg)](https://buildkite.com/opx/opx-infra-controlgraph)\n\ncontrolgraph is a directed graph which can be traversed to enable parallelized Debian package builds.\n\nFrom the available directories with valid Debian packaging, a graph with directories (representing source packages) for nodes and build dependencies for edges is produced. The reverse of this graph can traversed with a breadth-first search to build in dependency order.\n\n`controlgraph` is a program which returns the controlgraph for a directory to build, in linear or dot format.\n\n## Installation\n\n```bash\npip3 install controlgraph\n```\n\n## Library Usage\n\n```python3\nimport sys\n\nfrom pathlib import Path\n\nimport controlgraph\nimport networkx as nx\n\n# get all directories\ndirs = [p for p in Path.cwd().iterdir() if p.is_dir()]\n\n# get map of local binary packages to locally-available source build dependencies\npkgs = controlgraph.parse_all_controlfiles(dirs)\n\n# generate build dependency graph from map\ndep_graph = controlgraph.graph(pkgs)\n\n# print full dot graph\nnx.nx_pydot.write_dot(dep_graph, sys.stdout)\n\n# print linear order from depth-first search\nprint(\" \".join(list(nx.dfs_postorder_nodes(dep_graph))))\n```\n\nOutput\n\n```\nstrict digraph {\n\"opx-nas-daemon\";\n\"opx-common-utils\";\n\"opx-cps\";\n\"opx-logging\";\n\"opx-nas-acl\";\n\"opx-sdi-sys\";\n\"opx-nas-daemon\" -> \"opx-common-utils\";\n\"opx-nas-daemon\" -> \"opx-cps\";\n\"opx-nas-daemon\" -> \"opx-logging\";\n\"opx-nas-daemon\" -> \"opx-nas-acl\";\n\"opx-common-utils\" -> \"opx-logging\";\n\"opx-cps\" -> \"opx-common-utils\";\n\"opx-cps\" -> \"opx-logging\";\n\"opx-nas-acl\" -> \"opx-common-utils\";\n\"opx-nas-acl\" -> \"opx-cps\";\n\"opx-nas-acl\" -> \"opx-logging\";\n\"opx-sdi-sys\" -> \"opx-common-utils\";\n\"opx-sdi-sys\" -> \"opx-logging\";\n}\n\nopx-logging opx-common-utils opx-cps opx-nas-acl opx-nas-daemon opx-sdi-sys\n```\n\n## CLI Usage\n\nWith one or more directories present, run `controlgraph`.\n\n```bash\n$ for r in opx-nas-acl opx-nas-daemon opx-alarm opx-logging opx-common-utils; do\n git clone \"https://github.com/open-switch/$r\"\n done\n\n$ controlgraph\nopx-alarm opx-logging opx-common-utils opx-nas-acl opx-nas-daemon\n\n$ controlgraph --graph\nstrict digraph {\n\"opx-alarm\";\n\"opx-nas-daemon\";\n\"opx-common-utils\";\n\"opx-logging\";\n\"opx-nas-acl\";\n\"opx-nas-daemon\" -> \"opx-common-utils\";\n\"opx-nas-daemon\" -> \"opx-logging\";\n\"opx-nas-daemon\" -> \"opx-nas-acl\";\n\"opx-common-utils\" -> \"opx-logging\";\n\"opx-nas-acl\" -> \"opx-common-utils\";\n\"opx-nas-acl\" -> \"opx-logging\";\n}\n```\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://openswitch.net", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "controlgraph", "package_url": "https://pypi.org/project/controlgraph/", "platform": "", "project_url": "https://pypi.org/project/controlgraph/", "project_urls": { "Homepage": "https://openswitch.net" }, "release_url": "https://pypi.org/project/controlgraph/0.7.1/", "requires_dist": [ "networkx", "pydot", "python-debian" ], "requires_python": ">=3.5,<4", "summary": "Generate build order graph from directory of debian packaging repositories", "version": "0.7.1" }, "last_serial": 4626756, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "afc483673bfa3617eaaf16cef77a44dd", "sha256": "a01849fca7453b6310d092cbef993e4d9ceb7c27de8f41c5b0b81e5e2ed65fde" }, "downloads": -1, "filename": "controlgraph-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "afc483673bfa3617eaaf16cef77a44dd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4", "size": 6957, "upload_time": "2018-08-30T05:31:29", "url": "https://files.pythonhosted.org/packages/72/33/6cd1d87e7ed641ed98e1080a40b176cdee50913c85e07499debf3e3f9d93/controlgraph-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8b45d23d00c9bcff37ca67c490cd9b43", "sha256": "e82c1b3767c363022d370d9dedb07f8953c443fd9efdccb674d1aa24a7fe62d7" }, "downloads": -1, "filename": "controlgraph-0.1.0.tar.gz", "has_sig": false, "md5_digest": "8b45d23d00c9bcff37ca67c490cd9b43", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4", "size": 3533, "upload_time": "2018-08-30T05:31:32", "url": "https://files.pythonhosted.org/packages/fb/35/f13112c287539bfa578e80f0e39cae6ffcd57889cdb5ce14ac56172ee2f7/controlgraph-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "179e7e2ba11c885a5dd943637d663cb6", "sha256": "91567f72ea5be8dc8854bc7866853bc5b2b6129ed86e837192d5c755fbc566fc" }, "downloads": -1, "filename": "controlgraph-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "179e7e2ba11c885a5dd943637d663cb6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4", "size": 7268, "upload_time": "2018-08-30T05:37:22", "url": "https://files.pythonhosted.org/packages/05/1f/9651ebebfbc191157fd482beac85d59d0a92125cc09212419f2bbf9b8035/controlgraph-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "87f02e29fe0a5b69fb2d79a9cd2ca428", "sha256": "373c7f373fb0138a950e5e0eab1bd0b1593a41df43b983d4e4fc376741fa5665" }, "downloads": -1, "filename": "controlgraph-0.1.1.tar.gz", "has_sig": false, "md5_digest": "87f02e29fe0a5b69fb2d79a9cd2ca428", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4", "size": 3611, "upload_time": "2018-08-30T05:37:24", "url": "https://files.pythonhosted.org/packages/6c/db/9c6e41921885a9a756d341f64efecea7ba77f9cbdbde285b2bcfd18c9566/controlgraph-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "b4d533946b061103a276f95faea099c9", "sha256": "276435b3f28db6177c0beacccab2c89a43fbb10184e742455dc674712aa11ad0" }, "downloads": -1, "filename": "controlgraph-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "b4d533946b061103a276f95faea099c9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4", "size": 7330, "upload_time": "2018-08-30T05:50:34", "url": "https://files.pythonhosted.org/packages/ed/fb/3190d9d03ac94dba826dd3f1de28d6d6218ce4949a4c4b325f05b75a804d/controlgraph-0.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a9d53ec982fa361cb6930701f52f9c13", "sha256": "445196885ee83f1d7c3ee59df2c1d6c204c8988ca94f0dbdbf786c8e993150eb" }, "downloads": -1, "filename": "controlgraph-0.1.2.tar.gz", "has_sig": false, "md5_digest": "a9d53ec982fa361cb6930701f52f9c13", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4", "size": 3661, "upload_time": "2018-08-30T05:50:37", "url": "https://files.pythonhosted.org/packages/a0/29/db10b2a1115ec23b5053bbf7e31047b5dc92c38f2ae74cfc3ec3d8e2b140/controlgraph-0.1.2.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "c6199e9fe3b444fc167739cccaa65059", "sha256": "6cc6909ac8f4b862a864387ccc502fdb7193492e676db9548069c1901ca60e51" }, "downloads": -1, "filename": "controlgraph-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "c6199e9fe3b444fc167739cccaa65059", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4", "size": 7741, "upload_time": "2018-08-30T06:38:08", "url": "https://files.pythonhosted.org/packages/41/d8/e0dd966647a0512665a1dfd93d1d336e886b0de3f19d9c84e730c5839035/controlgraph-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a1431c15cb5b95051f00716ddffc14fd", "sha256": "0dd64c590cf3e03900698d1166ce789d1356dbf7b8417f927cb382c299782cb8" }, "downloads": -1, "filename": "controlgraph-0.2.0.tar.gz", "has_sig": false, "md5_digest": "a1431c15cb5b95051f00716ddffc14fd", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4", "size": 3797, "upload_time": "2018-08-30T06:38:10", "url": "https://files.pythonhosted.org/packages/4c/61/d247cb4e23b319816f4541ca51f17448030f6aa74f24128ccc2ed02dfbdb/controlgraph-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "26260ee5e83c813a904d9abc594d8a13", "sha256": "66ae8c9af40f630521c40c9e8bbe8c700a392865a6e030673266cc60e89ee5b0" }, "downloads": -1, "filename": "controlgraph-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "26260ee5e83c813a904d9abc594d8a13", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4", "size": 8224, "upload_time": "2018-08-30T18:36:39", "url": "https://files.pythonhosted.org/packages/af/27/fb507e653a8fca3bbebd2c9cc35da965dacf7ec1dde88121f454f45332fe/controlgraph-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c6399bfa61a8d8277d5adb4db24a162f", "sha256": "8eadb28dee02c8c657e6754afaf8bc6571fb98e44433879ed35c490e413dcec3" }, "downloads": -1, "filename": "controlgraph-0.3.0.tar.gz", "has_sig": false, "md5_digest": "c6399bfa61a8d8277d5adb4db24a162f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4", "size": 4154, "upload_time": "2018-08-30T18:36:41", "url": "https://files.pythonhosted.org/packages/c5/f9/275ace120d5b9eec24611fd73de8405de3cec9acb93fc2e3ddc0e3312e6d/controlgraph-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "e0ff63a8b24f05bb79057f817421cb62", "sha256": "4b91d72872b1fe7c86ef5109b78ac9721e06b4895bb21cde01e2fc11ae0d52e6" }, "downloads": -1, "filename": "controlgraph-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "e0ff63a8b24f05bb79057f817421cb62", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4", "size": 7151, "upload_time": "2018-08-30T22:46:23", "url": "https://files.pythonhosted.org/packages/89/b5/4442fd94ae09d4d7d56f0e084792ae70728bf972f604f444bf069f0511bc/controlgraph-0.4.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "52e2331b7134264245e4f5605d0da4c7", "sha256": "9b8faec1cb170e186a0cef18fdb0a2f99b84a6338fd066141aff1cc8d07c1892" }, "downloads": -1, "filename": "controlgraph-0.4.0.tar.gz", "has_sig": false, "md5_digest": "52e2331b7134264245e4f5605d0da4c7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4", "size": 3828, "upload_time": "2018-08-30T22:46:25", "url": "https://files.pythonhosted.org/packages/b2/75/e17667367bd8440189a4ac39a902019ab4347f2cd6fdd3bc97467e54270b/controlgraph-0.4.0.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "3de5c5a5f6c2f9ec801b7a84458e0e35", "sha256": "18ca9039ade4fa419b07e8807d9e46862ce4ec63e9d3d318f8706b654bb5351a" }, "downloads": -1, "filename": "controlgraph-0.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "3de5c5a5f6c2f9ec801b7a84458e0e35", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4", "size": 8164, "upload_time": "2018-08-31T01:12:17", "url": "https://files.pythonhosted.org/packages/98/c4/96ce5ae65d72b8e21cae44c24caa0acbafbba9b1f1f2725a35b0b577e979/controlgraph-0.5.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a0944c5f1bf29d6e97ef4ed93ce48892", "sha256": "fe1cd675afd8c65094719baea8b965aaad01bb41d70cba8873c2df9badd1a2ed" }, "downloads": -1, "filename": "controlgraph-0.5.0.tar.gz", "has_sig": false, "md5_digest": "a0944c5f1bf29d6e97ef4ed93ce48892", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4", "size": 3896, "upload_time": "2018-08-31T01:12:19", "url": "https://files.pythonhosted.org/packages/03/86/7fbda3634d9f71b8665c4044fc63da3b62b59267878cc5f031b983ca5015/controlgraph-0.5.0.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "331946c55ce06fa5fd92819cfc60217e", "sha256": "5da18387f87f5104b05c6355b3f6435adae20b3f75f5bde02847eb06bd63805f" }, "downloads": -1, "filename": "controlgraph-0.6.0-py3-none-any.whl", "has_sig": false, "md5_digest": "331946c55ce06fa5fd92819cfc60217e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4", "size": 8316, "upload_time": "2018-08-31T06:05:12", "url": "https://files.pythonhosted.org/packages/16/fe/c875c2798c36faecef47595a109a41f830a281bcd90d3ccd1efaf161588d/controlgraph-0.6.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "80dad61e07ae11331265e7e978d0cdc2", "sha256": "b85afc8fb6633e65cdb48a11f80122d6c54c059561a14267e2d2e7c6c964aed3" }, "downloads": -1, "filename": "controlgraph-0.6.0.tar.gz", "has_sig": false, "md5_digest": "80dad61e07ae11331265e7e978d0cdc2", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4", "size": 4066, "upload_time": "2018-08-31T06:05:15", "url": "https://files.pythonhosted.org/packages/27/8e/af27d9d6ede63841189806d49c24f9fa523b1e00a1eee41e3bbfc71c951e/controlgraph-0.6.0.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "0ecb8de6b9cf91ac232341453e1523ab", "sha256": "5ea73ae555ce1e761078fb9a3e5164cc25f91db861ce20b3258386d70f8cc478" }, "downloads": -1, "filename": "controlgraph-0.7.0-py3-none-any.whl", "has_sig": false, "md5_digest": "0ecb8de6b9cf91ac232341453e1523ab", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4", "size": 8538, "upload_time": "2018-09-01T03:22:57", "url": "https://files.pythonhosted.org/packages/a0/b1/3fa958959932297a41404699451b48014d3ab2d037a3b656d10f544ed6e4/controlgraph-0.7.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0264a9dc031487816afd8afcec16fd4c", "sha256": "ec336dc691eaabafa5e9ccae9a1ec4d27221cdb0b62513bac9fa5e3d8a58b265" }, "downloads": -1, "filename": "controlgraph-0.7.0.tar.gz", "has_sig": false, "md5_digest": "0264a9dc031487816afd8afcec16fd4c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4", "size": 4111, "upload_time": "2018-09-01T03:23:00", "url": "https://files.pythonhosted.org/packages/79/bd/d9e1c422018bae38172980562ea413cbe77ce1688fded6ac6a7eafb5ec9a/controlgraph-0.7.0.tar.gz" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "77ff3dec0b7344557e9a291cf4d3bffb", "sha256": "a1bc6b587321b93d6170cfeeedfbb2ab02d877287b77754b4c292d47454cb3b6" }, "downloads": -1, "filename": "controlgraph-0.7.1-py3-none-any.whl", "has_sig": false, "md5_digest": "77ff3dec0b7344557e9a291cf4d3bffb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4", "size": 9010, "upload_time": "2018-10-08T23:29:56", "url": "https://files.pythonhosted.org/packages/d1/b1/1396cfdc5c331cb2d95abca5caf0bca827e924090693409bb76e92bf4eb0/controlgraph-0.7.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "88b8dbe9f9e5be18c7e5e4d090889257", "sha256": "bcf4e9f2a55f8cc08a38b6805cef63269da6630c821bdc1ca44c167a9aeff100" }, "downloads": -1, "filename": "controlgraph-0.7.1.tar.gz", "has_sig": false, "md5_digest": "88b8dbe9f9e5be18c7e5e4d090889257", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4", "size": 4286, "upload_time": "2018-10-08T23:29:59", "url": "https://files.pythonhosted.org/packages/20/79/c8bee133b097f48ad1d90e18bb72adb948106e23d8f72538ab748248b0bf/controlgraph-0.7.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "77ff3dec0b7344557e9a291cf4d3bffb", "sha256": "a1bc6b587321b93d6170cfeeedfbb2ab02d877287b77754b4c292d47454cb3b6" }, "downloads": -1, "filename": "controlgraph-0.7.1-py3-none-any.whl", "has_sig": false, "md5_digest": "77ff3dec0b7344557e9a291cf4d3bffb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4", "size": 9010, "upload_time": "2018-10-08T23:29:56", "url": "https://files.pythonhosted.org/packages/d1/b1/1396cfdc5c331cb2d95abca5caf0bca827e924090693409bb76e92bf4eb0/controlgraph-0.7.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "88b8dbe9f9e5be18c7e5e4d090889257", "sha256": "bcf4e9f2a55f8cc08a38b6805cef63269da6630c821bdc1ca44c167a9aeff100" }, "downloads": -1, "filename": "controlgraph-0.7.1.tar.gz", "has_sig": false, "md5_digest": "88b8dbe9f9e5be18c7e5e4d090889257", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4", "size": 4286, "upload_time": "2018-10-08T23:29:59", "url": "https://files.pythonhosted.org/packages/20/79/c8bee133b097f48ad1d90e18bb72adb948106e23d8f72538ab748248b0bf/controlgraph-0.7.1.tar.gz" } ] }