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,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "excon"
4
+ require "dependabot/update_checkers/java_script/npm_and_yarn"
5
+ require "dependabot/shared_helpers"
6
+
7
+ module Dependabot
8
+ module UpdateCheckers
9
+ module JavaScript
10
+ class NpmAndYarn
11
+ class LibraryDetector
12
+ def initialize(package_json_file:)
13
+ @package_json_file = package_json_file
14
+ end
15
+
16
+ def library?
17
+ return false unless package_json_may_be_for_library?
18
+
19
+ npm_response_matches_package_json?
20
+ end
21
+
22
+ private
23
+
24
+ attr_reader :package_json_file
25
+
26
+ def package_json_may_be_for_library?
27
+ return false unless project_name
28
+ return false if project_name.match?(/\{\{.*\}\}/)
29
+ return false unless parsed_package_json["version"]
30
+ return false if parsed_package_json["private"]
31
+
32
+ true
33
+ end
34
+
35
+ def npm_response_matches_package_json?
36
+ project_description = parsed_package_json["description"]
37
+ return false unless project_description
38
+
39
+ # Check if the project is listed on npm. If it is, it's a library
40
+ @project_npm_response ||= Excon.get(
41
+ "https://registry.npmjs.org/#{escaped_project_name}",
42
+ idempotent: true,
43
+ **SharedHelpers.excon_defaults
44
+ )
45
+
46
+ return false unless @project_npm_response.status == 200
47
+
48
+ @project_npm_response.body.force_encoding("UTF-8").encode.
49
+ include?(project_description)
50
+ rescue Excon::Error::Socket, Excon::Error::Timeout
51
+ false
52
+ end
53
+
54
+ def project_name
55
+ parsed_package_json.fetch("name", nil)
56
+ end
57
+
58
+ def escaped_project_name
59
+ project_name&.gsub("/", "%2F")
60
+ end
61
+
62
+ def parsed_package_json
63
+ @parsed_package_json ||= JSON.parse(package_json_file.content)
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,226 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "excon"
4
+ require "dependabot/update_checkers/java_script/npm_and_yarn"
5
+ require "dependabot/shared_helpers"
6
+
7
+ module Dependabot
8
+ module UpdateCheckers
9
+ module JavaScript
10
+ class NpmAndYarn
11
+ class RegistryFinder
12
+ NPM_AUTH_TOKEN_REGEX =
13
+ %r{//(?<registry>.*)/:_authToken=(?<token>.*)$}.freeze
14
+ NPM_GLOBAL_REGISTRY_REGEX =
15
+ /^registry\s*=\s*(?<registry>.*)$/.freeze
16
+ YARN_GLOBAL_REGISTRY_REGEX =
17
+ /^registry\s+['"](?<registry>.*)['"]/.freeze
18
+
19
+ def initialize(dependency:, credentials:, npmrc_file: nil,
20
+ yarnrc_file: nil)
21
+ @dependency = dependency
22
+ @credentials = credentials
23
+ @npmrc_file = npmrc_file
24
+ @yarnrc_file = yarnrc_file
25
+ end
26
+
27
+ def registry
28
+ locked_registry || first_registry_with_dependency_details
29
+ end
30
+
31
+ def auth_headers
32
+ auth_header_for(auth_token)
33
+ end
34
+
35
+ def dependency_url
36
+ "#{registry_url.gsub(%r{/+$}, '')}/#{escaped_dependency_name}"
37
+ end
38
+
39
+ private
40
+
41
+ attr_reader :dependency, :credentials, :npmrc_file, :yarnrc_file
42
+
43
+ def first_registry_with_dependency_details
44
+ @first_registry_with_dependency_details ||=
45
+ known_registries.find do |details|
46
+ Excon.get(
47
+ "https://#{details['registry'].gsub(%r{/+$}, '')}/"\
48
+ "#{escaped_dependency_name}",
49
+ headers: auth_header_for(details["token"]),
50
+ idempotent: true,
51
+ **SharedHelpers.excon_defaults
52
+ ).status < 400
53
+ rescue Excon::Error::Timeout, Excon::Error::Socket
54
+ nil
55
+ end&.fetch("registry")
56
+
57
+ @first_registry_with_dependency_details ||= global_registry
58
+ end
59
+
60
+ def registry_url
61
+ protocol =
62
+ if private_registry_source_url
63
+ private_registry_source_url.split("://").first
64
+ else
65
+ "https"
66
+ end
67
+
68
+ "#{protocol}://#{registry}"
69
+ end
70
+
71
+ def auth_header_for(token)
72
+ return {} unless token
73
+
74
+ if token.include?(":")
75
+ encoded_token = Base64.encode64(token).delete("\n")
76
+ { "Authorization" => "Basic #{encoded_token}" }
77
+ elsif Base64.decode64(token).ascii_only? &&
78
+ Base64.decode64(token).include?(":")
79
+ { "Authorization" => "Basic #{token.delete("\n")}" }
80
+ else
81
+ { "Authorization" => "Bearer #{token}" }
82
+ end
83
+ end
84
+
85
+ def auth_token
86
+ known_registries.
87
+ find { |cred| cred["registry"] == registry }&.
88
+ fetch("token")
89
+ end
90
+
91
+ def locked_registry
92
+ return unless private_registry_source_url
93
+
94
+ lockfile_registry =
95
+ private_registry_source_url.
96
+ gsub("https://", "").
97
+ gsub("http://", "")
98
+ detailed_registry =
99
+ known_registries.
100
+ find { |h| h["registry"].include?(lockfile_registry) }&.
101
+ fetch("registry")
102
+
103
+ detailed_registry || lockfile_registry
104
+ end
105
+
106
+ def known_registries
107
+ @known_registries ||=
108
+ begin
109
+ registries = []
110
+ registries += credentials.
111
+ select { |cred| cred["type"] == "npm_registry" }
112
+ registries += npmrc_registries
113
+ registries += yarnrc_registries
114
+
115
+ unique_registries(registries)
116
+ end
117
+ end
118
+
119
+ def npmrc_registries
120
+ return [] unless npmrc_file
121
+
122
+ registries = []
123
+ npmrc_file.content.scan(NPM_AUTH_TOKEN_REGEX) do
124
+ next if Regexp.last_match[:registry].include?("${")
125
+
126
+ registries << {
127
+ "type" => "npm_registry",
128
+ "registry" => Regexp.last_match[:registry],
129
+ "token" => Regexp.last_match[:token]
130
+ }
131
+ end
132
+
133
+ npmrc_file.content.scan(NPM_GLOBAL_REGISTRY_REGEX) do
134
+ next if Regexp.last_match[:registry].include?("${")
135
+
136
+ registry = Regexp.last_match[:registry].strip.
137
+ sub(%r{/+$}, "").
138
+ sub(%r{^.*?//}, "")
139
+ next if registries.map { |r| r["registry"] }.include?(registry)
140
+
141
+ registries << {
142
+ "type" => "npm_registry",
143
+ "registry" => registry,
144
+ "token" => nil
145
+ }
146
+ end
147
+
148
+ registries
149
+ end
150
+
151
+ def yarnrc_registries
152
+ return [] unless yarnrc_file
153
+
154
+ registries = []
155
+ yarnrc_file.content.scan(YARN_GLOBAL_REGISTRY_REGEX) do
156
+ next if Regexp.last_match[:registry].include?("${")
157
+
158
+ registry = Regexp.last_match[:registry].strip.
159
+ sub(%r{/+$}, "").
160
+ sub(%r{^.*?//}, "")
161
+ registries << {
162
+ "type" => "npm_registry",
163
+ "registry" => registry,
164
+ "token" => nil
165
+ }
166
+ end
167
+
168
+ registries
169
+ end
170
+
171
+ def unique_registries(registries)
172
+ registries.uniq.reject do |registry|
173
+ next if registry["token"]
174
+
175
+ # Reject this entry if an identical one with a token exists
176
+ registries.any? do |r|
177
+ r["token"] && r["registry"] == registry["registry"]
178
+ end
179
+ end
180
+ end
181
+
182
+ def global_registry
183
+ npmrc_file&.content.to_s.scan(NPM_GLOBAL_REGISTRY_REGEX) do
184
+ next if Regexp.last_match[:registry].include?("${")
185
+
186
+ registry = Regexp.last_match[:registry].strip.
187
+ sub(%r{/+$}, "").
188
+ sub(%r{^.*?//}, "")
189
+ return registry
190
+ end
191
+
192
+ yarnrc_file&.content.to_s.scan(YARN_GLOBAL_REGISTRY_REGEX) do
193
+ next if Regexp.last_match[:registry].include?("${")
194
+
195
+ registry = Regexp.last_match[:registry].strip.
196
+ sub(%r{/+$}, "").
197
+ sub(%r{^.*?//}, "")
198
+ return registry
199
+ end
200
+
201
+ "registry.npmjs.org"
202
+ end
203
+
204
+ # npm registries expect slashes to be escaped
205
+ def escaped_dependency_name
206
+ dependency.name.gsub("/", "%2F")
207
+ end
208
+
209
+ def private_registry_source_url
210
+ sources = dependency.requirements.
211
+ map { |r| r.fetch(:source) }.uniq.compact
212
+
213
+ # If there are multiple source types, or multiple source URLs, then
214
+ # it's unclear how we should proceed
215
+ if sources.map { |s| [s[:type], s[:url]] }.uniq.count > 1
216
+ raise "Multiple sources! #{sources.join(', ')}"
217
+ end
218
+
219
+ # Otherwise we just take the URL of the first private registry
220
+ sources.find { |s| s[:type] == "private_registry" }&.fetch(:url)
221
+ end
222
+ end
223
+ end
224
+ end
225
+ end
226
+ end
@@ -0,0 +1,197 @@
1
+ # frozen_string_literal: true
2
+
3
+ ################################################################################
4
+ # For more details on npm version constraints, see: #
5
+ # https://docs.npmjs.com/misc/semver #
6
+ ################################################################################
7
+
8
+ require "dependabot/update_checkers/java_script/npm_and_yarn"
9
+ require "dependabot/utils/java_script/version"
10
+ require "dependabot/utils/java_script/requirement"
11
+
12
+ module Dependabot
13
+ module UpdateCheckers
14
+ module JavaScript
15
+ class NpmAndYarn
16
+ class RequirementsUpdater
17
+ VERSION_REGEX = /[0-9]+(?:\.[A-Za-z0-9\-_]+)*/.freeze
18
+ SEPARATOR = /(?<=[a-zA-Z0-9*])[\s|]+(?![\s|-])/.freeze
19
+ ALLOWED_UPDATE_STRATEGIES =
20
+ %i(widen_ranges bump_versions bump_versions_if_necessary).freeze
21
+
22
+ def initialize(requirements:, updated_source:, update_strategy:,
23
+ latest_version:, latest_resolvable_version:)
24
+ @requirements = requirements
25
+ @updated_source = updated_source
26
+ @update_strategy = update_strategy
27
+
28
+ check_update_strategy
29
+
30
+ if latest_version
31
+ @latest_version = version_class.new(latest_version)
32
+ end
33
+
34
+ return unless latest_resolvable_version
35
+
36
+ @latest_resolvable_version =
37
+ version_class.new(latest_resolvable_version)
38
+ end
39
+
40
+ def updated_requirements
41
+ requirements.map do |req|
42
+ req = req.merge(source: updated_source)
43
+ next req unless latest_resolvable_version
44
+ next initial_req_after_source_change(req) unless req[:requirement]
45
+ next req if req[:requirement].match?(/^([A-Za-uw-z]|v[^\d])/)
46
+
47
+ case update_strategy
48
+ when :widen_ranges then widen_requirement(req)
49
+ when :bump_versions then update_version_requirement(req)
50
+ when :bump_versions_if_necessary
51
+ update_version_requirement_if_needed(req)
52
+ else raise "Unexpected update strategy: #{update_strategy}"
53
+ end
54
+ end
55
+ end
56
+
57
+ private
58
+
59
+ attr_reader :requirements, :updated_source, :update_strategy,
60
+ :latest_version, :latest_resolvable_version
61
+
62
+ def check_update_strategy
63
+ return if ALLOWED_UPDATE_STRATEGIES.include?(update_strategy)
64
+
65
+ raise "Unknown update strategy: #{update_strategy}"
66
+ end
67
+
68
+ def updating_from_git_to_npm?
69
+ return false unless updated_source.nil?
70
+
71
+ original_source = requirements.map { |r| r[:source] }.compact.first
72
+ original_source&.fetch(:type) == "git"
73
+ end
74
+
75
+ def initial_req_after_source_change(req)
76
+ return req unless updating_from_git_to_npm?
77
+ return req unless req[:requirement].nil?
78
+
79
+ req.merge(requirement: "^#{latest_resolvable_version}")
80
+ end
81
+
82
+ def update_version_requirement(req)
83
+ current_requirement = req[:requirement]
84
+
85
+ if current_requirement.match?(/(<|-\s)/i)
86
+ ruby_req = ruby_requirements(current_requirement).first
87
+ return req if ruby_req.satisfied_by?(latest_resolvable_version)
88
+
89
+ updated_req = update_range_requirement(current_requirement)
90
+ return req.merge(requirement: updated_req)
91
+ end
92
+
93
+ req.merge(requirement: update_version_string(current_requirement))
94
+ end
95
+
96
+ def update_version_requirement_if_needed(req)
97
+ current_requirement = req[:requirement]
98
+ version = latest_resolvable_version
99
+ return req if current_requirement.strip == ""
100
+
101
+ ruby_reqs = ruby_requirements(current_requirement)
102
+ return req if ruby_reqs.any? { |r| r.satisfied_by?(version) }
103
+
104
+ update_version_requirement(req)
105
+ end
106
+
107
+ def widen_requirement(req)
108
+ current_requirement = req[:requirement]
109
+ version = latest_resolvable_version
110
+ return req if current_requirement.strip == ""
111
+
112
+ ruby_reqs = ruby_requirements(current_requirement)
113
+ return req if ruby_reqs.any? { |r| r.satisfied_by?(version) }
114
+
115
+ reqs = current_requirement.strip.split(SEPARATOR).map(&:strip)
116
+
117
+ updated_requirement =
118
+ if reqs.any? { |r| r.match?(/(<|-\s)/i) }
119
+ update_range_requirement(current_requirement)
120
+ elsif current_requirement.strip.split(SEPARATOR).count == 1
121
+ update_version_string(current_requirement)
122
+ else
123
+ current_requirement
124
+ end
125
+
126
+ req.merge(requirement: updated_requirement)
127
+ end
128
+
129
+ def ruby_requirements(requirement_string)
130
+ Utils::JavaScript::Requirement.
131
+ requirements_array(requirement_string)
132
+ end
133
+
134
+ def update_range_requirement(req_string)
135
+ range_requirements =
136
+ req_string.split(SEPARATOR).select { |r| r.match?(/<|(\s+-\s+)/) }
137
+
138
+ if range_requirements.count == 1
139
+ range_requirement = range_requirements.first
140
+ versions = range_requirement.scan(VERSION_REGEX)
141
+ upper_bound = versions.map { |v| version_class.new(v) }.max
142
+ new_upper_bound = update_greatest_version(
143
+ upper_bound,
144
+ latest_resolvable_version
145
+ )
146
+
147
+ req_string.sub(
148
+ upper_bound.to_s,
149
+ new_upper_bound.to_s
150
+ )
151
+ else
152
+ req_string + " || ^#{latest_resolvable_version}"
153
+ end
154
+ end
155
+
156
+ def update_version_string(req_string)
157
+ req_string.
158
+ sub(VERSION_REGEX) do |old_version|
159
+ if old_version.match?(/\d-/) ||
160
+ latest_resolvable_version.to_s.match?(/\d-/)
161
+ latest_resolvable_version.to_s
162
+ else
163
+ old_parts = old_version.split(".")
164
+ new_parts = latest_resolvable_version.to_s.split(".").
165
+ first(old_parts.count)
166
+ new_parts.map.with_index do |part, i|
167
+ old_parts[i].match?(/^x\b/) ? "x" : part
168
+ end.join(".")
169
+ end
170
+ end
171
+ end
172
+
173
+ def update_greatest_version(old_version, version_to_be_permitted)
174
+ version = version_class.new(old_version)
175
+ version = version.release if version.prerelease?
176
+
177
+ index_to_update =
178
+ version.segments.map.with_index { |seg, i| seg.zero? ? 0 : i }.max
179
+
180
+ version.segments.map.with_index do |_, index|
181
+ if index < index_to_update
182
+ version_to_be_permitted.segments[index]
183
+ elsif index == index_to_update
184
+ version_to_be_permitted.segments[index] + 1
185
+ else 0
186
+ end
187
+ end.join(".")
188
+ end
189
+
190
+ def version_class
191
+ Utils::JavaScript::Version
192
+ end
193
+ end
194
+ end
195
+ end
196
+ end
197
+ end