{"id":28125146,"url":"https://github.com/xing/jungle","last_synced_at":"2025-08-23T14:35:19.419Z","repository":{"id":63042394,"uuid":"523692384","full_name":"xing/jungle","owner":"xing","description":"Complexity metrics for Cocoapods and SwiftPM","archived":false,"fork":false,"pushed_at":"2023-08-20T09:56:13.000Z","size":64,"stargazers_count":24,"open_issues_count":4,"forks_count":0,"subscribers_count":17,"default_branch":"main","last_synced_at":"2025-07-29T14:59:42.221Z","etag":null,"topics":["cocoapods","complexity","dependency","spm","swift","swiftpm"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xing.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-08-11T11:12:13.000Z","updated_at":"2025-03-31T03:04:30.000Z","dependencies_parsed_at":"2025-05-14T09:21:07.851Z","dependency_job_id":"6674b20d-b3a0-450b-8b40-83ff8147cb8f","html_url":"https://github.com/xing/jungle","commit_stats":null,"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/xing/jungle","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xing%2Fjungle","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xing%2Fjungle/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xing%2Fjungle/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xing%2Fjungle/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xing","download_url":"https://codeload.github.com/xing/jungle/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xing%2Fjungle/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271752125,"owners_count":24814750,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-23T02:00:09.327Z","response_time":69,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cocoapods","complexity","dependency","spm","swift","swiftpm"],"created_at":"2025-05-14T09:20:24.021Z","updated_at":"2025-08-23T14:35:19.395Z","avatar_url":"https://github.com/xing.png","language":"Swift","readme":"# Jungle\n\n[![Swift](https://github.com/xing/jungle/actions/workflows/swift.yml/badge.svg)](https://github.com/xing/jungle/actions/workflows/swift.yml)\n\nA Swift CLI tool that generates complexity metrics information from a Cocoapods Xcode project or a SwiftPM package. Currently, that´s what you can do:\n- Dependency graph (dot format)\n- Cyclomatic complexity evaluation \n- Number of dependant modules\n- Compare stats between different branches\n- Show stats along the git history\n- Show dependant targets\n\nYou can read more information about dependency complexity in our Technical article [\"How to control your dependencies\"](https://tech.xing.com/how-to-control-your-ios-dependencies-7690cc7b1c40).\n\n## Table of contents\n\n- [Installation](#installation)\n  * [Mint](#mint)\n  * [Manual](#manual)\n- [Usage](#usage)\n  * [Fetch Historic Complexities](#fetch-historic-complexities)\n  * [Compare Complexity Graphs](#compare-complexity-graphs)\n  * [Count Module Dependencies](#count-module-dependencies)\n  * [Visualize Complexity Graphs](#visualize-complexity-graphs)\n    + [Some tips](#some-tips)\n- [Contributing](#contributing)\n  * [Contributor License Agreement](#contributor-license-agreement)\n\n## Installation\n\n### Mint\n\n```bash\nmint install xing/jungle\nmint run jungle help\n```\n\n### Manual\n\n```bash\ngit clone https://github.com/xing/jungle\ncd jungle\nswift build -c release\n.build/release/jungle help\n```\n\n## Usage\n\n### Fetch Historic Complexities\n\n```shell\nOVERVIEW: Displays historic complexity of the dependency graph\n\nUSAGE: jungle history [--since \u003csince\u003e] [--module \u003cmodule\u003e] --target \u003ctarget\u003e [--output-format \u003coutput-format\u003e] [\u003cdirectory-path\u003e]\n\nARGUMENTS:\n  \u003cdirectory-path\u003e        Path to the directory where Podfile.lock is located (default: .)\n\nOPTIONS:\n  --since \u003csince\u003e         Equivalent to git-log --since: Eg: '6 months ago' (default: 6 months ago)\n  --module \u003cmodule\u003e       The Module to compare. If you specify something, target parameter will be ommited\n  --target \u003ctarget\u003e       The target in your Podfile or Package.swift file to be used (this can be a Product name in SPM)\n  --output-format \u003coutput-format\u003e\n                          csv or json (default: csv)\n  --version               Show the version.\n  -h, --help              Show help information.\n```\n\n\nExample:\n\n```shell\njungle history --target App ProjectDirectory/ --since '1 week ago'\n\n2022-08-30T15:12:14+02:00;cdb9d2ce64a;124;21063;Author;commit message\n2022-09-02T11:02:12+02:00;4fdf3a157a4;124;21063;Author;commit message\nNow;Current;124;21063;;\n```\n\n### Compare Complexity Graphs\n\n```shell\nOVERVIEW: Compares the current complexity of the dependency graph to others versions in git\n\nUSAGE: jungle compare [--to \u003cgit-object\u003e ...] [--module \u003cmodule\u003e] --target \u003ctarget\u003e [\u003cdirectory-path\u003e]\n\nARGUMENTS:\n  \u003cdirectory-path\u003e        Path to the directory where Podfile.lock or Package.swift is located (default: .)\n\nOPTIONS:\n  --to \u003cgit-object\u003e       The git objects to compare the current graph to. Eg: - 'main', 'my_branch', 'some_commit_hash'. (default: HEAD, main, master)\n  --module \u003cmodule\u003e       The Module to compare. If you specify something, target parameter will be ommited\n  --target \u003ctarget\u003e       The target in your Podfile or Package.swift file to be used (this can be a Product name in SPM)\n  --version               Show the version.\n  -h, --help              Show help information.\n```\n\nExample:\n\n```shell\n\njungle compare --target App ProjectDirectory/ --to main\n[\n  {\n    \"modules\" : 124,\n    \"complexity\" : 20063,\n    \"name\" : \"Current\",\n    \"moduleCount\" : 124\n  },\n  {\n    \"modules\" : 124,\n    \"complexity\" : 21063,\n    \"name\" : \"main\",\n    \"moduleCount\" : 124\n  }\n]\n```\n\n### Count Module Dependencies\n\n```shell\nOVERVIEW: Outputs a sorted list of modules dependencies count of your project\n\nUSAGE: jungle modules --target \u003ctarget\u003e [\u003cdirectory-path\u003e]\n\nARGUMENTS:\n  \u003cdirectory-path\u003e        Path to the directory where Podfile.lock or Package.swift is located (default: .)\n\nOPTIONS:\n  --target \u003ctarget\u003e       The target in your Podfile or Package.swift file to be used (this can be a Product name in SPM)\n  --version               Show the version.\n  -h, --help              Show help information.\n\n```\n\nExample:\n\n```shell\njungle modules --target jungle\n\n4 - PodExtractor\n3 - SPMExtractor\n2 - DependencyGraph\n0 - Shell\n0 - ArgumentParser\n\n```\n\n### Get dependant modules\n\n```shell\nOVERVIEW: Outputs a sorted list of targets that depends on the specified one in target\n\nUSAGE: jungle dependant --target \u003ctarget\u003e [--show-only-tests] [\u003cdirectory-path\u003e]\n\nARGUMENTS:\n  \u003cdirectory-path\u003e        Path to the directory where Podfile.lock or Package.swift is located (default: .)\n\nOPTIONS:\n  --target \u003ctarget\u003e       The target in your Podfile or Package.swift file to be used (this can be a Product name in SPM)\n  --show-only-tests       Show only Test targets\n  --version               Show the version.\n  -h, --help              Show help information.\n\n```\n\nExample:\n\n```shell\njungle dependant --target SamplePackage $HOME/Desktop/SamplePackage\n\nLibrary, LibraryTests, SamplePackageTests\n\n\n### Visualize Complexity Graphs\n\n```shell\nOVERVIEW: Outputs the dependency graph in DOT format\n\nUSAGE: jungle graph [--of \u003cgit-object\u003e] [--module \u003cmodule\u003e] --target \u003ctarget\u003e [--use-multiedge] [--show-externals] [\u003cdirectory-path\u003e]\n\nARGUMENTS:\n  \u003cdirectory-path\u003e        Path to the directory where Podfile.lock or Package.swift is located (default: .)\n\nOPTIONS:\n  --of \u003cgit-object\u003e       A git object representing the version to draw the graph for. Eg: - 'main', 'my_branch', 'some_commit_hash'.\n  --module \u003cmodule\u003e       The Module to compare. If you specify something, target parameter will be ommited\n  --target \u003ctarget\u003e       The target in your Podfile or Package.swift file to be used (this can be a Product name in SPM)\n  --use-multiedge         Use multi-edge or unique-edge configuration\n  --show-externals        Show Externals modules dependencies\n  --version               Show the version.\n  -h, --help              Show help information.\n\n```\n\nOutputs DOT format which can be viewed using http://viz-js.com\n\n\n#### Some tips\n\n💡 Copy CSV (to paste in a spreadsheet) or DOT (to paste at http://viz-js.com) to the clipboard using `pbcopy`\n\n```shell\njungle graph --target App ProjectDirectory/ | pbcopy\njungle history --target App ProjectDirectory/ | pbcopy\n``` \n\n\n💡 Use Graphviz tool to generate your own graphs\n\n```shell\nbrew install graphviz\njungle graph --target App ProjectDirectory/ | dot -Tpng -o graph.png \u0026\u0026 open graph.png\n```\n \n## Contributing\n\n🎁 Bug reports and pull requests for new features/ideas are most welcome!\n\n👷🏼 We are looking forward to your pull request, we'd love to help!\n\nYou can help by doing any of the following:\n\n- Reviewing pull requests\n- Bringing ideas for new features\n- Answering questions on issues\n- Improving documentation\n\n\nThis project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant code](http://contributor-covenant.org/) of conduct.\n\n### Contributor License Agreement\n\nContributions to this project must be accompanied by a Contributor License\nAgreement. You (or your employer) retain the copyright to your contribution,\nthis simply gives us permission to use and redistribute your contributions as\npart of the project. Find the agreement [here][XING CLA] and head over to [the\ncontributors page][contributors] and find a XING employee to contact for further\ninstructions.\n\nYou generally only need to submit a CLA once, so if you've already submitted one\n(even if it was for a different project), you probably don't need to do it\nagain.\n\n[XING CLA]: docs/XING_CLAv2.md\n[contributors]: https://github.com/xing/jungle/graphs/contributors\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxing%2Fjungle","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxing%2Fjungle","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxing%2Fjungle/lists"}