mirror of
https://github.com/github/choosealicense.com
synced 2025-01-18 17:37:48 +01:00
Merge pull request #316 from github/new-license-criteria
Document criteria for proposing new licenses
This commit is contained in:
commit
46be738264
2
.gitignore
vendored
2
.gitignore
vendored
@ -7,6 +7,6 @@ assets/vendor/clipboard/test
|
|||||||
assets/vendor/selectivizr/tests
|
assets/vendor/selectivizr/tests
|
||||||
assets/vendor/qtip2/basic
|
assets/vendor/qtip2/basic
|
||||||
/vendor
|
/vendor
|
||||||
Gemfile.lock
|
|
||||||
/.sass-cache
|
/.sass-cache
|
||||||
.ruby-version
|
.ruby-version
|
||||||
|
/tmp
|
||||||
|
@ -6,17 +6,26 @@ We love Pull Requests! Your contributions help make ChooseALicense.com great.
|
|||||||
|
|
||||||
So you want to contribute to ChooseALicense. Great! We welcome any help we can
|
So you want to contribute to ChooseALicense. Great! We welcome any help we can
|
||||||
get. But first, please make sure you understand what
|
get. But first, please make sure you understand what
|
||||||
[this site is all about](http://choosealicense.com/about).
|
[this site is all about](http://choosealicense.com/about). It’s not a comprehensive list of all possible licenses.
|
||||||
|
|
||||||
It’s not a comprehensive list of all possible licenses.
|
## Adding a license
|
||||||
|
|
||||||
If you understand the goals of this site and still want to suggest a change,
|
Choosealicense.com is intended to demystify license choices, not present all of them. As such, there are several requirements for a license to be listed on the site:
|
||||||
please:
|
|
||||||
|
|
||||||
* Make sure you have a [GitHub account](https://github.com/signup/free)
|
1. The license must have [an SPDX identifier](https://spdx.org/licenses/). If your license isn't registered with SPDX, please [request that it be added](https://spdx.org/spdx-license-list/request-new-license-or-exception).
|
||||||
* Submit a ticket for your issue, assuming one does not already exist.
|
2. The license must be listed on one of the following approved lists of licenses:
|
||||||
* Clearly describe the issue including steps to reproduce when it is a bug.
|
* [List of OSI approved licenses](https://opensource.org/licenses/alphabetical)
|
||||||
* Make sure you fill in the earliest version that you know has the issue.
|
* [GNU's list of free licenses](https://www.gnu.org/licenses/license-list.en.html) (*note: the license must be listed in one of thre three "free" categories*)
|
||||||
|
* [Open Definition's list of conformant licenses](http://opendefinition.org/licenses/) (non-code)
|
||||||
|
3. A [GitHub code search](https://github.com/search?q=MIT+filename%3ALICENSE&type=Code) must reveal at least *1,000* public repositories using the license
|
||||||
|
|
||||||
|
If your proposed license meets the above criteria, here's a few other things to keep in mind as you propose the license's addition:
|
||||||
|
|
||||||
|
* Licenses live in the `/_licenses` folder.
|
||||||
|
* Each license has both [required and optional metadata](https://github.com/github/choosealicense.com#license-metadata) that should be included.
|
||||||
|
* The text of the license should be wrapped to a 78 character width.
|
||||||
|
* The body of the file should be the text of the license in plain text.
|
||||||
|
* Almost without exception, new licenses should be added as hidden (`hidden: true` in the YAML front matter), such that they are directly linkable and detectable, but not otherwise listed.
|
||||||
|
|
||||||
## Making Changes
|
## Making Changes
|
||||||
|
|
||||||
|
3
Gemfile
3
Gemfile
@ -4,7 +4,8 @@ gem "github-pages"
|
|||||||
gem "jekyll-seo-tag"
|
gem "jekyll-seo-tag"
|
||||||
|
|
||||||
group :test do
|
group :test do
|
||||||
gem "html-proofer"
|
gem 'html-proofer', '2.5.2'
|
||||||
gem "rake"
|
gem "rake"
|
||||||
gem "rspec"
|
gem "rspec"
|
||||||
|
gem "nokogiri"
|
||||||
end
|
end
|
||||||
|
177
Gemfile.lock
Normal file
177
Gemfile.lock
Normal file
@ -0,0 +1,177 @@
|
|||||||
|
GEM
|
||||||
|
remote: https://rubygems.org/
|
||||||
|
specs:
|
||||||
|
RedCloth (4.2.9)
|
||||||
|
activesupport (4.2.5)
|
||||||
|
i18n (~> 0.7)
|
||||||
|
json (~> 1.7, >= 1.7.7)
|
||||||
|
minitest (~> 5.1)
|
||||||
|
thread_safe (~> 0.3, >= 0.3.4)
|
||||||
|
tzinfo (~> 1.1)
|
||||||
|
addressable (2.3.8)
|
||||||
|
blankslate (2.1.2.4)
|
||||||
|
classifier-reborn (2.0.4)
|
||||||
|
fast-stemmer (~> 1.0)
|
||||||
|
coffee-script (2.4.1)
|
||||||
|
coffee-script-source
|
||||||
|
execjs
|
||||||
|
coffee-script-source (1.10.0)
|
||||||
|
colorator (0.1)
|
||||||
|
colored (1.2)
|
||||||
|
diff-lcs (1.2.5)
|
||||||
|
ethon (0.8.1)
|
||||||
|
ffi (>= 1.3.0)
|
||||||
|
execjs (2.6.0)
|
||||||
|
faraday (0.9.2)
|
||||||
|
multipart-post (>= 1.2, < 3)
|
||||||
|
fast-stemmer (1.0.2)
|
||||||
|
ffi (1.9.10)
|
||||||
|
gemoji (2.1.0)
|
||||||
|
github-pages (43)
|
||||||
|
RedCloth (= 4.2.9)
|
||||||
|
github-pages-health-check (= 0.6.0)
|
||||||
|
jekyll (= 2.4.0)
|
||||||
|
jekyll-coffeescript (= 1.0.1)
|
||||||
|
jekyll-feed (= 0.3.1)
|
||||||
|
jekyll-gist (= 1.4.0)
|
||||||
|
jekyll-mentions (= 0.2.1)
|
||||||
|
jekyll-paginate (= 1.1.0)
|
||||||
|
jekyll-redirect-from (= 0.9.1)
|
||||||
|
jekyll-sass-converter (= 1.3.0)
|
||||||
|
jekyll-seo-tag (= 0.1.4)
|
||||||
|
jekyll-sitemap (= 0.9.0)
|
||||||
|
jemoji (= 0.5.0)
|
||||||
|
kramdown (= 1.9.0)
|
||||||
|
liquid (= 2.6.2)
|
||||||
|
maruku (= 0.7.0)
|
||||||
|
mercenary (~> 0.3)
|
||||||
|
pygments.rb (= 0.6.3)
|
||||||
|
rdiscount (= 2.1.8)
|
||||||
|
redcarpet (= 3.3.3)
|
||||||
|
terminal-table (~> 1.4)
|
||||||
|
github-pages-health-check (0.6.0)
|
||||||
|
addressable (~> 2.3)
|
||||||
|
net-dns (~> 0.8)
|
||||||
|
public_suffix (~> 1.4)
|
||||||
|
typhoeus (~> 0.7)
|
||||||
|
html-pipeline (1.9.0)
|
||||||
|
activesupport (>= 2)
|
||||||
|
nokogiri (~> 1.4)
|
||||||
|
html-proofer (2.5.2)
|
||||||
|
addressable (~> 2.3)
|
||||||
|
colored (~> 1.2)
|
||||||
|
mercenary (~> 0.3.2)
|
||||||
|
nokogiri (~> 1.5)
|
||||||
|
parallel (~> 1.3)
|
||||||
|
typhoeus (~> 0.7)
|
||||||
|
yell (~> 2.0)
|
||||||
|
i18n (0.7.0)
|
||||||
|
jekyll (2.4.0)
|
||||||
|
classifier-reborn (~> 2.0)
|
||||||
|
colorator (~> 0.1)
|
||||||
|
jekyll-coffeescript (~> 1.0)
|
||||||
|
jekyll-gist (~> 1.0)
|
||||||
|
jekyll-paginate (~> 1.0)
|
||||||
|
jekyll-sass-converter (~> 1.0)
|
||||||
|
jekyll-watch (~> 1.1)
|
||||||
|
kramdown (~> 1.3)
|
||||||
|
liquid (~> 2.6.1)
|
||||||
|
mercenary (~> 0.3.3)
|
||||||
|
pygments.rb (~> 0.6.0)
|
||||||
|
redcarpet (~> 3.1)
|
||||||
|
safe_yaml (~> 1.0)
|
||||||
|
toml (~> 0.1.0)
|
||||||
|
jekyll-coffeescript (1.0.1)
|
||||||
|
coffee-script (~> 2.2)
|
||||||
|
jekyll-feed (0.3.1)
|
||||||
|
jekyll-gist (1.4.0)
|
||||||
|
octokit (~> 4.2)
|
||||||
|
jekyll-mentions (0.2.1)
|
||||||
|
html-pipeline (~> 1.9.0)
|
||||||
|
jekyll (~> 2.0)
|
||||||
|
jekyll-paginate (1.1.0)
|
||||||
|
jekyll-redirect-from (0.9.1)
|
||||||
|
jekyll (>= 2.0)
|
||||||
|
jekyll-sass-converter (1.3.0)
|
||||||
|
sass (~> 3.2)
|
||||||
|
jekyll-seo-tag (0.1.4)
|
||||||
|
jekyll (>= 2.0)
|
||||||
|
jekyll-sitemap (0.9.0)
|
||||||
|
jekyll-watch (1.3.0)
|
||||||
|
listen (~> 3.0)
|
||||||
|
jemoji (0.5.0)
|
||||||
|
gemoji (~> 2.0)
|
||||||
|
html-pipeline (~> 1.9)
|
||||||
|
jekyll (>= 2.0)
|
||||||
|
json (1.8.3)
|
||||||
|
kramdown (1.9.0)
|
||||||
|
liquid (2.6.2)
|
||||||
|
listen (3.0.5)
|
||||||
|
rb-fsevent (>= 0.9.3)
|
||||||
|
rb-inotify (>= 0.9)
|
||||||
|
maruku (0.7.0)
|
||||||
|
mercenary (0.3.5)
|
||||||
|
mini_portile2 (2.0.0)
|
||||||
|
minitest (5.8.3)
|
||||||
|
multipart-post (2.0.0)
|
||||||
|
net-dns (0.8.0)
|
||||||
|
nokogiri (1.6.7.1)
|
||||||
|
mini_portile2 (~> 2.0.0.rc2)
|
||||||
|
octokit (4.2.0)
|
||||||
|
sawyer (~> 0.6.0, >= 0.5.3)
|
||||||
|
parallel (1.6.1)
|
||||||
|
parslet (1.5.0)
|
||||||
|
blankslate (~> 2.0)
|
||||||
|
posix-spawn (0.3.11)
|
||||||
|
public_suffix (1.5.3)
|
||||||
|
pygments.rb (0.6.3)
|
||||||
|
posix-spawn (~> 0.3.6)
|
||||||
|
yajl-ruby (~> 1.2.0)
|
||||||
|
rake (10.5.0)
|
||||||
|
rb-fsevent (0.9.7)
|
||||||
|
rb-inotify (0.9.5)
|
||||||
|
ffi (>= 0.5.0)
|
||||||
|
rdiscount (2.1.8)
|
||||||
|
redcarpet (3.3.3)
|
||||||
|
rspec (3.4.0)
|
||||||
|
rspec-core (~> 3.4.0)
|
||||||
|
rspec-expectations (~> 3.4.0)
|
||||||
|
rspec-mocks (~> 3.4.0)
|
||||||
|
rspec-core (3.4.1)
|
||||||
|
rspec-support (~> 3.4.0)
|
||||||
|
rspec-expectations (3.4.0)
|
||||||
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
|
rspec-support (~> 3.4.0)
|
||||||
|
rspec-mocks (3.4.1)
|
||||||
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
|
rspec-support (~> 3.4.0)
|
||||||
|
rspec-support (3.4.1)
|
||||||
|
safe_yaml (1.0.4)
|
||||||
|
sass (3.4.21)
|
||||||
|
sawyer (0.6.0)
|
||||||
|
addressable (~> 2.3.5)
|
||||||
|
faraday (~> 0.8, < 0.10)
|
||||||
|
terminal-table (1.5.2)
|
||||||
|
thread_safe (0.3.5)
|
||||||
|
toml (0.1.2)
|
||||||
|
parslet (~> 1.5.0)
|
||||||
|
typhoeus (0.8.0)
|
||||||
|
ethon (>= 0.8.0)
|
||||||
|
tzinfo (1.2.2)
|
||||||
|
thread_safe (~> 0.1)
|
||||||
|
yajl-ruby (1.2.1)
|
||||||
|
yell (2.0.5)
|
||||||
|
|
||||||
|
PLATFORMS
|
||||||
|
ruby
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
github-pages
|
||||||
|
html-proofer (= 2.5.2)
|
||||||
|
jekyll-seo-tag
|
||||||
|
nokogiri
|
||||||
|
rake
|
||||||
|
rspec
|
||||||
|
|
||||||
|
BUNDLED WITH
|
||||||
|
1.11.2
|
10
README.md
10
README.md
@ -8,11 +8,11 @@ Like a Choose Your Own Adventure site, but only much less interesting.
|
|||||||
|
|
||||||
A lot of repositories on GitHub.com don't have a license. GitHub provides a license chooser, but if you don't know anything about licenses, how are you supposed to make an informed decision?
|
A lot of repositories on GitHub.com don't have a license. GitHub provides a license chooser, but if you don't know anything about licenses, how are you supposed to make an informed decision?
|
||||||
|
|
||||||
[ChooseALicense.com](http://www.choosealicense.com "Choose A Licence website") is designed to help people make an informed decision about licenses.
|
[ChooseALicense.com](http://www.choosealicense.com "Choose A Licence website") is designed to help people make an informed decision about licenses by demystifying license choices through non-judgmental guidance.
|
||||||
|
|
||||||
## Immediate Goals
|
## Immediate Goals
|
||||||
|
|
||||||
* Non-partisan. Our goal is to help you find a license that meets *your* goals.
|
* Non-judgmental. Our goal is to help you find a license that meets *your* goals.
|
||||||
* Well designed, but that goes without saying.
|
* Well designed, but that goes without saying.
|
||||||
* The homepage should have just enough to help 99% of folks make a decision.
|
* The homepage should have just enough to help 99% of folks make a decision.
|
||||||
* For the 1%, the site will contain a list of licenses common to specific communities and situations.
|
* For the 1%, the site will contain a list of licenses common to specific communities and situations.
|
||||||
@ -28,11 +28,9 @@ script/server
|
|||||||
```
|
```
|
||||||
Open `http://localhost:4000` in your favorite browser.
|
Open `http://localhost:4000` in your favorite browser.
|
||||||
|
|
||||||
## Adding a license
|
## License metadata
|
||||||
|
|
||||||
Licenses sit in the `/_licenses` folder. The text of the license should be wrapped to a 78 character width. Each license has YAML front matter describing the license's properties. The body of the file should be the text of the license in plain text. The available metadata fields are:
|
Licenses sit in the `/_licenses` folder. Each license has YAML front matter describing the license's properties. The body of the file contains the text of the license in plain text. The available metadata fields are:
|
||||||
|
|
||||||
### YAML front matter
|
|
||||||
|
|
||||||
#### Required fields
|
#### Required fields
|
||||||
|
|
||||||
|
15
Rakefile
15
Rakefile
@ -9,6 +9,19 @@ end
|
|||||||
|
|
||||||
task :test do
|
task :test do
|
||||||
sh "bundle exec jekyll build --trace"
|
sh "bundle exec jekyll build --trace"
|
||||||
HTML::Proofer.new("./_site", :check_html => true).run
|
|
||||||
Rake::Task["spec"].invoke
|
Rake::Task["spec"].invoke
|
||||||
|
HTML::Proofer.new("./_site", :check_html => true).run
|
||||||
|
end
|
||||||
|
|
||||||
|
task :approved_licenses do
|
||||||
|
require './spec/spec_helper'
|
||||||
|
approved = approved_licenses
|
||||||
|
approved.select! { |l| spdx_ids.include?(l) }
|
||||||
|
puts "#{approved.count} approved licenses:"
|
||||||
|
puts approved.join(", ")
|
||||||
|
puts "\n"
|
||||||
|
|
||||||
|
potential = approved - licenses.map { |l| l["id"] }
|
||||||
|
puts "#{potential.count} potential additions:"
|
||||||
|
puts potential.join(", ")
|
||||||
end
|
end
|
||||||
|
@ -1,35 +1,26 @@
|
|||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
# List of licenses that need not be OSI approved
|
|
||||||
LICENSE_WHITELIST = %w[
|
|
||||||
unlicense
|
|
||||||
cc0-1.0
|
|
||||||
wtfpl
|
|
||||||
bsd-3-clause-clear
|
|
||||||
]
|
|
||||||
|
|
||||||
licenses.each do |license|
|
licenses.each do |license|
|
||||||
describe "The #{license["title"]} license" do
|
|
||||||
describe "SPDX compliance" do
|
|
||||||
# "No license" isn't really a license, so no need to test
|
# "No license" isn't really a license, so no need to test
|
||||||
unless license["id"] == "no-license"
|
next if license["id"] == "no-license"
|
||||||
it "#{license["id"]} should be a valid SPDX ID" do
|
|
||||||
expect(find_spdx(license["id"])).to_not be_nil
|
describe "The #{license["title"]} license" do
|
||||||
|
|
||||||
|
let(:id) { license["id"] }
|
||||||
|
|
||||||
|
it "has an SPDX ID" do
|
||||||
|
expect(spdx_ids).to include(id)
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should be the proper SPDX name" do
|
it "uses its SPDX name" do
|
||||||
spdx = find_spdx(license["id"])
|
spdx = find_spdx(id)
|
||||||
expect(spdx[1]["name"].gsub(/ only$/,"")).to eql(license["title"])
|
expect(spdx[1]["name"].gsub(/ only$/,"")).to eql(license["title"])
|
||||||
end
|
end
|
||||||
|
|
||||||
# CC0 and Unlicense are not OSI approved, but that's okay
|
context "industry approval" do
|
||||||
unless LICENSE_WHITELIST.include? license["id"]
|
it "should be approved by OSI or FSF or OD" do
|
||||||
it "should be OSI approved" do
|
expect(approved_licenses).to include(id), "See https://git.io/vzCTV."
|
||||||
spdx = find_spdx(license["id"])
|
|
||||||
approved = spdx[1]["osiApproved"]
|
|
||||||
expect(approved).to eql(true)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
require 'jekyll'
|
require 'jekyll'
|
||||||
require 'open-uri'
|
require 'open-uri'
|
||||||
require 'json'
|
require 'json'
|
||||||
|
require 'open-uri'
|
||||||
|
require 'nokogiri'
|
||||||
|
|
||||||
def config_file
|
def config_file
|
||||||
File.expand_path "./_config.yml", source
|
File.expand_path "./_config.yml", source
|
||||||
@ -54,6 +56,61 @@ def spdx_list
|
|||||||
$spdx ||= JSON.parse(open(url).read)
|
$spdx ||= JSON.parse(open(url).read)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def spdx_ids
|
||||||
|
spdx_list.map { |name, properties| name.downcase }
|
||||||
|
end
|
||||||
|
|
||||||
def find_spdx(license)
|
def find_spdx(license)
|
||||||
spdx_list.find { |name, properties| name.downcase == license }
|
spdx_list.find { |name, properties| name.downcase == license }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def osi_approved_licenses
|
||||||
|
$osi_approved_licenses ||= begin
|
||||||
|
licenses = {}
|
||||||
|
list = spdx_list.select { |id, meta| meta["osiApproved"] }
|
||||||
|
list.each do |id, meta|
|
||||||
|
licenses[id.downcase] = meta["name"]
|
||||||
|
end
|
||||||
|
licenses
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def fsf_approved_licenses
|
||||||
|
$fsf_approved_licenses ||= begin
|
||||||
|
url = "https://www.gnu.org/licenses/license-list.en.html"
|
||||||
|
doc = Nokogiri::HTML(open(url).read)
|
||||||
|
list = doc.css(".green dt")
|
||||||
|
licenses = {}
|
||||||
|
list.each do |license|
|
||||||
|
a = license.css("a").find { |link| !link.text.nil? && !link.text.empty? && link.attr("id") }
|
||||||
|
next if a.nil?
|
||||||
|
id = a.attr("id").downcase
|
||||||
|
name = a.text.strip
|
||||||
|
licenses[id] = name
|
||||||
|
end
|
||||||
|
|
||||||
|
# FSF approved the Clear BSD, but doesn't use its SPDX ID or Name
|
||||||
|
if licenses.keys.include? "clearbsd"
|
||||||
|
licenses["bsd-3-clause-clear"] = licenses["clearbsd"]
|
||||||
|
end
|
||||||
|
|
||||||
|
licenses
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def od_approved_licenses
|
||||||
|
$od_approved_licenses ||= begin
|
||||||
|
url = "http://licenses.opendefinition.org/licenses/groups/od.json"
|
||||||
|
data = open(url).read
|
||||||
|
data = JSON.parse(data)
|
||||||
|
licenses = {}
|
||||||
|
data.each do |id, meta|
|
||||||
|
licenses[id.downcase] = meta["title"]
|
||||||
|
end
|
||||||
|
licenses
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def approved_licenses
|
||||||
|
(osi_approved_licenses.keys + fsf_approved_licenses.keys + od_approved_licenses.keys).flatten.uniq.sort
|
||||||
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user