Class: TeamApi::CrossReferencer
- Inherits:
-
Object
- Object
- TeamApi::CrossReferencer
- Defined in:
- lib/team_api/cross_referencer.rb
Overview
Builds cross-references between data sets.
Constant Summary collapse
- TEAM_FIELDS =
%w(name last_name first_name full_name self)
- PROJECT_FIELDS =
%w(name full_name self)
- WORKING_GROUP_FIELDS =
%w(name full_name self)
- GUILD_FIELDS =
%w(name full_name self)
- TAG_CATEGORIES =
%w(skills interests)
- TAG_XREF_FIELDS =
%w(name slug self)
Class Method Summary collapse
-
.build_xrefs(site) ⇒ Object
Build cross-references between data sets.
- .create_name_xrefs(team) ⇒ Object
-
.create_tag_xrefs(site, items, category, xref_data) ⇒ Object
Generates a Hash of { tag => cross-reference } generated from the tag ‘category` Arrays from each element of `items`.
- .group_names_to_team_xrefs(team, collection_xrefs) ⇒ Object
- .replace_item_tags_with_xrefs(tag_category, tag_xrefs, items) ⇒ Object
- .tag_xref(site, category, tag, members) ⇒ Object
-
.xref_locations(site_data, team_xref, collection_xrefs) ⇒ Object
Produces an array of locations containing cross references to team members and all projects, working groups, guilds, etc.
- .xref_tags_and_team_members(site, tag_categories, team_xref) ⇒ Object
Class Method Details
.build_xrefs(site) ⇒ Object
Build cross-references between data sets.
site_data
-
Jekyll
site.data
object
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# 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 site, TAG_CATEGORIES, team xref_locations site.data, team, [projects, working_groups, guilds] end |
.create_name_xrefs(team) ⇒ Object
48 49 50 51 52 53 54 55 |
# 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) ⇒ Object
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' },
],
},
}
108 109 110 111 112 113 114 115 116 117 |
# File 'lib/team_api/cross_referencer.rb', line 108 def self.create_tag_xrefs(site, items, category, xref_data) = 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, , create_tag_xrefs).to_h end |
.group_names_to_team_xrefs(team, collection_xrefs) ⇒ Object
129 130 131 132 133 134 |
# 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 |
.replace_item_tags_with_xrefs(tag_category, tag_xrefs, items) ⇒ Object
67 68 69 70 71 72 73 |
# File 'lib/team_api/cross_referencer.rb', line 67 def self.(tag_category, tag_xrefs, items) items.each do |item| (item[tag_category] || []).map! do |tag| tag_xrefs[tag].select { |field| TAG_XREF_FIELDS.include? field } end end end |
.tag_xref(site, category, tag, members) ⇒ Object
119 120 121 122 123 124 125 126 127 |
# 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) ⇒ Object
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.
139 140 141 142 143 144 145 146 147 148 149 |
# 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 |
.xref_tags_and_team_members(site, tag_categories, team_xref) ⇒ Object
57 58 59 60 61 62 63 64 65 |
# File 'lib/team_api/cross_referencer.rb', line 57 def self.(site, tag_categories, team_xref) team = (site.data['team'] || {}) tag_categories.each do |category| xrefs = create_tag_xrefs(site, team.values, category, team_xref) next if xrefs.empty? site.data[category] = xrefs category, xrefs, team.values end end |