summaryrefslogtreecommitdiff
path: root/lib/rubygems/util/licenses.rb
blob: ac0d3bb44e069a8a1e14bf0d9a081a6545c54eb6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
# frozen_string_literal: true
require 'rubygems/text'

class Gem::Licenses

  extend Gem::Text

  NONSTANDARD = 'Nonstandard'.freeze

  # Software Package Data Exchange (SPDX) standard open-source software
  # license identifiers
  LICENSE_IDENTIFIERS = %w(
      0BSD
      AAL
      ADSL
      AFL-1.1
      AFL-1.2
      AFL-2.0
      AFL-2.1
      AFL-3.0
      AGPL-1.0
      AGPL-3.0
      AGPL-3.0-only
      AGPL-3.0-or-later
      AMDPLPA
      AML
      AMPAS
      ANTLR-PD
      APAFML
      APL-1.0
      APSL-1.0
      APSL-1.1
      APSL-1.2
      APSL-2.0
      Abstyles
      Adobe-2006
      Adobe-Glyph
      Afmparse
      Aladdin
      Apache-1.0
      Apache-1.1
      Apache-2.0
      Artistic-1.0
      Artistic-1.0-Perl
      Artistic-1.0-cl8
      Artistic-2.0
      BSD-1-Clause
      BSD-2-Clause
      BSD-2-Clause-FreeBSD
      BSD-2-Clause-NetBSD
      BSD-2-Clause-Patent
      BSD-3-Clause
      BSD-3-Clause-Attribution
      BSD-3-Clause-Clear
      BSD-3-Clause-LBNL
      BSD-3-Clause-No-Nuclear-License
      BSD-3-Clause-No-Nuclear-License-2014
      BSD-3-Clause-No-Nuclear-Warranty
      BSD-4-Clause
      BSD-4-Clause-UC
      BSD-Protection
      BSD-Source-Code
      BSL-1.0
      Bahyph
      Barr
      Beerware
      BitTorrent-1.0
      BitTorrent-1.1
      Borceux
      CATOSL-1.1
      CC-BY-1.0
      CC-BY-2.0
      CC-BY-2.5
      CC-BY-3.0
      CC-BY-4.0
      CC-BY-NC-1.0
      CC-BY-NC-2.0
      CC-BY-NC-2.5
      CC-BY-NC-3.0
      CC-BY-NC-4.0
      CC-BY-NC-ND-1.0
      CC-BY-NC-ND-2.0
      CC-BY-NC-ND-2.5
      CC-BY-NC-ND-3.0
      CC-BY-NC-ND-4.0
      CC-BY-NC-SA-1.0
      CC-BY-NC-SA-2.0
      CC-BY-NC-SA-2.5
      CC-BY-NC-SA-3.0
      CC-BY-NC-SA-4.0
      CC-BY-ND-1.0
      CC-BY-ND-2.0
      CC-BY-ND-2.5
      CC-BY-ND-3.0
      CC-BY-ND-4.0
      CC-BY-SA-1.0
      CC-BY-SA-2.0
      CC-BY-SA-2.5
      CC-BY-SA-3.0
      CC-BY-SA-4.0
      CC0-1.0
      CDDL-1.0
      CDDL-1.1
      CDLA-Permissive-1.0
      CDLA-Sharing-1.0
      CECILL-1.0
      CECILL-1.1
      CECILL-2.0
      CECILL-2.1
      CECILL-B
      CECILL-C
      CNRI-Jython
      CNRI-Python
      CNRI-Python-GPL-Compatible
      CPAL-1.0
      CPL-1.0
      CPOL-1.02
      CUA-OPL-1.0
      Caldera
      ClArtistic
      Condor-1.1
      Crossword
      CrystalStacker
      Cube
      D-FSL-1.0
      DOC
      DSDP
      Dotseqn
      ECL-1.0
      ECL-2.0
      EFL-1.0
      EFL-2.0
      EPL-1.0
      EPL-2.0
      EUDatagrid
      EUPL-1.0
      EUPL-1.1
      EUPL-1.2
      Entessa
      ErlPL-1.1
      Eurosym
      FSFAP
      FSFUL
      FSFULLR
      FTL
      Fair
      Frameworx-1.0
      FreeImage
      GFDL-1.1
      GFDL-1.1-only
      GFDL-1.1-or-later
      GFDL-1.2
      GFDL-1.2-only
      GFDL-1.2-or-later
      GFDL-1.3
      GFDL-1.3-only
      GFDL-1.3-or-later
      GL2PS
      GPL-1.0
      GPL-1.0+
      GPL-1.0-only
      GPL-1.0-or-later
      GPL-2.0
      GPL-2.0+
      GPL-2.0-only
      GPL-2.0-or-later
      GPL-2.0-with-GCC-exception
      GPL-2.0-with-autoconf-exception
      GPL-2.0-with-bison-exception
      GPL-2.0-with-classpath-exception
      GPL-2.0-with-font-exception
      GPL-3.0
      GPL-3.0+
      GPL-3.0-only
      GPL-3.0-or-later
      GPL-3.0-with-GCC-exception
      GPL-3.0-with-autoconf-exception
      Giftware
      Glide
      Glulxe
      HPND
      HaskellReport
      IBM-pibs
      ICU
      IJG
      IPA
      IPL-1.0
      ISC
      ImageMagick
      Imlib2
      Info-ZIP
      Intel
      Intel-ACPI
      Interbase-1.0
      JSON
      JasPer-2.0
      LAL-1.2
      LAL-1.3
      LGPL-2.0
      LGPL-2.0+
      LGPL-2.0-only
      LGPL-2.0-or-later
      LGPL-2.1
      LGPL-2.1+
      LGPL-2.1-only
      LGPL-2.1-or-later
      LGPL-3.0
      LGPL-3.0+
      LGPL-3.0-only
      LGPL-3.0-or-later
      LGPLLR
      LPL-1.0
      LPL-1.02
      LPPL-1.0
      LPPL-1.1
      LPPL-1.2
      LPPL-1.3a
      LPPL-1.3c
      Latex2e
      Leptonica
      LiLiQ-P-1.1
      LiLiQ-R-1.1
      LiLiQ-Rplus-1.1
      Libpng
      MIT
      MIT-CMU
      MIT-advertising
      MIT-enna
      MIT-feh
      MITNFA
      MPL-1.0
      MPL-1.1
      MPL-2.0
      MPL-2.0-no-copyleft-exception
      MS-PL
      MS-RL
      MTLL
      MakeIndex
      MirOS
      Motosoto
      Multics
      Mup
      NASA-1.3
      NBPL-1.0
      NCSA
      NGPL
      NLOD-1.0
      NLPL
      NOSL
      NPL-1.0
      NPL-1.1
      NPOSL-3.0
      NRL
      NTP
      Naumen
      Net-SNMP
      NetCDF
      Newsletr
      Nokia
      Noweb
      Nunit
      OCCT-PL
      OCLC-2.0
      ODbL-1.0
      OFL-1.0
      OFL-1.1
      OGTSL
      OLDAP-1.1
      OLDAP-1.2
      OLDAP-1.3
      OLDAP-1.4
      OLDAP-2.0
      OLDAP-2.0.1
      OLDAP-2.1
      OLDAP-2.2
      OLDAP-2.2.1
      OLDAP-2.2.2
      OLDAP-2.3
      OLDAP-2.4
      OLDAP-2.5
      OLDAP-2.6
      OLDAP-2.7
      OLDAP-2.8
      OML
      OPL-1.0
      OSET-PL-2.1
      OSL-1.0
      OSL-1.1
      OSL-2.0
      OSL-2.1
      OSL-3.0
      OpenSSL
      PDDL-1.0
      PHP-3.0
      PHP-3.01
      Plexus
      PostgreSQL
      Python-2.0
      QPL-1.0
      Qhull
      RHeCos-1.1
      RPL-1.1
      RPL-1.5
      RPSL-1.0
      RSA-MD
      RSCPL
      Rdisc
      Ruby
      SAX-PD
      SCEA
      SGI-B-1.0
      SGI-B-1.1
      SGI-B-2.0
      SISSL
      SISSL-1.2
      SMLNJ
      SMPPL
      SNIA
      SPL-1.0
      SWL
      Saxpath
      Sendmail
      SimPL-2.0
      Sleepycat
      Spencer-86
      Spencer-94
      Spencer-99
      StandardML-NJ
      SugarCRM-1.1.3
      TCL
      TCP-wrappers
      TMate
      TORQUE-1.1
      TOSL
      UPL-1.0
      Unicode-DFS-2015
      Unicode-DFS-2016
      Unicode-TOU
      Unlicense
      VOSTROM
      VSL-1.0
      Vim
      W3C
      W3C-19980720
      W3C-20150513
      WTFPL
      Watcom-1.0
      Wsuipa
      X11
      XFree86-1.1
      XSkat
      Xerox
      Xnet
      YPL-1.0
      YPL-1.1
      ZPL-1.1
      ZPL-2.0
      ZPL-2.1
      Zed
      Zend-2.0
      Zimbra-1.3
      Zimbra-1.4
      Zlib
      bzip2-1.0.5
      bzip2-1.0.6
      curl
      diffmark
      dvipdfm
      eCos-2.0
      eGenix
      gSOAP-1.3b
      gnuplot
      iMatix
      libtiff
      mpich2
      psfrag
      psutils
      wxWindows
      xinetd
      xpp
      zlib-acknowledgement
  ).freeze

  # exception identifiers
  EXCEPTION_IDENTIFIERS = %w(
      389-exception
      Autoconf-exception-2.0
      Autoconf-exception-3.0
      Bison-exception-2.2
      Bootloader-exception
      CLISP-exception-2.0
      Classpath-exception-2.0
      DigiRule-FOSS-exception
      FLTK-exception
      Fawkes-Runtime-exception
      Font-exception-2.0
      GCC-exception-2.0
      GCC-exception-3.1
      LZMA-exception
      Libtool-exception
      Linux-syscall-note
      Nokia-Qt-exception-1.1
      OCCT-exception-1.0
      Qwt-exception-1.0
      WxWindows-exception-3.1
      eCos-exception-2.0
      freertos-exception-2.0
      gnu-javamail-exception
      i2p-gpl-java-exception
      mif-exception
      openvpn-openssl-exception
      u-boot-exception-2.0
  ).freeze

  REGEXP = %r{
    \A
    (
      #{Regexp.union(LICENSE_IDENTIFIERS)}
      \+?
      (\s WITH \s #{Regexp.union(EXCEPTION_IDENTIFIERS)})?
      | #{NONSTANDARD}
    )
    \Z
  }ox.freeze

  def self.match?(license)
    !REGEXP.match(license).nil?
  end

  def self.suggestions(license)
    by_distance = LICENSE_IDENTIFIERS.group_by do |identifier|
      levenshtein_distance(identifier, license)
    end
    lowest = by_distance.keys.min
    return unless lowest < license.size
    by_distance[lowest]
  end

end