Skip to content

Commit

Permalink
Expand scope of issue #10 to support functions in other local namespa…
Browse files Browse the repository at this point in the history
…ces, not just other modules.
  • Loading branch information
msorens committed Jul 25, 2017
1 parent f031bc5 commit c943a89
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 31 deletions.
61 changes: 39 additions & 22 deletions Source/Convert-HelpToHtmlTree.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -313,43 +313,58 @@ function Convert-HelpToHtmlTree

$Namespaces = GlobExpandNamespaceArgument $Namespaces

# load the modules first in case there are any cross-referenced links
$modules = @{}
if (!$Namespaces) {
[void](Handle-MissingValue "No namespaces found");
}
else {
$Namespaces |
% {
$modules[$_] = Import-AllModules $_
}

$Namespaces |
% {
$namespace = $_
$namespaceDir = Join-Path $moduleRoot $namespace
Write-Host "Namespace: $namespace"
$script:namespaceCount++;
$script:moduleSummary = @{}
if ($DocTitle) { $title = "{0} {1}" -f $namespace, $DocTitle }
else { $title = "$namespace Namespace"}
$saveModuleCount = $moduleCount
# load the modules first in case there are any cross-referenced links
$modules = Import-AllModules $namespace
$modules | % { Process-Module $namespace $_ $title}
Remove-AllModules $modules

# ??Possible Pester bug requires this conditional wrapper that is not
# otherwise needed (when the module list is empty).
if ($modules[$namespace]) {
$modules[$namespace] | % { Process-Module $namespace $_ $title}
}

if ($saveModuleCount -eq $moduleCount) {
[void](Handle-MissingValue "No modules found");
$noModulesFlagged = $true
}
$namespaceSummary[$namespace] = $moduleSummary
Add-ItemToContentsList $namespace "namespace" -itemUrl "index.html"
}
if ($namespaceSummary.Count -eq 0) {
[void](Handle-MissingValue "No namespaces found");

$modules.Keys |
% {
Remove-AllModules $modules[$_]
}
else {
# Do this last; uses data collected from above.
$title = ""
if ($DocTitle) { $title = $DocTitle }
else { $title = "PowerShell API" }
if ($Namespaces.Count -eq 1) { $title = "{0} {1}" -f $Namespaces[0],$title }
Generate-HomePage $moduleRoot $title
Generate-ContentsPage $title
if ($noModulesFlagged) {
write-warning "Note that 'No modules found' typically indicates your"
write-warning "module directories are not within a namespace directory." }
"Done: {0} namespace(s), {1} module(s), {2} function(s), {3} file(s) processed." `
-f $namespaceCount,$moduleCount, $functionCount, $fileCount

# Do this last; uses data collected from above.
$title = ""
if ($DocTitle) { $title = $DocTitle }
else { $title = "PowerShell API" }
if ($Namespaces.Count -eq 1) { $title = "{0} {1}" -f $Namespaces[0],$title }
Generate-HomePage $moduleRoot $title
Generate-ContentsPage $title
if ($noModulesFlagged) {
write-warning "Note that 'No modules found' typically indicates your"
write-warning "module directories are not within a namespace directory." }
"Done: {0} namespace(s), {1} module(s), {2} function(s), {3} file(s) processed." `
-f $namespaceCount,$moduleCount, $functionCount, $fileCount
}

if ($EnableExit) { Exit-WithCode -FailedCount $failedCount }
Expand All @@ -368,6 +383,7 @@ function GlobExpandNamespaceArgument($nsArgument)

function Import-AllModules($namespace)
{
$namespaceDir = Join-Path $moduleRoot $namespace
$modules = Get-ChildItem $namespaceDir |
where { $_.PsIsContainer } |
select -ExpandProperty Name
Expand Down Expand Up @@ -444,7 +460,7 @@ function Process-Module($namespace, $moduleName, $parentTitle)

$help = @{}
Generate-FunctionPages $moduleName $moduleDocPath $parentTitle $help
Generate-ModulePage $moduleName $moduleDocPath $parentTitle $help
Generate-ModulePage $namespace $moduleName $moduleDocPath $parentTitle $help
}

function Generate-FunctionPages($moduleName, $moduleDocPath, $parentTitle, $helpHash)
Expand Down Expand Up @@ -490,7 +506,7 @@ function Generate-FunctionPages($moduleName, $moduleDocPath, $parentTitle, $help
}
}

function Generate-ModulePage($moduleName, $moduleDocPath, $parentTitle, $helpHash)
function Generate-ModulePage($namespace, $moduleName, $moduleDocPath, $parentTitle, $helpHash)
{
$indexTableRows =
Get-Command -Module $moduleName |
Expand All @@ -509,6 +525,7 @@ function Generate-ModulePage($moduleName, $moduleDocPath, $parentTitle, $helpHas
}

$targetFile = join-path $moduleDocPath "index.html"
$namespaceDir = Join-Path $moduleRoot $namespace
$breadcrumbs = Get-HtmlBreadCrumbs `
(Get-HtmlLink (Join-HtmlPath "..", "..", "index.html") $namespace),
$moduleName
Expand Down
32 changes: 23 additions & 9 deletions Tests/DocTreeGenerator.Tests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -924,15 +924,15 @@ $content
Mock Write-Host
Mock Write-Warning
Mock Get-CmdletDocLinks
Mock Handle-MissingValue { 'missing value' }
Mock Get-ChildItem { @{ 'name' = $Filter } }
Mock Remove-AllModules { $script:sequence += 'remove' }
Mock Process-Module { $script:sequence += 'process' }
Mock Handle-MissingValue
Mock Generate-HomePage
Mock Generate-ContentsPage

It 'Imports each module in a namespace before building' {
Mock Import-AllModules { $script:sequence += 'import'; return 'm1' }
Mock Remove-AllModules { $script:sequence += 'remove' }
Mock Process-Module { $script:sequence += 'process' }
Mock GlobExpandNamespaceArgument { $nsArgument }
$script:sequence = @()
Convert-HelpToHtmlTree -Namespaces 'ns1'
Assert-MockCalled Import-AllModules 1 -Scope It
Expand All @@ -942,6 +942,9 @@ $content

It 'Removes each module in a namespace after building' {
Mock Import-AllModules { $script:sequence += 'import'; return 'm1' }
Mock Remove-AllModules { $script:sequence += 'remove' }
Mock Process-Module { $script:sequence += 'process' }
Mock GlobExpandNamespaceArgument { $nsArgument }
$script:sequence = @()
Convert-HelpToHtmlTree -Namespaces 'ns1'
Assert-MockCalled Remove-AllModules 1 -Scope It
Expand All @@ -952,6 +955,9 @@ $content
It 'Processes each module in a single namespace' {
$moduleNames = 'm1','m2'
Mock Import-AllModules { return $moduleNames }
Mock Remove-AllModules { $script:sequence += 'remove' }
Mock Process-Module { $script:sequence += 'process' }
Mock GlobExpandNamespaceArgument { $nsArgument }
$script:sequence = @()
Convert-HelpToHtmlTree -Namespaces 'ns1'
foreach ($name in $moduleNames) {
Expand All @@ -970,6 +976,9 @@ $content
# Mock Import-AllModules -MockWith { return $namespaces[$namespace] }
Mock Import-AllModules -MockWith { $ns1Modules } -ParameterFilter { $namespace -eq 'nspace1' }
Mock Import-AllModules -MockWith { $ns2Modules } -ParameterFilter { $namespace -eq 'nspace2' }
Mock Remove-AllModules { $script:sequence += 'remove' }
Mock Process-Module { $script:sequence += 'process' }
Mock GlobExpandNamespaceArgument { $nsArgument }
$script:sequence = @()
Convert-HelpToHtmlTree -Namespaces 'nspace1','nspace2'
foreach ($ns in $namespaces.keys) {
Expand All @@ -981,14 +990,17 @@ $content

It 'WARNS about no namespaces when supplied argument does not resolve to path' {
Mock Import-AllModules
Mock Get-ChildItem { @() }
Mock Remove-AllModules
Mock Process-Module
Mock GlobExpandNamespaceArgument { return @() }
Convert-HelpToHtmlTree -Namespaces 'unknownNamespace'
Assert-MockCalled Handle-MissingValue 1 { $message -eq 'No namespaces found' } -scope It
}

It 'Does NOT warn about no namespaces when supplied argument resolves to path' {
Mock Import-AllModules { return 'm1' }
Mock Get-ChildItem { @{ 'name' = $Filter } }
Mock Remove-AllModules
Mock GlobExpandNamespaceArgument { $nsArgument }
# emulate real Process-Module with respect to generating warning
Mock Process-Module { $script:moduleCount++ }
Convert-HelpToHtmlTree -Namespaces 'ns1'
Expand All @@ -997,19 +1009,21 @@ $content

It 'WARNS about no modules when namespace dir has none' {
Mock Import-AllModules { @() }
Mock Get-ChildItem { @{ 'name' = $Filter } }
Mock Remove-AllModules
Mock GlobExpandNamespaceArgument { $nsArgument }
Mock Process-Module { $script:moduleCount++ }
Convert-HelpToHtmlTree -Namespaces 'ns1'
Assert-MockCalled Handle-MissingValue 1 { $message -eq 'No modules found' } -scope It
}
It 'Does NOT warn about no modules when modules present' {
Mock Import-AllModules { 'm1' }
Mock Get-ChildItem { @{ 'name' = $Filter } }
Mock Remove-AllModules
Mock GlobExpandNamespaceArgument { $nsArgument }
Mock Process-Module { $script:moduleCount++ }
Convert-HelpToHtmlTree -Namespaces 'ns1'
Assert-MockCalled Handle-MissingValue 0 -scope It
}
}

}

}

0 comments on commit c943a89

Please sign in to comment.