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,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_parsers/ruby/bundler"
4
+ require "dependabot/file_parsers/python/pip"
5
+ require "dependabot/file_parsers/java_script/npm_and_yarn"
6
+ require "dependabot/file_parsers/java/maven"
7
+ require "dependabot/file_parsers/java/gradle"
8
+ require "dependabot/file_parsers/php/composer"
9
+ require "dependabot/file_parsers/git/submodules"
10
+ require "dependabot/file_parsers/docker/docker"
11
+ require "dependabot/file_parsers/elixir/hex"
12
+ require "dependabot/file_parsers/rust/cargo"
13
+ require "dependabot/file_parsers/dotnet/nuget"
14
+ require "dependabot/file_parsers/go/dep"
15
+ require "dependabot/file_parsers/go/modules"
16
+ require "dependabot/file_parsers/elm/elm_package"
17
+
18
+ module Dependabot
19
+ module FileParsers
20
+ @file_parsers = {
21
+ "bundler" => FileParsers::Ruby::Bundler,
22
+ "npm_and_yarn" => FileParsers::JavaScript::NpmAndYarn,
23
+ "maven" => FileParsers::Java::Maven,
24
+ "gradle" => FileParsers::Java::Gradle,
25
+ "pip" => FileParsers::Python::Pip,
26
+ "composer" => FileParsers::Php::Composer,
27
+ "submodules" => FileParsers::Git::Submodules,
28
+ "docker" => FileParsers::Docker::Docker,
29
+ "hex" => FileParsers::Elixir::Hex,
30
+ "cargo" => FileParsers::Rust::Cargo,
31
+ "nuget" => FileParsers::Dotnet::Nuget,
32
+ "dep" => FileParsers::Go::Dep,
33
+ "go_modules" => FileParsers::Go::Modules,
34
+ "elm-package" => FileParsers::Elm::ElmPackage
35
+ }
36
+
37
+ def self.for_package_manager(package_manager)
38
+ file_parser = @file_parsers[package_manager]
39
+ return file_parser if file_parser
40
+
41
+ raise "Unsupported package_manager #{package_manager}"
42
+ end
43
+
44
+ def self.register(package_manager, file_parser)
45
+ @file_parsers[package_manager] = file_parser
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,45 @@
1
+ # File parsers
2
+
3
+ File parsers take a set of dependency files and extract a list of dependencies
4
+ for the project.
5
+
6
+ There is a `Dependabot::FileParsers` class for each language Dependabot
7
+ supports.
8
+
9
+ ## Public API
10
+
11
+ Each `Dependabot::FileParsers` class implements the following methods:
12
+
13
+ | Method | Description |
14
+ |---------------------|-----------------------------------------------------------------------------------------------|
15
+ | `#parse` | Returns an array of `Dependabot::Dependency` instances, representing the dependencies for the project. Each `Dependabot::Dependency` has a `name`, `version` and a `requirements` array |
16
+
17
+ An integration might look as follows:
18
+
19
+ ```ruby
20
+ require 'dependabot/file_parsers'
21
+
22
+ files = fetcher.files
23
+
24
+ parser_class = Dependabot::FileParsers::Ruby::Bundler
25
+ source = Dependabot::Source.new(provider: 'github', repo: "gocardless/business")
26
+ parser = parser_class.new(dependency_files: files, source: source)
27
+
28
+ dependencies = parser.parse
29
+
30
+ puts "Found the following dependencies: #{dependencies.map(&:name)}"
31
+ ```
32
+
33
+ ## Writing a file parser for a new language
34
+
35
+ All new file parsers should inherit from `Dependabot::FileParsers::Base` and
36
+ implement the following methods:
37
+
38
+ | Method | Description |
39
+ |-------------------------|-----------------------------------------------------------------------------------------------|
40
+ | `#parse` | See Public API section. |
41
+ | `#check_required_files` | Raise a runtime error unless an appropriate set of files is provided. Private. |
42
+
43
+ To ensure the above are implemented, you should include
44
+ `it_behaves_like "a dependency file parser"` in your specs for the new file
45
+ parser.
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dependabot
4
+ module FileParsers
5
+ class Base
6
+ attr_reader :dependency_files, :credentials, :source
7
+
8
+ def initialize(dependency_files:, source:, credentials: [])
9
+ @dependency_files = dependency_files
10
+ @credentials = credentials
11
+ @source = source
12
+
13
+ check_required_files
14
+ end
15
+
16
+ def parse
17
+ raise NotImplementedError
18
+ end
19
+
20
+ private
21
+
22
+ def check_required_files
23
+ raise NotImplementedError
24
+ end
25
+
26
+ def get_original_file(filename)
27
+ dependency_files.find { |f| f.name == filename }
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/dependency"
4
+ require "dependabot/file_parsers/base"
5
+ require "dependabot/utils"
6
+
7
+ module Dependabot
8
+ module FileParsers
9
+ class Base
10
+ class DependencySet
11
+ def initialize(dependencies = [])
12
+ unless dependencies.is_a?(Array) &&
13
+ dependencies.all? { |dep| dep.is_a?(Dependency) }
14
+ raise ArgumentError, "must be an array of Dependency objects"
15
+ end
16
+
17
+ @dependencies = dependencies
18
+ end
19
+
20
+ attr_reader :dependencies
21
+
22
+ def <<(dep)
23
+ unless dep.is_a?(Dependency)
24
+ raise ArgumentError, "must be a Dependency object"
25
+ end
26
+
27
+ existing_dependency = dependencies.find { |d| d.name == dep.name }
28
+
29
+ return self if existing_dependency&.to_h == dep.to_h
30
+
31
+ if existing_dependency
32
+ dependencies[dependencies.index(existing_dependency)] =
33
+ combined_dependency(existing_dependency, dep)
34
+ else
35
+ dependencies << dep
36
+ end
37
+
38
+ self
39
+ end
40
+
41
+ def +(other)
42
+ unless other.is_a?(DependencySet)
43
+ raise ArgumentError, "must be a DependencySet"
44
+ end
45
+
46
+ other.dependencies.each { |dep| self << dep }
47
+ self
48
+ end
49
+
50
+ private
51
+
52
+ def combined_dependency(old_dep, new_dep)
53
+ package_manager = old_dep.package_manager
54
+ v_cls = Utils.version_class_for_package_manager(package_manager)
55
+
56
+ # If we already have a requirement use the existing version
57
+ # (if present). Otherwise, use whatever the lowest version is
58
+ new_version =
59
+ if old_dep.requirements.any? then old_dep.version || new_dep.version
60
+ elsif !v_cls.correct?(new_dep.version) then old_dep.version
61
+ elsif !v_cls.correct?(old_dep.version) then new_dep.version
62
+ elsif v_cls.new(new_dep.version) > v_cls.new(old_dep.version)
63
+ old_dep.version
64
+ else new_dep.version
65
+ end
66
+
67
+ Dependency.new(
68
+ name: old_dep.name,
69
+ version: new_version,
70
+ requirements: (old_dep.requirements + new_dep.requirements).uniq,
71
+ package_manager: package_manager
72
+ )
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,164 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "docker_registry2"
4
+
5
+ require "dependabot/dependency"
6
+ require "dependabot/file_parsers/base"
7
+ require "dependabot/errors"
8
+ require "dependabot/utils/docker/credentials_finder"
9
+
10
+ module Dependabot
11
+ module FileParsers
12
+ module Docker
13
+ class Docker < Dependabot::FileParsers::Base
14
+ require "dependabot/file_parsers/base/dependency_set"
15
+
16
+ # Detials of Docker regular expressions is at
17
+ # https://github.com/docker/distribution/blob/master/reference/regexp.go
18
+ DOMAIN_COMPONENT =
19
+ /(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])/.freeze
20
+ DOMAIN = /(?:#{DOMAIN_COMPONENT}(?:\.#{DOMAIN_COMPONENT})+)/.freeze
21
+ REGISTRY = /(?<registry>#{DOMAIN}(?::[0-9]+)?)/.freeze
22
+
23
+ NAME_COMPONENT = /(?:[a-z0-9]+(?:(?:[._]|__|[-]*)[a-z0-9]+)*)/.freeze
24
+ IMAGE = %r{(?<image>#{NAME_COMPONENT}(?:/#{NAME_COMPONENT})*)}.freeze
25
+
26
+ FROM = /[Ff][Rr][Oo][Mm]/.freeze
27
+ TAG = /:(?<tag>[\w][\w.-]{0,127})/.freeze
28
+ DIGEST = /@(?<digest>[^\s]+)/.freeze
29
+ NAME = /\s+AS\s+(?<name>[a-zA-Z0-9_-]+)/.freeze
30
+ FROM_LINE =
31
+ %r{^#{FROM}\s+(#{REGISTRY}/)?#{IMAGE}#{TAG}?#{DIGEST}?#{NAME}?}.freeze
32
+
33
+ AWS_ECR_URL = /dkr\.ecr\.(?<region>[^.]+).amazonaws\.com/.freeze
34
+
35
+ def parse
36
+ dependency_set = DependencySet.new
37
+
38
+ dockerfiles.each do |dockerfile|
39
+ dockerfile.content.each_line do |line|
40
+ next unless FROM_LINE.match?(line)
41
+
42
+ parsed_from_line = FROM_LINE.match(line).named_captures
43
+
44
+ version = version_from(parsed_from_line)
45
+ next unless version
46
+
47
+ dependency_set << Dependency.new(
48
+ name: parsed_from_line.fetch("image"),
49
+ version: version,
50
+ package_manager: "docker",
51
+ requirements: [
52
+ requirement: nil,
53
+ groups: [],
54
+ file: dockerfile.name,
55
+ source: source_from(parsed_from_line)
56
+ ]
57
+ )
58
+ end
59
+ end
60
+
61
+ dependency_set.dependencies
62
+ end
63
+
64
+ private
65
+
66
+ def dockerfiles
67
+ # The Docker file fetcher only fetches Dockerfiles, so no need to
68
+ # filter here
69
+ dependency_files
70
+ end
71
+
72
+ def version_from(parsed_from_line)
73
+ return parsed_from_line.fetch("tag") if parsed_from_line.fetch("tag")
74
+
75
+ version_from_digest(
76
+ registry: parsed_from_line.fetch("registry"),
77
+ image: parsed_from_line.fetch("image"),
78
+ digest: parsed_from_line.fetch("digest")
79
+ )
80
+ end
81
+
82
+ def source_from(parsed_from_line)
83
+ source = {}
84
+
85
+ if parsed_from_line.fetch("registry")
86
+ source[:registry] = parsed_from_line.fetch("registry")
87
+ end
88
+
89
+ if parsed_from_line.fetch("tag")
90
+ source[:tag] = parsed_from_line.fetch("tag")
91
+ end
92
+
93
+ if parsed_from_line.fetch("digest")
94
+ source[:digest] = parsed_from_line.fetch("digest")
95
+ end
96
+
97
+ source
98
+ end
99
+
100
+ def version_from_digest(registry:, image:, digest:)
101
+ return unless digest
102
+
103
+ repo = docker_repo_name(image, registry)
104
+ registry_client = docker_registry_client(registry)
105
+ registry_client.tags(repo).fetch("tags").find do |tag|
106
+ digest == registry_client.digest(repo, tag)
107
+ rescue DockerRegistry2::NotFound
108
+ # Shouldn't happen, but it does. Example of existing tag with
109
+ # no manifest is "library/python", "2-windowsservercore".
110
+ false
111
+ end
112
+ rescue DockerRegistry2::RegistryAuthenticationException,
113
+ RestClient::Forbidden
114
+ raise if standard_registry?(registry)
115
+
116
+ raise PrivateSourceAuthenticationFailure, registry
117
+ end
118
+
119
+ def docker_repo_name(image, registry)
120
+ return image unless standard_registry?(registry)
121
+ return image unless image.split("/").count < 2
122
+
123
+ "library/#{image}"
124
+ end
125
+
126
+ def docker_registry_client(registry)
127
+ if registry
128
+ credentials = registry_credentials(registry)
129
+
130
+ DockerRegistry2::Registry.new(
131
+ "https://#{registry}",
132
+ user: credentials&.fetch("username"),
133
+ password: credentials&.fetch("password")
134
+ )
135
+ else
136
+ DockerRegistry2::Registry.new("https://registry.hub.docker.com")
137
+ end
138
+ end
139
+
140
+ def registry_credentials(registry_url)
141
+ credentials_finder.credentials_for_registry(registry_url)
142
+ end
143
+
144
+ def credentials_finder
145
+ @credentials_finder ||=
146
+ Utils::Docker::CredentialsFinder.new(credentials)
147
+ end
148
+
149
+ def standard_registry?(registry)
150
+ return true if registry.nil?
151
+
152
+ registry == "registry.hub.docker.com"
153
+ end
154
+
155
+ def check_required_files
156
+ # Just check if there are any files at all.
157
+ return if dependency_files.any?
158
+
159
+ raise "No Dockerfile!"
160
+ end
161
+ end
162
+ end
163
+ end
164
+ end
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "nokogiri"
4
+
5
+ require "dependabot/dependency"
6
+ require "dependabot/file_parsers/base"
7
+
8
+ # For details on how dotnet handles version constraints, see:
9
+ # https://docs.microsoft.com/en-us/nuget/reference/package-versioning
10
+ module Dependabot
11
+ module FileParsers
12
+ module Dotnet
13
+ class Nuget < Dependabot::FileParsers::Base
14
+ require "dependabot/file_parsers/base/dependency_set"
15
+ require "dependabot/file_parsers/dotnet/nuget/project_file_parser"
16
+ require "dependabot/file_parsers/dotnet/nuget/packages_config_parser"
17
+
18
+ PACKAGE_CONF_DEPENDENCY_SELECTOR = "packages > packages"
19
+
20
+ def parse
21
+ dependency_set = DependencySet.new
22
+ dependency_set += project_file_dependencies
23
+ dependency_set += packages_config_dependencies
24
+ dependency_set.dependencies
25
+ end
26
+
27
+ private
28
+
29
+ def project_file_dependencies
30
+ dependency_set = DependencySet.new
31
+
32
+ (project_files + project_import_files).each do |file|
33
+ parser = project_file_parser
34
+ dependency_set += parser.dependency_set(project_file: file)
35
+ end
36
+
37
+ dependency_set
38
+ end
39
+
40
+ def packages_config_dependencies
41
+ dependency_set = DependencySet.new
42
+
43
+ packages_config_files.each do |file|
44
+ parser = PackagesConfigParser.new(packages_config: file)
45
+ dependency_set += parser.dependency_set
46
+ end
47
+
48
+ dependency_set
49
+ end
50
+
51
+ def project_file_parser
52
+ @project_file_parser ||=
53
+ ProjectFileParser.new(dependency_files: dependency_files)
54
+ end
55
+
56
+ def project_files
57
+ dependency_files.select { |df| df.name.match?(/\.[a-z]{2}proj$/) }
58
+ end
59
+
60
+ def packages_config_files
61
+ dependency_files.select do |f|
62
+ f.name.split("/").last.casecmp("packages.config").zero?
63
+ end
64
+ end
65
+
66
+ def project_import_files
67
+ dependency_files -
68
+ project_files -
69
+ packages_config_files -
70
+ [nuget_config]
71
+ end
72
+
73
+ def nuget_config
74
+ dependency_files.find { |f| f.name.casecmp("nuget.config").zero? }
75
+ end
76
+
77
+ def check_required_files
78
+ return if project_files.any? || packages_config_files.any?
79
+
80
+ raise "No project file or packages.config!"
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end