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,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "nokogiri"
4
+
5
+ require "dependabot/dependency_file"
6
+ require "dependabot/file_updaters/dotnet/nuget"
7
+ require "dependabot/file_parsers/dotnet/nuget/property_value_finder"
8
+
9
+ module Dependabot
10
+ module FileUpdaters
11
+ module Dotnet
12
+ class Nuget
13
+ class PropertyValueUpdater
14
+ def initialize(dependency_files:)
15
+ @dependency_files = dependency_files
16
+ end
17
+
18
+ def update_files_for_property_change(property_name:, updated_value:,
19
+ callsite_file:)
20
+ declaration_details =
21
+ property_value_finder.
22
+ property_details(
23
+ property_name: property_name,
24
+ callsite_file: callsite_file
25
+ )
26
+
27
+ declaration_file = dependency_files.find do |f|
28
+ declaration_details.fetch(:file) == f.name
29
+ end
30
+ node = declaration_details.fetch(:node)
31
+
32
+ updated_content = declaration_file.content.sub(
33
+ %r{<#{Regexp.quote(node.name)}>
34
+ \s*#{Regexp.quote(node.content)}\s*
35
+ </#{Regexp.quote(node.name)}>}xm,
36
+ "<#{node.name}>#{updated_value}</#{node.name}>"
37
+ )
38
+
39
+ files = dependency_files.dup
40
+ files[files.index(declaration_file)] =
41
+ update_file(file: declaration_file, content: updated_content)
42
+ files
43
+ end
44
+
45
+ private
46
+
47
+ attr_reader :dependency_files
48
+
49
+ def property_value_finder
50
+ @property_value_finder ||=
51
+ FileParsers::Dotnet::Nuget::PropertyValueFinder.
52
+ new(dependency_files: dependency_files)
53
+ end
54
+
55
+ def update_file(file:, content:)
56
+ updated_file = file.dup
57
+ updated_file.content = content
58
+ updated_file
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_updaters/base"
4
+ require "dependabot/utils/elixir/version"
5
+ require "dependabot/shared_helpers"
6
+
7
+ module Dependabot
8
+ module FileUpdaters
9
+ module Elixir
10
+ class Hex < Base
11
+ require_relative "hex/mixfile_updater"
12
+ require_relative "hex/lockfile_updater"
13
+
14
+ def self.updated_files_regex
15
+ [
16
+ /^mix\.exs$/,
17
+ /^mix\.lock$/
18
+ ]
19
+ end
20
+
21
+ def updated_dependency_files
22
+ updated_files = []
23
+
24
+ mixfiles.each do |file|
25
+ if file_changed?(file)
26
+ updated_files <<
27
+ updated_file(file: file, content: updated_mixfile_content(file))
28
+ end
29
+ end
30
+
31
+ if lockfile
32
+ updated_files <<
33
+ updated_file(file: lockfile, content: updated_lockfile_content)
34
+ end
35
+
36
+ updated_files
37
+ end
38
+
39
+ private
40
+
41
+ def check_required_files
42
+ raise "No mix.exs!" unless get_original_file("mix.exs")
43
+ end
44
+
45
+ def updated_mixfile_content(file)
46
+ MixfileUpdater.new(
47
+ dependencies: dependencies,
48
+ mixfile: file
49
+ ).updated_mixfile_content
50
+ end
51
+
52
+ def updated_lockfile_content
53
+ @updated_lockfile_content ||=
54
+ LockfileUpdater.new(
55
+ dependencies: dependencies,
56
+ dependency_files: dependency_files,
57
+ credentials: credentials
58
+ ).updated_lockfile_content
59
+ end
60
+
61
+ def mixfiles
62
+ dependency_files.select { |f| f.name.end_with?("mix.exs") }
63
+ end
64
+
65
+ def lockfile
66
+ @lockfile ||= get_original_file("mix.lock")
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,147 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_updaters/elixir/hex"
4
+ require "dependabot/file_updaters/elixir/hex/mixfile_updater"
5
+ require "dependabot/file_updaters/elixir/hex/mixfile_sanitizer"
6
+ require "dependabot/file_updaters/elixir/hex/mixfile_requirement_updater"
7
+ require "dependabot/utils/elixir/version"
8
+ require "dependabot/shared_helpers"
9
+
10
+ module Dependabot
11
+ module FileUpdaters
12
+ module Elixir
13
+ class Hex
14
+ class LockfileUpdater
15
+ def initialize(dependencies:, dependency_files:, credentials:)
16
+ @dependencies = dependencies
17
+ @dependency_files = dependency_files
18
+ @credentials = credentials
19
+ end
20
+
21
+ def updated_lockfile_content
22
+ @updated_lockfile_content ||=
23
+ SharedHelpers.in_a_temporary_directory do
24
+ write_temporary_dependency_files
25
+ FileUtils.cp(elixir_helper_do_update_path, "do_update.exs")
26
+
27
+ SharedHelpers.with_git_configured(credentials: credentials) do
28
+ SharedHelpers.run_helper_subprocess(
29
+ env: mix_env,
30
+ command: "mix run #{elixir_helper_path}",
31
+ function: "get_updated_lockfile",
32
+ args: [Dir.pwd, dependency.name, organization_credentials]
33
+ )
34
+ end
35
+ end
36
+
37
+ post_process_lockfile(@updated_lockfile_content)
38
+ end
39
+
40
+ private
41
+
42
+ attr_reader :dependencies, :dependency_files, :credentials
43
+
44
+ def dependency
45
+ # For now, we'll only ever be updating a single dep for Elixir
46
+ dependencies.first
47
+ end
48
+
49
+ def post_process_lockfile(content)
50
+ return content unless lockfile.content.start_with?("%{\"")
51
+ return content if content.start_with?("%{\"")
52
+
53
+ # Substitute back old file beginning and ending
54
+ content.sub(/\A%\{\n "/, "%{\"").sub(/\},\n\}/, "}}")
55
+ end
56
+
57
+ def write_temporary_dependency_files
58
+ mixfiles.each do |file|
59
+ path = file.name
60
+ FileUtils.mkdir_p(Pathname.new(path).dirname)
61
+ File.write(path, mixfile_content_for_lockfile_generation(file))
62
+ end
63
+
64
+ File.write("mix.lock", lockfile.content)
65
+
66
+ dependency_files.select(&:support_file).each do |file|
67
+ path = file.name
68
+ FileUtils.mkdir_p(Pathname.new(path).dirname)
69
+ File.write(path, file.content)
70
+ end
71
+ end
72
+
73
+ def mixfile_content_for_lockfile_generation(file)
74
+ content = updated_mixfile_content(file)
75
+ content = lock_mixfile_dependency_versions(content, file.name)
76
+ sanitize_mixfile(content)
77
+ end
78
+
79
+ def updated_mixfile_content(file)
80
+ MixfileUpdater.new(
81
+ dependencies: dependencies,
82
+ mixfile: file
83
+ ).updated_mixfile_content
84
+ end
85
+
86
+ def lock_mixfile_dependency_versions(mixfile_content, filename)
87
+ dependencies.
88
+ reduce(mixfile_content.dup) do |content, dep|
89
+ # Run on the updated mixfile content, so we're updating from the
90
+ # updated requirements
91
+ req_details = dep.requirements.find { |r| r[:file] == filename }
92
+
93
+ next content unless req_details
94
+ next content unless Utils::Elixir::Version.correct?(dep.version)
95
+
96
+ MixfileRequirementUpdater.new(
97
+ dependency_name: dep.name,
98
+ mixfile_content: content,
99
+ previous_requirement: req_details.fetch(:requirement),
100
+ updated_requirement: dep.version,
101
+ insert_if_bare: true
102
+ ).updated_content
103
+ end
104
+ end
105
+
106
+ def sanitize_mixfile(content)
107
+ MixfileSanitizer.new(mixfile_content: content).sanitized_content
108
+ end
109
+
110
+ def mix_env
111
+ {
112
+ "MIX_EXS" => File.join(project_root, "helpers/elixir/mix.exs"),
113
+ "MIX_LOCK" => File.join(project_root, "helpers/elixir/mix.lock"),
114
+ "MIX_DEPS" => File.join(project_root, "helpers/elixir/deps"),
115
+ "MIX_QUIET" => "1"
116
+ }
117
+ end
118
+
119
+ def elixir_helper_path
120
+ File.join(project_root, "helpers/elixir/bin/run.exs")
121
+ end
122
+
123
+ def elixir_helper_do_update_path
124
+ File.join(project_root, "helpers/elixir/bin/do_update.exs")
125
+ end
126
+
127
+ def project_root
128
+ File.join(File.dirname(__FILE__), "../../../../..")
129
+ end
130
+
131
+ def mixfiles
132
+ dependency_files.select { |f| f.name.end_with?("mix.exs") }
133
+ end
134
+
135
+ def lockfile
136
+ @lockfile ||= dependency_files.find { |f| f.name == "mix.lock" }
137
+ end
138
+
139
+ def organization_credentials
140
+ credentials.select { |cred| cred["type"] == "hex_organization" }.
141
+ flat_map { |cred| [cred["organization"], cred["token"]] }
142
+ end
143
+ end
144
+ end
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_updaters/elixir/hex"
4
+ require "dependabot/shared_helpers"
5
+
6
+ module Dependabot
7
+ module FileUpdaters
8
+ module Elixir
9
+ class Hex
10
+ class MixfileGitPinUpdater
11
+ def initialize(dependency_name:, mixfile_content:,
12
+ previous_pin:, updated_pin:)
13
+ @dependency_name = dependency_name
14
+ @mixfile_content = mixfile_content
15
+ @previous_pin = previous_pin
16
+ @updated_pin = updated_pin
17
+ end
18
+
19
+ def updated_content
20
+ updated_content = update_pin(mixfile_content)
21
+
22
+ if content_should_change? && mixfile_content == updated_content
23
+ raise "Expected content to change!"
24
+ end
25
+
26
+ updated_content
27
+ end
28
+
29
+ private
30
+
31
+ attr_reader :dependency_name, :mixfile_content,
32
+ :previous_pin, :updated_pin
33
+
34
+ def update_pin(content)
35
+ requirement_line_regex =
36
+ /
37
+ \{\s*:#{Regexp.escape(dependency_name)},[^\}]*
38
+ (?:ref|tag):\s+["']#{Regexp.escape(previous_pin)}["']
39
+ /mx
40
+
41
+ content.gsub(requirement_line_regex) do |requirement_line|
42
+ requirement_line.gsub(previous_pin, updated_pin)
43
+ end
44
+ end
45
+
46
+ def content_should_change?
47
+ previous_pin == updated_pin
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_updaters/elixir/hex"
4
+ require "dependabot/shared_helpers"
5
+
6
+ module Dependabot
7
+ module FileUpdaters
8
+ module Elixir
9
+ class Hex
10
+ class MixfileRequirementUpdater
11
+ def initialize(dependency_name:, mixfile_content:,
12
+ previous_requirement:, updated_requirement:,
13
+ insert_if_bare: false)
14
+ @dependency_name = dependency_name
15
+ @mixfile_content = mixfile_content
16
+ @previous_requirement = previous_requirement
17
+ @updated_requirement = updated_requirement
18
+ @insert_if_bare = insert_if_bare
19
+ end
20
+
21
+ def updated_content
22
+ updated_content = update_requirement(mixfile_content)
23
+
24
+ if content_should_change? && mixfile_content == updated_content
25
+ raise "Expected content to change!"
26
+ end
27
+
28
+ updated_content
29
+ end
30
+
31
+ private
32
+
33
+ attr_reader :dependency_name, :mixfile_content,
34
+ :previous_requirement, :updated_requirement
35
+
36
+ def insert_if_bare?
37
+ !@insert_if_bare.nil?
38
+ end
39
+
40
+ def update_requirement(content)
41
+ return content if previous_requirement.nil? && !insert_if_bare?
42
+
43
+ requirement_line_regex =
44
+ if previous_requirement
45
+ /
46
+ :#{Regexp.escape(dependency_name)},.*
47
+ #{Regexp.escape(previous_requirement)}
48
+ /x
49
+ else
50
+ /:#{Regexp.escape(dependency_name)}(,|\s|\})/
51
+ end
52
+
53
+ content.gsub(requirement_line_regex) do |requirement_line|
54
+ if previous_requirement
55
+ requirement_line.gsub(previous_requirement, updated_requirement)
56
+ else
57
+ requirement_line.gsub(
58
+ ":#{dependency_name}",
59
+ ":#{dependency_name}, \"#{updated_requirement}\""
60
+ )
61
+ end
62
+ end
63
+ end
64
+
65
+ def content_should_change?
66
+ return false if previous_requirement == updated_requirement
67
+
68
+ previous_requirement || insert_if_bare?
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_updaters/elixir/hex"
4
+ require "dependabot/shared_helpers"
5
+
6
+ module Dependabot
7
+ module FileUpdaters
8
+ module Elixir
9
+ class Hex
10
+ class MixfileSanitizer
11
+ def initialize(mixfile_content:)
12
+ @mixfile_content = mixfile_content
13
+ end
14
+
15
+ def sanitized_content
16
+ mixfile_content.
17
+ gsub(/File\.read!\(.*?\)/, '"0.0.1"').
18
+ gsub(/File\.read\(.*?\)/, '{:ok, "0.0.1"}')
19
+ end
20
+
21
+ private
22
+
23
+ attr_reader :mixfile_content
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_updaters/elixir/hex"
4
+ require "dependabot/file_updaters/elixir/hex/mixfile_requirement_updater"
5
+ require "dependabot/file_updaters/elixir/hex/mixfile_git_pin_updater"
6
+
7
+ module Dependabot
8
+ module FileUpdaters
9
+ module Elixir
10
+ class Hex
11
+ class MixfileUpdater
12
+ def initialize(mixfile:, dependencies:)
13
+ @mixfile = mixfile
14
+ @dependencies = dependencies
15
+ end
16
+
17
+ def updated_mixfile_content
18
+ dependencies.
19
+ select { |dep| requirement_changed?(mixfile, dep) }.
20
+ reduce(mixfile.content.dup) do |content, dep|
21
+ updated_content = content
22
+
23
+ updated_content = update_requirement(
24
+ content: updated_content,
25
+ filename: mixfile.name,
26
+ dependency: dep
27
+ )
28
+
29
+ updated_content = update_git_pin(
30
+ content: updated_content,
31
+ filename: mixfile.name,
32
+ dependency: dep
33
+ )
34
+
35
+ if content == updated_content
36
+ raise "Expected content to change!"
37
+ end
38
+
39
+ updated_content
40
+ end
41
+ end
42
+
43
+ private
44
+
45
+ attr_reader :mixfile, :dependencies
46
+
47
+ def requirement_changed?(file, dependency)
48
+ changed_requirements =
49
+ dependency.requirements - dependency.previous_requirements
50
+
51
+ changed_requirements.any? { |f| f[:file] == file.name }
52
+ end
53
+
54
+ def update_requirement(content:, filename:, dependency:)
55
+ updated_req =
56
+ dependency.requirements.find { |r| r[:file] == filename }.
57
+ fetch(:requirement)
58
+
59
+ old_req =
60
+ dependency.previous_requirements.
61
+ find { |r| r[:file] == filename }.
62
+ fetch(:requirement)
63
+
64
+ return content unless old_req
65
+
66
+ MixfileRequirementUpdater.new(
67
+ dependency_name: dependency.name,
68
+ mixfile_content: content,
69
+ previous_requirement: old_req,
70
+ updated_requirement: updated_req
71
+ ).updated_content
72
+ end
73
+
74
+ def update_git_pin(content:, filename:, dependency:)
75
+ updated_pin =
76
+ dependency.requirements.find { |r| r[:file] == filename }&.
77
+ dig(:source, :ref)
78
+
79
+ old_pin =
80
+ dependency.previous_requirements.
81
+ find { |r| r[:file] == filename }&.
82
+ dig(:source, :ref)
83
+
84
+ return content unless old_pin
85
+ return content if old_pin == updated_pin
86
+
87
+ MixfileGitPinUpdater.new(
88
+ dependency_name: dependency.name,
89
+ mixfile_content: content,
90
+ previous_pin: old_pin,
91
+ updated_pin: updated_pin
92
+ ).updated_content
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end