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,152 @@
1
+ # frozen_string_literal: true
2
+
3
+ ################################################################################
4
+ # For more details on Go version constraints, see: #
5
+ # - https://github.com/Masterminds/semver #
6
+ # - https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md #
7
+ ################################################################################
8
+
9
+ require "dependabot/utils/go/version"
10
+
11
+ module Dependabot
12
+ module Utils
13
+ module Go
14
+ class Requirement < Gem::Requirement
15
+ WILDCARD_REGEX = /(?:\.|^)[xX*]/.freeze
16
+ OR_SEPARATOR = /(?<=[a-zA-Z0-9*])\s*\|{2}/.freeze
17
+
18
+ # Override the version pattern to allow a 'v' prefix
19
+ quoted = OPS.keys.map { |k| Regexp.quote(k) }.join("|")
20
+ version_pattern = "v?#{Utils::Go::Version::VERSION_PATTERN}"
21
+
22
+ PATTERN_RAW = "\\s*(#{quoted})?\\s*(#{version_pattern})\\s*"
23
+ PATTERN = /\A#{PATTERN_RAW}\z/.freeze
24
+
25
+ # Use Utils::Go::Version rather than Gem::Version to ensure that
26
+ # pre-release versions aren't transformed.
27
+ def self.parse(obj)
28
+ if obj.is_a?(Gem::Version)
29
+ return ["=", Utils::Go::Version.new(obj.to_s)]
30
+ end
31
+
32
+ unless (matches = PATTERN.match(obj.to_s))
33
+ msg = "Illformed requirement [#{obj.inspect}]"
34
+ raise BadRequirementError, msg
35
+ end
36
+
37
+ return DefaultRequirement if matches[1] == ">=" && matches[2] == "0"
38
+
39
+ [matches[1] || "=", Utils::Go::Version.new(matches[2])]
40
+ end
41
+
42
+ # Returns an array of requirements. At least one requirement from the
43
+ # returned array must be satisfied for a version to be valid.
44
+ def self.requirements_array(requirement_string)
45
+ return [new(nil)] if requirement_string.nil?
46
+
47
+ requirement_string.strip.split(OR_SEPARATOR).map do |req_string|
48
+ new(req_string)
49
+ end
50
+ end
51
+
52
+ def initialize(*requirements)
53
+ requirements = requirements.flatten.flat_map do |req_string|
54
+ req_string.split(",").map do |r|
55
+ convert_go_constraint_to_ruby_constraint(r.strip)
56
+ end
57
+ end
58
+
59
+ super(requirements)
60
+ end
61
+
62
+ private
63
+
64
+ def convert_go_constraint_to_ruby_constraint(req_string)
65
+ req_string = req_string
66
+ req_string = convert_wildcard_characters(req_string)
67
+
68
+ if req_string.match?(WILDCARD_REGEX)
69
+ ruby_range(req_string.gsub(WILDCARD_REGEX, "").gsub(/^[^\d]/, ""))
70
+ elsif req_string.match?(/^~[^>]/) then convert_tilde_req(req_string)
71
+ elsif req_string.include?(" - ") then convert_hyphen_req(req_string)
72
+ elsif req_string.match?(/^[\dv^]/) then convert_caret_req(req_string)
73
+ elsif req_string.match?(/[<=>]/) then req_string
74
+ else ruby_range(req_string)
75
+ end
76
+ end
77
+
78
+ def convert_wildcard_characters(req_string)
79
+ if req_string.match?(/^[\dv^>~]/)
80
+ replace_wildcard_in_lower_bound(req_string)
81
+ elsif req_string.start_with?("<")
82
+ parts = req_string.split(".")
83
+ parts.map.with_index do |part, index|
84
+ next "0" if part.match?(WILDCARD_REGEX)
85
+ next part.to_i + 1 if parts[index + 1]&.match?(WILDCARD_REGEX)
86
+
87
+ part
88
+ end.join(".")
89
+ else
90
+ req_string
91
+ end
92
+ end
93
+
94
+ def replace_wildcard_in_lower_bound(req_string)
95
+ after_wildcard = false
96
+
97
+ if req_string.start_with?("~")
98
+ req_string = req_string.gsub(/(?:(?:\.|^)[xX*])(\.[xX*])+/, "")
99
+ end
100
+
101
+ req_string.split(".").
102
+ map do |part|
103
+ part.split("-").map.with_index do |p, i|
104
+ # Before we hit a wildcard we just return the existing part
105
+ next p unless p.match?(WILDCARD_REGEX) || after_wildcard
106
+
107
+ # On or after a wildcard we replace the version part with zero
108
+ after_wildcard = true
109
+ i.zero? ? "0" : "a"
110
+ end.join("-")
111
+ end.join(".")
112
+ end
113
+
114
+ def convert_tilde_req(req_string)
115
+ version = req_string.gsub(/^~/, "")
116
+ parts = version.split(".")
117
+ parts << "0" if parts.count < 3
118
+ "~> #{parts.join('.')}"
119
+ end
120
+
121
+ def convert_hyphen_req(req_string)
122
+ lower_bound, upper_bound = req_string.split(/\s+-\s+/)
123
+ [">= #{lower_bound}", "<= #{upper_bound}"]
124
+ end
125
+
126
+ def ruby_range(req_string)
127
+ parts = req_string.split(".")
128
+
129
+ # If we have three or more parts then this is an exact match
130
+ return req_string if parts.count >= 3
131
+
132
+ # If we have no parts then the version is completely unlocked
133
+ return ">= 0" if parts.count.zero?
134
+
135
+ # If we have fewer than three parts we do a partial match
136
+ parts << "0"
137
+ "~> #{parts.join('.')}"
138
+ end
139
+
140
+ # Note: Dep's caret notation implementation doesn't distinguish between
141
+ # pre and post-1.0.0 requirements (unlike in JS)
142
+ def convert_caret_req(req_string)
143
+ version = req_string.gsub(/^\^?v?/, "")
144
+ parts = version.split(".")
145
+ upper_bound = [parts.first.to_i + 1, 0, 0, "a"].map(&:to_s).join(".")
146
+
147
+ [">= #{version}", "< #{upper_bound}"]
148
+ end
149
+ end
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dependabot
4
+ module Utils
5
+ module Go
6
+ module SharedHelper
7
+ def self.path
8
+ project_root = File.join(File.dirname(__FILE__), "../../../..")
9
+ platform =
10
+ case RbConfig::CONFIG["arch"]
11
+ when /linux/ then "linux"
12
+ when /darwin/ then "darwin"
13
+ else raise "Invalid platform #{RbConfig::CONFIG['arch']}"
14
+ end
15
+ File.join(project_root, "helpers/go/go-helpers.#{platform}64")
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Go pre-release versions use 1.0.1-rc1 syntax, which Gem::Version
4
+ # converts into 1.0.1.pre.rc1. We override the `to_s` method to stop that
5
+ # alteration.
6
+ # Best docs are at https://github.com/Masterminds/semver
7
+
8
+ module Dependabot
9
+ module Utils
10
+ module Go
11
+ class Version < Gem::Version
12
+ VERSION_PATTERN = '[0-9]+[0-9a-zA-Z]*(?>\.[0-9a-zA-Z]+)*' \
13
+ '(-[0-9A-Za-z-]+(\.[0-9a-zA-Z-]+)*)?' \
14
+ '(\+incompatible)?'
15
+ ANCHORED_VERSION_PATTERN = /\A\s*(#{VERSION_PATTERN})?\s*\z/.freeze
16
+
17
+ def self.correct?(version)
18
+ version = version.gsub(/^v/, "") if version.is_a?(String)
19
+ version = version&.to_s&.split("+")&.first
20
+ super(version)
21
+ end
22
+
23
+ def initialize(version)
24
+ @version_string = version.to_s.gsub(/^v/, "")
25
+ version = version.gsub(/^v/, "") if version.is_a?(String)
26
+ version = version&.to_s&.split("+")&.first
27
+ super
28
+ end
29
+
30
+ def inspect # :nodoc:
31
+ "#<#{self.class} #{@version_string.inspect}>"
32
+ end
33
+
34
+ def to_s
35
+ @version_string
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,110 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/utils/java/version"
4
+
5
+ module Dependabot
6
+ module Utils
7
+ module Java
8
+ class Requirement < Gem::Requirement
9
+ quoted = OPS.keys.map { |k| Regexp.quote k }.join("|")
10
+ PATTERN_RAW =
11
+ "\\s*(#{quoted})?\\s*(#{Utils::Java::Version::VERSION_PATTERN})\\s*"
12
+ PATTERN = /\A#{PATTERN_RAW}\z/.freeze
13
+
14
+ def self.parse(obj)
15
+ if obj.is_a?(Gem::Version)
16
+ return ["=", Utils::Java::Version.new(obj.to_s)]
17
+ end
18
+
19
+ unless (matches = PATTERN.match(obj.to_s))
20
+ msg = "Illformed requirement [#{obj.inspect}]"
21
+ raise BadRequirementError, msg
22
+ end
23
+
24
+ return DefaultRequirement if matches[1] == ">=" && matches[2] == "0"
25
+
26
+ [matches[1] || "=", Utils::Java::Version.new(matches[2])]
27
+ end
28
+
29
+ def self.requirements_array(requirement_string)
30
+ split_java_requirement(requirement_string).map do |str|
31
+ new(str)
32
+ end
33
+ end
34
+
35
+ def initialize(*requirements)
36
+ requirements = requirements.flatten.flat_map do |req_string|
37
+ convert_java_constraint_to_ruby_constraint(req_string)
38
+ end
39
+
40
+ super(requirements)
41
+ end
42
+
43
+ def satisfied_by?(version)
44
+ version = Utils::Java::Version.new(version.to_s)
45
+ super
46
+ end
47
+
48
+ private
49
+
50
+ def self.split_java_requirement(req_string)
51
+ req_string.split(/(?<=\]|\)),/).flat_map do |str|
52
+ next str if str.start_with?("(", "[")
53
+
54
+ exacts, *rest = str.split(/,(?=\[|\()/)
55
+ [*exacts.split(","), *rest]
56
+ end
57
+ end
58
+ private_class_method :split_java_requirement
59
+
60
+ def convert_java_constraint_to_ruby_constraint(req_string)
61
+ return unless req_string
62
+
63
+ if self.class.send(:split_java_requirement, req_string).count > 1
64
+ raise "Can't convert multiple Java reqs to a single Ruby one"
65
+ end
66
+
67
+ if req_string&.include?(",")
68
+ return convert_java_range_to_ruby_range(req_string)
69
+ end
70
+
71
+ convert_java_equals_req_to_ruby(req_string)
72
+ end
73
+
74
+ def convert_java_range_to_ruby_range(req_string)
75
+ lower_b, upper_b = req_string.split(",").map(&:strip)
76
+
77
+ lower_b =
78
+ if ["(", "["].include?(lower_b) then nil
79
+ elsif lower_b.start_with?("(") then "> #{lower_b.sub(/\(\s*/, '')}"
80
+ else ">= #{lower_b.sub(/\[\s*/, '').strip}"
81
+ end
82
+
83
+ upper_b =
84
+ if [")", "]"].include?(upper_b) then nil
85
+ elsif upper_b.end_with?(")") then "< #{upper_b.sub(/\s*\)/, '')}"
86
+ else "<= #{upper_b.sub(/\s*\]/, '').strip}"
87
+ end
88
+
89
+ [lower_b, upper_b].compact
90
+ end
91
+
92
+ def convert_java_equals_req_to_ruby(req_string)
93
+ return convert_wildcard_req(req_string) if req_string&.include?("+")
94
+
95
+ # If a soft requirement is being used, treat it as an equality matcher
96
+ return req_string unless req_string&.start_with?("[")
97
+
98
+ req_string.gsub(/[\[\]\(\)]/, "")
99
+ end
100
+
101
+ def convert_wildcard_req(req_string)
102
+ version = req_string.gsub(/(?:\.|^)\+/, "")
103
+ return ">= 0" if version.empty?
104
+
105
+ "~> #{version}.0"
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,179 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Java versions use dots and dashes when tokenising their versions.
4
+ # Gem::Version converts a "-" to ".pre.", so we override the `to_s` method.
5
+ #
6
+ # See https://maven.apache.org/pom.html#Version_Order_Specification for details.
7
+
8
+ module Dependabot
9
+ module Utils
10
+ module Java
11
+ class Version < Gem::Version
12
+ NULL_VALUES = %w(0 final ga).freeze
13
+ PREFIXED_TOKEN_HIERARCHY = {
14
+ "." => { qualifier: 1, number: 4 },
15
+ "-" => { qualifier: 2, number: 3 }
16
+ }.freeze
17
+ NAMED_QUALIFIERS_HIERARCHY = {
18
+ "a" => 1, "alpha" => 1,
19
+ "b" => 2, "beta" => 2,
20
+ "m" => 3, "milestone" => 3,
21
+ "rc" => 4, "cr" => 4,
22
+ "snapshot" => 5,
23
+ "ga" => 6, "" => 6, "final" => 6,
24
+ "sp" => 7
25
+ }.freeze
26
+ VERSION_PATTERN =
27
+ '[0-9a-zA-Z]+(?>\.[0-9a-zA-Z]*)*(-[0-9A-Za-z-]*(\.[0-9A-Za-z-]*)*)?'
28
+ ANCHORED_VERSION_PATTERN = /\A\s*(#{VERSION_PATTERN})?\s*\z/.freeze
29
+
30
+ def self.correct?(version)
31
+ return false if version.nil?
32
+
33
+ version.to_s.match?(ANCHORED_VERSION_PATTERN)
34
+ end
35
+
36
+ def initialize(version)
37
+ @version_string = version.to_s
38
+ super(version.to_s.tr("_", "-"))
39
+ end
40
+
41
+ def to_s
42
+ @version_string
43
+ end
44
+
45
+ def prerelease?
46
+ tokens.any? do |token|
47
+ next false unless NAMED_QUALIFIERS_HIERARCHY[token]
48
+
49
+ NAMED_QUALIFIERS_HIERARCHY[token] < 6
50
+ end
51
+ end
52
+
53
+ private
54
+
55
+ def tokens
56
+ @tokens ||=
57
+ begin
58
+ version = @version_string.to_s.downcase
59
+ version = fill_tokens(version)
60
+ version = trim_version(version)
61
+ split_into_prefixed_tokens(version).map { |t| t[1..-1] }
62
+ end
63
+ end
64
+
65
+ def <=>(other)
66
+ version = stringify_version(@version_string)
67
+ version = fill_tokens(version)
68
+ version = trim_version(version)
69
+
70
+ other_version = stringify_version(other)
71
+ other_version = fill_tokens(other_version)
72
+ other_version = trim_version(other_version)
73
+
74
+ version, other_version = convert_dates(version, other_version)
75
+
76
+ prefixed_tokens = split_into_prefixed_tokens(version)
77
+ other_prefixed_tokens = split_into_prefixed_tokens(other_version)
78
+
79
+ prefixed_tokens, other_prefixed_tokens =
80
+ pad_for_comparison(prefixed_tokens, other_prefixed_tokens)
81
+
82
+ prefixed_tokens.count.times.each do |index|
83
+ comp = compare_prefixed_token(
84
+ prefix: prefixed_tokens[index][0],
85
+ token: prefixed_tokens[index][1..-1] || "",
86
+ other_prefix: other_prefixed_tokens[index][0],
87
+ other_token: other_prefixed_tokens[index][1..-1] || ""
88
+ )
89
+ return comp unless comp.zero?
90
+ end
91
+
92
+ 0
93
+ end
94
+
95
+ def stringify_version(version)
96
+ version = version.to_s.downcase
97
+
98
+ # Not technically correct, but pragmatic
99
+ version.gsub(/^v(?=\d)/, "")
100
+ end
101
+
102
+ def fill_tokens(version)
103
+ # Add separators when transitioning from digits to characters
104
+ version = version.gsub(/(\d)([A-Za-z])/, '\1-\2')
105
+ version = version.gsub(/([A-Za-z])(\d)/, '\1-\2')
106
+
107
+ # Replace empty tokens with 0
108
+ version = version.gsub(/([\.\-])([\.\-])/, '\10\2')
109
+ version = version.gsub(/^([\.\-])/, '0\1')
110
+ version.gsub(/([\.\-])$/, '\10')
111
+ end
112
+
113
+ def trim_version(version)
114
+ version.split("-").map do |v|
115
+ parts = v.split(".")
116
+ parts = parts[0..-2] while NULL_VALUES.include?(parts&.last)
117
+ parts&.join(".")
118
+ end.compact.reject(&:empty?).join("-")
119
+ end
120
+
121
+ def convert_dates(version, other_version)
122
+ default = [version, other_version]
123
+ return default unless version.match?(/^\d{4}-?\d{2}-?\d{2}$/)
124
+ return default unless other_version.match?(/^\d{4}-?\d{2}-?\d{2}$/)
125
+
126
+ [version.delete("-"), other_version.delete("-")]
127
+ end
128
+
129
+ def split_into_prefixed_tokens(version)
130
+ ".#{version}".split(/(?=[\-\.])/)
131
+ end
132
+
133
+ def pad_for_comparison(prefixed_tokens, other_prefixed_tokens)
134
+ prefixed_tokens = prefixed_tokens.dup
135
+ other_prefixed_tokens = other_prefixed_tokens.dup
136
+
137
+ longest = [prefixed_tokens, other_prefixed_tokens].max_by(&:count)
138
+ shortest = [prefixed_tokens, other_prefixed_tokens].min_by(&:count)
139
+
140
+ longest.count.times do |index|
141
+ next unless shortest[index].nil?
142
+
143
+ shortest[index] = longest[index].start_with?(".") ? ".0" : "-"
144
+ end
145
+
146
+ [prefixed_tokens, other_prefixed_tokens]
147
+ end
148
+
149
+ def compare_prefixed_token(prefix:, token:, other_prefix:, other_token:)
150
+ token_type = token.match?(/^\d+$/) ? :number : :qualifier
151
+ other_token_type = other_token.match?(/^\d+$/) ? :number : :qualifier
152
+
153
+ hierarchy = PREFIXED_TOKEN_HIERARCHY.fetch(prefix).fetch(token_type)
154
+ other_hierarchy =
155
+ PREFIXED_TOKEN_HIERARCHY.fetch(other_prefix).fetch(other_token_type)
156
+
157
+ hierarchy_comparison = hierarchy <=> other_hierarchy
158
+ return hierarchy_comparison unless hierarchy_comparison.zero?
159
+
160
+ compare_token(token: token, other_token: other_token)
161
+ end
162
+
163
+ def compare_token(token:, other_token:)
164
+ if (token_hierarchy = NAMED_QUALIFIERS_HIERARCHY[token])
165
+ return -1 unless NAMED_QUALIFIERS_HIERARCHY[other_token]
166
+
167
+ return token_hierarchy <=> NAMED_QUALIFIERS_HIERARCHY[other_token]
168
+ end
169
+
170
+ return 1 if NAMED_QUALIFIERS_HIERARCHY[other_token]
171
+
172
+ token = token.to_i if token.match?(/^\d+$/)
173
+ other_token = other_token.to_i if other_token.match?(/^\d+$/)
174
+ token <=> other_token
175
+ end
176
+ end
177
+ end
178
+ end
179
+ end