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,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "aws-sdk-ecr"
4
+ require "base64"
5
+
6
+ require "dependabot/errors"
7
+
8
+ module Dependabot
9
+ module Utils
10
+ module Docker
11
+ class CredentialsFinder
12
+ AWS_ECR_URL = /dkr\.ecr\.(?<region>[^.]+).amazonaws\.com/.freeze
13
+
14
+ def initialize(credentials)
15
+ @credentials = credentials
16
+ end
17
+
18
+ def credentials_for_registry(registry_hostname)
19
+ registry_details =
20
+ credentials.
21
+ select { |cred| cred["type"] == "docker_registry" }.
22
+ find { |cred| cred.fetch("registry") == registry_hostname }
23
+ return unless registry_details
24
+ return registry_details unless registry_hostname.match?(AWS_ECR_URL)
25
+
26
+ build_aws_credentials(registry_details)
27
+ end
28
+
29
+ private
30
+
31
+ attr_reader :credentials
32
+
33
+ def build_aws_credentials(registry_details)
34
+ # If credentials have been generated from AWS we can just return them
35
+ return registry_details if registry_details.fetch("username") == "AWS"
36
+
37
+ # Otherwise, we need to use the provided Access Key ID and secret to
38
+ # generate a temporary username and password
39
+ aws_credentials = Aws::Credentials.new(
40
+ registry_details.fetch("username"),
41
+ registry_details.fetch("password")
42
+ )
43
+
44
+ registry_hostname = registry_details.fetch("registry")
45
+ region = registry_hostname.match(AWS_ECR_URL).
46
+ named_captures.fetch("region")
47
+
48
+ @authorization_tokens ||= {}
49
+ @authorization_tokens[registry_hostname] ||=
50
+ Aws::ECR::Client.new(region: region, credentials: aws_credentials).
51
+ get_authorization_token.authorization_data.first.
52
+ authorization_token
53
+
54
+ username, password =
55
+ Base64.decode64(@authorization_tokens[registry_hostname]).split(":")
56
+
57
+ registry_details.merge("username" => username, "password" => password)
58
+ rescue Aws::Errors::MissingCredentialsError,
59
+ Aws::ECR::Errors::UnrecognizedClientException
60
+ raise PrivateSourceAuthenticationFailure, registry_hostname
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/utils/dotnet/version"
4
+
5
+ # For details on .NET version constraints see:
6
+ # https://docs.microsoft.com/en-us/nuget/reference/package-versioning
7
+ module Dependabot
8
+ module Utils
9
+ module Dotnet
10
+ class Requirement < Gem::Requirement
11
+ def self.parse(obj)
12
+ if obj.is_a?(Gem::Version)
13
+ return ["=", Utils::Dotnet::Version.new(obj.to_s)]
14
+ end
15
+
16
+ unless (matches = PATTERN.match(obj.to_s))
17
+ msg = "Illformed requirement [#{obj.inspect}]"
18
+ raise BadRequirementError, msg
19
+ end
20
+
21
+ return DefaultRequirement if matches[1] == ">=" && matches[2] == "0"
22
+
23
+ [matches[1] || "=", Utils::Dotnet::Version.new(matches[2])]
24
+ end
25
+
26
+ # For consistency with other langauges, we define a requirements array.
27
+ # Dotnet doesn't have an `OR` separator for requirements, so it always
28
+ # contains a single element.
29
+ def self.requirements_array(requirement_string)
30
+ [new(requirement_string)]
31
+ end
32
+
33
+ def initialize(*requirements)
34
+ requirements = requirements.flatten.flat_map do |req_string|
35
+ convert_dotnet_constraint_to_ruby_constraint(req_string)
36
+ end
37
+
38
+ super(requirements)
39
+ end
40
+
41
+ def satisfied_by?(version)
42
+ version = Utils::Dotnet::Version.new(version.to_s)
43
+ super
44
+ end
45
+
46
+ private
47
+
48
+ def convert_dotnet_constraint_to_ruby_constraint(req_string)
49
+ return unless req_string
50
+
51
+ if req_string&.start_with?("(", "[")
52
+ return convert_dotnet_range_to_ruby_range(req_string)
53
+ end
54
+
55
+ return req_string.split(",").map(&:strip) if req_string.include?(",")
56
+ return req_string unless req_string.include?("*")
57
+
58
+ convert_wildcard_req(req_string)
59
+ end
60
+
61
+ def convert_dotnet_range_to_ruby_range(req_string)
62
+ lower_b, upper_b = req_string.split(",").map(&:strip)
63
+
64
+ lower_b =
65
+ if ["(", "["].include?(lower_b) then nil
66
+ elsif lower_b.start_with?("(") then "> #{lower_b.sub(/\(\s*/, '')}"
67
+ else ">= #{lower_b.sub(/\[\s*/, '').strip}"
68
+ end
69
+
70
+ upper_b =
71
+ if [")", "]"].include?(upper_b) then nil
72
+ elsif upper_b.end_with?(")") then "< #{upper_b.sub(/\s*\)/, '')}"
73
+ else "<= #{upper_b.sub(/\s*\]/, '').strip}"
74
+ end
75
+
76
+ [lower_b, upper_b].compact
77
+ end
78
+
79
+ def convert_wildcard_req(req_string)
80
+ return ">= 0" if req_string.start_with?("*")
81
+
82
+ defined_part = req_string.split("*").first
83
+ suffix = defined_part.end_with?(".") ? "0" : "a"
84
+ version = defined_part + suffix
85
+ "~> #{version}"
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Dotnet 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
+
7
+ module Dependabot
8
+ module Utils
9
+ module Dotnet
10
+ class Version < Gem::Version
11
+ def initialize(version)
12
+ @version_string = version.to_s
13
+ super
14
+ end
15
+
16
+ def to_s
17
+ @version_string
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/utils/elixir/version"
4
+
5
+ module Dependabot
6
+ module Utils
7
+ module Elixir
8
+ class Requirement < Gem::Requirement
9
+ AND_SEPARATOR = /\s+and\s+/.freeze
10
+ OR_SEPARATOR = /\s+or\s+/.freeze
11
+
12
+ # Add the double-equality matcher to the list of allowed operations
13
+ OPS["=="] = ->(v, r) { v == r }
14
+
15
+ # Override the version pattern to allow local versions
16
+ quoted = OPS.keys.map { |k| Regexp.quote k }.join "|"
17
+ PATTERN_RAW =
18
+ "\\s*(#{quoted})?\\s*(#{Utils::Elixir::Version::VERSION_PATTERN})\\s*"
19
+ PATTERN = /\A#{PATTERN_RAW}\z/.freeze
20
+
21
+ # Returns an array of requirements. At least one requirement from the
22
+ # returned array must be satisfied for a version to be valid.
23
+ def self.requirements_array(requirement_string)
24
+ requirement_string.strip.split(OR_SEPARATOR).map do |req_string|
25
+ requirements = req_string.strip.split(AND_SEPARATOR)
26
+ new(requirements)
27
+ end
28
+ end
29
+
30
+ # Override the parser to create Utils::Elixir::Versions
31
+ def self.parse(obj)
32
+ if obj.is_a?(Gem::Version)
33
+ return ["=", Utils::Elixir::Version.new(obj.to_s)]
34
+ end
35
+
36
+ unless (matches = PATTERN.match(obj.to_s))
37
+ msg = "Illformed requirement [#{obj.inspect}]"
38
+ raise BadRequirementError, msg
39
+ end
40
+
41
+ return DefaultRequirement if matches[1] == ">=" && matches[2] == "0"
42
+
43
+ [matches[1] || "=", Utils::Elixir::Version.new(matches[2])]
44
+ end
45
+
46
+ def satisfied_by?(version)
47
+ version = Utils::Elixir::Version.new(version.to_s)
48
+ super
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Elixir versions can include build information, which Ruby can't parse.
4
+ # This class augments Gem::Version with build information.
5
+ # See https://hexdocs.pm/elixir/Version.html for details.
6
+
7
+ module Dependabot
8
+ module Utils
9
+ module Elixir
10
+ class Version < Gem::Version
11
+ attr_reader :build_info
12
+
13
+ VERSION_PATTERN = Gem::Version::VERSION_PATTERN +
14
+ '(\+[0-9a-zA-Z\-.]+)?'
15
+
16
+ def self.correct?(version)
17
+ super(version.to_s.split("+").first)
18
+ end
19
+
20
+ def initialize(version)
21
+ @version_string = version.to_s
22
+ version, @build_info = version.split("+")
23
+ super
24
+ end
25
+
26
+ def to_s
27
+ @version_string
28
+ end
29
+
30
+ def inspect # :nodoc:
31
+ "#<#{self.class} #{@version_string}>"
32
+ end
33
+
34
+ def <=>(other)
35
+ version_comparison = super(other)
36
+ return version_comparison unless version_comparison.zero?
37
+
38
+ unless other.is_a?(Utils::Elixir::Version)
39
+ return build_info.nil? ? 0 : 1
40
+ end
41
+
42
+ # Build information comparison
43
+ lhsegments = build_info.to_s.split(".").map(&:downcase)
44
+ rhsegments = other.build_info.to_s.split(".").map(&:downcase)
45
+ limit = [lhsegments.count, rhsegments.count].min
46
+
47
+ lhs = ["1", *lhsegments.first(limit)].join(".")
48
+ rhs = ["1", *rhsegments.first(limit)].join(".")
49
+
50
+ local_comparison = Gem::Version.new(lhs) <=> Gem::Version.new(rhs)
51
+
52
+ return local_comparison unless local_comparison.zero?
53
+
54
+ lhsegments.count <=> rhsegments.count
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/utils/elm/version"
4
+
5
+ module Dependabot
6
+ module Utils
7
+ module Elm
8
+ class Requirement < Gem::Requirement
9
+ # Override the version pattern to allow local versions
10
+ PATTERN_RAW =
11
+ "(#{Utils::Elm::Version::VERSION_PATTERN}) (<=?) v (<=?) " \
12
+ "(#{Utils::Elm::Version::VERSION_PATTERN})"
13
+ PATTERN = /\A#{PATTERN_RAW}\z/.freeze
14
+ EXACT_PATTERN = /\A#{Utils::Elm::Version::VERSION_PATTERN}\z/.freeze
15
+
16
+ # Returns an array of requirements. At least one requirement from the
17
+ # returned array must be satisfied for a version to be valid.
18
+ def self.requirements_array(requirement_string)
19
+ [new(requirement_string)]
20
+ end
21
+
22
+ # Override the parser to create Utils::Elm::Versions and return an
23
+ # array of parsed requirements
24
+ def self.parse(obj)
25
+ # If a version is given this is an equals requirement
26
+ if EXACT_PATTERN.match?(obj.to_s)
27
+ return [["=", Utils::Elm::Version.new(obj.to_s)]]
28
+ end
29
+
30
+ unless (matches = PATTERN.match(obj.to_s))
31
+ msg = "Illformed requirement #{obj.inspect}"
32
+ raise BadRequirementError, msg
33
+ end
34
+
35
+ # If the two versions specified are identical this is an equals
36
+ # requirement
37
+ if matches[1] == matches[4] && matches[3] == "<="
38
+ return [["=", Utils::Elm::Version.new(matches[4])]]
39
+ end
40
+
41
+ [
42
+ [matches[2].tr("<", ">"), Utils::Elm::Version.new(matches[1])],
43
+ [matches[3], Utils::Elm::Version.new(matches[4])]
44
+ ]
45
+ end
46
+
47
+ # Overwrite superclass method to use `flat_map`
48
+ def initialize(*requirements)
49
+ if requirements.any?(&:nil?)
50
+ raise BadRequirementError, "Nil requirement not supported in Elm"
51
+ end
52
+
53
+ requirements = requirements.flatten
54
+ requirements.compact!
55
+ requirements.uniq!
56
+
57
+ if requirements.empty?
58
+ @requirements = [DefaultRequirement]
59
+ else
60
+ @requirements = requirements.flat_map { |r| self.class.parse(r) }
61
+ sort_requirements!
62
+ end
63
+ end
64
+
65
+ # Overwrite superclass method to use `flat_map`
66
+ def concat(new)
67
+ new = new.flatten
68
+ new.compact!
69
+ new.uniq!
70
+ new = new.flat_map { |r| self.class.parse(r) }
71
+
72
+ @requirements.concat new
73
+ sort_requirements!
74
+ end
75
+
76
+ def sort_requirements!
77
+ @requirements.sort! do |l, r|
78
+ comp = l.last <=> r.last # first, sort by the requirement's version
79
+ next comp unless comp.zero?
80
+
81
+ l.first <=> r.first # then, sort by the operator (for stability)
82
+ end
83
+ end
84
+
85
+ def satisfied_by?(version)
86
+ version = Utils::Elm::Version.new(version.to_s)
87
+ super
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Elm versions require major, minor and patch to be present
4
+ # They don't allow any letters
5
+
6
+ module Dependabot
7
+ module Utils
8
+ module Elm
9
+ class Version < Gem::Version
10
+ VERSION_PATTERN = "[0-9]+\.[0-9]+\.[0-9]+"
11
+ VERSION_PATTERN_REGEX = /\A#{VERSION_PATTERN}\Z/.freeze
12
+
13
+ def self.correct?(version)
14
+ version.to_s.match?(VERSION_PATTERN_REGEX)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "excon"
4
+ require "nokogiri"
5
+
6
+ require "dependabot/shared_helpers"
7
+ require "dependabot/source"
8
+ require "dependabot/utils/go/shared_helper"
9
+
10
+ module Dependabot
11
+ module Utils
12
+ module Go
13
+ module PathConverter
14
+ def self.git_url_for_path(path)
15
+ # Save a query by manually converting golang.org/x names
16
+ import_path = path.gsub(%r{^golang\.org/x}, "github.com/golang")
17
+
18
+ SharedHelpers.run_helper_subprocess(
19
+ command: Go::SharedHelper.path,
20
+ function: "getVcsRemoteForImport",
21
+ args: { import: import_path }
22
+ )
23
+ end
24
+
25
+ # Used in dependabot-backend, which doesn't have access to any Go
26
+ # helpers.
27
+ # TODO: remove the need for this.
28
+ def self.git_url_for_path_without_go_helper(path)
29
+ # Save a query by manually converting golang.org/x names
30
+ tmp_path = path.gsub(%r{^golang\.org/x}, "github.com/golang")
31
+
32
+ # Currently, Dependabot::Source.new will return `nil` if it can't
33
+ # find a git SCH associated with a path. If it is ever extended to
34
+ # handle non-git sources we'll need to add an additional check here.
35
+ return Source.from_url(tmp_path).url if Source.from_url(tmp_path)
36
+ return "https://#{tmp_path}" if tmp_path.end_with?(".git")
37
+ return unless (metadata_response = fetch_path_metadata(path))
38
+
39
+ # Look for a GitHub, Bitbucket or GitLab URL in the response
40
+ metadata_response.scan(Dependabot::Source::SOURCE_REGEX) do
41
+ source_url = Regexp.last_match.to_s
42
+ return Source.from_url(source_url).url
43
+ end
44
+
45
+ # If none are found, parse the response and return the go-import path
46
+ doc = Nokogiri::XML(metadata_response)
47
+ doc.remove_namespaces!
48
+ import_details =
49
+ doc.xpath("//meta").
50
+ find { |n| n.attributes["name"]&.value == "go-import" }&.
51
+ attributes&.fetch("content")&.value&.split(/\s+/)
52
+ return unless import_details && import_details[1] == "git"
53
+
54
+ import_details[2]
55
+ end
56
+
57
+ def self.fetch_path_metadata(path)
58
+ # TODO: This is not robust! Instead, we should shell out to Go and
59
+ # use https://github.com/Masterminds/vcs.
60
+ response = Excon.get(
61
+ "https://#{path}?go-get=1",
62
+ idempotent: true,
63
+ **SharedHelpers.excon_defaults
64
+ )
65
+
66
+ return unless response.status == 200
67
+
68
+ response.body
69
+ end
70
+ private_class_method :fetch_path_metadata
71
+ end
72
+ end
73
+ end
74
+ end