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,166 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "python_requirement_parser"
4
+ require "dependabot/file_updaters/python/pip"
5
+ require "dependabot/shared_helpers"
6
+
7
+ module Dependabot
8
+ module FileUpdaters
9
+ module Python
10
+ class Pip
11
+ class RequirementFileUpdater
12
+ attr_reader :dependencies, :dependency_files, :credentials
13
+
14
+ def initialize(dependencies:, dependency_files:, credentials:)
15
+ @dependencies = dependencies
16
+ @dependency_files = dependency_files
17
+ @credentials = credentials
18
+ end
19
+
20
+ def updated_dependency_files
21
+ return @updated_dependency_files if @update_already_attempted
22
+
23
+ @update_already_attempted = true
24
+ @updated_dependency_files ||= fetch_updated_dependency_files
25
+ end
26
+
27
+ private
28
+
29
+ def dependency
30
+ # For now, we'll only ever be updating a single dependency
31
+ dependencies.first
32
+ end
33
+
34
+ def fetch_updated_dependency_files
35
+ reqs = dependency.requirements.zip(dependency.previous_requirements)
36
+
37
+ reqs.map do |(new_req, old_req)|
38
+ next if new_req == old_req
39
+
40
+ file = get_original_file(new_req.fetch(:file)).dup
41
+ updated_content =
42
+ updated_requirement_or_setup_file_content(new_req, old_req)
43
+ next if updated_content == file.content
44
+
45
+ file.content = updated_content
46
+ file
47
+ end.compact
48
+ end
49
+
50
+ def updated_requirement_or_setup_file_content(new_req, old_req)
51
+ content = get_original_file(new_req.fetch(:file)).content
52
+
53
+ updated_content =
54
+ content.gsub(
55
+ original_declaration_replacement_regex(old_req),
56
+ updated_dependency_declaration_string(new_req, old_req)
57
+ )
58
+
59
+ raise "Expected content to change!" if content == updated_content
60
+
61
+ updated_content
62
+ end
63
+
64
+ def original_dependency_declaration_string(requirement)
65
+ regex = PythonRequirementParser::INSTALL_REQ_WITH_REQUIREMENT
66
+ matches = []
67
+
68
+ get_original_file(requirement.fetch(:file)).
69
+ content.scan(regex) { matches << Regexp.last_match }
70
+ dec = matches.
71
+ select { |m| normalise(m[:name]) == dependency.name }.
72
+ find do |m|
73
+ # The FileParser can mess up a requirement's spacing so we
74
+ # sanitize both requirements before comparing
75
+ f_req = m[:requirements]&.gsub(/\s/, "")&.split(",")&.sort
76
+ p_req = requirement.fetch(:requirement)&.
77
+ gsub(/\s/, "")&.split(",")&.sort
78
+ f_req == p_req
79
+ end
80
+
81
+ raise "Declaration not found for #{dependency.name}!" unless dec
82
+
83
+ dec.to_s.strip
84
+ end
85
+
86
+ def updated_dependency_declaration_string(new_req, old_req)
87
+ updated_string =
88
+ original_dependency_declaration_string(old_req).sub(
89
+ PythonRequirementParser::REQUIREMENTS,
90
+ new_req.fetch(:requirement)
91
+ )
92
+ return updated_string unless requirement_includes_hashes?(old_req)
93
+
94
+ updated_string.sub(
95
+ PythonRequirementParser::HASHES,
96
+ package_hashes_for(
97
+ name: dependency.name,
98
+ version: dependency.version,
99
+ algorithm: hash_algorithm(old_req)
100
+ ).join(hash_separator(old_req))
101
+ )
102
+ end
103
+
104
+ def original_declaration_replacement_regex(requirement)
105
+ original_string =
106
+ original_dependency_declaration_string(requirement)
107
+ /(?<![\-\w])#{Regexp.escape(original_string)}(?![\-\w])/
108
+ end
109
+
110
+ def requirement_includes_hashes?(requirement)
111
+ original_dependency_declaration_string(requirement).
112
+ match?(PythonRequirementParser::HASHES)
113
+ end
114
+
115
+ def hash_algorithm(requirement)
116
+ return unless requirement_includes_hashes?(requirement)
117
+
118
+ original_dependency_declaration_string(requirement).
119
+ match(PythonRequirementParser::HASHES).
120
+ named_captures.fetch("algorithm")
121
+ end
122
+
123
+ def hash_separator(requirement)
124
+ return unless requirement_includes_hashes?(requirement)
125
+
126
+ hash_regex = PythonRequirementParser::HASH
127
+ current_separator =
128
+ original_dependency_declaration_string(requirement).
129
+ match(/#{hash_regex}((?<separator>\s*\\?\s*?)#{hash_regex})*/).
130
+ named_captures.fetch("separator")
131
+
132
+ default_separator =
133
+ original_dependency_declaration_string(requirement).
134
+ match(PythonRequirementParser::HASH).
135
+ pre_match.match(/(?<separator>\s*\\?\s*?)\z/).
136
+ named_captures.fetch("separator")
137
+
138
+ current_separator || default_separator
139
+ end
140
+
141
+ def package_hashes_for(name:, version:, algorithm:)
142
+ SharedHelpers.run_helper_subprocess(
143
+ command: "pyenv exec python #{python_helper_path}",
144
+ function: "get_dependency_hash",
145
+ args: [name, version, algorithm]
146
+ ).map { |h| "--hash=#{algorithm}:#{h['hash']}" }
147
+ end
148
+
149
+ def python_helper_path
150
+ project_root = File.join(File.dirname(__FILE__), "../../../../..")
151
+ File.join(project_root, "helpers/python/run.py")
152
+ end
153
+
154
+ # See https://www.python.org/dev/peps/pep-0503/#normalized-names
155
+ def normalise(name)
156
+ name.downcase.gsub(/[-_.]+/, "-")
157
+ end
158
+
159
+ def get_original_file(filename)
160
+ dependency_files.find { |f| f.name == filename }
161
+ end
162
+ end
163
+ end
164
+ end
165
+ end
166
+ end
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "python_requirement_parser"
4
+ require "dependabot/file_updaters/python/pip"
5
+ require "dependabot/shared_helpers"
6
+
7
+ module Dependabot
8
+ module FileUpdaters
9
+ module Python
10
+ class Pip
11
+ class RequirementReplacer
12
+ attr_reader :content, :dependency_name, :old_requirement,
13
+ :new_requirement
14
+
15
+ def initialize(content:, dependency_name:, old_requirement:,
16
+ new_requirement:)
17
+ @content = content
18
+ @dependency_name = dependency_name
19
+ @old_requirement = old_requirement
20
+ @new_requirement = new_requirement
21
+ end
22
+
23
+ def updated_content
24
+ updated_content =
25
+ content.gsub(original_declaration_replacement_regex) do |mtch|
26
+ # If the "declaration" is setting an option (e.g., no-binary)
27
+ # ignore it, since it isn't actually a declaration
28
+ next mtch if Regexp.last_match.pre_match.match?(/--.*\z/)
29
+
30
+ updated_dependency_declaration_string(
31
+ old_requirement,
32
+ new_requirement
33
+ )
34
+ end
35
+
36
+ raise "Expected content to change!" if content == updated_content
37
+
38
+ updated_content
39
+ end
40
+
41
+ private
42
+
43
+ def original_dependency_declaration_string(old_req)
44
+ matches = []
45
+
46
+ dec =
47
+ if old_req.nil?
48
+ regex = PythonRequirementParser::INSTALL_REQ_WITHOUT_REQUIREMENT
49
+ content.scan(regex) { matches << Regexp.last_match }
50
+ matches.find { |m| normalise(m[:name]) == dependency_name }
51
+ else
52
+ regex = PythonRequirementParser::INSTALL_REQ_WITH_REQUIREMENT
53
+ content.scan(regex) { matches << Regexp.last_match }
54
+ matches.
55
+ select { |m| normalise(m[:name]) == dependency_name }.
56
+ find { |m| requirements_match(m[:requirements], old_req) }
57
+ end
58
+
59
+ raise "Declaration not found for #{dependency_name}!" unless dec
60
+
61
+ dec.to_s.strip
62
+ end
63
+
64
+ def updated_dependency_declaration_string(old_req, new_req)
65
+ if old_req
66
+ original_dependency_declaration_string(old_req).
67
+ sub(PythonRequirementParser::REQUIREMENTS, new_req)
68
+ else
69
+ original_dependency_declaration_string(old_req).
70
+ sub(PythonRequirementParser::NAME_WITH_EXTRAS) do |nm|
71
+ nm + new_req
72
+ end
73
+ end
74
+ end
75
+
76
+ def original_declaration_replacement_regex
77
+ original_string =
78
+ original_dependency_declaration_string(old_requirement)
79
+ /(?<![\-\w\.])#{Regexp.escape(original_string)}(?![\-\w\.])/
80
+ end
81
+
82
+ # See https://www.python.org/dev/peps/pep-0503/#normalized-names
83
+ def normalise(name)
84
+ name.downcase.gsub(/[-_.]+/, "-")
85
+ end
86
+
87
+ def requirements_match(req1, req2)
88
+ req1&.split(",")&.map { |r| r.gsub(/\s/, "") }&.sort ==
89
+ req2&.split(",")&.map { |r| r.gsub(/\s/, "") }&.sort
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_updaters/python/pip"
4
+ require "dependabot/file_parsers/python/pip/setup_file_parser"
5
+
6
+ module Dependabot
7
+ module FileUpdaters
8
+ module Python
9
+ class Pip
10
+ # Take a setup.py, parses it (carefully!) and then create a new, clean
11
+ # setup.py using only the information which will appear in the lockfile.
12
+ class SetupFileSanitizer
13
+ def initialize(setup_file:, setup_cfg:)
14
+ @setup_file = setup_file
15
+ @setup_cfg = setup_cfg
16
+ end
17
+
18
+ def sanitized_content
19
+ # The part of the setup.py that Pipenv cares about appears to be the
20
+ # install_requires. A name and version are required by don't end up
21
+ # in the lockfile.
22
+ content =
23
+ "from setuptools import setup\n\n"\
24
+ "setup(name=\"sanitized-package\",version=\"0.0.1\","\
25
+ "install_requires=#{install_requires_array.to_json},"\
26
+ "extras_require=#{extras_require_hash.to_json}"
27
+
28
+ content += ',setup_requires=["pbr"],pbr=True' if include_pbr?
29
+ content + ")"
30
+ end
31
+
32
+ private
33
+
34
+ attr_reader :setup_file, :setup_cfg
35
+
36
+ def include_pbr?
37
+ setup_requires_array.any? { |d| d.start_with?("pbr") }
38
+ end
39
+
40
+ def install_requires_array
41
+ @install_requires_array ||=
42
+ parsed_setup_file.dependencies.map do |dep|
43
+ next unless dep.requirements.first[:groups].
44
+ include?("install_requires")
45
+
46
+ dep.name + dep.requirements.first[:requirement].to_s
47
+ end.compact
48
+ end
49
+
50
+ def setup_requires_array
51
+ @setup_requires_array ||=
52
+ parsed_setup_file.dependencies.map do |dep|
53
+ next unless dep.requirements.first[:groups].
54
+ include?("setup_requires")
55
+
56
+ dep.name + dep.requirements.first[:requirement].to_s
57
+ end.compact
58
+ end
59
+
60
+ def extras_require_hash
61
+ @extras_require_hash ||=
62
+ begin
63
+ hash = {}
64
+ parsed_setup_file.dependencies.each do |dep|
65
+ dep.requirements.first[:groups].each do |group|
66
+ next unless group.start_with?("extras_require:")
67
+
68
+ hash[group.split(":").last] ||= []
69
+ hash[group.split(":").last] <<
70
+ dep.name + dep.requirements.first[:requirement].to_s
71
+ end
72
+ end
73
+
74
+ hash
75
+ end
76
+ end
77
+
78
+ def parsed_setup_file
79
+ @parsed_setup_file ||=
80
+ FileParsers::Python::Pip::SetupFileParser.new(
81
+ dependency_files: [
82
+ setup_file&.dup&.tap { |f| f.name = "setup.py" },
83
+ setup_cfg&.dup&.tap { |f| f.name = "setup.cfg" }
84
+ ].compact
85
+ ).dependency_set
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,121 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_updaters/base"
4
+
5
+ module Dependabot
6
+ module FileUpdaters
7
+ module Ruby
8
+ class Bundler < Dependabot::FileUpdaters::Base
9
+ require_relative "bundler/gemfile_updater"
10
+ require_relative "bundler/gemspec_updater"
11
+ require_relative "bundler/lockfile_updater"
12
+
13
+ def self.updated_files_regex
14
+ [
15
+ /^Gemfile$/,
16
+ /^Gemfile\.lock$/,
17
+ /^gems\.rb$/,
18
+ /^gems\.locked$/,
19
+ %r{^[^/]*\.gemspec$}
20
+ ]
21
+ end
22
+
23
+ def updated_dependency_files
24
+ updated_files = []
25
+
26
+ if gemfile && file_changed?(gemfile)
27
+ updated_files <<
28
+ updated_file(
29
+ file: gemfile,
30
+ content: updated_gemfile_content(gemfile)
31
+ )
32
+ end
33
+
34
+ if lockfile && dependencies.any?(&:appears_in_lockfile?)
35
+ updated_files <<
36
+ updated_file(file: lockfile, content: updated_lockfile_content)
37
+ end
38
+
39
+ top_level_gemspecs.each do |file|
40
+ next unless file_changed?(file)
41
+
42
+ updated_files <<
43
+ updated_file(file: file, content: updated_gemspec_content(file))
44
+ end
45
+
46
+ evaled_gemfiles.each do |file|
47
+ next unless file_changed?(file)
48
+
49
+ updated_files <<
50
+ updated_file(file: file, content: updated_gemfile_content(file))
51
+ end
52
+
53
+ updated_files
54
+ end
55
+
56
+ private
57
+
58
+ def check_required_files
59
+ file_names = dependency_files.map(&:name)
60
+
61
+ if lockfile && !gemfile
62
+ raise "A Gemfile must be provided if a lockfile is!"
63
+ end
64
+
65
+ return if file_names.any? { |name| name.match?(%r{^[^/]*\.gemspec$}) }
66
+ return if gemfile
67
+
68
+ raise "A gemspec or Gemfile must be provided!"
69
+ end
70
+
71
+ def gemfile
72
+ @gemfile ||= get_original_file("Gemfile") ||
73
+ get_original_file("gems.rb")
74
+ end
75
+
76
+ def lockfile
77
+ @lockfile ||= get_original_file("Gemfile.lock") ||
78
+ get_original_file("gems.locked")
79
+ end
80
+
81
+ def evaled_gemfiles
82
+ @evaled_gemfiles ||=
83
+ dependency_files.
84
+ reject { |f| f.name.end_with?(".gemspec") }.
85
+ reject { |f| f.name.end_with?(".lock") }.
86
+ reject { |f| f.name.end_with?(".ruby-version") }.
87
+ reject { |f| f.name == "Gemfile" }.
88
+ reject { |f| f.name == "gems.rb" }.
89
+ reject { |f| f.name == "gems.locked" }
90
+ end
91
+
92
+ def updated_gemfile_content(file)
93
+ GemfileUpdater.new(
94
+ dependencies: dependencies,
95
+ gemfile: file
96
+ ).updated_gemfile_content
97
+ end
98
+
99
+ def updated_gemspec_content(gemspec)
100
+ GemspecUpdater.new(
101
+ dependencies: dependencies,
102
+ gemspec: gemspec
103
+ ).updated_gemspec_content
104
+ end
105
+
106
+ def updated_lockfile_content
107
+ @updated_lockfile_content ||=
108
+ LockfileUpdater.new(
109
+ dependencies: dependencies,
110
+ dependency_files: dependency_files,
111
+ credentials: credentials
112
+ ).updated_lockfile_content
113
+ end
114
+
115
+ def top_level_gemspecs
116
+ dependency_files.select { |f| f.name.match?(%r{^[^/]*\.gemspec$}) }
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end