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/
ANY_EXT_REGEX =

Regex to match any extension

%r{\.[^./]+\z}
LICENSE_REGEX =

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

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

Regex to match COPYING, COPYRIGHT, etc.

/copy(ing|right)/i
OFL_REGEX =

Regex to match OFL.

/ofl/i
PATENTS_REGEX =

BSD + PATENTS patent file

/patents/i
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}#{ANY_EXT_REGEX}\z/       => 0.80,  # LICENSE.textile
  /\A#{COPYING_REGEX}#{ANY_EXT_REGEX}\z/       => 0.75,  # COPYING.textile
  /#{LICENSE_REGEX}-/                          => 0.70,  # LICENSE-MIT
  /#{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}#{ANY_EXT_REGEX}/             => 0.45,  # OFL.textile
  /\A#{OFL_REGEX}\z/                           => 0.40,  # OFL
  /\A#{PATENTS_REGEX}\z/                       => 0.35,  # PATENTS
  /\A#{PATENTS_REGEX}#{ANY_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

Constants included from ContentHelper

ContentHelper::ALL_RIGHTS_RESERVED_REGEX, ContentHelper::ALT_TITLE_REGEX, ContentHelper::DIGEST, ContentHelper::END_OF_TERMS_REGEX, ContentHelper::HR_REGEX, ContentHelper::MARKDOWN_HEADING_REGEX, ContentHelper::VERSION_REGEX, ContentHelper::WHITESPACE_REGEX

Constants inherited from ProjectFile

ProjectFile::ENCODING, ProjectFile::ENCODING_OPTIONS

Instance Attribute Summary

Attributes inherited from ProjectFile

#content

Class Method Summary collapse

Instance Method Summary collapse

Methods included from ContentHelper

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

Methods inherited from ProjectFile

#confidence, #filename, #initialize, #matcher

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



89
90
91
# File 'lib/licensee/project_files/license_file.rb', line 89

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

.name_score(filename) ⇒ Object



84
85
86
# File 'lib/licensee/project_files/license_file.rb', line 84

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

Instance Method Details

#attributionObject



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

def attribution
  @attribution ||= begin
    matches = Matchers::Copyright::REGEX
              .match(content_without_title_and_version)
    matches[0] if matches
  end
end

#gpl?Boolean



72
73
74
# File 'lib/licensee/project_files/license_file.rb', line 72

def gpl?
  license && license.gpl?
end

#lgpl?Boolean



68
69
70
# File 'lib/licensee/project_files/license_file.rb', line 68

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

#licenseObject



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

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?



64
65
66
# File 'lib/licensee/project_files/license_file.rb', line 64

def potential_false_positive?
  content.strip =~ CC_FALSE_POSITIVE_REGEX
end