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,115 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "parser/current"
4
+ require "dependabot/update_checkers/ruby/bundler"
5
+
6
+ module Dependabot
7
+ module UpdateCheckers
8
+ module Ruby
9
+ class Bundler
10
+ class RubyRequirementSetter
11
+ RUBY_VERSIONS =
12
+ %w(1.8.7 1.9.3 2.0.0 2.1.10 2.2.10 2.3.7 2.4.4 2.5.1).freeze
13
+
14
+ attr_reader :gemspec
15
+
16
+ def initialize(gemspec:)
17
+ @gemspec = gemspec
18
+ end
19
+
20
+ def rewrite(content)
21
+ return content unless gemspec_declares_ruby_requirement?
22
+
23
+ buffer = Parser::Source::Buffer.new("(gemfile_content)")
24
+ buffer.source = content
25
+ ast = Parser::CurrentRuby.new.parse(buffer)
26
+
27
+ if declares_ruby_version?(ast)
28
+ GemfileRewriter.new(
29
+ ruby_version: ruby_version
30
+ ).rewrite(buffer, ast)
31
+ else
32
+ "ruby '#{ruby_version}'\n" + content
33
+ end
34
+ end
35
+
36
+ private
37
+
38
+ def gemspec_declares_ruby_requirement?
39
+ !ruby_requirement.nil?
40
+ end
41
+
42
+ def declares_ruby_version?(node)
43
+ return false unless node.is_a?(Parser::AST::Node)
44
+ return true if node.type == :send && node.children[1] == :ruby
45
+
46
+ node.children.any? { |cn| declares_ruby_version?(cn) }
47
+ end
48
+
49
+ def ruby_version
50
+ requirement = Gem::Requirement.new(ruby_requirement)
51
+
52
+ ruby_version =
53
+ RUBY_VERSIONS.
54
+ map { |v| Gem::Version.new(v) }.sort.
55
+ find { |v| requirement.satisfied_by?(v) }
56
+
57
+ raise "Couldn't find Ruby version!" unless ruby_version
58
+
59
+ ruby_version
60
+ end
61
+
62
+ # rubocop:disable Security/Eval
63
+ def ruby_requirement
64
+ ast = Parser::CurrentRuby.parse(gemspec.content)
65
+ requirement_node = find_ruby_requirement_node(ast)
66
+ return unless requirement_node
67
+
68
+ eval(requirement_node.children[2].loc.expression.source)
69
+ end
70
+ # rubocop:enable Security/Eval
71
+
72
+ def find_ruby_requirement_node(node)
73
+ return unless node.is_a?(Parser::AST::Node)
74
+ return node if declares_ruby_requirement?(node)
75
+
76
+ node.children.find do |cn|
77
+ requirement_node = find_ruby_requirement_node(cn)
78
+ break requirement_node if requirement_node
79
+ end
80
+ end
81
+
82
+ def declares_ruby_requirement?(node)
83
+ return false unless node.is_a?(Parser::AST::Node)
84
+
85
+ node.children[1] == :required_ruby_version=
86
+ end
87
+
88
+ class GemfileRewriter < Parser::TreeRewriter
89
+ def initialize(ruby_version:)
90
+ @ruby_version = ruby_version
91
+ end
92
+
93
+ def on_send(node)
94
+ return unless declares_ruby_version?(node)
95
+
96
+ assigned_version_node = node.children[2]
97
+ replace(assigned_version_node.loc.expression, "'#{ruby_version}'")
98
+ end
99
+
100
+ private
101
+
102
+ attr_reader :ruby_version
103
+
104
+ def declares_ruby_version?(node)
105
+ return false unless node.is_a?(Parser::AST::Node)
106
+ return false unless node.type == :send
107
+
108
+ node.children[1] == :ruby
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,243 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler_definition_ruby_version_patch"
4
+ require "bundler_definition_bundler_version_patch"
5
+ require "bundler_git_source_patch"
6
+
7
+ require "excon"
8
+
9
+ require "dependabot/update_checkers/ruby/bundler"
10
+ require "dependabot/shared_helpers"
11
+ require "dependabot/errors"
12
+
13
+ module Dependabot
14
+ module UpdateCheckers
15
+ module Ruby
16
+ class Bundler
17
+ module SharedBundlerHelpers
18
+ GIT_REGEX = /reset --hard [^\s]*` in directory (?<path>[^\s]*)/.freeze
19
+ GIT_REF_REGEX = /not exist in the repository (?<path>[^\s]*)\./.freeze
20
+ PATH_REGEX = /The path `(?<path>.*)` does not exist/.freeze
21
+ RETRYABLE_ERRORS = %w(
22
+ Bundler::HTTPError
23
+ Bundler::Fetcher::FallbackError
24
+ ).freeze
25
+ RETRYABLE_PRIVATE_REGISTRY_ERRORS = %w(
26
+ Bundler::GemNotFound
27
+ Gem::InvalidSpecificationException
28
+ Bundler::VersionConflict
29
+ Bundler::HTTPError
30
+ Bundler::Fetcher::FallbackError
31
+ ).freeze
32
+
33
+ attr_reader :dependency_files, :credentials
34
+
35
+ #########################
36
+ # Bundler context setup #
37
+ #########################
38
+
39
+ def in_a_temporary_bundler_context(error_handling: true)
40
+ base_directory = dependency_files.first.directory
41
+ SharedHelpers.in_a_temporary_directory(base_directory) do |tmp_dir|
42
+ write_temporary_dependency_files
43
+
44
+ SharedHelpers.in_a_forked_process do
45
+ # Set the path for path gemspec correctly
46
+ ::Bundler.instance_variable_set(:@root, tmp_dir)
47
+
48
+ # Remove installed gems from the default Rubygems index
49
+ ::Gem::Specification.all = []
50
+
51
+ # Set auth details
52
+ relevant_credentials.each do |cred|
53
+ ::Bundler.settings.set_command_option(
54
+ cred.fetch("host"),
55
+ cred["token"] || "#{cred['username']}:#{cred['password']}"
56
+ )
57
+ end
58
+
59
+ yield
60
+ end
61
+ end
62
+ rescue SharedHelpers::ChildProcessFailed => error
63
+ retry_count ||= 0
64
+ retry_count += 1
65
+ if retryable_error?(error) && retry_count <= 2
66
+ sleep(rand(1.0..5.0)) && retry
67
+ end
68
+
69
+ raise unless error_handling
70
+
71
+ # Raise more descriptive errors
72
+ handle_bundler_errors(error)
73
+ end
74
+
75
+ def retryable_error?(error)
76
+ return true if RETRYABLE_ERRORS.include?(error.error_class)
77
+
78
+ unless RETRYABLE_PRIVATE_REGISTRY_ERRORS.include?(error.error_class)
79
+ return false
80
+ end
81
+
82
+ private_registry_credentials.any?
83
+ end
84
+
85
+ # rubocop:disable Metrics/CyclomaticComplexity
86
+ # rubocop:disable Metrics/PerceivedComplexity
87
+ # rubocop:disable Metrics/AbcSize
88
+ # rubocop:disable Metrics/MethodLength
89
+ def handle_bundler_errors(error)
90
+ msg = error.error_class + " with message: " + error.error_message
91
+
92
+ case error.error_class
93
+ when "Bundler::Dsl::DSLError", "Bundler::GemspecError"
94
+ # We couldn't evaluate the Gemfile, let alone resolve it
95
+ raise Dependabot::DependencyFileNotEvaluatable, msg
96
+ when "Bundler::Source::Git::MissingGitRevisionError"
97
+ gem_name =
98
+ error.error_message.match(GIT_REF_REGEX).
99
+ named_captures["path"].
100
+ split("/").last
101
+ raise GitDependencyReferenceNotFound, gem_name
102
+ when "Bundler::PathError"
103
+ gem_name =
104
+ error.error_message.match(PATH_REGEX).
105
+ named_captures["path"].
106
+ split("/").last.split("-")[0..-2].join
107
+ raise Dependabot::PathDependenciesNotReachable, [gem_name]
108
+ when "Bundler::Source::Git::GitCommandError"
109
+ if error.error_message.match?(GIT_REGEX)
110
+ # We couldn't find the specified branch / commit (or the two
111
+ # weren't compatible).
112
+ gem_name =
113
+ error.error_message.match(GIT_REGEX).
114
+ named_captures["path"].
115
+ split("/").last.split("-")[0..-2].join
116
+ raise GitDependencyReferenceNotFound, gem_name
117
+ end
118
+
119
+ bad_uris = inaccessible_git_dependencies.map { |s| s.source.uri }
120
+ raise unless bad_uris.any?
121
+
122
+ # We don't have access to one of repos required
123
+ raise Dependabot::GitDependenciesNotReachable, bad_uris
124
+ when "Bundler::GemNotFound", "Gem::InvalidSpecificationException",
125
+ "Bundler::VersionConflict"
126
+ # Bundler threw an error during resolution. Any of:
127
+ # - the gem doesn't exist in any of the specified sources
128
+ # - the gem wasn't specified properly
129
+ # - the gem was specified at an incompatible version
130
+ raise Dependabot::DependencyFileNotResolvable, msg
131
+ when "Bundler::Fetcher::AuthenticationRequiredError"
132
+ regex = /bundle config (?<source>.*) username:password/
133
+ source = error.error_message.match(regex)[:source]
134
+ raise Dependabot::PrivateSourceAuthenticationFailure, source
135
+ when "Bundler::Fetcher::BadAuthenticationError"
136
+ regex = /Bad username or password for (?<source>.*)\.$/
137
+ source = error.error_message.match(regex)[:source]
138
+ raise Dependabot::PrivateSourceAuthenticationFailure, source
139
+ when "Bundler::Fetcher::CertificateFailureError"
140
+ regex = /verify the SSL certificate for (?<source>.*)\.$/
141
+ source = error.error_message.match(regex)[:source]
142
+ raise Dependabot::PrivateSourceCertificateFailure, source
143
+ when "Bundler::HTTPError"
144
+ regex = /Could not fetch specs from (?<source>.*)$/
145
+ if error.error_message.match?(regex)
146
+ source = error.error_message.match(regex)[:source]
147
+ raise if source.include?("rubygems.org")
148
+
149
+ raise Dependabot::PrivateSourceTimedOut, source
150
+ end
151
+
152
+ # JFrog can serve a 403 if the credentials provided are good but
153
+ # don't have access to a particular gem.
154
+ raise unless error.error_message.include?("permitted to deploy")
155
+ raise unless jfrog_source
156
+
157
+ raise Dependabot::PrivateSourceAuthenticationFailure, jfrog_source
158
+ else raise
159
+ end
160
+ end
161
+ # rubocop:enable Metrics/CyclomaticComplexity
162
+ # rubocop:enable Metrics/PerceivedComplexity
163
+ # rubocop:enable Metrics/AbcSize
164
+ # rubocop:enable Metrics/MethodLength
165
+
166
+ def inaccessible_git_dependencies
167
+ in_a_temporary_bundler_context(error_handling: false) do
168
+ ::Bundler::Definition.build(gemfile.name, nil, {}).dependencies.
169
+ reject do |spec|
170
+ next true unless spec.source.is_a?(::Bundler::Source::Git)
171
+
172
+ # Piggy-back off some private Bundler methods to configure the
173
+ # URI with auth details in the same way Bundler does.
174
+ git_proxy = spec.source.send(:git_proxy)
175
+ uri = spec.source.uri.gsub("git://", "https://")
176
+ uri = git_proxy.send(:configured_uri_for, uri)
177
+ uri += ".git" unless uri.end_with?(".git")
178
+ uri += "/info/refs?service=git-upload-pack"
179
+
180
+ begin
181
+ Excon.get(
182
+ uri,
183
+ idempotent: true,
184
+ **SharedHelpers.excon_defaults
185
+ ).status == 200
186
+ rescue Excon::Error::Socket, Excon::Error::Timeout
187
+ false
188
+ end
189
+ end
190
+ end
191
+ end
192
+
193
+ def jfrog_source
194
+ in_a_temporary_bundler_context(error_handling: false) do
195
+ ::Bundler::Definition.build(gemfile.name, nil, {}).
196
+ send(:sources).
197
+ rubygems_remotes.
198
+ find { |uri| uri.host.include?("jfrog") }&.
199
+ host
200
+ end
201
+ end
202
+
203
+ def write_temporary_dependency_files
204
+ dependency_files.each do |file|
205
+ path = file.name
206
+ FileUtils.mkdir_p(Pathname.new(path).dirname)
207
+ File.write(path, file.content)
208
+ end
209
+
210
+ File.write(lockfile.name, sanitized_lockfile_body) if lockfile
211
+ end
212
+
213
+ def relevant_credentials
214
+ private_registry_credentials + git_source_credentials
215
+ end
216
+
217
+ def private_registry_credentials
218
+ credentials.select { |cred| cred["type"] == "rubygems_server" }
219
+ end
220
+
221
+ def git_source_credentials
222
+ credentials.select { |cred| cred["type"] == "git_source" }
223
+ end
224
+
225
+ def gemfile
226
+ dependency_files.find { |f| f.name == "Gemfile" } ||
227
+ dependency_files.find { |f| f.name == "gems.rb" }
228
+ end
229
+
230
+ def lockfile
231
+ dependency_files.find { |f| f.name == "Gemfile.lock" } ||
232
+ dependency_files.find { |f| f.name == "gems.locked" }
233
+ end
234
+
235
+ def sanitized_lockfile_body
236
+ re = FileUpdaters::Ruby::Bundler::LockfileUpdater::LOCKFILE_ENDING
237
+ lockfile.content.gsub(re, "")
238
+ end
239
+ end
240
+ end
241
+ end
242
+ end
243
+ end
@@ -0,0 +1,255 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler_definition_ruby_version_patch"
4
+ require "bundler_definition_bundler_version_patch"
5
+ require "bundler_git_source_patch"
6
+
7
+ require "excon"
8
+
9
+ require "dependabot/update_checkers/ruby/bundler"
10
+ require "dependabot/file_updaters/ruby/bundler/lockfile_updater"
11
+ require "dependabot/utils/ruby/requirement"
12
+ require "dependabot/shared_helpers"
13
+ require "dependabot/errors"
14
+
15
+ module Dependabot
16
+ module UpdateCheckers
17
+ module Ruby
18
+ class Bundler
19
+ class VersionResolver
20
+ require_relative "file_preparer"
21
+ require_relative "latest_version_finder"
22
+ require_relative "shared_bundler_helpers"
23
+ include SharedBundlerHelpers
24
+
25
+ GEM_NOT_FOUND_ERROR_REGEX = /locked to (?<name>[^\s]+) \(/.freeze
26
+
27
+ def initialize(dependency:, unprepared_dependency_files:,
28
+ credentials:, ignored_versions:,
29
+ replacement_git_pin: nil, remove_git_source: false,
30
+ unlock_requirement: true,
31
+ latest_allowable_version: nil)
32
+ @dependency = dependency
33
+ @unprepared_dependency_files = unprepared_dependency_files
34
+ @credentials = credentials
35
+ @ignored_versions = ignored_versions
36
+ @replacement_git_pin = replacement_git_pin
37
+ @remove_git_source = remove_git_source
38
+ @unlock_requirement = unlock_requirement
39
+ @latest_allowable_version = latest_allowable_version
40
+ end
41
+
42
+ def latest_resolvable_version_details
43
+ @latest_resolvable_version_details ||=
44
+ fetch_latest_resolvable_version_details
45
+ end
46
+
47
+ private
48
+
49
+ attr_reader :dependency, :unprepared_dependency_files, :credentials,
50
+ :ignored_versions, :replacement_git_pin,
51
+ :latest_allowable_version
52
+
53
+ def remove_git_source?
54
+ @remove_git_source
55
+ end
56
+
57
+ def unlock_requirement?
58
+ @unlock_requirement
59
+ end
60
+
61
+ def dependency_files
62
+ @dependency_files ||=
63
+ FilePreparer.new(
64
+ dependency: dependency,
65
+ dependency_files: unprepared_dependency_files,
66
+ replacement_git_pin: replacement_git_pin,
67
+ remove_git_source: remove_git_source?,
68
+ unlock_requirement: unlock_requirement?,
69
+ latest_allowable_version: latest_allowable_version
70
+ ).prepared_dependency_files
71
+ end
72
+
73
+ # rubocop:disable Metrics/CyclomaticComplexity
74
+ # rubocop:disable Metrics/PerceivedComplexity
75
+ def fetch_latest_resolvable_version_details
76
+ return latest_version_details unless gemfile
77
+
78
+ in_a_temporary_bundler_context do
79
+ dep = dependency_from_definition
80
+
81
+ # If the dependency wasn't found in the definition, it's because
82
+ # the Gemfile didn't import the gemspec. This is unusual, but
83
+ # the correct behaviour if/when it happens is to behave as if
84
+ # the repo was gemspec-only
85
+ next latest_version_details unless dep
86
+
87
+ # If the old Gemfile index was used then it won't have checked
88
+ # Ruby compatibility. Fix that by doing the check manually (and
89
+ # saying no update is possible if the Ruby version is a mismatch)
90
+ next nil if ruby_version_incompatible?(dep)
91
+
92
+ details = { version: dep.version }
93
+ if dep.source.instance_of?(::Bundler::Source::Git)
94
+ details[:commit_sha] = dep.source.revision
95
+ end
96
+ details
97
+ end
98
+ rescue Dependabot::DependencyFileNotResolvable => error
99
+ return if ignored_versions.any? && !dependency.appears_in_lockfile?
100
+ raise unless ruby_lock_error?(error)
101
+
102
+ @gemspec_ruby_unlocked = true
103
+ regenerate_dependency_files_without_ruby_lock && retry
104
+ end
105
+ # rubocop:enable Metrics/CyclomaticComplexity
106
+ # rubocop:enable Metrics/PerceivedComplexity
107
+
108
+ def ruby_lock_error?(error)
109
+ return false unless error.message.include?(" for gem \"ruby\0\"")
110
+ return false if @gemspec_ruby_unlocked
111
+
112
+ dependency_files.any? { |f| f.name.end_with?(".gemspec") }
113
+ end
114
+
115
+ def regenerate_dependency_files_without_ruby_lock
116
+ @dependency_files =
117
+ FilePreparer.new(
118
+ dependency: dependency,
119
+ dependency_files: unprepared_dependency_files,
120
+ replacement_git_pin: replacement_git_pin,
121
+ remove_git_source: remove_git_source?,
122
+ unlock_requirement: unlock_requirement?,
123
+ latest_allowable_version: latest_allowable_version,
124
+ lock_ruby_version: false
125
+ ).prepared_dependency_files
126
+ end
127
+
128
+ def dependency_from_definition
129
+ dependencies_to_unlock = [dependency.name, *subdependencies]
130
+ begin
131
+ definition = build_definition(dependencies_to_unlock)
132
+ definition.resolve_remotely!
133
+ rescue ::Bundler::GemNotFound => error
134
+ unlock_yanked_gem(dependencies_to_unlock, error) && retry
135
+ rescue ::Bundler::HTTPError => error
136
+ # Retry network errors
137
+ attempt ||= 1
138
+ attempt += 1
139
+ raise if attempt > 3 || !error.message.include?("Network error")
140
+
141
+ retry
142
+ end
143
+
144
+ definition.resolve.find { |d| d.name == dependency.name }
145
+ end
146
+
147
+ def unlock_yanked_gem(dependencies_to_unlock, error)
148
+ raise unless error.message.match?(GEM_NOT_FOUND_ERROR_REGEX)
149
+
150
+ gem_name = error.message.match(GEM_NOT_FOUND_ERROR_REGEX).
151
+ named_captures["name"]
152
+ raise if dependencies_to_unlock.include?(gem_name)
153
+
154
+ dependencies_to_unlock << gem_name
155
+ end
156
+
157
+ def subdependencies
158
+ # If there's no lockfile we don't need to worry about
159
+ # subdependencies
160
+ return [] unless lockfile
161
+
162
+ all_deps = ::Bundler::LockfileParser.new(sanitized_lockfile_body).
163
+ specs.map(&:name).map(&:to_s)
164
+ top_level = build_definition([]).dependencies.
165
+ map(&:name).map(&:to_s)
166
+
167
+ all_deps - top_level
168
+ end
169
+
170
+ def ruby_version_incompatible?(dep)
171
+ return false unless dep.source.is_a?(::Bundler::Source::Rubygems)
172
+
173
+ fetcher = dep.source.fetchers.first.fetchers.first
174
+
175
+ # It's only the old index we have a problem with
176
+ return false unless fetcher.is_a?(::Bundler::Fetcher::Dependency)
177
+
178
+ # If no Ruby version is specified, we don't have a problem
179
+ return false unless ruby_version
180
+
181
+ versions = Excon.get(
182
+ "#{fetcher.fetch_uri}api/v1/versions/#{dependency.name}.json",
183
+ idempotent: true,
184
+ **SharedHelpers.excon_defaults
185
+ )
186
+
187
+ # Give the benefit of the doubt if something goes wrong fetching
188
+ # version details (could be that it's a private index, etc.)
189
+ return false unless versions.status == 200
190
+
191
+ ruby_requirement =
192
+ JSON.parse(versions.body).
193
+ find { |details| details["number"] == dep.version.to_s }&.
194
+ fetch("ruby_version", nil)
195
+
196
+ # Give the benefit of the doubt if we can't find the version's
197
+ # required Ruby version.
198
+ return false unless ruby_requirement
199
+
200
+ ruby_requirement = Utils::Ruby::Requirement.new(ruby_requirement)
201
+
202
+ !ruby_requirement.satisfied_by?(ruby_version)
203
+ rescue JSON::ParserError, Excon::Error::Socket, Excon::Error::Timeout
204
+ # Give the benefit of the doubt if something goes wrong fetching
205
+ # version details (could be that it's a private index, etc.)
206
+ false
207
+ end
208
+
209
+ def build_definition(dependencies_to_unlock)
210
+ # Note: we lock shared dependencies to avoid any top-level
211
+ # dependencies getting unlocked (which would happen if they were
212
+ # also subdependencies of the dependency being unlocked)
213
+ ::Bundler::Definition.build(
214
+ gemfile.name,
215
+ lockfile&.name,
216
+ gems: dependencies_to_unlock,
217
+ lock_shared_dependencies: true
218
+ )
219
+ end
220
+
221
+ def ruby_version
222
+ return nil unless gemfile
223
+
224
+ @ruby_version ||= build_definition([]).ruby_version&.gem_version
225
+ end
226
+
227
+ def latest_version_details
228
+ @latest_version_details ||=
229
+ LatestVersionFinder.new(
230
+ dependency: dependency,
231
+ dependency_files: dependency_files,
232
+ credentials: credentials,
233
+ ignored_versions: ignored_versions
234
+ ).latest_version_details
235
+ end
236
+
237
+ def gemfile
238
+ dependency_files.find { |f| f.name == "Gemfile" } ||
239
+ dependency_files.find { |f| f.name == "gems.rb" }
240
+ end
241
+
242
+ def lockfile
243
+ dependency_files.find { |f| f.name == "Gemfile.lock" } ||
244
+ dependency_files.find { |f| f.name == "gems.locked" }
245
+ end
246
+
247
+ def sanitized_lockfile_body
248
+ re = FileUpdaters::Ruby::Bundler::LockfileUpdater::LOCKFILE_ENDING
249
+ lockfile.content.gsub(re, "")
250
+ end
251
+ end
252
+ end
253
+ end
254
+ end
255
+ end