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,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dependabot
4
+ module FileUpdaters
5
+ class Base
6
+ attr_reader :dependencies, :dependency_files, :credentials
7
+
8
+ def self.updated_files_regex
9
+ raise NotImplementedError
10
+ end
11
+
12
+ def initialize(dependencies:, dependency_files:, credentials:)
13
+ @dependencies = dependencies
14
+ @dependency_files = dependency_files
15
+ @credentials = credentials
16
+
17
+ check_required_files
18
+ end
19
+
20
+ def updated_dependency_files
21
+ raise NotImplementedError
22
+ end
23
+
24
+ private
25
+
26
+ def check_required_files
27
+ raise NotImplementedError
28
+ end
29
+
30
+ def get_original_file(filename)
31
+ dependency_files.find { |f| f.name == filename }
32
+ end
33
+
34
+ def file_changed?(file)
35
+ dependencies.any? { |dep| requirement_changed?(file, dep) }
36
+ end
37
+
38
+ def requirement_changed?(file, dependency)
39
+ changed_requirements =
40
+ dependency.requirements - dependency.previous_requirements
41
+
42
+ changed_requirements.any? { |f| f[:file] == file.name }
43
+ end
44
+
45
+ def updated_file(file:, content:)
46
+ updated_file = file.dup
47
+ updated_file.content = content
48
+ updated_file
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,133 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_updaters/base"
4
+ require "dependabot/errors"
5
+
6
+ module Dependabot
7
+ module FileUpdaters
8
+ module Docker
9
+ class Docker < Dependabot::FileUpdaters::Base
10
+ FROM_REGEX = /[Ff][Rr][Oo][Mm]/.freeze
11
+
12
+ def self.updated_files_regex
13
+ [/dockerfile/]
14
+ end
15
+
16
+ def updated_dependency_files
17
+ updated_files = []
18
+
19
+ dependency_files.each do |file|
20
+ next unless requirement_changed?(file, dependency)
21
+
22
+ updated_files <<
23
+ updated_file(
24
+ file: file,
25
+ content: updated_dockerfile_content(file)
26
+ )
27
+ end
28
+
29
+ updated_files.reject! { |f| dependency_files.include?(f) }
30
+ raise "No files changed!" if updated_files.none?
31
+
32
+ updated_files
33
+ end
34
+
35
+ private
36
+
37
+ def dependency
38
+ # Dockerfiles will only ever be updating a single dependency
39
+ dependencies.first
40
+ end
41
+
42
+ def check_required_files
43
+ # Just check if there are any files at all.
44
+ return if dependency_files.any?
45
+
46
+ raise "No Dockerfile!"
47
+ end
48
+
49
+ def updated_dockerfile_content(file)
50
+ updated_content =
51
+ if specified_with_digest?(file)
52
+ update_digest_and_tag(file)
53
+ else
54
+ update_tag(file)
55
+ end
56
+
57
+ raise "Expected content to change!" if updated_content == file.content
58
+
59
+ updated_content
60
+ end
61
+
62
+ def update_digest_and_tag(file)
63
+ old_declaration_regex = /^#{FROM_REGEX}\s+.*@#{old_digest(file)}/
64
+
65
+ file.content.gsub(old_declaration_regex) do |old_dec|
66
+ old_dec.
67
+ gsub("@#{old_digest(file)}", "@#{new_digest(file)}").
68
+ gsub(":#{dependency.previous_version}",
69
+ ":#{dependency.version}")
70
+ end
71
+ end
72
+
73
+ def update_tag(file)
74
+ return unless old_tag(file)
75
+
76
+ old_declaration =
77
+ if private_registry_url(file) then "#{private_registry_url(file)}/"
78
+ else ""
79
+ end
80
+ old_declaration += "#{dependency.name}:#{old_tag(file)}"
81
+ escaped_declaration = Regexp.escape(old_declaration)
82
+
83
+ old_declaration_regex = /^#{FROM_REGEX}\s+#{escaped_declaration}/
84
+
85
+ file.content.gsub(old_declaration_regex) do |old_dec|
86
+ old_dec.gsub(":#{old_tag(file)}", ":#{new_tag(file)}")
87
+ end
88
+ end
89
+
90
+ def specified_with_digest?(file)
91
+ dependency.
92
+ requirements.
93
+ find { |r| r[:file] == file.name }.
94
+ fetch(:source)[:digest]
95
+ end
96
+
97
+ def new_digest(file)
98
+ return unless specified_with_digest?(file)
99
+
100
+ dependency.requirements.
101
+ find { |r| r[:file] == file.name }.
102
+ fetch(:source).fetch(:digest)
103
+ end
104
+
105
+ def old_digest(file)
106
+ return unless specified_with_digest?(file)
107
+
108
+ dependency.previous_requirements.
109
+ find { |r| r[:file] == file.name }.
110
+ fetch(:source).fetch(:digest)
111
+ end
112
+
113
+ def new_tag(file)
114
+ dependency.requirements.
115
+ find { |r| r[:file] == file.name }.
116
+ fetch(:source)[:tag]
117
+ end
118
+
119
+ def old_tag(file)
120
+ dependency.previous_requirements.
121
+ find { |r| r[:file] == file.name }.
122
+ fetch(:source)[:tag]
123
+ end
124
+
125
+ def private_registry_url(file)
126
+ dependency.requirements.
127
+ find { |r| r[:file] == file.name }.
128
+ fetch(:source)[:registry]
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,151 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_updaters/base"
4
+
5
+ module Dependabot
6
+ module FileUpdaters
7
+ module Dotnet
8
+ class Nuget < Dependabot::FileUpdaters::Base
9
+ require_relative "nuget/packages_config_declaration_finder"
10
+ require_relative "nuget/project_file_declaration_finder"
11
+ require_relative "nuget/property_value_updater"
12
+
13
+ def self.updated_files_regex
14
+ [
15
+ %r{^[^/]*\.[a-z]{2}proj$},
16
+ /^packages\.config$/i
17
+ ]
18
+ end
19
+
20
+ def updated_dependency_files
21
+ updated_files = dependency_files.dup
22
+
23
+ # Loop through each of the changed requirements, applying changes to
24
+ # all files for that change. Note that the logic is different here
25
+ # to other languages because donet has property inheritance across
26
+ # files
27
+ dependencies.each do |dependency|
28
+ updated_files = update_files_for_dependency(
29
+ files: updated_files,
30
+ dependency: dependency
31
+ )
32
+ end
33
+
34
+ updated_files.reject! { |f| dependency_files.include?(f) }
35
+
36
+ raise "No files changed!" if updated_files.none?
37
+
38
+ updated_files
39
+ end
40
+
41
+ private
42
+
43
+ def project_files
44
+ dependency_files.select { |df| df.name.match?(/\.[a-z]{2}proj$/) }
45
+ end
46
+
47
+ def packages_config_files
48
+ dependency_files.select do |f|
49
+ f.name.split("/").last.casecmp("packages.config").zero?
50
+ end
51
+ end
52
+
53
+ def check_required_files
54
+ return if project_files.any? || packages_config_files.any?
55
+
56
+ raise "No project file or packages.config!"
57
+ end
58
+
59
+ def update_files_for_dependency(files:, dependency:)
60
+ # The UpdateChecker ensures the order of requirements is preserved
61
+ # when updating, so we can zip them together in new/old pairs.
62
+ reqs = dependency.requirements.zip(dependency.previous_requirements).
63
+ reject { |new_req, old_req| new_req == old_req }
64
+
65
+ # Loop through each changed requirement and update the files
66
+ reqs.each do |new_req, old_req|
67
+ raise "Bad req match" unless new_req[:file] == old_req[:file]
68
+ next if new_req[:requirement] == old_req[:requirement]
69
+
70
+ file = files.find { |f| f.name == new_req.fetch(:file) }
71
+
72
+ files =
73
+ if new_req.dig(:metadata, :property_name)
74
+ update_property_value(files, file, new_req)
75
+ else
76
+ update_declaration(files, dependency, file, old_req, new_req)
77
+ end
78
+ end
79
+
80
+ files
81
+ end
82
+
83
+ def update_property_value(files, file, req)
84
+ files = files.dup
85
+ property_name = req.fetch(:metadata).fetch(:property_name)
86
+
87
+ PropertyValueUpdater.
88
+ new(dependency_files: files).
89
+ update_files_for_property_change(
90
+ property_name: property_name,
91
+ updated_value: req.fetch(:requirement),
92
+ callsite_file: file
93
+ )
94
+ end
95
+
96
+ def update_declaration(files, dependency, file, old_req, new_req)
97
+ files = files.dup
98
+
99
+ updated_content = file.content
100
+
101
+ original_declarations(dependency, old_req).each do |old_dec|
102
+ updated_content = updated_content.gsub(
103
+ old_dec,
104
+ updated_declaration(old_dec, old_req, new_req)
105
+ )
106
+ end
107
+
108
+ raise "Expected content to change!" if updated_content == file.content
109
+
110
+ files[files.index(file)] =
111
+ updated_file(file: file, content: updated_content)
112
+ files
113
+ end
114
+
115
+ def original_declarations(dependency, requirement)
116
+ declaration_finder(dependency, requirement).declaration_strings
117
+ end
118
+
119
+ def declaration_finder(dependency, requirement)
120
+ @declaration_finders ||= {}
121
+
122
+ requirement_fn = requirement.fetch(:file)
123
+ @declaration_finders[dependency.hash + requirement.hash] ||=
124
+ if requirement_fn.split("/").last.casecmp("packages.config").zero?
125
+ PackagesConfigDeclarationFinder.new(
126
+ dependency_name: dependency.name,
127
+ declaring_requirement: requirement,
128
+ packages_config:
129
+ packages_config_files.find { |f| f.name == requirement_fn }
130
+ )
131
+ else
132
+ ProjectFileDeclarationFinder.new(
133
+ dependency_name: dependency.name,
134
+ declaring_requirement: requirement,
135
+ dependency_files: dependency_files
136
+ )
137
+ end
138
+ end
139
+
140
+ def updated_declaration(old_declaration, previous_req, requirement)
141
+ original_req_string = previous_req.fetch(:requirement)
142
+
143
+ old_declaration.gsub(
144
+ original_req_string,
145
+ requirement.fetch(:requirement)
146
+ )
147
+ end
148
+ end
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "nokogiri"
4
+ require "dependabot/file_updaters/dotnet/nuget"
5
+
6
+ module Dependabot
7
+ module FileUpdaters
8
+ module Dotnet
9
+ class Nuget
10
+ class PackagesConfigDeclarationFinder
11
+ DECLARATION_REGEX =
12
+ %r{<package [^>]*?/>|
13
+ <package [^>]*?[^/]>.*?</package>}mx.freeze
14
+
15
+ attr_reader :dependency_name, :declaring_requirement,
16
+ :packages_config
17
+
18
+ def initialize(dependency_name:, packages_config:,
19
+ declaring_requirement:)
20
+ @dependency_name = dependency_name
21
+ @packages_config = packages_config
22
+ @declaring_requirement = declaring_requirement
23
+
24
+ if declaring_requirement[:file].split("/").last.
25
+ casecmp("packages.config").zero?
26
+ return
27
+ end
28
+
29
+ raise "Requirement not from packages.config!"
30
+ end
31
+
32
+ def declaration_strings
33
+ @declaration_strings ||= fetch_declaration_strings
34
+ end
35
+
36
+ def declaration_nodes
37
+ declaration_strings.map do |declaration_string|
38
+ Nokogiri::XML(declaration_string)
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ def fetch_declaration_strings
45
+ deep_find_declarations(packages_config.content).select do |nd|
46
+ node = Nokogiri::XML(nd)
47
+ node.remove_namespaces!
48
+ node = node.at_xpath("/package")
49
+
50
+ node_name = node.attribute("id")&.value&.strip ||
51
+ node.at_xpath("./id")&.content&.strip
52
+ next false unless node_name == dependency_name
53
+
54
+ node_requirement = node.attribute("version")&.value&.strip ||
55
+ node.at_xpath("./version")&.content&.strip
56
+ node_requirement == declaring_requirement.fetch(:requirement)
57
+ end
58
+ end
59
+
60
+ def deep_find_declarations(string)
61
+ string.scan(DECLARATION_REGEX).flat_map do |matching_node|
62
+ [matching_node, *deep_find_declarations(matching_node[0..-2])]
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "nokogiri"
4
+ require "dependabot/file_updaters/dotnet/nuget"
5
+
6
+ module Dependabot
7
+ module FileUpdaters
8
+ module Dotnet
9
+ class Nuget
10
+ class ProjectFileDeclarationFinder
11
+ DECLARATION_REGEX =
12
+ %r{
13
+ <PackageReference [^>]*?/>|
14
+ <PackageReference [^>]*?[^/]>.*?</PackageReference>|
15
+ <Dependency [^>]*?/>|
16
+ <Dependency [^>]*?[^/]>.*?</Dependency>|
17
+ <DevelopmentDependency [^>]*?/>|
18
+ <DevelopmentDependency [^>]*?[^/]>.*?</DevelopmentDependency>
19
+ }mx.freeze
20
+
21
+ attr_reader :dependency_name, :declaring_requirement,
22
+ :dependency_files
23
+
24
+ def initialize(dependency_name:, dependency_files:,
25
+ declaring_requirement:)
26
+ @dependency_name = dependency_name
27
+ @dependency_files = dependency_files
28
+ @declaring_requirement = declaring_requirement
29
+ end
30
+
31
+ def declaration_strings
32
+ @declaration_strings ||= fetch_declaration_strings
33
+ end
34
+
35
+ def declaration_nodes
36
+ declaration_strings.map do |declaration_string|
37
+ Nokogiri::XML(declaration_string)
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def fetch_declaration_strings
44
+ deep_find_declarations(declaring_file.content).select do |nd|
45
+ node = Nokogiri::XML(nd)
46
+ node.remove_namespaces!
47
+ node = node.at_xpath("/PackageReference") ||
48
+ node.at_xpath("/Dependency") ||
49
+ node.at_xpath("/DevelopmentDependency")
50
+
51
+ node_name = node.attribute("Include")&.value&.strip ||
52
+ node.at_xpath("./Include")&.content&.strip
53
+ next false unless node_name == dependency_name
54
+
55
+ node_requirement = node.attribute("Version")&.value&.strip ||
56
+ node.at_xpath("./Version")&.content&.strip
57
+ node_requirement == declaring_requirement.fetch(:requirement)
58
+ end
59
+ end
60
+
61
+ def deep_find_declarations(string)
62
+ string.scan(DECLARATION_REGEX).flat_map do |matching_node|
63
+ [matching_node, *deep_find_declarations(matching_node[0..-2])]
64
+ end
65
+ end
66
+
67
+ def declaring_file
68
+ filename = declaring_requirement.fetch(:file)
69
+ declaring_file = dependency_files.find { |f| f.name == filename }
70
+ return declaring_file if declaring_file
71
+
72
+ raise "No file found with name #{filename}!"
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end