code_ownership 2.1.1 → 2.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. checksums.yaml +4 -4
  2. data/.cargo/config +2 -2
  3. data/Cargo.lock +2 -2
  4. data/README.md +8 -8
  5. data/ext/cargo-vendor/codeowners-0.3.2/.cargo-checksum.json +1 -0
  6. data/ext/cargo-vendor/codeowners-0.3.2/.github/CODEOWNERS +1 -0
  7. data/ext/cargo-vendor/codeowners-0.3.2/AGENTS.md +38 -0
  8. data/ext/cargo-vendor/codeowners-0.3.2/CLAUDE.md +1 -0
  9. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/Cargo.lock +1 -1
  10. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/Cargo.toml +17 -1
  11. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/README.md +11 -1
  12. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/cli.rs +9 -5
  13. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/config.rs +81 -1
  14. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/crosscheck.rs +5 -8
  15. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/ownership/codeowners_file_parser.rs +3 -3
  16. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/ownership/file_owner_resolver.rs +3 -1
  17. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/ownership/mapper/package_mapper.rs +2 -2
  18. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/ownership/mapper.rs +2 -2
  19. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/ownership/validator.rs +15 -10
  20. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/ownership.rs +1 -0
  21. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/project.rs +3 -0
  22. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/project_builder.rs +111 -44
  23. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/runner/api.rs +7 -6
  24. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/runner/types.rs +2 -1
  25. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/runner.rs +67 -16
  26. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/tracked_files.rs +29 -1
  27. data/ext/cargo-vendor/codeowners-0.3.2/tests/codeowners_path_test.rs +92 -0
  28. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/common/mod.rs +2 -1
  29. data/ext/cargo-vendor/codeowners-0.3.2/tests/executable_name_config_test.rs +67 -0
  30. data/ext/cargo-vendor/codeowners-0.3.2/tests/fixtures/custom_codeowners_path/config/code_ownership.yml +11 -0
  31. data/ext/cargo-vendor/codeowners-0.3.2/tests/fixtures/custom_codeowners_path/config/teams/test_team.yml +6 -0
  32. data/ext/cargo-vendor/codeowners-0.3.2/tests/fixtures/custom_codeowners_path/docs/CODEOWNERS +14 -0
  33. data/ext/cargo-vendor/codeowners-0.3.2/tests/fixtures/custom_codeowners_path/expected/CODEOWNERS +14 -0
  34. data/ext/cargo-vendor/codeowners-0.3.2/tests/fixtures/custom_codeowners_path/ruby/app/models/test.rb +3 -0
  35. data/ext/cargo-vendor/codeowners-0.3.2/tests/fixtures/custom_executable_name/.github/CODEOWNERS +10 -0
  36. data/ext/cargo-vendor/codeowners-0.3.2/tests/fixtures/custom_executable_name/app/foo.rb +3 -0
  37. data/ext/cargo-vendor/codeowners-0.3.2/tests/fixtures/custom_executable_name/config/code_ownership.yml +4 -0
  38. data/ext/cargo-vendor/codeowners-0.3.2/tests/fixtures/custom_executable_name/config/teams/foo.yml +5 -0
  39. data/ext/cargo-vendor/codeowners-0.3.2/tests/fixtures/custom_executable_name/config/teams/payments.yml +6 -0
  40. data/ext/cargo-vendor/codeowners-0.3.2/tests/fixtures/custom_executable_name/ruby/app/payments/foo.rb +4 -0
  41. data/ext/cargo-vendor/codeowners-0.3.2/tests/fixtures/default_executable_name/.github/CODEOWNERS +11 -0
  42. data/ext/cargo-vendor/codeowners-0.3.2/tests/fixtures/default_executable_name/app/bar.rb +3 -0
  43. data/ext/cargo-vendor/codeowners-0.3.2/tests/fixtures/default_executable_name/config/code_ownership.yml +5 -0
  44. data/ext/cargo-vendor/codeowners-0.3.2/tests/fixtures/default_executable_name/config/teams/bar.yml +5 -0
  45. data/ext/cargo-vendor/codeowners-0.3.2/tests/fixtures/missing_github_team/.github/CODEOWNERS +10 -0
  46. data/ext/cargo-vendor/codeowners-0.3.2/tests/fixtures/missing_github_team/config/code_ownership.yml +10 -0
  47. data/ext/cargo-vendor/codeowners-0.3.2/tests/fixtures/missing_github_team/config/teams/bad_team.yml +1 -0
  48. data/ext/cargo-vendor/codeowners-0.3.2/tests/fixtures/missing_github_team/config/teams/good.yml +3 -0
  49. data/ext/cargo-vendor/codeowners-0.3.2/tests/fixtures/valid_project/gems/pets/dog.rb +5 -0
  50. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/git_stage_test.rs +4 -1
  51. data/ext/cargo-vendor/codeowners-0.3.2/tests/missing_github_team_test.rs +23 -0
  52. data/ext/cargo-vendor/codeowners-0.3.2/tests/run_config_executable_override_test.rs +98 -0
  53. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/runner_api.rs +8 -4
  54. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/valid_project_test.rs +3 -3
  55. data/ext/cargo-vendor/codeowners-0.3.2/tests/validate_files_test.rs +378 -0
  56. data/ext/cargo-vendor/unicode-ident-1.0.19/.cargo-checksum.json +1 -1
  57. data/ext/code_ownership/Cargo.toml +1 -1
  58. data/ext/code_ownership/src/lib.rs +2 -2
  59. data/lib/code_ownership/private/file_path_finder.rb +19 -3
  60. data/lib/code_ownership/private/team_finder.rb +1 -2
  61. data/lib/code_ownership/version.rb +1 -1
  62. data/lib/code_ownership.rb +2 -0
  63. metadata +178 -152
  64. data/ext/cargo-vendor/codeowners-0.3.0/.cargo-checksum.json +0 -1
  65. data/ext/cargo-vendor/codeowners-0.3.0/tests/validate_files_test.rs +0 -144
  66. data/ext/cargo-vendor/unicode-ident-1.0.19/tests/fst/.gitignore +0 -1
  67. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/.github/workflows/audit.yml +0 -0
  68. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/.github/workflows/ci.yml +0 -0
  69. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/.github/workflows/dotslash-config.json +0 -0
  70. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/.rustfmt.toml +0 -0
  71. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/.rusty-hook.toml +0 -0
  72. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/dev/run_benchmarks_for_file.sh +0 -0
  73. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/dev/run_benchmarks_for_gv.sh +0 -0
  74. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/rust-toolchain.toml +0 -0
  75. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/cache/file.rs +0 -0
  76. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/cache/mod.rs +0 -0
  77. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/cache/noop.rs +0 -0
  78. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/common_test.rs +0 -0
  79. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/lib.rs +0 -0
  80. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/main.rs +0 -0
  81. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/ownership/codeowners_query.rs +0 -0
  82. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/ownership/file_generator.rs +0 -0
  83. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/ownership/file_owner_finder.rs +0 -0
  84. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/ownership/mapper/annotated_file_mapper.rs +0 -0
  85. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/ownership/mapper/directory_mapper.rs +0 -0
  86. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/ownership/mapper/escaper.rs +0 -0
  87. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/ownership/mapper/team_gem_mapper.rs +0 -0
  88. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/ownership/mapper/team_glob_mapper.rs +0 -0
  89. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/ownership/mapper/team_yml_mapper.rs +0 -0
  90. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/path_utils.rs +0 -0
  91. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/src/project_file_builder.rs +0 -0
  92. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/cache_test.rs +0 -0
  93. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/crosscheck_owners_test.rs +0 -0
  94. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/invalid_project/.github/CODEOWNERS +0 -0
  95. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/invalid_project/config/code_ownership.yml +0 -0
  96. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/invalid_project/config/teams/payments.yml +0 -0
  97. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/invalid_project/config/teams/payroll.yml +0 -0
  98. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/invalid_project/gems/payroll_calculator/calculator.rb +0 -0
  99. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/invalid_project/ruby/app/models/bank_account.rb +0 -0
  100. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/invalid_project/ruby/app/models/blockchain.rb +0 -0
  101. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/invalid_project/ruby/app/models/payroll.rb +0 -0
  102. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/invalid_project/ruby/app/payments/nacha.rb +0 -0
  103. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/invalid_project/ruby/app/services/.codeowner +0 -0
  104. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/invalid_project/ruby/app/services/multi_owned.rb +0 -0
  105. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/invalid_project/ruby/app/unowned.rb +0 -0
  106. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/invalid_project/ruby/packages/payroll_flow/package.yml +0 -0
  107. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/javascript_only_project/.github/CODEOWNERS +0 -0
  108. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/javascript_only_project/.keep +0 -0
  109. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/javascript_only_project/config/code_ownership.yml +0 -0
  110. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/javascript_only_project/config/teams/design.yml +0 -0
  111. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/javascript_only_project/config/teams/frontend.yml +0 -0
  112. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/javascript_only_project/frontend/apps/public/index.tsx +0 -0
  113. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/javascript_only_project/frontend/packages/dashboard/package.json +0 -0
  114. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/javascript_only_project/frontend/packages/dashboard/src/index.tsx +0 -0
  115. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/javascript_only_project/frontend/packages/ui-kit/.codeowner +0 -0
  116. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/javascript_only_project/frontend/packages/ui-kit/src/button.tsx +0 -0
  117. /data/ext/cargo-vendor/{codeowners-0.3.0/tests/fixtures/valid_project → codeowners-0.3.2/tests/fixtures/missing_github_team}/gems/pets/dog.rb +0 -0
  118. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/multiple-directory-owners/.github/CODEOWNERS +0 -0
  119. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/multiple-directory-owners/app/consumers/.codeowner +0 -0
  120. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/multiple-directory-owners/app/consumers/deep/nesting/nestdir/deep_file.rb +0 -0
  121. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/multiple-directory-owners/app/consumers/one_owner.rb +0 -0
  122. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/multiple-directory-owners/app/services/.codeowner +0 -0
  123. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/multiple-directory-owners/app/services/exciting/.codeowner +0 -0
  124. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/multiple-directory-owners/app/services/exciting/some_other_file.rb +0 -0
  125. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/multiple-directory-owners/config/code_ownership.yml +0 -0
  126. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/multiple-directory-owners/config/teams/bar.yml +0 -0
  127. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/multiple-directory-owners/config/teams/foo.yml +0 -0
  128. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project/.github/CODEOWNERS +0 -0
  129. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project/.ignore +0 -0
  130. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project/config/code_ownership.yml +0 -0
  131. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project/config/teams/payments.yml +0 -0
  132. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project/config/teams/payroll.yml +0 -0
  133. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project/config/teams/ux.yml +0 -0
  134. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project/gems/payroll_calculator/calculator.rb +0 -0
  135. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project/javascript/packages/PayrollFlow/index.tsx +0 -0
  136. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project/javascript/packages/PayrollFlow/package.json +0 -0
  137. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project/javascript/packages/items/(special)/.codeowner +0 -0
  138. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project/javascript/packages/items/(special)/pay.ts +0 -0
  139. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project/javascript/packages/items/.codeowner +0 -0
  140. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project/javascript/packages/items/item.ts +0 -0
  141. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project/javascript/packages/list/page-admin.tsx +0 -0
  142. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project/ruby/app/models/bank_account.rb +0 -0
  143. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project/ruby/app/models/payroll.rb +0 -0
  144. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project/ruby/app/payments/foo/.codeowner +0 -0
  145. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project/ruby/app/payments/foo/ownedby_payroll.rb +0 -0
  146. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project/ruby/app/payments/nacha.rb +0 -0
  147. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project/ruby/app/payroll/.codeowner +0 -0
  148. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project/ruby/app/payroll/payroll.rb +0 -0
  149. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project/ruby/app/views/foos/edit.erb +0 -0
  150. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project/ruby/app/views/foos/index.html.erb +0 -0
  151. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project/ruby/app/views/foos/new.html.erb +0 -0
  152. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project/ruby/ignored_files/git_ignored.rb +0 -0
  153. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project/ruby/packages/payroll_flow/package.yml +0 -0
  154. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project/should_be_ignored/an_ignored_file.rb +0 -0
  155. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/.github/CODEOWNERS +0 -0
  156. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/config/code_ownership.yml +0 -0
  157. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/config/teams/brewers.yml +0 -0
  158. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/config/teams/cubs.yml +0 -0
  159. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/config/teams/giants.yml +0 -0
  160. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/config/teams/rockies.yml +0 -0
  161. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/frontend/packages/components/datepicker/package.json +0 -0
  162. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/frontend/packages/components/datepicker/src/picks/dp.tsx +0 -0
  163. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/frontend/packages/components/list/package.json +0 -0
  164. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/frontend/packages/components/list/src/item.tsx +0 -0
  165. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/frontend/packages/components/textfield/package.json +0 -0
  166. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/frontend/packages/components/textfield/src/field.tsx +0 -0
  167. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/frontend/packages/components/textfield/src/fields/small.tsx +0 -0
  168. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/gems/apollo/lib/apollo.rb +0 -0
  169. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/gems/ivy/lib/ivy.rb +0 -0
  170. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/gems/lager/lib/lager.rb +0 -0
  171. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/gems/summit/lib/summit.rb +0 -0
  172. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/packs/games/app/services/stats.rb +0 -0
  173. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/packs/games/package.yml +0 -0
  174. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/packs/locations/app/services/capacity.rb +0 -0
  175. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/packs/locations/package.yml +0 -0
  176. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/packs/schedule/app/services/date.rb +0 -0
  177. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/packs/schedule/package.yml +0 -0
  178. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/ruby/app/brewers/lib/util.rb +0 -0
  179. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/ruby/app/brewers/services/play.rb +0 -0
  180. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/ruby/app/cubs/.codeowner +0 -0
  181. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/ruby/app/cubs/services/models/.codeowner +0 -0
  182. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/ruby/app/cubs/services/models/db/price.rb +0 -0
  183. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/ruby/app/cubs/services/models/entertainment.rb +0 -0
  184. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/ruby/app/cubs/services/play.rb +0 -0
  185. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/ruby/app/giants/services/play.rb +0 -0
  186. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/fixtures/valid_project_with_overrides/ruby/app/rockies/services/play.rb +0 -0
  187. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/invalid_project_structure_test.rs +0 -0
  188. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/invalid_project_test.rs +0 -0
  189. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/multiple_directory_owners_test.rs +0 -0
  190. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/untracked_files_test.rs +0 -0
  191. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tests/valid_project_with_overrides_test.rs +0 -0
  192. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.2}/tmp/.gitkeep +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 694c5ba85aff79d932dbe3976c3fe552b0781509aa1a39c0af89e5f727cd9ce1
4
- data.tar.gz: 1c360b9fd031fefb75f77d4907300b63be02ae9316bbcc6b33eb53870602fdcb
3
+ metadata.gz: d8fedeffce41aac3825e154fc451ffbacc71459b82811bb5d3cca37518f7de0a
4
+ data.tar.gz: 96a9b124d2b197f2427f146bc86fccf7e450d52154b9f60e70661c0615a75f1f
5
5
  SHA512:
6
- metadata.gz: 53c140fd95c1d935e8c1a2666ce73f05795702053e3d60a78ad5947ca867839c9a3406cd70427b33db2cfd120a1b53e676890d086948945a8626b8caee511efd
7
- data.tar.gz: db0f74d47095eac705be408d563d7cc553a6e21cc282fd4d0dd39cfe45051896539429255459a94e2584f476b1aacdc213ab92de7a97be04bc0f5ae0ef5ba445
6
+ metadata.gz: fd4f8f0b52eb97cc6e40e22c86b46c8e7dc91d78d8e1bef65ce57167176b4130a92c2be1b9e33e0818ddfc3f3eb60659a385f3cb23eeffbbf4f4b9d0ba734fea
7
+ data.tar.gz: f8d0f83ac58d7b70e46f7c50549c107bd30f6434a9584d1a794b5a192a1d0a23106db231f6ea4cc3449a3300a8ee3c029b1fafa7dd882e430c55528ed124c40b
data/.cargo/config CHANGED
@@ -1,9 +1,9 @@
1
1
  [source.crates-io]
2
2
  replace-with = "vendored-sources"
3
3
 
4
- [source."git+https://github.com/rubyatscale/codeowners-rs.git?tag=v0.3.0"]
4
+ [source."git+https://github.com/rubyatscale/codeowners-rs.git?tag=v0.3.2"]
5
5
  git = "https://github.com/rubyatscale/codeowners-rs.git"
6
- tag = "v0.3.0"
6
+ tag = "v0.3.2"
7
7
  replace-with = "vendored-sources"
8
8
 
9
9
  [source.vendored-sources]
data/Cargo.lock CHANGED
@@ -200,8 +200,8 @@ dependencies = [
200
200
 
201
201
  [[package]]
202
202
  name = "codeowners"
203
- version = "0.3.0"
204
- source = "git+https://github.com/rubyatscale/codeowners-rs.git?tag=v0.3.0#c3cace6a497f5708d3b78d1b91618fc90284ae0b"
203
+ version = "0.3.2"
204
+ source = "git+https://github.com/rubyatscale/codeowners-rs.git?tag=v0.3.2#49629b131eb788916ff5e6722719513026260480"
205
205
  dependencies = [
206
206
  "clap",
207
207
  "clap_derive",
data/README.md CHANGED
@@ -10,7 +10,7 @@ There is also a [companion VSCode Extension](https://github.com/rubyatscale/code
10
10
 
11
11
  ## Getting started
12
12
 
13
- To get started there's a few things you should do.
13
+ To get started there are a few things you should do.
14
14
 
15
15
  1. Create a `config/code_ownership.yml` file and declare where your files live. Here's a sample to start with:
16
16
 
@@ -42,7 +42,7 @@ There are five ways to declare code ownership using this gem:
42
42
 
43
43
  ### Directory-Based Ownership
44
44
 
45
- Directory based ownership allows for all files in that directory and all its sub-directories to be owned by one team. To define this, add a `.codeowner` file inside that directory with the name of the team as the contents of that file.
45
+ Directory-based ownership allows for all files in that directory and all its sub-directories to be owned by one team. To define this, add a `.codeowner` file inside that directory with the name of the team as the contents of that file.
46
46
 
47
47
  ```
48
48
  Team
@@ -58,7 +58,7 @@ File annotations are a last resort if there is no clear home for your code. File
58
58
 
59
59
  ### Package-Based Ownership
60
60
 
61
- Package based ownership integrates [`packwerk`](https://github.com/Shopify/packwerk) and has ownership defined per package. To define that all files within a package are owned by one team, configure your `package.yml` like this:
61
+ Package-based ownership integrates [`packwerk`](https://github.com/Shopify/packwerk) and has ownership defined per package. To define that all files within a package are owned by one team, configure your `package.yml` like this:
62
62
 
63
63
  ```yml
64
64
  enforce_dependency: true
@@ -92,7 +92,7 @@ unowned_globs:
92
92
 
93
93
  ### Javascript Package Ownership
94
94
 
95
- Javascript package based ownership allows you to specify an ownership key in a `package.json`. To use this, configure your `package.json` like this:
95
+ JavaScript package-based ownership allows you to specify an ownership key in a `package.json`. To use this, configure your `package.json` like this:
96
96
 
97
97
  ```json
98
98
  {
@@ -112,10 +112,10 @@ js_package_paths:
112
112
  - frontend/other_location_for_packages/*
113
113
  ```
114
114
 
115
- This defaults `**/`, which makes it look for `package.json` files across your application.
115
+ This defaults to `**/`, which makes it look for `package.json` files across your application.
116
116
 
117
117
  > [!NOTE]
118
- > Javscript package ownership does not respect `unowned_globs`. If you wish to disable usage of this feature you can set `js_package_paths` to an empty list.
118
+ > JavaScript package ownership does not respect `unowned_globs`. If you wish to disable usage of this feature you can set `js_package_paths` to an empty list.
119
119
 
120
120
  ```yml
121
121
  js_package_paths: []
@@ -184,7 +184,7 @@ If `codeowners_path` is set in `code_ownership.yml` codeowners will use that pat
184
184
  CodeOwnership comes with a validation function to ensure the following things are true:
185
185
 
186
186
  1. Only one mechanism is defining file ownership. That is -- you can't have a file annotation on a file owned via package-based or glob-based ownership. This helps make ownership behavior more clear by avoiding concerns about precedence.
187
- 2. All teams referenced as an owner for any file or package is a valid team (i.e. it's in the list of `CodeTeams.all`).
187
+ 2. All teams referenced as an owner for any file or package are valid teams (i.e. they're in the list of `CodeTeams.all`).
188
188
  3. All files have ownership. You can specify in `unowned_globs` to represent a TODO list of files to add ownership to.
189
189
  4. The `.github/CODEOWNERS` file is up to date. This is automatically corrected and staged unless specified otherwise with `bin/codeownership validate --skip-autocorrect --skip-stage`. You can turn this validation off by setting `skip_codeowners_validation: true` in `config/code_ownership.yml`.
190
190
 
@@ -223,7 +223,7 @@ codeownership validate --diff
223
223
 
224
224
  ## Development
225
225
 
226
- Please add to `CHANGELOG.md` and this `README.md` when you make make changes.
226
+ Please add to `CHANGELOG.md` and this `README.md` when you make changes.
227
227
 
228
228
  ## Running specs
229
229
 
@@ -0,0 +1 @@
1
+ {"files":{".github/CODEOWNERS":"8df3f986d37e09c1e9d8102c45e8776a506cd56b75a9fe03270626e4843c0ad0",".github/workflows/audit.yml":"bde77859031fa481da1fcaf399129b64819d78a0ffbbb2d4c4f5346f4a4dec7e",".github/workflows/ci.yml":"a4b503d5b650f4d59d7e02b3a33f623c373f1ae8c892b6ddcc47b271b7d109db",".github/workflows/dotslash-config.json":"21dbdefc13a01f3aad42923963b9025907d4049d8e75b18208e887f9e601e381",".rustfmt.toml":"394616646760b18ed094433d39e18b7d94986347c21790708bff9ab001f38e0b",".rusty-hook.toml":"9d3d8a8f4f20d80682ce71889a17eb5ba204f4636f27211fafcb6c6b5af5c2bb","AGENTS.md":"9cab0708a38900826f5b5804fc921ea3aea293f533727100bcfb5735f7835d05","CLAUDE.md":"336cc4fbf19beaada7ccf9986414fa91851a8d7a07dfb3ccbe800a69eed0ab49","Cargo.lock":"78fffcf69a203c94181059deecd0733495c85d5947b7765329f39f5aae3f7cf9","Cargo.toml":"6f0840ff57ba26a1ce127a4439107b2d7270d22b87987663b2039edc13aaeb19","README.md":"11b96c2361db6e2ad82fecb354b767d55d7f77656694e10990685fe8c6c644bb","dev/run_benchmarks_for_file.sh":"f633c0fbfd1ea89b3fb21cf2721ab481670cf2de8d424bb4448a4ad5e908c38d","dev/run_benchmarks_for_gv.sh":"c3e26bed04b3f2ab5dce3372db249349990b9033fe5ed963d5b7f58a4a72ffbf","rust-toolchain.toml":"b6a9e4028a0a266a7d2055c287092b816c89336df42076dec9d9aaa4c0007c0e","src/cache/file.rs":"7ffe92cce38b2a21e8d9f7eb85b50e54a90523546a68b5441b423204b9aae940","src/cache/mod.rs":"622ad6effc3260c922fe49f3800e0d1c5b3c6a73c81d567296ea6cb550792d32","src/cache/noop.rs":"abfddf1c20cbaca5dd432952d0ff0a0a1d92eb0070866d343e368f29cdd22de9","src/cli.rs":"ddee568b1a2e3de96027e6e2caa9f0ece5f677ecc66671676100b14d3ab51353","src/common_test.rs":"9df12547039d3d99dd7dd8798a35960892f7bbcf74036adbdcf4a14b8567a743","src/config.rs":"2646a547371617acb0935941f134a131d66174ecd156792e644b7ab3d49c0b74","src/crosscheck.rs":"f5f52c735e09da7fa413c51c2f81a349f8c62782041c7649fc18909d59efcea6","src/lib.rs":"8a2946ae156e306a2245857e295886a369fa2c3ef2bace585185f64c47e293be","src/main.rs":"51f0621733107ff3505cfffdf84b557e7fdbc79189f55561d8fb9ad550d6fb78","src/ownership.rs":"29287dd073294afd2826b6754175d09ca87773191af2218487ff9e703ccd2035","src/ownership/codeowners_file_parser.rs":"0f798722af3a0adb0b8b790e871e56257d9f265ed2d8542f0d202eca5afca2f4","src/ownership/codeowners_query.rs":"30556b0ee2c38c1ca9283763df1ad7ddd7f964bc8d449c0bf2f935c387fe1673","src/ownership/file_generator.rs":"8b5d3fd03733f1b1c1b76be0b20467f2b50799d2a3a7806dc3df52147a470a46","src/ownership/file_owner_finder.rs":"104626da603ddcaccb217387f13141c81fb768b41cf8b7fbc5f65809f487231b","src/ownership/file_owner_resolver.rs":"02d72fd4edeaad36b3454fe1c1e638665d208a14c09a8dd26465fad4a5bd90e2","src/ownership/mapper.rs":"a3bd5bc0bf7423fd061a044bd9fcc1d1b6bccd24e914b1f90a10a6fac56cc2f9","src/ownership/mapper/annotated_file_mapper.rs":"f34f845ddb45545f02f8ae2ab83c3934bc38dd95f9ba9d4142e12f61dfac271a","src/ownership/mapper/directory_mapper.rs":"a86866b518efbfdbb056a2d472c981eec875f2ddca5899f029405b76e875b018","src/ownership/mapper/escaper.rs":"2faa41beefedca26d493e8d8f68882384ddbb2c4b108953f30b960847a3f841c","src/ownership/mapper/package_mapper.rs":"394297b4c5890fb3a6b0289b78cec63fbb2e15fb4dc043e9d3ba0cb00769b7f6","src/ownership/mapper/team_gem_mapper.rs":"50b6ad9e60c03e055662724296576b4586167b0d7d6c03819f98b30c0f37342f","src/ownership/mapper/team_glob_mapper.rs":"ce0638118ec9c610210880534a62740f9bd4d15494b0b9516bcc11fa2bbfb508","src/ownership/mapper/team_yml_mapper.rs":"3c759139fc9ff362b82102aeaec958aec7ec9df86df87482a3362ab8ea54404f","src/ownership/validator.rs":"f775ebe330f48a6988fdb911a138b0ba4939423112e5e3647a7c38b73cccbbe2","src/path_utils.rs":"de5f7fc080f372ca025f777a5018319236f5b83c2c1ac77f9a387e62ce683ab4","src/project.rs":"26fac1893915f978f32eb80c5a8cf39ff37dc05f77e445e7e4fea8aba36a8f7c","src/project_builder.rs":"725a19d4e68cac2d7348bcfbc2b9c8b35f1d789247a3746e3adb70277485d1ac","src/project_file_builder.rs":"d0be8786d8160ad40d2286c9e43e11df1d38dbb7f7c84f5029d4656b19d75cbf","src/runner.rs":"7ab4f07660e249f5301e8944ab82e24df48012f6fa7a70ea81b8ef912cce8f8d","src/runner/api.rs":"c7e9815fbf654665da9d11d6b2405f623ed2fc36b93c37db212421351e9a779b","src/runner/types.rs":"30be32563f7fee61ca991618874dda497ccbe1d7c3fde4c023fd9eaa90ce7853","src/tracked_files.rs":"85ab07d649a5a9d90181489f8ebb7c173af4547ca267bc277b5bcf7534715823","tests/cache_test.rs":"80b900f38e177eb8c9e162b9373cd1d7c3a551baade716a1b07554a021bfef05","tests/codeowners_path_test.rs":"6e10631bcd93bbb850eed2818de057f0621c714137a11676f0a689f775699f52","tests/common/mod.rs":"ea2b9de36002a946c3ab6ed4101ff7c395c7a0f9ac143c12618a3d27fc8e15e4","tests/crosscheck_owners_test.rs":"8f83ec2feb7bef1cf34fec445096a342900359e5efed3b0b9485d48dad6e704d","tests/executable_name_config_test.rs":"193f675cd4b48798c1d536b3e07abe602bec580035f22ef143bf2e4fca00fbb0","tests/fixtures/custom_codeowners_path/config/code_ownership.yml":"3c9a4b046bab1f4d842e728dc9dea32ec09e7d01b6db5d1726e71ab330773b0e","tests/fixtures/custom_codeowners_path/config/teams/test_team.yml":"93ecfdd871a5e12e11293fd920988f82a67cb1a6fe39740a988a3e3fd0fda68f","tests/fixtures/custom_codeowners_path/docs/CODEOWNERS":"53db3b0313340fc5ce3a4c8050d1d8e7c1fb4fae1050e5bb047d3b211afed272","tests/fixtures/custom_codeowners_path/expected/CODEOWNERS":"53db3b0313340fc5ce3a4c8050d1d8e7c1fb4fae1050e5bb047d3b211afed272","tests/fixtures/custom_codeowners_path/ruby/app/models/test.rb":"d4218b8bc15617dd06a04632896ff45547545d2b1a0847adf5db860ac7ca060f","tests/fixtures/custom_executable_name/.github/CODEOWNERS":"1cbe2dc8b6f050c3ab084aeb6182abed325274a95101ccb74d7410bb9e787cca","tests/fixtures/custom_executable_name/app/foo.rb":"083a6a7028749e3ef5397011b695037d958d5535cc332f666a853f06649cc0e4","tests/fixtures/custom_executable_name/config/code_ownership.yml":"107fab4d8816bcf1d0f70663450db390b713bdaa45a16ffbc7095663d44b5ca1","tests/fixtures/custom_executable_name/config/teams/foo.yml":"e2ebda8a83ab460456238351c112fa34fd056603ab556ef86afb10565aaa4398","tests/fixtures/custom_executable_name/config/teams/payments.yml":"9a333c4b5ad8abb3cc0610fa5562e499dc5665bbdd25755ba39b13ebea08940b","tests/fixtures/custom_executable_name/ruby/app/payments/foo.rb":"e4e0884c8dbbb76a53fa1a1877925cef81724fc8618d73056857209820acd42f","tests/fixtures/default_executable_name/.github/CODEOWNERS":"3520d8681f4c8958ac29fecf5ce12d95bef7e5376f07b80cdca09611a092087e","tests/fixtures/default_executable_name/app/bar.rb":"522851f30712c0df9f444af429a0e2bbfb9d095c0af3b4bdb925eb80d088680e","tests/fixtures/default_executable_name/config/code_ownership.yml":"85c44e76a650b80a46eadc44bc4e6f184a8d405b63b2bf186726b2974e083a2f","tests/fixtures/default_executable_name/config/teams/bar.yml":"8a4369cf629089eec906495d05f3ef58ece3e17dd860e452cceec18bad1dfcef","tests/fixtures/invalid_project/.github/CODEOWNERS":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","tests/fixtures/invalid_project/config/code_ownership.yml":"395b9023f51a29b8326a230c82543d8e8e7656376b4d82b1e77c7c5879620a30","tests/fixtures/invalid_project/config/teams/payments.yml":"205b0d200a5b686ad91c4080eadeefef200cc4974939b5ef02c15ef2edf775a1","tests/fixtures/invalid_project/config/teams/payroll.yml":"f3a85ce896837c2a9d38c2d23a600b1fd72f3bf8c4c65c12719ce942b3b17375","tests/fixtures/invalid_project/gems/payroll_calculator/calculator.rb":"350c85edfe24cd54b2479eda5266aae894b4c5eb6e9a3c0a0a1fb30e8c4d1d0f","tests/fixtures/invalid_project/ruby/app/models/bank_account.rb":"0832b2e95f90fa7ebd8dcbfd53c05618f091d38abf5dd238bd4d41645746160d","tests/fixtures/invalid_project/ruby/app/models/blockchain.rb":"9ffaa2304d02b8d40050017b62edbaf61b8600dc0b1a2c5b7f069b7c55c30616","tests/fixtures/invalid_project/ruby/app/models/payroll.rb":"7f48f8730fd738a2760ee81be8a6028cccb3c6c38be0433c7fd81a4bdd631b60","tests/fixtures/invalid_project/ruby/app/payments/nacha.rb":"c5ced2841986f3d48be0a132185a39dbc327715064574887303a25cf02aaad4d","tests/fixtures/invalid_project/ruby/app/services/.codeowner":"53fe8dfb6d9e1b03219adddcc3ffb741557dd579dc653d026097c463def4a8fe","tests/fixtures/invalid_project/ruby/app/services/multi_owned.rb":"42b340c67ad95016eb7e852abe37b39f7a0b5be41f897f972e05d2e581d6c30f","tests/fixtures/invalid_project/ruby/app/unowned.rb":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","tests/fixtures/invalid_project/ruby/packages/payroll_flow/package.yml":"c1a08643821d02a57131870e8b6325f864db0687c5583f3d0872ada9d004072a","tests/fixtures/javascript_only_project/.github/CODEOWNERS":"fbd7770603296872c5993d1325a2d00a8d1704ad99002db9ab0dccc7182e3b37","tests/fixtures/javascript_only_project/.keep":"ff2dc9018b2c43a9793444552abcf83560daf5f7b1733bf7dbcaed4ee97db60e","tests/fixtures/javascript_only_project/config/code_ownership.yml":"b9cdde18cb0f0e8c025342c8d633197c401083f475ef34d7f9228ef343a0ba21","tests/fixtures/javascript_only_project/config/teams/design.yml":"6db44f08e2b0fb9e5bd91a83ba122025cf7e7a008703c39df9d0b10306a6e752","tests/fixtures/javascript_only_project/config/teams/frontend.yml":"f9fa6eee0ed9fc5a0b44485c306bb11785f9120a871c5e0bc074a5eacb808686","tests/fixtures/javascript_only_project/frontend/apps/public/index.tsx":"b3c88c0731b4b739d120f161266a501743a58577db571702dc6f3f0fd1483b4d","tests/fixtures/javascript_only_project/frontend/packages/dashboard/package.json":"3dd571d4d569608311ddab4a99cfe5596ab4c29fd0bade76ee9756cf28b0ac48","tests/fixtures/javascript_only_project/frontend/packages/dashboard/src/index.tsx":"5ef179897d55e9e8c6b70e5ad82803b11f0fcd5cfb3c7313e87b839798608e15","tests/fixtures/javascript_only_project/frontend/packages/ui-kit/.codeowner":"b5f4517c94406cb8d45702193f8282b62af30971d068e79d7bc2fd930cb0bb4c","tests/fixtures/javascript_only_project/frontend/packages/ui-kit/src/button.tsx":"7c18c050058f884a7f096b9fd4b1ccf853bc4e84dd786b5a92c5f0479b32f128","tests/fixtures/missing_github_team/.github/CODEOWNERS":"2a2f3c33c892b3ca170925e6f428d6bd506008f8343c67f640f55741ff22d611","tests/fixtures/missing_github_team/config/code_ownership.yml":"eb683ba7b42f810b457e1181626c6eb3b44bd5c80ba396bc0e8d29334a8187bf","tests/fixtures/missing_github_team/config/teams/bad_team.yml":"93cc7413631ce8fd5f95d083c9061f923de32e7c756bc6f0c9b17d593e4c4c12","tests/fixtures/missing_github_team/config/teams/good.yml":"bb8d9ea5106b9b87d17b3e72de7802f39f1879764fd99b13738cfdb43d503973","tests/fixtures/missing_github_team/gems/pets/dog.rb":"ed2553442d1646af1c421a7a04b92269612efbc5ec0ccb32930e27ceac65b2ea","tests/fixtures/multiple-directory-owners/.github/CODEOWNERS":"957d160c3d00eb530f7ebb34cc9b7c61934d108eb52ce3cb03b6d9978fad86df","tests/fixtures/multiple-directory-owners/app/consumers/.codeowner":"842c88863910f6eab22edcbdbe9f0f4dd96c6b46c711bd40277b36b8178943c4","tests/fixtures/multiple-directory-owners/app/consumers/deep/nesting/nestdir/deep_file.rb":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","tests/fixtures/multiple-directory-owners/app/consumers/one_owner.rb":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","tests/fixtures/multiple-directory-owners/app/services/.codeowner":"3eae1599bb7f187b86d6427942d172ba8dd7ee5962aab03e0839ad9d59c37eb0","tests/fixtures/multiple-directory-owners/app/services/exciting/.codeowner":"842c88863910f6eab22edcbdbe9f0f4dd96c6b46c711bd40277b36b8178943c4","tests/fixtures/multiple-directory-owners/app/services/exciting/some_other_file.rb":"c0cf1112663d326ba9b47fbcf961e98170c32e9287d5af574c35b3350fb3c59a","tests/fixtures/multiple-directory-owners/config/code_ownership.yml":"fcff2625d3a836924e75afd4a326c8f425a9ac4b4c5ffe276b8a14a083cc005a","tests/fixtures/multiple-directory-owners/config/teams/bar.yml":"253d9d9cb7f5b5cb81af19d8af7631b510d0f4ad59b32465c5e26bd78886f9c6","tests/fixtures/multiple-directory-owners/config/teams/foo.yml":"d4ba6d61c16e4227681f13013775e3d117e0cee4631714849405c47ff36ecbfc","tests/fixtures/valid_project/.github/CODEOWNERS":"ca6a9b2a225685b478fb7b542dd63ab945cd51ccd82b4d86495b3a3d7c020b6c","tests/fixtures/valid_project/.ignore":"68f30767f9c87c700952d52d9d39693e1a98efb6c07a0b9216fbc87d173ebb5e","tests/fixtures/valid_project/config/code_ownership.yml":"1443a689ff1b64d23cf6590b5d559ef386b549815f51bfe8a27ecd5f3111a5b8","tests/fixtures/valid_project/config/teams/payments.yml":"7c4edf4ab7db59c1ef13ef4e7aa498c8e8c23c19427ebebe4f43bca003619f2a","tests/fixtures/valid_project/config/teams/payroll.yml":"f3a85ce896837c2a9d38c2d23a600b1fd72f3bf8c4c65c12719ce942b3b17375","tests/fixtures/valid_project/config/teams/ux.yml":"918e96ab1b5c67c99b30b8e984c2cef8fa956b1c83802a76923b3f448bcdec62","tests/fixtures/valid_project/gems/payroll_calculator/calculator.rb":"991056cdd4824eea15055f9c055c22fb3281cc21cffbca94724b330b8a450e59","tests/fixtures/valid_project/gems/pets/dog.rb":"ed2553442d1646af1c421a7a04b92269612efbc5ec0ccb32930e27ceac65b2ea","tests/fixtures/valid_project/javascript/packages/PayrollFlow/index.tsx":"b78b223d3bdb83af6ef7f78bd305f6e18f11abf961ded3266f7bebdb9eb00686","tests/fixtures/valid_project/javascript/packages/PayrollFlow/package.json":"271a0bb50784a65df66fd5db7167d1dd67430c774c207eda58a96974dbafc408","tests/fixtures/valid_project/javascript/packages/items/(special)/.codeowner":"632e1c5839411a1009ef268e992c4b183cb1d5381b198eac0f8323213a61ed82","tests/fixtures/valid_project/javascript/packages/items/(special)/pay.ts":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","tests/fixtures/valid_project/javascript/packages/items/.codeowner":"53fe8dfb6d9e1b03219adddcc3ffb741557dd579dc653d026097c463def4a8fe","tests/fixtures/valid_project/javascript/packages/items/item.ts":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","tests/fixtures/valid_project/javascript/packages/list/page-admin.tsx":"4785eb6da46cfac5a74130f51a032d565824a0cfdde8f853530bd1e16baa8a95","tests/fixtures/valid_project/ruby/app/models/bank_account.rb":"0832b2e95f90fa7ebd8dcbfd53c05618f091d38abf5dd238bd4d41645746160d","tests/fixtures/valid_project/ruby/app/models/payroll.rb":"00214579a6b59629d74eb60e315b9e1cd77889ba54d46f0fa8e2936e7fbc4c53","tests/fixtures/valid_project/ruby/app/payments/foo/.codeowner":"53fe8dfb6d9e1b03219adddcc3ffb741557dd579dc653d026097c463def4a8fe","tests/fixtures/valid_project/ruby/app/payments/foo/ownedby_payroll.rb":"705296c5ae6b3c1efdb410c952095b6efba3f9edd0af1b42d20e6ba217b1744d","tests/fixtures/valid_project/ruby/app/payments/nacha.rb":"c5ced2841986f3d48be0a132185a39dbc327715064574887303a25cf02aaad4d","tests/fixtures/valid_project/ruby/app/payroll/.codeowner":"b58412ec67186588652c88a6c71fd7499e27984e1e587e137426bed8ddd53173","tests/fixtures/valid_project/ruby/app/payroll/payroll.rb":"ff6cb08457469043bd93b4fdbcecc37a29a506641ab486f9cafd319125ff00ca","tests/fixtures/valid_project/ruby/app/views/foos/edit.erb":"47a411fb8b793bf622fdb956f89a3b20835cd92201b61141f09748f8ff55ee21","tests/fixtures/valid_project/ruby/app/views/foos/index.html.erb":"4b7fd88053dfa83a4131200ed3196b41938e4a68119570e4aa1652ecdd7c6bfe","tests/fixtures/valid_project/ruby/app/views/foos/new.html.erb":"47a411fb8b793bf622fdb956f89a3b20835cd92201b61141f09748f8ff55ee21","tests/fixtures/valid_project/ruby/ignored_files/git_ignored.rb":"fb333306f05e93ff821123b1c09d264c5f37f1bd739156d91167789795704671","tests/fixtures/valid_project/ruby/packages/payroll_flow/package.yml":"c1a08643821d02a57131870e8b6325f864db0687c5583f3d0872ada9d004072a","tests/fixtures/valid_project/should_be_ignored/an_ignored_file.rb":"bd5ce0746f05ded73148e184b36741f3846e0af7409b42c16abae54a9220113a","tests/fixtures/valid_project_with_overrides/.github/CODEOWNERS":"99438c376b9ef057e5182f0197b42f7bb644773d181f1f94f3a7b2028052af34","tests/fixtures/valid_project_with_overrides/config/code_ownership.yml":"d4349ca21efdfd2a8247907db492e85aecea013f3977fabc5cc1a8a6411f7c3d","tests/fixtures/valid_project_with_overrides/config/teams/brewers.yml":"c45a00561fdaa703ed3a044a5c0271bd9d3e9fad64c3df58e17b07c38d151907","tests/fixtures/valid_project_with_overrides/config/teams/cubs.yml":"1bb8b70d29e97b2c78f35f84be18cafe2f3334bd81c45601217b1abdfcbdb088","tests/fixtures/valid_project_with_overrides/config/teams/giants.yml":"fdaead5b59332f408abc7e6a099f4773be232942532ae501aadc6d7f0110e302","tests/fixtures/valid_project_with_overrides/config/teams/rockies.yml":"0334aa2d3ba78261fb776f565ef38f1e19638e0fa5e05cae5785cec036ca7138","tests/fixtures/valid_project_with_overrides/frontend/packages/components/datepicker/package.json":"02e3dd340b4c1ab53bc2925164666b7c8c92cfb5afff7cdffcbb0760c0f23b56","tests/fixtures/valid_project_with_overrides/frontend/packages/components/datepicker/src/picks/dp.tsx":"7709ee4137249bf9d5c38687533304e7e04a174d233bc6f6e8a1f0de54689907","tests/fixtures/valid_project_with_overrides/frontend/packages/components/list/package.json":"9b95dfa430e9167629e1d908ccbef8ed17e3818fcc04c10cd11aee1ba806f8d9","tests/fixtures/valid_project_with_overrides/frontend/packages/components/list/src/item.tsx":"8360b4a2d4b8705c5d070b0834e7f4d1e8fc3fdac4221dd5a1ac33a2b256d1bb","tests/fixtures/valid_project_with_overrides/frontend/packages/components/textfield/package.json":"5676381fcd3acf9d7daa0f28eaf47b7fc481b7b826469655675ddd0bd4548429","tests/fixtures/valid_project_with_overrides/frontend/packages/components/textfield/src/field.tsx":"6821d8fe047c903a1b4a897ed1bed9638e556098db653518c3700507236a9cdc","tests/fixtures/valid_project_with_overrides/frontend/packages/components/textfield/src/fields/small.tsx":"18d9323ac98ac4bd4a685193763e1f29426be5ac8c4d7e7975945d79644226fd","tests/fixtures/valid_project_with_overrides/gems/apollo/lib/apollo.rb":"0470c442f361f8df49268fc1ea6d84f9512598d43595d54d6bda896a13e144f5","tests/fixtures/valid_project_with_overrides/gems/ivy/lib/ivy.rb":"54f5443bef6aebcb63ab0501f418c8b03928514a8a7ac9ed41d35dfb619a24b1","tests/fixtures/valid_project_with_overrides/gems/lager/lib/lager.rb":"d90ceebb7bc6156b2e3b3a88274f6a330f6b33f1b7404a3d1561618d9ae261f3","tests/fixtures/valid_project_with_overrides/gems/summit/lib/summit.rb":"ef61bf61c1d574c562d8d2d7e6692e0bb0cdb3e02b49691d3558cb205a6b3d27","tests/fixtures/valid_project_with_overrides/packs/games/app/services/stats.rb":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","tests/fixtures/valid_project_with_overrides/packs/games/package.yml":"d44cb7e67286294b43fc51e7eefd36fecb488bd7e3aa1c15ba5e2f0fd1364806","tests/fixtures/valid_project_with_overrides/packs/locations/app/services/capacity.rb":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","tests/fixtures/valid_project_with_overrides/packs/locations/package.yml":"ae1e90f7aadaa78fed7c97083dd0f46b394e53b848c08cf370b59c0f8de25e1c","tests/fixtures/valid_project_with_overrides/packs/schedule/app/services/date.rb":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","tests/fixtures/valid_project_with_overrides/packs/schedule/package.yml":"e97c4d452c4656b9e7b3c22093d5969c4a59a8c019a4fc7ef513c5748f6a9ede","tests/fixtures/valid_project_with_overrides/ruby/app/brewers/lib/util.rb":"92be44095fe84e95ea5ce3f5b42cc9681063646135c8163017a56d407a367005","tests/fixtures/valid_project_with_overrides/ruby/app/brewers/services/play.rb":"1c4d38afc6eed1eac4681fa774dfc1fbcad894b245616c88efcf7afff21e7762","tests/fixtures/valid_project_with_overrides/ruby/app/cubs/.codeowner":"870f5b1fed86d50ea4a808b13b307f172b5e39b9be296cff27ad9babbcd384e9","tests/fixtures/valid_project_with_overrides/ruby/app/cubs/services/models/.codeowner":"d706f1c0496146d6009e700d1e78c4f0f0927edf73c656ec59fccf40a72d4291","tests/fixtures/valid_project_with_overrides/ruby/app/cubs/services/models/db/price.rb":"b571b23154f35a482975537bb752975c7957d78b02163842e9afb52513e3b8ce","tests/fixtures/valid_project_with_overrides/ruby/app/cubs/services/models/entertainment.rb":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","tests/fixtures/valid_project_with_overrides/ruby/app/cubs/services/play.rb":"e4b77f45119ecc9cead0a189f90295ff16e15a35c38763bd0942b5aa6aad83b2","tests/fixtures/valid_project_with_overrides/ruby/app/giants/services/play.rb":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","tests/fixtures/valid_project_with_overrides/ruby/app/rockies/services/play.rb":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","tests/git_stage_test.rs":"145b13404ccec67a420fbc59e8b137cd394e612b2bab1f76d7e175c29ef7d4ab","tests/invalid_project_structure_test.rs":"af048ddfa756bc2e187ea885ea533a4b67907c5bcc531a082ffceca0728649b4","tests/invalid_project_test.rs":"7dbb00616f95308c5b597f09faa8721c2df416d5dfc00b95a9698a5ee1c4919d","tests/missing_github_team_test.rs":"e279592be3a68bb348066f90543f9ec8e702d2876cd524a55acaaf86a579fea7","tests/multiple_directory_owners_test.rs":"8fec90a2c1bcdd8886987a33d9c4afcd0094ce102cfa3d0415bcc2b5354eae80","tests/run_config_executable_override_test.rs":"1ffac121827dc2065460ff0ae4243704084441bc6d642396bc5e9a1d01c5b401","tests/runner_api.rs":"aa8d909b760e43f30c7b3b9dff761c6dd917ea51feb5baeb33ed191475a0fc3f","tests/untracked_files_test.rs":"f4c1906b6591ae7f206f3ac0838c99a35c5fb81f650928ed929e6246549d9874","tests/valid_project_test.rs":"4c76f2770f80c6a6d720a2ee970c176f7a813a5f3af6d0086f866478248c9e11","tests/valid_project_with_overrides_test.rs":"77150218cc4e6d7527d910d89cc3303f8d02671e6686069a41e2484b4fa31f59","tests/validate_files_test.rs":"517eb0f41405f2b1b3a69487c2a4fe526736bbadacce57e0fa0b57e5fba381df","tmp/.gitkeep":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},"package":null}
@@ -0,0 +1 @@
1
+ * @rubyatscale/ruby-at-scale
@@ -0,0 +1,38 @@
1
+ This file provides guidance to AI coding agents when working with code in this repository.
2
+
3
+ ## What this project is
4
+
5
+ `codeowners-rs` is a Rust implementation of a CODEOWNERS resolver. It parses CODEOWNERS files and determines ownership of files in a repository, used as both a library and CLI tool.
6
+
7
+ ## Commands
8
+
9
+ ```bash
10
+ # Build
11
+ cargo build
12
+ cargo build --release
13
+
14
+ # Run all tests
15
+ cargo test
16
+
17
+ # Run a single test by name
18
+ cargo test test_name
19
+
20
+ # Lint
21
+ cargo clippy --all-targets --all-features
22
+ cargo fmt --all -- --check # check only
23
+ cargo fmt --all # apply formatting
24
+
25
+ # Check compilation without building
26
+ cargo check
27
+ ```
28
+
29
+ ## Architecture
30
+
31
+ - `src/main.rs` — CLI entry point using `clap`
32
+ - `src/lib.rs` — library root; exposes the public API
33
+ - `src/ownership.rs` / `src/ownership/` — core ownership resolution logic: parses CODEOWNERS patterns and matches them against file paths
34
+ - `src/config.rs` — configuration loading
35
+ - `src/runner/` — orchestrates file walking and ownership resolution
36
+ - `src/cache/` — caching layer for resolved ownership results
37
+ - `src/cli.rs` — CLI command definitions
38
+ - Integration tests in `src/common_test.rs`; fixture data used in tests lives alongside test files
@@ -0,0 +1 @@
1
+ @AGENTS.md
@@ -179,7 +179,7 @@ checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675"
179
179
 
180
180
  [[package]]
181
181
  name = "codeowners"
182
- version = "0.3.0"
182
+ version = "0.3.2"
183
183
  dependencies = [
184
184
  "assert_cmd",
185
185
  "clap",
@@ -12,7 +12,7 @@
12
12
  [package]
13
13
  edition = "2024"
14
14
  name = "codeowners"
15
- version = "0.3.0"
15
+ version = "0.3.2"
16
16
  build = false
17
17
  autolib = false
18
18
  autobins = false
@@ -33,10 +33,18 @@ path = "src/main.rs"
33
33
  name = "cache_test"
34
34
  path = "tests/cache_test.rs"
35
35
 
36
+ [[test]]
37
+ name = "codeowners_path_test"
38
+ path = "tests/codeowners_path_test.rs"
39
+
36
40
  [[test]]
37
41
  name = "crosscheck_owners_test"
38
42
  path = "tests/crosscheck_owners_test.rs"
39
43
 
44
+ [[test]]
45
+ name = "executable_name_config_test"
46
+ path = "tests/executable_name_config_test.rs"
47
+
40
48
  [[test]]
41
49
  name = "git_stage_test"
42
50
  path = "tests/git_stage_test.rs"
@@ -49,10 +57,18 @@ path = "tests/invalid_project_structure_test.rs"
49
57
  name = "invalid_project_test"
50
58
  path = "tests/invalid_project_test.rs"
51
59
 
60
+ [[test]]
61
+ name = "missing_github_team_test"
62
+ path = "tests/missing_github_team_test.rs"
63
+
52
64
  [[test]]
53
65
  name = "multiple_directory_owners_test"
54
66
  path = "tests/multiple_directory_owners_test.rs"
55
67
 
68
+ [[test]]
69
+ name = "run_config_executable_override_test"
70
+ path = "tests/run_config_executable_override_test.rs"
71
+
56
72
  [[test]]
57
73
  name = "runner_api"
58
74
  path = "tests/runner_api.rs"
@@ -213,6 +213,15 @@ codeowners gv --no-cache
213
213
  - `vendored_gems_path` (default: `'vendored/'`)
214
214
  - `cache_directory` (default: `'tmp/cache/codeowners'`)
215
215
  - `ignore_dirs` (default includes: `.git`, `node_modules`, `tmp`, etc.)
216
+ - `executable_name` (default: `'codeowners'`): Customize the command name shown in validation error messages. Useful when using `codeowners-rs` via wrappers like the [code_ownership](https://github.com/rubyatscale/code_ownership) Ruby gem.
217
+
218
+ Example configuration with custom executable name:
219
+
220
+ ```yaml
221
+ owned_globs:
222
+ - '{app,components,config,frontend,lib,packs,spec}/**/*.{rb,rake,js,jsx,ts,tsx}'
223
+ executable_name: 'bin/codeownership' # For Ruby gem wrapper
224
+ ```
216
225
 
217
226
  See examples in `tests/fixtures/**/config/` for reference setups.
218
227
 
@@ -244,9 +253,10 @@ use codeowners::runner::{RunConfig, for_file, teams_for_files_from_codeowners};
244
253
  fn main() {
245
254
  let run_config = RunConfig {
246
255
  project_root: std::path::PathBuf::from("."),
247
- codeowners_file_path: std::path::PathBuf::from(".github/CODEOWNERS"),
256
+ codeowners_file_path: Some(std::path::PathBuf::from(".github/CODEOWNERS")), // optional, if None provided, will be resolved from config/env
248
257
  config_path: std::path::PathBuf::from("config/code_ownership.yml"),
249
258
  no_cache: true, // set false to enable on-disk caching
259
+ executable_name: None,
250
260
  };
251
261
 
252
262
  // Find owner for a single file using the optimized path (not just CODEOWNERS)
@@ -65,9 +65,9 @@ struct Args {
65
65
  #[command(subcommand)]
66
66
  command: Command,
67
67
 
68
- /// Path for the CODEOWNERS file.
69
- #[arg(long, default_value = "./.github/CODEOWNERS")]
70
- codeowners_file_path: PathBuf,
68
+ /// Path for the CODEOWNERS file (overrides codeowners_path from the config) [default: .github/CODEOWNERS]
69
+ #[arg(long)]
70
+ codeowners_file_path: Option<PathBuf>,
71
71
  /// Path for the configuration file
72
72
  #[arg(long, default_value = "./config/code_ownership.yml")]
73
73
  config_path: PathBuf,
@@ -93,8 +93,11 @@ impl Args {
93
93
  Ok(self.absolute_path(&self.config_path)?.clean())
94
94
  }
95
95
 
96
- fn absolute_codeowners_path(&self) -> Result<PathBuf, RunnerError> {
97
- Ok(self.absolute_path(&self.codeowners_file_path)?.clean())
96
+ fn absolute_codeowners_path(&self) -> Result<Option<PathBuf>, RunnerError> {
97
+ match &self.codeowners_file_path {
98
+ Some(path) => Ok(Some(self.absolute_path(path)?.clean())),
99
+ None => Ok(None),
100
+ }
98
101
  }
99
102
 
100
103
  fn absolute_path(&self, path: &Path) -> Result<PathBuf, RunnerError> {
@@ -114,6 +117,7 @@ pub fn cli() -> Result<RunResult, RunnerError> {
114
117
  codeowners_file_path,
115
118
  project_root,
116
119
  no_cache: args.no_cache,
120
+ executable_name: None,
117
121
  };
118
122
 
119
123
  let runner_result = match args.command {
@@ -25,6 +25,12 @@ pub struct Config {
25
25
 
26
26
  #[serde(default = "default_ignore_dirs")]
27
27
  pub ignore_dirs: Vec<String>,
28
+
29
+ #[serde(default = "default_executable_name")]
30
+ pub executable_name: String,
31
+
32
+ #[serde(default = "default_codeowners_path")]
33
+ pub codeowners_path: String,
28
34
  }
29
35
 
30
36
  #[allow(dead_code)]
@@ -61,9 +67,12 @@ fn vendored_gems_path() -> String {
61
67
  "vendored/".to_string()
62
68
  }
63
69
 
70
+ fn default_executable_name() -> String {
71
+ "codeowners generate".to_string()
72
+ }
73
+
64
74
  fn default_ignore_dirs() -> Vec<String> {
65
75
  vec![
66
- ".cursor".to_owned(),
67
76
  ".git".to_owned(),
68
77
  ".idea".to_owned(),
69
78
  ".vscode".to_owned(),
@@ -78,6 +87,10 @@ fn default_ignore_dirs() -> Vec<String> {
78
87
  ]
79
88
  }
80
89
 
90
+ fn default_codeowners_path() -> String {
91
+ ".github".to_string()
92
+ }
93
+
81
94
  impl Config {
82
95
  pub fn load_from_path(path: &Path) -> std::result::Result<Self, String> {
83
96
  let file = File::open(path).map_err(|e| format!("Can't open config file: {} ({})", path.to_string_lossy(), e))?;
@@ -121,6 +134,73 @@ mod tests {
121
134
  vec!["frontend/**/node_modules/**/*", "frontend/**/__generated__/**/*"]
122
135
  );
123
136
  assert_eq!(config.vendored_gems_path, "vendored/");
137
+ assert_eq!(config.executable_name, "codeowners generate");
138
+ Ok(())
139
+ }
140
+
141
+ #[test]
142
+ fn test_parse_config_with_custom_executable_name() -> Result<(), Box<dyn Error>> {
143
+ let temp_dir = tempdir()?;
144
+ let config_path = temp_dir.path().join("config.yml");
145
+ let config_str = indoc! {"
146
+ ---
147
+ owned_globs:
148
+ - \"**/*.rb\"
149
+ executable_name: my-custom-codeowners
150
+ "};
151
+ fs::write(&config_path, config_str)?;
152
+ let config_file = File::open(&config_path)?;
153
+ let config: Config = serde_yaml::from_reader(config_file)?;
154
+ assert_eq!(config.executable_name, "my-custom-codeowners");
155
+ Ok(())
156
+ }
157
+
158
+ #[test]
159
+ fn test_executable_name_defaults_when_not_specified() -> Result<(), Box<dyn Error>> {
160
+ let temp_dir = tempdir()?;
161
+ let config_path = temp_dir.path().join("config.yml");
162
+ let config_str = indoc! {"
163
+ ---
164
+ owned_globs:
165
+ - \"**/*.rb\"
166
+ "};
167
+ fs::write(&config_path, config_str)?;
168
+ let config_file = File::open(&config_path)?;
169
+ let config: Config = serde_yaml::from_reader(config_file)?;
170
+ assert_eq!(config.executable_name, "codeowners generate");
171
+ Ok(())
172
+ }
173
+
174
+ #[test]
175
+ fn test_codeowners_path_defaults_when_not_specified() -> Result<(), Box<dyn Error>> {
176
+ let temp_dir = tempdir()?;
177
+ let config_path = temp_dir.path().join("config.yml");
178
+ let config_str = indoc! {"
179
+ ---
180
+ owned_globs:
181
+ - \"**/*.rb\"
182
+ "};
183
+ fs::write(&config_path, config_str)?;
184
+ let config_file = File::open(&config_path)?;
185
+ let config: Config = serde_yaml::from_reader(config_file)?;
186
+ assert_eq!(config.codeowners_path, ".github");
187
+ Ok(())
188
+ }
189
+
190
+ #[test]
191
+ fn test_codeowners_path_can_be_customized() -> Result<(), Box<dyn Error>> {
192
+ let temp_dir = tempdir()?;
193
+ let config_path = temp_dir.path().join("config.yml");
194
+ let config_str = indoc! {"
195
+ ---
196
+ owned_globs:
197
+ - \"**/*.rb\"
198
+ codeowners_path: docs
199
+ "};
200
+ fs::write(&config_path, config_str)?;
201
+ let config_file = File::open(&config_path)?;
202
+ let config: Config = serde_yaml::from_reader(config_file)?;
203
+ assert_eq!(config.codeowners_path, "docs");
124
204
  Ok(())
125
205
  }
126
206
  }
@@ -6,7 +6,7 @@ use crate::{
6
6
  ownership::file_owner_resolver::find_file_owners,
7
7
  project::Project,
8
8
  project_builder::ProjectBuilder,
9
- runner::{RunConfig, RunResult, config_from_path, team_for_file_from_codeowners},
9
+ runner::{RunConfig, RunResult, config_from_run_config, team_for_file_from_codeowners},
10
10
  };
11
11
 
12
12
  pub fn crosscheck_owners(run_config: &RunConfig, cache: &Cache) -> RunResult {
@@ -43,16 +43,13 @@ fn do_crosscheck_owners(run_config: &RunConfig, cache: &Cache) -> Result<Vec<Str
43
43
  }
44
44
 
45
45
  fn load_config(run_config: &RunConfig) -> Result<Config, String> {
46
- config_from_path(&run_config.config_path).map_err(|e| e.to_string())
46
+ config_from_run_config(run_config).map_err(|e| e.to_string())
47
47
  }
48
48
 
49
49
  fn build_project(config: &Config, run_config: &RunConfig, cache: &Cache) -> Result<Project, String> {
50
- let mut project_builder = ProjectBuilder::new(
51
- config,
52
- run_config.project_root.clone(),
53
- run_config.codeowners_file_path.clone(),
54
- cache,
55
- );
50
+ use crate::runner::resolve_codeowners_file_path;
51
+ let codeowners_file_path = resolve_codeowners_file_path(run_config, config);
52
+ let mut project_builder = ProjectBuilder::new(config, run_config.project_root.clone(), codeowners_file_path, cache);
56
53
  project_builder.build().map_err(|e| e.to_string())
57
54
  }
58
55
 
@@ -71,10 +71,10 @@ fn teams_by_github_team_name(team_file_glob: Vec<String>) -> HashMap<String, Tea
71
71
  match glob::glob(&glob) {
72
72
  Ok(paths) => {
73
73
  for path in paths.filter_map(Result::ok) {
74
- let team = match Team::from_team_file_path(path) {
74
+ let team = match Team::from_team_file_path(path.clone()) {
75
75
  Ok(team) => team,
76
76
  Err(e) => {
77
- eprintln!("Error parsing team file: {}", e);
77
+ eprintln!("Error parsing team file: {e:?}, path: {}", path.display());
78
78
  continue;
79
79
  }
80
80
  };
@@ -95,7 +95,7 @@ fn build_codeowners_lines_in_priority(codeowners_file_path: String) -> Vec<Strin
95
95
  let codeowners_file = match fs::read_to_string(codeowners_file_path) {
96
96
  Ok(codeowners_file) => codeowners_file,
97
97
  Err(e) => {
98
- // we can't return the error because it's not clonable
98
+ // we can't return the error because it's not cloneable
99
99
  eprintln!("Error reading codeowners file: {}", e);
100
100
  return vec![];
101
101
  }
@@ -116,7 +116,7 @@ fn load_teams(project_root: &Path, team_file_globs: &[String]) -> std::result::R
116
116
  match Team::from_team_file_path(path.clone()) {
117
117
  Ok(team) => teams.push(team),
118
118
  Err(e) => {
119
- eprintln!("Error parsing team file: {}, path: {}", e, path.display());
119
+ eprintln!("Error parsing team file: {e:?}, path: {}", path.display());
120
120
  continue;
121
121
  }
122
122
  }
@@ -293,6 +293,8 @@ mod tests {
293
293
  vendored_gems_path: vendored_path.to_string(),
294
294
  cache_directory: "tmp/cache/codeowners".to_string(),
295
295
  ignore_dirs: vec![],
296
+ executable_name: "codeowners".to_string(),
297
+ codeowners_path: ".github".to_string(),
296
298
  }
297
299
  }
298
300
 
@@ -95,7 +95,7 @@ impl PackageMapper {
95
95
  let packages: Vec<&Package> = packages.iter().filter(|package| &package.package_type == package_type).collect();
96
96
 
97
97
  // Nested packs can create a duplicate ownership false positive.
98
- // We avoid it by treating nested packs as a single top level pack for the purpose of validations
98
+ // We avoid it by treating nested packs as a single top-level pack for the purposes of validation.
99
99
  let packages = remove_nested_packages(&packages);
100
100
 
101
101
  for package in packages {
@@ -147,7 +147,7 @@ mod tests {
147
147
  use std::{error::Error, path::Path};
148
148
  #[test]
149
149
  fn test_remove_nested_packages() {
150
- let packages = vec![
150
+ let packages = [
151
151
  Package {
152
152
  path: Path::new("packs/a/package.yml").to_owned(),
153
153
  package_type: PackageType::Ruby,
@@ -48,7 +48,7 @@ impl Display for Source {
48
48
  Source::TeamGem => write!(f, "Owner specified in Team YML's `owned_gems`"),
49
49
  Source::TeamGlob(glob) => write!(f, "Owner specified in Team YML as an owned_glob `{}`", glob),
50
50
  Source::Package(package_path, glob) => {
51
- write!(f, "Owner defined in `{}` with implicity owned glob: `{}`", package_path, glob)
51
+ write!(f, "Owner defined in `{}` with implicitly owned glob: `{}`", package_path, glob)
52
52
  }
53
53
  Source::TeamYml => write!(f, "Teams own their configuration files"),
54
54
  }
@@ -208,7 +208,7 @@ mod tests {
208
208
  );
209
209
  assert_eq!(
210
210
  Source::Package("packs/bam/packag.yml".to_string(), "packs/bam/**/**".to_string()).to_string(),
211
- "Owner defined in `packs/bam/packag.yml` with implicity owned glob: `packs/bam/**/**`"
211
+ "Owner defined in `packs/bam/packag.yml` with implicitly owned glob: `packs/bam/**/**`"
212
212
  );
213
213
  assert_eq!(Source::TeamYml.to_string(), "Teams own their configuration files");
214
214
  }
@@ -21,6 +21,7 @@ pub struct Validator {
21
21
  pub project: Arc<Project>,
22
22
  pub mappers: Vec<Box<dyn Mapper>>,
23
23
  pub file_generator: FileGenerator,
24
+ pub executable_name: String,
24
25
  }
25
26
 
26
27
  #[derive(Debug)]
@@ -28,7 +29,7 @@ enum Error {
28
29
  InvalidTeam { name: String, path: PathBuf },
29
30
  FileWithoutOwner { path: PathBuf },
30
31
  FileWithMultipleOwners { path: PathBuf, owners: Vec<Owner> },
31
- CodeownershipFileIsStale,
32
+ CodeownershipFileIsStale { executable_name: String },
32
33
  }
33
34
 
34
35
  #[derive(Debug)]
@@ -130,12 +131,16 @@ impl Validator {
130
131
  match self.project.get_codeowners_file() {
131
132
  Ok(current_file) => {
132
133
  if generated_file != current_file {
133
- vec![Error::CodeownershipFileIsStale]
134
+ vec![Error::CodeownershipFileIsStale {
135
+ executable_name: self.executable_name.to_string(),
136
+ }]
134
137
  } else {
135
138
  vec![]
136
139
  }
137
140
  }
138
- Err(_) => vec![Error::CodeownershipFileIsStale], // Treat any read error as stale file
141
+ Err(_) => vec![Error::CodeownershipFileIsStale {
142
+ executable_name: self.executable_name.to_string(),
143
+ }],
139
144
  }
140
145
  }
141
146
 
@@ -161,13 +166,13 @@ impl Validator {
161
166
  impl Error {
162
167
  pub fn category(&self) -> String {
163
168
  match self {
164
- Error::FileWithoutOwner { path: _ } => "Some files are missing ownership".to_owned(),
165
- Error::FileWithMultipleOwners { path: _, owners: _ } => "Code ownership should only be defined for each file in one way. The following files have declared ownership in multiple ways".to_owned(),
166
- Error::CodeownershipFileIsStale => {
167
- "CODEOWNERS out of date. Run `codeowners generate` to update the CODEOWNERS file".to_owned()
169
+ Error::FileWithoutOwner { path: _ } => "Some files are missing ownership".to_owned(),
170
+ Error::FileWithMultipleOwners { path: _, owners: _ } => "Code ownership should only be defined for each file in one way. The following files have declared ownership in multiple ways".to_owned(),
171
+ Error::CodeownershipFileIsStale { executable_name } => {
172
+ format!("CODEOWNERS out of date. Run `{}` to update the CODEOWNERS file", executable_name)
173
+ }
174
+ Error::InvalidTeam { name: _, path: _ } => "Found invalid team annotations".to_owned(),
168
175
  }
169
- Error::InvalidTeam { name: _, path: _ } => "Found invalid team annotations".to_owned(),
170
- }
171
176
  }
172
177
 
173
178
  pub fn messages(&self) -> Vec<String> {
@@ -187,7 +192,7 @@ impl Error {
187
192
 
188
193
  vec![messages.join("\n")]
189
194
  }
190
- Error::CodeownershipFileIsStale => vec![],
195
+ Error::CodeownershipFileIsStale { executable_name: _ } => vec![],
191
196
  Error::InvalidTeam { name, path } => vec![format!("- {} is referencing an invalid team - '{}'", path.to_string_lossy(), name)],
192
197
  }
193
198
  }
@@ -123,6 +123,7 @@ impl Ownership {
123
123
  project: self.project.clone(),
124
124
  mappers: self.mappers(),
125
125
  file_generator: FileGenerator { mappers: self.mappers() },
126
+ executable_name: self.project.executable_name.clone(),
126
127
  };
127
128
 
128
129
  validator.validate()