Class: Licensee::ProjectFiles::LicenseFile

Inherits:
ProjectFile
  • Object
show all
Includes:
ContentHelper
Defined in:
lib/licensee/project_files/license_file.rb

Direct Known Subclasses

ReadmeFile

Constant Summary collapse

PREFERRED_EXT =

List of extensions to give preference to

%w[md markdown txt].freeze
PREFERRED_EXT_REGEX =
/\.#{Regexp.union(PREFERRED_EXT)}\z/.freeze
OTHER_EXT_REGEX =

Regex to match any extension except .spdx or .header

%r{\.(?!spdx|header|gemspec)[^./]+\z}i.freeze
LICENSE_REGEX =

Regex to match, LICENSE, LICENCE, unlicense, etc.

/(un)?licen[sc]e/i.freeze
COPYING_REGEX =

Regex to match COPYING, COPYRIGHT, etc.

/copy(ing|right)/i.freeze
OFL_REGEX =

Regex to match OFL.

/ofl/i.freeze
PATENTS_REGEX =

BSD + PATENTS patent file

/patents/i.freeze
FILENAME_REGEXES =

Hash of Regex => score with which to score potential license files

{
  /\A#{LICENSE_REGEX}\z/                       => 1.00,  # LICENSE
  /\A#{LICENSE_REGEX}#{PREFERRED_EXT_REGEX}\z/ => 0.95,  # LICENSE.md
  /\A#{COPYING_REGEX}\z/                       => 0.90,  # COPYING
  /\A#{COPYING_REGEX}#{PREFERRED_EXT_REGEX}\z/ => 0.85,  # COPYING.md
  /\A#{LICENSE_REGEX}#{OTHER_EXT_REGEX}\z/     => 0.80,  # LICENSE.textile
  /\A#{COPYING_REGEX}#{OTHER_EXT_REGEX}\z/     => 0.75,  # COPYING.textile
  /\A#{LICENSE_REGEX}[-_]/                     => 0.70,  # LICENSE-MIT
  /\A#{COPYING_REGEX}[-_]/                     => 0.65,  # COPYING-MIT
  /[-_]#{LICENSE_REGEX}/                       => 0.60,  # MIT-LICENSE-MIT
  /[-_]#{COPYING_REGEX}/                       => 0.55,  # MIT-COPYING
  /\A#{OFL_REGEX}#{PREFERRED_EXT_REGEX}/       => 0.50,  # OFL.md
  /\A#{OFL_REGEX}#{OTHER_EXT_REGEX}/           => 0.45,  # OFL.textile
  /\A#{OFL_REGEX}\z/                           => 0.40,  # OFL
  /\A#{PATENTS_REGEX}\z/                       => 0.35,  # PATENTS
  /\A#{PATENTS_REGEX}#{OTHER_EXT_REGEX}\z/     => 0.30,  # PATENTS.txt
  //                                           => 0.00   # Catch all
}.freeze
CC_FALSE_POSITIVE_REGEX =

CC-NC and CC-ND are not open source licenses and should not be detected as CC-BY or CC-BY-SA which are 98%+ similar

/
  ^(creative\ commons\ )?Attribution-(NonCommercial|NoDerivatives)
/xi.freeze

Constants included from ContentHelper

ContentHelper::ALT_TITLE_REGEX, ContentHelper::DIGEST, ContentHelper::END_OF_TERMS_REGEX, ContentHelper::NORMALIZATIONS, ContentHelper::REGEXES, ContentHelper::START_REGEX, ContentHelper::STRIP_METHODS, ContentHelper::VARIETAL_WORDS

Constants inherited from ProjectFile

ProjectFile::ENCODING, ProjectFile::ENCODING_OPTIONS, ProjectFile::HASH_METHODS

Instance Attribute Summary

Attributes inherited from ProjectFile

#content

Class Method Summary collapse

Instance Method Summary collapse

Methods included from ContentHelper

const_missing, #content_hash, #content_normalized, #content_without_title_and_version, format_percent, #length, #length_delta, #max_delta, #similarity, title_regex, #wordset, wrap

Methods inherited from ProjectFile

#confidence, #content_hash, #content_normalized, #copyright?, #directory, #filename, #initialize, #matched_license, #matcher, #path_relative_to_root

Methods included from HashHelper

#to_h

Constructor Details

This class inherits a constructor from Licensee::ProjectFiles::ProjectFile

Class Method Details

.lesser_gpl_score(filename) ⇒ Object

case-insensitive block to determine if the given file is LICENSE.lesser



91
92
93
# File 'lib/licensee/project_files/license_file.rb', line 91

def self.lesser_gpl_score(filename)
  filename.casecmp('copying.lesser').zero? ? 1 : 0
end

.name_score(filename) ⇒ Object



86
87
88
# File 'lib/licensee/project_files/license_file.rb', line 86

def self.name_score(filename)
  FILENAME_REGEXES.find { |regex, _| filename =~ regex }[1]
end

Instance Method Details

#attributionObject



55
56
57
58
59
60
61
62
63
# File 'lib/licensee/project_files/license_file.rb', line 55

def attribution
  @attribution ||= begin
    return unless copyright? || license.content =~ /\[fullname\]/

    matches = Matchers::Copyright::REGEX
              .match(content_without_title_and_version)
    matches[0] if matches
  end
end

#gpl?Boolean

Returns:

  • (Boolean)


74
75
76
# File 'lib/licensee/project_files/license_file.rb', line 74

def gpl?
  license && license.gpl?
end

#lgpl?Boolean

Returns:

  • (Boolean)


70
71
72
# File 'lib/licensee/project_files/license_file.rb', line 70

def lgpl?
  LicenseFile.lesser_gpl_score(filename) == 1 && license && license.lgpl?
end

#licenseObject



78
79
80
81
82
83
84
# File 'lib/licensee/project_files/license_file.rb', line 78

def license
  if matcher && matcher.match
    matcher.match
  else
    License.find('other')
  end
end

#possible_matchersObject



51
52
53
# File 'lib/licensee/project_files/license_file.rb', line 51

def possible_matchers
  [Matchers::Copyright, Matchers::Exact, Matchers::Dice]
end

#potential_false_positive?Boolean

Is this file likely to result in a creative commons false positive?

Returns:

  • (Boolean)


66
67
68
# File 'lib/licensee/project_files/license_file.rb', line 66

def potential_false_positive?
  content.strip =~ CC_FALSE_POSITIVE_REGEX
end