1- # typed: true
1+ # typed: strict
22# frozen_string_literal: true
33
44require "parser/current"
5+ require "sorbet-runtime"
6+
57require "dependabot/bundler/file_updater"
68require "dependabot/bundler/requirement"
9+ require "dependabot/bundler/version"
710
811module Dependabot
912 module Bundler
1013 class FileUpdater
1114 class RubyRequirementSetter
15+ extend T ::Sig
16+
1217 RUBY_VERSIONS = %w(
1318 1.8.7 1.9.3 2.0.0 2.1.10 2.2.10 2.3.8 2.4.10 2.5.9 2.6.9 2.7.6 3.0.6 3.1.6 3.2.8 3.3.8 3.4.4
1419 ) . freeze
1520
1621 LANGUAGE = "ruby"
1722
23+ sig { returns ( T . nilable ( Dependabot ::DependencyFile ) ) }
1824 attr_reader :gemspec
1925
26+ sig { params ( gemspec : Dependabot ::DependencyFile ) . void }
2027 def initialize ( gemspec :)
2128 @gemspec = gemspec
2229 end
2330
31+ sig { params ( content : String ) . returns ( String ) }
2432 def rewrite ( content )
2533 return content unless gemspec_declares_ruby_requirement?
2634
@@ -39,17 +47,20 @@ def rewrite(content)
3947
4048 private
4149
50+ sig { returns ( T ::Boolean ) }
4251 def gemspec_declares_ruby_requirement?
4352 !ruby_requirement . nil?
4453 end
4554
55+ sig { params ( node : T . untyped ) . returns ( T ::Boolean ) }
4656 def declares_ruby_version? ( node )
4757 return false unless node . is_a? ( Parser ::AST ::Node )
4858 return true if node . type == :send && node . children [ 1 ] == :ruby
4959
5060 node . children . any? { |cn | declares_ruby_version? ( cn ) }
5161 end
5262
63+ sig { returns ( Dependabot ::Bundler ::Version ) }
5364 def ruby_version
5465 requirement = if ruby_requirement . is_a? ( Gem ::Requirement )
5566 ruby_requirement
@@ -74,6 +85,7 @@ def ruby_version
7485 end
7586
7687 # rubocop:disable Security/Eval
88+ sig { returns ( T . nilable ( T . untyped ) ) }
7789 def ruby_requirement
7890 ast = Parser ::CurrentRuby . parse ( gemspec . content )
7991 requirement_node = find_ruby_requirement_node ( ast )
@@ -87,6 +99,7 @@ def ruby_requirement
8799 end
88100 # rubocop:enable Security/Eval
89101
102+ sig { params ( node : T . untyped ) . returns ( T . nilable ( Parser ::AST ::Node ) ) }
90103 def find_ruby_requirement_node ( node )
91104 return unless node . is_a? ( Parser ::AST ::Node )
92105 return node if declares_ruby_requirement? ( node )
@@ -97,17 +110,22 @@ def find_ruby_requirement_node(node)
97110 end
98111 end
99112
113+ sig { params ( node : T . untyped ) . returns ( T ::Boolean ) }
100114 def declares_ruby_requirement? ( node )
101115 return false unless node . is_a? ( Parser ::AST ::Node )
102116
103117 node . children [ 1 ] == :required_ruby_version=
104118 end
105119
106120 class GemfileRewriter < Parser ::TreeRewriter
121+ extend T ::Sig
122+
123+ sig { override . params ( ruby_version : Dependabot ::Bundler ::Version ) . void }
107124 def initialize ( ruby_version :)
108125 @ruby_version = ruby_version
109126 end
110127
128+ sig { override . params ( node : T . untyped ) . void }
111129 def on_send ( node )
112130 return unless declares_ruby_version? ( node )
113131
@@ -117,8 +135,10 @@ def on_send(node)
117135
118136 private
119137
138+ sig { returns ( T . nilable ( Dependabot ::Bundler ::Version ) ) }
120139 attr_reader :ruby_version
121140
141+ sig { params ( node : T . untyped ) . returns ( T ::Boolean ) }
122142 def declares_ruby_version? ( node )
123143 return false unless node . is_a? ( Parser ::AST ::Node )
124144 return false unless node . type == :send
0 commit comments