class TeamApi::CrossReferencer
Builds cross-references between data sets.
Constants
- GUILD_FIELDS
- PROJECT_FIELDS
- TAG_CATEGORIES
- TAG_XREF_FIELDS
- TEAM_FIELDS
- WORKING_GROUP_FIELDS
Public Class Methods
build_xrefs(site)
click to toggle source
Build cross-references between data sets.
site_data
-
Jekyll
site.data
object
# File lib/team_api/cross_referencer.rb, line 22 def self.build_xrefs(site) team, projects, working_groups, guilds = create_xref_data site projects.create_xrefs team name_xrefs = create_name_xrefs team [working_groups, guilds].each do |grouplet| grouplet.create_xrefs team, source_to_target_field: 'leads', alternate_names: name_xrefs grouplet.create_xrefs team, source_to_target_field: 'members', alternate_names: name_xrefs end xref_tags_and_team_members site, TAG_CATEGORIES, team xref_locations site.data, team, [projects, working_groups, guilds] end
create_name_xrefs(team)
click to toggle source
# File lib/team_api/cross_referencer.rb, line 48 def self.create_name_xrefs(team) name_xrefs = {} team.data.each do |member| name_xrefs[member.last['deprecated_name']] = member.last['name'] if member.last['deprecated_name'] end name_xrefs end
create_tag_xrefs(site, items, category, xref_data)
click to toggle source
Generates a Hash of { tag => cross-reference } generated from the tag `category` Arrays from each element of `items`.
For example:
TEAM = { 'mbland' => { 'name' => 'mbland', 'full_name' => 'Mike Bland', 'skills' => ['C++', 'Python'] }, 'arowla' => { 'name' => 'arowla', 'full_name' => 'Alison Rowland', 'skills' => ['Python'] }, } TEAM_XREF = CrossReferenceData.new site, 'team', ['name', 'full_name'] create_tag_xrefs site, TEAM, 'skills', TEAM_XREF
will produce:
{'C++' => { 'name' => 'C++', 'slug' => 'c++', 'self' => 'https://.../skills/c++', 'members' => [{ 'name' => 'mbland', 'full_name' => 'Mike Bland' }], }, 'Python' => { 'name' => 'Python', 'slug' => 'python', 'self' => 'https://.../skills/python', 'members' => [ { 'name' => 'mbland', 'full_name' => 'Mike Bland' }, { 'name' => 'arowla', 'full_name' => 'Alison Rowland' }, ], }, }
# File lib/team_api/cross_referencer.rb, line 108 def self.create_tag_xrefs(site, items, category, xref_data) items_to_tags = lambda do |item| item_xref = xref_data.item_to_xref item item[category].map { |tag| [tag, item_xref] } unless item[category].nil? end create_tag_xrefs = lambda do |tag, item_xrefs| [tag, tag_xref(site, category, tag, item_xrefs)] end LambdaMapReduce.map_reduce(items, items_to_tags, create_tag_xrefs).to_h end
group_names_to_team_xrefs(team, collection_xrefs)
click to toggle source
# File lib/team_api/cross_referencer.rb, line 129 def self.group_names_to_team_xrefs(team, collection_xrefs) collection_xrefs.map do |xref| xrefs = team.flat_map { |i| i[xref.collection_name] }.compact.uniq [xref.collection_name, xrefs] unless xrefs.empty? end.compact.to_h end
tag_xref(site, category, tag, members)
click to toggle source
# File lib/team_api/cross_referencer.rb, line 119 def self.tag_xref(site, category, tag, members) category_slug = Canonicalizer.canonicalize category tag_slug = Canonicalizer.canonicalize tag { 'name' => tag, 'slug' => tag_slug, 'self' => File.join(Api.baseurl(site), category_slug, tag_slug), 'members' => NameCanonicalizer.sort_by_last_name(members || []), } end
xref_locations(site_data, team_xref, collection_xrefs)
click to toggle source
Produces an array of locations containing cross references to team members and all projects, working groups, guilds, etc. associated with each team member. All team member cross-references must already exist.
# File lib/team_api/cross_referencer.rb, line 139 def self.xref_locations(site_data, team_xref, collection_xrefs) location_xrefs = site_data['team'].values.group_by { |i| i['location'] } .map do |location_code, team| [location_code, { 'team' => team.map { |member| team_xref.item_to_xref member }, }.merge(group_names_to_team_xrefs(team, collection_xrefs)), ] unless location_code.nil? end HashJoiner.deep_merge site_data['locations'], location_xrefs.compact.to_h end
Private Class Methods
create_xref_data(site)
click to toggle source
# File lib/team_api/cross_referencer.rb, line 39 def self.create_xref_data(site) [CrossReferenceData.new(site, 'team', TEAM_FIELDS), CrossReferenceData.new(site, 'projects', PROJECT_FIELDS), CrossReferenceData.new(site, 'working-groups', WORKING_GROUP_FIELDS), CrossReferenceData.new(site, 'guilds', GUILD_FIELDS), ] end