Skip to content

Commit

Permalink
Merge branch 'release/3.0.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
pascalberger committed Mar 31, 2020
2 parents 4ac62a3 + 90af0a4 commit 2377b2c
Show file tree
Hide file tree
Showing 24 changed files with 704 additions and 125 deletions.
4 changes: 4 additions & 0 deletions .appveyor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
3 changes: 3 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# These owners will be the default owners for everything in the repo and
# will be requested for review when someone opens a pull request.
* @stefan-lindegger @Speeedy01 @marco-bertschi @pascalberger @christianbumann @x-jokay @silanosa @georgesgoetz
8 changes: 8 additions & 0 deletions .whitesource
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"generalSettings": {
"shouldScanRepo": true
},
"checkRunSettings": {
"vulnerableCheckRunConclusionLevel": "failure"
}
}
119 changes: 85 additions & 34 deletions build.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -18,19 +21,22 @@ 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()]
Expand All @@ -41,9 +47,10 @@ Param(
[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)]
Expand Down Expand Up @@ -75,38 +82,31 @@ 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){
$PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent
}

$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)) {
Expand All @@ -117,15 +117,17 @@ 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 {
try {
$wc = GetProxyEnabledWebClient
$wc.DownloadFile("https://cakebuild.net/download/bootstrapper/packages", $PACKAGES_CONFIG) } catch {
Throw "Could not download 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)."
Expand All @@ -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."
}
Expand All @@ -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
}

Expand All @@ -178,7 +216,20 @@ 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
2 changes: 1 addition & 1 deletion docs/input/_Navbar.cshtml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
List<Tuple<string, string>> pages = new List<Tuple<string, string>>
{
Tuple.Create("Documentation", Context.GetLink("docs")),
Tuple.Create("API", Context.GetLink("api/BBT.Maybe"))
Tuple.Create("API", Context.GetLink("api/BBT.MaybePattern"))
};
foreach(Tuple<string, string> p in pages)
{
Expand Down
17 changes: 17 additions & 0 deletions docs/input/assets/css/override.less
Original file line number Diff line number Diff line change
Expand Up @@ -119,4 +119,21 @@ pre:hover .btn-copy {
a, a:active, a:hover, a:focus {
color: #fff;
}
}

/* For feature list */

.feature-list li {
display: block;
}

.feature-list li:before {
/*Using a Bootstrap glyphicon as the bullet point*/
content: "\e013";
font-family: 'Glyphicons Halflings';
font-size: 12px;
float: left;
margin-top: 1px;
margin-left: -25px;
color: green;
}
7 changes: 7 additions & 0 deletions docs/input/docs/getting-started/index.cshtml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
Order: 10
Description: Overview about the features of BBT.Maybe.
---
<p>@Html.Raw(Model.String(DocsKeys.Description))</p>

@Html.Partial("_ChildPages")
24 changes: 24 additions & 0 deletions docs/input/docs/getting-started/principles.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
---
Order: 20
Title: Core principles
Description: Core principles of BBT.Maybe
---

C# does not (yet) include a language construct for null safe treatment of optional reference-type variables.
Therefore every method argument, return value, class member, property and local variable is a challenge, because a value may or may not be assigned.
A possible solution is implementing a null condition for each reference call with an if clause.
This contradicts the fail fast approach, makes code less readable and increases cyclomatic complexity.
A better approach is to introduce a functional option type.

# Advantages

* Explicit method signature: Declaration of optional reference type argument and return value through a typified construct make method documentation redundant.
* Prevention of null reference exceptions: Straight access to the nullable reference value is not possible, an action for the not-null case is called instead.

# Implementation details

* Maybe is a value type
* Default of maybe is the null case
* Maybe supports actions for handling the null and the not null case
* Maybe is serializable
* Provides factory methods for maybe
20 changes: 20 additions & 0 deletions docs/input/docs/getting-started/whymaybe.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
---
Order: 10
Title: Why does BBT.Maybe exist?
Description: Introduction to BBT.Maybe, what problems are solved and how it's distinctive from other functional option type implementations
---

BBT.Maybe is an implementation of the functional option type pattern.

# Features

* Makes nullable references explicit
* Prevents null reference exceptions on reference calls
* Provides an option type with broad usage over all layers of code

# Advantages over similar libraries

* Prevents access to null value, therefore no direct access is offered.
* Implementation of maybe for both optional reference and nullable value types
* Reduction to core functionality prevents bloated feature set
* Usage of maybe in communication layer
Loading

0 comments on commit 2377b2c

Please sign in to comment.