Return-Path: X-Original-To: apmail-incubator-rat-commits-archive@minotaur.apache.org Delivered-To: apmail-incubator-rat-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id E0EA87F1A for ; Wed, 7 Dec 2011 08:07:03 +0000 (UTC) Received: (qmail 10605 invoked by uid 500); 7 Dec 2011 08:07:03 -0000 Delivered-To: apmail-incubator-rat-commits-archive@incubator.apache.org Received: (qmail 10574 invoked by uid 500); 7 Dec 2011 08:07:02 -0000 Mailing-List: contact rat-commits-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: rat-dev@incubator.apache.org Delivered-To: mailing list rat-commits@incubator.apache.org Received: (qmail 10564 invoked by uid 99); 7 Dec 2011 08:07:01 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 07 Dec 2011 08:07:01 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 07 Dec 2011 08:06:56 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 6F08223888E7; Wed, 7 Dec 2011 08:06:33 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1211324 - in /incubator/rat/main/trunk: ./ apache-rat-core/src/main/java/org/apache/rat/ apache-rat-core/src/main/java/org/apache/rat/analysis/license/ apache-rat-core/src/main/java/org/apache/rat/api/ apache-rat-core/src/main/java/org/apa... Date: Wed, 07 Dec 2011 08:06:32 -0000 To: rat-commits@incubator.apache.org From: bodewig@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20111207080633.6F08223888E7@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: bodewig Date: Wed Dec 7 08:06:32 2011 New Revision: 1211324 URL: http://svn.apache.org/viewvc?rev=1211324&view=rev Log: Detect and approve MIT license. Submitted by Hugo Hirsch. RAT-49 Added: incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/analysis/license/MITLicense.java (with props) incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/license/MITLicenseFamily.java (with props) incubator/rat/main/trunk/apache-rat-core/src/test/java/org/apache/rat/analysis/license/MITLicenseTest.java (with props) Modified: incubator/rat/main/trunk/RELEASE_NOTES.txt incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/Defaults.java incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/api/MetaData.java incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/policy/DefaultPolicy.java incubator/rat/main/trunk/apache-rat-tasks/src/main/resources/org/apache/rat/anttasks/antlib.xml incubator/rat/main/trunk/apache-rat-tasks/src/site/apt/types.apt Modified: incubator/rat/main/trunk/RELEASE_NOTES.txt URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/RELEASE_NOTES.txt?rev=1211324&r1=1211323&r2=1211324&view=diff ============================================================================== --- incubator/rat/main/trunk/RELEASE_NOTES.txt (original) +++ incubator/rat/main/trunk/RELEASE_NOTES.txt Wed Dec 7 08:06:32 2011 @@ -7,6 +7,7 @@ RAT 0.9 * RAT-13 GPL 1.x to 3.x are now detected (but not approved by default) * RAT-111 Files generated by javah are now detected as generated files that don't require a license. + * RAT-49 MIT license is now detected and approved by default RAT 0.8 ======= Modified: incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/Defaults.java URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/Defaults.java?rev=1211324&r1=1211323&r2=1211324&view=diff ============================================================================== --- incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/Defaults.java (original) +++ incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/Defaults.java Wed Dec 7 08:06:32 2011 @@ -26,6 +26,7 @@ import org.apache.rat.analysis.license.D import org.apache.rat.analysis.license.GPL1License; import org.apache.rat.analysis.license.GPL2License; import org.apache.rat.analysis.license.GPL3License; +import org.apache.rat.analysis.license.MITLicense; import org.apache.rat.analysis.license.OASISLicense; import org.apache.rat.analysis.license.TMF854LicenseHeader; import org.apache.rat.analysis.license.W3CDocLicense; @@ -52,6 +53,7 @@ public class Defaults { new GPL1License(), new GPL2License(), new GPL3License(), + new MITLicense(), new W3CLicense(), new W3CDocLicense(), new OASISLicense(), Added: incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/analysis/license/MITLicense.java URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/analysis/license/MITLicense.java?rev=1211324&view=auto ============================================================================== --- incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/analysis/license/MITLicense.java (added) +++ incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/analysis/license/MITLicense.java Wed Dec 7 08:06:32 2011 @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information * + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the * + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + */ +package org.apache.rat.analysis.license; + +import org.apache.rat.api.MetaData; + +/** + * Base MIT license (all 3 parts). + */ +public class MITLicense extends SimplePatternBasedLicense { + public static final String FIRST_LICENSE_LINE = "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:"; + public static final String MIDDLE_LICENSE_LINE = "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software."; + public static final String AS_IS_LICENSE_LINE = "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."; + + public MITLicense() { + super(MetaData.RAT_LICENSE_FAMILY_CATEGORY_DATUM_MIT, + MetaData.RAT_LICENSE_FAMILY_NAME_DATUM_MIT, + "", new String[]{FIRST_LICENSE_LINE, MIDDLE_LICENSE_LINE, AS_IS_LICENSE_LINE}); + } +} Propchange: incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/analysis/license/MITLicense.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/api/MetaData.java URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/api/MetaData.java?rev=1211324&r1=1211323&r2=1211324&view=diff ============================================================================== --- incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/api/MetaData.java (original) +++ incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/api/MetaData.java Wed Dec 7 08:06:32 2011 @@ -63,6 +63,7 @@ public class MetaData { public static final String RAT_LICENSE_FAMILY_CATEGORY_VALUE_GPL1 ="GPL1 "; public static final String RAT_LICENSE_FAMILY_CATEGORY_VALUE_GPL2 ="GPL2 "; public static final String RAT_LICENSE_FAMILY_CATEGORY_VALUE_GPL3 = "GPL3 "; + public static final String RAT_LICENSE_FAMILY_CATEGORY_VALUE_MIT = "MIT "; public static final Datum RAT_LICENSE_FAMILY_CATEGORY_DATUM_GEN = new Datum(RAT_URL_LICENSE_FAMILY_CATEGORY, RAT_LICENSE_FAMILY_CATEGORY_VALUE_GEN); public static final Datum RAT_LICENSE_FAMILY_CATEGORY_DATUM_UNKNOWN = new Datum(RAT_URL_LICENSE_FAMILY_CATEGORY, RAT_LICENSE_FAMILY_CATEGORY_VALUE_UNKNOWN); @@ -75,6 +76,7 @@ public class MetaData { public static final Datum RAT_LICENSE_FAMILY_CATEGORY_DATUM_GPL1 = new Datum(RAT_URL_LICENSE_FAMILY_CATEGORY,RAT_LICENSE_FAMILY_CATEGORY_VALUE_GPL1); public static final Datum RAT_LICENSE_FAMILY_CATEGORY_DATUM_GPL2 = new Datum(RAT_URL_LICENSE_FAMILY_CATEGORY,RAT_LICENSE_FAMILY_CATEGORY_VALUE_GPL2); public static final Datum RAT_LICENSE_FAMILY_CATEGORY_DATUM_GPL3 = new Datum(RAT_URL_LICENSE_FAMILY_CATEGORY,RAT_LICENSE_FAMILY_CATEGORY_VALUE_GPL3); + public static final Datum RAT_LICENSE_FAMILY_CATEGORY_DATUM_MIT = new Datum(RAT_URL_LICENSE_FAMILY_CATEGORY,RAT_LICENSE_FAMILY_CATEGORY_VALUE_MIT); // License Family Standard Names public static final String RAT_URL_LICENSE_FAMILY_NAME= RAT_BASE_URL + "#LicenseFamilyName"; @@ -89,6 +91,8 @@ public class MetaData { "GNU General Public License, version 2"; public static final String RAT_LICENSE_FAMILY_NAME_VALUE_GPL_VERSION_3 = "GNU General Public License, version 3"; + public static final String RAT_LICENSE_FAMILY_NAME_VALUE_MIT = + "The MIT License"; public static final String RAT_LICENSE_FAMILY_NAME_VALUE_ACADEMIC_FREE_LICENSE_VERSION_2_1 = "Academic Free License, Version 2.1"; public static final String RAT_LICENSE_FAMILY_NAME_VALUE_UNKNOWN = "?????"; public static final Datum RAT_LICENSE_FAMILY_NAME_DATUM_W3C_SOFTWARE_COPYRIGHT @@ -107,6 +111,8 @@ public class MetaData { RAT_LICENSE_FAMILY_NAME_DATUM_GPL_VERSION_2 = new Datum(RAT_URL_LICENSE_FAMILY_NAME, RAT_LICENSE_FAMILY_CATEGORY_VALUE_GPL2); public static final Datum RAT_LICENSE_FAMILY_NAME_DATUM_GPL_VERSION_3 = new Datum(RAT_URL_LICENSE_FAMILY_NAME, RAT_LICENSE_FAMILY_NAME_VALUE_GPL_VERSION_3); + public static final Datum + RAT_LICENSE_FAMILY_NAME_DATUM_MIT = new Datum(RAT_URL_LICENSE_FAMILY_NAME, RAT_LICENSE_FAMILY_NAME_VALUE_MIT); public static final Datum RAT_LICENSE_FAMILY_NAME_DATUM_ACADEMIC_FREE_LICENSE_VERSION_2_1 = new Datum(RAT_URL_LICENSE_FAMILY_NAME, RAT_LICENSE_FAMILY_NAME_VALUE_ACADEMIC_FREE_LICENSE_VERSION_2_1); public static final Datum RAT_LICENSE_FAMILY_NAME_DATUM_UNKNOWN Added: incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/license/MITLicenseFamily.java URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/license/MITLicenseFamily.java?rev=1211324&view=auto ============================================================================== --- incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/license/MITLicenseFamily.java (added) +++ incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/license/MITLicenseFamily.java Wed Dec 7 08:06:32 2011 @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information * + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the * + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + */ +package org.apache.rat.license; + +import org.apache.rat.api.MetaData; + +/** + * Base implementation for MIT licenses. + */ +public class MITLicenseFamily extends SimpleLicenseFamily { + public MITLicenseFamily() { + super(MetaData.RAT_LICENSE_FAMILY_NAME_VALUE_MIT); + } + +} Propchange: incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/license/MITLicenseFamily.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/policy/DefaultPolicy.java URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/policy/DefaultPolicy.java?rev=1211324&r1=1211323&r2=1211324&view=diff ============================================================================== --- incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/policy/DefaultPolicy.java (original) +++ incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/policy/DefaultPolicy.java Wed Dec 7 08:06:32 2011 @@ -33,7 +33,8 @@ public class DefaultPolicy implements ID MetaData.RAT_LICENSE_FAMILY_NAME_VALUE_OASIS_OPEN_LICENSE, MetaData.RAT_LICENSE_FAMILY_NAME_VALUE_W3C_SOFTWARE_COPYRIGHT, MetaData.RAT_LICENSE_FAMILY_NAME_VALUE_W3C_DOCUMENT_COPYRIGHT, - MetaData.RAT_LICENSE_FAMILY_NAME_VALUE_MODIFIED_BSD_LICENSE + MetaData.RAT_LICENSE_FAMILY_NAME_VALUE_MODIFIED_BSD_LICENSE, + MetaData.RAT_LICENSE_FAMILY_NAME_VALUE_MIT, }; private static final String[] toNames(final ILicenseFamily[] approvedLicenses) { Added: incubator/rat/main/trunk/apache-rat-core/src/test/java/org/apache/rat/analysis/license/MITLicenseTest.java URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-core/src/test/java/org/apache/rat/analysis/license/MITLicenseTest.java?rev=1211324&view=auto ============================================================================== --- incubator/rat/main/trunk/apache-rat-core/src/test/java/org/apache/rat/analysis/license/MITLicenseTest.java (added) +++ incubator/rat/main/trunk/apache-rat-core/src/test/java/org/apache/rat/analysis/license/MITLicenseTest.java Wed Dec 7 08:06:32 2011 @@ -0,0 +1,106 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information * + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the * + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + */ +package org.apache.rat.analysis.license; + +import org.apache.rat.api.Document; +import org.apache.rat.document.MockLocation; +import org.apache.rat.report.claim.impl.xml.MockClaimReporter; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +/** + * @author hirsch + * @version 2011-12-06, 23:48 + */ +public class MITLicenseTest { + private MockClaimReporter reporter; + private Document subject; + + /** + * To ease testing provide a map with a given license version and the string to test for. + */ + private static Map licenseStringMap; + + @BeforeClass + public static void initLicencesUnderTest() { + licenseStringMap = new HashMap(); + licenseStringMap.put(new MITLicense(), MITLicense.AS_IS_LICENSE_LINE); + licenseStringMap.put(new MITLicense(), MITLicense.MIDDLE_LICENSE_LINE); + licenseStringMap.put(new MITLicense(), MITLicense.FIRST_LICENSE_LINE); + + assertEquals(3, licenseStringMap.entrySet().size()); + } + + + @Before + public final void initReporter() { + this.reporter = new MockClaimReporter(); + this.subject = new MockLocation("subject"); + } + + @Test + public void testNegativeMatches() throws Exception { + for(Map.Entry licenceUnderTest : licenseStringMap.entrySet()) { + assertFalse(licenceUnderTest.getKey().matches("'Behold, Telemachus! (nor fear the sight,)")); + assertFalse(licenceUnderTest.getKey().match(subject, "'Behold, Telemachus! (nor fear the sight,)")); + } + } + + @Test + public void testPositiveMatches() throws Exception { + for(Map.Entry licenceUnderTest : licenseStringMap.entrySet()) { + assertTrue(licenceUnderTest.getKey().matches("\t" + licenceUnderTest.getValue())); + assertTrue(licenceUnderTest.getKey().matches(" " + licenceUnderTest.getValue())); + assertTrue(licenceUnderTest.getKey().matches(licenceUnderTest.getValue())); + assertTrue(licenceUnderTest.getKey().matches(" * " + licenceUnderTest.getValue())); + assertTrue(licenceUnderTest.getKey().matches(" // " + licenceUnderTest.getValue())); + assertTrue(licenceUnderTest.getKey().matches(" /* " + licenceUnderTest.getValue())); + assertTrue(licenceUnderTest.getKey().matches(" /** " + licenceUnderTest.getValue())); + assertTrue(licenceUnderTest.getKey().matches(" " + licenceUnderTest.getValue())); + assertTrue(licenceUnderTest.getKey().matches(" ## " + licenceUnderTest.getValue())); + assertTrue(licenceUnderTest.getKey().matches(" ## " + licenceUnderTest.getValue() + " ##")); + } + } + + @Test + public void testPositiveMatchInDocument() throws Exception { + for(Map.Entry licenceUnderTest : licenseStringMap.entrySet()) { + assertTrue(licenceUnderTest.getKey().match(subject, "\t" + licenceUnderTest.getValue())); + assertTrue(licenceUnderTest.getKey().match(subject, " " + licenceUnderTest.getValue())); + assertTrue(licenceUnderTest.getKey().match(subject, licenceUnderTest.getValue())); + assertTrue(licenceUnderTest.getKey().match(subject, " * " + licenceUnderTest.getValue())); + assertTrue(licenceUnderTest.getKey().match(subject, " // " + licenceUnderTest.getValue())); + assertTrue(licenceUnderTest.getKey().match(subject, " /* " + licenceUnderTest.getValue())); + assertTrue(licenceUnderTest.getKey().match(subject, " /** " + licenceUnderTest.getValue())); + assertTrue(licenceUnderTest.getKey().match(subject, " " + licenceUnderTest.getValue())); + assertTrue(licenceUnderTest.getKey().match(subject, " ## " + licenceUnderTest.getValue())); + assertTrue(licenceUnderTest.getKey().match(subject, " ## " + licenceUnderTest.getValue() + " ##")); + } + } + + +} Propchange: incubator/rat/main/trunk/apache-rat-core/src/test/java/org/apache/rat/analysis/license/MITLicenseTest.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: incubator/rat/main/trunk/apache-rat-tasks/src/main/resources/org/apache/rat/anttasks/antlib.xml URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-tasks/src/main/resources/org/apache/rat/anttasks/antlib.xml?rev=1211324&r1=1211323&r2=1211324&view=diff ============================================================================== --- incubator/rat/main/trunk/apache-rat-tasks/src/main/resources/org/apache/rat/anttasks/antlib.xml (original) +++ incubator/rat/main/trunk/apache-rat-tasks/src/main/resources/org/apache/rat/anttasks/antlib.xml Wed Dec 7 08:06:32 2011 @@ -47,6 +47,8 @@ classname="org.apache.rat.analysis.license.GPL2License"/> + + Modified: incubator/rat/main/trunk/apache-rat-tasks/src/site/apt/types.apt URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-tasks/src/site/apt/types.apt?rev=1211324&r1=1211323&r2=1211324&view=diff ============================================================================== --- incubator/rat/main/trunk/apache-rat-tasks/src/site/apt/types.apt (original) +++ incubator/rat/main/trunk/apache-rat-tasks/src/site/apt/types.apt Wed Dec 7 08:06:32 2011 @@ -54,6 +54,9 @@ Built-In Types *-------*---------+-------------+ | javadoc | Javadocs that don't need a license | <<>> *-------*---------+-------------+ +| mit | {{{http://www.opensource.org/licenses/MIT}The MIT License}} | <<>> +| | | +*-------*---------+-------------+ | oasis | OASIS copyright claim plus derivative work clause | <<>> | | | *-------*---------+-------------+ @@ -146,6 +149,9 @@ Built-In Types | gpl3-family | GNU General Public License, version 3 | <<>> | | | *-------*---------+-------------+ +| mit-family | The MIT License | <<>> +| | | +*-------*---------+-------------+ | modified-bsd | Modified BSD License | <<>> | | | *-------*---------+-------------+