Libraries.io Open Dataの形式を調べてみた

[Libraries.io](https://libraries.io/)というWebサイトがある。36種類近くのパッケージマネージャーで管理されている300万以上のOSSを検索できるらしい。


全部で7種類のCSVが公開されているので、データ形式を調べてみた。

## Libraries.io

とにかくたくさんのOSSを横断的に検索することができる。

>
Libraries.io indexes data from 3,433,973 packages from 36 package managers. We monitor package releases, analyse each project's code, community, distribution and documentation, and we map the relationships between packages when they're declared as a dependency. The 'dependency tree' that emerges is the core of the services that we provide.

似たような他のWebサイトと違って、全データのダウンロードが可能で、かつ、その中にOSS同士の依存関係の情報も含まれている点に特色がある。

より詳しい情報は下記のページに書いてある。

[About Libraries.io](https://libraries.io/about)
[Libraries.io Open Data](https://libraries.io/data)

## Libraries.ioからダウンロードできるCSVデータ

下記7種類のデータをダウンロードすることができる。データサイズは公開されている圧縮ファイルで8.8GB、展開後で70GBある。

1. Projects
1. Versions
1. Tags
1. Dependencies
1. Repositories
1. Repository Dependencies
1. Projects with related Repository fields

2017年は6、7、11月の3回、2018年は3月の1回、公開されているデータを更新している。

## Libraries.ioで公開されている各データの形式

Rubygemsで公開されているパッケージを例として、各CSVデータの形式をざっくり説明していく。

#### Projects

Libraries.ioがデータとして持っているOSSパッケージの一覧が書かれている。

抜粋した内容は、Rubygemsでパッケージが公開されておりソースがGithubでホスティングされている[twitter gem](https://github.com/sferik/twitter)の該当行。

```
ID,Platform,Name,Created Timestamp,Updated Timestamp,Description,Keywords,Homepage URL,Licenses,Repository URL,Versions Count,SourceRank,Latest Release Publish Timestamp,Latest Release Number,Package Manager ID,Dependent Projects Count,Language,Status,Last synced Timestamp,Dependent Repositories Count,Repository ID
86909:86910:260882:262970,Rubygems,twitter,2015-01-28 23:22:04 UTC,2018-02-22 10:12:09 UTC,A Ruby interface to the Twitter API.,"",http://sferik.github.com/twitter/,MIT,https://github.com/sferik/twitter,46,20,2017-11-08 21:41:31 UTC,6.2.0,,316,Ruby,,2017-10-24 03:08:55 UTC,8108,47467
```

#### versions

パッケージのバージョン一覧が書かれている。

抜粋した内容からは、twitter gemの最新バージョンは6.2.0であることが分かる。

```
ID,Platform,Project Name,Project ID,Number,Published Timestamp,Created Timestamp,Updated Timestamp
1666631:11197860,Rubygems,twitter,262970,6.2.0,2017-11-08 21:41:31 UTC,2017-11-08 21:55:08 UTC,2017-11-08 21:55:08 UTC
```

#### Tags

ホスティングされているソースコード管理システムで付けられているタグの一覧が書かれている。

gemはGithubのタグとgemのバージョンが一致していることが多いので、twitter gemはv6.2.0というタグで6.2.0というバージョンが管理されていることが分かる。

```
ID,Host Type,Repository Name with Owner,Repository ID,Tag Name,Tag git sha,Tag Published Timestamp,Tag Created Timestamp,Tag Updated Timestamp
461320:58411659,GitHub,sferik/twitter,47467,v6.2.0,01b9f8af2adb9def71c7ce69b4baaf6a69fda29a,2017-11-08 21:41:21 UTC,2017-11-08 21:56:17 UTC,2017-11-08 21:56:17 UTC
```

#### Dependencies

パッケージが依存している（≒利用している）パッケージに一覧が書かれている。

activerecord 5.1.5はrubygems, activesupport, activemodelの3つに依存していることが分かる。

後述するRepository Dependenciesとの違いは、パッケージのバージョン毎に依存しているパッケージが分かる点。

```
ID,Platform,Project Name,Project ID,Version Number,Version ID,Dependency Name,Dependency Platform,Dependency Kind,Optional Dependency,Dependency Requirements,Dependency Project ID
393546:71985456,Rubygems,activerecord,45651,5.1.5,12143508,arel,Rubygems,runtime,false,~> 8.0,72100
393547:71985454,Rubygems,activerecord,45651,5.1.5,12143508,activesupport,Rubygems,runtime,false,= 5.1.5,49261
393548:71985452,Rubygems,activerecord,45651,5.1.5,12143508,activemodel,Rubygems,runtime,false,= 5.1.5,44770
```

#### Repositories

パッケージのソースコードがGithub, Gitlab, Bitbucketのどれでホスティングされているのかが分かる。

他にも、スター数、フォーク数、イシュー数、READMEのファイル名などが書かれており、Github等のAPIを使わなくてもこのCSVを見ればリポジトリのおおよそのことが分かってとても便利。

```
ID,Host Type,Name with Owner,Description,Fork,Created Timestamp,Updated Timestamp,Last pushed Timestamp,Homepage URL,Size,Stars Count,Language,Issues enabled,Wiki enabled,Pages enabled,Forks Count,Mirror URL,Open Issues Count,Default branch,Watchers Count,UUID,Fork Source Name with Owner,License,Contributors Count,Readme filename,Changelog filename,Contributing guidelines filename,License filename,Code of Conduct filename,Security Threat Model filename,Security Audit filename,Status,Last Synced Timestamp,SourceRank,Display Name,SCM type,Pull requests enabled,Logo URL,Keywords
44884:47467,GitHub,sferik/twitter,A Ruby interface to the Twitter API.,false,2008-02-14 02:20:50 UTC,2018-02-22 02:31:22 UTC,2018-02-22 09:12:26 UTC,http://www.rubydoc.info/gems/twitter,19823,4023,Ruby,true,true,true,1050,,116,master,132,507,,MIT,166,README.md,CHANGELOG.md,CONTRIBUTING.md,LICENSE.md,"","","",,2017-01-14 20:52:52 UTC,17,GitHub,,git,,,""
```

#### Repository Dependencies

あるパッケージが依存しているパッケージが分かる。

前述したDependenciesとの違いは、最新のバージョン（が利用しているロックファイル）の依存関係のみが書かれている点。

```
ID,Host Type,Repository Name with Owner,Repository ID,Manifest Platform,Manifest Filepath,Git branch,Manifest kind,Optional,Dependency Project Name,Dependency Requirements,Dependency Kind,Dependency Project ID
588473:53097131,GitHub,sferik/twitter,47467,Rubygems,twitter.gemspec,,gemspec,,bundler,~> 1.0,development,183038
588474:53097129,GitHub,sferik/twitter,47467,Rubygems,twitter.gemspec,,gemspec,,simple_oauth,~> 0.3.0,runtime,251495
588475:53097127,GitHub,sferik/twitter,47467,Rubygems,twitter.gemspec,,gemspec,,naught,~> 1.0,runtime,227849
588476:53097125,GitHub,sferik/twitter,47467,Rubygems,twitter.gemspec,,gemspec,,multipart-post,~> 2.0,runtime,226680
588477:53097123,GitHub,sferik/twitter,47467,Rubygems,twitter.gemspec,,gemspec,,memoizable,~> 0.4.0,runtime,222753
588478:53097121,GitHub,sferik/twitter,47467,Rubygems,twitter.gemspec,,gemspec,,http_parser.rb,~> 0.6.0,runtime,211121
588479:53097119,GitHub,sferik/twitter,47467,Rubygems,twitter.gemspec,,gemspec,,http-form_data,~> 1.0,runtime,211091
588480:53097117,GitHub,sferik/twitter,47467,Rubygems,twitter.gemspec,,gemspec,,http,~> 2.0,runtime,211035
588481:53097115,GitHub,sferik/twitter,47467,Rubygems,twitter.gemspec,,gemspec,,equalizer,~> 0.0.11,runtime,198801
588482:53097113,GitHub,sferik/twitter,47467,Rubygems,twitter.gemspec,,gemspec,,buftok,~> 0.2.0,runtime,184947
588483:53097111,GitHub,sferik/twitter,47467,Rubygems,twitter.gemspec,,gemspec,,addressable,~> 2.3,runtime,54098
588484:89497119,GitHub,sferik/twitter,47467,Rubygems,Gemfile,,manifest,,yardstick,>= 0,development,270510
588485:89497058,GitHub,sferik/twitter,47467,Rubygems,Gemfile,,manifest,,webmock,>= 0,development,267353
588486:89497015,GitHub,sferik/twitter,47467,Rubygems,Gemfile,,manifest,,timecop,>= 0,development,259873
588487:89496974,GitHub,sferik/twitter,47467,Rubygems,Gemfile,,manifest,,simplecov,>= 0.9,development,251234
588488:89496924,GitHub,sferik/twitter,47467,Rubygems,Gemfile,,manifest,,rubocop,>= 0.46,development,245694
588489:89496877,GitHub,sferik/twitter,47467,Rubygems,Gemfile,,manifest,,rspec,>= 2.14,development,245072
588490:89496822,GitHub,sferik/twitter,47467,Rubygems,Gemfile,,manifest,,coveralls,>= 0,development,191368
588491:89496767,GitHub,sferik/twitter,47467,Rubygems,Gemfile,,manifest,,pry,>= 0,development,236630
588492:89496635,GitHub,sferik/twitter,47467,Rubygems,Gemfile,,manifest,,yard,>= 0,runtime,270411
588493:89496595,GitHub,sferik/twitter,47467,Rubygems,Gemfile,,manifest,,rake,>= 0,runtime,239884
588494:89496517,GitHub,sferik/twitter,47467,Rubygems,Gemfile,,manifest,,jruby-openssl,>= 0,runtime,215580
```

#### Projects with related Repository fields

ProjectsとRepositoriesをJOINしたもの。データを見る人の手間を省いてくれるとても親切なデータ。

```
ID,Platform,Name,Created Timestamp,Updated Timestamp,Description,Keywords,Homepage URL,Licenses,Repository URL,Versions Count,SourceRank,Latest Release Publish Timestamp,Latest Release Number,Package Manager ID,Dependent Projects Count,Language,Status,Last synced Timestamp,Dependent Repositories Count,Repository ID,Repository Host Type,Repository Name with Owner,Repository Description,Repository Fork?,Repository Created Timestamp,Repository Updated Timestamp,Repository Last pushed Timestamp,Repository Homepage URL,Repository Size,Repository Stars Count,Repository Language,Repository Issues enabled?,Repository Wiki enabled?,Repository Pages enabled?,Repository Forks Count,Repository Mirror URL,Repository Open Issues Count,Repository Default branch,Repository Watchers Count,Repository UUID,Repository Fork Source Name with Owner,Repository License,Repository Contributors Count,Repository Readme filename,Repository Changelog filename,Repository Contributing guidelines filename,Repository License filename,Repository Code of Conduct filename,Repository Security Threat Model filename,Repository Security Audit filename,Repository Status,Repository Last Synced Timestamp,Repository SourceRank,Repository Display Name,Repository SCM type,Repository Pull requests enabled?,Repository Logo URL,Repository Keywords
86909:260882:262970,Rubygems,twitter,2015-01-28 23:22:04 UTC,2018-02-22 10:12:09 UTC,A Ruby interface to the Twitter API.,"",http://sferik.github.com/twitter/,MIT,https://github.com/sferik/twitter,46,20,2017-11-08 21:41:31 UTC,6.2.0,,316,Ruby,,2017-10-24 03:08:55 UTC,8108,47467,GitHub,sferik/twitter,A Ruby interface to the Twitter API.,false,2008-02-14 02:20:50 UTC,2018-02-22 02:31:22 UTC,2018-02-22 09:12:26 UTC,http://www.rubydoc.info/gems/twitter,19823,4023,Ruby,true,true,true,1050,,116,master,132,507,,MIT,166,README.md,CHANGELOG.md,CONTRIBUTING.md,LICENSE.md,"","","",,2017-01-14 20:52:52 UTC,17,GitHub,,git,,,""
```

## MySQLに読み込む

Projects with related Repository fieldsのみ、MySQLに読み込んでみる。

```sh
# CSVから読み込むためにlocal_infileを付ける
mysql -u root open_data --local_infile=1
```

```sql
-- 絵文字があるのでutf8ではなくutf8mb4を指定する
create database open_data default character set utf8mb4;

-- カラム毎に型を指定する手間を省くためにすべてvarchar(255)にしている
CREATE TABLE `projects` (`ID` varchar(255) NOT NULL PRIMARY KEY, `Platform` varchar(255), `Name` varchar(255), `Created_Timestamp` varchar(255), `Updated_Timestamp` varchar(255), `Description` varchar(255), `Keywords` varchar(255), `Homepage_URL` varchar(255), `Licenses` varchar(255), `Repository_URL` varchar(255), `Versions_Count` varchar(255), `SourceRank` varchar(255), `Latest_Release_Publish_Timestamp` varchar(255), `Latest_Release_Number` varchar(255), `Package_Manager_ID` varchar(255), `Dependent_Projects_Count` varchar(255), `Language` varchar(255), `Status` varchar(255), `Last_synced_Timestamp` varchar(255), `Dependent_Repositories_Count` varchar(255), `Repository_ID` varchar(255), `Repository_Host_Type` varchar(255), `Repository_Name_with_Owner` varchar(255), `Repository_Description` varchar(255), `Repository_Fork` varchar(255), `Repository_Created_Timestamp` varchar(255), `Repository_Updated_Timestamp` varchar(255), `Repository_Last_pushed_Timestamp` varchar(255), `Repository_Homepage_URL` varchar(255), `Repository_Size` varchar(255), `Repository_Stars_Count` varchar(255), `Repository_Language` varchar(255), `Repository_Issues_enabled` varchar(255), `Repository_Wiki_enabled` varchar(255), `Repository_Pages_enabled` varchar(255), `Repository_Forks_Count` varchar(255), `Repository_Mirror_URL` varchar(255), `Repository_Open_Issues_Count` varchar(255), `Repository_Default_branch` varchar(255), `Repository_Watchers_Count` varchar(255), `Repository_UUID` varchar(255), `Repository_Fork_Source_Name_with_Owner` varchar(255), `Repository_License` varchar(255), `Repository_Contributors_Count` varchar(255), `Repository_Readme_filename` varchar(255), `Repository_Changelog_filename` varchar(255), `Repository_Contributing_guidelines_filename` varchar(255), `Repository_License_filename` varchar(255), `Repository_Code_of_Conduct_filename` varchar(255), `Repository_Security_Threat_Model_filename` varchar(255), `Repository_Security_Audit_filename` varchar(255), `Repository_Status` varchar(255), `Repository_Last_Synced_Timestamp` varchar(255), `Repository_SourceRank` varchar(255), `Repository_Display_Name` varchar(255), `Repository_SCM_type` varchar(255), `Repository_Pull_requests_enabled` varchar(255), `Repository_Logo_URL` varchar(255), `Repository_Keywords` varchar(255))

LOAD DATA LOCAL INFILE '/path/to/projects_with_repository_fields-1.2.0-2018-03-12.csv' INTO TABLE projects FIELDS TERMINATED BY ',' ENCLOSED BY '"' IGNORE 1 LINES;
```

## パッケージのデータを公開しているWebサイト

Rubygems関連に限定すると、下記のWebサイトでも似たようなデータを見ることができる。ただし、ダウンロードできる形式で公開されていることはあまりない。

[RubyGems.org](https://rubygems.org/)
[The Ruby Toolbox](https://www.ruby-toolbox.com/)
[BestGems.org](http://bestgems.org/)
[Sdogruyol/awesome-ruby](https://github.com/Sdogruyol/awesome-ruby)