license_finder 0.5.0 → 0.6.0
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.
- data/.travis.yml +22 -0
- data/README.markdown +56 -92
- data/Rakefile +1 -1
- data/bin/license_finder +1 -1
- data/features/approve_dependencies.feature +49 -0
- data/features/html_report.feature +48 -0
- data/features/license_finder.feature +36 -0
- data/features/license_finder_rake_task.feature +36 -0
- data/features/rails_rake.feature +9 -0
- data/features/step_definitions/steps.rb +78 -31
- data/features/text_report.feature +27 -0
- data/lib/{templates/Apache.txt → data/licenses/Apache2.txt} +0 -0
- data/lib/{templates → data/licenses}/BSD.txt +0 -0
- data/lib/{templates → data/licenses}/GPLv2.txt +0 -0
- data/lib/{templates → data/licenses}/ISC.txt +0 -0
- data/lib/{templates → data/licenses}/LGPL.txt +0 -0
- data/lib/{templates → data/licenses}/MIT.txt +0 -0
- data/lib/{templates → data/licenses}/NewBSD.txt +0 -0
- data/lib/{templates → data/licenses}/Ruby.txt +0 -0
- data/lib/{templates → data/licenses}/SimplifiedBSD.txt +0 -0
- data/lib/license_finder.rb +11 -32
- data/lib/license_finder/bundle.rb +33 -0
- data/lib/license_finder/bundled_gem.rb +20 -14
- data/lib/license_finder/cli.rb +4 -3
- data/lib/license_finder/configuration.rb +34 -0
- data/lib/license_finder/dependency.rb +27 -22
- data/lib/license_finder/dependency_list.rb +35 -13
- data/lib/license_finder/license.rb +11 -1
- data/lib/license_finder/license/apache2.rb +8 -0
- data/lib/license_finder/license/bsd.rb +2 -0
- data/lib/license_finder/license/gplv2.rb +2 -0
- data/lib/license_finder/license/isc.rb +1 -0
- data/lib/license_finder/license/lgpl.rb +1 -0
- data/lib/license_finder/license/mit.rb +4 -1
- data/lib/license_finder/license/new_bsd.rb +3 -0
- data/lib/license_finder/license/ruby.rb +2 -2
- data/lib/license_finder/license/simplified_bsd.rb +3 -0
- data/lib/license_finder/license_url.rb +10 -0
- data/lib/license_finder/possible_license_file.rb +2 -2
- data/lib/license_finder/railtie.rb +1 -3
- data/lib/license_finder/reporter.rb +51 -0
- data/lib/license_finder/viewable.rb +31 -0
- data/lib/tasks/license_finder.rake +3 -28
- data/lib/templates/dependency.html.erb +54 -0
- data/lib/templates/dependency_list.html.erb +38 -0
- data/license_finder.gemspec +12 -4
- data/spec/lib/license_finder/bundled_gem_spec.rb +5 -3
- data/spec/lib/license_finder/dependency_list_spec.rb +54 -9
- data/spec/lib/license_finder/dependency_spec.rb +93 -57
- data/spec/lib/license_finder/license/apache_spec.rb +2 -2
- data/spec/lib/license_finder/license/mit_spec.rb +1 -1
- data/spec/lib/license_finder/license_spec.rb +14 -0
- data/spec/lib/license_finder/license_url_spec.rb +20 -0
- data/spec/lib/license_finder/reporter_spec.rb +5 -0
- data/spec/lib/license_finder_spec.rb +2 -0
- data/spec/spec_helper.rb +0 -1
- data/spec/support/license_examples.rb +6 -0
- metadata +68 -33
- data/features/executables/license_finder.feature +0 -19
- data/features/rake_tasks/action_items.feature +0 -27
- data/features/rake_tasks/action_items_ok.feature +0 -23
- data/features/rake_tasks/generate_dependencies.feature +0 -62
- data/features/rake_tasks/init.feature +0 -26
- data/features/rake_tasks/regressions.feature +0 -18
- data/lib/license_finder/bundler_dependency_query.rb +0 -51
- data/lib/license_finder/finder.rb +0 -39
- data/lib/license_finder/license/apache.rb +0 -5
- data/spec/lib/license_finder/finder_spec.rb +0 -36
| @@ -23,10 +23,20 @@ module LicenseFinder::License | |
| 23 23 |  | 
| 24 24 | 
             
              class Base
         | 
| 25 25 | 
             
                class << self
         | 
| 26 | 
            +
                  attr_accessor :license_url, :alternative_names
         | 
| 27 | 
            +
             | 
| 26 28 | 
             
                  def inherited(descendant)
         | 
| 27 29 | 
             
                    LicenseFinder::License.all << descendant
         | 
| 28 30 | 
             
                  end
         | 
| 29 31 |  | 
| 32 | 
            +
                  def names
         | 
| 33 | 
            +
                    [demodulized_name] + self.alternative_names
         | 
| 34 | 
            +
                  end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                  def alternative_names
         | 
| 37 | 
            +
                    @alternative_names ||= []
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
             | 
| 30 40 | 
             
                  def demodulized_name
         | 
| 31 41 | 
             
                    name.gsub(/^.*::/, '')
         | 
| 32 42 | 
             
                  end
         | 
| @@ -41,7 +51,7 @@ module LicenseFinder::License | |
| 41 51 |  | 
| 42 52 | 
             
                  def license_text
         | 
| 43 53 | 
             
                    unless defined?(@license_text)
         | 
| 44 | 
            -
                      template = File.join(LicenseFinder::ROOT_PATH, " | 
| 54 | 
            +
                      template = File.join(LicenseFinder::ROOT_PATH, "data", "licenses", "#{demodulized_name}.txt").to_s
         | 
| 45 55 |  | 
| 46 56 | 
             
                      @license_text = Text.new(File.read(template)).to_s if File.exists?(template)
         | 
| 47 57 | 
             
                    end
         | 
| @@ -1,7 +1,10 @@ | |
| 1 1 | 
             
            class LicenseFinder::License::MIT < LicenseFinder::License::Base
         | 
| 2 | 
            +
              self.license_url = "http://opensource.org/licenses/mit-license"
         | 
| 3 | 
            +
              self.alternative_names = ["Expat"]
         | 
| 4 | 
            +
             | 
| 2 5 | 
             
              HEADER_REGEX = /The MIT Licen[sc]e/
         | 
| 3 6 | 
             
              ONE_LINER_REGEX = /is released under the MIT licen[sc]e/
         | 
| 4 | 
            -
              URL_REGEX = %r{MIT Licen[sc]e.*http://www.opensource.org/licenses/mit-license}
         | 
| 7 | 
            +
              URL_REGEX = %r{MIT Licen[sc]e.*http://(?:www.)?opensource.org/licenses/mit-license}
         | 
| 5 8 |  | 
| 6 9 | 
             
              def matches?
         | 
| 7 10 | 
             
                super || matches_url? || matches_header?
         | 
| @@ -1,11 +1,11 @@ | |
| 1 1 | 
             
            class LicenseFinder::License::Ruby < LicenseFinder::License::Base
         | 
| 2 | 
            -
               | 
| 2 | 
            +
              self.license_url = "http://www.ruby-lang.org/en/LICENSE.txt"
         | 
| 3 3 |  | 
| 4 4 | 
             
              def self.pretty_name
         | 
| 5 5 | 
             
                'ruby'
         | 
| 6 6 | 
             
              end
         | 
| 7 7 |  | 
| 8 8 | 
             
              def matches?
         | 
| 9 | 
            -
                super || !!(text =~  | 
| 9 | 
            +
                super || !!(text =~ /#{self.class.license_url}/)
         | 
| 10 10 | 
             
              end
         | 
| 11 11 | 
             
            end
         | 
| @@ -0,0 +1,10 @@ | |
| 1 | 
            +
            module LicenseFinder::LicenseUrl
         | 
| 2 | 
            +
              extend self
         | 
| 3 | 
            +
             | 
| 4 | 
            +
              def find_by_name(name)
         | 
| 5 | 
            +
                return unless name.respond_to?(:downcase)
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                license = LicenseFinder::License.all.detect {|l| l.names.map(&:downcase).include? name.downcase }
         | 
| 8 | 
            +
                license.license_url if license
         | 
| 9 | 
            +
              end
         | 
| 10 | 
            +
            end
         | 
| @@ -10,7 +10,7 @@ module LicenseFinder | |
| 10 10 | 
             
                end
         | 
| 11 11 |  | 
| 12 12 | 
             
                def full_file_path
         | 
| 13 | 
            -
                  @file_path.realpath.to_s
         | 
| 13 | 
            +
                  Pathname.new(@file_path).realpath.to_s
         | 
| 14 14 | 
             
                end
         | 
| 15 15 |  | 
| 16 16 | 
             
                def file_name
         | 
| @@ -26,7 +26,7 @@ module LicenseFinder | |
| 26 26 | 
             
                    klass.new(text).matches?
         | 
| 27 27 | 
             
                  end
         | 
| 28 28 |  | 
| 29 | 
            -
                  license  | 
| 29 | 
            +
                  license.pretty_name if license
         | 
| 30 30 | 
             
                end
         | 
| 31 31 | 
             
              end
         | 
| 32 32 | 
             
            end
         | 
| @@ -0,0 +1,51 @@ | |
| 1 | 
            +
            module LicenseFinder
         | 
| 2 | 
            +
              class Reporter
         | 
| 3 | 
            +
                def self.create_default_configuration
         | 
| 4 | 
            +
                  unless File.exists?(LicenseFinder.config.config_file_path)
         | 
| 5 | 
            +
                    FileUtils.mkdir_p(File.join('.', 'config'))
         | 
| 6 | 
            +
                    FileUtils.cp(
         | 
| 7 | 
            +
                      File.join(File.dirname(__FILE__), '..', '..', 'files', 'license_finder.yml'),
         | 
| 8 | 
            +
                      LicenseFinder.config.config_file_path
         | 
| 9 | 
            +
                    )
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                def initialize
         | 
| 14 | 
            +
                  self.class.create_default_configuration
         | 
| 15 | 
            +
                  @dependency_list = generate_list
         | 
| 16 | 
            +
                  save_reports
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                def action_items
         | 
| 20 | 
            +
                  dependency_list.action_items
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                private
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                attr_reader :dependency_list
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                def save_reports
         | 
| 28 | 
            +
                  write_file LicenseFinder.config.dependencies_yaml, dependency_list.to_yaml
         | 
| 29 | 
            +
                  write_file LicenseFinder.config.dependencies_text, dependency_list.to_s
         | 
| 30 | 
            +
                  write_file LicenseFinder.config.dependencies_html, dependency_list.to_html
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                def write_file(file_path, content)
         | 
| 34 | 
            +
                  File.open(file_path, 'w+') do |f|
         | 
| 35 | 
            +
                    f.puts content
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                def generate_list
         | 
| 40 | 
            +
                  bundler_list = DependencyList.from_bundler
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                  if File.exists?(LicenseFinder.config.dependencies_yaml)
         | 
| 43 | 
            +
                    yml = File.open(LicenseFinder.config.dependencies_yaml).readlines.join
         | 
| 44 | 
            +
                    existing_list = DependencyList.from_yaml(yml)
         | 
| 45 | 
            +
                    existing_list.merge(bundler_list)
         | 
| 46 | 
            +
                  else
         | 
| 47 | 
            +
                    bundler_list
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
                end
         | 
| 50 | 
            +
              end
         | 
| 51 | 
            +
            end
         | 
| @@ -0,0 +1,31 @@ | |
| 1 | 
            +
            module LicenseFinder
         | 
| 2 | 
            +
              module Viewable
         | 
| 3 | 
            +
                def self.included(base)
         | 
| 4 | 
            +
                  base.class_eval do
         | 
| 5 | 
            +
                    extend ClassMethods
         | 
| 6 | 
            +
                  end
         | 
| 7 | 
            +
                end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                module ClassMethods
         | 
| 10 | 
            +
                  def underscored_name
         | 
| 11 | 
            +
                    @underscored_name ||= begin
         | 
| 12 | 
            +
                      str = name.dup
         | 
| 13 | 
            +
                      str.sub!(/.*::/, '')
         | 
| 14 | 
            +
                      str.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
         | 
| 15 | 
            +
                      str.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
         | 
| 16 | 
            +
                      str.downcase!
         | 
| 17 | 
            +
                    end
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                def to_yaml
         | 
| 22 | 
            +
                  as_yaml.to_yaml
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                def to_html
         | 
| 26 | 
            +
                  filename = File.join(File.dirname(__FILE__), '..', 'templates', "#{self.class.underscored_name}.html.erb")
         | 
| 27 | 
            +
                  template = ERB.new(File.read(filename))
         | 
| 28 | 
            +
                  template.result(binding)
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
            end
         | 
| @@ -1,29 +1,4 @@ | |
| 1 | 
            -
             | 
| 2 | 
            -
             | 
| 3 | 
            -
               | 
| 4 | 
            -
                `mkdir -p ./config`
         | 
| 5 | 
            -
                FileUtils.cp(File.join(File.dirname(__FILE__), '..', '..', 'files', 'license_finder.yml'), './config/license_finder.yml')
         | 
| 6 | 
            -
              end
         | 
| 7 | 
            -
             | 
| 8 | 
            -
              desc 'generate a list of dependency licenses'
         | 
| 9 | 
            -
              task :generate_dependencies do
         | 
| 10 | 
            -
                LicenseFinder::Finder.new.write_files
         | 
| 11 | 
            -
              end
         | 
| 12 | 
            -
             | 
| 13 | 
            -
              desc 'action items'
         | 
| 14 | 
            -
              task :action_items => :generate_dependencies do
         | 
| 15 | 
            -
                LicenseFinder::CLI.new.check_for_action_items
         | 
| 16 | 
            -
              end
         | 
| 17 | 
            -
             | 
| 18 | 
            -
              desc 'return a failure status code for unapproved dependencies'
         | 
| 19 | 
            -
              task 'action_items:ok' => :generate_dependencies do
         | 
| 20 | 
            -
                puts "rake license:action_items:ok is deprecated and will be removed in version 1.0.  Use rake license:action_items instead."
         | 
| 21 | 
            -
             | 
| 22 | 
            -
                found = LicenseFinder::Finder.new.action_items
         | 
| 23 | 
            -
                if found.size == 0
         | 
| 24 | 
            -
                  puts "All gems are approved for use"
         | 
| 25 | 
            -
                else
         | 
| 26 | 
            -
                  exit 1
         | 
| 27 | 
            -
                end
         | 
| 28 | 
            -
              end
         | 
| 1 | 
            +
            desc 'Audit your Gemfile for software licenses. This is the same as running `license_finder` in the terminal.'
         | 
| 2 | 
            +
            task :license_finder do
         | 
| 3 | 
            +
              LicenseFinder::CLI.check_for_action_items
         | 
| 29 4 | 
             
            end
         | 
| @@ -0,0 +1,54 @@ | |
| 1 | 
            +
            <div id="<%= name %>" class="<%= approved ? "approved" : "unapproved" %>">
         | 
| 2 | 
            +
              <h2>
         | 
| 3 | 
            +
                <% if homepage && !homepage.empty? %>
         | 
| 4 | 
            +
                  <a href="<%= homepage %>"><%= name %></a>
         | 
| 5 | 
            +
                <% else %>
         | 
| 6 | 
            +
                  <%= name %>
         | 
| 7 | 
            +
                <% end %>
         | 
| 8 | 
            +
                v<%= version %>
         | 
| 9 | 
            +
                <% if bundler_groups.any? %>
         | 
| 10 | 
            +
                  (<%= bundler_groups.join(", ") %>)
         | 
| 11 | 
            +
                <% end %>
         | 
| 12 | 
            +
              </h2>
         | 
| 13 | 
            +
              <table class="table table-striped table-bordered">
         | 
| 14 | 
            +
                <thead>
         | 
| 15 | 
            +
                <tr>
         | 
| 16 | 
            +
                  <th>Summary</th>
         | 
| 17 | 
            +
                  <th>Description</th>
         | 
| 18 | 
            +
                  <th>License</th>
         | 
| 19 | 
            +
                </tr>
         | 
| 20 | 
            +
                </thead>
         | 
| 21 | 
            +
                <tbody>
         | 
| 22 | 
            +
                <tr>
         | 
| 23 | 
            +
                  <td><%= summary %></td>
         | 
| 24 | 
            +
                  <td><%= description %></td>
         | 
| 25 | 
            +
                  <td>
         | 
| 26 | 
            +
                    <% if license_url && !license_url.empty? %>
         | 
| 27 | 
            +
                      <a href="<%= license_url %>"><%= license %></a>
         | 
| 28 | 
            +
                    <% else %>
         | 
| 29 | 
            +
                      <%= license %>
         | 
| 30 | 
            +
                    <% end %>
         | 
| 31 | 
            +
                  </td>
         | 
| 32 | 
            +
                  </td>
         | 
| 33 | 
            +
                </tr>
         | 
| 34 | 
            +
                </tbody>
         | 
| 35 | 
            +
              </table>
         | 
| 36 | 
            +
             | 
| 37 | 
            +
              <% if parents.any? %>
         | 
| 38 | 
            +
                <dl>
         | 
| 39 | 
            +
                  <dt>Parents</dt>
         | 
| 40 | 
            +
                  <% parents.each do |parent| %>
         | 
| 41 | 
            +
                    <dd><%= parent.name %></dd>
         | 
| 42 | 
            +
                  <% end %>
         | 
| 43 | 
            +
                </dl>
         | 
| 44 | 
            +
              <% end %>
         | 
| 45 | 
            +
             | 
| 46 | 
            +
              <% if children.any? %>
         | 
| 47 | 
            +
                <dl>
         | 
| 48 | 
            +
                  <dt>Children</dt>
         | 
| 49 | 
            +
                  <% children.each do |child| %>
         | 
| 50 | 
            +
                    <dd><%= child.name %></dd>
         | 
| 51 | 
            +
                  <% end %>
         | 
| 52 | 
            +
                </dl>
         | 
| 53 | 
            +
              <% end %>
         | 
| 54 | 
            +
            </div>
         | 
| @@ -0,0 +1,38 @@ | |
| 1 | 
            +
            <html>
         | 
| 2 | 
            +
            <head>
         | 
| 3 | 
            +
              <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.1.1/css/bootstrap.min.css" rel="stylesheet">
         | 
| 4 | 
            +
              <style type="text/css">
         | 
| 5 | 
            +
                body {
         | 
| 6 | 
            +
                  margin: 50px;
         | 
| 7 | 
            +
                }
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                .unapproved h2, .unapproved h2 a {
         | 
| 10 | 
            +
                  color: red;
         | 
| 11 | 
            +
                }
         | 
| 12 | 
            +
              </style>
         | 
| 13 | 
            +
            </head>
         | 
| 14 | 
            +
            <body>
         | 
| 15 | 
            +
            <div class="container">
         | 
| 16 | 
            +
              <div class="summary hero-unit">
         | 
| 17 | 
            +
                <h1>Dependencies</h1>
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                <h4>
         | 
| 20 | 
            +
                  <%= dependencies.size %> total
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  <% if unapproved_dependencies.any? %>
         | 
| 23 | 
            +
                    <span class="badge badge-important"><%= unapproved_dependencies.size %> unapproved</span>
         | 
| 24 | 
            +
                  <% end %>
         | 
| 25 | 
            +
                </h4>
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                <ul>
         | 
| 28 | 
            +
                  <% grouped_dependencies.each do |license, group| %>
         | 
| 29 | 
            +
                    <li><%= group.size %> <%= license %></li>
         | 
| 30 | 
            +
                  <% end %>
         | 
| 31 | 
            +
                </ul>
         | 
| 32 | 
            +
              </div>
         | 
| 33 | 
            +
              <div class="dependencies">
         | 
| 34 | 
            +
                <%= sorted_dependencies.map(&:to_html).join("\n") %>
         | 
| 35 | 
            +
              </div>
         | 
| 36 | 
            +
            </div>
         | 
| 37 | 
            +
            </body>
         | 
| 38 | 
            +
            </html>
         | 
    
        data/license_finder.gemspec
    CHANGED
    
    | @@ -1,16 +1,24 @@ | |
| 1 1 | 
             
            Gem::Specification.new do |s|
         | 
| 2 2 | 
             
              s.name        = "license_finder"
         | 
| 3 | 
            -
              s.version     = "0. | 
| 3 | 
            +
              s.version     = "0.6.0"
         | 
| 4 4 | 
             
              s.authors     = ["Jacob Maine", "Matthew Kane Parker", "Ian Lesperance", "David Edwards", "Paul Meskers"]
         | 
| 5 5 | 
             
              s.email       = ["brent@pivotalabs.com"]
         | 
| 6 6 | 
             
              s.homepage    = "https://github.com/pivotal/LicenseFinder"
         | 
| 7 | 
            -
              s.summary     = " | 
| 8 | 
            -
             | 
| 7 | 
            +
              s.summary     = "Audit the OSS licenses of your application's dependencies."
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              s.description = <<-DESCRIPTION
         | 
| 10 | 
            +
              Do you know the licenses of all your application's dependencies? What open source software licenses will your business accept?
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              LicenseFinder culls your Gemfile, detects the licenses of the gems in it, and gives you a report that you can act on. If you already know 
         | 
| 13 | 
            +
              what licenses your business is comfortable with, you can whitelist them, leaving you with an action report of only those dependencies that have 
         | 
| 14 | 
            +
              licenses that fall outside of the whitelist.
         | 
| 15 | 
            +
              DESCRIPTION
         | 
| 16 | 
            +
             | 
| 9 17 | 
             
              s.license     = "MIT"
         | 
| 10 18 |  | 
| 11 19 | 
             
              s.add_dependency "bundler"
         | 
| 12 20 | 
             
              s.add_development_dependency "rails", ">=3"
         | 
| 13 | 
            -
              %w(rspec rr rake cucumber rails pry).each do |gem|
         | 
| 21 | 
            +
              %w(rspec rr rake cucumber rails pry capybara).each do |gem|
         | 
| 14 22 | 
             
                s.add_development_dependency gem
         | 
| 15 23 | 
             
              end
         | 
| 16 24 |  | 
| @@ -9,11 +9,12 @@ describe LicenseFinder::BundledGem do | |
| 9 9 | 
             
                  s.version = '2.1.3'
         | 
| 10 10 | 
             
                  s.summary = 'summary'
         | 
| 11 11 | 
             
                  s.description = 'description'
         | 
| 12 | 
            +
                  s.homepage = 'homepage'
         | 
| 12 13 | 
             
                end
         | 
| 13 14 | 
             
              end
         | 
| 14 15 |  | 
| 15 16 | 
             
              def fixture_path(fixture)
         | 
| 16 | 
            -
                 | 
| 17 | 
            +
                Pathname.new(File.join(File.dirname(__FILE__), '..', '..', '..', 'spec', 'fixtures', fixture)).realpath.to_s
         | 
| 17 18 | 
             
              end
         | 
| 18 19 |  | 
| 19 20 | 
             
              its(:name) { should == 'spec_name 2.1.3' }
         | 
| @@ -108,14 +109,15 @@ describe LicenseFinder::BundledGem do | |
| 108 109 | 
             
                end
         | 
| 109 110 | 
             
              end
         | 
| 110 111 |  | 
| 111 | 
            -
              describe '# | 
| 112 | 
            -
                subject { LicenseFinder::BundledGem.new(gemspec). | 
| 112 | 
            +
              describe '#to_dependency' do
         | 
| 113 | 
            +
                subject { LicenseFinder::BundledGem.new(gemspec).to_dependency }
         | 
| 113 114 |  | 
| 114 115 | 
             
                its(:name) { should == 'spec_name' }
         | 
| 115 116 | 
             
                its(:version) { should == '2.1.3' }
         | 
| 116 117 | 
             
                its(:summary) { should == 'summary' }
         | 
| 117 118 | 
             
                its(:source) { should == 'bundle' }
         | 
| 118 119 | 
             
                its(:description) { should == 'description' }
         | 
| 120 | 
            +
                its(:homepage) { should == 'homepage' }
         | 
| 119 121 |  | 
| 120 122 | 
             
                describe 'with a known license' do
         | 
| 121 123 | 
             
                  before do
         | 
| @@ -1,12 +1,16 @@ | |
| 1 1 | 
             
            require 'spec_helper'
         | 
| 2 2 |  | 
| 3 3 | 
             
            describe LicenseFinder::DependencyList do
         | 
| 4 | 
            -
              def build_gemspec(name, version)
         | 
| 4 | 
            +
              def build_gemspec(name, version, dependency=nil)
         | 
| 5 5 | 
             
                Gem::Specification.new do |s|
         | 
| 6 6 | 
             
                  s.name = name
         | 
| 7 7 | 
             
                  s.version = version
         | 
| 8 8 | 
             
                  s.summary = 'summary'
         | 
| 9 9 | 
             
                  s.description = 'description'
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  if dependency
         | 
| 12 | 
            +
                    s.add_dependency dependency
         | 
| 13 | 
            +
                  end
         | 
| 10 14 | 
             
                end
         | 
| 11 15 | 
             
              end
         | 
| 12 16 |  | 
| @@ -37,6 +41,24 @@ describe LicenseFinder::DependencyList do | |
| 37 41 | 
             
                  subject.dependencies[1].name.should == 'gem2'
         | 
| 38 42 | 
             
                  subject.dependencies[1].version.should == '0.4.2'
         | 
| 39 43 | 
             
                end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                context "when initialized with a parent and child gem" do
         | 
| 46 | 
            +
                  subject do
         | 
| 47 | 
            +
                    bundle = stub(Bundler::Definition).build.stub!
         | 
| 48 | 
            +
                    bundle.dependencies { [] }
         | 
| 49 | 
            +
                    bundle.groups { [] }
         | 
| 50 | 
            +
                    bundle.specs_for { [build_gemspec('gem1', '1.2.3', 'gem2'), build_gemspec('gem2', '0.4.2')] }
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                    LicenseFinder::DependencyList.from_bundler
         | 
| 53 | 
            +
                  end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                  it "should update the child dependency with its parent data" do
         | 
| 56 | 
            +
                    gem1 = subject.dependencies.first
         | 
| 57 | 
            +
                    gem2 = subject.dependencies.last
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                    gem2.parents.should == [gem1]
         | 
| 60 | 
            +
                  end
         | 
| 61 | 
            +
                end
         | 
| 40 62 | 
             
              end
         | 
| 41 63 |  | 
| 42 64 | 
             
              describe '#from_yaml' do
         | 
| @@ -74,7 +96,8 @@ describe LicenseFinder::DependencyList do | |
| 74 96 | 
             
                      'license' => 'MIT',
         | 
| 75 97 | 
             
                      'approved' => false,
         | 
| 76 98 | 
             
                      'source' => nil,
         | 
| 77 | 
            -
                      ' | 
| 99 | 
            +
                      'homepage' => nil,
         | 
| 100 | 
            +
                      'license_url' => LicenseFinder::License::MIT.license_url,
         | 
| 78 101 | 
             
                      'notes' => '',
         | 
| 79 102 | 
             
                      'license_files' => nil,
         | 
| 80 103 | 
             
                      'readme_files' => nil
         | 
| @@ -85,7 +108,8 @@ describe LicenseFinder::DependencyList do | |
| 85 108 | 
             
                      'license' => 'MIT',
         | 
| 86 109 | 
             
                      'approved' => false,
         | 
| 87 110 | 
             
                      'source' => 'bundle',
         | 
| 88 | 
            -
                      ' | 
| 111 | 
            +
                      'homepage' => nil,
         | 
| 112 | 
            +
                      'license_url' => LicenseFinder::License::MIT.license_url,
         | 
| 89 113 | 
             
                      'notes' => '',
         | 
| 90 114 | 
             
                      'license_files' => nil,
         | 
| 91 115 | 
             
                      'readme_files' => nil
         | 
| @@ -175,24 +199,45 @@ describe LicenseFinder::DependencyList do | |
| 175 199 | 
             
              describe "#to_s" do
         | 
| 176 200 | 
             
                it "should return a human readable list of dependencies" do
         | 
| 177 201 |  | 
| 178 | 
            -
                  gem1 = Struct.new(:name, :to_s).new("a", "a string | 
| 202 | 
            +
                  gem1 = Struct.new(:name, :to_s).new("a", "a string")
         | 
| 179 203 | 
             
                  gem2 = Struct.new(:name, :to_s).new("b", "b string")
         | 
| 180 204 |  | 
| 181 205 | 
             
                  list = LicenseFinder::DependencyList.new([gem2, gem1])
         | 
| 182 206 |  | 
| 183 | 
            -
                  list.to_s.should == "a string  | 
| 207 | 
            +
                  list.to_s.should == "a string\nb string"
         | 
| 184 208 | 
             
                end
         | 
| 185 209 | 
             
              end
         | 
| 186 210 |  | 
| 187 211 | 
             
              describe '#action_items' do
         | 
| 188 212 | 
             
                it "should return all unapproved dependencies" do
         | 
| 189 | 
            -
                  gem1 =  | 
| 190 | 
            -
                   | 
| 191 | 
            -
             | 
| 213 | 
            +
                  gem1 = LicenseFinder::Dependency.new('name' => 'a', 'approved' => true)
         | 
| 214 | 
            +
                  stub(gem1).to_s { 'a string' }
         | 
| 215 | 
            +
             | 
| 216 | 
            +
                  gem2 = LicenseFinder::Dependency.new('name' => 'b', 'approved' => false)
         | 
| 217 | 
            +
                  stub(gem2).to_s { 'b string' }
         | 
| 218 | 
            +
             | 
| 219 | 
            +
                  gem3 = LicenseFinder::Dependency.new('name' => 'c', 'approved' => false)
         | 
| 220 | 
            +
                  stub(gem3).to_s { 'c string' }
         | 
| 192 221 |  | 
| 193 222 | 
             
                  list = LicenseFinder::DependencyList.new([gem1, gem2, gem3])
         | 
| 194 223 |  | 
| 195 | 
            -
                  list.action_items.should == "b string  | 
| 224 | 
            +
                  list.action_items.should == "b string\nc string"
         | 
| 225 | 
            +
                end
         | 
| 226 | 
            +
              end
         | 
| 227 | 
            +
             | 
| 228 | 
            +
              describe '#to_html' do
         | 
| 229 | 
            +
                it "should concatenate the results of the each dependency's #to_html and plop it into a proper HTML document" do
         | 
| 230 | 
            +
                  gem1 = LicenseFinder::Dependency.new('name' => 'a')
         | 
| 231 | 
            +
                  stub(gem1).to_html { 'A' }
         | 
| 232 | 
            +
             | 
| 233 | 
            +
                  gem2 = LicenseFinder::Dependency.new('name' => 'b')
         | 
| 234 | 
            +
                  stub(gem2).to_html { 'B' }
         | 
| 235 | 
            +
             | 
| 236 | 
            +
                  list = LicenseFinder::DependencyList.new([gem1, gem2])
         | 
| 237 | 
            +
             | 
| 238 | 
            +
                  html = list.to_html
         | 
| 239 | 
            +
                  html.should include "A"
         | 
| 240 | 
            +
                  html.should include "B"
         | 
| 196 241 | 
             
                end
         | 
| 197 242 | 
             
              end
         | 
| 198 243 | 
             
            end
         |