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,160 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/dependency"
4
+ require "dependabot/errors"
5
+ require "dependabot/file_parsers/base/dependency_set"
6
+ require "dependabot/file_parsers/python/pip"
7
+ require "dependabot/shared_helpers"
8
+
9
+ module Dependabot
10
+ module FileParsers
11
+ module Python
12
+ class Pip
13
+ class SetupFileParser
14
+ INSTALL_REQUIRES_REGEX =
15
+ /install_requires\s*=\s*(\[.*?\])[,)\s]/m.freeze
16
+ SETUP_REQUIRES_REGEX = /setup_requires\s*=\s*(\[.*?\])[,)\s]/m.freeze
17
+ TESTS_REQUIRE_REGEX = /tests_require\s*=\s*(\[.*?\])[,)\s]/m.freeze
18
+ EXTRAS_REQUIRE_REGEX = /extras_require\s*=\s*(\{.*?\})[,)\s]/m.freeze
19
+
20
+ def initialize(dependency_files:)
21
+ @dependency_files = dependency_files
22
+ end
23
+
24
+ def dependency_set
25
+ dependencies = Dependabot::FileParsers::Base::DependencySet.new
26
+
27
+ parsed_setup_file.each do |dep|
28
+ # If a requirement has a `<` or `<=` marker then updating it is
29
+ # probably blocked. Ignore it.
30
+ next if dep["markers"].include?("<")
31
+
32
+ dependencies <<
33
+ Dependency.new(
34
+ name: normalised_name(dep["name"]),
35
+ version: dep["version"]&.include?("*") ? nil : dep["version"],
36
+ requirements: [{
37
+ requirement: dep["requirement"],
38
+ file: Pathname.new(dep["file"]).cleanpath.to_path,
39
+ source: nil,
40
+ groups: [dep["requirement_type"]]
41
+ }],
42
+ package_manager: "pip"
43
+ )
44
+ end
45
+ dependencies
46
+ end
47
+
48
+ private
49
+
50
+ attr_reader :dependency_files
51
+
52
+ def parsed_setup_file
53
+ SharedHelpers.in_a_temporary_directory do
54
+ write_temporary_dependency_files
55
+
56
+ requirements = SharedHelpers.run_helper_subprocess(
57
+ command: "pyenv exec python #{python_helper_path}",
58
+ function: "parse_setup",
59
+ args: [Dir.pwd]
60
+ )
61
+
62
+ check_requirements(requirements)
63
+ requirements
64
+ end
65
+ rescue SharedHelpers::HelperSubprocessFailed => error
66
+ if error.message.start_with?("InstallationError")
67
+ raise Dependabot::DependencyFileNotEvaluatable, error.message
68
+ end
69
+
70
+ parsed_sanitized_setup_file
71
+ end
72
+
73
+ def parsed_sanitized_setup_file
74
+ SharedHelpers.in_a_temporary_directory do
75
+ write_sanitized_setup_file
76
+
77
+ requirements = SharedHelpers.run_helper_subprocess(
78
+ command: "pyenv exec python #{python_helper_path}",
79
+ function: "parse_setup",
80
+ args: [Dir.pwd]
81
+ )
82
+
83
+ check_requirements(requirements)
84
+ requirements
85
+ end
86
+ rescue SharedHelpers::HelperSubprocessFailed
87
+ # Assume there are no dependencies in setup.py files that fail to
88
+ # parse. This isn't ideal, and we should continue to improve
89
+ # parsing, but there are a *lot* of things that can go wrong at
90
+ # the moment!
91
+ []
92
+ end
93
+
94
+ def check_requirements(requirements)
95
+ requirements.each do |dep|
96
+ next unless dep["requirement"]
97
+
98
+ Utils::Python::Requirement.new(dep["requirement"].split(","))
99
+ rescue Gem::Requirement::BadRequirementError => error
100
+ raise Dependabot::DependencyFileNotEvaluatable, error.message
101
+ end
102
+ end
103
+
104
+ def write_temporary_dependency_files
105
+ dependency_files.
106
+ reject { |f| f.name == ".python-version" }.
107
+ each do |file|
108
+ path = file.name
109
+ FileUtils.mkdir_p(Pathname.new(path).dirname)
110
+ File.write(path, file.content)
111
+ end
112
+ end
113
+
114
+ # Write a setup.py with only entries for the requires fields.
115
+ #
116
+ # This sanitization is far from perfect (it will fail if any of the
117
+ # entries are dynamic), but it is an alternative approach to the one
118
+ # used in parser.py which sometimes succeeds when that has failed.
119
+ def write_sanitized_setup_file
120
+ original_content = setup_file.content
121
+
122
+ install_requires =
123
+ original_content.match(INSTALL_REQUIRES_REGEX)&.captures&.first
124
+ setup_requires =
125
+ original_content.match(SETUP_REQUIRES_REGEX)&.captures&.first
126
+ tests_require =
127
+ original_content.match(TESTS_REQUIRE_REGEX)&.captures&.first
128
+ extras_require =
129
+ original_content.match(EXTRAS_REQUIRE_REGEX)&.captures&.first
130
+
131
+ tmp = "from setuptools import setup\n\n"\
132
+ "setup(name=\"sanitized-package\",version=\"0.0.1\","
133
+
134
+ tmp += "install_requires=#{install_requires}," if install_requires
135
+ tmp += "setup_requires=#{setup_requires}," if setup_requires
136
+ tmp += "tests_require=#{tests_require}," if tests_require
137
+ tmp += "extras_require=#{extras_require}," if extras_require
138
+ tmp += ")"
139
+
140
+ File.write("setup.py", tmp)
141
+ end
142
+
143
+ def python_helper_path
144
+ project_root = File.join(File.dirname(__FILE__), "../../../../..")
145
+ File.join(project_root, "helpers/python/run.py")
146
+ end
147
+
148
+ # See https://www.python.org/dev/peps/pep-0503/#normalized-names
149
+ def normalised_name(name)
150
+ name.downcase.gsub(/[-_.]+/, "-")
151
+ end
152
+
153
+ def setup_file
154
+ dependency_files.find { |f| f.name == "setup.py" }
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,295 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/dependency"
4
+ require "dependabot/file_parsers/base"
5
+ require "dependabot/file_updaters/ruby/bundler/lockfile_updater"
6
+ require "dependabot/shared_helpers"
7
+ require "dependabot/errors"
8
+
9
+ module Dependabot
10
+ module FileParsers
11
+ module Ruby
12
+ class Bundler < Dependabot::FileParsers::Base
13
+ require "dependabot/file_parsers/base/dependency_set"
14
+ require "dependabot/file_parsers/ruby/bundler/file_preparer"
15
+ require "dependabot/file_parsers/ruby/bundler/gemfile_checker"
16
+
17
+ def parse
18
+ dependency_set = DependencySet.new
19
+ dependency_set += gemfile_dependencies
20
+ dependency_set += gemspec_dependencies
21
+ dependency_set += lockfile_dependencies
22
+ dependency_set.dependencies
23
+ end
24
+
25
+ private
26
+
27
+ # Can't be a constant because some of these don't exist in bundler
28
+ # 1.15, which Heroku uses, which causes an exception on boot.
29
+ def sources
30
+ [
31
+ NilClass,
32
+ ::Bundler::Source::Rubygems,
33
+ ::Bundler::Source::Git,
34
+ ::Bundler::Source::Path,
35
+ ::Bundler::Source::Gemspec,
36
+ ::Bundler::Source::Metadata
37
+ ]
38
+ end
39
+
40
+ def gemfile_dependencies
41
+ dependencies = DependencySet.new
42
+
43
+ return dependencies unless gemfile
44
+
45
+ [gemfile, *evaled_gemfiles].each do |file|
46
+ parsed_gemfile.each do |dep|
47
+ next unless dependency_in_gemfile?(gemfile: file, dependency: dep)
48
+
49
+ dependencies <<
50
+ Dependency.new(
51
+ name: dep.name,
52
+ version: dependency_version(dep.name)&.to_s,
53
+ requirements: [{
54
+ requirement: dep.requirement.to_s,
55
+ groups: dep.groups,
56
+ source: source_for(dep),
57
+ file: file.name
58
+ }],
59
+ package_manager: "bundler"
60
+ )
61
+ end
62
+ end
63
+
64
+ dependencies
65
+ end
66
+
67
+ def gemspec_dependencies
68
+ dependencies = DependencySet.new
69
+
70
+ gemspecs.each do |gemspec|
71
+ parsed_gemspec(gemspec).dependencies.each do |dependency|
72
+ dependencies <<
73
+ Dependency.new(
74
+ name: dependency.name,
75
+ version: dependency_version(dependency.name)&.to_s,
76
+ requirements: [{
77
+ requirement: dependency.requirement.to_s,
78
+ groups: dependency.runtime? ? ["runtime"] : ["development"],
79
+ source: nil,
80
+ file: gemspec.name
81
+ }],
82
+ package_manager: "bundler"
83
+ )
84
+ end
85
+ end
86
+
87
+ dependencies
88
+ end
89
+
90
+ def lockfile_dependencies
91
+ dependencies = DependencySet.new
92
+
93
+ return dependencies unless lockfile
94
+
95
+ # Create a DependencySet where each element has no requirement. Any
96
+ # requirements will be added when combining the DependencySet with
97
+ # other DependencySets.
98
+ parsed_lockfile.specs.each do |dependency|
99
+ next if dependency.source.is_a?(::Bundler::Source::Path)
100
+
101
+ dependencies <<
102
+ Dependency.new(
103
+ name: dependency.name,
104
+ version: dependency_version(dependency.name)&.to_s,
105
+ requirements: [],
106
+ package_manager: "bundler"
107
+ )
108
+ end
109
+
110
+ dependencies
111
+ end
112
+
113
+ def parsed_gemfile
114
+ base_directory = dependency_files.first.directory
115
+ @parsed_gemfile ||=
116
+ SharedHelpers.in_a_temporary_directory(base_directory) do
117
+ write_temporary_dependency_files
118
+
119
+ SharedHelpers.in_a_forked_process do
120
+ ::Bundler.instance_variable_set(:@root, Pathname.new(Dir.pwd))
121
+
122
+ ::Bundler::Definition.build(gemfile.name, nil, {}).
123
+ dependencies.
124
+ select(&:current_platform?).
125
+ # We can't dump gemspec sources, and we wouldn't bump them
126
+ # anyway, so we filter them out.
127
+ reject { |dep| dep.source.is_a?(::Bundler::Source::Gemspec) }
128
+ end
129
+ end
130
+ rescue SharedHelpers::ChildProcessFailed => error
131
+ msg = error.error_class + " with message: " +
132
+ error.error_message.force_encoding("UTF-8").encode
133
+ raise Dependabot::DependencyFileNotEvaluatable, msg
134
+ end
135
+
136
+ def parsed_gemspec(file)
137
+ @parsed_gemspecs ||= {}
138
+ @parsed_gemspecs[file.name] ||=
139
+ SharedHelpers.in_a_temporary_directory do
140
+ File.write(file.name, file.content)
141
+ imported_ruby_files.each do |f|
142
+ path = f.name
143
+ FileUtils.mkdir_p(Pathname.new(path).dirname)
144
+ File.write(path, f.content)
145
+ end
146
+
147
+ SharedHelpers.in_a_forked_process do
148
+ ::Bundler.instance_variable_set(:@root, Pathname.new(Dir.pwd))
149
+ ::Bundler.load_gemspec_uncached(file.name)
150
+ end
151
+ end
152
+ rescue SharedHelpers::ChildProcessFailed => error
153
+ msg = error.error_class + " with message: " + error.error_message
154
+ raise Dependabot::DependencyFileNotEvaluatable, msg
155
+ end
156
+
157
+ def prepared_dependency_files
158
+ @prepared_dependency_files ||=
159
+ FilePreparer.new(dependency_files: dependency_files).
160
+ prepared_dependency_files
161
+ end
162
+
163
+ def write_temporary_dependency_files
164
+ prepared_dependency_files.each do |file|
165
+ path = file.name
166
+ FileUtils.mkdir_p(Pathname.new(path).dirname)
167
+ File.write(path, file.content)
168
+ end
169
+ end
170
+
171
+ def check_required_files
172
+ file_names = dependency_files.map(&:name)
173
+
174
+ return if file_names.any? do |name|
175
+ name.end_with?(".gemspec") && !name.include?("/")
176
+ end
177
+
178
+ return if gemfile
179
+
180
+ raise "A gemspec or Gemfile must be provided!"
181
+ end
182
+
183
+ def source_for(dependency)
184
+ source = dependency.source
185
+ if lockfile && default_rubygems?(source)
186
+ # If there's a lockfile and the Gemfile doesn't have anything
187
+ # interesting to say about the source, check that.
188
+ source = source_from_lockfile(dependency.name)
189
+ end
190
+ raise "Bad source: #{source}" unless sources.include?(source.class)
191
+
192
+ return nil if default_rubygems?(source)
193
+
194
+ details = { type: source.class.name.split("::").last.downcase }
195
+ if source.is_a?(::Bundler::Source::Git)
196
+ details.merge!(git_source_details(source))
197
+ end
198
+ if source.is_a?(::Bundler::Source::Rubygems)
199
+ details[:url] = source.remotes.first.to_s
200
+ end
201
+ details
202
+ end
203
+
204
+ def git_source_details(source)
205
+ {
206
+ url: source.uri,
207
+ branch: source.branch || "master",
208
+ ref: source.ref
209
+ }
210
+ end
211
+
212
+ def default_rubygems?(source)
213
+ return true if source.nil?
214
+ return false unless source.is_a?(::Bundler::Source::Rubygems)
215
+
216
+ source.remotes.any? { |r| r.to_s.include?("rubygems.org") }
217
+ end
218
+
219
+ def dependency_version(dependency_name)
220
+ return unless lockfile
221
+
222
+ spec = parsed_lockfile.specs.find { |s| s.name == dependency_name }
223
+
224
+ # Not all files in the Gemfile will appear in the Gemfile.lock. For
225
+ # instance, if a gem specifies `platform: [:windows]`, and the
226
+ # Gemfile.lock is generated on a Linux machine, the gem will be not
227
+ # appear in the lockfile.
228
+ return unless spec
229
+
230
+ # If the source is Git we're better off knowing the SHA-1 than the
231
+ # version.
232
+ if spec.source.instance_of?(::Bundler::Source::Git)
233
+ return spec.source.revision
234
+ end
235
+
236
+ spec.version
237
+ end
238
+
239
+ def source_from_lockfile(dependency_name)
240
+ parsed_lockfile.specs.find { |s| s.name == dependency_name }&.source
241
+ end
242
+
243
+ def dependency_in_gemfile?(gemfile:, dependency:)
244
+ GemfileChecker.new(
245
+ dependency: dependency,
246
+ gemfile: gemfile
247
+ ).includes_dependency?
248
+ end
249
+
250
+ def gemfile
251
+ @gemfile ||= get_original_file("Gemfile") ||
252
+ get_original_file("gems.rb")
253
+ end
254
+
255
+ def evaled_gemfiles
256
+ dependency_files.
257
+ reject { |f| f.name.end_with?(".gemspec") }.
258
+ reject { |f| f.name.end_with?(".lock") }.
259
+ reject { |f| f.name.end_with?(".ruby-version") }.
260
+ reject { |f| f.name == "Gemfile" }.
261
+ reject { |f| f.name == "gems.rb" }.
262
+ reject { |f| f.name == "gems.locked" }
263
+ end
264
+
265
+ def lockfile
266
+ @lockfile ||= get_original_file("Gemfile.lock") ||
267
+ get_original_file("gems.locked")
268
+ end
269
+
270
+ def parsed_lockfile
271
+ @parsed_lockfile ||=
272
+ ::Bundler::LockfileParser.new(sanitized_lockfile_content)
273
+ end
274
+
275
+ def sanitized_lockfile_content
276
+ regex = FileUpdaters::Ruby::Bundler::LockfileUpdater::LOCKFILE_ENDING
277
+ lockfile.content.gsub(regex, "")
278
+ end
279
+
280
+ def gemspecs
281
+ # The gemspecs for this project will be at the top level
282
+ @gemspecs ||= prepared_dependency_files.select do |file|
283
+ file.name.match?(%r{^[^/]*\.gemspec$})
284
+ end
285
+ end
286
+
287
+ def imported_ruby_files
288
+ dependency_files.
289
+ select { |f| f.name.end_with?(".rb") }.
290
+ reject { |f| f.name == "gems.rb" }
291
+ end
292
+ end
293
+ end
294
+ end
295
+ end