summaryrefslogtreecommitdiff
blob: 2d9565a80d15ce755efdd9d09c37f5f27319ed6d (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
#!/usr/bin/env ruby
# Gathers project information from the RDF graph into a JSON file.
# Alex Legler <a3li@gentoo.org>

require_relative 'lib/vocabulary'
require 'json'
require 'rdf/rdfxml'
require 'uri'
include RDF

abort "Usage: #{$PROGRAM_NAME} <RDF graph file or URL>" unless ARGV.first

graph = RDF::Graph.load(ARGV.first)

projects_q = Query.new do
  # Base information about the project
  pattern [:proj_uri, RDF.type, GentooWiki::PROJ]
  pattern [:proj_uri, GentooWiki::PROP_NAME, :proj_name]
  pattern [:proj_uri, GentooWiki::PROP_CONTACT, :proj_email]
  pattern [:proj_uri, GentooWiki::PROP_DESC, :proj_desc]
  pattern [:proj_uri, RDF::RDFS.label, :proj_title]
  pattern [:proj_uri, GentooWiki::PROP_PAGE, :proj_href]

  # Find parents
  pattern [:proj_uri, GentooWiki::PROP_PARENT_PROJECT, :parent_uri]
  pattern [:parent_uri, RDF::RDFS.label, :parent_title]

  pattern [:proj_uri, GentooWiki::PROP_PROPAGATES_MEMBERS, :propagates_members], optional: true
  pattern [:proj_uri, GentooWiki::PROP_IRC, :proj_irc], optional: true
  pattern [:proj_uri, GentooWiki::PROP_LEAD_ELECTION_DATE, :proj_lead_election_date], optional: true
end

def query_members(project_uri)
  Query.new do
    pattern [RDF::URI.new(project_uri), GentooWiki::SUBOBJECT, :member_subobj_uri]
    pattern [:member_subobj_uri, GentooWiki::PROP_DEV, :member_uri]
    pattern [:member_subobj_uri, GentooWiki::PROP_LEAD, :member_is_lead]
    pattern [:member_uri, GentooWiki::PROP_NICK, :member_nick]
    pattern [:member_uri, GentooWiki::PROP_NAME, :member_name]
    pattern [:member_uri, GentooWiki::PROP_CONTACT, :member_email]

    pattern [:member_subobj_uri, GentooWiki::PROP_ROLE, :member_roles], optional: true
  end
end

def label_to_id(label)
  label.to_s.gsub(/^Project:/, '')
end

def https(url)
  url.gsub(%r{^//}, 'https://')
end

def email(uri)
  uri.gsub(/^mailto:/, '')
end

projects = {}

projects_q.execute(graph) do |result|
  project_id = label_to_id result[:proj_title]

  project = {}
  project['name'] = result[:proj_name].to_s
  project['email'] = email result[:proj_email].to_s
  project['description'] = result[:proj_desc].to_s
  project['irc'] = result[:proj_irc].to_s
  project['href'] = URI.decode(https(result[:proj_href].to_s).gsub('-', '%'))
  project['propagates_members'] = result[:propagates_members].to_s == 'true'
  project['lead_election_date'] = result[:proj_lead_election_date].to_s

  parent_id = label_to_id result[:parent_title].to_s
  project['parent'] = parent_id unless parent_id == 'Gentoo'

  project['members'] = []
  query_members(result[:proj_uri]).execute(graph) do |member_result|
    member_hash = {
      'nickname' => member_result[:member_nick].to_s,
      'is_lead' => member_result[:member_is_lead].to_s == 'true',
      'email' => email(member_result[:member_email].to_s),
      'name' => member_result[:member_name].to_s
    }

    member_hash['role'] = member_result[:member_roles].to_s unless member_result[:member_roles].nil?
    project['members'] << member_hash
  end

  projects[project_id] = project
end

puts projects.sort.to_h.to_json