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,236 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/dependency"
4
+ require "dependabot/file_parsers/base"
5
+ require "dependabot/shared_helpers"
6
+
7
+ # The best Gradle documentation is at:
8
+ # - https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.dsl.
9
+ # DependencyHandler.html
10
+ module Dependabot
11
+ module FileParsers
12
+ module Java
13
+ class Gradle < Dependabot::FileParsers::Base
14
+ require "dependabot/file_parsers/base/dependency_set"
15
+ require_relative "gradle/property_value_finder"
16
+
17
+ PROPERTY_REGEX =
18
+ /
19
+ (?:\$\{property\((?<property_name>[^:\s]*?)\)\})|
20
+ (?:\$\{(?<property_name>[^:\s]*?)\})|
21
+ (?:\$(?<property_name>[^:\s]*))
22
+ /x.freeze
23
+
24
+ PART = %r{[^\s,@'":/\\]+}.freeze
25
+ VSN_PART = %r{[^\s,'":/\\]+}.freeze
26
+ DEPENDENCY_DECLARATION_REGEX =
27
+ /(?:\(|\s)\s*['"](?<declaration>#{PART}:#{PART}:#{VSN_PART})['"]/.
28
+ freeze
29
+ DEPENDENCY_SET_DECLARATION_REGEX =
30
+ /(?:^|\s)dependencySet\((?<arguments>[^\)]+)\)\s*\{/.freeze
31
+ DEPENDENCY_SET_ENTRY_REGEX = /entry\s+['"](?<name>#{PART})['"]/.freeze
32
+
33
+ def parse
34
+ dependency_set = DependencySet.new
35
+ buildfiles.each do |buildfile|
36
+ dependency_set += buildfile_dependencies(buildfile)
37
+ end
38
+ dependency_set.dependencies
39
+ end
40
+
41
+ private
42
+
43
+ def map_value_regex(key)
44
+ /(?:^|\s|,|\()#{Regexp.quote(key)}:\s*['"](?<value>[^'"]+)['"]/
45
+ end
46
+
47
+ def buildfile_dependencies(buildfile)
48
+ dependency_set = DependencySet.new
49
+
50
+ dependency_set += shortform_buildfile_dependencies(buildfile)
51
+ dependency_set += keyword_arg_buildfile_dependencies(buildfile)
52
+ dependency_set += dependency_set_dependencies(buildfile)
53
+
54
+ dependency_set
55
+ end
56
+
57
+ def shortform_buildfile_dependencies(buildfile)
58
+ dependency_set = DependencySet.new
59
+
60
+ prepared_content(buildfile).scan(DEPENDENCY_DECLARATION_REGEX) do
61
+ declaration = Regexp.last_match.named_captures.fetch("declaration")
62
+
63
+ group, name, version = declaration.split(":")
64
+ details = { group: group, name: name, version: version }
65
+
66
+ dep = dependency_from(details_hash: details, buildfile: buildfile)
67
+ dependency_set << dep if dep
68
+ end
69
+
70
+ dependency_set
71
+ end
72
+
73
+ def keyword_arg_buildfile_dependencies(buildfile)
74
+ dependency_set = DependencySet.new
75
+
76
+ prepared_content(buildfile).lines.each do |line|
77
+ name = argument_from_string(line, "name")
78
+ group = argument_from_string(line, "group")
79
+ version = argument_from_string(line, "version")
80
+ next unless name && group && version
81
+
82
+ details = { name: name, group: group, version: version }
83
+
84
+ dep = dependency_from(details_hash: details, buildfile: buildfile)
85
+ dependency_set << dep if dep
86
+ end
87
+
88
+ dependency_set
89
+ end
90
+
91
+ def dependency_set_dependencies(buildfile)
92
+ dependency_set = DependencySet.new
93
+
94
+ dependency_set_blocks = []
95
+
96
+ prepared_content(buildfile).scan(DEPENDENCY_SET_DECLARATION_REGEX) do
97
+ mch = Regexp.last_match
98
+ dependency_set_blocks <<
99
+ {
100
+ arguments: mch.named_captures.fetch("arguments"),
101
+ block: mch.post_match[0..closing_bracket_index(mch.post_match)]
102
+ }
103
+ end
104
+
105
+ dependency_set_blocks.each do |blk|
106
+ group = argument_from_string(blk[:arguments], "group")
107
+ version = argument_from_string(blk[:arguments], "version")
108
+
109
+ next unless group && version
110
+
111
+ blk[:block].scan(DEPENDENCY_SET_ENTRY_REGEX).flatten.each do |name|
112
+ dep = dependency_from(
113
+ details_hash: { group: group, name: name, version: version },
114
+ buildfile: buildfile,
115
+ in_dependency_set: true
116
+ )
117
+ dependency_set << dep if dep
118
+ end
119
+ end
120
+
121
+ dependency_set
122
+ end
123
+
124
+ def argument_from_string(string, arg_name)
125
+ string.
126
+ match(map_value_regex(arg_name))&.
127
+ named_captures&.
128
+ fetch("value")
129
+ end
130
+
131
+ def dependency_from(details_hash:, buildfile:, in_dependency_set: false)
132
+ group = evaluated_value(details_hash[:group], buildfile)
133
+ name = evaluated_value(details_hash[:name], buildfile)
134
+ version = evaluated_value(details_hash[:version], buildfile)
135
+
136
+ dependency_name = "#{group}:#{name}"
137
+
138
+ # If we can't evaluate a property they we won't be able to
139
+ # update this dependency
140
+ return if "#{dependency_name}:#{version}".match?(PROPERTY_REGEX)
141
+
142
+ Dependency.new(
143
+ name: dependency_name,
144
+ version: version,
145
+ requirements: [{
146
+ requirement: version,
147
+ file: buildfile.name,
148
+ source: nil,
149
+ groups: [],
150
+ metadata: dependency_metadata(details_hash, in_dependency_set)
151
+ }],
152
+ package_manager: "gradle"
153
+ )
154
+ end
155
+
156
+ def dependency_metadata(details_hash, in_dependency_set)
157
+ version_property_name =
158
+ details_hash[:version].
159
+ match(PROPERTY_REGEX)&.
160
+ named_captures&.fetch("property_name")
161
+
162
+ return unless version_property_name || in_dependency_set
163
+
164
+ metadata = {}
165
+ if version_property_name
166
+ metadata[:property_name] = version_property_name
167
+ end
168
+ if in_dependency_set
169
+ metadata[:dependency_set] = {
170
+ group: details_hash[:group],
171
+ version: details_hash[:version]
172
+ }
173
+ end
174
+ metadata
175
+ end
176
+
177
+ def evaluated_value(value, buildfile)
178
+ return value unless value.match?(PROPERTY_REGEX)
179
+
180
+ property_name = value.match(PROPERTY_REGEX).
181
+ named_captures.fetch("property_name")
182
+ property_value = property_value_finder.property_value(
183
+ property_name: property_name,
184
+ callsite_buildfile: buildfile
185
+ )
186
+
187
+ return value unless property_value
188
+
189
+ value.gsub(PROPERTY_REGEX, property_value)
190
+ end
191
+
192
+ def property_value_finder
193
+ @property_value_finder ||=
194
+ PropertyValueFinder.new(dependency_files: dependency_files)
195
+ end
196
+
197
+ def prepared_content(buildfile)
198
+ # Remove any comments
199
+ prepared_content =
200
+ buildfile.content.
201
+ gsub(%r{(?<=^|\s)//.*$}, "\n").
202
+ gsub(%r{(?<=^|\s)/\*.*?\*/}m, "")
203
+
204
+ # Remove the dependencyVerification section added by Gradle Witness
205
+ # (TODO: Support updating this in the FileUpdater)
206
+ prepared_content.dup.scan(/dependencyVerification\s*{/) do
207
+ mtch = Regexp.last_match
208
+ block = mtch.post_match[0..closing_bracket_index(mtch.post_match)]
209
+ prepared_content.gsub!(block, "")
210
+ end
211
+
212
+ prepared_content
213
+ end
214
+
215
+ def closing_bracket_index(string)
216
+ closes_required = 1
217
+
218
+ string.chars.each_with_index do |char, index|
219
+ closes_required += 1 if char == "{"
220
+ closes_required -= 1 if char == "}"
221
+ return index if closes_required.zero?
222
+ end
223
+ end
224
+
225
+ def buildfiles
226
+ @buildfiles ||=
227
+ dependency_files.select { |f| f.name.end_with?("build.gradle") }
228
+ end
229
+
230
+ def check_required_files
231
+ raise "No build.gradle!" unless get_original_file("build.gradle")
232
+ end
233
+ end
234
+ end
235
+ end
236
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_parsers/java/gradle"
4
+
5
+ module Dependabot
6
+ module FileParsers
7
+ module Java
8
+ class Gradle
9
+ class PropertyValueFinder
10
+ PROPERTY_DECLARATION_REGEX =
11
+ /(?:^|\s+|ext.)(?<name>[^\s=]+)\s*=\s*['"](?<value>[^\s]+)['"]/.
12
+ freeze
13
+
14
+ def initialize(dependency_files:)
15
+ @dependency_files = dependency_files
16
+ end
17
+
18
+ def property_details(property_name:, callsite_buildfile:)
19
+ # If the root project was specified, just look in the top-level
20
+ # buildfile
21
+ if property_name.start_with?("rootProject.")
22
+ property_name = property_name.sub("rootProject.", "")
23
+ return properties(top_level_buildfile).fetch(property_name, nil)
24
+ end
25
+
26
+ # If this project was specified strip the specifier
27
+ if property_name.start_with?("project.")
28
+ property_name = property_name.sub("project.", "")
29
+ end
30
+
31
+ # If a `properties` prefix was specified strip that out, too
32
+ if property_name.start_with?("properties.")
33
+ property_name = property_name.sub("properties.", "")
34
+ end
35
+
36
+ # Look for a property in the callsite buildfile. If that fails, look
37
+ # for the property in the top-level buildfile
38
+ if properties(callsite_buildfile).fetch(property_name, nil)
39
+ return properties(callsite_buildfile).fetch(property_name)
40
+ end
41
+
42
+ properties(top_level_buildfile).fetch(property_name, nil)
43
+ end
44
+
45
+ def property_value(property_name:, callsite_buildfile:)
46
+ property_details(
47
+ property_name: property_name,
48
+ callsite_buildfile: callsite_buildfile
49
+ )&.fetch(:value)
50
+ end
51
+
52
+ private
53
+
54
+ attr_reader :dependency_files
55
+
56
+ def properties(buildfile)
57
+ @properties ||= {}
58
+ return @properties[buildfile.name] if @properties[buildfile.name]
59
+
60
+ @properties[buildfile.name] = {}
61
+ prepared_content(buildfile).scan(PROPERTY_DECLARATION_REGEX) do
62
+ declaration_string = Regexp.last_match.to_s.strip
63
+ captures = Regexp.last_match.named_captures
64
+ name = captures.fetch("name").sub(/^ext\./, "")
65
+ @properties[buildfile.name][name] = {
66
+ value: captures.fetch("value"),
67
+ declaration_string: declaration_string,
68
+ file: buildfile.name
69
+ }
70
+ end
71
+
72
+ @properties[buildfile.name]
73
+ end
74
+
75
+ def prepared_content(buildfile)
76
+ # Remove any comments
77
+ buildfile.content.
78
+ gsub(%r{(?<=^|\s)//.*$}, "\n").
79
+ gsub(%r{(?<=^|\s)/\*.*?\*/}m, "")
80
+ end
81
+
82
+ def top_level_buildfile
83
+ @top_level_buildfile ||=
84
+ dependency_files.find { |f| f.name == "build.gradle" }
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,145 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_parsers/java/gradle"
4
+
5
+ module Dependabot
6
+ module FileParsers
7
+ module Java
8
+ class Gradle
9
+ class RepositoriesFinder
10
+ # The Central Repo doesn't have special status for Gradle, but until
11
+ # we're confident we're selecting repos correctly it's wise to include
12
+ # it as a default.
13
+ CENTRAL_REPO_URL = "https://repo.maven.apache.org/maven2"
14
+
15
+ REPOSITORIES_BLOCK_START = /(?:^|\s)repositories\s*\{/.freeze
16
+ MAVEN_REPO_REGEX =
17
+ /maven\s*\{[^\}]*\surl[\s\(]\s*['"](?<url>[^'"]+)['"]/.freeze
18
+
19
+ def initialize(dependency_files:, target_dependency_file:)
20
+ @dependency_files = dependency_files
21
+ @target_dependency_file = target_dependency_file
22
+ raise "No target file!" unless target_dependency_file
23
+ end
24
+
25
+ def repository_urls
26
+ repository_urls = []
27
+ repository_urls += inherited_repository_urls
28
+ repository_urls += own_buildfile_repository_urls
29
+ repository_urls = repository_urls.uniq
30
+
31
+ return repository_urls unless repository_urls.empty?
32
+
33
+ [CENTRAL_REPO_URL]
34
+ end
35
+
36
+ private
37
+
38
+ attr_reader :dependency_files, :target_dependency_file
39
+
40
+ def inherited_repository_urls
41
+ return [] unless top_level_buildfile
42
+
43
+ buildfile_content = comment_free_content(top_level_buildfile)
44
+ subproject_blocks = []
45
+
46
+ buildfile_content.scan(/(?:^|\s)allprojects\s*\{/) do
47
+ mtch = Regexp.last_match
48
+ subproject_blocks <<
49
+ mtch.post_match[0..closing_bracket_index(mtch.post_match)]
50
+ end
51
+
52
+ if top_level_buildfile != target_dependency_file
53
+ buildfile_content.scan(/(?:^|\s)subprojects\s*\{/) do
54
+ mtch = Regexp.last_match
55
+ subproject_blocks <<
56
+ mtch.post_match[0..closing_bracket_index(mtch.post_match)]
57
+ end
58
+ end
59
+
60
+ repository_urls_from(subproject_blocks.join("\n"))
61
+ end
62
+
63
+ def own_buildfile_repository_urls
64
+ buildfile_content = comment_free_content(target_dependency_file)
65
+
66
+ buildfile_content.dup.scan(/(?:^|\s)subprojects\s*\{/) do
67
+ mtch = Regexp.last_match
68
+ buildfile_content.gsub!(
69
+ mtch.post_match[0..closing_bracket_index(mtch.post_match)],
70
+ ""
71
+ )
72
+ end
73
+
74
+ repository_urls_from(buildfile_content)
75
+ end
76
+
77
+ def repository_urls_from(buildfile_content)
78
+ repository_urls = []
79
+
80
+ repository_blocks = []
81
+ buildfile_content.scan(REPOSITORIES_BLOCK_START) do
82
+ mtch = Regexp.last_match
83
+ repository_blocks <<
84
+ mtch.post_match[0..closing_bracket_index(mtch.post_match)]
85
+ end
86
+
87
+ repository_blocks.each do |block|
88
+ if block.include?(" google(")
89
+ repository_urls << "https://maven.google.com/"
90
+ end
91
+
92
+ if block.include?(" mavenCentral(")
93
+ repository_urls << "https://repo.maven.apache.org/maven2/"
94
+ end
95
+
96
+ if block.include?(" jcenter(")
97
+ repository_urls << "https://jcenter.bintray.com/"
98
+ end
99
+
100
+ block.scan(MAVEN_REPO_REGEX) do
101
+ repository_urls << Regexp.last_match.named_captures.fetch("url")
102
+ end
103
+ end
104
+
105
+ repository_urls.
106
+ map { |url| url.strip.gsub(%r{/$}, "") }.
107
+ select { |url| valid_url?(url) }.
108
+ uniq
109
+ end
110
+
111
+ def closing_bracket_index(string)
112
+ closes_required = 1
113
+
114
+ string.chars.each_with_index do |char, index|
115
+ closes_required += 1 if char == "{"
116
+ closes_required -= 1 if char == "}"
117
+ return index if closes_required.zero?
118
+ end
119
+ end
120
+
121
+ def valid_url?(url)
122
+ # Reject non-http URLs because they're probably parsing mistakes
123
+ return false unless url.start_with?("http")
124
+
125
+ URI.parse(url)
126
+ true
127
+ rescue URI::InvalidURIError
128
+ false
129
+ end
130
+
131
+ def comment_free_content(buildfile)
132
+ buildfile.content.
133
+ gsub(%r{(?<=^|\s)//.*$}, "\n").
134
+ gsub(%r{(?<=^|\s)/\*.*?\*/}m, "")
135
+ end
136
+
137
+ def top_level_buildfile
138
+ @top_level_buildfile ||=
139
+ dependency_files.find { |f| f.name == "build.gradle" }
140
+ end
141
+ end
142
+ end
143
+ end
144
+ end
145
+ end