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,125 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "toml-rb"
4
+
5
+ require "dependabot/file_parsers/python/pip"
6
+ require "dependabot/file_updaters/python/pip"
7
+
8
+ module Dependabot
9
+ module FileUpdaters
10
+ module Python
11
+ class Pip
12
+ class PipfilePreparer
13
+ def initialize(pipfile_content:)
14
+ @pipfile_content = pipfile_content
15
+ end
16
+
17
+ def replace_sources(credentials)
18
+ pipfile_object = TomlRB.parse(pipfile_content)
19
+
20
+ pipfile_object["source"] =
21
+ pipfile_sources.reject { |h| h["url"].include?("${") } +
22
+ config_variable_sources(credentials)
23
+
24
+ TomlRB.dump(pipfile_object)
25
+ end
26
+
27
+ def freeze_top_level_dependencies_except(dependencies, lockfile)
28
+ return pipfile_content unless lockfile
29
+
30
+ pipfile_object = TomlRB.parse(pipfile_content)
31
+ excluded_names = dependencies.map(&:name)
32
+
33
+ FileParsers::Python::Pip::DEPENDENCY_GROUP_KEYS.each do |keys|
34
+ next unless pipfile_object[keys[:pipfile]]
35
+
36
+ pipfile_object.fetch(keys[:pipfile]).each do |dep_name, _|
37
+ next if excluded_names.include?(normalise(dep_name))
38
+
39
+ freeze_dependency(dep_name, pipfile_object, lockfile, keys)
40
+ end
41
+ end
42
+
43
+ TomlRB.dump(pipfile_object)
44
+ end
45
+
46
+ # rubocop:disable Metrics/PerceivedComplexity
47
+ def freeze_dependency(dep_name, pipfile_object, lockfile, keys)
48
+ locked_version = version_from_lockfile(
49
+ lockfile,
50
+ keys[:lockfile],
51
+ normalise(dep_name)
52
+ )
53
+ locked_ref = ref_from_lockfile(
54
+ lockfile,
55
+ keys[:lockfile],
56
+ normalise(dep_name)
57
+ )
58
+
59
+ pipfile_req = pipfile_object[keys[:pipfile]][dep_name]
60
+ if pipfile_req.is_a?(Hash) && locked_version
61
+ pipfile_req["version"] = "==#{locked_version}"
62
+ elsif pipfile_req.is_a?(Hash) && locked_ref && !pipfile_req["ref"]
63
+ pipfile_req["ref"] = locked_ref
64
+ elsif locked_version
65
+ pipfile_object[keys[:pipfile]][dep_name] = "==#{locked_version}"
66
+ end
67
+ end
68
+ # rubocop:enable Metrics/PerceivedComplexity
69
+
70
+ def update_python_requirement(requirement)
71
+ pipfile_object = TomlRB.parse(pipfile_content)
72
+
73
+ pipfile_object["requires"] ||= {}
74
+ pipfile_object["requires"].delete("python_full_version")
75
+ pipfile_object["requires"].delete("python_version")
76
+ pipfile_object["requires"]["python_full_version"] = requirement
77
+
78
+ TomlRB.dump(pipfile_object)
79
+ end
80
+
81
+ private
82
+
83
+ attr_reader :pipfile_content
84
+
85
+ def version_from_lockfile(lockfile, dep_type, dep_name)
86
+ details = JSON.parse(lockfile.content).
87
+ dig(dep_type, normalise(dep_name))
88
+
89
+ case details
90
+ when String then details.gsub(/^==/, "")
91
+ when Hash then details["version"]&.gsub(/^==/, "")
92
+ end
93
+ end
94
+
95
+ def ref_from_lockfile(lockfile, dep_type, dep_name)
96
+ details = JSON.parse(lockfile.content).
97
+ dig(dep_type, normalise(dep_name))
98
+
99
+ case details
100
+ when Hash then details["ref"]
101
+ end
102
+ end
103
+
104
+ # See https://www.python.org/dev/peps/pep-0503/#normalized-names
105
+ def normalise(name)
106
+ name.downcase.gsub(/[-_.]+/, "-")
107
+ end
108
+
109
+ def pipfile_sources
110
+ @pipfile_sources ||=
111
+ TomlRB.parse(pipfile_content).fetch("source", []).
112
+ map { |h| h.dup.merge("url" => h["url"].gsub(%r{/*$}, "") + "/") }
113
+ end
114
+
115
+ def config_variable_sources(credentials)
116
+ @config_variable_sources ||=
117
+ credentials.
118
+ select { |cred| cred["type"] == "python_index" }.
119
+ map { |cred| { "url" => cred["index-url"] } }
120
+ end
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,289 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "toml-rb"
4
+
5
+ require "dependabot/file_updaters/python/pip"
6
+ require "dependabot/shared_helpers"
7
+ require "dependabot/utils/python/version"
8
+ require "dependabot/utils/python/requirement"
9
+ require "python_versions"
10
+
11
+ module Dependabot
12
+ module FileUpdaters
13
+ module Python
14
+ class Pip
15
+ class PoetryFileUpdater
16
+ require_relative "pyproject_preparer"
17
+
18
+ attr_reader :dependencies, :dependency_files, :credentials
19
+
20
+ def initialize(dependencies:, dependency_files:, credentials:)
21
+ @dependencies = dependencies
22
+ @dependency_files = dependency_files
23
+ @credentials = credentials
24
+ end
25
+
26
+ def updated_dependency_files
27
+ return @updated_dependency_files if @update_already_attempted
28
+
29
+ @update_already_attempted = true
30
+ @updated_dependency_files ||= fetch_updated_dependency_files
31
+ end
32
+
33
+ private
34
+
35
+ def dependency
36
+ # For now, we'll only ever be updating a single dependency
37
+ dependencies.first
38
+ end
39
+
40
+ def fetch_updated_dependency_files
41
+ updated_files = []
42
+
43
+ if file_changed?(pyproject)
44
+ updated_files <<
45
+ updated_file(
46
+ file: pyproject,
47
+ content: updated_pyproject_content
48
+ )
49
+ end
50
+
51
+ if lockfile && lockfile.content == updated_lockfile_content
52
+ raise "Expected lockfile to change!"
53
+ end
54
+
55
+ if lockfile
56
+ updated_files <<
57
+ updated_file(file: lockfile, content: updated_lockfile_content)
58
+ end
59
+
60
+ updated_files
61
+ end
62
+
63
+ def updated_pyproject_content
64
+ dependencies.
65
+ select { |dep| requirement_changed?(pyproject, dep) }.
66
+ reduce(pyproject.content.dup) do |content, dep|
67
+ updated_requirement =
68
+ dep.requirements.find { |r| r[:file] == pyproject.name }.
69
+ fetch(:requirement)
70
+
71
+ old_req =
72
+ dep.previous_requirements.
73
+ find { |r| r[:file] == pyproject.name }.
74
+ fetch(:requirement)
75
+
76
+ updated_content =
77
+ content.gsub(declaration_regex(dep)) do |line|
78
+ line.gsub(old_req, updated_requirement)
79
+ end
80
+
81
+ raise "Content did not change!" if content == updated_content
82
+
83
+ updated_content
84
+ end
85
+ end
86
+
87
+ def updated_lockfile_content
88
+ @updated_lockfile_content ||=
89
+ begin
90
+ new_lockfile = updated_lockfile_content_for(prepared_pyproject)
91
+
92
+ tmp_hash =
93
+ TomlRB.parse(new_lockfile)["metadata"]["content-hash"]
94
+ correct_hash = pyproject_hash_for(updated_pyproject_content)
95
+
96
+ new_lockfile.gsub(tmp_hash, correct_hash)
97
+ end
98
+ end
99
+
100
+ def prepared_pyproject
101
+ content = updated_pyproject_content
102
+ content = freeze_other_dependencies(content)
103
+ content = freeze_dependencies_being_updated(content)
104
+ content = add_private_sources(content)
105
+ content = sanitize(content)
106
+ content
107
+ end
108
+
109
+ def freeze_other_dependencies(pyproject_content)
110
+ PyprojectPreparer.
111
+ new(pyproject_content: pyproject_content).
112
+ freeze_top_level_dependencies_except(dependencies, lockfile)
113
+ end
114
+
115
+ def freeze_dependencies_being_updated(pyproject_content)
116
+ pyproject_object = TomlRB.parse(pyproject_content)
117
+ poetry_object = pyproject_object.fetch("tool").fetch("poetry")
118
+
119
+ dependencies.each do |dep|
120
+ %w(dependencies dev-dependencies).each do |type|
121
+ names = poetry_object[type]&.keys || []
122
+ pkg_name = names.find { |nm| normalise(nm) == dep.name }
123
+ next unless pkg_name
124
+
125
+ if poetry_object[type][pkg_name].is_a?(Hash)
126
+ poetry_object[type][pkg_name]["version"] = dep.version
127
+ else
128
+ poetry_object[type][pkg_name] = dep.version
129
+ end
130
+ end
131
+ end
132
+
133
+ TomlRB.dump(pyproject_object)
134
+ end
135
+
136
+ def add_private_sources(pyproject_content)
137
+ PyprojectPreparer.
138
+ new(pyproject_content: pyproject_content).
139
+ replace_sources(credentials)
140
+ end
141
+
142
+ def sanitize(pyproject_content)
143
+ PyprojectPreparer.
144
+ new(pyproject_content: pyproject_content).
145
+ sanitize
146
+ end
147
+
148
+ def updated_lockfile_content_for(pyproject_content)
149
+ SharedHelpers.in_a_temporary_directory do
150
+ write_temporary_dependency_files(pyproject_content)
151
+
152
+ if python_version && !pre_installed_python?(python_version)
153
+ run_poetry_command("pyenv install -s")
154
+ run_poetry_command("pyenv exec pip install --upgrade pip")
155
+ run_poetry_command(
156
+ "pyenv exec pip install -r #{python_requirements_path}"
157
+ )
158
+ end
159
+
160
+ run_poetry_command("pyenv exec poetry lock")
161
+
162
+ return File.read("poetry.lock") if File.exist?("poetry.lock")
163
+
164
+ File.read("pyproject.lock")
165
+ end
166
+ end
167
+
168
+ def run_poetry_command(cmd)
169
+ raw_response = nil
170
+ IO.popen(cmd, err: %i(child out)) { |p| raw_response = p.read }
171
+
172
+ # Raise an error with the output from the shell session if Pipenv
173
+ # returns a non-zero status
174
+ return if $CHILD_STATUS.success?
175
+
176
+ raise SharedHelpers::HelperSubprocessFailed.new(raw_response, cmd)
177
+ end
178
+
179
+ def write_temporary_dependency_files(pyproject_content)
180
+ dependency_files.each do |file|
181
+ path = file.name
182
+ FileUtils.mkdir_p(Pathname.new(path).dirname)
183
+ File.write(path, file.content)
184
+ end
185
+
186
+ # Overwrite the .python-version with updated content
187
+ File.write(".python-version", python_version) if python_version
188
+
189
+ # Overwrite the pyproject with updated content
190
+ File.write("pyproject.toml", pyproject_content)
191
+ end
192
+
193
+ def python_version
194
+ pyproject_object = TomlRB.parse(prepared_pyproject)
195
+ poetry_object = pyproject_object.dig("tool", "poetry")
196
+
197
+ requirement =
198
+ poetry_object&.dig("dependencies", "python") ||
199
+ poetry_object&.dig("dev-dependencies", "python")
200
+
201
+ return python_version_file&.content unless requirement
202
+
203
+ requirements =
204
+ Utils::Python::Requirement.requirements_array(requirement)
205
+
206
+ PythonVersions::PYTHON_VERSIONS.find do |version|
207
+ requirements.any? do |r|
208
+ r.satisfied_by?(Utils::Python::Version.new(version))
209
+ end
210
+ end
211
+ end
212
+
213
+ def pre_installed_python?(version)
214
+ PythonVersions::PRE_INSTALLED_PYTHON_VERSIONS.include?(version)
215
+ end
216
+
217
+ def pyproject_hash_for(pyproject_content)
218
+ SharedHelpers.in_a_temporary_directory do |dir|
219
+ File.write(File.join(dir, "pyproject.toml"), pyproject_content)
220
+ SharedHelpers.run_helper_subprocess(
221
+ command: "pyenv exec python #{python_helper_path}",
222
+ function: "get_pyproject_hash",
223
+ args: [dir]
224
+ )
225
+ end
226
+ end
227
+
228
+ def declaration_regex(dep)
229
+ escaped_name = Regexp.escape(dep.name).gsub("\\-", "[-_.]")
230
+ /(?:^|["'])#{escaped_name}["']?\s*=.*$/i
231
+ end
232
+
233
+ def file_changed?(file)
234
+ dependencies.any? { |dep| requirement_changed?(file, dep) }
235
+ end
236
+
237
+ def requirement_changed?(file, dependency)
238
+ changed_requirements =
239
+ dependency.requirements - dependency.previous_requirements
240
+
241
+ changed_requirements.any? { |f| f[:file] == file.name }
242
+ end
243
+
244
+ def updated_file(file:, content:)
245
+ updated_file = file.dup
246
+ updated_file.content = content
247
+ updated_file
248
+ end
249
+
250
+ def python_helper_path
251
+ project_root = File.join(File.dirname(__FILE__), "../../../../..")
252
+ File.join(project_root, "helpers/python/run.py")
253
+ end
254
+
255
+ # See https://www.python.org/dev/peps/pep-0503/#normalized-names
256
+ def normalise(name)
257
+ name.downcase.gsub(/[-_.]+/, "-")
258
+ end
259
+
260
+ def pyproject
261
+ @pyproject ||=
262
+ dependency_files.find { |f| f.name == "pyproject.toml" }
263
+ end
264
+
265
+ def lockfile
266
+ @lockfile ||= pyproject_lock || poetry_lock
267
+ end
268
+
269
+ def pyproject_lock
270
+ dependency_files.find { |f| f.name == "pyproject.lock" }
271
+ end
272
+
273
+ def poetry_lock
274
+ dependency_files.find { |f| f.name == "poetry.lock" }
275
+ end
276
+
277
+ def python_version_file
278
+ dependency_files.find { |f| f.name == ".python-version" }
279
+ end
280
+
281
+ def python_requirements_path
282
+ project_root = File.join(File.dirname(__FILE__), "../../../../..")
283
+ File.join(project_root, "helpers/python/requirements.txt")
284
+ end
285
+ end
286
+ end
287
+ end
288
+ end
289
+ end
@@ -0,0 +1,105 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "toml-rb"
4
+
5
+ require "dependabot/file_parsers/python/pip"
6
+ require "dependabot/file_updaters/python/pip"
7
+
8
+ module Dependabot
9
+ module FileUpdaters
10
+ module Python
11
+ class Pip
12
+ class PyprojectPreparer
13
+ def initialize(pyproject_content:)
14
+ @pyproject_content = pyproject_content
15
+ end
16
+
17
+ def replace_sources(credentials)
18
+ pyproject_object = TomlRB.parse(pyproject_content)
19
+ poetry_object = pyproject_object.fetch("tool").fetch("poetry")
20
+
21
+ poetry_object["source"] = pyproject_sources +
22
+ config_variable_sources(credentials)
23
+
24
+ TomlRB.dump(pyproject_object)
25
+ end
26
+
27
+ def sanitize
28
+ # {{ name }} syntax not allowed
29
+ pyproject_content.gsub(/\{\{.*?\}\}/, "something")
30
+ end
31
+
32
+ # rubocop:disable Metrics/PerceivedComplexity
33
+ def freeze_top_level_dependencies_except(dependencies, lockfile)
34
+ return pyproject_content unless lockfile
35
+
36
+ pyproject_object = TomlRB.parse(pyproject_content)
37
+ poetry_object = pyproject_object["tool"]["poetry"]
38
+ excluded_names = dependencies.map(&:name) + ["python"]
39
+
40
+ %w(dependencies dev-dependencies).each do |key|
41
+ next unless poetry_object[key]
42
+
43
+ poetry_object.fetch(key).each do |dep_name, _|
44
+ next if excluded_names.include?(normalise(dep_name))
45
+
46
+ locked_details = locked_details(dep_name, lockfile)
47
+
48
+ next unless (locked_version = locked_details&.fetch("version"))
49
+
50
+ if locked_details&.dig("source", "type") == "git"
51
+ poetry_object[key][dep_name] = {
52
+ "git" => locked_details&.dig("source", "url"),
53
+ "rev" => locked_details&.dig("source", "reference")
54
+ }
55
+ elsif poetry_object[dep_name].is_a?(Hash)
56
+ poetry_object[key][dep_name]["version"] = locked_version
57
+ else
58
+ poetry_object[key][dep_name] = locked_version
59
+ end
60
+ end
61
+ end
62
+
63
+ TomlRB.dump(pyproject_object)
64
+ end
65
+ # rubocop:enable Metrics/PerceivedComplexity
66
+
67
+ private
68
+
69
+ attr_reader :pyproject_content
70
+
71
+ def locked_details(dep_name, lockfile)
72
+ parsed_lockfile = TomlRB.parse(lockfile.content)
73
+
74
+ parsed_lockfile.fetch("package").
75
+ find { |d| d["name"] == normalise(dep_name) }
76
+ end
77
+
78
+ # See https://www.python.org/dev/peps/pep-0503/#normalized-names
79
+ def normalise(name)
80
+ name.downcase.gsub(/[-_.]+/, "-")
81
+ end
82
+
83
+ def pyproject_sources
84
+ return @pyproject_sources if @pyproject_sources
85
+
86
+ pyproject_sources ||=
87
+ TomlRB.parse(pyproject_content).
88
+ dig("tool", "poetry", "source")
89
+
90
+ @pyproject_sources ||=
91
+ (pyproject_sources || []).
92
+ map { |h| h.dup.merge("url" => h["url"].gsub(%r{/*$}, "") + "/") }
93
+ end
94
+
95
+ def config_variable_sources(credentials)
96
+ @config_variable_sources ||=
97
+ credentials.
98
+ select { |cred| cred["type"] == "python_index" }.
99
+ map { |cred| { "url" => cred["index-url"] } }
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end