function ConvertTo-ScrumTeam { <# .SYNOPSIS Converts a list of teams to a list of ScrumTeam objects (better for formatting, querying). The data is driven dynamically off either the Confluence page via Get-ScrumTeamsFromConfluence or from a cached file once retrieved. .PARAMETER Team Dynamic team data. Should be a table, a-la the Confluence page. #> param ( [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)] [System.Collections.Hashtable[]]$Team ) begin { $logLead = (Get-LogLeadName) $checkedHeadersAlready = $false $expectedHeaders = @('Team','Product Owner','Strategic Product Manager','Scrum Master','Tech Lead','Eng Manager','JIRA Board','Team Slack Channel') | Sort-Object -Unique $defaultTypeName = 'ScrumTeam' $defaultKeys = @('Team') $defaultDisplaySet = @() foreach ($header in $expectedHeaders) { # Remove spaces so that the property names don't have spaces. # This makes typing property names much easier. $defaultDisplaySet += $header.Replace(' ','') } $defaultDisplayPropertySet = New-Object System.Management.Automation.PSPropertySet('DefaultDisplayPropertySet',[string[]]$defaultDisplaySet) $defaultKeyPropertySet = New-Object System.Management.Automation.PSPropertySet('DefaultKeyPropertySet',[string[]]$defaultKeys) $PSStandardMembers = [System.Management.Automation.PSMemberInfo[]]@($defaultDisplayPropertySet,$defaultKeyPropertySet) } process { if (!$checkedHeadersAlready) { $headers = @($Team.Keys | Sort-Object -Unique) $spacedHeadersEqual = ((Compare-Object -ReferenceObject $expectedHeaders -DifferenceObject $headers).Count -eq 0) $unspacedHeadersEqual = ((Compare-Object -ReferenceObject $defaultDisplaySet -DifferenceObject $headers).Count -eq 0) if (!$spacedHeadersEqual -and !$unspacedHeadersEqual) { Write-Warning "$logLead : The headers provided in the input object don't match the expected (hard-coded) headers from Confluence.$([System.Environment]::NewLine)This will make output printing seem to be missing data.$([System.Environment]::NewLine)Please update the format.ps1xml and $((Format-UnderlineText "{function:ConvertTo-ScrumTeam}")) with the new Confluence table headers." Write-Host "$logLead : [Actual Headers] : $($headers -join ',')" Write-Host "$logLead : [Expected Headers] : $($expectedHeaders -join ',')" $checkedHeadersAlready = $true } else { $checkedHeadersAlready = $true } } $return = @() foreach ($teamObject in $Team) { try { $properties = @{} foreach ($key in $teamObject.Keys) { $properties[$key.Replace(' ','')] = $teamObject.$key } $scrumTeam = New-Object PSCustomObject -Property $properties $scrumTeam.PSObject.TypeNames.Insert(0,$defaultTypeName) $scrumTeam | Add-Member -MemberType MemberSet -Name PSStandardMembers -Value $PSStandardMembers $return += $scrumTeam } catch { Write-Warning "$logLead : Could not convert item to ScrumTeam object. Check error below." Write-ErrorObject -ErrorItem $PSItem } } return $return } }