diff --git a/.appveyor.yml b/.appveyor.yml index 2b5f541..c180aec 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -6,6 +6,10 @@ image: Visual Studio 2017 #---------------------------------# # Build Script # #---------------------------------# +install: + # Update to latest NuGet version since we require 5.3.0 for embedded icon + - ps: nuget update -self + build_script: - ps: .\build.ps1 -Target AppVeyor @@ -27,4 +31,4 @@ branches: # Build Cache # #---------------------------------# cache: -- tools -> setup.cake \ No newline at end of file +- tools -> recipe.cake diff --git a/README.md b/README.md index 200e284..088067e 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Cake.Npm Addin This Addin for the Cake Build Automation System allows you to run [npm](https://www.npmjs.com/). -More about Cake at http://cakebuild.net +More about Cake at [cakebuild.net](http://cakebuild.net). [![License](http://img.shields.io/:license-mit-blue.svg)](http://cake-contrib.mit-license.org) @@ -16,7 +16,7 @@ More about Cake at http://cakebuild.net |Develop|Master| |:--:|:--:| -|[![Build status](https://ci.appveyor.com/api/projects/status/5fbkekpb5roh39m8/branch/develop?svg=true)](https://ci.appveyor.com/project/cakecontrib/cake-npm/branch/develop)|[![Build status](https://ci.appveyor.com/api/projects/status/5fbkekpb5roh39m8/branch/develop?svg=true)](https://ci.appveyor.com/project/cakecontrib/cake-npm/branch/master)| +|[![Build status](https://ci.appveyor.com/api/projects/status/5fbkekpb5roh39m8/branch/develop?svg=true)](https://ci.appveyor.com/project/cakecontrib/cake-npm/branch/develop)|[![Build status](https://ci.appveyor.com/api/projects/status/5fbkekpb5roh39m8/branch/master?svg=true)](https://ci.appveyor.com/project/cakecontrib/cake-npm/branch/master)| ## Code Coverage @@ -26,14 +26,14 @@ More about Cake at http://cakebuild.net - [Documentation](https://cake-contrib.github.io/Cake.Npm) -## Chat Room +## Discussion -Come join in the conversation about Cake.Yeoman in our Gitter Chat Room +If you have questions, search for an existing one, or create a new discussion on the Cake GitHub repository, using the `Extension Q&A` category. -[![Join the chat at https://gitter.im/cake-contrib/Lobby](https://badges.gitter.im/cake-contrib/Lobby.svg)](https://gitter.im/cake-contrib/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[![Join in the discussion on the Cake repository](https://img.shields.io/badge/GitHub-Discussions-green?logo=github)](https://github.com/cake-build/cake/discussions/categories/extension-q-a) ## Contributing Contributions are welcome. See [Contribution Guidelines]. -[Contribution Guidelines]: CONTRIBUTING.md \ No newline at end of file +[Contribution Guidelines]: CONTRIBUTING.md diff --git a/build.ps1 b/build.ps1 index bdfb32b..9a6ade2 100644 --- a/build.ps1 +++ b/build.ps1 @@ -5,11 +5,14 @@ ########################################################################## <# + .SYNOPSIS This is a Powershell script to bootstrap a Cake build. + .DESCRIPTION This Powershell script will download NuGet if missing, restore NuGet tools (including Cake) and execute your Cake build script with the parameters you provide. + .PARAMETER Script The build script to execute. .PARAMETER Target @@ -18,32 +21,36 @@ The build script target to run. The build configuration to use. .PARAMETER Verbosity Specifies the amount of information to be displayed. +.PARAMETER ShowDescription +Shows description about tasks. +.PARAMETER DryRun +Performs a dry run. .PARAMETER Experimental -Tells Cake to use the latest Roslyn release. -.PARAMETER WhatIf -Performs a dry run of the build script. -No tasks will be executed. +Uses the nightly builds of the Roslyn script engine. .PARAMETER Mono -Tells Cake to use the Mono scripting engine. +Uses the Mono compiler rather than the Roslyn script engine. .PARAMETER SkipToolPackageRestore Skips restoring of packages. .PARAMETER ScriptArgs Remaining arguments are added here. + .LINK -http://cakebuild.net +https://cakebuild.net + #> [CmdletBinding()] Param( - [string]$Script = "setup.cake", + [string]$Script = "recipe.cake", [string]$Target = "Default", [ValidateSet("Release", "Debug")] [string]$Configuration = "Release", [ValidateSet("Quiet", "Minimal", "Normal", "Verbose", "Diagnostic")] [string]$Verbosity = "Verbose", + [switch]$ShowDescription, + [Alias("WhatIf", "Noop")] + [switch]$DryRun, [switch]$Experimental, - [Alias("DryRun","Noop")] - [switch]$WhatIf, [switch]$Mono, [switch]$SkipToolPackageRestore, [Parameter(Position=0,Mandatory=$false,ValueFromRemainingArguments=$true)] @@ -75,6 +82,15 @@ function MD5HashFile([string] $filePath) } } +function GetProxyEnabledWebClient +{ + $wc = New-Object System.Net.WebClient + $proxy = [System.Net.WebRequest]::GetSystemWebProxy() + $proxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials + $wc.Proxy = $proxy + return $wc +} + Write-Host "Preparing to run build script..." if(!$PSScriptRoot){ @@ -82,31 +98,15 @@ if(!$PSScriptRoot){ } $TOOLS_DIR = Join-Path $PSScriptRoot "tools" +$ADDINS_DIR = Join-Path $TOOLS_DIR "Addins" +$MODULES_DIR = Join-Path $TOOLS_DIR "Modules" $NUGET_EXE = Join-Path $TOOLS_DIR "nuget.exe" $CAKE_EXE = Join-Path $TOOLS_DIR "Cake/Cake.exe" $NUGET_URL = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe" $PACKAGES_CONFIG = Join-Path $TOOLS_DIR "packages.config" $PACKAGES_CONFIG_MD5 = Join-Path $TOOLS_DIR "packages.config.md5sum" - -# Should we use mono? -$UseMono = ""; -if($Mono.IsPresent) { - Write-Verbose -Message "Using the Mono based scripting engine." - $UseMono = "-mono" -} - -# Should we use the new Roslyn? -$UseExperimental = ""; -if($Experimental.IsPresent -and !($Mono.IsPresent)) { - Write-Verbose -Message "Using experimental version of Roslyn." - $UseExperimental = "-experimental" -} - -# Is this a dry run? -$UseDryRun = ""; -if($WhatIf.IsPresent) { - $UseDryRun = "-dryrun" -} +$ADDINS_PACKAGES_CONFIG = Join-Path $ADDINS_DIR "packages.config" +$MODULES_PACKAGES_CONFIG = Join-Path $MODULES_DIR "packages.config" # Make sure tools folder exists if ((Test-Path $PSScriptRoot) -and !(Test-Path $TOOLS_DIR)) { @@ -116,8 +116,10 @@ if ((Test-Path $PSScriptRoot) -and !(Test-Path $TOOLS_DIR)) { # Make sure that packages.config exist. if (!(Test-Path $PACKAGES_CONFIG)) { - Write-Verbose -Message "Downloading packages.config..." - try { (New-Object System.Net.WebClient).DownloadFile("http://cakebuild.net/download/bootstrapper/packages", $PACKAGES_CONFIG) } catch { + Write-Verbose -Message "Downloading packages.config..." + try { + $wc = GetProxyEnabledWebClient + $wc.DownloadFile("https://cakebuild.net/download/bootstrapper/packages", $PACKAGES_CONFIG) } catch { Throw "Could not download packages.config." } } @@ -125,7 +127,7 @@ if (!(Test-Path $PACKAGES_CONFIG)) { # Try find NuGet.exe in path if not exists if (!(Test-Path $NUGET_EXE)) { Write-Verbose -Message "Trying to find nuget.exe in PATH..." - $existingPaths = $Env:Path -Split ';' | Where-Object { (![string]::IsNullOrEmpty($_)) -and (Test-Path $_) } + $existingPaths = $Env:Path -Split ';' | Where-Object { (![string]::IsNullOrEmpty($_)) -and (Test-Path $_ -PathType Container) } $NUGET_EXE_IN_PATH = Get-ChildItem -Path $existingPaths -Filter "nuget.exe" | Select -First 1 if ($NUGET_EXE_IN_PATH -ne $null -and (Test-Path $NUGET_EXE_IN_PATH.FullName)) { Write-Verbose -Message "Found in PATH at $($NUGET_EXE_IN_PATH.FullName)." @@ -137,7 +139,8 @@ if (!(Test-Path $NUGET_EXE)) { if (!(Test-Path $NUGET_EXE)) { Write-Verbose -Message "Downloading NuGet.exe..." try { - (New-Object System.Net.WebClient).DownloadFile($NUGET_URL, $NUGET_EXE) + $wc = GetProxyEnabledWebClient + $wc.DownloadFile($NUGET_URL, $NUGET_EXE) } catch { Throw "Could not download NuGet.exe." } @@ -160,16 +163,51 @@ if(-Not $SkipToolPackageRestore.IsPresent) { } Write-Verbose -Message "Restoring tools from NuGet..." - $NuGetOutput = Invoke-Expression "&`"$NUGET_EXE`" install -ExcludeVersion -PreRelease -OutputDirectory `"$TOOLS_DIR`" -Source https://www.myget.org/F/cake/api/v3/index.json" + $NuGetOutput = Invoke-Expression "&`"$NUGET_EXE`" install -ExcludeVersion -OutputDirectory `"$TOOLS_DIR`"" if ($LASTEXITCODE -ne 0) { - Throw "An error occured while restoring NuGet tools." + Throw "An error occurred while restoring NuGet tools." } else { $md5Hash | Out-File $PACKAGES_CONFIG_MD5 -Encoding "ASCII" } Write-Verbose -Message ($NuGetOutput | out-string) + + Pop-Location +} + +# Restore addins from NuGet +if (Test-Path $ADDINS_PACKAGES_CONFIG) { + Push-Location + Set-Location $ADDINS_DIR + + Write-Verbose -Message "Restoring addins from NuGet..." + $NuGetOutput = Invoke-Expression "&`"$NUGET_EXE`" install -ExcludeVersion -OutputDirectory `"$ADDINS_DIR`"" + + if ($LASTEXITCODE -ne 0) { + Throw "An error occurred while restoring NuGet addins." + } + + Write-Verbose -Message ($NuGetOutput | out-string) + + Pop-Location +} + +# Restore modules from NuGet +if (Test-Path $MODULES_PACKAGES_CONFIG) { + Push-Location + Set-Location $MODULES_DIR + + Write-Verbose -Message "Restoring modules from NuGet..." + $NuGetOutput = Invoke-Expression "&`"$NUGET_EXE`" install -ExcludeVersion -OutputDirectory `"$MODULES_DIR`"" + + if ($LASTEXITCODE -ne 0) { + Throw "An error occurred while restoring NuGet modules." + } + + Write-Verbose -Message ($NuGetOutput | out-string) + Pop-Location } @@ -178,7 +216,18 @@ if (!(Test-Path $CAKE_EXE)) { Throw "Could not find Cake.exe at $CAKE_EXE" } +# Build Cake arguments +$cakeArguments = @("$Script"); +if ($Target) { $cakeArguments += "-target=$Target" } +if ($Configuration) { $cakeArguments += "-configuration=$Configuration" } +if ($Verbosity) { $cakeArguments += "-verbosity=$Verbosity" } +if ($ShowDescription) { $cakeArguments += "-showdescription" } +if ($DryRun) { $cakeArguments += "-dryrun" } +if ($Experimental) { $cakeArguments += "-experimental" } +if ($Mono) { $cakeArguments += "-mono" } +$cakeArguments += $ScriptArgs + # Start Cake Write-Host "Running build script..." -Invoke-Expression "& `"$CAKE_EXE`" `"$Script`" -target=`"$Target`" -configuration=`"$Configuration`" -verbosity=`"$Verbosity`" $UseMono $UseDryRun $UseExperimental $ScriptArgs" +&$CAKE_EXE $cakeArguments exit $LASTEXITCODE \ No newline at end of file diff --git a/build.sh b/build.sh old mode 100644 new mode 100755 index a541ec1..4b690aa --- a/build.sh +++ b/build.sh @@ -1,33 +1,36 @@ #!/usr/bin/env bash -############################################################### -# This is the Cake bootstrapper script that is responsible for -# downloading Cake and all specified tools from NuGet. -############################################################### +########################################################################## +# This is the Cake bootstrapper script for Linux and OS X. +# This file was downloaded from https://github.com/cake-build/resources +# Feel free to change this file to fit your needs. +########################################################################## # Define directories. SCRIPT_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) TOOLS_DIR=$SCRIPT_DIR/tools NUGET_EXE=$TOOLS_DIR/nuget.exe -CAKE_EXE=$TOOLS_DIR/Cake/Cake.exe +NUGET_URL=https://dist.nuget.org/win-x86-commandline/latest/nuget.exe +CAKE_VERSION=0.32.1 +CAKE_EXE=$TOOLS_DIR/Cake.$CAKE_VERSION/Cake.exe + +# Temporarily skip verification of addins. +export CAKE_SETTINGS_SKIPVERIFICATION='true' # Define default arguments. -SCRIPT="setup.cake" +SCRIPT="recipe.cake" TARGET="Default" CONFIGURATION="Release" VERBOSITY="verbose" DRYRUN= -SHOW_VERSION=false SCRIPT_ARGUMENTS=() # Parse arguments. for i in "$@"; do case $1 in - -s|--script) SCRIPT="$2"; shift ;; -t|--target) TARGET="$2"; shift ;; -c|--configuration) CONFIGURATION="$2"; shift ;; -v|--verbosity) VERBOSITY="$2"; shift ;; -d|--dryrun) DRYRUN="-dryrun" ;; - --version) SHOW_VERSION=true ;; --) shift; SCRIPT_ARGUMENTS+=("$@"); break ;; *) SCRIPT_ARGUMENTS+=("$1") ;; esac @@ -35,48 +38,66 @@ for i in "$@"; do done # Make sure the tools folder exist. -if [ ! -d $TOOLS_DIR ]; then - mkdir $TOOLS_DIR +if [ ! -d "$TOOLS_DIR" ]; then + mkdir "$TOOLS_DIR" fi -# Make sure that packages.config exist. -if [ ! -f $TOOLS_DIR/packages.config ]; then - echo "Downloading packages.config..." - curl -Lsfo $TOOLS_DIR/packages.config http://cakebuild.net/bootstrapper/packages - if [ $? -ne 0 ]; then - echo "An error occured while downloading packages.config." - exit 1 - fi +# Print Mono version. +echo "Mono version:" +mono --version +echo "" + +########################################################################### +# INSTALL .NET CORE CLI +########################################################################### + +echo "Installing .NET CLI..." +if [ ! -d "$SCRIPT_DIR/.dotnet" ]; then + mkdir "$SCRIPT_DIR/.dotnet" fi +curl -Lsfo "$SCRIPT_DIR/.dotnet/dotnet-install.sh" https://dot.net/v1/dotnet-install.sh +sudo bash "$SCRIPT_DIR/.dotnet/dotnet-install.sh" --version 2.1.400 --install-dir .dotnet --no-path +export PATH="$SCRIPT_DIR/.dotnet":$PATH +export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1 +export DOTNET_CLI_TELEMETRY_OPTOUT=1 +export DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER=0 +"$SCRIPT_DIR/.dotnet/dotnet" --info + +########################################################################### +# INSTALL NUGET +########################################################################### # Download NuGet if it does not exist. -if [ ! -f $NUGET_EXE ]; then +if [ ! -f "$NUGET_EXE" ]; then echo "Downloading NuGet..." - curl -Lsfo $NUGET_EXE https://dist.nuget.org/win-x86-commandline/latest/nuget.exe + curl -Lsfo "$NUGET_EXE" $NUGET_URL if [ $? -ne 0 ]; then - echo "An error occured while downloading nuget.exe." + echo "An error occurred while downloading nuget.exe." exit 1 fi fi -# Restore tools from NuGet. -pushd $TOOLS_DIR >/dev/null -mono $NUGET_EXE install -ExcludeVersion -PreRelease -Source https://www.myget.org/F/cake/api/v3/index.json -if [ $? -ne 0 ]; then - echo "Could not restore NuGet packages." - exit 1 +########################################################################### +# INSTALL CAKE +########################################################################### + +if [ ! -f "$CAKE_EXE" ]; then + mono "$NUGET_EXE" install Cake -Version $CAKE_VERSION -OutputDirectory "$TOOLS_DIR" + if [ $? -ne 0 ]; then + echo "An error occurred while installing Cake." + exit 1 + fi fi -popd >/dev/null # Make sure that Cake has been installed. -if [ ! -f $CAKE_EXE ]; then +if [ ! -f "$CAKE_EXE" ]; then echo "Could not find Cake.exe at '$CAKE_EXE'." exit 1 fi +########################################################################### +# RUN BUILD SCRIPT +########################################################################### + # Start Cake -if $SHOW_VERSION; then - exec mono $CAKE_EXE -version -else - exec mono $CAKE_EXE $SCRIPT -verbosity=$VERBOSITY -configuration=$CONFIGURATION -target=$TARGET $DRYRUN "${SCRIPT_ARGUMENTS[@]}" -fi +exec mono "$CAKE_EXE" $SCRIPT --verbosity=$VERBOSITY --configuration=$CONFIGURATION --target=$TARGET $DRYRUN "${SCRIPT_ARGUMENTS[@]}" diff --git a/docs/input/_Bottom.cshtml b/docs/input/_Bottom.cshtml index 9309d39..98b6ff5 100644 --- a/docs/input/_Bottom.cshtml +++ b/docs/input/_Bottom.cshtml @@ -1,12 +1,10 @@
GitHub
- - + + + Discussion + diff --git a/docs/input/assets/css/override.less b/docs/input/assets/css/override.less index 74d8ed4..7e1f7ed 100644 --- a/docs/input/assets/css/override.less +++ b/docs/input/assets/css/override.less @@ -71,9 +71,9 @@ pre:hover .btn-copy { @font-family-sans-serif: "Roboto", Helvetica, Arial, sans-serif; -/* For Gitter and GitHub */ +/* For GitHub */ .bottom-footer { - margin-bottom: 40px !important; // Make room for Gitter and GitHub buttons + margin-bottom: 40px !important; // Make room for GitHub buttons } .gitter-open-chat-button { @@ -84,7 +84,7 @@ pre:hover .btn-copy { } .gitter-open-chat-button:focus, .gitter-open-chat-button:hover, -.github-button:focus, .github-button:hover, +.github-button:focus, .github-button:hover { background-color: #4EABDD; color: #fff; @@ -96,11 +96,36 @@ pre:hover .btn-copy { z-index: 10000; } +.discussion-button { + z-index: 100; + position: fixed; + bottom: 0px; + right: 80px; + padding: 1em 3em; + background-color: #367fa9; + border: 0; + border-top-left-radius: 0.5em; + border-top-right-radius: 0.5em; + font-family: sans-serif; + font-size: 9pt; + text-transform: uppercase; + text-align: center; + text-decoration: none; + cursor: pointer; + cursor: hand; + -webkit-transition: all .3s ease; + transition: all .3s ease; + color: #fff; + a, a:active, a:hover, a:focus { + color: #fff; + } +} + .github-button { z-index: 100; position: fixed; bottom: 0px; - right: 240px; + right: 255px; padding: 1em 3em; background-color: #367fa9; border: 0; diff --git a/nuspec/nuget/Cake.Npm.nuspec b/nuspec/nuget/Cake.Npm.nuspec index 56dd83a..6a8541c 100644 --- a/nuspec/nuget/Cake.Npm.nuspec +++ b/nuspec/nuget/Cake.Npm.nuspec @@ -10,15 +10,16 @@ A set of aliases for Cake to help with running Npm (Node Package Manager) commands MIT https://github.com/cake-contrib/cake-npm - https://cdn.jsdelivr.net/gh/cake-contrib/graphics@a5cf0f881c390650144b2243ae551d5b9f836196/png/cake-contrib-medium.png + icon.png false - + cake npm cake-build cake-contrib - https://github.com/cake-contrib/Cake.Npm/releases/tag/0.17.0 + https://github.com/cake-contrib/Cake.Npm/releases/tag/1.0.0 + - \ No newline at end of file + diff --git a/nuspec/nuget/icon.png b/nuspec/nuget/icon.png new file mode 100644 index 0000000..9881edc Binary files /dev/null and b/nuspec/nuget/icon.png differ diff --git a/setup.cake b/recipe.cake similarity index 86% rename from setup.cake rename to recipe.cake index 7f8f666..1a105f5 100644 --- a/setup.cake +++ b/recipe.cake @@ -1,4 +1,4 @@ -#load nuget:https://www.myget.org/F/cake-contrib/api/v2?package=Cake.Recipe&prerelease +#load nuget:?package=Cake.Recipe&version=1.0.0 Environment.SetVariableNames(); @@ -10,8 +10,10 @@ BuildParameters.SetParameters( repositoryOwner: "cake-contrib", repositoryName: "Cake.Npm", appVeyorAccountName: "cakecontrib", + shouldPublishMyGet: false, shouldRunDupFinder: false, - shouldRunCodecov: false); + shouldRunCodecov: false, + shouldRunGitVersion: true); BuildParameters.PrintParameters(Context); diff --git a/src/Cake.Npm.Tests/BumpVersion/NpmBumpVersionToolFixture.cs b/src/Cake.Npm.Tests/BumpVersion/NpmBumpVersionToolFixture.cs new file mode 100644 index 0000000..0926dc3 --- /dev/null +++ b/src/Cake.Npm.Tests/BumpVersion/NpmBumpVersionToolFixture.cs @@ -0,0 +1,14 @@ + +namespace Cake.Npm.Tests.BumpVersion +{ + using Cake.Npm.BumpVersion; + + internal sealed class NpmBumpVersionToolFixture : NpmFixture + { + protected override void RunTool() + { + var tool = new NpmBumpVersionTool(FileSystem, Environment, ProcessRunner, Tools, Log); + tool.BumpVersion(Settings); + } + } +} diff --git a/src/Cake.Npm.Tests/BumpVersion/NpmBumpVersionToolTests.cs b/src/Cake.Npm.Tests/BumpVersion/NpmBumpVersionToolTests.cs new file mode 100644 index 0000000..0abd09e --- /dev/null +++ b/src/Cake.Npm.Tests/BumpVersion/NpmBumpVersionToolTests.cs @@ -0,0 +1,155 @@ +namespace Cake.Npm.Tests.BumpVersion +{ + using Npm.BumpVersion; + + using System; + using System.Collections; + using System.Collections.Generic; + + using Xunit; + + public class NpmBumpVersionToolTests + { + public sealed class TheBumpVersionMethod + { + private NpmBumpVersionToolFixture fixture; + + public TheBumpVersionMethod() + { + fixture = new NpmBumpVersionToolFixture(); + } + + [Fact] + public void Should_Throw_If_Settings_Are_Null() + { + // Given + fixture.Settings = null; + + // When + var result = Record.Exception(() => fixture.Run()); + + // Then + result.IsArgumentNullException("settings"); + } + + [Theory] + [ClassData(typeof(ExtensionNullCheckData))] + public void Should_Throw_If_Settings_Are_Null_For_All_Extensions(Action extensionAction) + { + // Given + fixture.Settings = null; + + // When + var result = Record.Exception(() => extensionAction(fixture.Settings)); + + // Then + result.IsArgumentNullException("settings"); + } + + [Fact] + public void Should_Add_Mandatory_And_Default_Arguments() + { + // Given + + // When + var result = fixture.Run(); + + // Then + Assert.Equal("version minor", result.Args); + } + + [Fact] + public void Should_Add_Version_Argument() + { + // Given + fixture.Settings.Version = "1.2.3"; + + // When + var result = fixture.Run(); + + // Then + Assert.Equal("version 1.2.3", result.Args); + } + + [Fact] + public void Should_Add_Version_Argument_Using_Extensions() + { + // Given + fixture.Settings.WithVersion("1.2.3"); + + // When + var result = fixture.Run(); + + // Then + Assert.Equal("version 1.2.3", result.Args); + } + + [Fact] + public void Should_Add_Force_Switch() + { + // Given + fixture.Settings.Force = true; + + // When + var result = fixture.Run(); + + // Then + Assert.Equal("version minor -f", result.Args); + } + + [Fact] + public void Should_Add_Force_Switch_Using_Extension() + { + // Given + fixture.Settings.WithForce(); + + // When + var result = fixture.Run(); + + // Then + Assert.Equal("version minor -f", result.Args); + } + + [Fact] + public void Should_Add_CommitMessage_Option() + { + // Given + fixture.Settings.CommitMessage = "Bumped minor version."; + + // When + var result = fixture.Run(); + + // Then + Assert.Equal("version minor -m \"Bumped minor version.\"", result.Args); + } + + [Fact] + public void Should_Add_CommitMessage_Option_Using_Extension() + { + // Given + fixture.Settings.WithCommitMessage("Bumped minor version."); + + // When + var result = fixture.Run(); + + // Then + Assert.Equal("version minor -m \"Bumped minor version.\"", result.Args); + } + + class ExtensionNullCheckData : IEnumerable + { + public IEnumerator GetEnumerator() + { + yield return new object[] { (Action)(x => x.WithForce()) }; + yield return new object[] { (Action)(x => x.WithCommitMessage("")) }; + yield return new object[] { (Action)(x => x.WithVersion("")) }; + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } + } + } +} diff --git a/src/Cake.Npm.Tests/Cake.Npm.Tests.csproj b/src/Cake.Npm.Tests/Cake.Npm.Tests.csproj index 84e37aa..bd815e1 100644 --- a/src/Cake.Npm.Tests/Cake.Npm.Tests.csproj +++ b/src/Cake.Npm.Tests/Cake.Npm.Tests.csproj @@ -10,8 +10,8 @@ - - + + diff --git a/src/Cake.Npm.Tests/ExceptionAssertExtensions.cs b/src/Cake.Npm.Tests/ExceptionAssertExtensions.cs index 024404f..0dd1777 100644 --- a/src/Cake.Npm.Tests/ExceptionAssertExtensions.cs +++ b/src/Cake.Npm.Tests/ExceptionAssertExtensions.cs @@ -21,5 +21,11 @@ public static void IsUriFormatException(this Exception exception) { Assert.IsType(exception); } + + public static void IsArgumentOutOfRangeException(this Exception exception, string parameterName) + { + Assert.IsType(exception); + Assert.Equal(parameterName, ((ArgumentOutOfRangeException)exception).ParamName); + } } } diff --git a/src/Cake.Npm.Tests/NpmSettingsExtensionsTests.cs b/src/Cake.Npm.Tests/NpmSettingsExtensionsTests.cs index 2e7805b..e911af0 100644 --- a/src/Cake.Npm.Tests/NpmSettingsExtensionsTests.cs +++ b/src/Cake.Npm.Tests/NpmSettingsExtensionsTests.cs @@ -1,5 +1,7 @@ namespace Cake.Npm.Tests { + using System; + using Cake.Npm.Install; using Shouldly; using Xunit; @@ -83,6 +85,34 @@ public void Should_Set_WorkingDirectory() // Then settings.WorkingDirectory.ToString().ShouldBe(@"c:/temp"); } + + [Fact] + public void Should_Set_StandardOutputAction() + { + // Given + var settings = new NpmInstallSettings(); + Action action = x => { }; + + // When + settings.SetRedirectedStandardOutputHandler(action); + + // Then + settings.StandardOutputAction.ShouldBe(action); + } + + [Fact] + public void Should_Set_StandardErrorAction() + { + // Given + var settings = new NpmInstallSettings(); + Action action = x => { }; + + // When + settings.SetRedirectedStandardErrorHandler(action); + + // Then + settings.StandardErrorAction.ShouldBe(action); + } } } } diff --git a/src/Cake.Npm.Tests/ViewVersion/NpmViewVersionToolFixture.cs b/src/Cake.Npm.Tests/ViewVersion/NpmViewVersionToolFixture.cs new file mode 100644 index 0000000..b9150b4 --- /dev/null +++ b/src/Cake.Npm.Tests/ViewVersion/NpmViewVersionToolFixture.cs @@ -0,0 +1,16 @@ + +namespace Cake.Npm.Tests.ViewVersion +{ + using Cake.Npm.ViewVersion; + + internal sealed class NpmViewVersionToolFixture : NpmFixture + { + internal string Version { get; private set; } + + protected override void RunTool() + { + var tool = new NpmViewVersionTool(FileSystem, Environment, ProcessRunner, Tools, Log); + Version = tool.Version(Settings); + } + } +} diff --git a/src/Cake.Npm.Tests/ViewVersion/NpmViewVersionToolTests.cs b/src/Cake.Npm.Tests/ViewVersion/NpmViewVersionToolTests.cs new file mode 100644 index 0000000..23adbda --- /dev/null +++ b/src/Cake.Npm.Tests/ViewVersion/NpmViewVersionToolTests.cs @@ -0,0 +1,113 @@ +namespace Cake.Npm.Tests.ViewVersion +{ + using Cake.Npm.ViewVersion; + + using Shouldly; + + using Xunit; + + public class NpmViewVersionToolTests + { + public sealed class TheViewVersionMethod + { + private NpmViewVersionToolFixture fixture; + + public TheViewVersionMethod() + { + fixture = new NpmViewVersionToolFixture(); + } + + [Fact] + public void Should_Throw_If_Settings_Are_Null() + { + // Given + fixture.Settings = null; + + // When + var result = Record.Exception(() => fixture.Run()); + + // Then + result.IsArgumentNullException("settings"); + } + + [Fact] + public void Should_Throw_If_Package_Is_Null() + { + // Given + fixture.Settings.Package = null; + + // When + var result = Record.Exception(() => fixture.Run()); + + // Then + result.IsArgumentOutOfRangeException("Package"); + } + + [Fact] + public void Should_Throw_If_Extension_Is_Called_On_Null() + { + // Given + fixture.Settings = null; + + // When + var result = Record.Exception(() => fixture.Settings.ForPackage("cakejs")); + + // Then + result.IsArgumentNullException("settings"); + } + + [Fact] + public void Should_Add_Mandatory_And_Default_Arguments() + { + // Given + + // When + var result = fixture.Run(); + + // Then + Assert.Equal("view npm version", result.Args); + } + + [Fact] + public void Should_Add_Package_Argument() + { + // Given + fixture.Settings.Package = "cakejs"; + + // When + var result = fixture.Run(); + + // Then + Assert.Equal("view cakejs version", result.Args); + } + + [Fact] + public void Should_Add_Package_Argument_Using_Extension() + { + // Given + fixture.Settings.ForPackage("cakejs"); + + // When + var result = fixture.Run(); + + // Then + Assert.Equal("view cakejs version", result.Args); + } + + [Fact] + public void Should_Return_Version_From_StandardOutput() + { + const string version = "1.1.0"; + + // Given + fixture.ProcessRunner.Process.SetStandardOutput(new[] { version }); + + // When + fixture.Run(); + + // Then + fixture.Version.ShouldBe(version); + } + } + } +} diff --git a/src/Cake.Npm/BumpVersion/NpmBumpVersionSettings.cs b/src/Cake.Npm/BumpVersion/NpmBumpVersionSettings.cs new file mode 100644 index 0000000..5031cb0 --- /dev/null +++ b/src/Cake.Npm/BumpVersion/NpmBumpVersionSettings.cs @@ -0,0 +1,58 @@ +namespace Cake.Npm.BumpVersion +{ + using Core; + using Core.IO; + + /// + /// Contains settings used by . + /// + public class NpmBumpVersionSettings : NpmSettings + { + /// + /// Initializes a new instance of the class. + /// + public NpmBumpVersionSettings() + : base("version") + { + Version = "minor"; + } + + /// + /// Gets or sets the force-option + /// + public bool Force { get; set; } + + /// + /// Gets or sets the commit message. + /// + public string CommitMessage { get; set; } + + /// + /// Gets or sets the version to bump to. Should be a valid semver + /// or one of "patch", "minor", "major", + /// "prepatch", "preminor", "premajor", + /// "prerelease" or "from-git". + /// + public string Version {get;set; } + + /// + /// Evaluates the settings and writes them to . + /// + /// The argument builder into which the settings should be written. + protected override void EvaluateCore(ProcessArgumentBuilder args) + { + base.EvaluateCore(args); + args.Append(Version); + + if (!string.IsNullOrEmpty(CommitMessage)) + { + args.AppendSwitchQuoted("-m", CommitMessage); + } + + if (Force) + { + args.Append("-f"); + } + } + } +} diff --git a/src/Cake.Npm/BumpVersion/NpmBumpVersionSettingsExtensions.cs b/src/Cake.Npm/BumpVersion/NpmBumpVersionSettingsExtensions.cs new file mode 100644 index 0000000..9d96ce9 --- /dev/null +++ b/src/Cake.Npm/BumpVersion/NpmBumpVersionSettingsExtensions.cs @@ -0,0 +1,61 @@ +namespace Cake.Npm.BumpVersion +{ + using System; + + /// + /// Extensions for . + /// + public static class NpmBumpVersionSettingsExtensions + { + /// + /// Defines that npm version should commit, even if the repository is not clean. + /// + /// The settings. + /// Whether to set force, or not. + /// The instance with set. + public static NpmBumpVersionSettings WithForce(this NpmBumpVersionSettings settings, bool force = true) + { + if (settings == null) + { + throw new ArgumentNullException(nameof(settings)); + } + + settings.Force = force; + return settings; + } + + /// + /// Sets the commit message. + /// + /// The settings. + /// The commit message to set. + /// The instance with set. + public static NpmBumpVersionSettings WithCommitMessage(this NpmBumpVersionSettings settings, string message) + { + if (settings == null) + { + throw new ArgumentNullException(nameof(settings)); + } + + settings.CommitMessage = message; + return settings; + } + + /// + /// Sets the version to bump. + /// + /// The settings. + /// The version to bump. + /// The instance with set. + public static NpmBumpVersionSettings WithVersion(this NpmBumpVersionSettings settings, string version) + { + if (settings == null) + { + throw new ArgumentNullException(nameof(settings)); + } + + settings.Version = version; + return settings; + } + } +} diff --git a/src/Cake.Npm/BumpVersion/NpmBumpVersionTool.cs b/src/Cake.Npm/BumpVersion/NpmBumpVersionTool.cs new file mode 100644 index 0000000..1d8ca52 --- /dev/null +++ b/src/Cake.Npm/BumpVersion/NpmBumpVersionTool.cs @@ -0,0 +1,47 @@ +namespace Cake.Npm.BumpVersion +{ + using System; + + using Core; + using Core.Diagnostics; + using Core.IO; + using Core.Tooling; + + /// + /// Tool for bumping the version. + /// + public class NpmBumpVersionTool : NpmTool + { + /// + /// Initializes a new instance of the class. + /// + /// The file system. + /// The environment. + /// The process runner. + /// The tool locator. + /// Cake log instance. + public NpmBumpVersionTool( + IFileSystem fileSystem, + ICakeEnvironment environment, + IProcessRunner processRunner, + IToolLocator tools, + ICakeLog log) + : base(fileSystem, environment, processRunner, tools, log) + { + } + + /// + /// Calls npm version to bump a version. + /// + /// The settings. + public void BumpVersion(NpmBumpVersionSettings settings) + { + if (settings == null) + { + throw new ArgumentNullException(nameof(settings)); + } + + RunCore(settings); + } + } +} diff --git a/src/Cake.Npm/Cake.Npm.csproj b/src/Cake.Npm/Cake.Npm.csproj index a7cb039..119580b 100644 --- a/src/Cake.Npm/Cake.Npm.csproj +++ b/src/Cake.Npm/Cake.Npm.csproj @@ -21,6 +21,6 @@ - + \ No newline at end of file diff --git a/src/Cake.Npm/Namespaces.cs b/src/Cake.Npm/Namespaces.cs index fe1572b..b2e0346 100644 --- a/src/Cake.Npm/Namespaces.cs +++ b/src/Cake.Npm/Namespaces.cs @@ -106,4 +106,28 @@ namespace Cake.Npm.Update internal class NamespaceDoc { } +} + +// ReSharper disable once CheckNamespace +namespace Cake.Npm.BumpVersion +{ + /// + /// This namespace contain types used for bumping the package version. + /// + [CompilerGenerated] + internal class NamespaceDoc + { + } +} + +// ReSharper disable once CheckNamespace +namespace Cake.Npm.ViewVersion +{ + /// + /// This namespace contain types used for viewing the package versions. + /// + [CompilerGenerated] + internal class NamespaceDoc + { + } } \ No newline at end of file diff --git a/src/Cake.Npm/NpmBumpVersionAliases.cs b/src/Cake.Npm/NpmBumpVersionAliases.cs new file mode 100644 index 0000000..e051ed4 --- /dev/null +++ b/src/Cake.Npm/NpmBumpVersionAliases.cs @@ -0,0 +1,110 @@ +namespace Cake.Npm +{ + using System; + using BumpVersion; + using Core; + using Core.Annotations; + + /// + /// Npm BumpVersion aliases. + /// Use this if you want to use 'npm version' to bump the version. + /// Use this to bump the version of the current package. + /// For other functions of npm version, see: + /// + /// + /// + /// + /// + [CakeAliasCategory("Npm")] + [CakeNamespaceImport("Cake.Npm.BumpVersion")] + public static class NpmBumpVersionAliases + { + /// + /// Bump the version of the package. + /// + /// The context. + /// + /// + /// + /// + /// + [CakeMethodAlias] + [CakeAliasCategory("BumpVersion")] + public static void NpmBumpVersion(this ICakeContext context) + { + if (context == null) + { + throw new ArgumentNullException(nameof(context)); + } + + context.NpmBumpVersion(new NpmBumpVersionSettings()); + } + + /// + /// Bump the version of the package using the settings returned by a configurator. + /// + /// The context. + /// The settings configurator. + /// + /// + /// + /// settings.Version("major")); + /// ]]> + /// + /// + [CakeMethodAlias] + [CakeAliasCategory("BumpVersion")] + public static void NpmBumpVersion(this ICakeContext context, Action configurator) + { + if (context == null) + { + throw new ArgumentNullException(nameof(context)); + } + + if (configurator == null) + { + throw new ArgumentNullException(nameof(configurator)); + } + + var settings = new NpmBumpVersionSettings(); + configurator(settings); + context.NpmBumpVersion(settings); + } + + /// + /// Bump the version of the package using the specified settings. + /// + /// The context. + /// The settings. + /// + /// + /// + /// + /// + [CakeMethodAlias] + [CakeAliasCategory("BumpVersion")] + public static void NpmBumpVersion(this ICakeContext context, NpmBumpVersionSettings settings) + { + if (context == null) + { + throw new ArgumentNullException(nameof(context)); + } + + if (settings == null) + { + throw new ArgumentNullException(nameof(settings)); + } + + AddinInformation.LogVersionInformation(context.Log); + var tool = new NpmBumpVersionTool(context.FileSystem, context.Environment, context.ProcessRunner, context.Tools, context.Log); + tool.BumpVersion(settings); + } + } +} \ No newline at end of file diff --git a/src/Cake.Npm/NpmPackAliases.cs b/src/Cake.Npm/NpmPackAliases.cs index 9bde161..5bf4bf1 100644 --- a/src/Cake.Npm/NpmPackAliases.cs +++ b/src/Cake.Npm/NpmPackAliases.cs @@ -76,6 +76,7 @@ public static IEnumerable NpmPack(this ICakeContext context, string so /// /// The context. /// The settings configurator. + /// List of created packages. /// /// /// NpmPack(this ICakeContext context, string so /// [CakeMethodAlias] [CakeAliasCategory("Pack")] - public static void NpmPack(this ICakeContext context, Action configurator) + public static IEnumerable NpmPack(this ICakeContext context, Action configurator) { if (context == null) { @@ -99,7 +100,7 @@ public static void NpmPack(this ICakeContext context, Action co var settings = new NpmPackSettings(); configurator(settings); - context.NpmPack(settings); + return context.NpmPack(settings); } /// diff --git a/src/Cake.Npm/NpmSettings.cs b/src/Cake.Npm/NpmSettings.cs index cd37900..41907a2 100644 --- a/src/Cake.Npm/NpmSettings.cs +++ b/src/Cake.Npm/NpmSettings.cs @@ -1,5 +1,7 @@ namespace Cake.Npm { + using System; + using Core; using Core.Diagnostics; using Core.IO; @@ -27,15 +29,39 @@ protected NpmSettings(string command) public NpmLogLevel LogLevel { get; set; } /// - /// Gets or sets the process option to redirect standard error + /// Gets or sets the process option to redirect standard error output. /// + /// + /// To retrieve and process the standard error output + /// needs to be set. + /// public bool RedirectStandardError { get; set; } /// - /// Gets or sets the process option to redirect standard output + /// Gets or sets an action to retrieve and process standard error output. + /// + /// + /// Setting a standard error action implicitely set . + /// + public Action StandardErrorAction { get; set; } + + /// + /// Gets or sets the process option to redirect standard output. /// + /// + /// To retrieve and process the standard error output + /// needs to be set. + /// public bool RedirectStandardOutput { get; set; } + /// + /// Gets or sets an action to retrieve and process standard output. + /// + /// + /// Setting a standard error action implicitely set . + /// + public Action StandardOutputAction { get; set; } + /// /// Gets or sets the Log level set by Cake. /// diff --git a/src/Cake.Npm/NpmSettingsExtensions.cs b/src/Cake.Npm/NpmSettingsExtensions.cs index 3bbcc3d..0510a01 100644 --- a/src/Cake.Npm/NpmSettingsExtensions.cs +++ b/src/Cake.Npm/NpmSettingsExtensions.cs @@ -48,5 +48,51 @@ public static NpmSettings FromPath(this NpmSettings settings, DirectoryPath path return settings; } + + /// + /// Sets the StandardError-Action + /// + /// The settings. + /// The StandardError-Action. + /// The instance with set to . + public static NpmSettings SetRedirectedStandardErrorHandler(this NpmSettings settings, Action standardErrorAction) + { + if (settings == null) + { + throw new ArgumentNullException(nameof(settings)); + } + + if (standardErrorAction == null) + { + throw new ArgumentNullException(nameof(standardErrorAction)); + } + + settings.StandardErrorAction = standardErrorAction; + + return settings; + } + + /// + /// Sets the StandardOutput-Action + /// + /// The settings. + /// The StandardOutput-Action. + /// The instance with set to . + public static NpmSettings SetRedirectedStandardOutputHandler(this NpmSettings settings, Action standardOutputAction) + { + if (settings == null) + { + throw new ArgumentNullException(nameof(settings)); + } + + if (standardOutputAction == null) + { + throw new ArgumentNullException(nameof(standardOutputAction)); + } + + settings.StandardOutputAction = standardOutputAction; + + return settings; + } } } diff --git a/src/Cake.Npm/NpmTool.cs b/src/Cake.Npm/NpmTool.cs index 4dbd10a..1151e17 100644 --- a/src/Cake.Npm/NpmTool.cs +++ b/src/Cake.Npm/NpmTool.cs @@ -90,8 +90,31 @@ protected void RunCore(TSettings settings, ProcessSettings processSettings, Acti settings.CakeVerbosityLevel = CakeLog.Verbosity; } - processSettings.RedirectStandardError = settings.RedirectStandardError; - processSettings.RedirectStandardOutput = settings.RedirectStandardOutput; + processSettings.RedirectStandardOutput = + settings.RedirectStandardOutput || + settings.StandardOutputAction != null; + + if (settings.StandardOutputAction != null) + { + processSettings.RedirectedStandardOutputHandler = x => + { + settings.StandardOutputAction(x); + return x; + }; + } + + processSettings.RedirectStandardError = + settings.RedirectStandardError || + settings.StandardErrorAction != null; + + if (settings.StandardErrorAction != null) + { + processSettings.RedirectedStandardErrorHandler = x => + { + settings.StandardErrorAction(x); + return x; + }; + } var args = GetArguments(settings); Run(settings, args, processSettings, postAction); diff --git a/src/Cake.Npm/NpmVersionAliases.cs b/src/Cake.Npm/NpmVersionAliases.cs index 6b16551..39d2a1e 100644 --- a/src/Cake.Npm/NpmVersionAliases.cs +++ b/src/Cake.Npm/NpmVersionAliases.cs @@ -6,7 +6,13 @@ namespace Cake.Npm using Core.Annotations; /// - /// Npm Version aliases + /// Npm Version aliases. + /// Use this to get the current npm version in use. + /// For other functions of npm version, see: + /// + /// + /// + /// /// [CakeAliasCategory("Npm")] [CakeNamespaceImport("Cake.Npm.Version")] @@ -33,8 +39,73 @@ public static string NpmVersion(this ICakeContext context) } AddinInformation.LogVersionInformation(context.Log); - var settings =new NpmVersionSettings(); - return new NpmVersionTool(context.FileSystem, context.Environment, context.ProcessRunner, context.Tools, context.Log).Version(settings); + return context.NpmVersion(new NpmVersionSettings()); + } + + /// + /// Versions all packages for the project in the current working directory + /// using the settings returned by a configurator. + /// + /// The context. + /// The settings configurator. + /// + /// + /// settings.WithLogLevel(NpmLogLevel.Verbose)); + /// ]]> + /// + /// + [CakeMethodAlias] + [CakeAliasCategory("Version")] + public static string NpmVersion(this ICakeContext context, Action configurator) + { + if (context == null) + { + throw new ArgumentNullException(nameof(context)); + } + + if (configurator == null) + { + throw new ArgumentNullException(nameof(configurator)); + } + + var settings = new NpmVersionSettings(); + configurator(settings); + return context.NpmVersion(settings); + } + + /// + /// Versions all packages for the project in the current working directory + /// using the specified settings. + /// + /// The context. + /// The settings. + /// + /// + /// + /// + /// + [CakeMethodAlias] + [CakeAliasCategory("Version")] + public static string NpmVersion(this ICakeContext context, NpmVersionSettings settings) + { + if (context == null) + { + throw new ArgumentNullException(nameof(context)); + } + + if (settings == null) + { + throw new ArgumentNullException(nameof(settings)); + } + + AddinInformation.LogVersionInformation(context.Log); + var tool = new NpmVersionTool(context.FileSystem, context.Environment, context.ProcessRunner, context.Tools, context.Log); + return tool.Version(settings); } } } \ No newline at end of file diff --git a/src/Cake.Npm/NpmViewVersionAliases.cs b/src/Cake.Npm/NpmViewVersionAliases.cs new file mode 100644 index 0000000..c37d8ae --- /dev/null +++ b/src/Cake.Npm/NpmViewVersionAliases.cs @@ -0,0 +1,116 @@ +namespace Cake.Npm +{ + using System; + using Cake.Core; + using Cake.Core.Annotations; + using Cake.Npm.ViewVersion; + + /// + /// Npm ViewVersion aliases. + /// Use this to view package versions. + /// For other functions of npm version, see: + /// + /// + /// + /// + /// + [CakeAliasCategory("Npm")] + [CakeNamespaceImport("Cake.Npm.ViewVersion")] + public static class NpmViewVersionAliases + { + /// + /// View the version of a package. + /// + /// The context. + /// The Package. + /// + /// + /// + /// + /// + [CakeMethodAlias] + [CakeAliasCategory("Version")] + public static string NpmViewVersion(this ICakeContext context, string package) + { + if (context == null) + { + throw new ArgumentNullException(nameof(context)); + } + + AddinInformation.LogVersionInformation(context.Log); + return context.NpmViewVersion(new NpmViewVersionSettings + { + Package = package + }); + } + + /// + /// View the version of a package + /// using the settings returned by a configurator. + /// + /// The context. + /// The settings configurator. + /// + /// + /// + /// settings.ForPackage("cakejs")); + /// ]]> + /// + /// + [CakeMethodAlias] + [CakeAliasCategory("Version")] + public static string NpmViewVersion(this ICakeContext context, Action configurator) + { + if (context == null) + { + throw new ArgumentNullException(nameof(context)); + } + + if (configurator == null) + { + throw new ArgumentNullException(nameof(configurator)); + } + + var settings = new NpmViewVersionSettings(); + configurator(settings); + return context.NpmViewVersion(settings); + } + + /// + /// View the version of a package + /// using the specified settings. + /// + /// The context. + /// The settings. + /// + /// + /// + /// + /// + [CakeMethodAlias] + [CakeAliasCategory("Version")] + public static string NpmViewVersion(this ICakeContext context, NpmViewVersionSettings settings) + { + if (context == null) + { + throw new ArgumentNullException(nameof(context)); + } + + if (settings == null) + { + throw new ArgumentNullException(nameof(settings)); + } + + AddinInformation.LogVersionInformation(context.Log); + var tool = new NpmViewVersionTool(context.FileSystem, context.Environment, context.ProcessRunner, context.Tools, context.Log); + return tool.Version(settings); + } + } +} \ No newline at end of file diff --git a/src/Cake.Npm/Version/NpmVersionSettings.cs b/src/Cake.Npm/Version/NpmVersionSettings.cs index 52159ca..4c07ec0 100644 --- a/src/Cake.Npm/Version/NpmVersionSettings.cs +++ b/src/Cake.Npm/Version/NpmVersionSettings.cs @@ -14,6 +14,8 @@ public class NpmVersionSettings : NpmSettings public NpmVersionSettings() : base("version") { + // Since 'NpmVersion' returns a string we should redirect standard output. + RedirectStandardOutput = true; } } } diff --git a/src/Cake.Npm/ViewVersion/NpmViewVersionSettings.cs b/src/Cake.Npm/ViewVersion/NpmViewVersionSettings.cs new file mode 100644 index 0000000..8c337a5 --- /dev/null +++ b/src/Cake.Npm/ViewVersion/NpmViewVersionSettings.cs @@ -0,0 +1,48 @@ +namespace Cake.Npm.ViewVersion +{ + using Core; + using Core.IO; + + using System; + + /// + /// Contains settings used by . + /// + public class NpmViewVersionSettings : NpmSettings + { + /// + /// Initializes a new instance of the class. + /// + public NpmViewVersionSettings() + : base("view") + { + // Since 'NpmViewVersion' returns a string we should redirect standard output. + RedirectStandardOutput = true; + Package = "npm"; + } + + /// + /// Gets or sets the package to view the version of. + /// + /// + /// The package. + /// + public string Package { get; set; } + + /// + /// Evaluates the settings and writes them to . + /// + /// The argument builder into which the settings should be written. + protected override void EvaluateCore(ProcessArgumentBuilder args) + { + if (string.IsNullOrEmpty(Package)) + { + throw new ArgumentOutOfRangeException(nameof(Package)); + } + + base.EvaluateCore(args); + args.Append(Package); + args.Append("version"); + } + } +} diff --git a/src/Cake.Npm/ViewVersion/NpmViewVersionSettingsExtensions.cs b/src/Cake.Npm/ViewVersion/NpmViewVersionSettingsExtensions.cs new file mode 100644 index 0000000..628bf28 --- /dev/null +++ b/src/Cake.Npm/ViewVersion/NpmViewVersionSettingsExtensions.cs @@ -0,0 +1,28 @@ +namespace Cake.Npm.ViewVersion +{ + using System; + + /// + /// Extensions for . + /// + public static class NpmViewVersionSettingsExtensions + { + /// + /// Sets the package to view the version of. + /// exists on disk. + /// + /// The settings. + /// The package for which to view the version. + /// The instance with set. + public static NpmViewVersionSettings ForPackage(this NpmViewVersionSettings settings, string package) + { + if (settings == null) + { + throw new ArgumentNullException(nameof(settings)); + } + + settings.Package = package; + return settings; + } + } +} diff --git a/src/Cake.Npm/ViewVersion/NpmViewVersionTool.cs b/src/Cake.Npm/ViewVersion/NpmViewVersionTool.cs new file mode 100644 index 0000000..6e4a619 --- /dev/null +++ b/src/Cake.Npm/ViewVersion/NpmViewVersionTool.cs @@ -0,0 +1,59 @@ +namespace Cake.Npm.ViewVersion +{ + using System; + using System.Linq; + + using Core; + using Core.Diagnostics; + using Core.IO; + using Core.Tooling; + + /// + /// Tool for viewing npm package versions. + /// + public class NpmViewVersionTool : NpmTool + { + /// + /// Initializes a new instance of the class. + /// + /// The file system. + /// The environment. + /// The process runner. + /// The tool locator. + /// Cake log instance. + public NpmViewVersionTool( + IFileSystem fileSystem, + ICakeEnvironment environment, + IProcessRunner processRunner, + IToolLocator tools, + ICakeLog log) + : base(fileSystem, environment, processRunner, tools, log) + { + } + + /// + /// Views the package version from the specified settings. + /// + /// The settings. + public string Version(NpmViewVersionSettings settings) + { + if (settings == null) + { + throw new ArgumentNullException(nameof(settings)); + } + + var versionString = string.Empty; + + RunCore(settings, new ProcessSettings(), process => + { + var processOutput = process.GetStandardOutput()?.ToList(); + if (processOutput?.Any() ?? false) + { + versionString = processOutput.First(); + } + }); + + return versionString; + } + } +}