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,330 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+ require "dependabot/file_fetchers/base"
5
+ require "dependabot/file_parsers/java_script/npm_and_yarn"
6
+
7
+ module Dependabot
8
+ module FileFetchers
9
+ module JavaScript
10
+ class NpmAndYarn < Dependabot::FileFetchers::Base
11
+ require_relative "npm_and_yarn/path_dependency_builder"
12
+
13
+ def self.required_files_in?(filenames)
14
+ filenames.include?("package.json")
15
+ end
16
+
17
+ def self.required_files_message
18
+ "Repo must contain a package.json."
19
+ end
20
+
21
+ private
22
+
23
+ # rubocop:disable Metrics/CyclomaticComplexity
24
+ # rubocop:disable Metrics/PerceivedComplexity
25
+ def fetch_files
26
+ fetched_files = []
27
+ fetched_files << package_json
28
+ fetched_files << package_lock if package_lock && !ignore_package_lock?
29
+ fetched_files << yarn_lock if yarn_lock
30
+ fetched_files << shrinkwrap if shrinkwrap
31
+ fetched_files << lerna_json if lerna_json
32
+ fetched_files << npmrc if npmrc
33
+ fetched_files << yarnrc if yarnrc
34
+ fetched_files += workspace_package_jsons
35
+ fetched_files += lerna_packages
36
+ fetched_files += path_dependencies(fetched_files)
37
+
38
+ fetched_files.uniq
39
+ end
40
+ # rubocop:enable Metrics/CyclomaticComplexity
41
+ # rubocop:enable Metrics/PerceivedComplexity
42
+
43
+ def package_json
44
+ @package_json ||= fetch_file_from_host("package.json")
45
+ end
46
+
47
+ def package_lock
48
+ @package_lock ||= fetch_file_if_present("package-lock.json")
49
+ end
50
+
51
+ def yarn_lock
52
+ @yarn_lock ||= fetch_file_if_present("yarn.lock")
53
+ end
54
+
55
+ def shrinkwrap
56
+ @shrinkwrap ||= fetch_file_if_present("npm-shrinkwrap.json")
57
+ end
58
+
59
+ def npmrc
60
+ @npmrc ||= fetch_file_if_present(".npmrc")&.
61
+ tap { |f| f.support_file = true }
62
+
63
+ return @npmrc if @npmrc || directory == "/"
64
+
65
+ # Loop through parent directories looking for an npmrc
66
+ (1..directory.split("/").count).each do |i|
67
+ @npmrc = fetch_file_from_host("../" * i + ".npmrc")&.
68
+ tap { |f| f.support_file = true }
69
+ break if @npmrc
70
+ rescue Dependabot::DependencyFileNotFound
71
+ # Ignore errors (.npmrc may not be present)
72
+ nil
73
+ end
74
+
75
+ @npmrc
76
+ end
77
+
78
+ def yarnrc
79
+ @yarnrc ||= fetch_file_if_present(".yarnrc")&.
80
+ tap { |f| f.support_file = true }
81
+
82
+ return @yarnrc if @yarnrc || directory == "/"
83
+
84
+ # Loop through parent directories looking for an yarnrc
85
+ (1..directory.split("/").count).each do |i|
86
+ @yarnrc = fetch_file_from_host("../" * i + ".yarnrc")&.
87
+ tap { |f| f.support_file = true }
88
+ break if @yarnrc
89
+ rescue Dependabot::DependencyFileNotFound
90
+ # Ignore errors (.yarnrc may not be present)
91
+ nil
92
+ end
93
+
94
+ @yarnrc
95
+ end
96
+
97
+ def lerna_json
98
+ @lerna_json ||= fetch_file_if_present("lerna.json")&.
99
+ tap { |f| f.support_file = true }
100
+ end
101
+
102
+ def workspace_package_jsons
103
+ @workspace_package_jsons ||= fetch_workspace_package_jsons
104
+ end
105
+
106
+ def lerna_packages
107
+ @lerna_packages ||= fetch_lerna_packages
108
+ end
109
+
110
+ def path_dependencies(fetched_files)
111
+ package_json_files = []
112
+ unfetchable_deps = []
113
+
114
+ path_dependency_details(fetched_files).each do |name, path|
115
+ path = path.sub(/^file:/, "").sub(/^link:/, "")
116
+ filename = File.join(path, "package.json")
117
+ cleaned_name = Pathname.new(filename).cleanpath.to_path
118
+ next if fetched_files.map(&:name).include?(cleaned_name)
119
+
120
+ begin
121
+ file = fetch_file_from_host(filename, type: "path_dependency")
122
+ package_json_files << file
123
+ rescue Dependabot::DependencyFileNotFound
124
+ unfetchable_deps << [name, path]
125
+ end
126
+ end
127
+
128
+ package_json_files += build_unfetchable_deps(unfetchable_deps)
129
+
130
+ if package_json_files.any?
131
+ package_json_files +=
132
+ path_dependencies(fetched_files + package_json_files)
133
+ end
134
+
135
+ package_json_files.tap { |fs| fs.each { |f| f.support_file = true } }
136
+ end
137
+
138
+ def path_dependency_details(fetched_files)
139
+ package_json_path_deps = []
140
+
141
+ fetched_files.each do |file|
142
+ package_json_path_deps +=
143
+ path_dependency_details_from_manifest(file)
144
+ end
145
+
146
+ path_starts = %w(file: link:.)
147
+
148
+ package_lock_path_deps =
149
+ parsed_package_lock.fetch("dependencies", []).to_a.
150
+ select { |_, v| v.fetch("version", "").start_with?(*path_starts) }.
151
+ map { |k, v| [k, v.fetch("version")] }
152
+
153
+ shrinkwrap_path_deps =
154
+ parsed_shrinkwrap.fetch("dependencies", []).to_a.
155
+ select { |_, v| v.fetch("version", "").start_with?(*path_starts) }.
156
+ map { |k, v| [k, v.fetch("version")] }
157
+
158
+ [
159
+ *package_json_path_deps,
160
+ *package_lock_path_deps,
161
+ *shrinkwrap_path_deps
162
+ ].uniq
163
+ end
164
+
165
+ def path_dependency_details_from_manifest(file)
166
+ return [] unless file.name.end_with?("package.json")
167
+
168
+ current_dir = file.name.rpartition("/").first
169
+ current_dir = nil if current_dir == ""
170
+ path_dep_starts = %w(file: / ./ ../ ~/ link:.)
171
+
172
+ JSON.parse(file.content).
173
+ values_at(*FileParsers::JavaScript::NpmAndYarn::DEPENDENCY_TYPES).
174
+ compact.flat_map(&:to_a).
175
+ select { |_, v| v.start_with?(*path_dep_starts) }.
176
+ map do |name, path|
177
+ path = path.sub(/^file:/, "").sub(/^link:/, "")
178
+ path = File.join(current_dir, path) unless current_dir.nil?
179
+ [name, Pathname.new(path).cleanpath.to_path]
180
+ end
181
+ rescue JSON::ParserError
182
+ raise Dependabot::DependencyFileNotParseable, file.path
183
+ end
184
+
185
+ def fetch_workspace_package_jsons
186
+ return [] unless parsed_package_json["workspaces"]
187
+
188
+ package_json_files = []
189
+
190
+ workspace_paths(parsed_package_json["workspaces"]).each do |workspace|
191
+ file = File.join(workspace, "package.json")
192
+
193
+ begin
194
+ package_json_files << fetch_file_from_host(file)
195
+ rescue Dependabot::DependencyFileNotFound
196
+ nil
197
+ end
198
+ end
199
+
200
+ package_json_files
201
+ end
202
+
203
+ def fetch_lerna_packages
204
+ return [] unless parsed_lerna_json["packages"]
205
+
206
+ dependency_files = []
207
+
208
+ workspace_paths(parsed_lerna_json["packages"]).each do |workspace|
209
+ dependency_files += fetch_lerna_packages_from_path(workspace)
210
+ end
211
+
212
+ dependency_files
213
+ end
214
+
215
+ def fetch_lerna_packages_from_path(path, nested = false)
216
+ dependency_files = []
217
+
218
+ package_json_path = File.join(path, "package.json")
219
+
220
+ begin
221
+ dependency_files << fetch_file_from_host(package_json_path)
222
+ dependency_files += [
223
+ fetch_file_if_present(File.join(path, "package-lock.json")),
224
+ fetch_file_if_present(File.join(path, "yarn.lock")),
225
+ fetch_file_if_present(File.join(path, "npm-shrinkwrap.json"))
226
+ ].compact
227
+ rescue Dependabot::DependencyFileNotFound
228
+ matches_double_glob =
229
+ parsed_lerna_json["packages"].any? do |globbed_path|
230
+ next false unless globbed_path.include?("**")
231
+
232
+ File.fnmatch?(globbed_path, path)
233
+ end
234
+
235
+ if matches_double_glob && !nested
236
+ dependency_files +=
237
+ expanded_paths(File.join(path, "*")).flat_map do |nested_path|
238
+ fetch_lerna_packages_from_path(nested_path, true)
239
+ end
240
+ end
241
+ end
242
+
243
+ dependency_files
244
+ end
245
+
246
+ def workspace_paths(workspace_object)
247
+ paths_array =
248
+ if workspace_object.is_a?(Hash)
249
+ workspace_object.values_at("packages", "nohoist").flatten.compact
250
+ elsif workspace_object.is_a?(Array) then workspace_object
251
+ else raise "Unexpected workspace object"
252
+ end
253
+
254
+ paths_array.flat_map do |path|
255
+ # The packages/!(not-this-package) syntax is unique to Yarn
256
+ if path.include?("*") || path.include?("!(")
257
+ expanded_paths(path)
258
+ else path
259
+ end
260
+ end
261
+ end
262
+
263
+ def expanded_paths(path)
264
+ ignored_paths = path.scan(/!\((.*?)\)/).flatten
265
+
266
+ dir = directory.gsub(%r{(^/|/$)}, "")
267
+ path = path.gsub(%r{^\./}, "").gsub(/!\(.*?\)/, "*")
268
+ unglobbed_path = path.split("*").first&.gsub(%r{(?<=/)[^/]*$}, "") ||
269
+ "."
270
+
271
+ repo_contents(dir: unglobbed_path, raise_errors: false).
272
+ select { |file| file.type == "dir" }.
273
+ map { |f| f.path.gsub(%r{^/?#{Regexp.escape(dir)}/?}, "") }.
274
+ select { |filename| File.fnmatch?(path, filename) }.
275
+ reject { |fn| ignored_paths.any? { |p| fn.include?(p) } }
276
+ end
277
+
278
+ def parsed_package_json
279
+ JSON.parse(package_json.content)
280
+ rescue JSON::ParserError
281
+ raise Dependabot::DependencyFileNotParseable, package_json.path
282
+ end
283
+
284
+ def parsed_package_lock
285
+ return {} unless package_lock
286
+
287
+ JSON.parse(package_lock.content)
288
+ rescue JSON::ParserError
289
+ {}
290
+ end
291
+
292
+ def parsed_shrinkwrap
293
+ return {} unless shrinkwrap
294
+
295
+ JSON.parse(shrinkwrap.content)
296
+ rescue JSON::ParserError
297
+ {}
298
+ end
299
+
300
+ def ignore_package_lock?
301
+ return false unless npmrc
302
+
303
+ npmrc.content.match?(/^package-lock\s*=\s*false/)
304
+ end
305
+
306
+ def build_unfetchable_deps(unfetchable_deps)
307
+ return [] unless package_lock || yarn_lock
308
+
309
+ unfetchable_deps.map do |name, path|
310
+ PathDependencyBuilder.new(
311
+ dependency_name: name,
312
+ path: path,
313
+ directory: directory,
314
+ package_lock: package_lock,
315
+ yarn_lock: yarn_lock
316
+ ).dependency_file
317
+ end
318
+ end
319
+
320
+ def parsed_lerna_json
321
+ return {} unless lerna_json
322
+
323
+ JSON.parse(lerna_json.content)
324
+ rescue JSON::ParserError
325
+ raise Dependabot::DependencyFileNotParseable, lerna_json.path
326
+ end
327
+ end
328
+ end
329
+ end
330
+ end
@@ -0,0 +1,107 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+ require "dependabot/dependency_file"
5
+ require "dependabot/errors"
6
+ require "dependabot/file_fetchers/java_script/npm_and_yarn"
7
+
8
+ module Dependabot
9
+ module FileFetchers
10
+ module JavaScript
11
+ class NpmAndYarn
12
+ class PathDependencyBuilder
13
+ def initialize(dependency_name:, path:, directory:, package_lock:,
14
+ yarn_lock:)
15
+ @dependency_name = dependency_name
16
+ @path = path
17
+ @directory = directory
18
+ @package_lock = package_lock
19
+ @yarn_lock = yarn_lock
20
+ end
21
+
22
+ def dependency_file
23
+ filename = File.join(path, "package.json")
24
+
25
+ DependencyFile.new(
26
+ name: Pathname.new(filename).cleanpath.to_path,
27
+ content: build_path_dep_content(dependency_name),
28
+ directory: directory,
29
+ type: "path_dependency"
30
+ )
31
+ end
32
+
33
+ private
34
+
35
+ attr_reader :dependency_name, :path, :package_lock, :yarn_lock,
36
+ :directory
37
+
38
+ def details_from_yarn_lock
39
+ parsed_yarn_lock.to_a.
40
+ find do |n, _|
41
+ next false unless n.split(/(?<=\w)\@/).first == dependency_name
42
+
43
+ n.split(/(?<=\w)\@/).last.start_with?("file:")
44
+ end&.last
45
+ end
46
+
47
+ def details_from_npm_lock
48
+ parsed_package_lock.fetch("dependencies", []).to_a.
49
+ select { |_, v| v.fetch("version", "").start_with?("file:") }.
50
+ find { |n, _| n == dependency_name }&.
51
+ last
52
+ end
53
+
54
+ def build_path_dep_content(dependency_name)
55
+ unless details_from_yarn_lock || details_from_npm_lock
56
+ raise Dependabot::PathDependenciesNotReachable, [dependency_name]
57
+ end
58
+
59
+ if details_from_yarn_lock
60
+ {
61
+ name: dependency_name,
62
+ version: "0.0.1",
63
+ dependencies: details_from_yarn_lock["dependencies"],
64
+ optionalDependencies:
65
+ details_from_yarn_lock["optionalDependencies"]
66
+ }.compact.to_json
67
+ else
68
+ {
69
+ name: dependency_name,
70
+ version: "0.0.1",
71
+ dependencies: details_from_npm_lock["requires"]
72
+ }.compact.to_json
73
+ end
74
+ end
75
+
76
+ def parsed_package_lock
77
+ return {} unless package_lock
78
+
79
+ JSON.parse(package_lock.content)
80
+ rescue JSON::ParserError
81
+ {}
82
+ end
83
+
84
+ def parsed_yarn_lock
85
+ return {} unless yarn_lock
86
+
87
+ @parsed_yarn_lock ||=
88
+ SharedHelpers.in_a_temporary_directory do
89
+ File.write("yarn.lock", yarn_lock.content)
90
+
91
+ SharedHelpers.run_helper_subprocess(
92
+ command: "node #{yarn_helper_path}",
93
+ function: "parseLockfile",
94
+ args: [Dir.pwd]
95
+ )
96
+ end
97
+ end
98
+
99
+ def yarn_helper_path
100
+ project_root = File.join(File.dirname(__FILE__), "../../../../..")
101
+ File.join(project_root, "helpers/yarn/bin/run.js")
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,131 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_fetchers/base"
4
+
5
+ module Dependabot
6
+ module FileFetchers
7
+ module Php
8
+ class Composer < Dependabot::FileFetchers::Base
9
+ def self.required_files_in?(filenames)
10
+ filenames.include?("composer.json")
11
+ end
12
+
13
+ def self.required_files_message
14
+ "Repo must contain a composer.json."
15
+ end
16
+
17
+ private
18
+
19
+ def fetch_files
20
+ fetched_files = []
21
+ fetched_files << composer_json
22
+ fetched_files << composer_lock if composer_lock
23
+ fetched_files << auth_json if auth_json
24
+ fetched_files += path_dependencies
25
+ fetched_files
26
+ end
27
+
28
+ def composer_json
29
+ @composer_json ||= fetch_file_from_host("composer.json")
30
+ end
31
+
32
+ def composer_lock
33
+ return @composer_lock if @composer_lock_lookup_attempted
34
+
35
+ @composer_lock_lookup_attempted = true
36
+ @composer_lock ||= fetch_file_if_present("composer.lock")
37
+ end
38
+
39
+ # Note: This is fetched but currently unused
40
+ def auth_json
41
+ @auth_json ||= fetch_file_if_present("auth.json")&.
42
+ tap { |f| f.support_file = true }
43
+ end
44
+
45
+ def path_dependencies
46
+ @path_dependencies ||=
47
+ begin
48
+ composer_json_files = []
49
+ unfetchable_deps = []
50
+
51
+ path_sources.each do |path|
52
+ directories = path.end_with?("*") ? expand_path(path) : [path]
53
+
54
+ directories.each do |dir|
55
+ file = File.join(dir, "composer.json")
56
+
57
+ begin
58
+ composer_json_files << fetch_file_with_root_fallback(file)
59
+ rescue Dependabot::DependencyFileNotFound
60
+ # Collected, but currently ignored
61
+ unfetchable_deps << file
62
+ end
63
+ end
64
+ end
65
+
66
+ # Mark the path dependencies as support files - we don't currently
67
+ # parse or update them.
68
+ composer_json_files.tap do |files|
69
+ files.each { |f| f.support_file = true }
70
+ end
71
+ end
72
+ end
73
+
74
+ def path_sources
75
+ @path_sources ||=
76
+ JSON.parse(composer_json.content).
77
+ fetch("repositories", []).
78
+ select { |details| details["type"] == "path" }.
79
+ map { |details| details["url"] }
80
+ rescue JSON::ParserError
81
+ raise Dependabot::DependencyFileNotParseable, composer_json.path
82
+ end
83
+
84
+ def expand_path(path)
85
+ repo_contents(dir: path.gsub(/\*$/, "")).
86
+ select { |file| file.type == "dir" }.
87
+ map { |f| path.gsub(/\*$/, f.name) }
88
+ rescue Octokit::NotFound, Gitlab::Error::NotFound
89
+ # If there's no lockfile, or if none of the dependencies are path
90
+ # dependencies, then we can ignore failures to find path deps
91
+ return [] unless composer_lock&.content&.include?('"path"')
92
+
93
+ # Otherwise, we don't know what to do. For now, just raise. If we see
94
+ # this in the wild we can make a call on the correct handling
95
+ raise if directory == "/"
96
+
97
+ # If the directory isn't found at the full path, try looking for it
98
+ # at the root of the repository.
99
+ depth = directory.gsub(%r{^/}, "").gsub(%r{/$}, "").split("/").count
100
+ dir = "../" * depth + path.gsub(/\*$/, "")
101
+
102
+ repo_contents(dir: dir).
103
+ select { |file| file.type == "dir" }.
104
+ map { |f| path.gsub(/\*$/, f.name) }
105
+ end
106
+
107
+ def fetch_file_with_root_fallback(filename, type: "file")
108
+ path = Pathname.new(File.join(directory, filename)).cleanpath.to_path
109
+
110
+ begin
111
+ fetch_file_from_host(filename, type: type)
112
+ rescue Dependabot::DependencyFileNotFound
113
+ # If the file isn't found at the full path, try looking for it
114
+ # without considering the directory (i.e., check if the path should
115
+ # have been relevative to the root of the repository).
116
+ cleaned_filename = Pathname.new(filename).cleanpath.to_path
117
+
118
+ DependencyFile.new(
119
+ name: cleaned_filename,
120
+ content: fetch_file_content(cleaned_filename),
121
+ directory: directory,
122
+ type: type
123
+ )
124
+ end
125
+ rescue Octokit::NotFound, Gitlab::Error::NotFound
126
+ raise Dependabot::DependencyFileNotFound, path
127
+ end
128
+ end
129
+ end
130
+ end
131
+ end