trackler 2.2.1.130 → 2.2.1.131
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/problem-specifications/exercises/crypto-square/description.md +4 -5
- data/problem-specifications/exercises/isbn-verifier/canonical-data.json +9 -1
- data/problem-specifications/exercises/kindergarten-garden/canonical-data.json +1 -4
- data/tracks/csharp/build.ps1 +46 -130
- data/tracks/csharp/build.sh +21 -70
- data/tracks/ecmascript/exercises/simple-cipher/simple-cipher.spec.js +14 -0
- data/tracks/fsharp/build.ps1 +46 -130
- data/tracks/fsharp/build.sh +21 -70
- data/tracks/fsharp/exercises/bank-account/BankAccountTest.fs +13 -12
- data/tracks/fsharp/exercises/bank-account/Example.fs +2 -2
- data/tracks/fsharp/exercises/grade-school/.meta/hints.md +1 -0
- data/tracks/fsharp/exercises/grade-school/GradeSchool.fs +6 -4
- data/tracks/fsharp/exercises/zipper/ZipperTest.fs +79 -26
- data/tracks/fsharp/generators/Common.fs +2 -0
- data/tracks/fsharp/generators/Generators.fs +100 -0
- data/tracks/java/exercises/house/.meta/src/reference/java/House.java +2 -2
- data/tracks/java/exercises/house/.meta/version +1 -1
- data/tracks/java/exercises/house/src/test/java/HouseTest.java +157 -172
- data/tracks/java/exercises/rectangles/.meta/version +1 -1
- data/tracks/java/exercises/rectangles/src/test/java/RectangleCounterTest.java +9 -1
- data/tracks/javascript/exercises/bob/bob.spec.js +1 -1
- data/tracks/javascript/exercises/bob/example.js +3 -0
- data/tracks/javascript/exercises/simple-cipher/simple-cipher.spec.js +14 -0
- data/tracks/julia/config.json +2 -2
- data/tracks/julia/exercises/nucleotide-count/example.jl +1 -1
- data/tracks/julia/exercises/nucleotide-count/runtests.jl +1 -1
- data/tracks/perl5/.travis.yml +1 -4
- data/tracks/perl5/exercises/food-chain/.meta/solutions/FoodChainSong.pm +1 -0
- data/tracks/perl5/exercises/pascals-triangle/.meta/solutions/Triangle.pm +1 -0
- data/tracks/perl5/exercises/pig-latin/.meta/solutions/PigLatin.pm +1 -0
- data/tracks/perl5/exercises/robot-simulator/.meta/solutions/Robot.pm +1 -0
- data/tracks/python/config.json +15 -0
- data/tracks/python/exercises/bowling/bowling_test.py +1 -1
- data/tracks/python/exercises/bracket-push/bracket_push_test.py +4 -1
- data/tracks/python/exercises/isbn-verifier/isbn_verifier_test.py +5 -2
- data/tracks/python/exercises/yacht/README.md +85 -0
- data/tracks/python/exercises/yacht/example.py +65 -0
- data/tracks/python/exercises/yacht/yacht.py +18 -0
- data/tracks/python/exercises/yacht/yacht_test.py +90 -0
- data/tracks/typescript/config.json +25 -0
- data/tracks/typescript/exercises/complex-numbers/README.md +64 -0
- data/tracks/typescript/exercises/complex-numbers/complex-numbers.example.ts +45 -0
- data/tracks/typescript/exercises/complex-numbers/complex-numbers.test.ts +216 -0
- data/tracks/typescript/exercises/complex-numbers/complex-numbers.ts +0 -0
- data/tracks/typescript/exercises/complex-numbers/package.json +36 -0
- data/tracks/typescript/exercises/complex-numbers/tsconfig.json +22 -0
- data/tracks/typescript/exercises/complex-numbers/tslint.json +127 -0
- data/tracks/typescript/exercises/complex-numbers/yarn.lock +2624 -0
- data/tracks/typescript/exercises/minesweeper/README.md +55 -0
- data/tracks/typescript/exercises/minesweeper/minesweeper.example.ts +58 -0
- data/tracks/typescript/exercises/minesweeper/minesweeper.test.ts +173 -0
- data/tracks/typescript/exercises/minesweeper/minesweeper.ts +0 -0
- data/tracks/typescript/exercises/minesweeper/package.json +36 -0
- data/tracks/typescript/exercises/minesweeper/tsconfig.json +22 -0
- data/tracks/typescript/exercises/minesweeper/tslint.json +127 -0
- data/tracks/typescript/exercises/minesweeper/yarn.lock +2624 -0
- data/tracks/typescript/exercises/simple-cipher/simple-cipher.test.ts +14 -0
- metadata +22 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8b2e1ba3f3af22decf9f03ccb9bc3417246da1f4
|
4
|
+
data.tar.gz: 4b348ef49dcd73c7dd8249a7bd686693358b98d7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6cc2ecafb9edbed7f8113eda045d4118afe44b8649e353aea6403b4a8f00f534b524a9d77f48ee40992696be98312d1a3e8cd205a603daffd333d7e7c6117faa
|
7
|
+
data.tar.gz: c04c86adf4afdba89a4a3b3fbd5e0fd8b006c4affa358dc5977eea660c7846e88196c155807976ff3f8e626a37d8ca98244e534bae96c1b7232c2b0a49c30921
|
data/lib/trackler/version.rb
CHANGED
@@ -43,11 +43,10 @@ The message above is coded as:
|
|
43
43
|
imtgdvsfearwermayoogoanouuiontnnlvtwttddesaohghnsseoau
|
44
44
|
```
|
45
45
|
|
46
|
-
Output the encoded text in chunks
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
`n` chunks.
|
46
|
+
Output the encoded text in chunks that fill perfect rectangles `(r X c)`,
|
47
|
+
with `c` chunks of `r` length, separated by spaces. For phrases that are
|
48
|
+
`n` characters short of the perfect rectangle, pad each of the last `n`
|
49
|
+
chunks with a single trailing space.
|
51
50
|
|
52
51
|
```text
|
53
52
|
imtgdvs fearwer mayoogo anouuio ntnnlvt wttddes aohghn sseoau
|
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"exercise": "isbn-verifier",
|
3
|
-
"version": "2.
|
3
|
+
"version": "2.4.0",
|
4
4
|
"comments": [
|
5
5
|
"An expected value of true indicates a valid ISBN-10, ",
|
6
6
|
"whereas false means the ISBN-10 is invalid."
|
@@ -117,6 +117,14 @@
|
|
117
117
|
"isbn": ""
|
118
118
|
},
|
119
119
|
"expected": false
|
120
|
+
},
|
121
|
+
{
|
122
|
+
"description": "input is 9 characters",
|
123
|
+
"property": "isValid",
|
124
|
+
"input": {
|
125
|
+
"isbn": "134456729"
|
126
|
+
},
|
127
|
+
"expected": false
|
120
128
|
}
|
121
129
|
]
|
122
130
|
}
|
data/tracks/csharp/build.ps1
CHANGED
@@ -1,149 +1,65 @@
|
|
1
1
|
<#
|
2
2
|
.SYNOPSIS
|
3
|
-
|
3
|
+
Build and test the Exercism C# exercises.
|
4
4
|
.DESCRIPTION
|
5
|
-
This
|
6
|
-
|
7
|
-
.
|
8
|
-
|
9
|
-
.PARAMETER Configuration
|
10
|
-
The build configuration to use.
|
11
|
-
.PARAMETER Verbosity
|
12
|
-
Specifies the amount of information to be displayed.
|
13
|
-
.PARAMETER WhatIf
|
14
|
-
Performs a dry run of the build script.
|
15
|
-
No tasks will be executed.
|
5
|
+
This script runs the Cake build.cake script, which does the following:
|
6
|
+
- Build each exercise's project.
|
7
|
+
- Run the exercise's tests against the example implementation.
|
8
|
+
- Run the refactoring tests against the default implementation.
|
16
9
|
.PARAMETER Exercise
|
17
|
-
The exercise to build
|
18
|
-
.
|
19
|
-
|
10
|
+
The name of the exercise to build.
|
11
|
+
.EXAMPLE
|
12
|
+
.\build.ps1
|
13
|
+
Build and test all exercises
|
14
|
+
.EXAMPLE
|
15
|
+
.\build.ps1 -Exercise anagram
|
16
|
+
Build and test only the anagram exercise
|
20
17
|
.LINK
|
21
|
-
|
18
|
+
https://github.com/exercism/csharp
|
22
19
|
#>
|
23
|
-
|
24
20
|
[CmdletBinding()]
|
25
21
|
Param(
|
26
|
-
[
|
27
|
-
[
|
28
|
-
[string]$Configuration = "Release",
|
29
|
-
[ValidateSet("Quiet", "Minimal", "Normal", "Verbose", "Diagnostic")]
|
30
|
-
[string]$Verbosity = "Normal",
|
31
|
-
[switch]$WhatIf,
|
32
|
-
[string]$Exercise,
|
33
|
-
[Parameter(Position=0,Mandatory=$false,ValueFromRemainingArguments=$true)]
|
34
|
-
[string[]]$ScriptArgs
|
22
|
+
[Parameter(Mandatory=$false)]
|
23
|
+
[string]$Exercise
|
35
24
|
)
|
36
25
|
|
37
|
-
|
26
|
+
$SCRIPT_DIR = $PSScriptRoot
|
27
|
+
$TOOLS_DIR = Join-Path $SCRIPT_DIR "tools"
|
28
|
+
$CAKE_VERSION = "0.26.1"
|
29
|
+
$CAKE_DIR = Join-Path $TOOLS_DIR "Cake.$CAKE_VERSION"
|
30
|
+
$CAKE_DLL = Join-Path $CAKE_DIR "Cake.dll"
|
31
|
+
$CAKE_ZIP = Join-Path $TOOLS_DIR "Cake.$CAKE_VERSION.zip"
|
32
|
+
$CAKE_ZIP_URL = "https://github.com/cake-build/cake/releases/download/v0.26.1/Cake-bin-coreclr-v$CAKE_VERSION.zip"
|
33
|
+
$DOTNET_VERSION = "2.0.3"
|
34
|
+
$DOTNET_DIR = Join-Path $TOOLS_DIR "dotnet.$DOTNET_VERSION"
|
35
|
+
$DOTNET_COMMAND = Join-Path $DOTNET_DIR "dotnet.exe"
|
36
|
+
$DOTNET_INSTALL_SCRIPT = Join-Path $DOTNET_DIR "dotnet-install.ps1"
|
37
|
+
$DOTNET_INSTALL_SCRIPT_URL = "https://dot.net/v1/dotnet-install.ps1"
|
38
|
+
|
39
|
+
function DownloadFile([string] $Url, [string] $Path)
|
38
40
|
{
|
39
|
-
|
40
|
-
$
|
41
|
-
$
|
42
|
-
$
|
43
|
-
return $wc
|
44
|
-
}
|
45
|
-
|
46
|
-
Write-Host "Preparing to run build script..."
|
47
|
-
|
48
|
-
if(!$PSScriptRoot){
|
49
|
-
$PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent
|
50
|
-
}
|
51
|
-
|
52
|
-
$TOOLS_DIR = Join-Path $PSScriptRoot "tools"
|
53
|
-
$NUGET_URL = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe"
|
54
|
-
$NUGET_EXE = Join-Path $TOOLS_DIR "nuget.exe"
|
55
|
-
$CAKE_VERSION = "0.21.1"
|
56
|
-
$CAKE_DLL = Join-Path $TOOLS_DIR "Cake.CoreCLR.$CAKE_VERSION/Cake.dll"
|
57
|
-
$DOTNET_DIR = Join-Path $PSScriptRoot ".dotnet"
|
58
|
-
$DOTNET_CORE_2_VERSION = "2.0.0"
|
59
|
-
$DOTNET_CORE_1_VERSION = "1.0.4"
|
60
|
-
$DOTNET_INSTALLER_SCRIPT_URL = "https://raw.githubusercontent.com/dotnet/cli/master/scripts/obtain/dotnet-install.ps1"
|
61
|
-
$DOTNET_INSTALLER_SCRIPT = Join-Path $DOTNET_DIR "dotnet-install.ps1"
|
62
|
-
|
63
|
-
$env:PATH = "$TOOLS_DIR;$DOTNET_DIR;$env:PATH"
|
64
|
-
|
65
|
-
# Make sure tools folder exists
|
66
|
-
if ((Test-Path $PSScriptRoot) -and !(Test-Path $TOOLS_DIR)) {
|
67
|
-
Write-Verbose -Message "Creating tools directory..."
|
68
|
-
New-Item -Path $TOOLS_DIR -Type directory | out-null
|
69
|
-
}
|
70
|
-
|
71
|
-
# Make sure dotnet folder exists
|
72
|
-
if ((Test-Path $PSScriptRoot) -and !(Test-Path $DOTNET_DIR)) {
|
73
|
-
Write-Verbose -Message "Creating .dotnet directory..."
|
74
|
-
New-Item -Path $DOTNET_DIR -Type directory | out-null
|
75
|
-
}
|
76
|
-
|
77
|
-
# Try download .NET installer script if not exists
|
78
|
-
if (!(Test-Path $DOTNET_INSTALLER_SCRIPT)) {
|
79
|
-
Write-Verbose -Message "Downloading .NET installer script..."
|
80
|
-
try {
|
81
|
-
$wc = GetProxyEnabledWebClient
|
82
|
-
$wc.DownloadFile($DOTNET_INSTALLER_SCRIPT_URL, $DOTNET_INSTALLER_SCRIPT)
|
83
|
-
} catch {
|
84
|
-
Throw "Could not download .NET installer script."
|
85
|
-
}
|
86
|
-
}
|
87
|
-
|
88
|
-
# Install .NET Core runtimes
|
89
|
-
Invoke-Expression "&`"$DOTNET_INSTALLER_SCRIPT`" -Version $DOTNET_CORE_1_VERSION -InstallDir `"$DOTNET_DIR`""
|
90
|
-
Invoke-Expression "&`"$DOTNET_INSTALLER_SCRIPT`" -Version $DOTNET_CORE_2_VERSION -InstallDir `"$DOTNET_DIR`""
|
91
|
-
$env:DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1
|
92
|
-
$env:DOTNET_CLI_TELEMETRY_OPTOUT=1
|
93
|
-
|
94
|
-
# Try find NuGet.exe in path if not exists
|
95
|
-
if (!(Test-Path $NUGET_EXE)) {
|
96
|
-
Write-Verbose -Message "Trying to find nuget.exe in PATH..."
|
97
|
-
$existingPaths = $Env:Path -Split ';' | Where-Object { (![string]::IsNullOrEmpty($_)) -and (Test-Path $_ -PathType Container) }
|
98
|
-
$NUGET_EXE_IN_PATH = Get-ChildItem -Path $existingPaths -Filter "nuget.exe" | Select -First 1
|
99
|
-
if ($NUGET_EXE_IN_PATH -ne $null -and (Test-Path $NUGET_EXE_IN_PATH.FullName)) {
|
100
|
-
Write-Verbose -Message "Found in PATH at $($NUGET_EXE_IN_PATH.FullName)."
|
101
|
-
$NUGET_EXE = $NUGET_EXE_IN_PATH.FullName
|
102
|
-
}
|
103
|
-
}
|
104
|
-
|
105
|
-
# Try download NuGet.exe if not exists
|
106
|
-
if (!(Test-Path $NUGET_EXE)) {
|
107
|
-
Write-Verbose -Message "Downloading NuGet.exe..."
|
108
|
-
try {
|
109
|
-
$wc = GetProxyEnabledWebClient
|
110
|
-
$wc.DownloadFile($NUGET_URL, $NUGET_EXE)
|
111
|
-
} catch {
|
112
|
-
Throw "Could not download NuGet.exe."
|
113
|
-
}
|
41
|
+
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
42
|
+
$webClient = New-Object System.Net.WebClient
|
43
|
+
$webClient.Proxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials
|
44
|
+
$webClient.DownloadFile($Url, $Path)
|
114
45
|
}
|
115
46
|
|
116
|
-
#
|
117
|
-
$ENV:NUGET_EXE = $NUGET_EXE
|
118
|
-
|
119
|
-
# Try install Cake
|
47
|
+
# Ensure Cake is installed
|
120
48
|
if (!(Test-Path $CAKE_DLL)) {
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
Throw "Could not install Cake."
|
126
|
-
}
|
127
|
-
|
128
|
-
Write-Verbose -Message ($NuGetOutput | out-string)
|
49
|
+
New-Item -ItemType Directory -Force -Path $CAKE_DIR | Out-Null
|
50
|
+
DownloadFile -Url $CAKE_ZIP_URL -Path $CAKE_ZIP
|
51
|
+
Expand-Archive $CAKE_ZIP -DestinationPath $CAKE_DIR | Out-Null
|
52
|
+
Remove-Item -Force -Path $CAKE_ZIP | Out-Null
|
129
53
|
}
|
130
54
|
|
131
|
-
#
|
132
|
-
if (!(Test-Path $
|
133
|
-
|
55
|
+
# Ensure .NET Core runtime is installed
|
56
|
+
if (!(Test-Path $DOTNET_COMMAND)) {
|
57
|
+
New-Item -ItemType Directory -Force -Path $DOTNET_DIR | Out-Null
|
58
|
+
DownloadFile -Url $DOTNET_INSTALL_SCRIPT_URL -Path $DOTNET_INSTALL_SCRIPT
|
59
|
+
Invoke-Expression "&`"$DOTNET_INSTALL_SCRIPT`" -Version $DOTNET_VERSION -InstallDir `"$DOTNET_DIR`" -NoPath"
|
60
|
+
Remove-Item -Force -Path $DOTNET_INSTALL_SCRIPT | Out-Null
|
134
61
|
}
|
135
62
|
|
136
|
-
# Build Cake arguments
|
137
63
|
$cakeArguments = @("$Script");
|
138
|
-
if ($
|
139
|
-
|
140
|
-
if ($Verbosity) { $cakeArguments += "-verbosity=$Verbosity" }
|
141
|
-
if ($ShowDescription) { $cakeArguments += "-showdescription" }
|
142
|
-
if ($DryRun) { $cakeArguments += "-dryrun" }
|
143
|
-
if ($Exercise) { $cakeArguments += "-exercise=$Exercise" }
|
144
|
-
$cakeArguments += $ScriptArgs
|
145
|
-
|
146
|
-
# Start Cake
|
147
|
-
Write-Host "Running build script..."
|
148
|
-
Invoke-Expression "&dotnet `"$CAKE_DLL`" $cakeArguments"
|
149
|
-
exit $LASTEXITCODE
|
64
|
+
if ($Exercise) { $cakeArguments += "--exercise=$Exercise" }
|
65
|
+
Invoke-Expression "&$DOTNET_COMMAND `"$CAKE_DLL`" $cakeArguments"
|
data/tracks/csharp/build.sh
CHANGED
@@ -1,82 +1,33 @@
|
|
1
1
|
#!/usr/bin/env bash
|
2
2
|
|
3
|
-
# Define directories.
|
4
3
|
SCRIPT_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
|
5
4
|
TOOLS_DIR=$SCRIPT_DIR/tools
|
6
|
-
CAKE_VERSION=0.
|
7
|
-
CAKE_DIR=$TOOLS_DIR/Cake
|
5
|
+
CAKE_VERSION=0.26.1
|
6
|
+
CAKE_DIR=$TOOLS_DIR/Cake.$CAKE_VERSION
|
8
7
|
CAKE_DLL=$CAKE_DIR/Cake.dll
|
9
|
-
CAKE_ZIP=$TOOLS_DIR/Cake
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
#
|
18
|
-
TARGET="Default"
|
19
|
-
CONFIGURATION="Release"
|
20
|
-
VERBOSITY="Normal"
|
21
|
-
DRYRUN=
|
22
|
-
CAKE_ARGUMENTS=()
|
23
|
-
|
24
|
-
# Parse arguments.
|
25
|
-
for i in "$@"; do
|
26
|
-
case $1 in
|
27
|
-
-t|--target) TARGET="$2"; shift ;;
|
28
|
-
-c|--configuration) CONFIGURATION="$2"; shift ;;
|
29
|
-
-v|--verbosity) VERBOSITY="$2"; shift ;;
|
30
|
-
-d|--dryrun) DRYRUN="-dryrun" ;;
|
31
|
-
--) shift; CAKE_ARGUMENTS+=("$@"); break ;;
|
32
|
-
*) CAKE_ARGUMENTS+=("$1") ;;
|
33
|
-
esac
|
34
|
-
shift
|
35
|
-
done
|
36
|
-
|
37
|
-
# Make sure the tools folder exist.
|
38
|
-
if [ ! -d "$TOOLS_DIR" ]; then
|
39
|
-
mkdir "$TOOLS_DIR"
|
40
|
-
fi
|
41
|
-
|
42
|
-
# Make sure the dotnet folder exist.
|
43
|
-
if [ ! -d "$DOTNET_DIR" ]; then
|
44
|
-
mkdir "$DOTNET_DIR"
|
45
|
-
fi
|
46
|
-
|
47
|
-
# Download .NET installer script if it does not exist.
|
48
|
-
if [ ! -f "$DOTNET_INSTALLER_SCRIPT" ]; then
|
49
|
-
echo "Downloading .NET installer script..."
|
50
|
-
curl -Lsfo "$DOTNET_INSTALLER_SCRIPT" $DOTNET_INSTALLER_SCRIPT_URL
|
51
|
-
if [ $? -ne 0 ]; then
|
52
|
-
echo "An error occured while downloading .NET installer script."
|
53
|
-
exit 1
|
54
|
-
fi
|
55
|
-
fi
|
56
|
-
|
57
|
-
# Install .NET Core runtimes
|
58
|
-
$DOTNET_INSTALLER_SCRIPT --version $DOTNET_CORE_1_VERSION --install-dir "$DOTNET_DIR" --no-path
|
59
|
-
$DOTNET_INSTALLER_SCRIPT --version $DOTNET_CORE_2_VERSION --install-dir "$DOTNET_DIR" --no-path
|
60
|
-
export PATH="$DOTNET_DIR":$PATH
|
61
|
-
export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1
|
62
|
-
export DOTNET_CLI_TELEMETRY_OPTOUT=1
|
63
|
-
|
64
|
-
# Install Cake
|
8
|
+
CAKE_ZIP=$TOOLS_DIR/Cake.$CAKE_VERSION.zip
|
9
|
+
CAKE_ZIP_URL=https://github.com/cake-build/cake/releases/download/v0.26.1/Cake-bin-coreclr-v$CAKE_VERSION.zip
|
10
|
+
DOTNET_VERSION=2.0.3
|
11
|
+
DOTNET_DIR=$TOOLS_DIR/dotnet.$DOTNET_VERSION
|
12
|
+
DOTNET_COMMAND=$DOTNET_DIR/dotnet
|
13
|
+
DOTNET_INSTALL_SCRIPT=$DOTNET_DIR/dotnet-install.sh
|
14
|
+
DOTNET_INSTALL_SCRIPT_URL=https://dot.net/v1/dotnet-install.sh
|
15
|
+
|
16
|
+
# Ensure Cake is installed
|
65
17
|
if [ ! -f "$CAKE_DLL" ]; then
|
66
|
-
|
18
|
+
mkdir -p $CAKE_DIR
|
19
|
+
curl -Lsfo "$CAKE_ZIP" "$CAKE_ZIP_URL"
|
67
20
|
unzip -q "$CAKE_ZIP" -d "$CAKE_DIR"
|
68
21
|
rm -f "$CAKE_ZIP"
|
69
|
-
if [ $? -ne 0 ]; then
|
70
|
-
echo "An error occured while installing Cake."
|
71
|
-
exit 1
|
72
|
-
fi
|
73
22
|
fi
|
74
23
|
|
75
|
-
#
|
76
|
-
if [ ! -f "$
|
77
|
-
|
78
|
-
|
24
|
+
# Ensure .NET Core runtime is installed
|
25
|
+
if [ ! -f "$DOTNET_COMMAND" ]; then
|
26
|
+
mkdir -p $DOTNET_DIR
|
27
|
+
curl -Lsfo "$DOTNET_INSTALL_SCRIPT" "$DOTNET_INSTALL_SCRIPT_URL"
|
28
|
+
chmod u+x $DOTNET_INSTALL_SCRIPT
|
29
|
+
$DOTNET_INSTALL_SCRIPT --version $DOTNET_VERSION --install-dir "$DOTNET_DIR" --no-path
|
30
|
+
rm -f $DOTNET_INSTALL_SCRIPT
|
79
31
|
fi
|
80
32
|
|
81
|
-
|
82
|
-
dotnet "$CAKE_DLL" --verbosity="$VERBOSITY" --configuration="$CONFIGURATION" --target="$TARGET" $DRYRUN "${CAKE_ARGUMENTS[@]}"
|
33
|
+
$DOTNET_COMMAND "$CAKE_DLL" "$@"
|
@@ -1,5 +1,15 @@
|
|
1
1
|
import Cipher from './simple-cipher';
|
2
2
|
|
3
|
+
describe('Random key generation', () => {
|
4
|
+
xtest('generates keys at random', () => {
|
5
|
+
// Strictly speaking, this is difficult to test with 100% certainty.
|
6
|
+
// But, if you have a generator that generates 100-character-long
|
7
|
+
// strings of lowercase letters at random, the odds of two consecutively
|
8
|
+
// generated keys being identical are astronomically low.
|
9
|
+
expect(new Cipher().key).not.toEqual(new Cipher().key);
|
10
|
+
});
|
11
|
+
});
|
12
|
+
|
3
13
|
describe('Random key cipher', () => {
|
4
14
|
const cipher = new Cipher();
|
5
15
|
|
@@ -7,6 +17,10 @@ describe('Random key cipher', () => {
|
|
7
17
|
expect(cipher.key).toMatch(/^[a-z]+$/);
|
8
18
|
});
|
9
19
|
|
20
|
+
xtest('has a key that is at least 100 characters long', () => {
|
21
|
+
expect(cipher.key.length).toBeGreaterThanOrEqual(100);
|
22
|
+
});
|
23
|
+
|
10
24
|
// Here we take advantage of the fact that plaintext of "aaa..."
|
11
25
|
// outputs the key. This is a critical problem with shift ciphers, some
|
12
26
|
// characters will always output the key verbatim.
|
data/tracks/fsharp/build.ps1
CHANGED
@@ -1,149 +1,65 @@
|
|
1
1
|
<#
|
2
2
|
.SYNOPSIS
|
3
|
-
|
3
|
+
Build and test the Exercism F# exercises.
|
4
4
|
.DESCRIPTION
|
5
|
-
This
|
6
|
-
|
7
|
-
.
|
8
|
-
|
9
|
-
.PARAMETER Configuration
|
10
|
-
The build configuration to use.
|
11
|
-
.PARAMETER Verbosity
|
12
|
-
Specifies the amount of information to be displayed.
|
13
|
-
.PARAMETER WhatIf
|
14
|
-
Performs a dry run of the build script.
|
15
|
-
No tasks will be executed.
|
5
|
+
This script runs the Cake build.cake script, which does the following:
|
6
|
+
- Build each exercise's project.
|
7
|
+
- Run the exercise's tests against the example implementation.
|
8
|
+
- Run the refactoring tests against the default implementation.
|
16
9
|
.PARAMETER Exercise
|
17
|
-
The exercise to build
|
18
|
-
.
|
19
|
-
|
10
|
+
The name of the exercise to build.
|
11
|
+
.EXAMPLE
|
12
|
+
.\build.ps1
|
13
|
+
Build and test all exercises
|
14
|
+
.EXAMPLE
|
15
|
+
.\build.ps1 -Exercise anagram
|
16
|
+
Build and test only the anagram exercise
|
20
17
|
.LINK
|
21
|
-
|
18
|
+
https://github.com/exercism/fsharp
|
22
19
|
#>
|
23
|
-
|
24
20
|
[CmdletBinding()]
|
25
21
|
Param(
|
26
|
-
[
|
27
|
-
[
|
28
|
-
[string]$Configuration = "Release",
|
29
|
-
[ValidateSet("Quiet", "Minimal", "Normal", "Verbose", "Diagnostic")]
|
30
|
-
[string]$Verbosity = "Normal",
|
31
|
-
[switch]$WhatIf,
|
32
|
-
[string]$Exercise,
|
33
|
-
[Parameter(Position=0,Mandatory=$false,ValueFromRemainingArguments=$true)]
|
34
|
-
[string[]]$ScriptArgs
|
22
|
+
[Parameter(Mandatory=$false)]
|
23
|
+
[string]$Exercise
|
35
24
|
)
|
36
25
|
|
37
|
-
|
26
|
+
$SCRIPT_DIR = $PSScriptRoot
|
27
|
+
$TOOLS_DIR = Join-Path $SCRIPT_DIR "tools"
|
28
|
+
$CAKE_VERSION = "0.26.1"
|
29
|
+
$CAKE_DIR = Join-Path $TOOLS_DIR "Cake.$CAKE_VERSION"
|
30
|
+
$CAKE_DLL = Join-Path $CAKE_DIR "Cake.dll"
|
31
|
+
$CAKE_ZIP = Join-Path $TOOLS_DIR "Cake.$CAKE_VERSION.zip"
|
32
|
+
$CAKE_ZIP_URL = "https://github.com/cake-build/cake/releases/download/v0.26.1/Cake-bin-coreclr-v$CAKE_VERSION.zip"
|
33
|
+
$DOTNET_VERSION = "2.0.3"
|
34
|
+
$DOTNET_DIR = Join-Path $TOOLS_DIR "dotnet.$DOTNET_VERSION"
|
35
|
+
$DOTNET_COMMAND = Join-Path $DOTNET_DIR "dotnet.exe"
|
36
|
+
$DOTNET_INSTALL_SCRIPT = Join-Path $DOTNET_DIR "dotnet-install.ps1"
|
37
|
+
$DOTNET_INSTALL_SCRIPT_URL = "https://dot.net/v1/dotnet-install.ps1"
|
38
|
+
|
39
|
+
function DownloadFile([string] $Url, [string] $Path)
|
38
40
|
{
|
39
|
-
|
40
|
-
$
|
41
|
-
$
|
42
|
-
$
|
43
|
-
return $wc
|
44
|
-
}
|
45
|
-
|
46
|
-
Write-Host "Preparing to run build script..."
|
47
|
-
|
48
|
-
if(!$PSScriptRoot){
|
49
|
-
$PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent
|
50
|
-
}
|
51
|
-
|
52
|
-
$TOOLS_DIR = Join-Path $PSScriptRoot "tools"
|
53
|
-
$NUGET_URL = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe"
|
54
|
-
$NUGET_EXE = Join-Path $TOOLS_DIR "nuget.exe"
|
55
|
-
$CAKE_VERSION = "0.21.1"
|
56
|
-
$CAKE_DLL = Join-Path $TOOLS_DIR "Cake.CoreCLR.$CAKE_VERSION/Cake.dll"
|
57
|
-
$DOTNET_DIR = Join-Path $PSScriptRoot ".dotnet"
|
58
|
-
$DOTNET_CORE_2_VERSION = "2.0.0"
|
59
|
-
$DOTNET_CORE_1_VERSION = "1.0.4"
|
60
|
-
$DOTNET_INSTALLER_SCRIPT_URL = "https://raw.githubusercontent.com/dotnet/cli/master/scripts/obtain/dotnet-install.ps1"
|
61
|
-
$DOTNET_INSTALLER_SCRIPT = Join-Path $DOTNET_DIR "dotnet-install.ps1"
|
62
|
-
|
63
|
-
$env:PATH = "$TOOLS_DIR;$DOTNET_DIR;$env:PATH"
|
64
|
-
|
65
|
-
# Make sure tools folder exists
|
66
|
-
if ((Test-Path $PSScriptRoot) -and !(Test-Path $TOOLS_DIR)) {
|
67
|
-
Write-Verbose -Message "Creating tools directory..."
|
68
|
-
New-Item -Path $TOOLS_DIR -Type directory | out-null
|
69
|
-
}
|
70
|
-
|
71
|
-
# Make sure dotnet folder exists
|
72
|
-
if ((Test-Path $PSScriptRoot) -and !(Test-Path $DOTNET_DIR)) {
|
73
|
-
Write-Verbose -Message "Creating .dotnet directory..."
|
74
|
-
New-Item -Path $DOTNET_DIR -Type directory | out-null
|
75
|
-
}
|
76
|
-
|
77
|
-
# Try download .NET installer script if not exists
|
78
|
-
if (!(Test-Path $DOTNET_INSTALLER_SCRIPT)) {
|
79
|
-
Write-Verbose -Message "Downloading .NET installer script..."
|
80
|
-
try {
|
81
|
-
$wc = GetProxyEnabledWebClient
|
82
|
-
$wc.DownloadFile($DOTNET_INSTALLER_SCRIPT_URL, $DOTNET_INSTALLER_SCRIPT)
|
83
|
-
} catch {
|
84
|
-
Throw "Could not download .NET installer script."
|
85
|
-
}
|
86
|
-
}
|
87
|
-
|
88
|
-
# Install .NET Core runtimes
|
89
|
-
Invoke-Expression "&`"$DOTNET_INSTALLER_SCRIPT`" -Version $DOTNET_CORE_1_VERSION -InstallDir `"$DOTNET_DIR`""
|
90
|
-
Invoke-Expression "&`"$DOTNET_INSTALLER_SCRIPT`" -Version $DOTNET_CORE_2_VERSION -InstallDir `"$DOTNET_DIR`""
|
91
|
-
$env:DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1
|
92
|
-
$env:DOTNET_CLI_TELEMETRY_OPTOUT=1
|
93
|
-
|
94
|
-
# Try find NuGet.exe in path if not exists
|
95
|
-
if (!(Test-Path $NUGET_EXE)) {
|
96
|
-
Write-Verbose -Message "Trying to find nuget.exe in PATH..."
|
97
|
-
$existingPaths = $Env:Path -Split ';' | Where-Object { (![string]::IsNullOrEmpty($_)) -and (Test-Path $_ -PathType Container) }
|
98
|
-
$NUGET_EXE_IN_PATH = Get-ChildItem -Path $existingPaths -Filter "nuget.exe" | Select -First 1
|
99
|
-
if ($NUGET_EXE_IN_PATH -ne $null -and (Test-Path $NUGET_EXE_IN_PATH.FullName)) {
|
100
|
-
Write-Verbose -Message "Found in PATH at $($NUGET_EXE_IN_PATH.FullName)."
|
101
|
-
$NUGET_EXE = $NUGET_EXE_IN_PATH.FullName
|
102
|
-
}
|
103
|
-
}
|
104
|
-
|
105
|
-
# Try download NuGet.exe if not exists
|
106
|
-
if (!(Test-Path $NUGET_EXE)) {
|
107
|
-
Write-Verbose -Message "Downloading NuGet.exe..."
|
108
|
-
try {
|
109
|
-
$wc = GetProxyEnabledWebClient
|
110
|
-
$wc.DownloadFile($NUGET_URL, $NUGET_EXE)
|
111
|
-
} catch {
|
112
|
-
Throw "Could not download NuGet.exe."
|
113
|
-
}
|
41
|
+
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
42
|
+
$webClient = New-Object System.Net.WebClient
|
43
|
+
$webClient.Proxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials
|
44
|
+
$webClient.DownloadFile($Url, $Path)
|
114
45
|
}
|
115
46
|
|
116
|
-
#
|
117
|
-
$ENV:NUGET_EXE = $NUGET_EXE
|
118
|
-
|
119
|
-
# Try install Cake
|
47
|
+
# Ensure Cake is installed
|
120
48
|
if (!(Test-Path $CAKE_DLL)) {
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
Throw "Could not install Cake."
|
126
|
-
}
|
127
|
-
|
128
|
-
Write-Verbose -Message ($NuGetOutput | out-string)
|
49
|
+
New-Item -ItemType Directory -Force -Path $CAKE_DIR | Out-Null
|
50
|
+
DownloadFile -Url $CAKE_ZIP_URL -Path $CAKE_ZIP
|
51
|
+
Expand-Archive $CAKE_ZIP -DestinationPath $CAKE_DIR | Out-Null
|
52
|
+
Remove-Item -Force -Path $CAKE_ZIP | Out-Null
|
129
53
|
}
|
130
54
|
|
131
|
-
#
|
132
|
-
if (!(Test-Path $
|
133
|
-
|
55
|
+
# Ensure .NET Core runtime is installed
|
56
|
+
if (!(Test-Path $DOTNET_COMMAND)) {
|
57
|
+
New-Item -ItemType Directory -Force -Path $DOTNET_DIR | Out-Null
|
58
|
+
DownloadFile -Url $DOTNET_INSTALL_SCRIPT_URL -Path $DOTNET_INSTALL_SCRIPT
|
59
|
+
Invoke-Expression "&`"$DOTNET_INSTALL_SCRIPT`" -Version $DOTNET_VERSION -InstallDir `"$DOTNET_DIR`" -NoPath"
|
60
|
+
Remove-Item -Force -Path $DOTNET_INSTALL_SCRIPT | Out-Null
|
134
61
|
}
|
135
62
|
|
136
|
-
# Build Cake arguments
|
137
63
|
$cakeArguments = @("$Script");
|
138
|
-
if ($
|
139
|
-
|
140
|
-
if ($Verbosity) { $cakeArguments += "-verbosity=$Verbosity" }
|
141
|
-
if ($ShowDescription) { $cakeArguments += "-showdescription" }
|
142
|
-
if ($DryRun) { $cakeArguments += "-dryrun" }
|
143
|
-
if ($Exercise) { $cakeArguments += "-exercise=$Exercise" }
|
144
|
-
$cakeArguments += $ScriptArgs
|
145
|
-
|
146
|
-
# Start Cake
|
147
|
-
Write-Host "Running build script..."
|
148
|
-
Invoke-Expression "&dotnet `"$CAKE_DLL`" $cakeArguments"
|
149
|
-
exit $LASTEXITCODE
|
64
|
+
if ($Exercise) { $cakeArguments += "--exercise=$Exercise" }
|
65
|
+
Invoke-Expression "&$DOTNET_COMMAND `"$CAKE_DLL`" $cakeArguments"
|