dependabot-core 0.76.1

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 (321) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +6408 -0
  3. data/LICENSE +37 -0
  4. data/README.md +115 -0
  5. data/helpers/elixir/bin/check_update.exs +92 -0
  6. data/helpers/elixir/bin/do_update.exs +39 -0
  7. data/helpers/elixir/bin/parse_deps.exs +103 -0
  8. data/helpers/elixir/bin/run.exs +76 -0
  9. data/helpers/elixir/mix.exs +21 -0
  10. data/helpers/elixir/mix.lock +3 -0
  11. data/helpers/go/Makefile +9 -0
  12. data/helpers/go/go.mod +9 -0
  13. data/helpers/go/go.sum +5 -0
  14. data/helpers/go/importresolver/main.go +34 -0
  15. data/helpers/go/main.go +77 -0
  16. data/helpers/go/updatechecker/main.go +107 -0
  17. data/helpers/go/updater/go.mod +3 -0
  18. data/helpers/go/updater/go.sum +2 -0
  19. data/helpers/go/updater/helpers.go +57 -0
  20. data/helpers/go/updater/main.go +48 -0
  21. data/helpers/npm/.agignore +1 -0
  22. data/helpers/npm/.envrc +2 -0
  23. data/helpers/npm/.eslintrc +14 -0
  24. data/helpers/npm/.nvimrc +7 -0
  25. data/helpers/npm/bin/run.js +34 -0
  26. data/helpers/npm/lib/helpers.js +25 -0
  27. data/helpers/npm/lib/peer-dependency-checker.js +102 -0
  28. data/helpers/npm/lib/subdependency-updater.js +48 -0
  29. data/helpers/npm/lib/updater.js +95 -0
  30. data/helpers/npm/package.json +17 -0
  31. data/helpers/npm/test/fixtures/npm-left-pad.json +1 -0
  32. data/helpers/npm/test/fixtures/updater/original/package-lock.json +16 -0
  33. data/helpers/npm/test/fixtures/updater/original/package.json +9 -0
  34. data/helpers/npm/test/fixtures/updater/updated/package-lock.json +16 -0
  35. data/helpers/npm/test/helpers.js +7 -0
  36. data/helpers/npm/test/updater.test.js +50 -0
  37. data/helpers/npm/yarn.lock +6120 -0
  38. data/helpers/php/.php_cs +34 -0
  39. data/helpers/php/bin/run.php +57 -0
  40. data/helpers/php/composer.json +14 -0
  41. data/helpers/php/composer.lock +1521 -0
  42. data/helpers/php/composer.phar +0 -0
  43. data/helpers/php/setup.sh +4 -0
  44. data/helpers/php/src/DependabotInstallationManager.php +61 -0
  45. data/helpers/php/src/DependabotPluginManager.php +23 -0
  46. data/helpers/php/src/ExceptionIO.php +25 -0
  47. data/helpers/php/src/Hasher.php +21 -0
  48. data/helpers/php/src/UpdateChecker.php +123 -0
  49. data/helpers/php/src/Updater.php +97 -0
  50. data/helpers/python/lib/__init__.py +0 -0
  51. data/helpers/python/lib/hasher.py +23 -0
  52. data/helpers/python/lib/parser.py +130 -0
  53. data/helpers/python/requirements.txt +9 -0
  54. data/helpers/python/run.py +18 -0
  55. data/helpers/test/run.rb +15 -0
  56. data/helpers/utils/git-credential-store-immutable +10 -0
  57. data/helpers/yarn/.agignore +1 -0
  58. data/helpers/yarn/.envrc +2 -0
  59. data/helpers/yarn/.eslintrc +14 -0
  60. data/helpers/yarn/.nvimrc +7 -0
  61. data/helpers/yarn/bin/run.js +36 -0
  62. data/helpers/yarn/lib/fix-duplicates.js +53 -0
  63. data/helpers/yarn/lib/helpers.js +5 -0
  64. data/helpers/yarn/lib/lockfile-parser.js +21 -0
  65. data/helpers/yarn/lib/peer-dependency-checker.js +130 -0
  66. data/helpers/yarn/lib/replace-lockfile-declaration.js +45 -0
  67. data/helpers/yarn/lib/subdependency-updater.js +69 -0
  68. data/helpers/yarn/lib/updater.js +254 -0
  69. data/helpers/yarn/package.json +17 -0
  70. data/helpers/yarn/test/fixtures/updater/original/package.json +6 -0
  71. data/helpers/yarn/test/fixtures/updater/original/yarn.lock +11 -0
  72. data/helpers/yarn/test/fixtures/updater/updated/yarn.lock +12 -0
  73. data/helpers/yarn/test/fixtures/updater/with-version-comments/package.json +5 -0
  74. data/helpers/yarn/test/fixtures/updater/with-version-comments/yarn.lock +13 -0
  75. data/helpers/yarn/test/fixtures/yarnpkg-is-positive.json +1 -0
  76. data/helpers/yarn/test/fixtures/yarnpkg-left-pad.json +1 -0
  77. data/helpers/yarn/test/helpers.js +7 -0
  78. data/helpers/yarn/test/updater.test.js +93 -0
  79. data/helpers/yarn/yarn.lock +4912 -0
  80. data/lib/bundler_definition_bundler_version_patch.rb +15 -0
  81. data/lib/bundler_definition_ruby_version_patch.rb +14 -0
  82. data/lib/bundler_git_source_patch.rb +27 -0
  83. data/lib/dependabot.rb +4 -0
  84. data/lib/dependabot/clients/bitbucket.rb +101 -0
  85. data/lib/dependabot/clients/github_with_retries.rb +117 -0
  86. data/lib/dependabot/clients/gitlab.rb +72 -0
  87. data/lib/dependabot/dependency.rb +118 -0
  88. data/lib/dependabot/dependency_file.rb +54 -0
  89. data/lib/dependabot/errors.rb +179 -0
  90. data/lib/dependabot/file_fetchers.rb +48 -0
  91. data/lib/dependabot/file_fetchers/README.md +65 -0
  92. data/lib/dependabot/file_fetchers/base.rb +302 -0
  93. data/lib/dependabot/file_fetchers/docker/docker.rb +40 -0
  94. data/lib/dependabot/file_fetchers/dotnet/nuget.rb +215 -0
  95. data/lib/dependabot/file_fetchers/dotnet/nuget/import_paths_finder.rb +51 -0
  96. data/lib/dependabot/file_fetchers/dotnet/nuget/sln_project_paths_finder.rb +55 -0
  97. data/lib/dependabot/file_fetchers/elixir/hex.rb +78 -0
  98. data/lib/dependabot/file_fetchers/elm/elm_package.rb +52 -0
  99. data/lib/dependabot/file_fetchers/git/submodules.rb +73 -0
  100. data/lib/dependabot/file_fetchers/go/dep.rb +69 -0
  101. data/lib/dependabot/file_fetchers/go/modules.rb +64 -0
  102. data/lib/dependabot/file_fetchers/java/gradle.rb +56 -0
  103. data/lib/dependabot/file_fetchers/java/gradle/settings_file_parser.rb +66 -0
  104. data/lib/dependabot/file_fetchers/java/maven.rb +127 -0
  105. data/lib/dependabot/file_fetchers/java_script/npm_and_yarn.rb +330 -0
  106. data/lib/dependabot/file_fetchers/java_script/npm_and_yarn/path_dependency_builder.rb +107 -0
  107. data/lib/dependabot/file_fetchers/php/composer.rb +131 -0
  108. data/lib/dependabot/file_fetchers/python/pip.rb +305 -0
  109. data/lib/dependabot/file_fetchers/ruby/bundler.rb +185 -0
  110. data/lib/dependabot/file_fetchers/ruby/bundler/child_gemfile_finder.rb +70 -0
  111. data/lib/dependabot/file_fetchers/ruby/bundler/path_gemspec_finder.rb +114 -0
  112. data/lib/dependabot/file_fetchers/ruby/bundler/require_relative_finder.rb +67 -0
  113. data/lib/dependabot/file_fetchers/rust/cargo.rb +240 -0
  114. data/lib/dependabot/file_parsers.rb +48 -0
  115. data/lib/dependabot/file_parsers/README.md +45 -0
  116. data/lib/dependabot/file_parsers/base.rb +31 -0
  117. data/lib/dependabot/file_parsers/base/dependency_set.rb +77 -0
  118. data/lib/dependabot/file_parsers/docker/docker.rb +164 -0
  119. data/lib/dependabot/file_parsers/dotnet/nuget.rb +85 -0
  120. data/lib/dependabot/file_parsers/dotnet/nuget/packages_config_parser.rb +65 -0
  121. data/lib/dependabot/file_parsers/dotnet/nuget/project_file_parser.rb +156 -0
  122. data/lib/dependabot/file_parsers/dotnet/nuget/property_value_finder.rb +131 -0
  123. data/lib/dependabot/file_parsers/elixir/hex.rb +134 -0
  124. data/lib/dependabot/file_parsers/elm/elm_package.rb +136 -0
  125. data/lib/dependabot/file_parsers/git/submodules.rb +69 -0
  126. data/lib/dependabot/file_parsers/go/dep.rb +163 -0
  127. data/lib/dependabot/file_parsers/go/modules.rb +34 -0
  128. data/lib/dependabot/file_parsers/go/modules/go_mod_parser.rb +134 -0
  129. data/lib/dependabot/file_parsers/java/gradle.rb +236 -0
  130. data/lib/dependabot/file_parsers/java/gradle/property_value_finder.rb +90 -0
  131. data/lib/dependabot/file_parsers/java/gradle/repositories_finder.rb +145 -0
  132. data/lib/dependabot/file_parsers/java/maven.rb +252 -0
  133. data/lib/dependabot/file_parsers/java/maven/property_value_finder.rb +166 -0
  134. data/lib/dependabot/file_parsers/java/maven/repositories_finder.rb +188 -0
  135. data/lib/dependabot/file_parsers/java_script/npm_and_yarn.rb +394 -0
  136. data/lib/dependabot/file_parsers/php/composer.rb +177 -0
  137. data/lib/dependabot/file_parsers/python/pip.rb +223 -0
  138. data/lib/dependabot/file_parsers/python/pip/pipfile_files_parser.rb +154 -0
  139. data/lib/dependabot/file_parsers/python/pip/poetry_files_parser.rb +141 -0
  140. data/lib/dependabot/file_parsers/python/pip/setup_file_parser.rb +160 -0
  141. data/lib/dependabot/file_parsers/ruby/bundler.rb +295 -0
  142. data/lib/dependabot/file_parsers/ruby/bundler/file_preparer.rb +85 -0
  143. data/lib/dependabot/file_parsers/ruby/bundler/gemfile_checker.rb +48 -0
  144. data/lib/dependabot/file_parsers/rust/cargo.rb +213 -0
  145. data/lib/dependabot/file_updaters.rb +48 -0
  146. data/lib/dependabot/file_updaters/README.md +58 -0
  147. data/lib/dependabot/file_updaters/base.rb +52 -0
  148. data/lib/dependabot/file_updaters/docker/docker.rb +133 -0
  149. data/lib/dependabot/file_updaters/dotnet/nuget.rb +151 -0
  150. data/lib/dependabot/file_updaters/dotnet/nuget/packages_config_declaration_finder.rb +69 -0
  151. data/lib/dependabot/file_updaters/dotnet/nuget/project_file_declaration_finder.rb +78 -0
  152. data/lib/dependabot/file_updaters/dotnet/nuget/property_value_updater.rb +64 -0
  153. data/lib/dependabot/file_updaters/elixir/hex.rb +71 -0
  154. data/lib/dependabot/file_updaters/elixir/hex/lockfile_updater.rb +147 -0
  155. data/lib/dependabot/file_updaters/elixir/hex/mixfile_git_pin_updater.rb +53 -0
  156. data/lib/dependabot/file_updaters/elixir/hex/mixfile_requirement_updater.rb +74 -0
  157. data/lib/dependabot/file_updaters/elixir/hex/mixfile_sanitizer.rb +28 -0
  158. data/lib/dependabot/file_updaters/elixir/hex/mixfile_updater.rb +98 -0
  159. data/lib/dependabot/file_updaters/elm/elm_package.rb +79 -0
  160. data/lib/dependabot/file_updaters/elm/elm_package/elm_json_updater.rb +69 -0
  161. data/lib/dependabot/file_updaters/elm/elm_package/elm_package_updater.rb +69 -0
  162. data/lib/dependabot/file_updaters/git/submodules.rb +38 -0
  163. data/lib/dependabot/file_updaters/go/dep.rb +77 -0
  164. data/lib/dependabot/file_updaters/go/dep/lockfile_updater.rb +219 -0
  165. data/lib/dependabot/file_updaters/go/dep/manifest_updater.rb +155 -0
  166. data/lib/dependabot/file_updaters/go/modules.rb +71 -0
  167. data/lib/dependabot/file_updaters/go/modules/go_mod_updater.rb +81 -0
  168. data/lib/dependabot/file_updaters/java/gradle.rb +176 -0
  169. data/lib/dependabot/file_updaters/java/gradle/dependency_set_updater.rb +66 -0
  170. data/lib/dependabot/file_updaters/java/gradle/property_value_updater.rb +58 -0
  171. data/lib/dependabot/file_updaters/java/maven.rb +155 -0
  172. data/lib/dependabot/file_updaters/java/maven/declaration_finder.rb +132 -0
  173. data/lib/dependabot/file_updaters/java/maven/property_value_updater.rb +61 -0
  174. data/lib/dependabot/file_updaters/java_script/npm_and_yarn.rb +159 -0
  175. data/lib/dependabot/file_updaters/java_script/npm_and_yarn/npm_lockfile_updater.rb +532 -0
  176. data/lib/dependabot/file_updaters/java_script/npm_and_yarn/npmrc_builder.rb +191 -0
  177. data/lib/dependabot/file_updaters/java_script/npm_and_yarn/package_json_preparer.rb +91 -0
  178. data/lib/dependabot/file_updaters/java_script/npm_and_yarn/package_json_updater.rb +220 -0
  179. data/lib/dependabot/file_updaters/java_script/npm_and_yarn/yarn_lockfile_updater.rb +475 -0
  180. data/lib/dependabot/file_updaters/php/composer.rb +78 -0
  181. data/lib/dependabot/file_updaters/php/composer/lockfile_updater.rb +264 -0
  182. data/lib/dependabot/file_updaters/php/composer/manifest_updater.rb +70 -0
  183. data/lib/dependabot/file_updaters/python/pip.rb +147 -0
  184. data/lib/dependabot/file_updaters/python/pip/pip_compile_file_updater.rb +363 -0
  185. data/lib/dependabot/file_updaters/python/pip/pipfile_file_updater.rb +397 -0
  186. data/lib/dependabot/file_updaters/python/pip/pipfile_preparer.rb +125 -0
  187. data/lib/dependabot/file_updaters/python/pip/poetry_file_updater.rb +289 -0
  188. data/lib/dependabot/file_updaters/python/pip/pyproject_preparer.rb +105 -0
  189. data/lib/dependabot/file_updaters/python/pip/requirement_file_updater.rb +166 -0
  190. data/lib/dependabot/file_updaters/python/pip/requirement_replacer.rb +95 -0
  191. data/lib/dependabot/file_updaters/python/pip/setup_file_sanitizer.rb +91 -0
  192. data/lib/dependabot/file_updaters/ruby/bundler.rb +121 -0
  193. data/lib/dependabot/file_updaters/ruby/bundler/gemfile_updater.rb +116 -0
  194. data/lib/dependabot/file_updaters/ruby/bundler/gemspec_dependency_name_finder.rb +52 -0
  195. data/lib/dependabot/file_updaters/ruby/bundler/gemspec_sanitizer.rb +298 -0
  196. data/lib/dependabot/file_updaters/ruby/bundler/gemspec_updater.rb +64 -0
  197. data/lib/dependabot/file_updaters/ruby/bundler/git_pin_replacer.rb +80 -0
  198. data/lib/dependabot/file_updaters/ruby/bundler/git_source_remover.rb +102 -0
  199. data/lib/dependabot/file_updaters/ruby/bundler/lockfile_updater.rb +384 -0
  200. data/lib/dependabot/file_updaters/ruby/bundler/requirement_replacer.rb +188 -0
  201. data/lib/dependabot/file_updaters/rust/cargo.rb +83 -0
  202. data/lib/dependabot/file_updaters/rust/cargo/lockfile_updater.rb +251 -0
  203. data/lib/dependabot/file_updaters/rust/cargo/manifest_updater.rb +162 -0
  204. data/lib/dependabot/git_commit_checker.rb +412 -0
  205. data/lib/dependabot/metadata_finders.rb +46 -0
  206. data/lib/dependabot/metadata_finders/README.md +53 -0
  207. data/lib/dependabot/metadata_finders/base.rb +117 -0
  208. data/lib/dependabot/metadata_finders/base/changelog_finder.rb +317 -0
  209. data/lib/dependabot/metadata_finders/base/changelog_pruner.rb +177 -0
  210. data/lib/dependabot/metadata_finders/base/commits_finder.rb +217 -0
  211. data/lib/dependabot/metadata_finders/base/release_finder.rb +251 -0
  212. data/lib/dependabot/metadata_finders/docker/docker.rb +18 -0
  213. data/lib/dependabot/metadata_finders/dotnet/nuget.rb +116 -0
  214. data/lib/dependabot/metadata_finders/elixir/hex.rb +69 -0
  215. data/lib/dependabot/metadata_finders/elm/elm_package.rb +22 -0
  216. data/lib/dependabot/metadata_finders/git/submodules.rb +20 -0
  217. data/lib/dependabot/metadata_finders/go/dep.rb +56 -0
  218. data/lib/dependabot/metadata_finders/java/maven.rb +173 -0
  219. data/lib/dependabot/metadata_finders/java_script/npm_and_yarn.rb +215 -0
  220. data/lib/dependabot/metadata_finders/php/composer.rb +66 -0
  221. data/lib/dependabot/metadata_finders/python/pip.rb +120 -0
  222. data/lib/dependabot/metadata_finders/ruby/bundler.rb +150 -0
  223. data/lib/dependabot/metadata_finders/rust/cargo.rb +64 -0
  224. data/lib/dependabot/pull_request_creator.rb +151 -0
  225. data/lib/dependabot/pull_request_creator/branch_namer.rb +170 -0
  226. data/lib/dependabot/pull_request_creator/commit_signer.rb +63 -0
  227. data/lib/dependabot/pull_request_creator/github.rb +233 -0
  228. data/lib/dependabot/pull_request_creator/gitlab.rb +122 -0
  229. data/lib/dependabot/pull_request_creator/labeler.rb +361 -0
  230. data/lib/dependabot/pull_request_creator/message_builder.rb +888 -0
  231. data/lib/dependabot/pull_request_updater.rb +43 -0
  232. data/lib/dependabot/pull_request_updater/github.rb +151 -0
  233. data/lib/dependabot/shared_helpers.rb +201 -0
  234. data/lib/dependabot/source.rb +120 -0
  235. data/lib/dependabot/update_checkers.rb +48 -0
  236. data/lib/dependabot/update_checkers/README.md +67 -0
  237. data/lib/dependabot/update_checkers/base.rb +220 -0
  238. data/lib/dependabot/update_checkers/docker/docker.rb +290 -0
  239. data/lib/dependabot/update_checkers/dotnet/nuget.rb +127 -0
  240. data/lib/dependabot/update_checkers/dotnet/nuget/property_updater.rb +97 -0
  241. data/lib/dependabot/update_checkers/dotnet/nuget/repository_finder.rb +232 -0
  242. data/lib/dependabot/update_checkers/dotnet/nuget/requirements_updater.rb +81 -0
  243. data/lib/dependabot/update_checkers/dotnet/nuget/version_finder.rb +231 -0
  244. data/lib/dependabot/update_checkers/elixir/hex.rb +274 -0
  245. data/lib/dependabot/update_checkers/elixir/hex/file_preparer.rb +193 -0
  246. data/lib/dependabot/update_checkers/elixir/hex/requirements_updater.rb +177 -0
  247. data/lib/dependabot/update_checkers/elixir/hex/version_resolver.rb +175 -0
  248. data/lib/dependabot/update_checkers/elm/elm_package.rb +126 -0
  249. data/lib/dependabot/update_checkers/elm/elm_package/cli_parser.rb +33 -0
  250. data/lib/dependabot/update_checkers/elm/elm_package/elm_18_version_resolver.rb +234 -0
  251. data/lib/dependabot/update_checkers/elm/elm_package/elm_19_version_resolver.rb +198 -0
  252. data/lib/dependabot/update_checkers/elm/elm_package/requirements_updater.rb +75 -0
  253. data/lib/dependabot/update_checkers/git/submodules.rb +52 -0
  254. data/lib/dependabot/update_checkers/go/dep.rb +311 -0
  255. data/lib/dependabot/update_checkers/go/dep/file_preparer.rb +221 -0
  256. data/lib/dependabot/update_checkers/go/dep/latest_version_finder.rb +169 -0
  257. data/lib/dependabot/update_checkers/go/dep/requirements_updater.rb +223 -0
  258. data/lib/dependabot/update_checkers/go/dep/version_resolver.rb +164 -0
  259. data/lib/dependabot/update_checkers/go/modules.rb +112 -0
  260. data/lib/dependabot/update_checkers/java/gradle.rb +148 -0
  261. data/lib/dependabot/update_checkers/java/gradle/multi_dependency_updater.rb +105 -0
  262. data/lib/dependabot/update_checkers/java/gradle/version_finder.rb +183 -0
  263. data/lib/dependabot/update_checkers/java/maven.rb +159 -0
  264. data/lib/dependabot/update_checkers/java/maven/property_updater.rb +127 -0
  265. data/lib/dependabot/update_checkers/java/maven/requirements_updater.rb +92 -0
  266. data/lib/dependabot/update_checkers/java/maven/version_finder.rb +225 -0
  267. data/lib/dependabot/update_checkers/java_script/npm_and_yarn.rb +280 -0
  268. data/lib/dependabot/update_checkers/java_script/npm_and_yarn/latest_version_finder.rb +342 -0
  269. data/lib/dependabot/update_checkers/java_script/npm_and_yarn/library_detector.rb +69 -0
  270. data/lib/dependabot/update_checkers/java_script/npm_and_yarn/registry_finder.rb +226 -0
  271. data/lib/dependabot/update_checkers/java_script/npm_and_yarn/requirements_updater.rb +197 -0
  272. data/lib/dependabot/update_checkers/java_script/npm_and_yarn/subdependency_version_resolver.rb +228 -0
  273. data/lib/dependabot/update_checkers/java_script/npm_and_yarn/version_resolver.rb +452 -0
  274. data/lib/dependabot/update_checkers/php/composer.rb +165 -0
  275. data/lib/dependabot/update_checkers/php/composer/requirements_updater.rb +243 -0
  276. data/lib/dependabot/update_checkers/php/composer/version_resolver.rb +203 -0
  277. data/lib/dependabot/update_checkers/python/pip.rb +227 -0
  278. data/lib/dependabot/update_checkers/python/pip/latest_version_finder.rb +252 -0
  279. data/lib/dependabot/update_checkers/python/pip/pip_compile_version_resolver.rb +380 -0
  280. data/lib/dependabot/update_checkers/python/pip/pipfile_version_resolver.rb +559 -0
  281. data/lib/dependabot/update_checkers/python/pip/poetry_version_resolver.rb +300 -0
  282. data/lib/dependabot/update_checkers/python/pip/requirements_updater.rb +367 -0
  283. data/lib/dependabot/update_checkers/ruby/bundler.rb +324 -0
  284. data/lib/dependabot/update_checkers/ruby/bundler/file_preparer.rb +278 -0
  285. data/lib/dependabot/update_checkers/ruby/bundler/force_updater.rb +261 -0
  286. data/lib/dependabot/update_checkers/ruby/bundler/latest_version_finder.rb +169 -0
  287. data/lib/dependabot/update_checkers/ruby/bundler/requirements_updater.rb +264 -0
  288. data/lib/dependabot/update_checkers/ruby/bundler/ruby_requirement_setter.rb +115 -0
  289. data/lib/dependabot/update_checkers/ruby/bundler/shared_bundler_helpers.rb +243 -0
  290. data/lib/dependabot/update_checkers/ruby/bundler/version_resolver.rb +255 -0
  291. data/lib/dependabot/update_checkers/rust/cargo.rb +282 -0
  292. data/lib/dependabot/update_checkers/rust/cargo/file_preparer.rb +202 -0
  293. data/lib/dependabot/update_checkers/rust/cargo/requirements_updater.rb +175 -0
  294. data/lib/dependabot/update_checkers/rust/cargo/version_resolver.rb +242 -0
  295. data/lib/dependabot/utils.rb +84 -0
  296. data/lib/dependabot/utils/docker/credentials_finder.rb +65 -0
  297. data/lib/dependabot/utils/dotnet/requirement.rb +90 -0
  298. data/lib/dependabot/utils/dotnet/version.rb +22 -0
  299. data/lib/dependabot/utils/elixir/requirement.rb +53 -0
  300. data/lib/dependabot/utils/elixir/version.rb +59 -0
  301. data/lib/dependabot/utils/elm/requirement.rb +92 -0
  302. data/lib/dependabot/utils/elm/version.rb +19 -0
  303. data/lib/dependabot/utils/go/path_converter.rb +74 -0
  304. data/lib/dependabot/utils/go/requirement.rb +152 -0
  305. data/lib/dependabot/utils/go/shared_helper.rb +20 -0
  306. data/lib/dependabot/utils/go/version.rb +40 -0
  307. data/lib/dependabot/utils/java/requirement.rb +110 -0
  308. data/lib/dependabot/utils/java/version.rb +179 -0
  309. data/lib/dependabot/utils/java_script/requirement.rb +117 -0
  310. data/lib/dependabot/utils/java_script/version.rb +30 -0
  311. data/lib/dependabot/utils/php/requirement.rb +97 -0
  312. data/lib/dependabot/utils/php/version.rb +22 -0
  313. data/lib/dependabot/utils/python/requirement.rb +130 -0
  314. data/lib/dependabot/utils/python/version.rb +88 -0
  315. data/lib/dependabot/utils/ruby/requirement.rb +26 -0
  316. data/lib/dependabot/utils/rust/requirement.rb +108 -0
  317. data/lib/dependabot/utils/rust/version.rb +32 -0
  318. data/lib/dependabot/version.rb +5 -0
  319. data/lib/python_requirement_parser.rb +33 -0
  320. data/lib/python_versions.rb +21 -0
  321. metadata +641 -0
@@ -0,0 +1,305 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "toml-rb"
4
+
5
+ require "dependabot/file_fetchers/base"
6
+ require "dependabot/file_parsers/python/pip"
7
+ require "dependabot/errors"
8
+
9
+ module Dependabot
10
+ module FileFetchers
11
+ module Python
12
+ class Pip < Dependabot::FileFetchers::Base
13
+ CHILD_REQUIREMENT_REGEX = /^-r\s?(?<path>.*\.txt)/.freeze
14
+ CONSTRAINT_REGEX = /^-c\s?(?<path>\..*)/.freeze
15
+
16
+ def self.required_files_in?(filenames)
17
+ return true if filenames.any? { |name| name.end_with?(".txt", ".in") }
18
+
19
+ # If there is a directory of requirements return true
20
+ return true if filenames.include?("requirements")
21
+
22
+ # If this repo is using a Pipfile return true
23
+ return true if filenames.include?("Pipfile")
24
+
25
+ # If this repo is using Poetry return true
26
+ return true if filenames.include?("pyproject.toml")
27
+
28
+ filenames.include?("setup.py")
29
+ end
30
+
31
+ def self.required_files_message
32
+ "Repo must contain a requirements.txt, setup.py, pyproject.toml, "\
33
+ "or a Pipfile."
34
+ end
35
+
36
+ private
37
+
38
+ def fetch_files
39
+ fetched_files = []
40
+
41
+ fetched_files += pipenv_files
42
+ fetched_files += pyproject_files
43
+
44
+ fetched_files += requirements_in_files
45
+ fetched_files += requirement_files if requirements_txt_files.any?
46
+
47
+ fetched_files << setup_file if setup_file
48
+ fetched_files << setup_cfg if setup_cfg
49
+ fetched_files += path_setup_files
50
+ fetched_files << pip_conf if pip_conf
51
+ fetched_files << python_version if python_version
52
+
53
+ check_required_files_present
54
+ fetched_files.uniq
55
+ end
56
+
57
+ def pipenv_files
58
+ [pipfile, pipfile_lock].compact
59
+ end
60
+
61
+ def pyproject_files
62
+ [pyproject, pyproject_lock, poetry_lock].compact
63
+ end
64
+
65
+ def requirement_files
66
+ [
67
+ *requirements_txt_files,
68
+ *child_requirement_files,
69
+ *constraints_files
70
+ ]
71
+ end
72
+
73
+ def check_required_files_present
74
+ if requirements_txt_files.any? || setup_file || pipfile || pyproject
75
+ return
76
+ end
77
+
78
+ path = Pathname.new(File.join(directory, "requirements.txt")).
79
+ cleanpath.to_path
80
+ raise Dependabot::DependencyFileNotFound, path
81
+ end
82
+
83
+ def setup_file
84
+ @setup_file ||= fetch_file_if_present("setup.py")
85
+ end
86
+
87
+ def setup_cfg
88
+ @setup_cfg ||= fetch_file_if_present("setup.cfg")
89
+ end
90
+
91
+ def pip_conf
92
+ @pip_conf ||= fetch_file_if_present("pip.conf")&.
93
+ tap { |f| f.support_file = true }
94
+ end
95
+
96
+ def python_version
97
+ @python_version ||= fetch_file_if_present(".python-version")&.
98
+ tap { |f| f.support_file = true }
99
+ end
100
+
101
+ def pipfile
102
+ @pipfile ||= fetch_file_if_present("Pipfile")
103
+ end
104
+
105
+ def pipfile_lock
106
+ @pipfile_lock ||= fetch_file_if_present("Pipfile.lock")
107
+ end
108
+
109
+ def pyproject
110
+ @pyproject ||= fetch_file_if_present("pyproject.toml")
111
+ end
112
+
113
+ def pyproject_lock
114
+ @pyproject_lock ||= fetch_file_if_present("pyproject.lock")
115
+ end
116
+
117
+ def poetry_lock
118
+ @poetry_lock ||= fetch_file_if_present("poetry.lock")
119
+ end
120
+
121
+ def requirements_txt_files
122
+ req_txt_and_in_files.select { |f| f.name.end_with?(".txt") }
123
+ end
124
+
125
+ def requirements_in_files
126
+ req_txt_and_in_files.select { |f| f.name.end_with?(".in") }
127
+ end
128
+
129
+ def parsed_pipfile
130
+ raise "No Pipfile" unless pipfile
131
+
132
+ @parsed_pipfile ||= TomlRB.parse(pipfile.content)
133
+ rescue TomlRB::ParseError
134
+ raise Dependabot::DependencyFileNotParseable, pipfile.path
135
+ end
136
+
137
+ def req_txt_and_in_files
138
+ return @req_txt_and_in_files if @req_txt_and_in_files
139
+
140
+ @req_txt_and_in_files = []
141
+
142
+ repo_contents.
143
+ select { |f| f.type == "file" }.
144
+ select { |f| f.name.end_with?(".txt", ".in") }.
145
+ map { |f| fetch_file_from_host(f.name) }.
146
+ select { |f| requirements_file?(f) }.
147
+ each { |f| @req_txt_and_in_files << f }
148
+
149
+ repo_contents.
150
+ select { |f| f.type == "dir" }.
151
+ each { |f| @req_txt_and_in_files += req_files_for_dir(f) }
152
+
153
+ @req_txt_and_in_files
154
+ end
155
+
156
+ def req_files_for_dir(requirements_dir)
157
+ dir = directory.gsub(%r{(^/|/$)}, "")
158
+ relative_reqs_dir =
159
+ requirements_dir.path.gsub(%r{^/?#{Regexp.escape(dir)}/?}, "")
160
+
161
+ repo_contents(dir: relative_reqs_dir).
162
+ select { |f| f.type == "file" }.
163
+ select { |f| f.name.end_with?(".txt", ".in") }.
164
+ map { |f| fetch_file_from_host("#{relative_reqs_dir}/#{f.name}") }.
165
+ select { |f| requirements_file?(f) }
166
+ end
167
+
168
+ def child_requirement_files
169
+ @child_requirement_files ||=
170
+ begin
171
+ fetched_files = requirements_txt_files.dup
172
+ requirements_txt_files.flat_map do |requirement_file|
173
+ child_files = fetch_child_requirement_files(
174
+ file: requirement_file,
175
+ previously_fetched_files: fetched_files
176
+ )
177
+
178
+ fetched_files += child_files
179
+ child_files
180
+ end
181
+ end
182
+ end
183
+
184
+ def fetch_child_requirement_files(file:, previously_fetched_files:)
185
+ paths = file.content.scan(CHILD_REQUIREMENT_REGEX).flatten
186
+ current_dir = File.dirname(file.name)
187
+
188
+ paths.flat_map do |path|
189
+ path = File.join(current_dir, path) unless current_dir == "."
190
+ path = Pathname.new(path).cleanpath.to_path
191
+
192
+ next if previously_fetched_files.map(&:name).include?(path)
193
+ next if file.name == path
194
+
195
+ fetched_file = fetch_file_from_host(path)
196
+ grandchild_requirement_files = fetch_child_requirement_files(
197
+ file: fetched_file,
198
+ previously_fetched_files: previously_fetched_files + [file]
199
+ )
200
+ [fetched_file, *grandchild_requirement_files]
201
+ end.compact
202
+ end
203
+
204
+ def constraints_files
205
+ all_requirement_files = requirements_txt_files +
206
+ child_requirement_files
207
+
208
+ constraints_paths = all_requirement_files.map do |req_file|
209
+ req_file.content.scan(CONSTRAINT_REGEX).flatten
210
+ end.flatten.uniq
211
+
212
+ constraints_paths.map { |path| fetch_file_from_host(path) }
213
+ end
214
+
215
+ def path_setup_files
216
+ path_setup_files = []
217
+ unfetchable_files = []
218
+
219
+ path_setup_file_paths.each do |path|
220
+ path = Pathname.new(File.join(path, "setup.py")).cleanpath.to_path
221
+ next if path == "setup.py" && setup_file
222
+
223
+ begin
224
+ path_setup_files << fetch_file_from_host(path).
225
+ tap { |f| f.support_file = true }
226
+ rescue Dependabot::DependencyFileNotFound
227
+ unfetchable_files << path
228
+ end
229
+
230
+ begin
231
+ cfg_path = path.gsub(/\.py$/, ".cfg")
232
+ path_setup_files << fetch_file_from_host(cfg_path).
233
+ tap { |f| f.support_file = true }
234
+ rescue Dependabot::DependencyFileNotFound
235
+ # Ignore lack of a setup.cfg
236
+ nil
237
+ end
238
+ end
239
+
240
+ if unfetchable_files.any?
241
+ raise Dependabot::PathDependenciesNotReachable, unfetchable_files
242
+ end
243
+
244
+ path_setup_files
245
+ end
246
+
247
+ def requirements_file?(file)
248
+ return true if file.name.match?(/requirements/x)
249
+
250
+ content = file.content.
251
+ gsub(CONSTRAINT_REGEX, "").
252
+ gsub(CHILD_REQUIREMENT_REGEX, "")
253
+
254
+ tmp_file = DependencyFile.new(name: file.name, content: content)
255
+ Dependabot::FileParsers::Python::Pip.
256
+ new(dependency_files: [tmp_file], source: source).
257
+ parse.any?
258
+ rescue Dependabot::DependencyFileNotEvaluatable
259
+ false
260
+ end
261
+
262
+ def path_setup_file_paths
263
+ requirement_txt_path_setup_file_paths + pipfile_path_setup_file_paths
264
+ end
265
+
266
+ def requirement_txt_path_setup_file_paths
267
+ (requirements_txt_files + child_requirement_files).map do |req_file|
268
+ uneditable_reqs =
269
+ req_file.content.
270
+ scan(/^['"]?(?<path>\..*?)(?=\[|#|'|"|$)/).
271
+ flatten.
272
+ map(&:strip).
273
+ reject { |p| p.include?("://") }
274
+
275
+ editable_reqs =
276
+ req_file.content.
277
+ scan(/^(?:-e)\s+['"]?(?<path>.*?)(?=\[|#|'|"|$)/).
278
+ flatten.
279
+ map(&:strip).
280
+ reject { |p| p.include?("://") }
281
+
282
+ uneditable_reqs + editable_reqs
283
+ end.flatten.uniq
284
+ end
285
+
286
+ def pipfile_path_setup_file_paths
287
+ return [] unless pipfile
288
+
289
+ paths = []
290
+ %w(packages dev-packages).each do |dep_type|
291
+ next unless parsed_pipfile[dep_type]
292
+
293
+ parsed_pipfile[dep_type].each do |_, req|
294
+ next unless req.is_a?(Hash) && req["path"]
295
+
296
+ paths << req["path"]
297
+ end
298
+ end
299
+
300
+ paths
301
+ end
302
+ end
303
+ end
304
+ end
305
+ end
@@ -0,0 +1,185 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_fetchers/base"
4
+ require "dependabot/file_updaters/ruby/bundler/lockfile_updater"
5
+ require "dependabot/errors"
6
+
7
+ module Dependabot
8
+ module FileFetchers
9
+ module Ruby
10
+ class Bundler < Dependabot::FileFetchers::Base
11
+ require "dependabot/file_fetchers/ruby/bundler/path_gemspec_finder"
12
+ require "dependabot/file_fetchers/ruby/bundler/child_gemfile_finder"
13
+ require "dependabot/file_fetchers/ruby/bundler/require_relative_finder"
14
+
15
+ def self.required_files_in?(filenames)
16
+ if filenames.any? { |name| name.match?(%r{^[^/]*\.gemspec$}) }
17
+ return true
18
+ end
19
+
20
+ filenames.include?("Gemfile") || filenames.include?("gems.rb")
21
+ end
22
+
23
+ def self.required_files_message
24
+ "Repo must contain either a Gemfile, a gemspec, or a gems.rb."
25
+ end
26
+
27
+ private
28
+
29
+ def fetch_files
30
+ fetched_files = []
31
+ fetched_files << gemfile if gemfile
32
+ fetched_files << lockfile if gemfile && lockfile
33
+ fetched_files += gemspecs
34
+ fetched_files << ruby_version_file if ruby_version_file
35
+ fetched_files += child_gemfiles
36
+ fetched_files += path_gemspecs
37
+ fetched_files += require_relative_files(fetched_files)
38
+
39
+ check_required_files_present
40
+
41
+ unless self.class.required_files_in?(fetched_files.map(&:name))
42
+ raise "Invalid set of files: #{fetched_files.map(&:name)}"
43
+ end
44
+
45
+ fetched_files.uniq
46
+ end
47
+
48
+ def check_required_files_present
49
+ return if gemfile || gemspecs.any?
50
+
51
+ path = Pathname.new(File.join(directory, "Gemfile")).
52
+ cleanpath.to_path
53
+ raise Dependabot::DependencyFileNotFound, path
54
+ end
55
+
56
+ def gemfile
57
+ @gemfile ||= fetch_file_if_present("gems.rb") ||
58
+ fetch_file_if_present("Gemfile")
59
+ end
60
+
61
+ def lockfile
62
+ @lockfile ||= fetch_file_if_present("gems.locked") ||
63
+ fetch_file_if_present("Gemfile.lock")
64
+ end
65
+
66
+ def gemspecs
67
+ gemspecs = repo_contents.select { |f| f.name.end_with?(".gemspec") }
68
+ @gemspecs ||= gemspecs.map { |gs| fetch_file_from_host(gs.name) }
69
+ rescue Octokit::NotFound
70
+ []
71
+ end
72
+
73
+ def ruby_version_file
74
+ return unless gemfile
75
+ return unless gemfile.content.include?(".ruby-version")
76
+
77
+ @ruby_version_file ||=
78
+ fetch_file_if_present(".ruby-version")&.
79
+ tap { |f| f.support_file = true }
80
+ end
81
+
82
+ def path_gemspecs
83
+ gemspec_files = []
84
+ unfetchable_gems = []
85
+
86
+ gemspec_paths = fetch_gemspec_paths
87
+
88
+ gemspec_paths.each do |path|
89
+ # Get any gemspecs at the path itself
90
+ gemspecs_at_path = fetch_gemspecs_from_directory(path)
91
+
92
+ # Get any gemspecs nested one level deeper
93
+ nested_directories =
94
+ repo_contents(dir: path).
95
+ select { |f| f.type == "dir" }
96
+
97
+ nested_directories.each do |dir|
98
+ dir_path = File.join(path, dir.name)
99
+ gemspecs_at_path += fetch_gemspecs_from_directory(dir_path)
100
+ end
101
+
102
+ # Add the fetched gemspecs to the main array, and note an error if
103
+ # none were found for this path
104
+ gemspec_files += gemspecs_at_path
105
+ unfetchable_gems << path.basename.to_s if gemspecs_at_path.empty?
106
+ rescue Octokit::NotFound, Gitlab::Error::NotFound
107
+ unfetchable_gems << path.basename.to_s
108
+ end
109
+
110
+ if unfetchable_gems.any?
111
+ raise Dependabot::PathDependenciesNotReachable, unfetchable_gems
112
+ end
113
+
114
+ gemspec_files.tap { |ar| ar.each { |f| f.support_file = true } }
115
+ end
116
+
117
+ def require_relative_files(files)
118
+ ruby_files =
119
+ files.select { |f| f.name.end_with?(".rb", "Gemfile", ".gemspec") }
120
+
121
+ paths = ruby_files.flat_map do |file|
122
+ RequireRelativeFinder.new(file: file).require_relative_paths
123
+ end
124
+
125
+ @require_relative_files ||=
126
+ paths.map { |path| fetch_file_from_host(path) }.
127
+ tap { |req_files| req_files.each { |f| f.support_file = true } }
128
+ end
129
+
130
+ def fetch_gemspecs_from_directory(dir_path)
131
+ repo_contents(dir: dir_path).
132
+ select { |f| f.name.end_with?(".gemspec") }.
133
+ map { |f| File.join(dir_path, f.name) }.
134
+ map { |fp| fetch_file_from_host(fp) }
135
+ end
136
+
137
+ def fetch_gemspec_paths
138
+ if lockfile
139
+ parsed_lockfile = ::Bundler::LockfileParser.new(
140
+ sanitized_lockfile_content
141
+ )
142
+ parsed_lockfile.specs.
143
+ select { |s| s.source.instance_of?(::Bundler::Source::Path) }.
144
+ map { |s| s.source.path }.uniq
145
+ else
146
+ gemfiles = ([gemfile] + child_gemfiles).compact
147
+ gemfiles.flat_map do |file|
148
+ PathGemspecFinder.new(gemfile: file).path_gemspec_paths
149
+ end.uniq
150
+ end
151
+ rescue ::Bundler::LockfileError
152
+ raise Dependabot::DependencyFileNotParseable, lockfile.path
153
+ end
154
+
155
+ def child_gemfiles
156
+ return [] unless gemfile
157
+
158
+ @child_gemfiles ||=
159
+ fetch_child_gemfiles(file: gemfile, previously_fetched_files: [])
160
+ end
161
+
162
+ def sanitized_lockfile_content
163
+ regex = FileUpdaters::Ruby::Bundler::LockfileUpdater::LOCKFILE_ENDING
164
+ lockfile.content.gsub(regex, "")
165
+ end
166
+
167
+ def fetch_child_gemfiles(file:, previously_fetched_files:)
168
+ paths = ChildGemfileFinder.new(gemfile: file).child_gemfile_paths
169
+
170
+ paths.flat_map do |path|
171
+ next if previously_fetched_files.map(&:name).include?(path)
172
+ next if file.name == path
173
+
174
+ fetched_file = fetch_file_from_host(path)
175
+ grandchild_gemfiles = fetch_child_gemfiles(
176
+ file: fetched_file,
177
+ previously_fetched_files: previously_fetched_files + [file]
178
+ )
179
+ [fetched_file, *grandchild_gemfiles]
180
+ end.compact
181
+ end
182
+ end
183
+ end
184
+ end
185
+ end