team_api 0.0.10 → 0.0.12
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/team_api/api.rb +12 -0
- data/lib/team_api/api_impl.rb +10 -0
- data/lib/team_api/canonicalizer.rb +1 -1
- data/lib/team_api/joiner.rb +22 -29
- data/lib/team_api/team_member_schema.json +86 -0
- data/lib/team_api/version.rb +1 -1
- metadata +8 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f31b401ffc417fa83d0ee449df251344d5a335ad
|
4
|
+
data.tar.gz: fa3955bd6883d49800ec50d351e778d41766a65d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0154afdd77ec5af1a0aafef5109aa1fa5b618828842023f678166af63fce7d9e1225cea371a4b4b34853249ff28967ca5c49268fcf5062f919dfff3cf150ec95
|
7
|
+
data.tar.gz: a032bcbcdd2b2682aeb4107779084377ead02f3641751155ae906f04fe13d14add0957134b5f6efa6b391259ee1616e14e154c9241dddc04e54e73e96cc37ef5
|
data/lib/team_api/api.rb
CHANGED
@@ -17,6 +17,7 @@ module TeamApi
|
|
17
17
|
impl = ApiImpl.new site, BASEURL
|
18
18
|
generate_collection_endpoints impl
|
19
19
|
generate_tag_category_endpoints impl
|
20
|
+
impl.generate_schema_endpoint team_api_schema_location
|
20
21
|
impl.generate_snippets_endpoints
|
21
22
|
impl.generate_error_endpoint
|
22
23
|
IndexPage.create site, impl.index_endpoints
|
@@ -58,5 +59,16 @@ module TeamApi
|
|
58
59
|
end
|
59
60
|
|
60
61
|
private_class_method :generate_tag_category_endpoints
|
62
|
+
|
63
|
+
def self.team_api_schema_location
|
64
|
+
about_yml = Gem::Specification.find_by_name 'about_yml'
|
65
|
+
if about_yml.nil?
|
66
|
+
nil
|
67
|
+
else
|
68
|
+
"#{about_yml.gem_dir}/lib/about_yml/schema.json"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
private_class_method :team_api_schema_location
|
61
73
|
end
|
62
74
|
end
|
data/lib/team_api/api_impl.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require_relative 'endpoint'
|
2
2
|
require_relative 'api_impl_snippet_helpers'
|
3
3
|
require_relative 'api_impl_error_helpers'
|
4
|
+
require 'json'
|
4
5
|
|
5
6
|
module TeamApi
|
6
7
|
class ApiImpl
|
@@ -32,6 +33,15 @@ module TeamApi
|
|
32
33
|
}
|
33
34
|
end
|
34
35
|
|
36
|
+
def generate_schema_endpoint(schema_file_location)
|
37
|
+
return if schema_file_location.nil? || schema_file_location.empty?
|
38
|
+
file = File.read schema_file_location
|
39
|
+
items = JSON.parse file
|
40
|
+
generate_index_endpoint('schemas', 'Schemas',
|
41
|
+
'Schema used to parse .about.yml files',
|
42
|
+
items)
|
43
|
+
end
|
44
|
+
|
35
45
|
def generate_tag_category_endpoint(category)
|
36
46
|
canonicalized = Canonicalizer.canonicalize(category)
|
37
47
|
generate_index_endpoint(canonicalized, category,
|
@@ -19,7 +19,7 @@ module TeamApi
|
|
19
19
|
# Returns a canonicalized, URL-friendly substitute for an arbitrary string.
|
20
20
|
# +s+:: string to canonicalize
|
21
21
|
def self.canonicalize(s)
|
22
|
-
s.downcase.gsub(/\s+/, '-')
|
22
|
+
s.downcase.gsub(/\s+/, '-') unless s.nil?
|
23
23
|
end
|
24
24
|
|
25
25
|
def self.team_xrefs(team, usernames)
|
data/lib/team_api/joiner.rb
CHANGED
@@ -16,7 +16,7 @@ module TeamApi
|
|
16
16
|
# +site+:: Jekyll site data object
|
17
17
|
def self.join_data(site)
|
18
18
|
impl = JoinerImpl.new site
|
19
|
-
|
19
|
+
impl.restructure_team_data!
|
20
20
|
impl.init_team_data site.data['team']
|
21
21
|
impl.promote_or_remove_data
|
22
22
|
impl.join_project_data
|
@@ -37,6 +37,7 @@ module TeamApi
|
|
37
37
|
def create_indexes
|
38
38
|
team_by_email
|
39
39
|
team_by_github
|
40
|
+
team_by_deprecated_name
|
40
41
|
end
|
41
42
|
|
42
43
|
# Returns an index of team member usernames keyed by email address.
|
@@ -49,6 +50,11 @@ module TeamApi
|
|
49
50
|
@team_by_github ||= team_index_by_field 'github'
|
50
51
|
end
|
51
52
|
|
53
|
+
# Returns an index of team member usernames keyed by deprecated names.
|
54
|
+
def team_by_deprecated_name
|
55
|
+
@team_by_deprecated_name ||= team_index_by_field 'deprecated_name'
|
56
|
+
end
|
57
|
+
|
52
58
|
# Returns an index of team member usernames keyed by a particular field.
|
53
59
|
def team_index_by_field(field)
|
54
60
|
team_members.map do |member|
|
@@ -67,16 +73,17 @@ module TeamApi
|
|
67
73
|
end
|
68
74
|
|
69
75
|
def team_member_key_by_type(ref)
|
70
|
-
(ref.is_a? String) ? ref : (ref['id'] || ref['email'] || ref['github'])
|
76
|
+
(ref.is_a? String) ? ref : (ref['id'] || ref['email'] || ref['github'] || ref['deprecated_name'])
|
71
77
|
end
|
72
78
|
|
73
79
|
def team_member_key(ref)
|
74
80
|
key = team_member_key_by_type(ref).downcase
|
75
|
-
team_by_email[key] || team_by_github[key] || key
|
81
|
+
team_by_email[key] || team_by_github[key] || team_by_deprecated_name[key] || key
|
76
82
|
end
|
77
83
|
|
78
84
|
def team_member_from_reference(reference)
|
79
85
|
key = team_member_key reference
|
86
|
+
|
80
87
|
if team['private']
|
81
88
|
team[key] || team['private'][key]
|
82
89
|
else
|
@@ -101,37 +108,22 @@ module TeamApi
|
|
101
108
|
@public_mode = site.config['public']
|
102
109
|
end
|
103
110
|
|
111
|
+
# Jekyll seems to be removing non-alpha characters from the team member
|
112
|
+
# names, causing the TeamIndexer to not be able to find any team member
|
113
|
+
# matches. This changes all of the team member keys back to what we expect.
|
114
|
+
def restructure_team_data!
|
115
|
+
if !site.data['team'].nil? && site.data['team'].respond_to?(:keys)
|
116
|
+
site.data['team'].keys.each do |key|
|
117
|
+
site.data['team'][site.data['team'][key]['name']] = site.data['team'].delete(key)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
104
122
|
def init_team_data(data)
|
105
123
|
@team_indexer = TeamIndexer.new data
|
106
124
|
team_indexer.create_indexes
|
107
125
|
end
|
108
126
|
|
109
|
-
def collection_data
|
110
|
-
@collection_data ||= site.collections.map do |data_class, collection|
|
111
|
-
groups = groups collection
|
112
|
-
result = (groups[:public] || {})
|
113
|
-
result.merge!('private' => groups[:private]) if groups[:private]
|
114
|
-
[data_class, result] unless result.empty?
|
115
|
-
end.compact.to_h
|
116
|
-
end
|
117
|
-
|
118
|
-
def groups(collection)
|
119
|
-
collection.docs
|
120
|
-
.select { |doc| doc.data['published'] != false }
|
121
|
-
.group_by { |doc| doc_visibility doc }
|
122
|
-
.map { |group, docs| [group, docs_data(docs)] }
|
123
|
-
.to_h
|
124
|
-
end
|
125
|
-
|
126
|
-
def doc_visibility(doc)
|
127
|
-
parent = File.basename File.dirname(doc.cleaned_relative_path)
|
128
|
-
(parent == 'private') ? :private : :public
|
129
|
-
end
|
130
|
-
|
131
|
-
def docs_data(docs)
|
132
|
-
docs.map { |doc| [doc.basename_without_ext, doc.data] }.to_h
|
133
|
-
end
|
134
|
-
|
135
127
|
def promote_or_remove_data
|
136
128
|
private_data_method = public_mode ? :remove_data : :promote_data
|
137
129
|
HashJoiner.send private_data_method, data, 'private'
|
@@ -162,6 +154,7 @@ module TeamApi
|
|
162
154
|
|
163
155
|
def get_canonical_reference(reference, errors)
|
164
156
|
member = team_indexer.team_member_from_reference reference
|
157
|
+
|
165
158
|
if member.nil?
|
166
159
|
errors << 'Unknown Team Member: ' +
|
167
160
|
team_indexer.team_member_key(reference)
|
@@ -0,0 +1,86 @@
|
|
1
|
+
{
|
2
|
+
"team": {
|
3
|
+
"title": "team - [team.member].yml files",
|
4
|
+
"description": "Team member metadata",
|
5
|
+
"$schema": "http://json-schema.org/draft-04/hyper-schema",
|
6
|
+
"type": "object",
|
7
|
+
"properties": {
|
8
|
+
"name": {
|
9
|
+
"type": "string",
|
10
|
+
"description": "Unique name for the team member. Must match the file basename."
|
11
|
+
},
|
12
|
+
"deprecated_name": {
|
13
|
+
"type": "string",
|
14
|
+
"description": "Previous value for the `name` field (and the previous file name)"
|
15
|
+
},
|
16
|
+
"full_name": {
|
17
|
+
"type": "string",
|
18
|
+
"description": "Full proper name of the team member"
|
19
|
+
},
|
20
|
+
"first_name": {
|
21
|
+
"type": "string",
|
22
|
+
"description": "Team member's first name"
|
23
|
+
},
|
24
|
+
"last_name": {
|
25
|
+
"type": "string",
|
26
|
+
"description": "Team member's last name"
|
27
|
+
},
|
28
|
+
"github": {
|
29
|
+
"type": "string",
|
30
|
+
"description": "Team member's GitHub username"
|
31
|
+
},
|
32
|
+
"email": {
|
33
|
+
"type": "string",
|
34
|
+
"description": "Team member's email address"
|
35
|
+
},
|
36
|
+
"location": {
|
37
|
+
"type": "string",
|
38
|
+
"description": "Team member's location. Should match a value from the /locations endpoint."
|
39
|
+
},
|
40
|
+
"slack": {
|
41
|
+
"type": "string",
|
42
|
+
"description": "Team member's Slack username"
|
43
|
+
},
|
44
|
+
"resume": {
|
45
|
+
"type": "string",
|
46
|
+
"description": "URL for the team member's resume"
|
47
|
+
},
|
48
|
+
"okrs": {
|
49
|
+
"type": "string",
|
50
|
+
"description": "URL for the team member's OKRs"
|
51
|
+
},
|
52
|
+
"start_date": {
|
53
|
+
"type": "date",
|
54
|
+
"description": "Date on which team member started. Should be in ISO 8601 format (YYYY-MM-DD)"
|
55
|
+
},
|
56
|
+
"end_date": {
|
57
|
+
"type": "date",
|
58
|
+
"description": "Date on which team member left or is expected to leave. Should be in ISO 8601 format (YYYY-MM-DD)"
|
59
|
+
},
|
60
|
+
"skills": {
|
61
|
+
"type": "array",
|
62
|
+
"description": "Skills the team member can contribute to projects",
|
63
|
+
"items": {
|
64
|
+
"type": "string"
|
65
|
+
},
|
66
|
+
"uniqueItems": true
|
67
|
+
},
|
68
|
+
"interests": {
|
69
|
+
"type": "array",
|
70
|
+
"description": "Brief descriptions of team member's interests",
|
71
|
+
"items": {
|
72
|
+
"type": "string"
|
73
|
+
},
|
74
|
+
"uniqueItems": true
|
75
|
+
},
|
76
|
+
},
|
77
|
+
"required": [
|
78
|
+
"name",
|
79
|
+
"full_name",
|
80
|
+
"first_name",
|
81
|
+
"last_name",
|
82
|
+
"email",
|
83
|
+
"location"
|
84
|
+
]
|
85
|
+
}
|
86
|
+
}
|
data/lib/team_api/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: team_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Bland
|
8
|
+
- Amanda Robinson
|
9
|
+
- Carlo Costino
|
8
10
|
autorequire:
|
9
11
|
bindir: bin
|
10
12
|
cert_chain: []
|
11
|
-
date: 2016-
|
13
|
+
date: 2016-02-11 00:00:00.000000000 Z
|
12
14
|
dependencies:
|
13
15
|
- !ruby/object:Gem::Dependency
|
14
16
|
name: bundler
|
@@ -196,6 +198,8 @@ description: Compiles information about team members, projects, etc. and exposes
|
|
196
198
|
via a JSON API.
|
197
199
|
email:
|
198
200
|
- michael.bland@gsa.gov
|
201
|
+
- amanda.robinson@gsa.gov
|
202
|
+
- carlo.costino@gsa.gov
|
199
203
|
executables: []
|
200
204
|
extensions: []
|
201
205
|
extra_rdoc_files: []
|
@@ -224,6 +228,7 @@ files:
|
|
224
228
|
- lib/team_api/snippets.rb
|
225
229
|
- lib/team_api/tag_canonicalizer.rb
|
226
230
|
- lib/team_api/tag_categories.yml
|
231
|
+
- lib/team_api/team_member_schema.json
|
227
232
|
- lib/team_api/version.rb
|
228
233
|
homepage: https://github.com/18F/team_api
|
229
234
|
licenses:
|
@@ -245,7 +250,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
245
250
|
version: '0'
|
246
251
|
requirements: []
|
247
252
|
rubyforge_project:
|
248
|
-
rubygems_version: 2.
|
253
|
+
rubygems_version: 2.5.1
|
249
254
|
signing_key:
|
250
255
|
specification_version: 4
|
251
256
|
summary: Compiles team information and publishes it as a JSON API
|