class TeamApi::JoinerImpl

Implements Joiner operations.

Constants

SNIPPET_JOIN_FIELDS

Attributes

data[R]
public_mode[R]
site[R]
team_indexer[R]

Public Class Methods

new(site) click to toggle source
site

Jekyll site data object

# File lib/team_api/joiner.rb, line 105
def initialize(site)
  @site = site
  @data = site.data
  @public_mode = site.config['public']
end

Public Instance Methods

get_canonical_reference(reference, errors) click to toggle source
# File lib/team_api/joiner.rb, line 155
def get_canonical_reference(reference, errors)
  member = team_indexer.team_member_from_reference reference

  if member.nil?
    errors << 'Unknown Team Member: ' +
      team_indexer.team_member_key(reference)
    nil
  elsif should_exclude_member(reference)
    nil
  else
    member['name'].downcase
  end
end
init_team_data(data) click to toggle source
# File lib/team_api/joiner.rb, line 122
def init_team_data(data)
  @team_indexer = TeamIndexer.new data
  team_indexer.create_indexes
end
join_project_data() click to toggle source
# File lib/team_api/joiner.rb, line 132
def join_project_data
  # A little bit of project data munging. Can go away after the .about.yml
  # convention takes hold, hopefully.
  projects = (data['projects'] ||= {})
  projects.delete_if { |_, p| p['status'] == 'Hold' } if @public_mode
  projects.values.each do |p|
    errors = p['errors'] || []
    join_team_list p['team'], errors
    store_project_errors p, errors unless errors.empty?
  end
end
join_snippet(snippet) click to toggle source
# File lib/team_api/joiner.rb, line 197
def join_snippet(snippet)
  username = snippet['username']
  member = team_indexer.team_member_from_reference username

  if member.nil?
    fail UnknownSnippetUsernameError, username unless public_mode
  else
    member = member.select { |k, _| SNIPPET_JOIN_FIELDS.include? k }
    snippet.merge member
  end
end
join_snippet_data() click to toggle source

Joins snippet data into site.data[‘snippets’] and filters out snippets from team members not appearing in site.data[‘team’] or team_by_email.

# File lib/team_api/joiner.rb, line 187
def join_snippet_data
  raw_snippets = data['snippets']
  return if raw_snippets.nil?
  data['snippets'] = raw_snippets.map do |timestamp, snippets|
    joined = snippets.map { |snippet| join_snippet snippet }
      .compact.each { |i| i.delete 'username' }
    [timestamp, joined] unless joined.empty?
  end.compact.to_h
end
join_team_list(team_list, errors) click to toggle source

Replaces each member of team_list with a key into the team hash. Values can be:

  • Strings that are already team hash keys

  • Strings that are email addresses

  • Strings that are GitHub usernames

  • Hashes that contain an 'email' property

  • Hashes that contain a 'github' property

# File lib/team_api/joiner.rb, line 176
def join_team_list(team_list, errors)
  (team_list || []).map! do |reference|
    get_canonical_reference reference, errors
  end.compact! || []
end
promote_or_remove_data() click to toggle source
# File lib/team_api/joiner.rb, line 127
def promote_or_remove_data
  private_data_method = public_mode ? :remove_data : :promote_data
  HashJoiner.send private_data_method, data, 'private'
end
restructure_team_data!() click to toggle source

Jekyll seems to be removing non-alpha characters from the team member names, causing the TeamIndexer to not be able to find any team member matches. This changes all of the team member keys back to what we expect.

# File lib/team_api/joiner.rb, line 114
def restructure_team_data!
  if !site.data['team'].nil? && site.data['team'].respond_to?(:keys)
    site.data['team'].keys.each do |key|
      site.data['team'][site.data['team'][key]['name']] = site.data['team'].delete(key)
    end
  end
end
should_exclude_member(reference) click to toggle source
# File lib/team_api/joiner.rb, line 151
def should_exclude_member(reference)
  @public_mode && team_indexer.team_member_is_private(reference)
end
store_project_errors(project, errors) click to toggle source
# File lib/team_api/joiner.rb, line 144
def store_project_errors(project, errors)
  project['errors'] = errors
  name = project['github'][0] if project['github']
  name ||= project['name']
  data['errors'][name] = errors
end