Class: RubyLsp::DependencyDetector

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
Includes:
Singleton
Defined in:
lib/ruby_lsp/requests/support/dependency_detector.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeDependencyDetector

Returns a new instance of DependencyDetector.



21
22
23
24
25
# File 'lib/ruby_lsp/requests/support/dependency_detector.rb', line 21

def initialize
  @detected_formatter = T.let(detect_formatter, String)
  @detected_test_library = T.let(detect_test_library, String)
  @typechecker = T.let(detect_typechecker, T::Boolean)
end

Instance Attribute Details

#detected_formatterObject (readonly)

Returns the value of attribute detected_formatter.



12
13
14
# File 'lib/ruby_lsp/requests/support/dependency_detector.rb', line 12

def detected_formatter
  @detected_formatter
end

#detected_test_libraryObject (readonly)

Returns the value of attribute detected_test_library.



15
16
17
# File 'lib/ruby_lsp/requests/support/dependency_detector.rb', line 15

def detected_test_library
  @detected_test_library
end

#typecheckerObject (readonly)

Returns the value of attribute typechecker.



18
19
20
# File 'lib/ruby_lsp/requests/support/dependency_detector.rb', line 18

def typechecker
  @typechecker
end

Instance Method Details

#dependenciesObject



68
69
70
71
72
73
74
75
76
77
78
# File 'lib/ruby_lsp/requests/support/dependency_detector.rb', line 68

def dependencies
  @dependencies ||= T.let(
    begin
      Bundler.with_original_env { Bundler.default_gemfile }
      Bundler.locked_gems.dependencies.keys + gemspec_dependencies
    rescue Bundler::GemfileNotFound
      []
    end,
    T.nilable(T::Array[String]),
  )
end

#detect_formatterObject



28
29
30
31
32
33
34
35
36
37
# File 'lib/ruby_lsp/requests/support/dependency_detector.rb', line 28

def detect_formatter
  # NOTE: Intentionally no $ at end, since we want to match rubocop-shopify, etc.
  if direct_dependency?(/^rubocop/)
    "rubocop"
  elsif direct_dependency?(/^syntax_tree$/)
    "syntax_tree"
  else
    "none"
  end
end

#detect_test_libraryObject



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/ruby_lsp/requests/support/dependency_detector.rb', line 40

def detect_test_library
  # A Rails app may have a dependency on minitest, but we would instead want to use the Rails test runner provided
  # by ruby-lsp-rails.
  if direct_dependency?(/^rails$/)
    "rails"
  # NOTE: Intentionally ends with $ to avoid mis-matching minitest-reporters, etc. in a Rails app.
  elsif direct_dependency?(/^minitest$/)
    "minitest"
  elsif direct_dependency?(/^test-unit/)
    "test-unit"
  elsif direct_dependency?(/^rspec/)
    "rspec"
  else
    "unknown"
  end
end

#detect_typecheckerObject



63
64
65
# File 'lib/ruby_lsp/requests/support/dependency_detector.rb', line 63

def detect_typechecker
  direct_dependency?(/^sorbet/) || direct_dependency?(/^sorbet-static-and-runtime/)
end

#direct_dependency?(gem_pattern) ⇒ Boolean

Returns:

  • (Boolean)


58
59
60
# File 'lib/ruby_lsp/requests/support/dependency_detector.rb', line 58

def direct_dependency?(gem_pattern)
  dependencies.any?(gem_pattern)
end

#gemspec_dependenciesObject



81
82
83
84
85
# File 'lib/ruby_lsp/requests/support/dependency_detector.rb', line 81

def gemspec_dependencies
  Bundler.locked_gems.sources
    .grep(Bundler::Source::Gemspec)
    .flat_map { _1.gemspec&.dependencies&.map(&:name) }
end