Open Source License API ?

no extension

yomoyomo さんの記事から。

う~ん? どうやらオープンソース・ライセンスに関する情報(メタデータ)を取り出せる仕組みのようだ。

たとえば Apache License 2.0 の情報を取り出すには https://api.opensource.org/license/Apache-2.0 にリクエストを投げる。 すると結果が JSON 形式で返ってくる。 (以下は見やすいように適当に改行を入れている。 各項目の Schema はリポジトリの doc/endpoints.md に説明がある)

{
    "id":"Apache-2.0",
    "identifiers":
        [
            {
                "identifier":"Apache-2.0",
                "scheme":"DEP5"
            },
            {
                "identifier":"Apache-2.0",
                "scheme":"SPDX"
            },
            {
                "identifier":"License :: OSI Approved :: Apache Software License",
                "scheme":"Trove"
            }
        ],
    "links":
        [
            {
                "note":"tl;dr legal",
                "url":"https://tldrlegal.com/license/apache-license-2.0-%28apache-2.0%29"
            },
            {
                "note":"Wikipedia page",
                "url":"https://en.wikipedia.org/wiki/Apache_License"
            },
            {
                "note":"OSI Page",
                "url":"https://opensource.org/licenses/Apache-2.0"
            }
        ],
    "name":"Apache License, Version 2.0",
    "other_names":[],
    "superseded_by":null,
    "keywords":
        [
            "osi-approved",
            "popular",
            "permissive"
        ],
    "text":
        [
            {
                "media_type":"text/html",
                "title":"HTML",
                "url":"https://www.apache.org/licenses/LICENSE-2.0"
            }
        ]
}

あるいは SPDX の識別子を使って https://api.opensource.org/license/SPDX/Apache-2.0 にリクエストを投げても同じ結果が帰ってくる。

キーワードで検索することもできるようだ。 たとえば Copyleft なライセンスを探すのであれば https://api.opensource.org/licenses/copyleft とリクエストを投げれば,先程のようなライセンス情報が配列で返ってくる。 ちなみに licenses/ のうしろに何もキーワードを付けないと登録されている全ライセンスの情報1 が返ってくるようだ。

リポジトリを見ると Go 言語による実装がある2。 こんな感じで使える。

package main

import (
    "fmt"

    "github.com/opensourceorg/api/client"
)

func ohshit(err error) {
    if err != nil {
        panic(err)
    }
}

func main() {
    license, err := client.Get("Apache-2.0")
    ohshit(err)
    fmt.Printf("%s\n", license.Name)
}

これを実行すると以下のような出力になる。

$ go run sample.go
Apache License, Version 2.0

キーワードで探すならこんな感じかな。

package main

import (
    "fmt"

    "github.com/opensourceorg/api/client"
)

func ohshit(err error) {
    if err != nil {
        panic(err)
    }
}

func main() {
    licenses, err := client.Tagged("copyleft")
    ohshit(err)
    for _, license := range licenses {
        fmt.Printf("%s\n", license.Name)
    }
}

このコードの実行結果は以下のとおり。

$ go run sample2.go
GNU General Public License, Version 2.0
GNU General Public License, Version 3.0
GNU Lesser General Public License, Version 2.1
GNU Lesser General Public License, Version 3.0
Licence Libre du Québec – Réciprocité forte, Version 1.1
Licence Libre du Québec – Réciprocité, Version 1.1
Mozilla Public License, Version 2.0

う~ん。 正直に言って,既に SPDX のようなサービスがあるのに,わざわざこのような仕組みを作る意味がよく分からない。

The concept behind this API is to be a "hub" to store a central list of crosswalks and common identifiers to other services, allowing third parties who are already license-aware to provide their mappings, and pull OSI approval status programatically. As a proof of concept, SPDX identifiers have been added, trivially allowing cross-walks to SPDX datasets. This allows anyone to take an SPDX license ID, and determine if it's OSI approved by asking the OSI API.

OSI がやることに意味があるということだろうか。 あるいは API に著作権があるとされた昨年の判決を受けての防衛措置だったりして。


  1. ライセンス・データおよび API は CC0 で提供されているようである。 API を利用するなら金よこせとか言うどこぞの企業とは違うらしい(笑) ↩︎

  2. 他にも Python, Ruby, Haskell による実装がある。 ↩︎