{"id":16713906,"url":"https://github.com/shepmaster/temporal-coupling","last_synced_at":"2026-02-22T21:37:48.758Z","repository":{"id":5948484,"uuid":"7169327","full_name":"shepmaster/temporal-coupling","owner":"shepmaster","description":"Explores git repositories to find files that are commonly changed together","archived":false,"fork":false,"pushed_at":"2012-12-25T04:24:37.000Z","size":173,"stargazers_count":12,"open_issues_count":1,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-06-11T07:50:03.502Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/shepmaster.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2012-12-14T17:40:43.000Z","updated_at":"2023-04-26T12:24:30.000Z","dependencies_parsed_at":"2022-08-28T03:42:51.581Z","dependency_job_id":null,"html_url":"https://github.com/shepmaster/temporal-coupling","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/shepmaster/temporal-coupling","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shepmaster%2Ftemporal-coupling","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shepmaster%2Ftemporal-coupling/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shepmaster%2Ftemporal-coupling/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shepmaster%2Ftemporal-coupling/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/shepmaster","download_url":"https://codeload.github.com/shepmaster/temporal-coupling/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shepmaster%2Ftemporal-coupling/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29728497,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-22T20:09:16.275Z","status":"ssl_error","status_checked_at":"2026-02-22T20:09:13.750Z","response_time":110,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":[],"created_at":"2024-10-12T20:48:30.449Z","updated_at":"2026-02-22T21:37:48.726Z","avatar_url":"https://github.com/shepmaster.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# temporal-coupling\n\ntemporal-coupling is a small tool intended to explore how files are\ncoupled together. Instead of parsing and analyzing code statically,\nit looks at what files are changed and committed together.\n\nThe premise is that files that change at the same time are coupled. In\ncertain cases, like a class and its unit tests, this coupling would\nbe expected and a good sign. In other cases, such as two seemingly\nunrelated classes, the high amount of coupling could be a code smell.\n\n# How to use\n\nCheckout a copy of this repository, then execute the following:\n\n```bash\n./bin/temporal-coupling --repo $PWD --since 2012-01-01\n```\n\nThis minimal invocation will provide statistics for this project\nitself - you will likely want to specify a more interesting\nrepository. After it collects data, you will be shown a few pieces of\ninformation:\n\n1. Most modified files\n2. Most modified pairs of files\n3. Common pairs of the most modified files\n\n## Ignoring uninteresting files\n\n`--exclude-file REGEX` will allow you to ignore files that match a\nRuby regular expression. For example, in a Ruby application that uses\nBundler, you might not care about how often the dependencies change,\ni.e. when `Gemfile` and `Gemfile.lock` are modified.\n\n```bash\n./bin/temporal-coupling --repo /path/to/ruby-app/.git --since 2012-01-01 --exclude-file '^Gemfile'\n```\n\nYou can use `--exclude-file` multiple times in a single execution.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshepmaster%2Ftemporal-coupling","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshepmaster%2Ftemporal-coupling","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshepmaster%2Ftemporal-coupling/lists"}