dependabot-core 0.76.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (321) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +6408 -0
  3. data/LICENSE +37 -0
  4. data/README.md +115 -0
  5. data/helpers/elixir/bin/check_update.exs +92 -0
  6. data/helpers/elixir/bin/do_update.exs +39 -0
  7. data/helpers/elixir/bin/parse_deps.exs +103 -0
  8. data/helpers/elixir/bin/run.exs +76 -0
  9. data/helpers/elixir/mix.exs +21 -0
  10. data/helpers/elixir/mix.lock +3 -0
  11. data/helpers/go/Makefile +9 -0
  12. data/helpers/go/go.mod +9 -0
  13. data/helpers/go/go.sum +5 -0
  14. data/helpers/go/importresolver/main.go +34 -0
  15. data/helpers/go/main.go +77 -0
  16. data/helpers/go/updatechecker/main.go +107 -0
  17. data/helpers/go/updater/go.mod +3 -0
  18. data/helpers/go/updater/go.sum +2 -0
  19. data/helpers/go/updater/helpers.go +57 -0
  20. data/helpers/go/updater/main.go +48 -0
  21. data/helpers/npm/.agignore +1 -0
  22. data/helpers/npm/.envrc +2 -0
  23. data/helpers/npm/.eslintrc +14 -0
  24. data/helpers/npm/.nvimrc +7 -0
  25. data/helpers/npm/bin/run.js +34 -0
  26. data/helpers/npm/lib/helpers.js +25 -0
  27. data/helpers/npm/lib/peer-dependency-checker.js +102 -0
  28. data/helpers/npm/lib/subdependency-updater.js +48 -0
  29. data/helpers/npm/lib/updater.js +95 -0
  30. data/helpers/npm/package.json +17 -0
  31. data/helpers/npm/test/fixtures/npm-left-pad.json +1 -0
  32. data/helpers/npm/test/fixtures/updater/original/package-lock.json +16 -0
  33. data/helpers/npm/test/fixtures/updater/original/package.json +9 -0
  34. data/helpers/npm/test/fixtures/updater/updated/package-lock.json +16 -0
  35. data/helpers/npm/test/helpers.js +7 -0
  36. data/helpers/npm/test/updater.test.js +50 -0
  37. data/helpers/npm/yarn.lock +6120 -0
  38. data/helpers/php/.php_cs +34 -0
  39. data/helpers/php/bin/run.php +57 -0
  40. data/helpers/php/composer.json +14 -0
  41. data/helpers/php/composer.lock +1521 -0
  42. data/helpers/php/composer.phar +0 -0
  43. data/helpers/php/setup.sh +4 -0
  44. data/helpers/php/src/DependabotInstallationManager.php +61 -0
  45. data/helpers/php/src/DependabotPluginManager.php +23 -0
  46. data/helpers/php/src/ExceptionIO.php +25 -0
  47. data/helpers/php/src/Hasher.php +21 -0
  48. data/helpers/php/src/UpdateChecker.php +123 -0
  49. data/helpers/php/src/Updater.php +97 -0
  50. data/helpers/python/lib/__init__.py +0 -0
  51. data/helpers/python/lib/hasher.py +23 -0
  52. data/helpers/python/lib/parser.py +130 -0
  53. data/helpers/python/requirements.txt +9 -0
  54. data/helpers/python/run.py +18 -0
  55. data/helpers/test/run.rb +15 -0
  56. data/helpers/utils/git-credential-store-immutable +10 -0
  57. data/helpers/yarn/.agignore +1 -0
  58. data/helpers/yarn/.envrc +2 -0
  59. data/helpers/yarn/.eslintrc +14 -0
  60. data/helpers/yarn/.nvimrc +7 -0
  61. data/helpers/yarn/bin/run.js +36 -0
  62. data/helpers/yarn/lib/fix-duplicates.js +53 -0
  63. data/helpers/yarn/lib/helpers.js +5 -0
  64. data/helpers/yarn/lib/lockfile-parser.js +21 -0
  65. data/helpers/yarn/lib/peer-dependency-checker.js +130 -0
  66. data/helpers/yarn/lib/replace-lockfile-declaration.js +45 -0
  67. data/helpers/yarn/lib/subdependency-updater.js +69 -0
  68. data/helpers/yarn/lib/updater.js +254 -0
  69. data/helpers/yarn/package.json +17 -0
  70. data/helpers/yarn/test/fixtures/updater/original/package.json +6 -0
  71. data/helpers/yarn/test/fixtures/updater/original/yarn.lock +11 -0
  72. data/helpers/yarn/test/fixtures/updater/updated/yarn.lock +12 -0
  73. data/helpers/yarn/test/fixtures/updater/with-version-comments/package.json +5 -0
  74. data/helpers/yarn/test/fixtures/updater/with-version-comments/yarn.lock +13 -0
  75. data/helpers/yarn/test/fixtures/yarnpkg-is-positive.json +1 -0
  76. data/helpers/yarn/test/fixtures/yarnpkg-left-pad.json +1 -0
  77. data/helpers/yarn/test/helpers.js +7 -0
  78. data/helpers/yarn/test/updater.test.js +93 -0
  79. data/helpers/yarn/yarn.lock +4912 -0
  80. data/lib/bundler_definition_bundler_version_patch.rb +15 -0
  81. data/lib/bundler_definition_ruby_version_patch.rb +14 -0
  82. data/lib/bundler_git_source_patch.rb +27 -0
  83. data/lib/dependabot.rb +4 -0
  84. data/lib/dependabot/clients/bitbucket.rb +101 -0
  85. data/lib/dependabot/clients/github_with_retries.rb +117 -0
  86. data/lib/dependabot/clients/gitlab.rb +72 -0
  87. data/lib/dependabot/dependency.rb +118 -0
  88. data/lib/dependabot/dependency_file.rb +54 -0
  89. data/lib/dependabot/errors.rb +179 -0
  90. data/lib/dependabot/file_fetchers.rb +48 -0
  91. data/lib/dependabot/file_fetchers/README.md +65 -0
  92. data/lib/dependabot/file_fetchers/base.rb +302 -0
  93. data/lib/dependabot/file_fetchers/docker/docker.rb +40 -0
  94. data/lib/dependabot/file_fetchers/dotnet/nuget.rb +215 -0
  95. data/lib/dependabot/file_fetchers/dotnet/nuget/import_paths_finder.rb +51 -0
  96. data/lib/dependabot/file_fetchers/dotnet/nuget/sln_project_paths_finder.rb +55 -0
  97. data/lib/dependabot/file_fetchers/elixir/hex.rb +78 -0
  98. data/lib/dependabot/file_fetchers/elm/elm_package.rb +52 -0
  99. data/lib/dependabot/file_fetchers/git/submodules.rb +73 -0
  100. data/lib/dependabot/file_fetchers/go/dep.rb +69 -0
  101. data/lib/dependabot/file_fetchers/go/modules.rb +64 -0
  102. data/lib/dependabot/file_fetchers/java/gradle.rb +56 -0
  103. data/lib/dependabot/file_fetchers/java/gradle/settings_file_parser.rb +66 -0
  104. data/lib/dependabot/file_fetchers/java/maven.rb +127 -0
  105. data/lib/dependabot/file_fetchers/java_script/npm_and_yarn.rb +330 -0
  106. data/lib/dependabot/file_fetchers/java_script/npm_and_yarn/path_dependency_builder.rb +107 -0
  107. data/lib/dependabot/file_fetchers/php/composer.rb +131 -0
  108. data/lib/dependabot/file_fetchers/python/pip.rb +305 -0
  109. data/lib/dependabot/file_fetchers/ruby/bundler.rb +185 -0
  110. data/lib/dependabot/file_fetchers/ruby/bundler/child_gemfile_finder.rb +70 -0
  111. data/lib/dependabot/file_fetchers/ruby/bundler/path_gemspec_finder.rb +114 -0
  112. data/lib/dependabot/file_fetchers/ruby/bundler/require_relative_finder.rb +67 -0
  113. data/lib/dependabot/file_fetchers/rust/cargo.rb +240 -0
  114. data/lib/dependabot/file_parsers.rb +48 -0
  115. data/lib/dependabot/file_parsers/README.md +45 -0
  116. data/lib/dependabot/file_parsers/base.rb +31 -0
  117. data/lib/dependabot/file_parsers/base/dependency_set.rb +77 -0
  118. data/lib/dependabot/file_parsers/docker/docker.rb +164 -0
  119. data/lib/dependabot/file_parsers/dotnet/nuget.rb +85 -0
  120. data/lib/dependabot/file_parsers/dotnet/nuget/packages_config_parser.rb +65 -0
  121. data/lib/dependabot/file_parsers/dotnet/nuget/project_file_parser.rb +156 -0
  122. data/lib/dependabot/file_parsers/dotnet/nuget/property_value_finder.rb +131 -0
  123. data/lib/dependabot/file_parsers/elixir/hex.rb +134 -0
  124. data/lib/dependabot/file_parsers/elm/elm_package.rb +136 -0
  125. data/lib/dependabot/file_parsers/git/submodules.rb +69 -0
  126. data/lib/dependabot/file_parsers/go/dep.rb +163 -0
  127. data/lib/dependabot/file_parsers/go/modules.rb +34 -0
  128. data/lib/dependabot/file_parsers/go/modules/go_mod_parser.rb +134 -0
  129. data/lib/dependabot/file_parsers/java/gradle.rb +236 -0
  130. data/lib/dependabot/file_parsers/java/gradle/property_value_finder.rb +90 -0
  131. data/lib/dependabot/file_parsers/java/gradle/repositories_finder.rb +145 -0
  132. data/lib/dependabot/file_parsers/java/maven.rb +252 -0
  133. data/lib/dependabot/file_parsers/java/maven/property_value_finder.rb +166 -0
  134. data/lib/dependabot/file_parsers/java/maven/repositories_finder.rb +188 -0
  135. data/lib/dependabot/file_parsers/java_script/npm_and_yarn.rb +394 -0
  136. data/lib/dependabot/file_parsers/php/composer.rb +177 -0
  137. data/lib/dependabot/file_parsers/python/pip.rb +223 -0
  138. data/lib/dependabot/file_parsers/python/pip/pipfile_files_parser.rb +154 -0
  139. data/lib/dependabot/file_parsers/python/pip/poetry_files_parser.rb +141 -0
  140. data/lib/dependabot/file_parsers/python/pip/setup_file_parser.rb +160 -0
  141. data/lib/dependabot/file_parsers/ruby/bundler.rb +295 -0
  142. data/lib/dependabot/file_parsers/ruby/bundler/file_preparer.rb +85 -0
  143. data/lib/dependabot/file_parsers/ruby/bundler/gemfile_checker.rb +48 -0
  144. data/lib/dependabot/file_parsers/rust/cargo.rb +213 -0
  145. data/lib/dependabot/file_updaters.rb +48 -0
  146. data/lib/dependabot/file_updaters/README.md +58 -0
  147. data/lib/dependabot/file_updaters/base.rb +52 -0
  148. data/lib/dependabot/file_updaters/docker/docker.rb +133 -0
  149. data/lib/dependabot/file_updaters/dotnet/nuget.rb +151 -0
  150. data/lib/dependabot/file_updaters/dotnet/nuget/packages_config_declaration_finder.rb +69 -0
  151. data/lib/dependabot/file_updaters/dotnet/nuget/project_file_declaration_finder.rb +78 -0
  152. data/lib/dependabot/file_updaters/dotnet/nuget/property_value_updater.rb +64 -0
  153. data/lib/dependabot/file_updaters/elixir/hex.rb +71 -0
  154. data/lib/dependabot/file_updaters/elixir/hex/lockfile_updater.rb +147 -0
  155. data/lib/dependabot/file_updaters/elixir/hex/mixfile_git_pin_updater.rb +53 -0
  156. data/lib/dependabot/file_updaters/elixir/hex/mixfile_requirement_updater.rb +74 -0
  157. data/lib/dependabot/file_updaters/elixir/hex/mixfile_sanitizer.rb +28 -0
  158. data/lib/dependabot/file_updaters/elixir/hex/mixfile_updater.rb +98 -0
  159. data/lib/dependabot/file_updaters/elm/elm_package.rb +79 -0
  160. data/lib/dependabot/file_updaters/elm/elm_package/elm_json_updater.rb +69 -0
  161. data/lib/dependabot/file_updaters/elm/elm_package/elm_package_updater.rb +69 -0
  162. data/lib/dependabot/file_updaters/git/submodules.rb +38 -0
  163. data/lib/dependabot/file_updaters/go/dep.rb +77 -0
  164. data/lib/dependabot/file_updaters/go/dep/lockfile_updater.rb +219 -0
  165. data/lib/dependabot/file_updaters/go/dep/manifest_updater.rb +155 -0
  166. data/lib/dependabot/file_updaters/go/modules.rb +71 -0
  167. data/lib/dependabot/file_updaters/go/modules/go_mod_updater.rb +81 -0
  168. data/lib/dependabot/file_updaters/java/gradle.rb +176 -0
  169. data/lib/dependabot/file_updaters/java/gradle/dependency_set_updater.rb +66 -0
  170. data/lib/dependabot/file_updaters/java/gradle/property_value_updater.rb +58 -0
  171. data/lib/dependabot/file_updaters/java/maven.rb +155 -0
  172. data/lib/dependabot/file_updaters/java/maven/declaration_finder.rb +132 -0
  173. data/lib/dependabot/file_updaters/java/maven/property_value_updater.rb +61 -0
  174. data/lib/dependabot/file_updaters/java_script/npm_and_yarn.rb +159 -0
  175. data/lib/dependabot/file_updaters/java_script/npm_and_yarn/npm_lockfile_updater.rb +532 -0
  176. data/lib/dependabot/file_updaters/java_script/npm_and_yarn/npmrc_builder.rb +191 -0
  177. data/lib/dependabot/file_updaters/java_script/npm_and_yarn/package_json_preparer.rb +91 -0
  178. data/lib/dependabot/file_updaters/java_script/npm_and_yarn/package_json_updater.rb +220 -0
  179. data/lib/dependabot/file_updaters/java_script/npm_and_yarn/yarn_lockfile_updater.rb +475 -0
  180. data/lib/dependabot/file_updaters/php/composer.rb +78 -0
  181. data/lib/dependabot/file_updaters/php/composer/lockfile_updater.rb +264 -0
  182. data/lib/dependabot/file_updaters/php/composer/manifest_updater.rb +70 -0
  183. data/lib/dependabot/file_updaters/python/pip.rb +147 -0
  184. data/lib/dependabot/file_updaters/python/pip/pip_compile_file_updater.rb +363 -0
  185. data/lib/dependabot/file_updaters/python/pip/pipfile_file_updater.rb +397 -0
  186. data/lib/dependabot/file_updaters/python/pip/pipfile_preparer.rb +125 -0
  187. data/lib/dependabot/file_updaters/python/pip/poetry_file_updater.rb +289 -0
  188. data/lib/dependabot/file_updaters/python/pip/pyproject_preparer.rb +105 -0
  189. data/lib/dependabot/file_updaters/python/pip/requirement_file_updater.rb +166 -0
  190. data/lib/dependabot/file_updaters/python/pip/requirement_replacer.rb +95 -0
  191. data/lib/dependabot/file_updaters/python/pip/setup_file_sanitizer.rb +91 -0
  192. data/lib/dependabot/file_updaters/ruby/bundler.rb +121 -0
  193. data/lib/dependabot/file_updaters/ruby/bundler/gemfile_updater.rb +116 -0
  194. data/lib/dependabot/file_updaters/ruby/bundler/gemspec_dependency_name_finder.rb +52 -0
  195. data/lib/dependabot/file_updaters/ruby/bundler/gemspec_sanitizer.rb +298 -0
  196. data/lib/dependabot/file_updaters/ruby/bundler/gemspec_updater.rb +64 -0
  197. data/lib/dependabot/file_updaters/ruby/bundler/git_pin_replacer.rb +80 -0
  198. data/lib/dependabot/file_updaters/ruby/bundler/git_source_remover.rb +102 -0
  199. data/lib/dependabot/file_updaters/ruby/bundler/lockfile_updater.rb +384 -0
  200. data/lib/dependabot/file_updaters/ruby/bundler/requirement_replacer.rb +188 -0
  201. data/lib/dependabot/file_updaters/rust/cargo.rb +83 -0
  202. data/lib/dependabot/file_updaters/rust/cargo/lockfile_updater.rb +251 -0
  203. data/lib/dependabot/file_updaters/rust/cargo/manifest_updater.rb +162 -0
  204. data/lib/dependabot/git_commit_checker.rb +412 -0
  205. data/lib/dependabot/metadata_finders.rb +46 -0
  206. data/lib/dependabot/metadata_finders/README.md +53 -0
  207. data/lib/dependabot/metadata_finders/base.rb +117 -0
  208. data/lib/dependabot/metadata_finders/base/changelog_finder.rb +317 -0
  209. data/lib/dependabot/metadata_finders/base/changelog_pruner.rb +177 -0
  210. data/lib/dependabot/metadata_finders/base/commits_finder.rb +217 -0
  211. data/lib/dependabot/metadata_finders/base/release_finder.rb +251 -0
  212. data/lib/dependabot/metadata_finders/docker/docker.rb +18 -0
  213. data/lib/dependabot/metadata_finders/dotnet/nuget.rb +116 -0
  214. data/lib/dependabot/metadata_finders/elixir/hex.rb +69 -0
  215. data/lib/dependabot/metadata_finders/elm/elm_package.rb +22 -0
  216. data/lib/dependabot/metadata_finders/git/submodules.rb +20 -0
  217. data/lib/dependabot/metadata_finders/go/dep.rb +56 -0
  218. data/lib/dependabot/metadata_finders/java/maven.rb +173 -0
  219. data/lib/dependabot/metadata_finders/java_script/npm_and_yarn.rb +215 -0
  220. data/lib/dependabot/metadata_finders/php/composer.rb +66 -0
  221. data/lib/dependabot/metadata_finders/python/pip.rb +120 -0
  222. data/lib/dependabot/metadata_finders/ruby/bundler.rb +150 -0
  223. data/lib/dependabot/metadata_finders/rust/cargo.rb +64 -0
  224. data/lib/dependabot/pull_request_creator.rb +151 -0
  225. data/lib/dependabot/pull_request_creator/branch_namer.rb +170 -0
  226. data/lib/dependabot/pull_request_creator/commit_signer.rb +63 -0
  227. data/lib/dependabot/pull_request_creator/github.rb +233 -0
  228. data/lib/dependabot/pull_request_creator/gitlab.rb +122 -0
  229. data/lib/dependabot/pull_request_creator/labeler.rb +361 -0
  230. data/lib/dependabot/pull_request_creator/message_builder.rb +888 -0
  231. data/lib/dependabot/pull_request_updater.rb +43 -0
  232. data/lib/dependabot/pull_request_updater/github.rb +151 -0
  233. data/lib/dependabot/shared_helpers.rb +201 -0
  234. data/lib/dependabot/source.rb +120 -0
  235. data/lib/dependabot/update_checkers.rb +48 -0
  236. data/lib/dependabot/update_checkers/README.md +67 -0
  237. data/lib/dependabot/update_checkers/base.rb +220 -0
  238. data/lib/dependabot/update_checkers/docker/docker.rb +290 -0
  239. data/lib/dependabot/update_checkers/dotnet/nuget.rb +127 -0
  240. data/lib/dependabot/update_checkers/dotnet/nuget/property_updater.rb +97 -0
  241. data/lib/dependabot/update_checkers/dotnet/nuget/repository_finder.rb +232 -0
  242. data/lib/dependabot/update_checkers/dotnet/nuget/requirements_updater.rb +81 -0
  243. data/lib/dependabot/update_checkers/dotnet/nuget/version_finder.rb +231 -0
  244. data/lib/dependabot/update_checkers/elixir/hex.rb +274 -0
  245. data/lib/dependabot/update_checkers/elixir/hex/file_preparer.rb +193 -0
  246. data/lib/dependabot/update_checkers/elixir/hex/requirements_updater.rb +177 -0
  247. data/lib/dependabot/update_checkers/elixir/hex/version_resolver.rb +175 -0
  248. data/lib/dependabot/update_checkers/elm/elm_package.rb +126 -0
  249. data/lib/dependabot/update_checkers/elm/elm_package/cli_parser.rb +33 -0
  250. data/lib/dependabot/update_checkers/elm/elm_package/elm_18_version_resolver.rb +234 -0
  251. data/lib/dependabot/update_checkers/elm/elm_package/elm_19_version_resolver.rb +198 -0
  252. data/lib/dependabot/update_checkers/elm/elm_package/requirements_updater.rb +75 -0
  253. data/lib/dependabot/update_checkers/git/submodules.rb +52 -0
  254. data/lib/dependabot/update_checkers/go/dep.rb +311 -0
  255. data/lib/dependabot/update_checkers/go/dep/file_preparer.rb +221 -0
  256. data/lib/dependabot/update_checkers/go/dep/latest_version_finder.rb +169 -0
  257. data/lib/dependabot/update_checkers/go/dep/requirements_updater.rb +223 -0
  258. data/lib/dependabot/update_checkers/go/dep/version_resolver.rb +164 -0
  259. data/lib/dependabot/update_checkers/go/modules.rb +112 -0
  260. data/lib/dependabot/update_checkers/java/gradle.rb +148 -0
  261. data/lib/dependabot/update_checkers/java/gradle/multi_dependency_updater.rb +105 -0
  262. data/lib/dependabot/update_checkers/java/gradle/version_finder.rb +183 -0
  263. data/lib/dependabot/update_checkers/java/maven.rb +159 -0
  264. data/lib/dependabot/update_checkers/java/maven/property_updater.rb +127 -0
  265. data/lib/dependabot/update_checkers/java/maven/requirements_updater.rb +92 -0
  266. data/lib/dependabot/update_checkers/java/maven/version_finder.rb +225 -0
  267. data/lib/dependabot/update_checkers/java_script/npm_and_yarn.rb +280 -0
  268. data/lib/dependabot/update_checkers/java_script/npm_and_yarn/latest_version_finder.rb +342 -0
  269. data/lib/dependabot/update_checkers/java_script/npm_and_yarn/library_detector.rb +69 -0
  270. data/lib/dependabot/update_checkers/java_script/npm_and_yarn/registry_finder.rb +226 -0
  271. data/lib/dependabot/update_checkers/java_script/npm_and_yarn/requirements_updater.rb +197 -0
  272. data/lib/dependabot/update_checkers/java_script/npm_and_yarn/subdependency_version_resolver.rb +228 -0
  273. data/lib/dependabot/update_checkers/java_script/npm_and_yarn/version_resolver.rb +452 -0
  274. data/lib/dependabot/update_checkers/php/composer.rb +165 -0
  275. data/lib/dependabot/update_checkers/php/composer/requirements_updater.rb +243 -0
  276. data/lib/dependabot/update_checkers/php/composer/version_resolver.rb +203 -0
  277. data/lib/dependabot/update_checkers/python/pip.rb +227 -0
  278. data/lib/dependabot/update_checkers/python/pip/latest_version_finder.rb +252 -0
  279. data/lib/dependabot/update_checkers/python/pip/pip_compile_version_resolver.rb +380 -0
  280. data/lib/dependabot/update_checkers/python/pip/pipfile_version_resolver.rb +559 -0
  281. data/lib/dependabot/update_checkers/python/pip/poetry_version_resolver.rb +300 -0
  282. data/lib/dependabot/update_checkers/python/pip/requirements_updater.rb +367 -0
  283. data/lib/dependabot/update_checkers/ruby/bundler.rb +324 -0
  284. data/lib/dependabot/update_checkers/ruby/bundler/file_preparer.rb +278 -0
  285. data/lib/dependabot/update_checkers/ruby/bundler/force_updater.rb +261 -0
  286. data/lib/dependabot/update_checkers/ruby/bundler/latest_version_finder.rb +169 -0
  287. data/lib/dependabot/update_checkers/ruby/bundler/requirements_updater.rb +264 -0
  288. data/lib/dependabot/update_checkers/ruby/bundler/ruby_requirement_setter.rb +115 -0
  289. data/lib/dependabot/update_checkers/ruby/bundler/shared_bundler_helpers.rb +243 -0
  290. data/lib/dependabot/update_checkers/ruby/bundler/version_resolver.rb +255 -0
  291. data/lib/dependabot/update_checkers/rust/cargo.rb +282 -0
  292. data/lib/dependabot/update_checkers/rust/cargo/file_preparer.rb +202 -0
  293. data/lib/dependabot/update_checkers/rust/cargo/requirements_updater.rb +175 -0
  294. data/lib/dependabot/update_checkers/rust/cargo/version_resolver.rb +242 -0
  295. data/lib/dependabot/utils.rb +84 -0
  296. data/lib/dependabot/utils/docker/credentials_finder.rb +65 -0
  297. data/lib/dependabot/utils/dotnet/requirement.rb +90 -0
  298. data/lib/dependabot/utils/dotnet/version.rb +22 -0
  299. data/lib/dependabot/utils/elixir/requirement.rb +53 -0
  300. data/lib/dependabot/utils/elixir/version.rb +59 -0
  301. data/lib/dependabot/utils/elm/requirement.rb +92 -0
  302. data/lib/dependabot/utils/elm/version.rb +19 -0
  303. data/lib/dependabot/utils/go/path_converter.rb +74 -0
  304. data/lib/dependabot/utils/go/requirement.rb +152 -0
  305. data/lib/dependabot/utils/go/shared_helper.rb +20 -0
  306. data/lib/dependabot/utils/go/version.rb +40 -0
  307. data/lib/dependabot/utils/java/requirement.rb +110 -0
  308. data/lib/dependabot/utils/java/version.rb +179 -0
  309. data/lib/dependabot/utils/java_script/requirement.rb +117 -0
  310. data/lib/dependabot/utils/java_script/version.rb +30 -0
  311. data/lib/dependabot/utils/php/requirement.rb +97 -0
  312. data/lib/dependabot/utils/php/version.rb +22 -0
  313. data/lib/dependabot/utils/python/requirement.rb +130 -0
  314. data/lib/dependabot/utils/python/version.rb +88 -0
  315. data/lib/dependabot/utils/ruby/requirement.rb +26 -0
  316. data/lib/dependabot/utils/rust/requirement.rb +108 -0
  317. data/lib/dependabot/utils/rust/version.rb +32 -0
  318. data/lib/dependabot/version.rb +5 -0
  319. data/lib/python_requirement_parser.rb +33 -0
  320. data/lib/python_versions.rb +21 -0
  321. metadata +641 -0
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "nokogiri"
4
+
5
+ require "dependabot/dependency"
6
+ require "dependabot/file_parsers/dotnet/nuget"
7
+
8
+ # For details on packages.config files see:
9
+ # https://docs.microsoft.com/en-us/nuget/reference/packages-config
10
+ module Dependabot
11
+ module FileParsers
12
+ module Dotnet
13
+ class Nuget
14
+ class PackagesConfigParser
15
+ require "dependabot/file_parsers/base/dependency_set"
16
+
17
+ DEPENDENCY_SELECTOR = "packages > package"
18
+
19
+ def initialize(packages_config:)
20
+ @packages_config = packages_config
21
+ end
22
+
23
+ def dependency_set
24
+ dependency_set = Dependabot::FileParsers::Base::DependencySet.new
25
+
26
+ doc = Nokogiri::XML(packages_config.content)
27
+ doc.remove_namespaces!
28
+ doc.css(DEPENDENCY_SELECTOR).each do |dependency_node|
29
+ dependency_set <<
30
+ Dependency.new(
31
+ name: dependency_name(dependency_node),
32
+ version: dependency_version(dependency_node),
33
+ package_manager: "nuget",
34
+ requirements: [{
35
+ requirement: dependency_version(dependency_node),
36
+ file: packages_config.name,
37
+ groups: [],
38
+ source: nil
39
+ }]
40
+ )
41
+ end
42
+
43
+ dependency_set
44
+ end
45
+
46
+ private
47
+
48
+ attr_reader :packages_config
49
+
50
+ def dependency_name(dependency_node)
51
+ dependency_node.attribute("id")&.value&.strip ||
52
+ dependency_node.at_xpath("./id")&.content&.strip
53
+ end
54
+
55
+ def dependency_version(dependency_node)
56
+ # Ranges and wildcards aren't allowed in a packages.config - the
57
+ # specified requirement is always an exact version.
58
+ dependency_node.attribute("version")&.value&.strip ||
59
+ dependency_node.at_xpath("./version")&.content&.strip
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,156 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "nokogiri"
4
+
5
+ require "dependabot/dependency"
6
+ require "dependabot/file_parsers/dotnet/nuget"
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
14
+ class ProjectFileParser
15
+ require "dependabot/file_parsers/base/dependency_set"
16
+ require_relative "property_value_finder"
17
+
18
+ DEPENDENCY_SELECTOR = "ItemGroup > PackageReference, "\
19
+ "ItemGroup > Dependency, "\
20
+ "ItemGroup > DevelopmentDependency"
21
+
22
+ PROPERTY_REGEX = /\$\((?<property>.*?)\)/.freeze
23
+
24
+ def initialize(dependency_files:)
25
+ @dependency_files = dependency_files
26
+ end
27
+
28
+ def dependency_set(project_file:)
29
+ dependency_set = Dependabot::FileParsers::Base::DependencySet.new
30
+
31
+ doc = Nokogiri::XML(project_file.content)
32
+ doc.remove_namespaces!
33
+ doc.css(DEPENDENCY_SELECTOR).each do |dependency_node|
34
+ name = dependency_name(dependency_node, project_file)
35
+ req = dependency_requirement(dependency_node, project_file)
36
+ version = dependency_version(dependency_node, project_file)
37
+ prop_name = req_property_name(dependency_node)
38
+
39
+ dependency =
40
+ build_dependency(name, req, version, prop_name, project_file)
41
+ dependency_set << dependency if dependency
42
+ end
43
+
44
+ dependency_set
45
+ end
46
+
47
+ private
48
+
49
+ attr_reader :dependency_files
50
+
51
+ def build_dependency(name, req, version, prop_name, project_file)
52
+ return unless name
53
+
54
+ # Exclude any dependencies specified using interpolation
55
+ return if [name, req, version].any? { |s| s&.include?("%(") }
56
+
57
+ requirement = {
58
+ requirement: req,
59
+ file: project_file.name,
60
+ groups: [],
61
+ source: nil
62
+ }
63
+
64
+ if prop_name
65
+ # Get the root property name unless no details could be found,
66
+ # in which case use the top-level name to ease debugging
67
+ root_prop_name = details_for_property(prop_name, project_file)&.
68
+ fetch(:root_property_name) || prop_name
69
+ requirement[:metadata] = { property_name: root_prop_name }
70
+ end
71
+
72
+ Dependency.new(
73
+ name: name,
74
+ version: version,
75
+ package_manager: "nuget",
76
+ requirements: [requirement]
77
+ )
78
+ end
79
+
80
+ def dependency_name(dependency_node, project_file)
81
+ raw_name =
82
+ dependency_node.attribute("Include")&.value&.strip ||
83
+ dependency_node.at_xpath("./Include")&.content&.strip
84
+ return unless raw_name
85
+
86
+ evaluated_value(raw_name, project_file)
87
+ end
88
+
89
+ def dependency_requirement(dependency_node, project_file)
90
+ raw_requirement =
91
+ dependency_node.attribute("Version")&.value&.strip ||
92
+ dependency_node.at_xpath("./Version")&.content&.strip
93
+ return unless raw_requirement
94
+
95
+ evaluated_value(raw_requirement, project_file)
96
+ end
97
+
98
+ def dependency_version(dependency_node, project_file)
99
+ requirement = dependency_requirement(dependency_node, project_file)
100
+ return unless requirement
101
+
102
+ # Remove brackets if present
103
+ version = requirement.gsub(/[\(\)\[\]]/, "").strip
104
+
105
+ # We don't know the version for range requirements or wildcard
106
+ # requirements, so return `nil` for these.
107
+ return if version.include?(",") || version.include?("*") ||
108
+ version == ""
109
+
110
+ version
111
+ end
112
+
113
+ def req_property_name(dependency_node)
114
+ raw_requirement =
115
+ dependency_node.attribute("Version")&.value&.strip ||
116
+ dependency_node.at_xpath("./Version")&.content&.strip
117
+ return unless raw_requirement
118
+
119
+ return unless raw_requirement.match?(PROPERTY_REGEX)
120
+
121
+ raw_requirement.
122
+ match(PROPERTY_REGEX).
123
+ named_captures.fetch("property")
124
+ end
125
+
126
+ def evaluated_value(value, project_file)
127
+ return value unless value.match?(PROPERTY_REGEX)
128
+
129
+ property_name = value.match(PROPERTY_REGEX).
130
+ named_captures.fetch("property")
131
+ property_details = details_for_property(property_name, project_file)
132
+
133
+ # Don't halt parsing for a missing property value until we're
134
+ # confident we're fetching property values correctly
135
+ return value unless property_details&.fetch(:value)
136
+
137
+ value.gsub(PROPERTY_REGEX, property_details&.fetch(:value))
138
+ end
139
+
140
+ def details_for_property(property_name, project_file)
141
+ property_value_finder.
142
+ property_details(
143
+ property_name: property_name,
144
+ callsite_file: project_file
145
+ )
146
+ end
147
+
148
+ def property_value_finder
149
+ @property_value_finder ||=
150
+ PropertyValueFinder.new(dependency_files: dependency_files)
151
+ end
152
+ end
153
+ end
154
+ end
155
+ end
156
+ end
@@ -0,0 +1,131 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_fetchers/dotnet/nuget/import_paths_finder"
4
+ require "dependabot/file_parsers/dotnet/nuget"
5
+
6
+ # For docs, see:
7
+ # - https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-properties
8
+ # - https://docs.microsoft.com/en-us/visualstudio/msbuild/customize-your-build
9
+ module Dependabot
10
+ module FileParsers
11
+ module Dotnet
12
+ class Nuget
13
+ class PropertyValueFinder
14
+ PROPERTY_REGEX = /\$\((?<property>.*?)\)/.freeze
15
+
16
+ def initialize(dependency_files:)
17
+ @dependency_files = dependency_files
18
+ end
19
+
20
+ def property_details(property_name:, callsite_file:, stack: [])
21
+ stack += [[property_name, callsite_file.name]]
22
+
23
+ node_details = deep_find_prop_node(
24
+ property: property_name,
25
+ file: callsite_file
26
+ )
27
+
28
+ node_details ||=
29
+ find_property_in_directory_build_props(
30
+ property: property_name,
31
+ callsite_file: callsite_file
32
+ )
33
+
34
+ return unless node_details
35
+ return node_details unless node_details[:value] =~ PROPERTY_REGEX
36
+
37
+ check_next_level_of_stack(node_details, stack)
38
+ end
39
+
40
+ def check_next_level_of_stack(node_details, stack)
41
+ property_name = node_details.fetch(:value).
42
+ match(PROPERTY_REGEX).
43
+ named_captures.fetch("property")
44
+ callsite_file = dependency_files.
45
+ find { |f| f.name == node_details.fetch(:file) }
46
+
47
+ if stack.include?([property_name, callsite_file.name])
48
+ raise "Circular reference!"
49
+ end
50
+
51
+ property_details(
52
+ property_name: property_name,
53
+ callsite_file: callsite_file,
54
+ stack: stack
55
+ )
56
+ end
57
+
58
+ private
59
+
60
+ attr_reader :dependency_files
61
+
62
+ def deep_find_prop_node(property:, file:)
63
+ doc = Nokogiri::XML(file.content)
64
+ doc.remove_namespaces!
65
+ node = doc.at_xpath(property_xpath(property))
66
+
67
+ # If we found a value for the property, return it
68
+ if node
69
+ return node_details(file: file, node: node, property: property)
70
+ end
71
+
72
+ # Otherwise, we need to look in an imported file
73
+ import_path_finder =
74
+ FileFetchers::Dotnet::Nuget::ImportPathsFinder.
75
+ new(project_file: file)
76
+
77
+ import_paths = [
78
+ *import_path_finder.import_paths,
79
+ *import_path_finder.project_reference_paths
80
+ ]
81
+
82
+ file = import_paths.
83
+ map { |p| dependency_files.find { |f| f.name == p } }.
84
+ compact.
85
+ find { |f| deep_find_prop_node(property: property, file: f) }
86
+
87
+ return unless file
88
+
89
+ deep_find_prop_node(property: property, file: file)
90
+ end
91
+
92
+ def find_property_in_directory_build_props(property:, callsite_file:)
93
+ file = buildfile_for_project(callsite_file)
94
+ return unless file
95
+
96
+ deep_find_prop_node(property: property, file: file)
97
+ end
98
+
99
+ def buildfile_for_project(project_file)
100
+ dir = File.dirname(project_file.name)
101
+
102
+ # Nuget walks up the directory structure looking for a
103
+ # Directory.Build.props file
104
+ possible_paths = dir.split("/").map.with_index do |_, i|
105
+ base = dir.split("/").first(i + 1).join("/")
106
+ Pathname.new(base + "/Directory.Build.props").cleanpath.to_path
107
+ end.reverse + ["Directory.Build.props"]
108
+
109
+ path = possible_paths.uniq.
110
+ find { |p| dependency_files.find { |f| f.name == p } }
111
+
112
+ dependency_files.find { |f| f.name == path }
113
+ end
114
+
115
+ def property_xpath(property_name)
116
+ "/Project/PropertyGroup/#{property_name}"
117
+ end
118
+
119
+ def node_details(file:, node:, property:)
120
+ {
121
+ file: file.name,
122
+ node: node,
123
+ value: node.content.strip,
124
+ root_property_name: property
125
+ }
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,134 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/dependency"
4
+ require "dependabot/file_parsers/base"
5
+ require "dependabot/file_fetchers/elixir/hex"
6
+ require "dependabot/shared_helpers"
7
+ require "dependabot/errors"
8
+
9
+ # For docs, see https://hexdocs.pm/mix/Mix.Tasks.Deps.html
10
+ module Dependabot
11
+ module FileParsers
12
+ module Elixir
13
+ class Hex < Dependabot::FileParsers::Base
14
+ require "dependabot/file_parsers/base/dependency_set"
15
+
16
+ def parse
17
+ dependency_set = DependencySet.new
18
+
19
+ dependency_details.each do |dep|
20
+ git_dependency = dep["source"]&.fetch("type") == "git"
21
+
22
+ dependency_set <<
23
+ Dependency.new(
24
+ name: dep["name"],
25
+ version: git_dependency ? dep["checksum"] : dep["version"],
26
+ requirements: [{
27
+ requirement: dep["requirement"],
28
+ groups: dep["groups"],
29
+ source: dep["source"] && symbolize_keys(dep["source"]),
30
+ file: dep["from"]
31
+ }],
32
+ package_manager: "hex"
33
+ )
34
+ end
35
+
36
+ dependency_set.dependencies.sort_by(&:name)
37
+ end
38
+
39
+ private
40
+
41
+ def dependency_details
42
+ SharedHelpers.in_a_temporary_directory do
43
+ write_sanitized_mixfiles
44
+ write_supporting_files
45
+ File.write("mix.lock", lockfile.content) if lockfile
46
+ FileUtils.cp(elixir_helper_parse_deps_path, "parse_deps.exs")
47
+
48
+ SharedHelpers.run_helper_subprocess(
49
+ env: mix_env,
50
+ command: "mix run #{elixir_helper_path}",
51
+ function: "parse",
52
+ args: [Dir.pwd],
53
+ popen_opts: { err: %i(child out) }
54
+ )
55
+ end
56
+ rescue Dependabot::SharedHelpers::HelperSubprocessFailed => error
57
+ result_json =
58
+ error.message.lines.
59
+ drop_while { |l| !l.start_with?('{"result":') }.
60
+ join
61
+
62
+ if result_json.empty?
63
+ raise DependencyFileNotEvaluatable, error.message
64
+ end
65
+
66
+ JSON.parse(result_json).fetch("result")
67
+ end
68
+
69
+ def write_sanitized_mixfiles
70
+ mixfiles.each do |file|
71
+ path = file.name
72
+ FileUtils.mkdir_p(Pathname.new(path).dirname)
73
+ File.write(path, sanitize_mixfile(file.content))
74
+ end
75
+ end
76
+
77
+ def write_supporting_files
78
+ dependency_files.select(&:support_file).each do |file|
79
+ path = file.name
80
+ FileUtils.mkdir_p(Pathname.new(path).dirname)
81
+ File.write(path, file.content)
82
+ end
83
+ end
84
+
85
+ def sanitize_mixfile(content)
86
+ content.
87
+ gsub(/File\.read!\(.*?\)/, '"0.0.1"').
88
+ gsub(/File\.read\(.*?\)/, '{:ok, "0.0.1"}')
89
+ end
90
+
91
+ def mix_env
92
+ {
93
+ "MIX_EXS" => File.join(project_root, "helpers/elixir/mix.exs"),
94
+ "MIX_LOCK" => File.join(project_root, "helpers/elixir/mix.lock"),
95
+ "MIX_DEPS" => File.join(project_root, "helpers/elixir/deps"),
96
+ "MIX_QUIET" => "1"
97
+ }
98
+ end
99
+
100
+ def elixir_helper_path
101
+ File.join(project_root, "helpers/elixir/bin/run.exs")
102
+ end
103
+
104
+ def elixir_helper_parse_deps_path
105
+ File.join(project_root, "helpers/elixir/bin/parse_deps.exs")
106
+ end
107
+
108
+ def required_files
109
+ Dependabot::FileFetchers::Elixir::Hex.required_files
110
+ end
111
+
112
+ def check_required_files
113
+ raise "No mixfile!" if mixfiles.none?
114
+ end
115
+
116
+ def project_root
117
+ File.join(File.dirname(__FILE__), "../../../..")
118
+ end
119
+
120
+ def symbolize_keys(hash)
121
+ Hash[hash.keys.map { |k| [k.to_sym, hash[k]] }]
122
+ end
123
+
124
+ def mixfiles
125
+ dependency_files.select { |f| f.name.end_with?("mix.exs") }
126
+ end
127
+
128
+ def lockfile
129
+ @lockfile ||= get_original_file("mix.lock")
130
+ end
131
+ end
132
+ end
133
+ end
134
+ end