@@ -32,7 +32,7 @@ class TeamNotFound < RuntimeError; end
3232 ou : String ,
3333 ignore_not_found : C ::Maybe [ C ::Bool ] ,
3434 ] => C ::Any
35- def initialize ( addr : nil , org :, token :, ou :, ignore_not_found : false )
35+ def initialize ( org :, token :, ou :, addr : nil , ignore_not_found : false )
3636 super
3737 Entitlements . cache [ :github_team_members ] ||= { }
3838 Entitlements . cache [ :github_team_members ] [ org_signature ] ||= { }
@@ -107,8 +107,8 @@ def read_team(entitlement_group)
107107 end
108108
109109 maintainers = teamdata [ :members ] . select { |u | teamdata [ :roles ] [ u ] == "maintainer" }
110- team_metadata = team_metadata || { }
111- team_metadata = team_metadata . merge ( { "team_maintainers" => maintainers . any? ? maintainers . join ( "," ) : nil } )
110+ team_metadata ||= { }
111+ team_metadata = team_metadata . merge ( { "team_maintainers" => maintainers . any? ? maintainers . join ( "," ) : nil } )
112112
113113 team = Entitlements ::Backend ::GitHubTeam ::Models ::Team . new (
114114 team_id : teamdata [ :team_id ] ,
@@ -139,7 +139,7 @@ def read_team(entitlement_group)
139139 def from_predictive_cache? ( entitlement_group )
140140 team_identifier = entitlement_group . cn . downcase
141141 read_team ( entitlement_group ) unless @team_cache [ team_identifier ]
142- ( @team_cache [ team_identifier ] && @team_cache [ team_identifier ] [ :cache ] ) ? true : false
142+ @team_cache [ team_identifier ] && @team_cache [ team_identifier ] [ :cache ] ? true : false
143143 end
144144
145145 # Declare the entry to be invalid for a specific team, and if the prior knowledge
@@ -192,7 +192,7 @@ def sync_team(desired_state, current_state)
192192 if desired_metadata [ "parent_team_name" ] . nil?
193193 Entitlements . logger . debug "sync_team(team=#{ current_state . team_name } ): IGNORING GitHub Parent Team DELETE"
194194 else
195- # :nocov:
195+ # :nocov:
196196 Entitlements . logger . debug "sync_team(#{ current_state . team_name } =#{ current_state . team_id } ): Parent team change found - From #{ current_metadata [ "parent_team_name" ] || "No Parent Team" } to #{ desired_metadata [ "parent_team_name" ] } "
197197 desired_parent_team_id = team_by_name ( org_name : org , team_name : desired_metadata [ "parent_team_name" ] ) [ :id ]
198198 unless desired_parent_team_id . nil?
@@ -240,17 +240,20 @@ def sync_team(desired_state, current_state)
240240 Entitlements . logger . debug "sync_team(#{ current_state . team_name } =#{ current_state . team_id } ): Textual change but no semantic change in maintainers. It is remains: #{ current_maintainers . to_a } ."
241241 else
242242 Entitlements . logger . debug "sync_team(#{ current_state . team_name } =#{ current_state . team_id } ): Maintainer members change found - From #{ current_maintainers . to_a } to #{ desired_maintainers . to_a } "
243- added_maintainers . select! { |username | add_user_to_team ( user : username , team : current_state , role : "maintainer" ) }
243+ added_maintainers . select! do |username |
244+ add_user_to_team ( user : username , team : current_state , role : "maintainer" )
245+ end
244246
245247 ## We only touch previous maintainers who are actually still going to be members of the team
246248 removed_maintainers = removed_maintainers . intersection ( desired_team_members )
247249 ## Downgrade membership to default (role: "member")
248- removed_maintainers . select! { |username | add_user_to_team ( user : username , team : current_state , role : "member" ) }
250+ removed_maintainers . select! do |username |
251+ add_user_to_team ( user : username , team : current_state , role : "member" )
252+ end
249253 end
250254 end
251255 end
252256
253-
254257 Entitlements . logger . debug "sync_team(#{ current_state . team_name } =#{ current_state . team_id } ): Added #{ added_members . count } , removed #{ removed_members . count } "
255258 added_members . any? || removed_members . any? || added_maintainers . any? || removed_maintainers . any? || changed_parent_team
256259 end
@@ -264,28 +267,41 @@ def sync_team(desired_state, current_state)
264267 entitlement_group : Entitlements ::Models ::Group ,
265268 ] => C ::Bool
266269 def create_team ( entitlement_group :)
270+ team_name = entitlement_group . cn . downcase
271+ team_options = { name : team_name , repo_names : [ ] , privacy : "closed" }
272+
267273 begin
268- team_name = entitlement_group . cn . downcase
269- team_options = { name : team_name , repo_names : [ ] , privacy : "closed" }
274+ entitlement_metadata = entitlement_group . metadata
275+ unless entitlement_metadata [ "parent_team_name" ] . nil?
270276
271- begin
272- entitlement_metadata = entitlement_group . metadata
273- unless entitlement_metadata [ "parent_team_name" ] . nil?
277+ begin
274278 parent_team_data = graphql_team_data ( entitlement_metadata [ "parent_team_name" ] )
275279 team_options [ :parent_team_id ] = parent_team_data [ :team_id ]
276- Entitlements . logger . debug "create_team(team=#{ team_name } ) Parent team #{ entitlement_metadata [ "parent_team_name" ] } with id #{ parent_team_data [ :team_id ] } found"
280+ rescue TeamNotFound
281+ # if the parent team does not exist, create it (think `mkdir -p` logic here)
282+ result = octokit . create_team (
283+ org ,
284+ { name : entitlement_metadata [ "parent_team_name" ] , repo_names : [ ] , privacy : "closed" }
285+ )
286+
287+ Entitlements . logger . debug "created parent team #{ entitlement_metadata [ "parent_team_name" ] } with id #{ result [ :id ] } "
288+
289+ team_options [ :parent_team_id ] = result [ :id ]
277290 end
278- rescue Entitlements ::Models ::Group ::NoMetadata
279- Entitlements . logger . debug "create_team(team=#{ team_name } ) No metadata found"
280- end
281291
282- Entitlements . logger . debug "create_team(team=#{ team_name } )"
283- octokit . create_team ( org , team_options )
284- true
285- rescue Octokit ::UnprocessableEntity => e
286- Entitlements . logger . debug "create_team(team=#{ team_name } ) ERROR - #{ e . message } "
287- false
292+ Entitlements . logger . debug "create_team(team=#{ team_name } ) Parent team #{ entitlement_metadata [ "parent_team_name" ] } with id #{ team_options [ :parent_team_id ] } found"
293+ end
294+ rescue Entitlements ::Models ::Group ::NoMetadata
295+ Entitlements . logger . debug "create_team(team=#{ team_name } ) No metadata found"
288296 end
297+
298+ Entitlements . logger . debug "create_team(team=#{ team_name } )"
299+ result = octokit . create_team ( org , team_options )
300+ Entitlements . logger . debug "created team #{ team_name } with id #{ result [ :id ] } "
301+ true
302+ rescue Octokit ::UnprocessableEntity => e
303+ Entitlements . logger . debug "create_team(team=#{ team_name } ) ERROR - #{ e . message } "
304+ false
289305 end
290306
291307 # Update a team
@@ -298,15 +314,14 @@ def create_team(entitlement_group:)
298314 metadata : C ::Or [ Hash , nil ]
299315 ] => C ::Bool
300316 def update_team ( team :, metadata : { } )
301- begin
302- Entitlements . logger . debug "update_team(team=#{ team . team_name } )"
303- options = { name : team . team_name , repo_names : [ ] , privacy : "closed" , parent_team_id : metadata [ :parent_team_id ] }
304- octokit . update_team ( team . team_id , options )
305- true
306- rescue Octokit ::UnprocessableEntity => e
307- Entitlements . logger . debug "update_team(team=#{ team . team_name } ) ERROR - #{ e . message } "
308- false
309- end
317+ Entitlements . logger . debug "update_team(team=#{ team . team_name } )"
318+ options = { name : team . team_name , repo_names : [ ] , privacy : "closed" ,
319+ parent_team_id : metadata [ :parent_team_id ] }
320+ octokit . update_team ( team . team_id , options )
321+ true
322+ rescue Octokit ::UnprocessableEntity => e
323+ Entitlements . logger . debug "update_team(team=#{ team . team_name } ) ERROR - #{ e . message } "
324+ false
310325 end
311326
312327 # Gets a team by name
@@ -332,7 +347,8 @@ def team_by_name(org_name:, team_name:)
332347 # team_slug - Identifier of the team to retrieve.
333348 #
334349 # Returns a data structure with team data.
335- Contract String => { members : C ::ArrayOf [ String ] , team_id : Integer , parent_team_name : C ::Or [ String , nil ] , roles : C ::HashOf [ String => String ] }
350+ Contract String => { members : C ::ArrayOf [ String ] , team_id : Integer , parent_team_name : C ::Or [ String , nil ] ,
351+ roles : C ::HashOf [ String => String ] }
336352 def graphql_team_data ( team_slug )
337353 cursor = nil
338354 team_id = nil
@@ -370,9 +386,7 @@ def graphql_team_data(team_slug)
370386 end
371387
372388 team = response [ :data ] . fetch ( "data" ) . fetch ( "organization" ) . fetch ( "team" )
373- if team . nil?
374- raise TeamNotFound , "Requested team #{ team_slug } does not exist in #{ org } !"
375- end
389+ raise TeamNotFound , "Requested team #{ team_slug } does not exist in #{ org } !" if team . nil?
376390
377391 team_id = team . fetch ( "databaseId" )
378392 parent_team_name = team . dig ( "parentTeam" , "slug" )
@@ -390,6 +404,7 @@ def graphql_team_data(team_slug)
390404
391405 cursor = edges . last . fetch ( "cursor" )
392406 next if cursor && buffer . size == max_graphql_results
407+
393408 break
394409 end
395410
@@ -415,6 +430,7 @@ def validate_team_id_and_slug!(team_id, team_slug)
415430 team_data [ :slug ]
416431 end
417432 return if @validation_cache [ team_id ] == team_slug
433+
418434 raise "validate_team_id_and_slug! mismatch: team_id=#{ team_id } expected=#{ team_slug . inspect } got=#{ @validation_cache [ team_id ] . inspect } "
419435 end
420436
@@ -432,10 +448,11 @@ def validate_team_id_and_slug!(team_id, team_slug)
432448 ] => C ::Bool
433449 def add_user_to_team ( user :, team :, role : "member" )
434450 return false unless org_members . include? ( user . downcase )
435- unless role == "member" || role == "maintainer"
451+ unless [ "member" , "maintainer" ] . include? ( role )
436452 # :nocov:
437453 raise "add_user_to_team role mismatch: team_id=#{ team . team_id } user=#{ user } expected role=maintainer/member got=#{ role } "
438454 end
455+
439456 Entitlements . logger . debug "#{ identifier } add_user_to_team(user=#{ user } , org=#{ org } , team_id=#{ team . team_id } , role=#{ role } )"
440457 validate_team_id_and_slug! ( team . team_id , team . team_name )
441458
@@ -462,6 +479,7 @@ def add_user_to_team(user:, team:, role: "member")
462479 ] => C ::Bool
463480 def remove_user_from_team ( user :, team :)
464481 return false unless org_members . include? ( user . downcase )
482+
465483 Entitlements . logger . debug "#{ identifier } remove_user_from_team(user=#{ user } , org=#{ org } , team_id=#{ team . team_id } )"
466484 validate_team_id_and_slug! ( team . team_id , team . team_name )
467485 octokit . remove_team_membership ( team . team_id , user )
0 commit comments