licensee 9.6.0 → 9.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +5 -5
  2. data/lib/licensee.rb +5 -1
  3. data/lib/licensee/content_helper.rb +7 -1
  4. data/lib/licensee/matchers.rb +1 -0
  5. data/lib/licensee/matchers/gemspec.rb +31 -5
  6. data/lib/licensee/matchers/npm_bower.rb +1 -1
  7. data/lib/licensee/matchers/spdx.rb +16 -0
  8. data/lib/licensee/project_files/license_file.rb +6 -6
  9. data/lib/licensee/project_files/package_manager_file.rb +13 -8
  10. data/lib/licensee/project_files/project_file.rb +1 -1
  11. data/lib/licensee/projects.rb +1 -0
  12. data/lib/licensee/projects/github_project.rb +47 -0
  13. data/lib/licensee/version.rb +1 -1
  14. data/spec/bin_spec.rb +2 -1
  15. data/spec/fixtures/apache-with-readme-notice/LICENSE.header +16 -0
  16. data/spec/fixtures/markdown-gpl/LICENSE.md +361 -0
  17. data/spec/fixtures/webmock/licensee.json +26 -0
  18. data/spec/integration_spec.rb +9 -0
  19. data/spec/licensee/content_helper_spec.rb +5 -1
  20. data/spec/licensee/license_spec.rb +3 -3
  21. data/spec/licensee/matchers/gemspec_matcher_spec.rb +11 -1
  22. data/spec/licensee/matchers/npm_bower_matcher_spec.rb +11 -2
  23. data/spec/licensee/matchers/spdx_matcher_spec.rb +41 -0
  24. data/spec/licensee/project_files/license_file_spec.rb +3 -3
  25. data/spec/licensee/project_spec.rb +32 -5
  26. data/spec/licensee/projects/github_project_spec.rb +109 -0
  27. data/spec/licensee_spec.rb +15 -3
  28. data/spec/spec_helper.rb +20 -0
  29. data/vendor/choosealicense.com/_licenses/afl-3.0.txt +168 -41
  30. data/vendor/choosealicense.com/_licenses/apache-2.0.txt +2 -2
  31. data/vendor/choosealicense.com/_licenses/bsd-2-clause.txt +1 -1
  32. data/vendor/choosealicense.com/_licenses/bsd-3-clause-clear.txt +25 -25
  33. data/vendor/choosealicense.com/_licenses/bsd-3-clause.txt +1 -1
  34. data/vendor/choosealicense.com/_licenses/ecl-2.0.txt +1 -1
  35. data/vendor/choosealicense.com/_licenses/epl-1.0.txt +59 -59
  36. data/vendor/choosealicense.com/_licenses/epl-2.0.txt +311 -0
  37. data/vendor/choosealicense.com/_licenses/gpl-2.0.txt +3 -2
  38. data/vendor/choosealicense.com/_licenses/gpl-3.0.txt +1 -1
  39. data/vendor/choosealicense.com/_licenses/isc.txt +1 -1
  40. data/vendor/choosealicense.com/_licenses/mit.txt +2 -2
  41. data/vendor/choosealicense.com/_licenses/ms-pl.txt +52 -22
  42. data/vendor/choosealicense.com/_licenses/ms-rl.txt +64 -21
  43. data/vendor/choosealicense.com/_licenses/ncsa.txt +3 -3
  44. data/vendor/choosealicense.com/_licenses/wtfpl.txt +1 -1
  45. metadata +41 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 6dc03da7b85af43160fabdd877969b47865f7a3a
4
- data.tar.gz: 590c50612c7d602a375d81c7d26cde0f85f94ac3
2
+ SHA256:
3
+ metadata.gz: 688ece76934b3607042666300f8f38cf174db32da4c06e99823f32fc1f043375
4
+ data.tar.gz: 22d8028390732a2b75040153fdcc8fd630aa1af0f3ce9844fb023a39bd433955
5
5
  SHA512:
6
- metadata.gz: 793e8eff41106beca118b3223270ad67de8573570d3e169f009cb2d250c92e660818e07e35105fa1beedc0fc07f145608ef90886297829524201c74bfde86f09
7
- data.tar.gz: 200981a147b856337ee7ed1425e6dd38ccd03e7558e56bb79b87ded8f67b673df679fdaec5c95ff6a2d2c169a61695811c104c5b4ccf753946a7d497ce9731ed
6
+ metadata.gz: ba90beba409193357cf1a685b805e0c9acb68e1771b58bdc02114f4a1290a6a15b8d912e07d8c108b7c7adfcfc79454658154bb421a0fa9eeb4466cffb3b4d0e
7
+ data.tar.gz: f355dcb2386c642d745d791597015a2ce024775c0d07a24f95059baa58831e1835086a23f57a5290b99e750a9866a7e8255c65eb939849e010b9aeb4aa84b8b2
@@ -35,7 +35,11 @@ module Licensee
35
35
  end
36
36
 
37
37
  def project(path, **args)
38
- Licensee::Projects::GitProject.new(path, args)
38
+ if path =~ %r{\Ahttps://github.com}
39
+ Licensee::Projects::GitHubProject.new(path, args)
40
+ else
41
+ Licensee::Projects::GitProject.new(path, args)
42
+ end
39
43
  rescue Licensee::Projects::GitProject::InvalidRepository
40
44
  Licensee::Projects::FSProject.new(path, args)
41
45
  end
@@ -4,13 +4,14 @@ require 'digest'
4
4
  module Licensee
5
5
  module ContentHelper
6
6
  DIGEST = Digest::SHA1
7
- END_OF_TERMS_REGEX = /^\s*end of terms and conditions\s*$/i
7
+ END_OF_TERMS_REGEX = /^[\s#*_]*end of terms and conditions\s*$/i
8
8
  HR_REGEX = /[=\-\*][=\-\*\s]{3,}/
9
9
  ALT_TITLE_REGEX = License::ALT_TITLE_REGEX
10
10
  ALL_RIGHTS_RESERVED_REGEX = /\Aall rights reserved\.?$/i
11
11
  WHITESPACE_REGEX = /\s+/
12
12
  MARKDOWN_HEADING_REGEX = /\A\s*#+/
13
13
  VERSION_REGEX = /\Aversion.*$/i
14
+ MARKUP_REGEX = /[#_*=~\[\]()`|>]+/
14
15
 
15
16
  # A set of each word in the license, without duplicates
16
17
  def wordset
@@ -77,6 +78,7 @@ module Licensee
77
78
  end
78
79
  string = strip_all_rights_reserved(string)
79
80
  string, _partition, _instructions = string.partition(END_OF_TERMS_REGEX)
81
+ string = strip_markup(string)
80
82
  strip_whitespace(string)
81
83
  end
82
84
 
@@ -155,6 +157,10 @@ module Licensee
155
157
  strip(string, ALL_RIGHTS_RESERVED_REGEX)
156
158
  end
157
159
 
160
+ def strip_markup(string)
161
+ strip(string, MARKUP_REGEX)
162
+ end
163
+
158
164
  def strip(string, regex)
159
165
  string.gsub(regex, ' ').squeeze(' ').strip
160
166
  end
@@ -11,5 +11,6 @@ module Licensee
11
11
  autoload :NpmBower, 'licensee/matchers/npm_bower'
12
12
  autoload :Package, 'licensee/matchers/package'
13
13
  autoload :Reference, 'licensee/matchers/reference'
14
+ autoload :Spdx, 'licensee/matchers/spdx'
14
15
  end
15
16
  end
@@ -1,19 +1,45 @@
1
1
  module Licensee
2
2
  module Matchers
3
3
  class Gemspec < Licensee::Matchers::Package
4
+ # a value is a string surrounded by any amount of whitespace
5
+ # optionally ended with (non-captured) ".freeze"
6
+ VALUE_REGEX = /\s*[\'\"]([a-z\-0-9\.]+)[\'\"](?:\.freeze)?\s*/i
7
+
8
+ # an array contains one or more values. all values, or array itself,
9
+ # can be surrounded by any amount of whitespace. do not capture
10
+ # non-value groups
11
+ ARRAY_REGEX = /\s*\[#{VALUE_REGEX}(?:,#{VALUE_REGEX})*\]\s*/i
12
+
4
13
  DECLARATION_REGEX = /
5
- ^\s*[a-z0-9_]+\.([a-z0-9_]+)\s*\=\s*[\'\"]([a-z\-0-9\.]+)[\'\"]\s*$
6
- /ix
14
+ ^\s*[a-z0-9_]+\.([a-z0-9_]+)\s*\=#{VALUE_REGEX}$
15
+ /ix
7
16
 
8
17
  LICENSE_REGEX = /
9
- ^\s*[a-z0-9_]+\.license\s*\=\s*[\'\"]([a-z\-0-9\.]+)[\'\"]\s*$
10
- /ix
18
+ ^\s*[a-z0-9_]+\.license\s*\=#{VALUE_REGEX}$
19
+ /ix
20
+
21
+ LICENSE_ARRAY_REGEX = /
22
+ ^\s*[a-z0-9_]+\.licenses\s*\=#{ARRAY_REGEX}$
23
+ /ix
11
24
 
12
25
  private
13
26
 
14
27
  def license_property
15
28
  match = @file.content.match LICENSE_REGEX
16
- match[1].downcase if match && match[1]
29
+ return match[1].downcase if match && match[1]
30
+
31
+ # check for a licenses array property
32
+ licenses = license_array_property
33
+ return unless licenses
34
+
35
+ # use 'other' if array contains multiple licenses
36
+ return 'other' unless licenses.size == 1
37
+ licenses[0]
38
+ end
39
+
40
+ def license_array_property
41
+ match = @file.content.match LICENSE_ARRAY_REGEX
42
+ match.captures.compact.map(&:downcase) if match
17
43
  end
18
44
 
19
45
  def declarations
@@ -4,7 +4,7 @@ module Licensee
4
4
  # While we could parse the package.json or bower.json file, prefer
5
5
  # a lenient regex for speed and security. Moar parsing moar problems.
6
6
  LICENSE_REGEX = /
7
- \s*[\"\']license[\"\']\s*\:\s*[\'\"]([a-z\-0-9\.]+)[\'\"],?\s*
7
+ \s*[\"\']license[\"\']\s*\:\s*[\'\"]([a-z\-0-9\.+ ()]+)[\'\"],?\s*
8
8
  /ix
9
9
 
10
10
  private
@@ -0,0 +1,16 @@
1
+ module Licensee
2
+ module Matchers
3
+ class Spdx < Licensee::Matchers::Package
4
+ # While we could parse the LICENSE.spdx file, prefer
5
+ # a lenient regex for speed and security. Moar parsing moar problems.
6
+ LICENSE_REGEX = /PackageLicenseDeclared:\s*([a-z\-0-9\. +()]+)\s*/i
7
+
8
+ private
9
+
10
+ def license_property
11
+ match = @file.content.match LICENSE_REGEX
12
+ match[1].downcase if match && match[1]
13
+ end
14
+ end
15
+ end
16
+ end
@@ -7,8 +7,8 @@ module Licensee
7
7
  PREFERRED_EXT = %w[md markdown txt].freeze
8
8
  PREFERRED_EXT_REGEX = /\.#{Regexp.union(PREFERRED_EXT)}\z/
9
9
 
10
- # Regex to match any extension
11
- ANY_EXT_REGEX = %r{\.[^./]+\z}
10
+ # Regex to match any extension except .spdx or .header
11
+ OTHER_EXT_REGEX = %r{\.(?!spdx|header)[^./]+\z}i
12
12
 
13
13
  # Regex to match, LICENSE, LICENCE, unlicense, etc.
14
14
  LICENSE_REGEX = /(un)?licen[sc]e/i
@@ -28,17 +28,17 @@ module Licensee
28
28
  /\A#{LICENSE_REGEX}#{PREFERRED_EXT_REGEX}\z/ => 0.95, # LICENSE.md
29
29
  /\A#{COPYING_REGEX}\z/ => 0.90, # COPYING
30
30
  /\A#{COPYING_REGEX}#{PREFERRED_EXT_REGEX}\z/ => 0.85, # COPYING.md
31
- /\A#{LICENSE_REGEX}#{ANY_EXT_REGEX}\z/ => 0.80, # LICENSE.textile
32
- /\A#{COPYING_REGEX}#{ANY_EXT_REGEX}\z/ => 0.75, # COPYING.textile
31
+ /\A#{LICENSE_REGEX}#{OTHER_EXT_REGEX}\z/ => 0.80, # LICENSE.textile
32
+ /\A#{COPYING_REGEX}#{OTHER_EXT_REGEX}\z/ => 0.75, # COPYING.textile
33
33
  /\A#{LICENSE_REGEX}[-_]/ => 0.70, # LICENSE-MIT
34
34
  /\A#{COPYING_REGEX}[-_]/ => 0.65, # COPYING-MIT
35
35
  /[-_]#{LICENSE_REGEX}/ => 0.60, # MIT-LICENSE-MIT
36
36
  /[-_]#{COPYING_REGEX}/ => 0.55, # MIT-COPYING
37
37
  /\A#{OFL_REGEX}#{PREFERRED_EXT_REGEX}/ => 0.50, # OFL.md
38
- /\A#{OFL_REGEX}#{ANY_EXT_REGEX}/ => 0.45, # OFL.textile
38
+ /\A#{OFL_REGEX}#{OTHER_EXT_REGEX}/ => 0.45, # OFL.textile
39
39
  /\A#{OFL_REGEX}\z/ => 0.40, # OFL
40
40
  /\A#{PATENTS_REGEX}\z/ => 0.35, # PATENTS
41
- /\A#{PATENTS_REGEX}#{ANY_EXT_REGEX}\z/ => 0.30, # PATENTS.txt
41
+ /\A#{PATENTS_REGEX}#{OTHER_EXT_REGEX}\z/ => 0.30, # PATENTS.txt
42
42
  // => 0.00 # Catch all
43
43
  }.freeze
44
44
 
@@ -10,8 +10,17 @@ module Licensee
10
10
 
11
11
  # Hash of Filename => [possible matchers]
12
12
  FILENAMES_EXTENSIONS = {
13
- 'DESCRIPTION' => [Matchers::Cran],
14
- 'dist.ini' => [Matchers::DistZilla]
13
+ 'DESCRIPTION' => [Matchers::Cran],
14
+ 'dist.ini' => [Matchers::DistZilla],
15
+ 'LICENSE.spdx' => [Matchers::Spdx]
16
+ }.freeze
17
+
18
+ FILENAMES_SCORES = {
19
+ 'package.json' => 1.0,
20
+ 'LICENSE.spdx' => 1.0,
21
+ 'DESCRIPTION' => 0.9,
22
+ 'dist.ini' => 0.8,
23
+ 'bower.json' => 0.75
15
24
  }.freeze
16
25
 
17
26
  def possible_matchers
@@ -19,12 +28,8 @@ module Licensee
19
28
  end
20
29
 
21
30
  def self.name_score(filename)
22
- return 1.0 if ['.gemspec', '.cabal'].include?(File.extname(filename))
23
- return 1.0 if filename == 'package.json'
24
- return 0.8 if filename == 'dist.ini'
25
- return 0.9 if filename == 'DESCRIPTION'
26
- return 0.75 if filename == 'bower.json'
27
- 0.0
31
+ return 1.0 if ['.gemspec', '.cabal'].include?(File.extname(filename))
32
+ FILENAMES_SCORES[filename] || 0.0
28
33
  end
29
34
 
30
35
  private
@@ -66,7 +66,7 @@ module Licensee
66
66
  def copyright?
67
67
  return false unless is_a?(LicenseFile)
68
68
  return false unless matcher.is_a?(Matchers::Copyright)
69
- filename =~ /\Acopyright(?:#{LicenseFile::ANY_EXT_REGEX})?\z/i
69
+ filename =~ /\Acopyright(?:#{LicenseFile::OTHER_EXT_REGEX})?\z/i
70
70
  end
71
71
  end
72
72
  end
@@ -3,5 +3,6 @@ module Licensee
3
3
  autoload :Project, 'licensee/projects/project'
4
4
  autoload :FSProject, 'licensee/projects/fs_project'
5
5
  autoload :GitProject, 'licensee/projects/git_project'
6
+ autoload :GitHubProject, 'licensee/projects/github_project'
6
7
  end
7
8
  end
@@ -0,0 +1,47 @@
1
+ # GitHub project
2
+ #
3
+ # Analyses a remote GitHub repository for license information
4
+ #
5
+ # Only the root directory of a repository will be scanned because every
6
+ # `#load_file(..)` call incurs a separate API request.
7
+
8
+ require 'octokit'
9
+
10
+ module Licensee
11
+ module Projects
12
+ class GitHubProject < Licensee::Projects::Project
13
+ # If there's any trailing data (e.g. `.git`) this pattern will ignore it:
14
+ # we're going to use the API rather than clone the repo.
15
+ GITHUB_REPO_PATTERN =
16
+ %r{https://github.com/([^\/]+\/([^\/]+(?=\.git)|[^\/]+)).*}
17
+
18
+ class RepoNotFound < StandardError; end
19
+
20
+ def initialize(github_url, **args)
21
+ @repo = github_url[GITHUB_REPO_PATTERN, 1]
22
+ raise ArgumentError, "Not a github URL: #{github_url}" unless @repo
23
+ super(**args)
24
+ end
25
+
26
+ attr_reader :repo
27
+
28
+ private
29
+
30
+ def files
31
+ @files ||= contents.map { |data| { name: data[:name], dir: '/' } }
32
+ rescue Octokit::NotFound
33
+ raise RepoNotFound,
34
+ "Could not load GitHub repo #{repo}, it may be private or deleted"
35
+ end
36
+
37
+ def load_file(file)
38
+ Octokit.contents(@repo, path: file[:name],
39
+ accept: 'application/vnd.github.v3.raw')
40
+ end
41
+
42
+ def contents
43
+ Octokit.contents(@repo).select { |data| data[:type] == 'file' }
44
+ end
45
+ end
46
+ end
47
+ end
@@ -1,3 +1,3 @@
1
1
  module Licensee
2
- VERSION = '9.6.0'.freeze
2
+ VERSION = '9.7.0'.freeze
3
3
  end
@@ -8,6 +8,7 @@ RSpec.describe 'command line invocation' do
8
8
  let(:stdout) { output[0] }
9
9
  let(:stderr) { output[1] }
10
10
  let(:status) { output[2] }
11
+ let(:hash) { '46cdc03462b9af57968df67b450cc4372ac41f53' }
11
12
 
12
13
  context 'without any arguments' do
13
14
  let(:arguments) { [] }
@@ -21,7 +22,7 @@ RSpec.describe 'command line invocation' do
21
22
  end
22
23
 
23
24
  it 'outputs the hash' do
24
- expect(stdout).to match('d64f3bb4282a97b37454b5bb96a8a264a3363dc3')
25
+ expect(stdout).to match(hash)
25
26
  end
26
27
 
27
28
  it 'outputs the attribution' do
@@ -0,0 +1,16 @@
1
+ Licensed to the Apache Software Foundation (ASF) under one
2
+ or more contributor license agreements. See the NOTICE file
3
+ distributed with this work for additional information
4
+ regarding copyright ownership. The ASF licenses this file
5
+ to you under the Apache License, Version 2.0 (the
6
+ "License"); you may not use this file except in compliance
7
+ with the License. You may obtain a copy of the License at
8
+
9
+ http://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ Unless required by applicable law or agreed to in writing,
12
+ software distributed under the License is distributed on an
13
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ KIND, either express or implied. See the License for the
15
+ specific language governing permissions and limitations
16
+ under the License.
@@ -0,0 +1,361 @@
1
+ ### GNU GENERAL PUBLIC LICENSE
2
+
3
+ Version 2, June 1991
4
+
5
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
6
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
7
+
8
+ Everyone is permitted to copy and distribute verbatim copies
9
+ of this license document, but changing it is not allowed.
10
+
11
+ ### Preamble
12
+
13
+ The licenses for most software are designed to take away your freedom
14
+ to share and change it. By contrast, the GNU General Public License is
15
+ intended to guarantee your freedom to share and change free
16
+ software--to make sure the software is free for all its users. This
17
+ General Public License applies to most of the Free Software
18
+ Foundation's software and to any other program whose authors commit to
19
+ using it. (Some other Free Software Foundation software is covered by
20
+ the GNU Lesser General Public License instead.) You can apply it to
21
+ your programs, too.
22
+
23
+ When we speak of free software, we are referring to freedom, not
24
+ price. Our General Public Licenses are designed to make sure that you
25
+ have the freedom to distribute copies of free software (and charge for
26
+ this service if you wish), that you receive source code or can get it
27
+ if you want it, that you can change the software or use pieces of it
28
+ in new free programs; and that you know you can do these things.
29
+
30
+ To protect your rights, we need to make restrictions that forbid
31
+ anyone to deny you these rights or to ask you to surrender the rights.
32
+ These restrictions translate to certain responsibilities for you if
33
+ you distribute copies of the software, or if you modify it.
34
+
35
+ For example, if you distribute copies of such a program, whether
36
+ gratis or for a fee, you must give the recipients all the rights that
37
+ you have. You must make sure that they, too, receive or can get the
38
+ source code. And you must show them these terms so they know their
39
+ rights.
40
+
41
+ We protect your rights with two steps: (1) copyright the software, and
42
+ (2) offer you this license which gives you legal permission to copy,
43
+ distribute and/or modify the software.
44
+
45
+ Also, for each author's protection and ours, we want to make certain
46
+ that everyone understands that there is no warranty for this free
47
+ software. If the software is modified by someone else and passed on,
48
+ we want its recipients to know that what they have is not the
49
+ original, so that any problems introduced by others will not reflect
50
+ on the original authors' reputations.
51
+
52
+ Finally, any free program is threatened constantly by software
53
+ patents. We wish to avoid the danger that redistributors of a free
54
+ program will individually obtain patent licenses, in effect making the
55
+ program proprietary. To prevent this, we have made it clear that any
56
+ patent must be licensed for everyone's free use or not licensed at
57
+ all.
58
+
59
+ The precise terms and conditions for copying, distribution and
60
+ modification follow.
61
+
62
+ ### TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
63
+
64
+ **0.** This License applies to any program or other work which
65
+ contains a notice placed by the copyright holder saying it may be
66
+ distributed under the terms of this General Public License. The
67
+ "Program", below, refers to any such program or work, and a "work
68
+ based on the Program" means either the Program or any derivative work
69
+ under copyright law: that is to say, a work containing the Program or
70
+ a portion of it, either verbatim or with modifications and/or
71
+ translated into another language. (Hereinafter, translation is
72
+ included without limitation in the term "modification".) Each licensee
73
+ is addressed as "you".
74
+
75
+ Activities other than copying, distribution and modification are not
76
+ covered by this License; they are outside its scope. The act of
77
+ running the Program is not restricted, and the output from the Program
78
+ is covered only if its contents constitute a work based on the Program
79
+ (independent of having been made by running the Program). Whether that
80
+ is true depends on what the Program does.
81
+
82
+ **1.** You may copy and distribute verbatim copies of the Program's
83
+ source code as you receive it, in any medium, provided that you
84
+ conspicuously and appropriately publish on each copy an appropriate
85
+ copyright notice and disclaimer of warranty; keep intact all the
86
+ notices that refer to this License and to the absence of any warranty;
87
+ and give any other recipients of the Program a copy of this License
88
+ along with the Program.
89
+
90
+ You may charge a fee for the physical act of transferring a copy, and
91
+ you may at your option offer warranty protection in exchange for a
92
+ fee.
93
+
94
+ **2.** You may modify your copy or copies of the Program or any
95
+ portion of it, thus forming a work based on the Program, and copy and
96
+ distribute such modifications or work under the terms of Section 1
97
+ above, provided that you also meet all of these conditions:
98
+
99
+
100
+ **a)** You must cause the modified files to carry prominent notices
101
+ stating that you changed the files and the date of any change.
102
+
103
+
104
+ **b)** You must cause any work that you distribute or publish, that in
105
+ whole or in part contains or is derived from the Program or any part
106
+ thereof, to be licensed as a whole at no charge to all third parties
107
+ under the terms of this License.
108
+
109
+
110
+ **c)** If the modified program normally reads commands interactively
111
+ when run, you must cause it, when started running for such interactive
112
+ use in the most ordinary way, to print or display an announcement
113
+ including an appropriate copyright notice and a notice that there is
114
+ no warranty (or else, saying that you provide a warranty) and that
115
+ users may redistribute the program under these conditions, and telling
116
+ the user how to view a copy of this License. (Exception: if the
117
+ Program itself is interactive but does not normally print such an
118
+ announcement, your work based on the Program is not required to print
119
+ an announcement.)
120
+
121
+ These requirements apply to the modified work as a whole. If
122
+ identifiable sections of that work are not derived from the Program,
123
+ and can be reasonably considered independent and separate works in
124
+ themselves, then this License, and its terms, do not apply to those
125
+ sections when you distribute them as separate works. But when you
126
+ distribute the same sections as part of a whole which is a work based
127
+ on the Program, the distribution of the whole must be on the terms of
128
+ this License, whose permissions for other licensees extend to the
129
+ entire whole, and thus to each and every part regardless of who wrote
130
+ it.
131
+
132
+ Thus, it is not the intent of this section to claim rights or contest
133
+ your rights to work written entirely by you; rather, the intent is to
134
+ exercise the right to control the distribution of derivative or
135
+ collective works based on the Program.
136
+
137
+ In addition, mere aggregation of another work not based on the Program
138
+ with the Program (or with a work based on the Program) on a volume of
139
+ a storage or distribution medium does not bring the other work under
140
+ the scope of this License.
141
+
142
+ **3.** You may copy and distribute the Program (or a work based on it,
143
+ under Section 2) in object code or executable form under the terms of
144
+ Sections 1 and 2 above provided that you also do one of the following:
145
+
146
+
147
+ **a)** Accompany it with the complete corresponding machine-readable
148
+ source code, which must be distributed under the terms of Sections 1
149
+ and 2 above on a medium customarily used for software interchange; or,
150
+
151
+
152
+ **b)** Accompany it with a written offer, valid for at least three
153
+ years, to give any third party, for a charge no more than your cost of
154
+ physically performing source distribution, a complete machine-readable
155
+ copy of the corresponding source code, to be distributed under the
156
+ terms of Sections 1 and 2 above on a medium customarily used for
157
+ software interchange; or,
158
+
159
+
160
+ **c)** Accompany it with the information you received as to the offer
161
+ to distribute corresponding source code. (This alternative is allowed
162
+ only for noncommercial distribution and only if you received the
163
+ program in object code or executable form with such an offer, in
164
+ accord with Subsection b above.)
165
+
166
+ The source code for a work means the preferred form of the work for
167
+ making modifications to it. For an executable work, complete source
168
+ code means all the source code for all modules it contains, plus any
169
+ associated interface definition files, plus the scripts used to
170
+ control compilation and installation of the executable. However, as a
171
+ special exception, the source code distributed need not include
172
+ anything that is normally distributed (in either source or binary
173
+ form) with the major components (compiler, kernel, and so on) of the
174
+ operating system on which the executable runs, unless that component
175
+ itself accompanies the executable.
176
+
177
+ If distribution of executable or object code is made by offering
178
+ access to copy from a designated place, then offering equivalent
179
+ access to copy the source code from the same place counts as
180
+ distribution of the source code, even though third parties are not
181
+ compelled to copy the source along with the object code.
182
+
183
+ **4.** You may not copy, modify, sublicense, or distribute the Program
184
+ except as expressly provided under this License. Any attempt otherwise
185
+ to copy, modify, sublicense or distribute the Program is void, and
186
+ will automatically terminate your rights under this License. However,
187
+ parties who have received copies, or rights, from you under this
188
+ License will not have their licenses terminated so long as such
189
+ parties remain in full compliance.
190
+
191
+ **5.** You are not required to accept this License, since you have not
192
+ signed it. However, nothing else grants you permission to modify or
193
+ distribute the Program or its derivative works. These actions are
194
+ prohibited by law if you do not accept this License. Therefore, by
195
+ modifying or distributing the Program (or any work based on the
196
+ Program), you indicate your acceptance of this License to do so, and
197
+ all its terms and conditions for copying, distributing or modifying
198
+ the Program or works based on it.
199
+
200
+ **6.** Each time you redistribute the Program (or any work based on
201
+ the Program), the recipient automatically receives a license from the
202
+ original licensor to copy, distribute or modify the Program subject to
203
+ these terms and conditions. You may not impose any further
204
+ restrictions on the recipients' exercise of the rights granted herein.
205
+ You are not responsible for enforcing compliance by third parties to
206
+ this License.
207
+
208
+ **7.** If, as a consequence of a court judgment or allegation of
209
+ patent infringement or for any other reason (not limited to patent
210
+ issues), conditions are imposed on you (whether by court order,
211
+ agreement or otherwise) that contradict the conditions of this
212
+ License, they do not excuse you from the conditions of this License.
213
+ If you cannot distribute so as to satisfy simultaneously your
214
+ obligations under this License and any other pertinent obligations,
215
+ then as a consequence you may not distribute the Program at all. For
216
+ example, if a patent license would not permit royalty-free
217
+ redistribution of the Program by all those who receive copies directly
218
+ or indirectly through you, then the only way you could satisfy both it
219
+ and this License would be to refrain entirely from distribution of the
220
+ Program.
221
+
222
+ If any portion of this section is held invalid or unenforceable under
223
+ any particular circumstance, the balance of the section is intended to
224
+ apply and the section as a whole is intended to apply in other
225
+ circumstances.
226
+
227
+ It is not the purpose of this section to induce you to infringe any
228
+ patents or other property right claims or to contest validity of any
229
+ such claims; this section has the sole purpose of protecting the
230
+ integrity of the free software distribution system, which is
231
+ implemented by public license practices. Many people have made
232
+ generous contributions to the wide range of software distributed
233
+ through that system in reliance on consistent application of that
234
+ system; it is up to the author/donor to decide if he or she is willing
235
+ to distribute software through any other system and a licensee cannot
236
+ impose that choice.
237
+
238
+ This section is intended to make thoroughly clear what is believed to
239
+ be a consequence of the rest of this License.
240
+
241
+ **8.** If the distribution and/or use of the Program is restricted in
242
+ certain countries either by patents or by copyrighted interfaces, the
243
+ original copyright holder who places the Program under this License
244
+ may add an explicit geographical distribution limitation excluding
245
+ those countries, so that distribution is permitted only in or among
246
+ countries not thus excluded. In such case, this License incorporates
247
+ the limitation as if written in the body of this License.
248
+
249
+ **9.** The Free Software Foundation may publish revised and/or new
250
+ versions of the General Public License from time to time. Such new
251
+ versions will be similar in spirit to the present version, but may
252
+ differ in detail to address new problems or concerns.
253
+
254
+ Each version is given a distinguishing version number. If the Program
255
+ specifies a version number of this License which applies to it and
256
+ "any later version", you have the option of following the terms and
257
+ conditions either of that version or of any later version published by
258
+ the Free Software Foundation. If the Program does not specify a
259
+ version number of this License, you may choose any version ever
260
+ published by the Free Software Foundation.
261
+
262
+ **10.** If you wish to incorporate parts of the Program into other
263
+ free programs whose distribution conditions are different, write to
264
+ the author to ask for permission. For software which is copyrighted by
265
+ the Free Software Foundation, write to the Free Software Foundation;
266
+ we sometimes make exceptions for this. Our decision will be guided by
267
+ the two goals of preserving the free status of all derivatives of our
268
+ free software and of promoting the sharing and reuse of software
269
+ generally.
270
+
271
+ **NO WARRANTY**
272
+
273
+ **11.** BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO
274
+ WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
275
+ EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
276
+ OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY
277
+ KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
278
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
279
+ PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
280
+ PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME
281
+ THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
282
+
283
+ **12.** IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
284
+ WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
285
+ AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU
286
+ FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
287
+ CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
288
+ PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
289
+ RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
290
+ FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF
291
+ SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
292
+ DAMAGES.
293
+
294
+ ### END OF TERMS AND CONDITIONS
295
+
296
+ ### How to Apply These Terms to Your New Programs
297
+
298
+ If you develop a new program, and you want it to be of the greatest
299
+ possible use to the public, the best way to achieve this is to make it
300
+ free software which everyone can redistribute and change under these
301
+ terms.
302
+
303
+ To do so, attach the following notices to the program. It is safest to
304
+ attach them to the start of each source file to most effectively
305
+ convey the exclusion of warranty; and each file should have at least
306
+ the "copyright" line and a pointer to where the full notice is found.
307
+
308
+ one line to give the program's name and an idea of what it does.
309
+ Copyright (C) yyyy name of author
310
+
311
+ This program is free software; you can redistribute it and/or
312
+ modify it under the terms of the GNU General Public License
313
+ as published by the Free Software Foundation; either version 2
314
+ of the License, or (at your option) any later version.
315
+
316
+ This program is distributed in the hope that it will be useful,
317
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
318
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
319
+ GNU General Public License for more details.
320
+
321
+ You should have received a copy of the GNU General Public License
322
+ along with this program; if not, write to the Free Software
323
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
324
+
325
+ Also add information on how to contact you by electronic and paper
326
+ mail.
327
+
328
+ If the program is interactive, make it output a short notice like this
329
+ when it starts in an interactive mode:
330
+
331
+ Gnomovision version 69, Copyright (C) year name of author
332
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
333
+ type `show w'. This is free software, and you are welcome
334
+ to redistribute it under certain conditions; type `show c'
335
+ for details.
336
+
337
+ The hypothetical commands \`show w' and \`show c' should show the
338
+ appropriate parts of the General Public License. Of course, the
339
+ commands you use may be called something other than \`show w' and
340
+ \`show c'; they could even be mouse-clicks or menu items--whatever
341
+ suits your program.
342
+
343
+ You should also get your employer (if you work as a programmer) or
344
+ your school, if any, to sign a "copyright disclaimer" for the program,
345
+ if necessary. Here is a sample; alter the names:
346
+
347
+ Yoyodyne, Inc., hereby disclaims all copyright
348
+ interest in the program `Gnomovision'
349
+ (which makes passes at compilers) written
350
+ by James Hacker.
351
+
352
+ signature of Ty Coon, 1 April 1989
353
+ Ty Coon, President of Vice
354
+
355
+ This General Public License does not permit incorporating your program
356
+ into proprietary programs. If your program is a subroutine library,
357
+ you may consider it more useful to permit linking proprietary
358
+ applications with the library. If this is what you want to do, use the
359
+ [GNU Lesser General Public
360
+ License](https://www.gnu.org/licenses/lgpl.html) instead of this
361
+ License.