Functions/New-Requirement.ps1

# ===========================================================================
# New-Requirement.ps1 -----------------------------------------------------
# ===========================================================================

# function ----------------------------------------------------------------
# ---------------------------------------------------------------------------
function New-Requirement {

    <#
    .SYNOPSIS
        Create the requirement file of a specific virtual environment.
         
    .DESCRIPTION
        Create the requirement file of a specific virtual environment in predefined requirements folder.. All available virtual environments can be accessed by autocompletion. Flag 'All' enables the creation of requirments file for all existing virtual environments. Flag 'Upgrade' replaces in resulting requirement file '==' with '>=' for the use of upgrading packages.
     
    .PARAMETER Name
 
    .PARAMETER All
 
    .PARAMETER Upgrade
 
    .EXAMPLE
        PS C:\>New-Requirement -Name venv
        PS C:\>Get-Requirement -Requirement \venv-requirements.txt
        Click==7.0
        PS C:\>
 
        -----------
        Description
        Get the content of an existing requirement file in predefined requirements folder. All available virtual environments can be accessed by autocompletion.
 
    .EXAMPLE
        PS C:\>New-Requirement -Name venv
        PS C:\>Get-Requirement -Requirement \venv-requirements.txt
        Click==7.0
        PS C:\>
 
        -----------
        Description
        Get the content of an existing requirement file in predefined requirements folder. All available virtual environments can be accessed by autocompletion.
 
    .EXAMPLE
 
        PS C:\>New-Requirement -Python
        PS C:\>Get-Requirement -Requirement \python-requirements.txt
        virtualenv==16.7.4
        PS C:\>
  
        -----------
        Description
        Get the requirement file of the default python distribution.
 
    .EXAMPLE
        PS C:\>New-Requirement -Name venv -Upgrade
        PS C:\>Get-Requirement -Requirement \venv-requirements.txt
        Click>=7.0
        PS C:\>
 
        -----------
        Description
        Get the requirement file of an existing requirement file in predefined requirements folder. Flag 'Upgrade' replaces in resulting requirement file '==' with '>=' for the use of upgrading packages.
    .OUTPUTS
        None.
    #>


    [CmdletBinding(PositionalBinding)]

    [OutputType([Void])]

    Param(
        [ValidateSet([ValidateVirtualEnv])]
        [Parameter(Position=1, ValueFromPipeline, HelpMessage="Name of the virtual environment.")]
        [System.String] $Name="",

        [Parameter(HelpMessage="If switch 'All' is true, the requirement file for all existing virtual environments will be generated.")]
        [Switch] $All,

        [Parameter(HelpMessage="If switch 'Upgrade' is true the requirement file is prepared for upgrading packages.")]
        [Switch] $Upgrade
    )

    Process {

        # check valide virtual environment
        if ($Name) {
            if (-not(Test-VirtualEnv -Name $Name)){
                Write-FormattedError -Message "The virtual environment '$($Name)' does not exist." -Module $PSVirtualEnv.Name -Space
                Get-VirtualEnv

                return
            }

            $virtualEnv = @{ Name = $Name }
        }

        # Get all existing virtual environments if 'Name' is not set
        if ($All) {
            $virtualEnv = Get-VirtualEnv
        }

        $virtualEnv | ForEach-Object {

            # get full path of requirement file
            $requirement_file = Get-RequirementFile -Name $_.Name

            # create the requirement file of the specified virtual environment
            Set-VirtualEnv -Name $Name
            . pip freeze > $requirement_file
            Restore-VirtualEnv

            if ($Upgrade){
                $(Get-Content $requirement_file) -replace "==", ">=" | Out-File -FilePath $requirement_file
            }

            Write-FormattedSuccess -Message "Requirement file for virtual enviroment '$($_.Name)' created." -Module $PSVirtualEnv.Name
        }
    }
}

# function ----------------------------------------------------------------
# ---------------------------------------------------------------------------
function Get-RequirementFile {

    <#
    .DESCRIPTION
        Create the requirement file of a specific virtual environment.
     
    .PARAMETER Name
 
    .OUTPUTS
        System.String. Full path of virtual environment requirements file.
    #>


    [CmdletBinding(PositionalBinding)]

    [OutputType([Void])]

    Param(
        [Parameter(Position=1, ValueFromPipeline, Mandatory, HelpMessage="Name of the virtual environment.")]
        [System.String] $Name
    )

    Process {

        return Join-Path -Path $PSVirtualEnv.RequireDir -ChildPath "$($Name)-requirements.txt" 
        
    }
}