diff --git a/lib/yard/cli/server.rb b/lib/yard/cli/server.rb index b3fcb9471..458ccd11e 100644 --- a/lib/yard/cli/server.rb +++ b/lib/yard/cli/server.rb @@ -133,13 +133,26 @@ def add_gems end end - def add_gems_from_gemfile(gemfile = nil) + def add_gems_from_gemfile(gemfile = nil, dependencies_only = false) require 'bundler' gemfile ||= "Gemfile" if File.exist?("#{gemfile}.lock") - Bundler::LockfileParser.new(File.read("#{gemfile}.lock")).specs.each do |spec| - libraries[spec.name] ||= [] - libraries[spec.name] |= [YARD::Server::LibraryVersion.new(spec.name, spec.version.to_s, nil, :gem)] + if dependencies_only + parsed_gemfile = Bundler::LockfileParser.new(File.read("#{gemfile}.lock")) + parsed_gemfile.dependencies.each do |dep| + libraries[dep.name] ||= [] + specs = parsed_gemfile.specs.select do |spec| + spec.name == dep.name + end + specs.each do |spec| + libraries[spec.name] |= [YARD::Server::LibraryVersion.new(spec.name, spec.version.to_s, nil, :gem)] + end + end + else + Bundler::LockfileParser.new(File.read("#{gemfile}.lock")).specs.each do |spec| + libraries[spec.name] ||= [] + libraries[spec.name] |= [YARD::Server::LibraryVersion.new(spec.name, spec.version.to_s, nil, :gem)] + end end else log.warn "Cannot find #{gemfile}.lock, ignoring --gemfile option" @@ -174,6 +187,9 @@ def optparse(*args) opts.on('-G', '--gemfile [GEMFILE]', 'Serves documentation for gems from Gemfile') do |gemfile| add_gems_from_gemfile(gemfile) end + opts.on('--gemfile-deps [GEMFILE]', 'Serves documentation for gems from Gemfile (Just dependencies)') do |gemfile| + add_gems_from_gemfile(gemfile, true) + end opts.on('-t', '--template-path PATH', 'The template path to look for templates in. (used with -t).') do |path| template_paths << path diff --git a/spec/cli/server_spec.rb b/spec/cli/server_spec.rb index 523ded757..e11213864 100644 --- a/spec/cli/server_spec.rb +++ b/spec/cli/server_spec.rb @@ -280,6 +280,28 @@ def mock_file(filename, content = nil) run '--gemfile', 'different_name' end + it "accepts --gemfile-deps" do + bundler_required + @no_verify_libraries = true + @options[:single_library] = false + + @libraries['gem1'] = [Server::LibraryVersion.new('gem1', '1.0.0', nil, :gem)] + @libraries['gem2'] = [Server::LibraryVersion.new('gem2', '1.0.0', nil, :gem)] + gem1 = double(:gem1, :name => 'gem1', :version => '1.0.0', :full_gem_path => '/path/to/foo') + gem2 = double(:gem2, :name => 'gem2', :version => '1.0.0', :full_gem_path => '/path/to/bar') + gem3 = double(:gem3, :name => 'gem3', :version => '1.0.0', :full_gem_path => '/path/to/bar') + lockfile_parser = double(:new, :specs => [gem1, gem2, gem3], :dependencies => [gem1, gem2]) + allow(Bundler::LockfileParser).to receive(:new).and_return(lockfile_parser) + + expect(File).to receive(:exist?).at_least(1).times.with("Gemfile.lock").and_return(true) + allow(File).to receive(:read) + + run '--gemfile-deps' + + expect(File).to receive(:exist?).with("different_name.lock").and_return(true) + run '--gemfile-deps', 'different_name' + end + it "warns if lockfile is not found (with -G)" do bundler_required expect(File).to receive(:exist?).with(/\.yardopts$/).at_least(:once).and_return(false)