diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json
new file mode 100644
index 00000000..4f05b376
--- /dev/null
+++ b/.config/dotnet-tools.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "isRoot": true,
+ "tools": {
+ "paket": {
+ "version": "6.0.0",
+ "commands": [
+ "paket"
+ ]
+ },
+ "fake-cli": {
+ "version": "5.20.4",
+ "commands": [
+ "fake"
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/.github/workflows/dotnetcore.yml b/.github/workflows/dotnetcore.yml
new file mode 100644
index 00000000..783ea116
--- /dev/null
+++ b/.github/workflows/dotnetcore.yml
@@ -0,0 +1,32 @@
+name: Build and Test
+
+on:
+ push:
+ branches:
+ - master
+ pull_request:
+ branches:
+ - master
+
+jobs:
+ build:
+
+ strategy:
+ fail-fast: false
+ matrix:
+ os: [ubuntu-latest, windows-latest, macOS-latest]
+ dotnet: [5.0.302]
+ runs-on: ${{ matrix.os }}
+
+ steps:
+ - uses: actions/checkout@v1
+ - name: Setup .NET Core
+ uses: actions/setup-dotnet@v1
+ with:
+ dotnet-version: ${{ matrix.dotnet }}
+ - name: Install local tools
+ run: dotnet tool restore
+ - name: Paket Restore
+ run: dotnet paket restore
+ - name: Build and Test
+ run: dotnet fake run build.fsx
diff --git a/.gitignore b/.gitignore
index c7ad1b0e..80bc9e69 100644
--- a/.gitignore
+++ b/.gitignore
@@ -158,6 +158,9 @@ $RECYCLE.BIN/
# Exclude F# project specific directories and files
# ===================================================
+.idea/
+.vs/
+
# NuGet Packages Directory
packages/
@@ -171,6 +174,9 @@ temp/
TestResults.xml
release.cmd
nuget/
+.paket/
+.fake/
+.ionide/
# Nuget outputs
nuget/*.nupkg
diff --git a/.paket/Paket.Restore.targets b/.paket/Paket.Restore.targets
deleted file mode 100644
index 55292f31..00000000
--- a/.paket/Paket.Restore.targets
+++ /dev/null
@@ -1,296 +0,0 @@
-
-
-
-
-
-
- $(MSBuildAllProjects);$(MSBuildThisFileFullPath)
-
- true
- $(MSBuildThisFileDirectory)
- $(MSBuildThisFileDirectory)..\
- $(PaketRootPath)paket-files\paket.restore.cached
- $(PaketRootPath)paket.lock
- /Library/Frameworks/Mono.framework/Commands/mono
- mono
-
- $(PaketRootPath)paket.exe
- $(PaketToolsPath)paket.exe
- "$(PaketExePath)"
- $(MonoPath) --runtime=v4.0.30319 "$(PaketExePath)"
-
-
- <_PaketExeExtension>$([System.IO.Path]::GetExtension("$(PaketExePath)"))
- dotnet "$(PaketExePath)"
-
-
- "$(PaketExePath)"
-
- $(PaketRootPath)paket.bootstrapper.exe
- $(PaketToolsPath)paket.bootstrapper.exe
- "$(PaketBootStrapperExePath)"
- $(MonoPath) --runtime=v4.0.30319 "$(PaketBootStrapperExePath)"
-
-
-
-
- true
- true
-
-
-
-
-
-
- true
- $(NoWarn);NU1603;NU1604;NU1605;NU1608
-
-
-
-
- /usr/bin/shasum "$(PaketRestoreCacheFile)" | /usr/bin/awk '{ print $1 }'
- /usr/bin/shasum "$(PaketLockFilePath)" | /usr/bin/awk '{ print $1 }'
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- $([System.IO.File]::ReadAllText('$(PaketRestoreCacheFile)'))
- $([System.IO.File]::ReadAllText('$(PaketLockFilePath)'))
- true
- false
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- $(MSBuildProjectDirectory)\obj\$(MSBuildProjectFile).paket.references.cached
-
- $(MSBuildProjectFullPath).paket.references
-
- $(MSBuildProjectDirectory)\$(MSBuildProjectName).paket.references
-
- $(MSBuildProjectDirectory)\paket.references
-
- false
- true
- true
- references-file-or-cache-not-found
-
-
-
-
- $([System.IO.File]::ReadAllText('$(PaketReferencesCachedFilePath)'))
- $([System.IO.File]::ReadAllText('$(PaketOriginalReferencesFilePath)'))
- references-file
- false
-
-
-
-
- false
-
-
-
-
- true
- target-framework '$(TargetFramework)' or '$(TargetFrameworks)' files @(PaketResolvedFilePaths)
-
-
-
-
-
-
-
-
-
- false
- true
-
-
-
-
-
-
-
-
-
-
- $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[0])
- $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[1])
- $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[4])
-
-
- %(PaketReferencesFileLinesInfo.PackageVersion)
- All
- runtime
- true
-
-
-
-
- $(MSBuildProjectDirectory)/obj/$(MSBuildProjectFile).paket.clitools
-
-
-
-
-
-
-
-
- $([System.String]::Copy('%(PaketCliToolFileLines.Identity)').Split(',')[0])
- $([System.String]::Copy('%(PaketCliToolFileLines.Identity)').Split(',')[1])
-
-
- %(PaketCliToolFileLinesInfo.PackageVersion)
-
-
-
-
-
-
-
-
-
- false
-
-
-
-
-
- <_NuspecFilesNewLocation Include="$(BaseIntermediateOutputPath)$(Configuration)\*.nuspec"/>
-
-
-
- $(MSBuildProjectDirectory)/$(MSBuildProjectFile)
- true
- false
- true
- $(BaseIntermediateOutputPath)$(Configuration)
- $(BaseIntermediateOutputPath)
-
-
-
- <_NuspecFiles Include="$(AdjustedNuspecOutputPath)\*.nuspec"/>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.paket/paket.exe b/.paket/paket.exe
deleted file mode 100644
index b98e000b..00000000
Binary files a/.paket/paket.exe and /dev/null differ
diff --git a/.paket/paket.targets b/.paket/paket.targets
deleted file mode 100644
index 22c9f0a8..00000000
--- a/.paket/paket.targets
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
- true
-
- true
- $(MSBuildThisFileDirectory)
- $(MSBuildThisFileDirectory)..\
-
-
-
- $(PaketToolsPath)paket.exe
- $(PaketToolsPath)paket.bootstrapper.exe
- "$(PaketExePath)"
- mono --runtime=v4.0.30319 $(PaketExePath)
- "$(PaketBootStrapperExePath)"
- mono --runtime=v4.0.30319 $(PaketBootStrapperExePath)
-
- $(MSBuildProjectDirectory)\paket.references
- $(MSBuildProjectFullPath).paket.references
- $(PaketCommand) restore --references-files "$(PaketReferences)"
- $(PaketBootStrapperCommand)
-
- RestorePackages; $(BuildDependsOn);
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 9b785a16..00000000
--- a/.travis.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-language: csharp
-
-sudo: false # use the new container-based Travis infrastructure
-
-script:
- - ./build.sh
\ No newline at end of file
diff --git a/FSharp.Configuration.Tests.dll.TestResults.xml b/FSharp.Configuration.Tests.dll.TestResults.xml
deleted file mode 100644
index 4d6eb802..00000000
--- a/FSharp.Configuration.Tests.dll.TestResults.xml
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/FSharp.Configuration.nuspec b/FSharp.Configuration.nuspec
deleted file mode 100644
index eed6ed15..00000000
--- a/FSharp.Configuration.nuspec
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
- @project@
- @build.number@
- @authors@
- @authors@
- http://github.com/fsprojects/FSharp.Configuration/blob/master/LICENSE.txt
- http://fsprojects.github.com/FSharp.Configuration
- https://raw.githubusercontent.com/fsprojects/FSharp.Configuration/master/docs/files/img/logo.png
- false
- @summary@
- @description@
- @releaseNotes@
- Copyright 2014-2018
- @tags@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/FSharp.Configuration.sln b/FSharp.Configuration.sln
index df6ccb5d..166e42b3 100644
--- a/FSharp.Configuration.sln
+++ b/FSharp.Configuration.sln
@@ -1,6 +1,7 @@
+
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2013
-VisualStudioVersion = 12.0.31101.0
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.29613.14
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{A6A6AF7D-D6E3-442D-9B1E-58CC91879BE1}"
ProjectSection(SolutionItems) = preProject
@@ -15,12 +16,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{A6A6AF7D-D
docs\content\YamlConfigProvider.fsx = docs\content\YamlConfigProvider.fsx
EndProjectSection
EndProject
-Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Configuration", "src\FSharp.Configuration\FSharp.Configuration.fsproj", "{7E90D6CE-A10B-4858-A5BC-41DF7250CBCA}"
-EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "project", "project", "{BF60BC93-E09B-4E5F-9D85-95A519479D54}"
ProjectSection(SolutionItems) = preProject
build.fsx = build.fsx
- FSharp.Configuration.nuspec = FSharp.Configuration.nuspec
paket.dependencies = paket.dependencies
paket.lock = paket.lock
README.md = README.md
@@ -33,21 +31,45 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{83F16175
docs\tools\templates\template.cshtml = docs\tools\templates\template.cshtml
EndProjectSection
EndProject
+Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "FSharp.Configuration.Runtime", "src\FSharp.Configuration.Runtime\FSharp.Configuration.Runtime.fsproj", "{CB156D37-AA7D-4F43-9BC8-816318107F79}"
+EndProject
+Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "FSharp.Configuration.DesignTime", "src\FSharp.Configuration.DesignTime\FSharp.Configuration.DesignTime.fsproj", "{28A30128-1DDE-4CD8-9A67-A6FC0BBC2D68}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{F1BDBF61-84AB-476B-9A1D-3FB51E7DB4BC}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{09FBC2D9-4689-4759-919B-B0A2662522BC}"
+EndProject
+Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Configuration.Tests", "tests\FSharp.Configuration.Tests\FSharp.Configuration.Tests.fsproj", "{4E6FEA3F-9C19-45E1-AA59-2FA7CEBAF11F}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {7E90D6CE-A10B-4858-A5BC-41DF7250CBCA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {7E90D6CE-A10B-4858-A5BC-41DF7250CBCA}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {7E90D6CE-A10B-4858-A5BC-41DF7250CBCA}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {7E90D6CE-A10B-4858-A5BC-41DF7250CBCA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CB156D37-AA7D-4F43-9BC8-816318107F79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {CB156D37-AA7D-4F43-9BC8-816318107F79}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CB156D37-AA7D-4F43-9BC8-816318107F79}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {CB156D37-AA7D-4F43-9BC8-816318107F79}.Release|Any CPU.Build.0 = Release|Any CPU
+ {28A30128-1DDE-4CD8-9A67-A6FC0BBC2D68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {28A30128-1DDE-4CD8-9A67-A6FC0BBC2D68}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {28A30128-1DDE-4CD8-9A67-A6FC0BBC2D68}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {28A30128-1DDE-4CD8-9A67-A6FC0BBC2D68}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4E6FEA3F-9C19-45E1-AA59-2FA7CEBAF11F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4E6FEA3F-9C19-45E1-AA59-2FA7CEBAF11F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4E6FEA3F-9C19-45E1-AA59-2FA7CEBAF11F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4E6FEA3F-9C19-45E1-AA59-2FA7CEBAF11F}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{83F16175-43B1-4C90-A1EE-8E351C33435D} = {A6A6AF7D-D6E3-442D-9B1E-58CC91879BE1}
+ {CB156D37-AA7D-4F43-9BC8-816318107F79} = {09FBC2D9-4689-4759-919B-B0A2662522BC}
+ {28A30128-1DDE-4CD8-9A67-A6FC0BBC2D68} = {09FBC2D9-4689-4759-919B-B0A2662522BC}
+ {4E6FEA3F-9C19-45E1-AA59-2FA7CEBAF11F} = {F1BDBF61-84AB-476B-9A1D-3FB51E7DB4BC}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {5F7E4B18-0D4C-454A-A7BD-3F3E5E8CE018}
EndGlobalSection
EndGlobal
diff --git a/README.md b/README.md
index 7647e18c..3b643bd8 100644
--- a/README.md
+++ b/README.md
@@ -1,31 +1,21 @@
-[](http://issuestats.com/github/fsprojects/FSharp.Configuration)
-[](http://issuestats.com/github/fsprojects/FSharp.Configuration)
-
FSharp.Configuration
-===========================
-
-The FSharp.Configuration project contains type providers for the configuration of .NET projects.
+====================
-* [AppSettings](http://fsprojects.github.io/FSharp.Configuration/AppSettingsProvider.html)
-* [ResX](http://fsprojects.github.io/FSharp.Configuration/ResXProvider.html)
-* [Yaml](http://fsprojects.github.io/FSharp.Configuration/YamlConfigProvider.html)
-* [Ini](http://fsprojects.github.io/FSharp.Configuration/IniTypeProvider.html)
+[](https://www.nuget.org/packages/FSharp.Configuration)
+[](https://github.com/fsprojects/FSharp.Configuration/actions?query=branch%3Amaster)
-Documentation available here.
-
-## Build status
+The FSharp.Configuration project contains type providers for the configuration of .NET projects.
-| | BuildScript | Status of last build |
-| :------ | :------: | :------: |
-| **Mono** | [build.sh](https://github.com/fsprojects/FSharp.Configuration/blob/master/build.sh) | [](https://travis-ci.org/fsprojects/FSharp.Configuration) |
-| **Windows** | [build.cmd](https://github.com/fsprojects/FSharp.Configuration/blob/master/build.cmd) | [](https://ci.appveyor.com/project/vasily-kirichenko/fsharp-configuration) |
+* [AppSettings](https://fsprojects.github.io/FSharp.Configuration/AppSettingsProvider.html)
+* [ResX](https://fsprojects.github.io/FSharp.Configuration/ResXProvider.html)
+* [Yaml](https://fsprojects.github.io/FSharp.Configuration/YamlConfigProvider.html)
+* [Ini](https://fsprojects.github.io/FSharp.Configuration/IniTypeProvider.html)
-[](https://www.nuget.org/packages/FSharp.Configuration/)
+Documentation available here.
## Testing
* Start FSharp.Configuration.sln and configure the project's debug mode to run `[YOURPATH]\FSharp.Configuration\FSharp.Configuration.Tests.sln` with `C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\devenv.exe`.
-
## Maintainer(s)
diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md
index d641f99b..bc2ab051 100644
--- a/RELEASE_NOTES.md
+++ b/RELEASE_NOTES.md
@@ -1,6 +1,15 @@
+#### 2.0.0 - 09.08.2021
+* Migration to project system
+* Migration from SharpYaml to YamlDotNet
+* YamlConfigTypeProvider targets net461 and netstandard2.0
+* IniFileProvider targets net461 and netstandard2.0
+* AppSettingsProvider targets net461 and netstandard2.0
+* Dependencies update
+* Fix bug triggering exception 'xx_ItemType is not comparable' when updating an empty list #158
+
#### 1.5.0 - 15.06.2018
* Tweak INI File Parser to allow semicolon characters inside string values (thanks [@zakakula](https://github.com/zakaluka)!).
- * NOTE: This will result in comments no longer being valid beside string values, instead comments should go on a line above the key-value pair
+* NOTE: This will result in comments no longer being valid beside string values, instead comments should go on a line above the key-value pair
#### 1.4.0 - 23.02.2018
* Migration to latest TPSDK
diff --git a/appveyor.yml b/appveyor.yml
deleted file mode 100644
index c2470876..00000000
--- a/appveyor.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-os: Visual Studio 2017
-init:
- - git config --global core.autocrlf input
-build_script:
- - cmd: build.cmd
-test: off
-version: 0.0.1.{build}
-artifacts:
- - path: nuget/*.nupkg
- name: nuget
\ No newline at end of file
diff --git a/build.cmd b/build.cmd
index e9933d32..d7f75484 100644
--- a/build.cmd
+++ b/build.cmd
@@ -1,9 +1,4 @@
@echo off
-cls
-
-.paket\paket.exe restore
-if errorlevel 1 (
- exit /b %errorlevel%
-)
-
-packages\build\FAKE\tools\FAKE.exe build.fsx %*
+dotnet tool restore
+dotnet paket restore
+dotnet fake run build.fsx %*
\ No newline at end of file
diff --git a/build.fsx b/build.fsx
index fe00a73c..002ad309 100644
--- a/build.fsx
+++ b/build.fsx
@@ -1,26 +1,41 @@
-// --------------------------------------------------------------------------------------
-// FAKE build script
-// --------------------------------------------------------------------------------------
-
-#r @"packages/build/FAKE/tools/FakeLib.dll"
-#load "paket-files/build/fsharp/FAKE/modules/Octokit/Octokit.fsx"
-
-open Fake
-open Fake.Git
-open Fake.AssemblyInfoFile
-open Fake.ReleaseNotesHelper
+#r @"paket:
+source https://nuget.org/api/v2
+framework netstandard2.0
+nuget FSharp.Core 4.7.2
+nuget Fake.Core.Target
+nuget Fake.Core.Process
+nuget Fake.Core.ReleaseNotes
+nuget Fake.IO.FileSystem
+nuget Fake.DotNet.Cli
+nuget Fake.DotNet.MSBuild
+nuget Fake.DotNet.AssemblyInfoFile
+nuget Fake.DotNet.Paket
+nuget Fake.DotNet.Testing.Expecto
+nuget Fake.DotNet.FSFormatting
+nuget Fake.Tools.Git
+nuget Fake.Api.GitHub //"
+
+#if !FAKE
+#load "./.fake/build.fsx/intellisense.fsx"
+#r "netstandard" // Temp fix for https://github.com/fsharp/FAKE/issues/1985
+#endif
+
+open Fake
+open Fake.Core.TargetOperators
+open Fake.Core
+open Fake.IO
+open Fake.IO.FileSystemOperators
+open Fake.IO.Globbing.Operators
+open Fake.DotNet
+open Fake.DotNet.Testing
+open Fake.Tools
+open Fake.Tools.Git
open System
-open Octokit
+open System.IO
-// --------------------------------------------------------------------------------------
-// START TODO: Provide project-specific details below
-// --------------------------------------------------------------------------------------
+Target.initEnvironment()
-// Information about the project are used
-// - for version and project name in generated AssemblyInfo file
-// - by the generated NuGet package
-// - to run tests and to publish documentation on GitHub gh-pages
-// - for documentation, you also need to edit info in "docs/tools/generate.fsx"
+// --------------------------------------------------------------------------------------
// The name of the project
// (used by attributes in AssemblyInfo, name of a NuGet package and directory in 'src')
@@ -43,9 +58,6 @@ let tags = "appsettings, YAML, F#, ResX, Ini, config"
// File system information
let solutionFile = "FSharp.Configuration"
-// Pattern specifying assemblies to be tested using NUnit
-let testAssemblies = "tests/**/bin/Release/*Tests*.exe"
-
// Git configuration (used for publishing documentation in gh-pages branch)
// The profile where the project is posted
let gitOwner = "fsprojects"
@@ -58,36 +70,35 @@ let gitName = "FSharp.Configuration"
// --------------------------------------------------------------------------------------
let buildDir = "bin"
-let nugetDir = "./nuget/"
// Read additional information from the release notes document
-let release = LoadReleaseNotes "RELEASE_NOTES.md"
+let release = ReleaseNotes.load "RELEASE_NOTES.md"
-let genFSAssemblyInfo (projectPath) =
+let genFSAssemblyInfo (projectPath:string) =
let projectName = System.IO.Path.GetFileNameWithoutExtension(projectPath)
let basePath = "src/" + projectName
let fileName = basePath + "/AssemblyInfo.fs"
- CreateFSharpAssemblyInfo fileName
- [ Attribute.Title (projectName)
- Attribute.Product project
- Attribute.Description summary
- Attribute.Version release.AssemblyVersion
- Attribute.FileVersion release.AssemblyVersion ]
-
-let genCSAssemblyInfo (projectPath) =
+ AssemblyInfoFile.createFSharp fileName
+ [ AssemblyInfo.Title (projectName)
+ AssemblyInfo.Product project
+ AssemblyInfo.Description summary
+ AssemblyInfo.Version release.AssemblyVersion
+ AssemblyInfo.FileVersion release.AssemblyVersion ]
+
+let genCSAssemblyInfo (projectPath:string) =
let projectName = System.IO.Path.GetFileNameWithoutExtension(projectPath)
let basePath = "src/" + projectName + "/Properties"
let fileName = basePath + "/AssemblyInfo.cs"
- CreateCSharpAssemblyInfo fileName
- [ Attribute.Title (projectName)
- Attribute.Product project
- Attribute.Description summary
- Attribute.Version release.AssemblyVersion
- Attribute.FileVersion release.AssemblyVersion ]
+ AssemblyInfoFile.createCSharp fileName
+ [ AssemblyInfo.Title (projectName)
+ AssemblyInfo.Product project
+ AssemblyInfo.Description summary
+ AssemblyInfo.Version release.AssemblyVersion
+ AssemblyInfo.FileVersion release.AssemblyVersion ]
// Generate assembly info files with the right version & up-to-date information
-Target "AssemblyInfo" (fun _ ->
+Target.create "AssemblyInfo" (fun _ ->
let fsProjs = !! "src/**/*.fsproj"
let csProjs = !! "src/**/*.csproj"
fsProjs |> Seq.iter genFSAssemblyInfo
@@ -97,25 +108,39 @@ Target "AssemblyInfo" (fun _ ->
// --------------------------------------------------------------------------------------
// Clean build results & restore NuGet packages
-Target "Clean" (fun _ ->
- CleanDirs [buildDir; "temp"; nugetDir]
+Target.create "Clean" (fun _ ->
+ Shell.cleanDirs [buildDir]
)
-Target "CleanDocs" (fun _ ->
- CleanDirs ["docs/output"]
+Target.create "CleanDocs" (fun _ ->
+ Shell.cleanDirs ["docs/output"]
)
// --------------------------------------------------------------------------------------
// Build library & test project
-Target "Build" (fun _ ->
- !! (solutionFile + ".sln")
- |> MSBuildRelease "" "Rebuild"
- |> ignore
+Target.create "Build" (fun _ ->
+ DotNet.exec id "build" "FSharp.Configuration.sln -c Release" |> ignore
+
+ // let outDir = __SOURCE_DIRECTORY__ + "/bin/lib/net461/"
+ // CreateDir outDir
+ // DotNetCli.Publish (fun p ->
+ // { p with
+ // Output = outDir
+ // Framework = "net461"
+ // WorkingDir = "src/FSharp.Configuration/" })
+
+ // let outDir = __SOURCE_DIRECTORY__ + "/bin/lib/netstandard2.0/"
+ // CreateDir outDir
+ // DotNetCli.Publish (fun p ->
+ // { p with
+ // Output = outDir
+ // Framework = "netstandard2.0"
+ // WorkingDir = "src/FSharp.Configuration/" })
+)
- !! (solutionFile + ".Tests.sln")
- |> MSBuildRelease "" "Rebuild"
- |> ignore
+Target.create "BuildTests" (fun _ ->
+ DotNet.exec id "build" "FSharp.Configuration.Tests.sln -c Release -v n" |> ignore
)
// --------------------------------------------------------------------------------------
@@ -123,152 +148,166 @@ Target "Build" (fun _ ->
open Fake.Testing
-Target "RunTests" (fun _ ->
- !! testAssemblies
- |> Expecto.Expecto (fun p -> { p with FailOnFocusedTests = true })
+Target.create "RunTests" (fun _ ->
+ !! "tests/**/bin/Release/net461/*Tests*.exe"
+ |> Seq.iter (fun path ->
+ Trace.tracefn "Running tests '%s' ..." path
+
+ let args = "--fail-on-focused-tests --summary --sequenced --version"
+ (if Environment.isWindows
+ then CreateProcess.fromRawCommandLine path args
+ else CreateProcess.fromRawCommandLine "mono" (path + " " + args))
+ |> CreateProcess.ensureExitCode
+ |> Proc.run
+ |> ignore
+ )
+ // |> Testing.Expecto.run (fun p ->
+ // { p with
+ // //WorkingDirectory = __SOURCE_DIRECTORY__
+ // FailOnFocusedTests = true
+ // PrintVersion = true
+ // Parallel = false
+ // Summary = true
+ // Debug = false
+ // })
)
+Target.create "RunTestsNetCore" (fun _ ->
+ DotNet.exec
+ (fun r -> { r with WorkingDirectory = "tests/FSharp.Configuration.Tests/" })
+ "run" "--framework net5.0"
+ |> ignore
+)
// --------------------------------------------------------------------------------------
// Build a NuGet package
-Target "NuGet" (fun _ ->
- let nugetDocsDir = nugetDir @@ "docs"
- let nugetlibDir = nugetDir @@ "lib/net45"
-
- CleanDir nugetDocsDir
- CleanDir nugetlibDir
-
- CopyDir nugetlibDir "bin" (fun file -> file.Contains "FSharp.Core." |> not)
- CopyDir nugetDocsDir "./docs/output" allFiles
-
- NuGet (fun p ->
+Target.create "NuGet" (fun _ ->
+ Paket.pack(fun p ->
{ p with
- Authors = authors
- Project = project
- Summary = summary
- Description = description
+ ToolType = ToolType.CreateLocalTool()
+ OutputPath = "bin"
Version = release.NugetVersion
- ReleaseNotes = release.Notes |> toLines
- Tags = tags
- OutputPath = nugetDir
- //AccessKey = getBuildParamOrDefault "nugetkey" ""
- //Publish = hasBuildParam "nugetkey"
- Dependencies = [] })
- (project + ".nuspec")
+ ReleaseNotes = String.toLines release.Notes})
)
// --------------------------------------------------------------------------------------
// Generate the documentation
-let fakePath = "packages" @@ "build" @@ "FAKE" @@ "tools" @@ "FAKE.exe"
-let fakeStartInfo script workingDirectory args fsiargs environmentVars =
- (fun (info: System.Diagnostics.ProcessStartInfo) ->
- info.FileName <- System.IO.Path.GetFullPath fakePath
- info.Arguments <- sprintf "%s --fsiargs -d:FAKE %s \"%s\"" args fsiargs script
- info.WorkingDirectory <- workingDirectory
- let setVar k v =
- info.EnvironmentVariables.[k] <- v
- for (k, v) in environmentVars do
- setVar k v
- setVar "MSBuild" msBuildExe
- setVar "GIT" Git.CommandHelper.gitPath
- setVar "FSI" fsiPath)
-
-/// Run the given buildscript with FAKE.exe
-let executeFAKEWithOutput workingDirectory script fsiargs envArgs =
- let exitCode =
- ExecProcessWithLambdas
- (fakeStartInfo script workingDirectory "" fsiargs envArgs)
- TimeSpan.MaxValue false ignore ignore
- System.Threading.Thread.Sleep 1000
- exitCode
-
-// Documentation
-let buildDocumentationTarget fsiargs target =
- trace (sprintf "Building documentation (%s), this could take some time, please wait..." target)
- let exit = executeFAKEWithOutput "docs/tools" "generate.fsx" fsiargs ["target", target]
- if exit <> 0 then
- failwith "generating reference documentation failed"
+//let fakePath = "packages" @@ "build" @@ "FAKE" @@ "tools" @@ "FAKE.exe"
+//let fakeStartInfo script workingDirectory args fsiargs environmentVars =
+// (fun (info: System.Diagnostics.ProcessStartInfo) ->
+// info.FileName <- System.IO.Path.GetFullPath fakePath
+// info.Arguments <- sprintf "%s --fsiargs -d:FAKE %s \"%s\"" args fsiargs script
+// info.WorkingDirectory <- workingDirectory
+// let setVar k v =
+// info.EnvironmentVariables.[k] <- v
+// for (k, v) in environmentVars do
+// setVar k v
+// setVar "MSBuild" msBuildExe
+// setVar "GIT" Git.CommandHelper.gitPath
+// setVar "FSI" fsiPath)
+
+///// Run the given buildscript with FAKE.exe
+//let executeFAKEWithOutput workingDirectory script fsiargs envArgs =
+// let exitCode =
+// ExecProcessWithLambdas
+// (fakeStartInfo script workingDirectory "" fsiargs envArgs)
+// TimeSpan.MaxValue false ignore ignore
+// System.Threading.Thread.Sleep 1000
+// exitCode
+
+//// Documentation
+//let buildDocumentationTarget fsiargs target =
+ //Trace.traceImportantfn "Building documentation (%s), this could take some time, please wait..." target
+ //let exit = executeFAKEWithOutput "docs/tools" "generate.fsx" fsiargs ["target", target]
+ //if exit <> 0 then
+ // failwith "generating reference documentation failed"
+ //()
+
+Target.create "GenerateReferenceDocs" (fun _ ->
()
-
-Target "GenerateReferenceDocs" (fun _ ->
- buildDocumentationTarget "-d:RELEASE -d:REFERENCE" "Default"
+ //buildDocumentationTarget "-d:RELEASE -d:REFERENCE" "Default"
)
-let generateHelp' fail debug =
- let args =
- if debug then "--define:HELP"
- else "--define:RELEASE --define:HELP"
- try
- buildDocumentationTarget args "Default"
- traceImportant "Help generated"
- with
- | _ when not fail ->
- traceImportant "generating help documentation failed"
-
-let generateHelp fail =
- generateHelp' fail false
-
-Target "GenerateHelp" (fun _ ->
- DeleteFile "docs/content/release-notes.md"
- CopyFile "docs/content/" "RELEASE_NOTES.md"
- Rename "docs/content/release-notes.md" "docs/content/RELEASE_NOTES.md"
-
- DeleteFile "docs/content/license.md"
- CopyFile "docs/content/" "LICENSE.txt"
- Rename "docs/content/license.md" "docs/content/LICENSE.txt"
-
- generateHelp true
+//let generateHelp' fail debug =
+// let args =
+// if debug then "--define:HELP"
+// else "--define:RELEASE --define:HELP"
+// try
+// buildDocumentationTarget args "Default"
+// Trace.traceImportant "Help generated"
+// with
+// | _ when not fail ->
+// Trace.traceImportant "generating help documentation failed"
+
+//let generateHelp fail =
+ //generateHelp' fail false
+
+Target.create "GenerateHelp" (fun _ ->
+ ()
+ //DeleteFile "docs/content/release-notes.md"
+ //CopyFile "docs/content/" "RELEASE_NOTES.md"
+ //Rename "docs/content/release-notes.md" "docs/content/RELEASE_NOTES.md"
+
+ //DeleteFile "docs/content/license.md"
+ //CopyFile "docs/content/" "LICENSE.txt"
+ //Rename "docs/content/license.md" "docs/content/LICENSE.txt"
+
+ //generateHelp true
)
-Target "GenerateDocs" DoNothing
+Target.create "GenerateDocs" ignore
// --------------------------------------------------------------------------------------
// Release Scripts
-Target "ReleaseDocs" (fun _ ->
- let tempDocsDir = "temp/gh-pages"
- CleanDir tempDocsDir
- Repository.cloneSingleBranch "" (gitHome + "/" + gitName + ".git") "gh-pages" tempDocsDir
-
- fullclean tempDocsDir
- CopyRecursive "docs/output" tempDocsDir true |> tracefn "%A"
- StageAll tempDocsDir
- Git.Commit.Commit tempDocsDir (sprintf "Update generated documentation for version %s" release.NugetVersion)
- Branches.push tempDocsDir
+Target.create "ReleaseDocs" (fun _ ->
+ ()
+ //let tempDocsDir = "temp/gh-pages"
+ //CleanDir tempDocsDir
+ //Repository.cloneSingleBranch "" (gitHome + "/" + gitName + ".git") "gh-pages" tempDocsDir
+
+ //fullclean tempDocsDir
+ //CopyRecursive "docs/output" tempDocsDir true |> tracefn "%A"
+ //StageAll tempDocsDir
+ //Git.Commit.Commit tempDocsDir (sprintf "Update generated documentation for version %s" release.NugetVersion)
+ //Branches.push tempDocsDir
)
-Target "Release" (fun _ ->
- StageAll ""
- Git.Commit.Commit "" (sprintf "Bump version to %s" release.NugetVersion)
- Branches.push ""
-
- Branches.tag "" release.NugetVersion
- Branches.pushTag "" "origin" release.NugetVersion
-
- // release on github
- createClient (getBuildParamOrDefault "github-user" "") (getBuildParamOrDefault "github-pw" "")
- |> createDraft gitOwner gitName release.NugetVersion (release.SemVer.PreRelease <> None) release.Notes
- |> releaseDraft
- |> Async.RunSynchronously
+Target.create "Release" (fun _ ->
+ ()
+ //StageAll ""
+ //Git.Commit.Commit "" (sprintf "Bump version to %s" release.NugetVersion)
+ //Branches.push ""
+
+ //Branches.tag "" release.NugetVersion
+ //Branches.pushTag "" "origin" release.NugetVersion
+
+ //// release on github
+ //createClient (getBuildParamOrDefault "github-user" "") (getBuildParamOrDefault "github-pw" "")
+ //|> createDraft gitOwner gitName release.NugetVersion (release.SemVer.PreRelease <> None) release.Notes
+ //|> releaseDraft
+ //|> Async.RunSynchronously
)
-Target "BuildPackage" DoNothing
+Target.create "BuildPackage" ignore
// --------------------------------------------------------------------------------------
// Run all targets by default. Invoke 'build ' to override
-Target "All" DoNothing
+Target.create "All" ignore
"Clean"
==> "AssemblyInfo"
==> "Build"
+ ==> "BuildTests"
+ ==> "RunTestsNetCore"
==> "RunTests"
- =?> ("GenerateReferenceDocs",isLocalBuild && not isMono)
- =?> ("GenerateDocs",isLocalBuild && not isMono)
+ //=?> ("GenerateReferenceDocs",isLocalBuild && not isMono)
+ //=?> ("GenerateDocs",isLocalBuild && not isMono)
==> "All"
- =?> ("ReleaseDocs",isLocalBuild && not isMono)
+ //=?> ("ReleaseDocs",isLocalBuild && not isMono)
"All"
==> "NuGet"
@@ -285,4 +324,4 @@ Target "All" DoNothing
"BuildPackage"
==> "Release"
-RunTargetOrDefault "All"
+Target.runOrDefault "All"
diff --git a/build.fsx.lock b/build.fsx.lock
new file mode 100644
index 00000000..dd94eac9
--- /dev/null
+++ b/build.fsx.lock
@@ -0,0 +1,244 @@
+STORAGE: NONE
+RESTRICTION: == netstandard2.0
+NUGET
+ remote: https://www.nuget.org/api/v2
+ BlackFox.VsWhere (1.1)
+ FSharp.Core (>= 4.2.3)
+ Microsoft.Win32.Registry (>= 4.7)
+ Fake.Api.GitHub (5.20.4)
+ FSharp.Core (>= 4.7.2)
+ Octokit (>= 0.48)
+ Fake.Core.CommandLineParsing (5.20.4)
+ FParsec (>= 1.1.1)
+ FSharp.Core (>= 4.7.2)
+ Fake.Core.Context (5.20.4)
+ FSharp.Core (>= 4.7.2)
+ Fake.Core.Environment (5.20.4)
+ FSharp.Core (>= 4.7.2)
+ Fake.Core.FakeVar (5.20.4)
+ Fake.Core.Context (>= 5.20.4)
+ FSharp.Core (>= 4.7.2)
+ Fake.Core.Process (5.20.4)
+ Fake.Core.Environment (>= 5.20.4)
+ Fake.Core.FakeVar (>= 5.20.4)
+ Fake.Core.String (>= 5.20.4)
+ Fake.Core.Trace (>= 5.20.4)
+ Fake.IO.FileSystem (>= 5.20.4)
+ FSharp.Core (>= 4.7.2)
+ System.Collections.Immutable (>= 1.7.1)
+ Fake.Core.ReleaseNotes (5.20.4)
+ Fake.Core.SemVer (>= 5.20.4)
+ Fake.Core.String (>= 5.20.4)
+ FSharp.Core (>= 4.7.2)
+ Fake.Core.SemVer (5.20.4)
+ FSharp.Core (>= 4.7.2)
+ Fake.Core.String (5.20.4)
+ FSharp.Core (>= 4.7.2)
+ Fake.Core.Target (5.20.4)
+ Fake.Core.CommandLineParsing (>= 5.20.4)
+ Fake.Core.Context (>= 5.20.4)
+ Fake.Core.Environment (>= 5.20.4)
+ Fake.Core.FakeVar (>= 5.20.4)
+ Fake.Core.Process (>= 5.20.4)
+ Fake.Core.String (>= 5.20.4)
+ Fake.Core.Trace (>= 5.20.4)
+ FSharp.Control.Reactive (>= 4.4.2)
+ FSharp.Core (>= 4.7.2)
+ Fake.Core.Tasks (5.20.4)
+ Fake.Core.Trace (>= 5.20.4)
+ FSharp.Core (>= 4.7.2)
+ Fake.Core.Trace (5.20.4)
+ Fake.Core.Environment (>= 5.20.4)
+ Fake.Core.FakeVar (>= 5.20.4)
+ FSharp.Core (>= 4.7.2)
+ Fake.Core.Xml (5.20.4)
+ Fake.Core.String (>= 5.20.4)
+ FSharp.Core (>= 4.7.2)
+ Fake.DotNet.AssemblyInfoFile (5.20.4)
+ Fake.Core.Environment (>= 5.20.4)
+ Fake.Core.String (>= 5.20.4)
+ Fake.Core.Trace (>= 5.20.4)
+ Fake.IO.FileSystem (>= 5.20.4)
+ FSharp.Core (>= 4.7.2)
+ Fake.DotNet.Cli (5.20.4)
+ Fake.Core.Environment (>= 5.20.4)
+ Fake.Core.Process (>= 5.20.4)
+ Fake.Core.String (>= 5.20.4)
+ Fake.Core.Trace (>= 5.20.4)
+ Fake.DotNet.MSBuild (>= 5.20.4)
+ Fake.DotNet.NuGet (>= 5.20.4)
+ Fake.IO.FileSystem (>= 5.20.4)
+ FSharp.Core (>= 4.7.2)
+ Mono.Posix.NETStandard (>= 1.0)
+ Newtonsoft.Json (>= 12.0.3)
+ Fake.DotNet.FSFormatting (5.20.4)
+ Fake.Core.Process (>= 5.20.4)
+ Fake.DotNet.Cli (>= 5.20.4)
+ Fake.IO.FileSystem (>= 5.20.4)
+ FSharp.Core (>= 4.7.2)
+ Fake.DotNet.MSBuild (5.20.4)
+ BlackFox.VsWhere (>= 1.1)
+ Fake.Core.Environment (>= 5.20.4)
+ Fake.Core.Process (>= 5.20.4)
+ Fake.Core.String (>= 5.20.4)
+ Fake.Core.Trace (>= 5.20.4)
+ Fake.IO.FileSystem (>= 5.20.4)
+ FSharp.Core (>= 4.7.2)
+ MSBuild.StructuredLogger (>= 2.1.176)
+ Fake.DotNet.NuGet (5.20.4)
+ Fake.Core.Environment (>= 5.20.4)
+ Fake.Core.Process (>= 5.20.4)
+ Fake.Core.SemVer (>= 5.20.4)
+ Fake.Core.String (>= 5.20.4)
+ Fake.Core.Tasks (>= 5.20.4)
+ Fake.Core.Trace (>= 5.20.4)
+ Fake.Core.Xml (>= 5.20.4)
+ Fake.IO.FileSystem (>= 5.20.4)
+ Fake.Net.Http (>= 5.20.4)
+ FSharp.Core (>= 4.7.2)
+ Newtonsoft.Json (>= 12.0.3)
+ NuGet.Protocol (>= 5.6)
+ Fake.DotNet.Paket (5.20.4)
+ Fake.Core.Process (>= 5.20.4)
+ Fake.Core.String (>= 5.20.4)
+ Fake.Core.Trace (>= 5.20.4)
+ Fake.DotNet.Cli (>= 5.20.4)
+ Fake.IO.FileSystem (>= 5.20.4)
+ FSharp.Core (>= 4.7.2)
+ Fake.DotNet.Testing.Expecto (5.20.4)
+ Fake.Core.Process (>= 5.20.4)
+ Fake.Core.String (>= 5.20.4)
+ Fake.Core.Trace (>= 5.20.4)
+ Fake.IO.FileSystem (>= 5.20.4)
+ Fake.Testing.Common (>= 5.20.4)
+ FSharp.Core (>= 4.7.2)
+ Fake.IO.FileSystem (5.20.4)
+ Fake.Core.String (>= 5.20.4)
+ FSharp.Core (>= 4.7.2)
+ Fake.Net.Http (5.20.4)
+ Fake.Core.Trace (>= 5.20.4)
+ FSharp.Core (>= 4.7.2)
+ Fake.Testing.Common (5.20.4)
+ Fake.Core.Trace (>= 5.20.4)
+ FSharp.Core (>= 4.7.2)
+ Fake.Tools.Git (5.20.4)
+ Fake.Core.Environment (>= 5.20.4)
+ Fake.Core.Process (>= 5.20.4)
+ Fake.Core.SemVer (>= 5.20.4)
+ Fake.Core.String (>= 5.20.4)
+ Fake.Core.Trace (>= 5.20.4)
+ Fake.IO.FileSystem (>= 5.20.4)
+ FSharp.Core (>= 4.7.2)
+ FParsec (1.1.1)
+ FSharp.Core (>= 4.3.4)
+ FSharp.Control.Reactive (5.0.2)
+ FSharp.Core (>= 4.7.2)
+ System.Reactive (>= 5.0)
+ FSharp.Core (4.7.2)
+ Microsoft.Build (16.10)
+ Microsoft.Build.Framework (16.10)
+ System.Security.Permissions (>= 4.7)
+ Microsoft.Build.Tasks.Core (16.10)
+ Microsoft.Build.Framework (>= 16.10)
+ Microsoft.Build.Utilities.Core (>= 16.10)
+ Microsoft.NET.StringTools (>= 1.0)
+ Microsoft.Win32.Registry (>= 4.3)
+ System.CodeDom (>= 4.4)
+ System.Collections.Immutable (>= 5.0)
+ System.Reflection.Metadata (>= 1.6)
+ System.Resources.Extensions (>= 4.6)
+ System.Security.Cryptography.Pkcs (>= 4.7)
+ System.Security.Cryptography.Xml (>= 4.7)
+ System.Security.Permissions (>= 4.7)
+ System.Threading.Tasks.Dataflow (>= 4.9)
+ Microsoft.Build.Utilities.Core (16.10)
+ Microsoft.Build.Framework (>= 16.10)
+ Microsoft.NET.StringTools (>= 1.0)
+ Microsoft.Win32.Registry (>= 4.3)
+ System.Collections.Immutable (>= 5.0)
+ System.Configuration.ConfigurationManager (>= 4.7)
+ System.Security.Permissions (>= 4.7)
+ System.Text.Encoding.CodePages (>= 4.0.1)
+ Microsoft.NET.StringTools (1.0)
+ System.Memory (>= 4.5.4)
+ System.Runtime.CompilerServices.Unsafe (>= 5.0)
+ Microsoft.NETCore.Platforms (5.0.2)
+ Microsoft.NETCore.Targets (5.0)
+ Microsoft.Win32.Registry (5.0)
+ System.Buffers (>= 4.5.1)
+ System.Memory (>= 4.5.4)
+ System.Security.AccessControl (>= 5.0)
+ System.Security.Principal.Windows (>= 5.0)
+ Mono.Posix.NETStandard (1.0)
+ MSBuild.StructuredLogger (2.1.507)
+ Microsoft.Build (>= 16.4)
+ Microsoft.Build.Framework (>= 16.4)
+ Microsoft.Build.Tasks.Core (>= 16.4)
+ Microsoft.Build.Utilities.Core (>= 16.4)
+ Newtonsoft.Json (13.0.1)
+ NuGet.Common (5.10)
+ NuGet.Frameworks (>= 5.10)
+ NuGet.Configuration (5.10)
+ NuGet.Common (>= 5.10)
+ System.Security.Cryptography.ProtectedData (>= 4.4)
+ NuGet.Frameworks (5.10)
+ NuGet.Packaging (5.10)
+ Newtonsoft.Json (>= 9.0.1)
+ NuGet.Configuration (>= 5.10)
+ NuGet.Versioning (>= 5.10)
+ System.Security.Cryptography.Cng (>= 5.0)
+ System.Security.Cryptography.Pkcs (>= 5.0)
+ NuGet.Protocol (5.10)
+ NuGet.Packaging (>= 5.10)
+ NuGet.Versioning (5.10)
+ Octokit (0.50)
+ System.Buffers (4.5.1)
+ System.CodeDom (5.0)
+ System.Collections.Immutable (5.0)
+ System.Memory (>= 4.5.4)
+ System.Configuration.ConfigurationManager (5.0)
+ System.Security.Cryptography.ProtectedData (>= 5.0)
+ System.Security.Permissions (>= 5.0)
+ System.Formats.Asn1 (5.0)
+ System.Buffers (>= 4.5.1)
+ System.Memory (>= 4.5.4)
+ System.Memory (4.5.4)
+ System.Buffers (>= 4.5.1)
+ System.Numerics.Vectors (>= 4.4)
+ System.Runtime.CompilerServices.Unsafe (>= 4.5.3)
+ System.Numerics.Vectors (4.5)
+ System.Reactive (5.0)
+ System.Runtime.InteropServices.WindowsRuntime (>= 4.3)
+ System.Threading.Tasks.Extensions (>= 4.5.4)
+ System.Reflection.Metadata (5.0)
+ System.Collections.Immutable (>= 5.0)
+ System.Resources.Extensions (5.0)
+ System.Memory (>= 4.5.4)
+ System.Runtime (4.3.1)
+ Microsoft.NETCore.Platforms (>= 1.1.1)
+ Microsoft.NETCore.Targets (>= 1.1.3)
+ System.Runtime.CompilerServices.Unsafe (5.0)
+ System.Runtime.InteropServices.WindowsRuntime (4.3)
+ System.Runtime (>= 4.3)
+ System.Security.AccessControl (5.0)
+ System.Security.Principal.Windows (>= 5.0)
+ System.Security.Cryptography.Cng (5.0)
+ System.Security.Cryptography.Pkcs (5.0.1)
+ System.Buffers (>= 4.5.1)
+ System.Formats.Asn1 (>= 5.0)
+ System.Memory (>= 4.5.4)
+ System.Security.Cryptography.Cng (>= 5.0)
+ System.Security.Cryptography.ProtectedData (5.0)
+ System.Memory (>= 4.5.4)
+ System.Security.Cryptography.Xml (5.0)
+ System.Memory (>= 4.5.4)
+ System.Security.Cryptography.Pkcs (>= 5.0)
+ System.Security.Permissions (>= 5.0)
+ System.Security.Permissions (5.0)
+ System.Security.AccessControl (>= 5.0)
+ System.Security.Principal.Windows (5.0)
+ System.Text.Encoding.CodePages (5.0)
+ System.Runtime.CompilerServices.Unsafe (>= 5.0)
+ System.Threading.Tasks.Dataflow (5.0)
+ System.Threading.Tasks.Extensions (4.5.4)
+ System.Runtime.CompilerServices.Unsafe (>= 4.5.3)
diff --git a/build.sh b/build.sh
index b0b2d797..2fc81634 100755
--- a/build.sh
+++ b/build.sh
@@ -1,9 +1,9 @@
#!/bin/bash
-
-mono .paket/paket.exe restore
-exit_code=$?
-if [ $exit_code -ne 0 ]; then
- exit $exit_code
-fi
-
-mono packages/build/FAKE/tools/FAKE.exe build.fsx $@
+if test "$OS" = "Windows_NT"
+then
+ cmd /C build.cmd
+else
+ dotnet tool restore
+ dotnet paket restore
+ dotnet fake run build.fsx $@
+fi
\ No newline at end of file
diff --git a/fsc.props b/fsc.props
new file mode 100644
index 00000000..9a15225d
--- /dev/null
+++ b/fsc.props
@@ -0,0 +1,21 @@
+
+
+
+
+ true
+ true
+ true
+
+
+ C:\Program Files (x86)\Microsoft SDKs\F#\10.1\Framework\v4.0
+ fsc.exe
+
+
+ /Library/Frameworks/Mono.framework/Versions/Current/Commands
+ fsharpc
+
+
+ /usr/bin
+ fsharpc
+
+
\ No newline at end of file
diff --git a/global.json b/global.json
new file mode 100644
index 00000000..dab0ae93
--- /dev/null
+++ b/global.json
@@ -0,0 +1,6 @@
+{
+ "sdk": {
+ "version": "5.0.302",
+ "rollForward": "minor"
+ }
+}
\ No newline at end of file
diff --git a/netfx.props b/netfx.props
new file mode 100644
index 00000000..91361f30
--- /dev/null
+++ b/netfx.props
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+ true
+
+
+ /Library/Frameworks/Mono.framework/Versions/Current/lib/mono
+ /usr/lib/mono
+ /usr/local/lib/mono
+
+
+ $(BaseFrameworkPathOverrideForMono)/4.5-api
+ $(BaseFrameworkPathOverrideForMono)/4.5.1-api
+ $(BaseFrameworkPathOverrideForMono)/4.5.2-api
+ $(BaseFrameworkPathOverrideForMono)/4.6-api
+ $(BaseFrameworkPathOverrideForMono)/4.6.1-api
+ $(BaseFrameworkPathOverrideForMono)/4.6.2-api
+ $(BaseFrameworkPathOverrideForMono)/4.7-api
+ $(BaseFrameworkPathOverrideForMono)/4.7.1-api
+ true
+
+
+ $(FrameworkPathOverride)/Facades;$(AssemblySearchPaths)
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/paket.dependencies b/paket.dependencies
index 2a1f7c0e..752edd0c 100644
--- a/paket.dependencies
+++ b/paket.dependencies
@@ -1,28 +1,22 @@
source http://nuget.org/api/v2
-framework: >= net45
+framework: netstandard2.0, net461, net5.0
+redirects: force
-nuget SharpYaml
-nuget FSharp.Core ~> 4.0.0
+nuget YamlDotNet
+nuget FSharp.Core 4.7.0
+
+nuget System.Configuration.ConfigurationManager
+nuget NETStandard.Library.NETFramework
github fsprojects/FSharp.TypeProviders.SDK src/ProvidedTypes.fs
github fsprojects/FSharp.TypeProviders.SDK src/ProvidedTypes.fsi
-github fsprojects/FSharp.TypeProviders.SDK src/ProvidedTypesTesting.fs
-
-group Build
- framework: net45
- source https://nuget.org/api/v2
-
- nuget FAKE
- nuget FSharp.Formatting
- nuget Octokit
- nuget NuGet.CommandLine
- nuget SourceLink.Fake
-
- github fsharp/FAKE modules/Octokit/Octokit.fsx
+github fsprojects/FSharp.TypeProviders.SDK tests/ProvidedTypesTesting.fs
group Test
- framework: net461
+ framework: net461, net5.0
source https://nuget.org/api/v2
+ redirects: force
nuget FSharp.Core redirects: force
- nuget Expecto
\ No newline at end of file
+ nuget Expecto
+ nuget System.Resources.Extensions
\ No newline at end of file
diff --git a/paket.lock b/paket.lock
index 72f37b15..751a5aa3 100644
--- a/paket.lock
+++ b/paket.lock
@@ -1,39 +1,61 @@
-RESTRICTION: >= net45
+REDIRECTS: FORCE
+RESTRICTION: || (== net461) (== net50) (== netstandard2.0)
NUGET
remote: http://www.nuget.org/api/v2
- FSharp.Core (4.0.0.1)
- SharpYaml (1.6.2)
+ FSharp.Core (4.7)
+ Microsoft.NETCore.Platforms (5.0.2) - restriction: || (== net461) (== net50) (&& (== netstandard2.0) (>= net461)) (&& (== netstandard2.0) (>= netcoreapp2.0))
+ Microsoft.Win32.SystemEvents (5.0) - restriction: || (&& (== net461) (>= netcoreapp3.0)) (== net50) (&& (== netstandard2.0) (>= netcoreapp3.0))
+ Microsoft.NETCore.Platforms (>= 5.0) - restriction: || (&& (== net461) (>= netcoreapp2.0)) (== net50) (&& (== netstandard2.0) (>= netcoreapp2.0))
+ NETStandard.Library (2.0.3) - restriction: || (== net461) (&& (== net50) (>= net461)) (&& (== netstandard2.0) (>= net461))
+ Microsoft.NETCore.Platforms (>= 1.1)
+ NETStandard.Library.NETFramework (2.0.0-preview2-25405-01)
+ Microsoft.NETCore.Platforms (>= 2.0.0-preview2-25405-01) - restriction: || (== net461) (&& (== net50) (>= net461)) (&& (== netstandard2.0) (>= net461))
+ NETStandard.Library (>= 2.0.0-preview2-25401-01) - restriction: || (== net461) (&& (== net50) (>= net461)) (&& (== netstandard2.0) (>= net461))
+ System.Buffers (4.5.1) - restriction: || (&& (== net461) (== net50)) (&& (== net50) (>= monotouch)) (&& (== net50) (>= net461)) (&& (== net50) (< netcoreapp2.0)) (&& (== net50) (< netcoreapp2.1) (>= xamarinios)) (&& (== net50) (< netcoreapp2.1) (>= xamarinmac)) (&& (== net50) (< netcoreapp2.1) (>= xamarintvos)) (&& (== net50) (< netcoreapp2.1) (>= xamarinwatchos)) (&& (== net50) (< netstandard1.1)) (&& (== net50) (< netstandard2.0)) (== netstandard2.0)
+ System.Configuration.ConfigurationManager (5.0)
+ System.Security.Cryptography.ProtectedData (>= 5.0) - restriction: || (== net50) (== netstandard2.0)
+ System.Security.Permissions (>= 5.0)
+ System.Drawing.Common (5.0.2) - restriction: || (&& (== net461) (>= netcoreapp3.0)) (== net50) (&& (== netstandard2.0) (>= netcoreapp3.0))
+ Microsoft.Win32.SystemEvents (>= 5.0) - restriction: || (&& (== net461) (>= netcoreapp2.0)) (&& (== net461) (>= netcoreapp3.0)) (== net50) (&& (== netstandard2.0) (>= netcoreapp2.0)) (&& (== netstandard2.0) (>= netcoreapp3.0))
+ System.Memory (4.5.4) - restriction: || (&& (== net461) (== net50)) (&& (== net50) (< netcoreapp2.1)) (== netstandard2.0)
+ System.Buffers (>= 4.5.1) - restriction: || (== net461) (&& (== net50) (>= monotouch)) (&& (== net50) (>= net461)) (&& (== net50) (< netcoreapp2.0)) (&& (== net50) (< netstandard1.1)) (&& (== net50) (< netstandard2.0)) (&& (== net50) (>= xamarinios)) (&& (== net50) (>= xamarinmac)) (&& (== net50) (>= xamarintvos)) (&& (== net50) (>= xamarinwatchos)) (== netstandard2.0)
+ System.Numerics.Vectors (>= 4.4) - restriction: || (&& (== net461) (< net45) (>= netstandard2.0)) (&& (== net50) (< netcoreapp2.0)) (== netstandard2.0)
+ System.Runtime.CompilerServices.Unsafe (>= 4.5.3) - restriction: || (== net461) (&& (== net50) (>= monotouch)) (&& (== net50) (>= net461)) (&& (== net50) (< netcoreapp2.0)) (&& (== net50) (< netcoreapp2.1)) (&& (== net50) (< netstandard1.1)) (&& (== net50) (< netstandard2.0)) (&& (== net50) (>= uap10.1)) (&& (== net50) (>= xamarinios)) (&& (== net50) (>= xamarinmac)) (&& (== net50) (>= xamarintvos)) (&& (== net50) (>= xamarinwatchos)) (== netstandard2.0)
+ System.Numerics.Vectors (4.5) - restriction: || (&& (== net461) (== net50)) (&& (== net50) (< netcoreapp2.0)) (== netstandard2.0)
+ System.Runtime.CompilerServices.Unsafe (5.0) - restriction: || (&& (== net461) (== net50)) (&& (== net50) (>= monotouch)) (&& (== net50) (>= net461)) (&& (== net50) (< netcoreapp2.0)) (&& (== net50) (< netcoreapp2.1)) (&& (== net50) (< netstandard1.1)) (&& (== net50) (< netstandard2.0)) (&& (== net50) (>= uap10.1)) (== netstandard2.0)
+ System.Security.AccessControl (5.0)
+ Microsoft.NETCore.Platforms (>= 5.0) - restriction: || (&& (== net461) (>= netcoreapp2.0)) (== net50) (&& (== netstandard2.0) (>= netcoreapp2.0))
+ System.Security.Principal.Windows (>= 5.0)
+ System.Security.Cryptography.ProtectedData (5.0) - restriction: || (== net50) (== netstandard2.0)
+ System.Memory (>= 4.5.4) - restriction: || (&& (== net461) (< net46) (>= netstandard2.0)) (&& (== net50) (< netcoreapp2.1)) (== netstandard2.0)
+ System.Security.Permissions (5.0)
+ System.Security.AccessControl (>= 5.0)
+ System.Windows.Extensions (>= 5.0) - restriction: || (&& (== net461) (>= netcoreapp3.0)) (== net50) (&& (== netstandard2.0) (>= netcoreapp3.0))
+ System.Security.Principal.Windows (5.0)
+ System.Windows.Extensions (5.0) - restriction: || (&& (== net461) (>= netcoreapp3.0)) (== net50) (&& (== netstandard2.0) (>= netcoreapp3.0))
+ System.Drawing.Common (>= 5.0) - restriction: || (&& (== net461) (>= netcoreapp3.0)) (== net50) (&& (== netstandard2.0) (>= netcoreapp3.0))
+ YamlDotNet (11.2.1)
GITHUB
remote: fsprojects/FSharp.TypeProviders.SDK
- src/ProvidedTypes.fs (f0c4a6300db313eb2616c4f792cd6ae68c255e56)
- src/ProvidedTypes.fsi (f0c4a6300db313eb2616c4f792cd6ae68c255e56)
- src/ProvidedTypesTesting.fs (f0c4a6300db313eb2616c4f792cd6ae68c255e56)
-GROUP Build
-RESTRICTION: == net45
-NUGET
- remote: https://www.nuget.org/api/v2
- FAKE (4.64.12)
- FSharp.Compiler.Service (2.0.0.6)
- FSharp.Formatting (2.14.4)
- FSharp.Compiler.Service (2.0.0.6)
- FSharpVSPowerTools.Core (>= 2.3 < 2.4)
- FSharpVSPowerTools.Core (2.3)
- FSharp.Compiler.Service (>= 2.0.0.3)
- NuGet.CommandLine (4.6.2)
- Octokit (0.29)
- SourceLink.Fake (1.1)
-GITHUB
- remote: fsharp/FAKE
- modules/Octokit/Octokit.fsx (800579e69ce35b77345ee21923ddf117168067cd)
- Octokit (>= 0.20)
+ src/ProvidedTypes.fs (f4aca36af04aa84b16ec04df6f6bf55ac2f17a73)
+ src/ProvidedTypes.fsi (f4aca36af04aa84b16ec04df6f6bf55ac2f17a73)
+ tests/ProvidedTypesTesting.fs (f4aca36af04aa84b16ec04df6f6bf55ac2f17a73)
GROUP Test
-RESTRICTION: == net461
+REDIRECTS: FORCE
+RESTRICTION: || (== net461) (== net50)
NUGET
remote: https://www.nuget.org/api/v2
- Argu (5.1)
- FSharp.Core (>= 4.0.0.1)
- Expecto (7.0.1)
- Argu (>= 5.1)
- Mono.Cecil (>= 0.10)
- FSharp.Core (4.3.4) - redirects: force
- Mono.Cecil (0.10)
+ Expecto (9.0.2)
+ FSharp.Core (>= 4.6)
+ Mono.Cecil (>= 0.11.2)
+ FSharp.Core (5.0.2) - redirects: force
+ Mono.Cecil (0.11.4)
+ System.Buffers (4.5.1) - restriction: || (== net461) (&& (== net50) (>= monotouch)) (&& (== net50) (>= net461)) (&& (== net50) (< netcoreapp2.0)) (&& (== net50) (< netcoreapp2.1) (>= xamarinios)) (&& (== net50) (< netcoreapp2.1) (>= xamarinmac)) (&& (== net50) (< netcoreapp2.1) (>= xamarintvos)) (&& (== net50) (< netcoreapp2.1) (>= xamarinwatchos)) (&& (== net50) (< netstandard1.1)) (&& (== net50) (< netstandard2.0))
+ System.Memory (4.5.4) - restriction: || (== net461) (&& (== net50) (>= net461)) (&& (== net50) (< netcoreapp2.1))
+ System.Buffers (>= 4.5.1) - restriction: || (== net461) (&& (== net50) (>= monotouch)) (&& (== net50) (>= net461)) (&& (== net50) (< netcoreapp2.0)) (&& (== net50) (< netstandard1.1)) (&& (== net50) (< netstandard2.0)) (&& (== net50) (>= xamarinios)) (&& (== net50) (>= xamarinmac)) (&& (== net50) (>= xamarintvos)) (&& (== net50) (>= xamarinwatchos))
+ System.Numerics.Vectors (>= 4.5) - restriction: || (== net461) (&& (== net50) (>= net461))
+ System.Runtime.CompilerServices.Unsafe (>= 4.5.3) - restriction: || (== net461) (&& (== net50) (>= monotouch)) (&& (== net50) (>= net461)) (&& (== net50) (< netcoreapp2.0)) (&& (== net50) (< netcoreapp2.1)) (&& (== net50) (< netstandard1.1)) (&& (== net50) (< netstandard2.0)) (&& (== net50) (>= uap10.1)) (&& (== net50) (>= xamarinios)) (&& (== net50) (>= xamarinmac)) (&& (== net50) (>= xamarintvos)) (&& (== net50) (>= xamarinwatchos))
+ System.Numerics.Vectors (4.5) - restriction: || (== net461) (&& (== net50) (>= net461))
+ System.Resources.Extensions (5.0)
+ System.Memory (>= 4.5.4) - restriction: || (== net461) (&& (== net50) (>= net461)) (&& (== net50) (< netcoreapp2.1))
+ System.Runtime.CompilerServices.Unsafe (5.0) - restriction: || (== net461) (&& (== net50) (>= monotouch)) (&& (== net50) (>= net461)) (&& (== net50) (< netcoreapp2.0)) (&& (== net50) (< netcoreapp2.1)) (&& (== net50) (< netstandard1.1)) (&& (== net50) (< netstandard2.0)) (&& (== net50) (>= uap10.1))
diff --git a/src/FSharp.Configuration/AppSettingsProvider.fs b/src/FSharp.Configuration.DesignTime/AppSettingsProvider.fs
similarity index 65%
rename from src/FSharp.Configuration/AppSettingsProvider.fs
rename to src/FSharp.Configuration.DesignTime/AppSettingsProvider.fs
index e5296743..3c4e6ef4 100644
--- a/src/FSharp.Configuration/AppSettingsProvider.fs
+++ b/src/FSharp.Configuration.DesignTime/AppSettingsProvider.fs
@@ -6,53 +6,16 @@ open FSharp.Configuration.Helper
open ProviderImplementation.ProvidedTypes
open System
open System.Configuration
-open System.Collections.Generic
open System.Globalization
-open System.Web.Hosting
-open System.Runtime.Caching
-
-let mutable private exePath = Map.empty
-let setExeFilePath key filePath = exePath <- exePath.Add(key, filePath)
-
-let getConfig file =
- let path = exePath
- if path.ContainsKey(file) && System.IO.File.Exists(path.[file]) then
- ConfigurationManager.OpenExeConfiguration path.[file]
- else
- if HostingEnvironment.IsHosted then
- Web.Configuration.WebConfigurationManager.OpenWebConfiguration "~"
- else ConfigurationManager.OpenExeConfiguration ConfigurationUserLevel.None
-
-let getConfigValue(file,key) =
- let conf = getConfig file
- match conf.AppSettings.Settings.[key] with
- | null -> raise <| KeyNotFoundException (sprintf "Cannot find name %s in section of config file. (%s)" key conf.FilePath)
- | settings -> settings.Value
-
-let setConfigValue(file, key, value) =
- let config = getConfig file
- config.AppSettings.Settings.[key].Value <- value
- config.Save()
-
-let getConnectionString(file, key: string) =
- match getConfig(file).ConnectionStrings.ConnectionStrings.[key] with
- | null -> raise <| KeyNotFoundException (sprintf "Cannot find name %s in section of config file." key)
- | section -> section.ConnectionString
-
-let setConnectionString(file, key: string, value) =
- let config = getConfig file
- config.ConnectionStrings.ConnectionStrings.[key].ConnectionString <- value
- config.Save()
+open FSharp.Configuration
let internal typedAppSettings (context: Context) =
- let appSettings = erasedType thisAssembly rootNamespace "AppSettings" None
- let cache = new MemoryCache("AppSettingProvider")
- context.AddDisposable cache
-
- appSettings.DefineStaticParameters(
- parameters = [ProvidedStaticParameter("configFileName", typeof)],
- instantiationFunction = (fun typeName parameterValues ->
- let value = lazy (
+ try
+ let appSettings = erasedType thisAssembly rootNamespace "AppSettings" None
+
+ appSettings.DefineStaticParameters(
+ parameters = [ProvidedStaticParameter("configFileName", typeof)],
+ instantiationFunction = fun typeName parameterValues ->
let typedConnectionStrings (config: Configuration, filePath, configFileName) =
let typeDef = ProvidedTypeDefinition ("ConnectionStrings", Some typeof, hideObjectMethods = true)
typeDef.AddXmlDoc (sprintf "Represents the available connection strings from %s" configFileName)
@@ -65,8 +28,8 @@ let internal typedAppSettings (context: Context) =
ProvidedProperty(
name,
typeof,
- getterCode = (fun _ -> <@@ getConnectionString(filePath, key) @@>),
- setterCode = (fun args -> <@@ setConnectionString(filePath, key, %%args.[0]) @@>),
+ getterCode = (fun _ -> <@@ AppSettings.getConnectionString(filePath, key) @@>),
+ setterCode = (fun args -> <@@ AppSettings.setConnectionString(filePath, key, %%args.[0]) @@>),
isStatic = true)
prop.AddXmlDoc (sprintf "Returns the connection string from %s with name %s" configFileName name)
@@ -91,43 +54,43 @@ let internal typedAppSettings (context: Context) =
| ValueParser.Uri _ ->
ProvidedProperty(name, typeof,
isStatic = true,
- getterCode = (fun _ -> <@@ Uri (getConfigValue(filePath, key)) @@>),
- setterCode = fun args -> <@@ setConfigValue(filePath, key, string (%%args.[0]: Uri)) @@>)
+ getterCode = (fun _ -> <@@ Uri (AppSettings.getConfigValue(filePath, key)) @@>),
+ setterCode = fun args -> <@@ AppSettings.setConfigValue(filePath, key, string (%%args.[0]: Uri)) @@>)
| ValueParser.Int _ ->
ProvidedProperty(name, typeof,
isStatic = true,
- getterCode = (fun _ -> <@@ Int32.Parse (getConfigValue(filePath, key)) @@>),
- setterCode = fun args -> <@@ setConfigValue(filePath, key, string (%%args.[0]: Int32)) @@>)
+ getterCode = (fun _ -> <@@ Int32.Parse (AppSettings.getConfigValue(filePath, key)) @@>),
+ setterCode = fun args -> <@@ AppSettings.setConfigValue(filePath, key, string (%%args.[0]: Int32)) @@>)
| ValueParser.Bool _ ->
ProvidedProperty(name, typeof,
isStatic = true,
- getterCode = (fun _ -> <@@ Boolean.Parse (getConfigValue(filePath, key)) @@>),
- setterCode = fun args -> <@@ setConfigValue(filePath, key, string (%%args.[0]: Boolean)) @@>)
+ getterCode = (fun _ -> <@@ Boolean.Parse (AppSettings.getConfigValue(filePath, key)) @@>),
+ setterCode = fun args -> <@@ AppSettings.setConfigValue(filePath, key, string (%%args.[0]: Boolean)) @@>)
| ValueParser.Float _ ->
ProvidedProperty(name, typeof,
isStatic = true,
- getterCode = (fun _ -> <@@ Double.Parse (getConfigValue(filePath, key), NumberStyles.Any, CultureInfo.InvariantCulture) @@>),
- setterCode = fun args -> <@@ setConfigValue(filePath, key, string (%%args.[0]: float)) @@>)
+ getterCode = (fun _ -> <@@ Double.Parse (AppSettings.getConfigValue(filePath, key), NumberStyles.Any, CultureInfo.InvariantCulture) @@>),
+ setterCode = fun args -> <@@ AppSettings.setConfigValue(filePath, key, string (%%args.[0]: float)) @@>)
| ValueParser.TimeSpan _ ->
ProvidedProperty(name, typeof,
isStatic = true,
- getterCode = (fun _ -> <@@ TimeSpan.Parse(getConfigValue(filePath, key), CultureInfo.InvariantCulture) @@>),
- setterCode = fun args -> <@@ setConfigValue(filePath, key, string (%%args.[0]: TimeSpan)) @@>)
+ getterCode = (fun _ -> <@@ TimeSpan.Parse(AppSettings.getConfigValue(filePath, key), CultureInfo.InvariantCulture) @@>),
+ setterCode = fun args -> <@@ AppSettings.setConfigValue(filePath, key, string (%%args.[0]: TimeSpan)) @@>)
| ValueParser.DateTime _ ->
ProvidedProperty(name, typeof,
isStatic = true,
- getterCode = (fun _ -> <@@ DateTime.Parse(getConfigValue(filePath, key), CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal) @@>),
- setterCode = fun args -> <@@ setConfigValue(filePath, key, (%%args.[0]: DateTime).ToString("o")) @@>)
+ getterCode = (fun _ -> <@@ DateTime.Parse(AppSettings.getConfigValue(filePath, key), CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal) @@>),
+ setterCode = fun args -> <@@ AppSettings.setConfigValue(filePath, key, (%%args.[0]: DateTime).ToString("o")) @@>)
| ValueParser.Guid _ ->
ProvidedProperty(name, typeof,
isStatic = true,
- getterCode = (fun _ -> <@@ Guid.Parse(getConfigValue(filePath, key)) @@>),
- setterCode = fun args -> <@@ setConfigValue(filePath, key, (%%args.[0]: Guid).ToString("B")) @@>)
+ getterCode = (fun _ -> <@@ Guid.Parse(AppSettings.getConfigValue(filePath, key)) @@>),
+ setterCode = fun args -> <@@ AppSettings.setConfigValue(filePath, key, (%%args.[0]: Guid).ToString("B")) @@>)
| _ ->
ProvidedProperty(name, typeof,
isStatic = true,
- getterCode = (fun _ -> <@@ getConfigValue(filePath, key) @@>),
- setterCode = fun args -> <@@ setConfigValue(filePath, key, %%args.[0]) @@>)
+ getterCode = (fun _ -> <@@ AppSettings.getConfigValue(filePath, key) @@>),
+ setterCode = fun args -> <@@ AppSettings.setConfigValue(filePath, key, %%args.[0]) @@>)
prop.AddXmlDoc (sprintf "Returns the value from %s with key %s" configFileName key)
prop.AddDefinitionLocation(1, 1, filePath)
@@ -140,7 +103,7 @@ let internal typedAppSettings (context: Context) =
[ ProvidedParameter ("pathOfExe", typeof) ],
typeof,
isStatic = true,
- invokeCode = fun args -> <@@ setExeFilePath filePath %%args.[0] @@>)
+ invokeCode = fun args -> <@@ AppSettings.setExeFilePath filePath %%args.[0] @@>)
executeSelector.AddXmlDoc "Property to change the executable file that is read for configurations. This idea is that you can manage other executables also (e.g. from script)."
typeDef.AddMember executeSelector
@@ -162,6 +125,10 @@ let internal typedAppSettings (context: Context) =
context.WatchFile filePath
typeDef
with _ -> typeDef
- | x -> failwithf "unexpected parameter values %A" x)
- cache.GetOrAdd (typeName, value)))
- appSettings
\ No newline at end of file
+ | x -> failwithf "unexpected parameter values %A" x
+ )
+ appSettings
+ with ex ->
+ debug "Error in AppSettingsProvider: %s\n\t%s" ex.Message ex.StackTrace
+ reraise ()
+
diff --git a/src/FSharp.Configuration.DesignTime/AssemblyInfo.fs b/src/FSharp.Configuration.DesignTime/AssemblyInfo.fs
new file mode 100644
index 00000000..190f5223
--- /dev/null
+++ b/src/FSharp.Configuration.DesignTime/AssemblyInfo.fs
@@ -0,0 +1,17 @@
+// Auto-Generated by FAKE; do not edit
+namespace System
+open System.Reflection
+
+[]
+[]
+[]
+[]
+[]
+do ()
+
+module internal AssemblyVersionInformation =
+ let [] AssemblyTitle = "FSharp.Configuration.DesignTime"
+ let [] AssemblyProduct = "FSharp.Configuration"
+ let [] AssemblyDescription = "The FSharp.Configuration project contains type providers for the configuration of .NET projects."
+ let [] AssemblyVersion = "2.0.0"
+ let [] AssemblyFileVersion = "2.0.0"
diff --git a/src/FSharp.Configuration.DesignTime/FSharp.Configuration.DesignTime.fs b/src/FSharp.Configuration.DesignTime/FSharp.Configuration.DesignTime.fs
new file mode 100644
index 00000000..a5bf948b
--- /dev/null
+++ b/src/FSharp.Configuration.DesignTime/FSharp.Configuration.DesignTime.fs
@@ -0,0 +1,29 @@
+module FSharp.Configuration.ConfigTypeProvider
+
+open FSharp.Configuration.Helper
+open Microsoft.FSharp.Core.CompilerServices
+open ProviderImplementation.ProvidedTypes
+open System.Reflection
+
+[]
+type FSharpConfigurationProvider(cfg: TypeProviderConfig) as this =
+ inherit TypeProviderForNamespaces(cfg, assemblyReplacementMap=[("FSharp.Configuration.DesignTime", "FSharp.Configuration.Runtime")], addDefaultProbingLocation = true)
+
+ let asm = Assembly.GetExecutingAssembly()
+ // check we contain a copy of runtime files, and are not referencing the runtime DLL
+ do assert (typeof.Assembly.GetName().Name = asm.GetName().Name)
+
+ let context = new Context(this, cfg)
+ do this.AddNamespace (
+ rootNamespace,
+ [
+#if NET461
+ ResXProvider.typedResources context
+#endif
+ AppSettingsTypeProvider.typedAppSettings context
+ YamlConfigTypeProvider.typedYamlConfig context
+ IniFileProvider.typedIniFile context ])
+ do this.Disposing.Add (fun _ -> dispose context)
+
+[]
+do ()
diff --git a/src/FSharp.Configuration.DesignTime/FSharp.Configuration.DesignTime.fsproj b/src/FSharp.Configuration.DesignTime/FSharp.Configuration.DesignTime.fsproj
new file mode 100644
index 00000000..eef4c093
--- /dev/null
+++ b/src/FSharp.Configuration.DesignTime/FSharp.Configuration.DesignTime.fsproj
@@ -0,0 +1,47 @@
+
+
+
+
+ Library
+ netstandard2.0;net461
+ true
+ true
+ true
+ PackageReference
+ true
+
+
+ NET461
+
+
+
+
+
+
+
+
+ True
+ paket-files/ProvidedTypes.fsi
+
+
+ True
+ paket-files/ProvidedTypes.fs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PreserveNewest
+
+
+
+
\ No newline at end of file
diff --git a/src/FSharp.Configuration.DesignTime/IniFileProvider.fs b/src/FSharp.Configuration.DesignTime/IniFileProvider.fs
new file mode 100644
index 00000000..0f1b805c
--- /dev/null
+++ b/src/FSharp.Configuration.DesignTime/IniFileProvider.fs
@@ -0,0 +1,77 @@
+module FSharp.Configuration.IniFileProvider
+
+open System
+open FSharp.Configuration
+open ProviderImplementation.ProvidedTypes
+open System.Globalization
+
+let internal typedIniFile (context: Context) =
+ try
+ let iniFile = erasedType thisAssembly rootNamespace "IniFile" None
+
+ iniFile.DefineStaticParameters(
+ parameters = [ ProvidedStaticParameter ("configFileName", typeof) ],
+ instantiationFunction = fun typeName parameterValues ->
+ match parameterValues with
+ | [| :? string as iniFileName |] ->
+ let typeDef = erasedType thisAssembly rootNamespace typeName (Some true)
+ let niceName = createNiceNameProvider()
+ try
+ let filePath = findConfigFile context.ResolutionFolder iniFileName
+ match Ini.Parser.parse filePath with
+ | Choice1Of2 sections ->
+ for section in sections do
+ let sectionTy = ProvidedTypeDefinition(section.Name, Some typeof, hideObjectMethods = true)
+ for setting in section.Settings do
+ let sectionName = section.Name
+ let key = setting.Key
+ let prop =
+ match setting.Value with
+ | ValueParser.Int value -> ProvidedProperty(key, typeof, isStatic = true, getterCode = fun _ ->
+ <@@
+ match Ini.getValue filePath sectionName key with
+ | Some v -> Int32.Parse v
+ | None -> value
+ @@>)
+ | ValueParser.Bool value -> ProvidedProperty(key, typeof, isStatic = true, getterCode = fun _ ->
+ <@@
+ match Ini.getValue filePath sectionName key with
+ | Some v -> Boolean.Parse v
+ | None -> value
+ @@>)
+ | ValueParser.Float value -> ProvidedProperty(key, typeof, isStatic = true, getterCode = fun _ ->
+ <@@
+ match Ini.getValue filePath sectionName key with
+ | Some v -> Double.Parse (v, NumberStyles.Any, CultureInfo.InvariantCulture)
+ | None -> value
+ @@>)
+ | value -> ProvidedProperty(key, typeof, isStatic = true, getterCode = fun _ ->
+ <@@
+ match Ini.getValue filePath sectionName key with
+ | Some v -> v
+ | None -> value
+ @@>)
+
+ prop.AddXmlDoc (sprintf "Returns the value from %s from section %s with key %s" iniFileName section.Name setting.Key)
+ prop.AddDefinitionLocation(1, 1, filePath)
+ sectionTy.AddMember prop
+
+ typeDef.AddMember sectionTy
+ | Choice2Of2 e -> failwithf "%A" e
+
+ let name = niceName "ConfigFileName"
+ let getValue = <@@ filePath @@>
+ let prop = ProvidedProperty(name, typeof, isStatic = true, getterCode = fun _ -> getValue)
+
+ prop.AddXmlDoc "Returns the Filename"
+
+ typeDef.AddMember prop
+ context.WatchFile filePath
+ typeDef
+ with _ -> typeDef
+ | x -> failwithf "unexpected parameter values %A" x
+ )
+ iniFile
+ with ex ->
+ debug "Error in IniProvider: %s\n\t%s" ex.Message ex.StackTrace
+ reraise ()
diff --git a/src/FSharp.Configuration/ResXProvider.fs b/src/FSharp.Configuration.DesignTime/ResXProvider.fs
similarity index 61%
rename from src/FSharp.Configuration/ResXProvider.fs
rename to src/FSharp.Configuration.DesignTime/ResXProvider.fs
index 31a0f246..bd0fd274 100644
--- a/src/FSharp.Configuration/ResXProvider.fs
+++ b/src/FSharp.Configuration.DesignTime/ResXProvider.fs
@@ -1,5 +1,7 @@
module FSharp.Configuration.ResXProvider
+#if NET461
+
open System
open System.IO
open System.Reflection
@@ -7,27 +9,12 @@ open System.Resources
open System.ComponentModel.Design
open System.Collections
open System.Collections.Concurrent
-open System.Runtime.Caching
open ProviderImplementation.ProvidedTypes
open FSharp.Configuration.Helper
-let readFile (filePath: FilePath) : ResXDataNode list =
- use reader = new ResXResourceReader(filePath, UseResXDataNodes = true)
- reader
- |> Seq.cast
- |> Seq.map (fun (x: DictionaryEntry) -> x.Value :?> ResXDataNode)
- |> Seq.toList
-
-let resourceManCache = ConcurrentDictionary ()
-
-let readValue resourceName assembly key =
- let resourceMan = resourceManCache.GetOrAdd ((resourceName, assembly),
- fun _ -> ResourceManager (resourceName, assembly))
- downcast (resourceMan.GetObject key)
-
/// Converts ResX entries to provided properties
let private toProperties (filePath: FilePath) resourceName : MemberInfo list =
- readFile filePath
+ ResX.readFile filePath
|> List.map (fun node ->
let key = node.Name
let ty = node.GetValueTypeName Unchecked.defaultof |> Type.GetType
@@ -36,7 +23,7 @@ let private toProperties (filePath: FilePath) resourceName : MemberInfo list =
key,
ty,
isStatic = true,
- getterCode = fun _ -> <@@ readValue resourceName (Assembly.GetExecutingAssembly ()) key @@>)
+ getterCode = fun _ -> <@@ ResX.readValue resourceName (Assembly.GetExecutingAssembly ()) key @@>)
if not (String.IsNullOrEmpty node.Comment) then
resource.AddXmlDoc node.Comment
resource :> MemberInfo)
@@ -52,18 +39,16 @@ let private createResXProvider typeName resourceName filePath =
let inline private replace (oldChar:char) (newChar:char) (s:string) = s.Replace(oldChar, newChar)
let internal typedResources (context: Context) =
- let resXType = erasedType thisAssembly rootNamespace "ResXProvider" None
- let cache = new MemoryCache("ResXProvider")
- context.AddDisposable cache
+ try
+ let resXType = erasedType thisAssembly rootNamespace "ResXProvider" None
- resXType.DefineStaticParameters(
- parameters = [ ProvidedStaticParameter ("file", typeof) ],
- instantiationFunction = (fun typeName parameterValues ->
- let value = lazy (
+ resXType.DefineStaticParameters(
+ parameters = [ ProvidedStaticParameter ("file", typeof) ],
+ instantiationFunction = fun typeName parameterValues ->
match parameterValues with
| [| :? string as resourcePath|] ->
let filePath = findConfigFile context.ResolutionFolder resourcePath
- if not (File.Exists filePath) then invalidArg "file" "Resouce file not found"
+ if not (File.Exists filePath) then invalidArg "file" "Resource file not found"
let resourceName =
Path.ChangeExtension (resourcePath, null)
|> replace '\\' '.'
@@ -71,6 +56,11 @@ let internal typedResources (context: Context) =
let providedType = createResXProvider typeName resourceName filePath
context.WatchFile filePath
providedType
- | _ -> failwith "unexpected parameter values")
- cache.GetOrAdd (typeName, value)))
- resXType
\ No newline at end of file
+ | _ -> failwith "unexpected parameter values"
+ )
+ resXType
+ with ex ->
+ debug "Error in ResxProvider: %s\n\t%s" ex.Message ex.StackTrace
+ reraise ()
+
+#endif
diff --git a/src/FSharp.Configuration.DesignTime/YamlConfigProvider.fs b/src/FSharp.Configuration.DesignTime/YamlConfigProvider.fs
new file mode 100644
index 00000000..91fd6dd4
--- /dev/null
+++ b/src/FSharp.Configuration.DesignTime/YamlConfigProvider.fs
@@ -0,0 +1,259 @@
+module FSharp.Configuration.YamlConfigTypeProvider
+
+#nowarn "57"
+#nowarn "25"
+
+open System.Reflection
+open System
+open System.IO
+open System.Collections.Generic
+
+open Microsoft.FSharp.Quotations
+
+open YamlDotNet.Serialization
+
+open ProviderImplementation.ProvidedTypes
+open ProviderImplementation.ProvidedTypes.UncheckedQuotations
+open FSharp.Configuration.Helper
+open FSharp.Configuration.Yaml
+
+module private TypesFactory =
+ open Parser
+
+ type Scalar with
+ member x.ToExpr() =
+ match x with
+ | Int x -> Expr.Value x
+ | Int64 x -> Expr.Value x
+ | String x -> Expr.Value x
+ | Bool x -> Expr.Value x
+ | Float x -> Expr.Value x
+ | TimeSpan x ->
+ let parse = typeof.GetMethod("Parse", [|typeof|])
+ Expr.Call(parse, [Expr.Value (x.ToString())])
+ | Uri x ->
+ let ctr = typeof.GetConstructor [|typeof|]
+ Expr.NewObject(ctr, [Expr.Value x.OriginalString])
+ | Guid x ->
+ let parse = typeof.GetMethod("Parse", [|typeof|])
+ Expr.Call(parse, [Expr.Value (x.ToString())])
+
+ type T =
+ { MainType: Type option
+ Types: MemberInfo list
+ Init: Expr -> Expr }
+
+ let private generateChangedEvent =
+ let eventType = typeof
+ let delegateType = typeof
+ let combineMethod = delegateType.GetMethod("Combine", [|delegateType; delegateType|])
+ let removeMethod = delegateType.GetMethod("Remove", [|delegateType; delegateType|])
+
+ fun() ->
+ let eventField = ProvidedField("_changed", eventType)
+
+ let changeEvent m me v =
+ let current = Expr.Coerce (Expr.FieldGetUnchecked(me, eventField), delegateType)
+ let other = Expr.Coerce (v, delegateType)
+ Expr.Coerce (Expr.Call (m, [current; other]), eventType)
+
+ let adder = changeEvent combineMethod
+ let remover = changeEvent removeMethod
+
+ let event =
+ ProvidedEvent(
+ "Changed",
+ eventType,
+ adderCode = (fun [me; v] -> Expr.FieldSetUnchecked(me, eventField, adder me v)),
+ removerCode = (fun [me; v] -> Expr.FieldSetUnchecked(me, eventField, remover me v))
+ )
+ eventField, event
+
+ let rec transform readOnly name (node: Node) =
+ match name, node with
+ | Some name, Scalar x -> transformScalar readOnly name x
+ | _, Map m -> transformMap readOnly name m
+ | Some name, List l -> transformList readOnly name true l
+ | None, _ -> failwithf "Only Maps are allowed at the root level."
+
+ and transformScalar readOnly name (node: Scalar) =
+ let rawType = node.UnderlyingType
+ let field = ProvidedField("_" + name, rawType)
+ let prop =
+ if readOnly
+ then ProvidedProperty (name, rawType, isStatic = false,
+ getterCode = (fun [me] -> Expr.FieldGetUnchecked(me, field)))
+ else ProvidedProperty (name, rawType, isStatic = false,
+ getterCode = (fun [me] -> Expr.FieldGetUnchecked(me, field)),
+ setterCode = (fun [me;v] -> Expr.FieldSetUnchecked(me, field, v)))
+ let initValue = node.ToExpr()
+
+ { MainType = Some rawType
+ Types = [field :> MemberInfo; prop :> MemberInfo]
+ Init = fun me -> Expr.FieldSetUnchecked(me, field, initValue) }
+
+ and transformList readOnly name generateField (children: Node list) =
+ let elements =
+ children
+ |> List.map (function
+ | Scalar x ->
+ { MainType = Some x.UnderlyingType
+ Types = []
+ Init = fun _ -> x.ToExpr() }
+ | Map m -> transformMap readOnly None m
+ | List l -> transformList readOnly (name + "_Items") false l)
+
+ let elements, elementType =
+ match elements |> Seq.groupBy (fun n -> n.MainType) |> Seq.map fst |> Seq.toList with
+ | [Some ty] -> elements, ty
+ | [None] ->
+ // Sequence of maps: https://github.com/fsprojects/FSharp.Configuration/issues/51
+ // TODOL Construct the type from all the elements (instead of only the first entry)
+ let headChildren = match children |> Seq.head with Map m -> m | _ -> failwith "expected a sequence of maps."
+
+ let childTypes, childInits = foldChildren readOnly headChildren
+ let eventField, event = generateChangedEvent()
+
+ let mapTy =
+ ProvidedTypeDefinition(
+ name + "_Item_Type",
+ Some typeof,
+ hideObjectMethods = true,
+ isErased = false,
+ SuppressRelocation = false
+ )
+
+ let ctr = ProvidedConstructor([], invokeCode = (fun [me] -> childInits me))
+ mapTy.AddMembers childTypes
+ mapTy.AddMember ctr
+ mapTy.AddMember eventField
+ mapTy.AddMember event
+ [{ MainType = Some (mapTy :> _)
+ Types = [mapTy :> MemberInfo]
+ Init = fun _ -> Expr.NewObject(ctr, []) }],
+ mapTy :> _
+ | types -> failwithf "List cannot contain elements of heterogeneous types (attempt to mix types: %A)."
+ (types |> List.map (Option.map (fun x -> x.Name)))
+
+ let propType = ProvidedTypeBuilder.MakeGenericType(typedefof>, [elementType])
+ let ctrType = ProvidedTypeBuilder.MakeGenericType(typedefof>, [elementType])
+
+ let listCtr =
+ let meth = typeof.GetMethod("CreateResizeArray")
+ ProvidedTypeBuilder.MakeGenericMethod(meth, [elementType])
+
+ let childTypes = elements |> List.collect (fun x -> x.Types)
+
+ let initValue ty me =
+ Expr.Coerce(
+ Expr.CallUnchecked(listCtr, [Expr.Coerce(Expr.NewArray(elementType, elements |> List.map (fun x -> x.Init me)), ctrType)]),
+ ty)
+
+ if generateField then
+ let fieldType = ProvidedTypeBuilder.MakeGenericType(typedefof>, [elementType])
+ let field = ProvidedField("_" + name, fieldType)
+
+ let prop =
+ if readOnly
+ then ProvidedProperty (name, propType, isStatic=false,
+ getterCode = (fun [me] -> Expr.Coerce(Expr.FieldGetUnchecked(me, field), propType)))
+ else ProvidedProperty (name, propType, isStatic=false,
+ getterCode = (fun [me] -> Expr.Coerce(Expr.FieldGetUnchecked(me, field), propType)),
+ setterCode = (fun [me; v] -> Expr.FieldSetUnchecked(me, field, Expr.Coerce(Expr.CallUnchecked(listCtr, [Expr.Coerce(v, ctrType)]), fieldType))))
+
+ { MainType = Some fieldType
+ Types = childTypes @ [field :> MemberInfo; prop :> MemberInfo]
+ Init = fun me -> Expr.FieldSetUnchecked(me, field, initValue fieldType me) }
+ else
+ { MainType = Some propType
+ Types = childTypes
+ Init = initValue propType }
+
+ and foldChildren readOnly (children: (string * Node) list) =
+ let childTypes, childInits =
+ children
+ |> List.map (fun (name, node) -> transform readOnly (Some name) node)
+ |> List.fold (fun (types, inits) t -> types @ t.Types, inits @ [t.Init]) ([], [])
+
+ let affinedChildInits me =
+ childInits
+ |> List.fold (fun acc expr -> expr me :: acc) []
+ |> List.reduce (fun res expr -> Expr.Sequential(res, expr))
+
+ childTypes, affinedChildInits
+
+ and transformMap readOnly name (children: (string * Node) list) =
+ let childTypes, childInits = foldChildren readOnly children
+ let eventField, event = generateChangedEvent()
+ match name with
+ | Some name ->
+ let mapTy = ProvidedTypeDefinition(name + "_Type", Some typeof, hideObjectMethods=true,
+ isErased=false, SuppressRelocation=false)
+ let ctr = ProvidedConstructor([], invokeCode = (fun [me] -> childInits me))
+ mapTy.AddMembers childTypes
+ mapTy.AddMember ctr
+ mapTy.AddMember eventField
+ mapTy.AddMember event
+
+ let field = ProvidedField("_" + name, mapTy)
+ let prop = ProvidedProperty (name, mapTy, isStatic = false, getterCode = (fun [me] -> Expr.FieldGetUnchecked(me, field)))
+ { MainType = Some (mapTy :> _)
+ Types = [mapTy :> MemberInfo; field :> MemberInfo; prop :> MemberInfo]
+ Init = fun me -> Expr.FieldSetUnchecked(me, field, Expr.NewObject(ctr, []))
+ }
+ | None ->
+ { MainType = None
+ Types = [eventField :> MemberInfo; event :> MemberInfo] @ childTypes
+ Init = childInits }
+
+
+let internal typedYamlConfig (context: Context) =
+ try
+ let baseTy = typeof
+
+ let asm = Assembly.GetExecutingAssembly()
+ let yamlConfig = ProvidedTypeDefinition(asm, rootNamespace, "YamlConfig", Some baseTy, isErased = false)
+
+ let staticParams =
+ [ ProvidedStaticParameter ("FilePath", typeof, "")
+ ProvidedStaticParameter ("ReadOnly", typeof, false)
+ ProvidedStaticParameter ("YamlText", typeof, "")
+ ProvidedStaticParameter ("InferTypesFromStrings", typeof, true) ]
+
+ yamlConfig.AddXmlDoc
+ """Statically typed YAML config.
+ Path to YAML file.
+ Whether the resulting properties will be read-only or not.
+ Yaml as text. Mutually exclusive with FilePath parameter."""
+
+ yamlConfig.DefineStaticParameters(
+ parameters = staticParams,
+ instantiationFunction = fun typeName paramValues ->
+ let createTy yaml readOnly inferTypesFromStrings =
+ let myAssem = ProvidedAssembly()
+ let ty = ProvidedTypeDefinition (myAssem, rootNamespace, typeName, Some baseTy, isErased = false, hideObjectMethods = true)
+ let types = TypesFactory.transform readOnly None (Parser.parse inferTypesFromStrings yaml)
+ let ctr = ProvidedConstructor([], invokeCode = fun (me :: _) -> types.Init me)
+ let baseCtor = baseTy.GetConstructor(BindingFlags.Public ||| BindingFlags.Instance, null, [|typeof|], null)
+ ctr.BaseConstructorCall <- fun [me] -> baseCtor, [me; Expr.Value inferTypesFromStrings]
+ ty.AddMembers (ctr :> MemberInfo :: types.Types)
+ myAssem.AddTypes [ty]
+ ty
+
+ match paramValues with
+ | [| :? string as filePath; :? bool as readOnly; :? string as yamlText; :? bool as inferTypesFromStrings |] ->
+ match filePath, yamlText with
+ | "", "" -> failwith "You must specify either FilePath or YamlText parameter."
+ | "", yamlText -> createTy yamlText readOnly inferTypesFromStrings
+ | filePath, _ ->
+ let filePath = findConfigFile context.ResolutionFolder filePath
+ context.WatchFile filePath
+ createTy (File.ReadAllText filePath) readOnly inferTypesFromStrings
+ | _ -> failwith "Wrong parameters"
+
+ )
+
+ yamlConfig
+ with ex ->
+ debug "Error in YamlProvider: %s\n\t%s" ex.Message ex.StackTrace
+ reraise ()
\ No newline at end of file
diff --git a/src/FSharp.Configuration.DesignTime/paket.references b/src/FSharp.Configuration.DesignTime/paket.references
new file mode 100644
index 00000000..a39c40c2
--- /dev/null
+++ b/src/FSharp.Configuration.DesignTime/paket.references
@@ -0,0 +1,6 @@
+File:ProvidedTypes.fsi
+File:ProvidedTypes.fs
+
+FSharp.Core
+YamlDotNet
+System.Configuration.ConfigurationManager
diff --git a/src/FSharp.Configuration.Runtime/AppSettingsProvider.Runtime.fs b/src/FSharp.Configuration.Runtime/AppSettingsProvider.Runtime.fs
new file mode 100644
index 00000000..3872a4c4
--- /dev/null
+++ b/src/FSharp.Configuration.Runtime/AppSettingsProvider.Runtime.fs
@@ -0,0 +1,48 @@
+module FSharp.Configuration.AppSettings
+
+open FSharp.Configuration.Helper
+open ProviderImplementation.ProvidedTypes
+open System
+open System.Configuration
+open System.Collections.Generic
+open System.Globalization
+#if NET461
+open System.Web.Hosting
+#endif
+
+let mutable private exePath = Map.empty
+let setExeFilePath key filePath = exePath <- exePath.Add(key, filePath)
+
+let getConfig file =
+ let path = exePath
+ if path.ContainsKey(file) && System.IO.File.Exists(path.[file]) then
+ ConfigurationManager.OpenExeConfiguration path.[file]
+ else
+#if NET461
+ if HostingEnvironment.IsHosted then
+ Web.Configuration.WebConfigurationManager.OpenWebConfiguration "~"
+ else ConfigurationManager.OpenExeConfiguration ConfigurationUserLevel.None
+#else
+ ConfigurationManager.OpenExeConfiguration ConfigurationUserLevel.None
+#endif
+
+let getConfigValue(file,key) =
+ let conf = getConfig file
+ match conf.AppSettings.Settings.[key] with
+ | null -> raise <| KeyNotFoundException (sprintf "Cannot find name %s in section of config file. (%s)" key conf.FilePath)
+ | settings -> settings.Value
+
+let setConfigValue(file, key, value) =
+ let config = getConfig file
+ config.AppSettings.Settings.[key].Value <- value
+ config.Save()
+
+let getConnectionString(file, key: string) =
+ match getConfig(file).ConnectionStrings.ConnectionStrings.[key] with
+ | null -> raise <| KeyNotFoundException (sprintf "Cannot find name %s in section of config file." key)
+ | section -> section.ConnectionString
+
+let setConnectionString(file, key: string, value) =
+ let config = getConfig file
+ config.ConnectionStrings.ConnectionStrings.[key].ConnectionString <- value
+ config.Save()
\ No newline at end of file
diff --git a/src/FSharp.Configuration.Runtime/AssemblyInfo.fs b/src/FSharp.Configuration.Runtime/AssemblyInfo.fs
new file mode 100644
index 00000000..9a0e3310
--- /dev/null
+++ b/src/FSharp.Configuration.Runtime/AssemblyInfo.fs
@@ -0,0 +1,17 @@
+// Auto-Generated by FAKE; do not edit
+namespace System
+open System.Reflection
+
+[]
+[]
+[]
+[]
+[]
+do ()
+
+module internal AssemblyVersionInformation =
+ let [] AssemblyTitle = "FSharp.Configuration.Runtime"
+ let [] AssemblyProduct = "FSharp.Configuration"
+ let [] AssemblyDescription = "The FSharp.Configuration project contains type providers for the configuration of .NET projects."
+ let [] AssemblyVersion = "2.0.0"
+ let [] AssemblyFileVersion = "2.0.0"
diff --git a/src/FSharp.Configuration.Runtime/FSharp.Configuration.Runtime.fs b/src/FSharp.Configuration.Runtime/FSharp.Configuration.Runtime.fs
new file mode 100644
index 00000000..af4e54e8
--- /dev/null
+++ b/src/FSharp.Configuration.Runtime/FSharp.Configuration.Runtime.fs
@@ -0,0 +1,5 @@
+namespace FSharp.Configuration.Yaml
+
+// Put the TypeProviderAssemblyAttribute in the runtime DLL, pointing to the design-time DLL
+[]
+do ()
diff --git a/src/FSharp.Configuration.Runtime/FSharp.Configuration.Runtime.fsproj b/src/FSharp.Configuration.Runtime/FSharp.Configuration.Runtime.fsproj
new file mode 100644
index 00000000..0b731f44
--- /dev/null
+++ b/src/FSharp.Configuration.Runtime/FSharp.Configuration.Runtime.fsproj
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+ Library
+ netstandard2.0; net461
+ true
+ true
+
+
+ NET461
+
+
+
+
+
+
+
+
+ True
+ paket-files/ProvidedTypes.fsi
+
+
+ True
+ paket-files/ProvidedTypes.fs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/FSharp.Configuration.Runtime/IniFileProvider.Runtime.fs b/src/FSharp.Configuration.Runtime/IniFileProvider.Runtime.fs
new file mode 100644
index 00000000..ecb4ab87
--- /dev/null
+++ b/src/FSharp.Configuration.Runtime/IniFileProvider.Runtime.fs
@@ -0,0 +1,76 @@
+module FSharp.Configuration.Ini
+
+open System
+open System.IO
+
+module Parser =
+ open System.Text.RegularExpressions
+
+ type Key = string
+ type Value = string
+ type Setting = { Key: Key; Value: Value }
+ type SectionName = string
+ type Section = { Name: SectionName; Settings: Setting list }
+
+ type Stream = Stream of int * string list
+
+ let (|Regex|_|) pattern = function
+ | Stream (n, line :: rest) ->
+ let m = Regex.Match (line, pattern)
+ if m.Success then
+ let values = [ for gr in m.Groups -> gr.Value ]
+ Some (values, Stream (n, rest))
+ else None
+ | _ -> None
+
+ let (|Comment|_|) = function
+ | Regex @"^\s*;.*" (_, s) -> Some s
+ | _ -> None
+
+ let (|Header|_|) = function
+ | Regex @"\[\s*(\S+)\s*\]" ([_; name], s) -> Some (name, s)
+ | _ -> None
+
+ let (|Setting|_|) = function
+ | Regex @"\s*(\S+)\s*=\s*(.*)" ([_; key; value], s) ->
+ Some ({ Key = key; Value = value.Trim() }, s)
+ | _ -> None
+
+ let (|Settings|_|) s =
+ let rec loop s settings =
+ match s with
+ | Setting (setting, s) -> loop s (setting :: settings)
+ | Comment s -> loop s settings
+ | _ -> (List.rev settings, s)
+ let settings, s = loop s []
+ Some (settings, s)
+
+ let rec (|Section|_|) = function
+ | Header (name, Settings (settings, s)) -> Some ({ Name = name; Settings = settings }, s)
+ | _ -> None
+
+ let (|Sections|_|) s =
+ let rec loop s sections =
+ match s with
+ | Section (section, s) -> loop s (section :: sections)
+ | Comment s -> loop s sections
+ | _ -> (sections |> List.rev, s)
+ let sections, s = loop s []
+ Some (sections, s)
+
+ let streamOfLines lines = Stream (0, lines |> Seq.filter (not << String.IsNullOrWhiteSpace) |> List.ofSeq)
+ let streamOfFile path = File.ReadLines path |> streamOfLines
+ let parse path =
+ match streamOfFile path with
+ | Sections (sections, _) -> Choice1Of2 sections
+ | e -> Choice2Of2 e
+
+let getValue (iniFilePath: string) (section: string) (key: string) =
+ match Parser.parse iniFilePath with
+ | Choice1Of2 sections ->
+ maybe {
+ let! section = sections |> List.tryFind (fun s -> s.Name = section)
+ let! setting = section.Settings |> List.tryFind (fun s -> s.Key = key)
+ return setting.Value
+ }
+ | Choice2Of2 _ -> None
diff --git a/src/FSharp.Configuration.Runtime/ResXProvider.Runtime.fs b/src/FSharp.Configuration.Runtime/ResXProvider.Runtime.fs
new file mode 100644
index 00000000..845781a5
--- /dev/null
+++ b/src/FSharp.Configuration.Runtime/ResXProvider.Runtime.fs
@@ -0,0 +1,29 @@
+module FSharp.Configuration.ResX
+
+#if NET461
+
+open System
+open System.IO
+open System.Reflection
+open System.Resources
+open System.ComponentModel.Design
+open System.Collections
+open System.Collections.Concurrent
+open ProviderImplementation.ProvidedTypes
+open FSharp.Configuration.Helper
+
+let readFile (filePath: FilePath) : ResXDataNode list =
+ use reader = new ResXResourceReader(filePath, UseResXDataNodes = true)
+ reader
+ |> Seq.cast
+ |> Seq.map (fun (x: DictionaryEntry) -> x.Value :?> ResXDataNode)
+ |> Seq.toList
+
+let resourceManCache = ConcurrentDictionary ()
+
+let readValue resourceName assembly key =
+ let resourceMan = resourceManCache.GetOrAdd ((resourceName, assembly),
+ fun _ -> ResourceManager (resourceName, assembly))
+ downcast (resourceMan.GetObject key)
+
+#endif
diff --git a/src/FSharp.Configuration/TypeProviders.Helper.fs b/src/FSharp.Configuration.Runtime/TypeProviders.Helper.fs
similarity index 91%
rename from src/FSharp.Configuration/TypeProviders.Helper.fs
rename to src/FSharp.Configuration.Runtime/TypeProviders.Helper.fs
index 88314b2c..94300bef 100644
--- a/src/FSharp.Configuration/TypeProviders.Helper.fs
+++ b/src/FSharp.Configuration.Runtime/TypeProviders.Helper.fs
@@ -21,7 +21,12 @@ let inline satisfies predicate (charOption:option) =
| _ -> None
let dispose (x: IDisposable) = if x = null then () else x.Dispose()
-let inline debug msg = Printf.kprintf Diagnostics.Debug.WriteLine msg
+let debug msg =
+ let dt = DateTime.Now
+ let writer msg =
+ Diagnostics.Debug.WriteLine msg
+// System.IO.File.AppendAllLines("debug.log", [sprintf "[%O] %s\n" dt msg])
+ Printf.kprintf writer msg
let (|EOF|_|) = function
| Some _ -> None
@@ -118,6 +123,7 @@ module ValueParser =
let (|Bool|_|) = tryParseWith Boolean.TryParse
let (|Int|_|) = tryParseWith Int32.TryParse
+ let (|Int64|_|) = tryParseWith Int64.TryParse
let (|Float|_|) = tryParseWith (fun x -> Double.TryParse(x, NumberStyles.Any, CultureInfo.InvariantCulture))
let (|TimeSpan|_|) = tryParseWith (fun x -> TimeSpan.TryParse(x, CultureInfo.InvariantCulture))
let (|Guid|_|) = tryParseWith Guid.TryParse
@@ -191,12 +197,11 @@ let createNiceNameProvider() =
set.Add name |> ignore
name
-let findConfigFile resolutionFolder configFileName =
- if Path.IsPathRooted configFileName then
- configFileName
- else
- let path = configFileName.Split([|@"\"; "/"|], StringSplitOptions.None)
- Array.append [|resolutionFolder|] path |> Path.Combine
+let findConfigFile resolutionFolder (configFileName:string) =
+ if Path.IsPathRooted configFileName
+ then configFileName
+ else resolutionFolder > configFileName
+ |> Path.GetFullPath
let erasedType<'T> assemblyName rootNamespace typeName (hideObjectMethods: bool option) =
match hideObjectMethods with
@@ -262,7 +267,7 @@ module File =
watcher.EnableRaisingEvents <- true
watcher :> IDisposable
- let getFullPath resolutionFolder fileName =
+ let getFullPath resolutionFolder (fileName:string) =
if Path.IsPathRooted fileName then
fileName
else resolutionFolder > fileName
@@ -312,19 +317,19 @@ type Context (provider: TypeProviderForNamespaces, cfg: TypeProviderConfig) =
interface IDisposable with
member __.Dispose() = agent.Post Cancel
-open System.Runtime.Caching
-
-type MemoryCache with
- member x.GetOrAdd(key: string, value: Lazy, ?expiration: TimeSpan) =
- let policy = CacheItemPolicy()
- policy.SlidingExpiration <- defaultArg expiration <| TimeSpan.FromHours 24.
-
- match x.AddOrGetExisting(key, value, policy) with
- | :? Lazy as item ->
- try item.Value
- with _ ->
- x.Remove key |> ignore
- value.Value
- | x ->
- assert(x = null)
- value.Value
+// open System.Runtime.Caching
+
+// type MemoryCache with
+// member x.GetOrAdd(key: string, value: Lazy, ?expiration: TimeSpan) =
+// let policy = CacheItemPolicy()
+// policy.SlidingExpiration <- defaultArg expiration <| TimeSpan.FromHours 24.
+
+// match x.AddOrGetExisting(key, value, policy) with
+// | :? Lazy as item ->
+// try item.Value
+// with _ ->
+// x.Remove key |> ignore
+// value.Value
+// | x ->
+// assert(x = null)
+// value.Value
diff --git a/src/FSharp.Configuration/YamlConfigProvider.fs b/src/FSharp.Configuration.Runtime/YamlConfigProvider.Runtime.fs
similarity index 51%
rename from src/FSharp.Configuration/YamlConfigProvider.fs
rename to src/FSharp.Configuration.Runtime/YamlConfigProvider.Runtime.fs
index d7302a37..eaf98542 100644
--- a/src/FSharp.Configuration/YamlConfigProvider.fs
+++ b/src/FSharp.Configuration.Runtime/YamlConfigProvider.Runtime.fs
@@ -1,26 +1,18 @@
-module FSharp.Configuration.YamlConfigTypeProvider
-
-#nowarn "57"
+namespace FSharp.Configuration.Yaml
open System.Reflection
open System
open System.IO
open System.Collections.Generic
-open System.Runtime.Caching
-
-open Microsoft.FSharp.Quotations
-
-open SharpYaml.Serialization
-open SharpYaml.Serialization.Serializers
-open FSharp.Configuration.Helper
-open ProviderImplementation.ProvidedTypes
-open ProviderImplementation.ProvidedTypes.UncheckedQuotations
+open YamlDotNet.Core
+open YamlDotNet.Serialization
+open FSharp.Configuration
type Helper () =
static member CreateResizeArray<'a>(data : 'a seq) :ResizeArray<'a> = ResizeArray<'a>(data)
-module private Parser =
+module Parser =
type Scalar =
| Int of int
| Int64 of int64
@@ -32,6 +24,10 @@ module private Parser =
| Guid of Guid
static member ParseStr = function
+ | ValueParser.Bool x -> Bool x
+ | ValueParser.Int x -> Int x
+ | ValueParser.Int64 x -> Int64 x
+ | ValueParser.Float x -> Float x
| ValueParser.TimeSpan x -> TimeSpan x
| ValueParser.Uri x -> Uri x
| ValueParser.Guid x -> Guid x
@@ -86,12 +82,13 @@ module private Parser =
|> Map
| scalar -> Scalar (Scalar.FromObj inferTypesFromStrings scalar)
- let settings = SerializerSettings (EmitDefaultValues = true, EmitTags = false, SortKeyForMapping = false)
- let serializer = Serializer(settings)
+ //let settings = SerializerSettings (EmitDefaultValues = true, EmitTags = false, SortKeyForMapping = false)
+ let deserializer = DeserializerBuilder().Build()
fun text ->
- try serializer.Deserialize(fromText=text) |> loop
+ try
+ deserializer.Deserialize(text) |> loop
with
- | :? SharpYaml.YamlException as e when e.InnerException <> null ->
+ | :? YamlDotNet.Core.YamlException as e when e.InnerException <> null ->
raise e.InnerException // inner exceptions are much more informative
| _ -> reraise()
@@ -181,13 +178,13 @@ module private Parser =
if field.FieldType <> fieldType then
failwithf "Cannot assign %O to %O." fieldType.Name field.FieldType.Name
- let isComparable (x: obj) = x :? Uri || x :? IComparable
let values = field.GetValue target :?> Collections.IEnumerable |> Seq.cast
+ let itemType = fieldType.GetGenericArguments().[0]
// NOTE: another solution would be to make our provided type implement IComparable
// On the other side I'm not completely sure why we sort at all.
// What if the ordering of the item matters for the user?
- let isSortable = values |> Seq.forall isComparable
-
+ let isSortable =
+ itemType.IsSubclassOf(typeof) || typeof.IsAssignableFrom(itemType)
let sort (xs: obj seq) =
xs
|> Seq.sortBy (function
@@ -196,7 +193,6 @@ module private Parser =
| x -> failwithf "%A is not comparable, so it cannot be included into a list." x)
|> Seq.toList
- let itemType = fieldType.GetGenericArguments().[0]
let updaters = makeListItemUpdaters itemType updaters
let oldValues, newValues =
@@ -236,191 +232,10 @@ module private Parser =
//|> fun x -> printfn "Updated. %d events to raise: %A" (Seq.length x) x; Seq.toList x
|> Seq.iter (fun h -> h.Method.Invoke(h.Target, [|box target; EventArgs.Empty|]) |> ignore)
-module private TypesFactory =
- open Parser
-
- type Scalar with
- member x.ToExpr() =
- match x with
- | Int x -> Expr.Value x
- | Int64 x -> Expr.Value x
- | String x -> Expr.Value x
- | Bool x -> Expr.Value x
- | Float x -> Expr.Value x
- | TimeSpan x ->
- let parse = typeof.GetMethod("Parse", [|typeof|])
- Expr.Call(parse, [Expr.Value (x.ToString())])
- | Uri x ->
- let ctr = typeof.GetConstructor [|typeof|]
- Expr.NewObject(ctr, [Expr.Value x.OriginalString])
- | Guid x ->
- let parse = typeof.GetMethod("Parse", [|typeof|])
- Expr.Call(parse, [Expr.Value (x.ToString())])
-
- type T =
- { MainType: Type option
- Types: MemberInfo list
- Init: Expr -> Expr }
-
- let private generateChangedEvent =
- let eventType = typeof
- let delegateType = typeof
- let combineMethod = delegateType.GetMethod("Combine", [|delegateType; delegateType|])
- let removeMethod = delegateType.GetMethod("Remove", [|delegateType; delegateType|])
-
- fun() ->
- let eventField = ProvidedField("_changed", eventType)
-
- let changeEvent m me v =
- let current = Expr.Coerce (Expr.FieldGet(me, eventField), delegateType)
- let other = Expr.Coerce (v, delegateType)
- Expr.Coerce (Expr.Call (m, [current; other]), eventType)
-
- let adder = changeEvent combineMethod
- let remover = changeEvent removeMethod
-
- let event =
- ProvidedEvent(
- "Changed",
- eventType,
- adderCode = (fun [me; v] -> Expr.FieldSet(me, eventField, adder me v)),
- removerCode = (fun [me; v] -> Expr.FieldSet(me, eventField, remover me v))
- )
- eventField, event
-
- let rec transform readOnly name (node: Node) =
- match name, node with
- | Some name, Scalar x -> transformScalar readOnly name x
- | _, Map m -> transformMap readOnly name m
- | Some name, List l -> transformList readOnly name true l
- | None, _ -> failwithf "Only Maps are allowed at the root level."
-
- and transformScalar readOnly name (node: Scalar) =
- let rawType = node.UnderlyingType
- let field = ProvidedField("_" + name, rawType)
- let prop =
- if readOnly
- then ProvidedProperty (name, rawType, isStatic = false, getterCode = (fun [me] -> Expr.FieldGet(me, field)))
- else ProvidedProperty (name, rawType, isStatic = false, getterCode = (fun [me] -> Expr.FieldGet(me, field)), setterCode = (fun [me;v] -> Expr.FieldSet(me, field, v)))
- let initValue = node.ToExpr()
-
- { MainType = Some rawType
- Types = [field :> MemberInfo; prop :> MemberInfo]
- Init = fun me -> Expr.FieldSet(me, field, initValue) }
-
- and transformList readOnly name generateField (children: Node list) =
- let elements =
- children
- |> List.map (function
- | Scalar x ->
- { MainType = Some x.UnderlyingType
- Types = []
- Init = fun _ -> x.ToExpr() }
- | Map m -> transformMap readOnly None m
- | List l -> transformList readOnly (name + "_Items") false l)
-
- let elements, elementType =
- match elements |> Seq.groupBy (fun n -> n.MainType) |> Seq.map fst |> Seq.toList with
- | [Some ty] -> elements, ty
- | [None] ->
- // Sequence of maps: https://github.com/fsprojects/FSharp.Configuration/issues/51
- // TODOL Construct the type from all the elements (instead of only the first entry)
- let headChildren = match children |> Seq.head with Map m -> m | _ -> failwith "expected a sequence of maps."
-
- let childTypes, childInits = foldChildren readOnly headChildren
- let eventField, event = generateChangedEvent()
-
- let mapTy =
- ProvidedTypeDefinition(
- name + "_Item_Type",
- Some typeof,
- hideObjectMethods = true,
- isErased = false,
- SuppressRelocation = false
- )
-
- let ctr = ProvidedConstructor([], invokeCode = (fun [me] -> childInits me))
- mapTy.AddMembers (ctr :> MemberInfo :: childTypes)
- mapTy.AddMember eventField
- mapTy.AddMember event
- [{ MainType = Some (mapTy :> _)
- Types = [mapTy :> MemberInfo]
- Init = fun _ -> Expr.NewObject(ctr, []) }],
- mapTy :> _
- | types -> failwithf "List cannot contain elements of heterogeneous types (attempt to mix types: %A)."
- (types |> List.map (Option.map (fun x -> x.Name)))
-
- let propType = ProvidedTypeBuilder.MakeGenericType(typedefof>, [elementType])
- let ctrType = ProvidedTypeBuilder.MakeGenericType(typedefof>, [elementType])
-
- let listCtr =
- let meth = typeof.GetMethod("CreateResizeArray")
- ProvidedTypeBuilder.MakeGenericMethod(meth, [elementType])
-
- let childTypes = elements |> List.collect (fun x -> x.Types)
-
- let initValue ty me =
- Expr.Coerce(
- Expr.CallUnchecked(listCtr, [Expr.Coerce(Expr.NewArray(elementType, elements |> List.map (fun x -> x.Init me)), ctrType)]),
- ty)
-
- if generateField then
- let fieldType = ProvidedTypeBuilder.MakeGenericType(typedefof>, [elementType])
- let field = ProvidedField("_" + name, fieldType)
-
- let prop =
- if readOnly
- then ProvidedProperty (name, propType, isStatic=false,
- getterCode = (fun [me] -> Expr.Coerce(Expr.FieldGet(me, field), propType)))
- else ProvidedProperty (name, propType, isStatic=false,
- getterCode = (fun [me] -> Expr.Coerce(Expr.FieldGet(me, field), propType)),
- setterCode = (fun [me; v] -> Expr.FieldSet(me, field, Expr.Coerce(Expr.CallUnchecked(listCtr, [Expr.Coerce(v, ctrType)]), fieldType))))
-
- { MainType = Some fieldType
- Types = childTypes @ [field :> MemberInfo; prop :> MemberInfo]
- Init = fun me -> Expr.FieldSet(me, field, initValue fieldType me) }
- else
- { MainType = Some propType
- Types = childTypes
- Init = initValue propType }
-
- and foldChildren readOnly (children: (string * Node) list) =
- let childTypes, childInits =
- children
- |> List.map (fun (name, node) -> transform readOnly (Some name) node)
- |> List.fold (fun (types, inits) t -> types @ t.Types, inits @ [t.Init]) ([], [])
-
- let affinedChildInits me =
- childInits
- |> List.fold (fun acc expr -> expr me :: acc) []
- |> List.reduce (fun res expr -> Expr.Sequential(res, expr))
-
- childTypes, affinedChildInits
-
- and transformMap readOnly name (children: (string * Node) list) =
- let childTypes, childInits = foldChildren readOnly children
- let eventField, event = generateChangedEvent()
- match name with
- | Some name ->
- let mapTy = ProvidedTypeDefinition(name + "_Type", Some typeof, hideObjectMethods=true,
- isErased=false, SuppressRelocation=false)
- let ctr = ProvidedConstructor([], invokeCode = (fun [me] -> childInits me))
- mapTy.AddMembers (ctr :> MemberInfo :: childTypes)
- let field = ProvidedField("_" + name, mapTy)
- let prop = ProvidedProperty (name, mapTy, isStatic = false, getterCode = (fun [me] -> Expr.FieldGet(me, field)))
- mapTy.AddMember eventField
- mapTy.AddMember event
-
- { MainType = Some (mapTy :> _)
- Types = [mapTy :> MemberInfo; field :> MemberInfo; prop :> MemberInfo]
- Init = fun me -> Expr.FieldSet(me, field, Expr.NewObject(ctr, [])) }
- | None ->
- { MainType = None
- Types = [eventField :> MemberInfo; event :> MemberInfo] @ childTypes
- Init = childInits }
type Root (inferTypesFromStrings: bool) =
let serializer =
+ (*
let settings = SerializerSettings(EmitDefaultValues = true, EmitTags = false, SortKeyForMapping = false,
EmitAlias = false, ComparerForKeySorting = null)
settings.RegisterSerializer (
@@ -446,7 +261,22 @@ type Root (inferTypesFromStrings: bool) =
match ctx.Instance with
| :? Guid as guid -> guid.ToString("D")
| _ -> "" })
- Serializer settings
+ Serializer settings *)
+ SerializerBuilder()
+ .WithTypeConverter(
+ { new IYamlTypeConverter with
+ member __.Accepts ty =
+ ty = typeof
+ member __.ReadYaml(parser, ty) =
+ failwith "Not implemented"
+ member __.WriteYaml(emitter:YamlDotNet.Core.IEmitter, value, ty) =
+ match value with
+ | :? TimeSpan as ts ->
+ let formattedValue = ts.ToString("G")
+ emitter.Emit(YamlDotNet.Core.Events.Scalar(TagName(), formattedValue));
+ | _ -> failwithf "Expected TimeSpan but received %A" value
+ })
+ .Build()
let mutable lastLoadedFrom = None
@@ -520,55 +350,8 @@ type Root (inferTypesFromStrings: bool) =
[]
member __.Error = errorEvent.Publish
-let internal typedYamlConfig (context: Context) =
- let baseTy = typeof
-
- let asm = Assembly.GetExecutingAssembly()
- let yamlConfig = ProvidedTypeDefinition(asm, rootNamespace, "YamlConfig", Some baseTy, isErased = false)
-
- let staticParams =
- [ ProvidedStaticParameter ("FilePath", typeof, "")
- ProvidedStaticParameter ("ReadOnly", typeof, false)
- ProvidedStaticParameter ("YamlText", typeof, "")
- ProvidedStaticParameter ("InferTypesFromStrings", typeof, true) ]
-
- yamlConfig.AddXmlDoc
- """Statically typed YAML config.
- Path to YAML file.
- Whether the resulting properties will be read-only or not.
- Yaml as text. Mutually exclusive with FilePath parameter."""
-
- let cache = new MemoryCache("YamlConfigProvider")
- context.AddDisposable cache
-
- yamlConfig.DefineStaticParameters(
- parameters = staticParams,
- instantiationFunction = fun typeName paramValues ->
- let value = lazy (
- let createTy yaml readOnly inferTypesFromStrings =
- let myAssem = ProvidedAssembly()
- let ty = ProvidedTypeDefinition (myAssem, rootNamespace, typeName, Some baseTy, isErased = false, hideObjectMethods = true)
- let types = TypesFactory.transform readOnly None (Parser.parse inferTypesFromStrings yaml)
- let ctr = ProvidedConstructor([], invokeCode = fun (me :: _) -> types.Init me)
- let baseCtor = baseTy.GetConstructor(BindingFlags.Public ||| BindingFlags.Instance, null, [|typeof|], null)
- ctr.BaseConstructorCall <- fun [me] -> baseCtor, [me; Expr.Value inferTypesFromStrings]
- ty.AddMembers (ctr :> MemberInfo :: types.Types)
- myAssem.AddTypes [ty]
- ty
-
- match paramValues with
- | [| :? string as filePath; :? bool as readOnly; :? string as yamlText; :? bool as inferTypesFromStrings |] ->
- match filePath, yamlText with
- | "", "" -> failwith "You must specify either FilePath or YamlText parameter."
- | "", yamlText -> createTy yamlText readOnly inferTypesFromStrings
- | filePath, _ ->
- let filePath =
- if Path.IsPathRooted filePath
- then filePath
- else context.ResolutionFolder > filePath
- |> Path.GetFullPath
- context.WatchFile filePath
- createTy (File.ReadAllText filePath) readOnly inferTypesFromStrings
- | _ -> failwith "Wrong parameters")
- cache.GetOrAdd (typeName, value))
- yamlConfig
+
+
+// Put the TypeProviderAssemblyAttribute in the runtime DLL, pointing to the design-time DLL
+[]
+do ()
diff --git a/src/FSharp.Configuration.Runtime/paket.references b/src/FSharp.Configuration.Runtime/paket.references
new file mode 100644
index 00000000..887ad553
--- /dev/null
+++ b/src/FSharp.Configuration.Runtime/paket.references
@@ -0,0 +1,6 @@
+File:ProvidedTypes.fsi
+File:ProvidedTypes.fs
+
+FSharp.Core
+YamlDotNet
+System.Configuration.ConfigurationManager
\ No newline at end of file
diff --git a/src/FSharp.Configuration.Runtime/paket.template b/src/FSharp.Configuration.Runtime/paket.template
new file mode 100644
index 00000000..c0ad1b6d
--- /dev/null
+++ b/src/FSharp.Configuration.Runtime/paket.template
@@ -0,0 +1,41 @@
+type file
+id FSharp.Configuration
+title
+ FSharp.Configuration
+authors
+ Steffen Forkmann; Sergey Tihon; Daniel Mohl; Tomas Petricek; Ryan Riley; Mauricio Scheffer; Phil Trelford; Vasily Kirichenko; Reed Copsey, Jr.
+owners
+ Steffen Forkmann; Sergey Tihon; Daniel Mohl; Tomas Petricek; Ryan Riley; Mauricio Scheffer; Phil Trelford; Vasily Kirichenko; Reed Copsey, Jr.
+projectUrl
+ https://fsprojects.github.io/FSharp.Configuration/
+iconUrl
+ https://raw.githubusercontent.com/fsprojects/FSharp.Configuration/master/docs/files/img/logo.png
+licenseUrl
+ https://github.com/fsprojects/FSharp.Configuration/blob/master/LICENSE.txt
+requireLicenseAcceptance
+ false
+copyright
+ Copyright 2014-2021
+tags
+ F# fsharp typeproviders FSharp.Configuration appsettings YAML F# ResX Ini config
+summary
+ The FSharp.Configuration project contains type providers for the configuration of .NET projects.
+description
+ The FSharp.Configuration project contains type providers for the configuration of .NET projects.
+tags
+ F# fsharp typeproviders FSharp.Configuration
+files
+ bin/Release/net461/FSharp.Configuration.Runtime.* ==> lib/net461
+ bin/Release/net461/YamlDotNet.dll ==> lib/net461
+ bin/Release/netstandard2.0/FSharp.Configuration.Runtime.* ==> lib/netstandard2.0
+ bin/Release/netstandard2.0/YamlDotNet.dll ==> lib/netstandard2.0
+ bin/Release/typeproviders/fsharp41/netstandard2.0/*.dll ==> typeproviders/fsharp41/netstandard2.0
+ bin/Release/typeproviders/fsharp41/net461/*.dll ==> typeproviders/fsharp41/net461
+dependencies
+ framework: netstandard20
+ FSharp.Core >= LOCKEDVERSION
+ framework: net461
+ FSharp.Core >= LOCKEDVERSION
+references
+ FSharp.Configuration.Runtime.dll
+ YamlDotNet.dll
diff --git a/src/FSharp.Configuration/AssemblyInfo.fs b/src/FSharp.Configuration/AssemblyInfo.fs
index 80afaab6..3ba8b533 100644
--- a/src/FSharp.Configuration/AssemblyInfo.fs
+++ b/src/FSharp.Configuration/AssemblyInfo.fs
@@ -5,13 +5,13 @@ open System.Reflection
[]
[]
[]
-[]
-[]
+[]
+[]
do ()
module internal AssemblyVersionInformation =
let [] AssemblyTitle = "FSharp.Configuration"
let [] AssemblyProduct = "FSharp.Configuration"
let [] AssemblyDescription = "The FSharp.Configuration project contains type providers for the configuration of .NET projects."
- let [] AssemblyVersion = "1.4.0"
- let [] AssemblyFileVersion = "1.4.0"
+ let [] AssemblyVersion = "2.0.0"
+ let [] AssemblyFileVersion = "2.0.0"
diff --git a/src/FSharp.Configuration/ConfigTypeProvider.fs b/src/FSharp.Configuration/ConfigTypeProvider.fs
deleted file mode 100644
index da91e8f9..00000000
--- a/src/FSharp.Configuration/ConfigTypeProvider.fs
+++ /dev/null
@@ -1,22 +0,0 @@
-module FSharp.Configuration.ConfigTypeProvider
-
-open FSharp.Configuration.Helper
-open Microsoft.FSharp.Core.CompilerServices
-open ProviderImplementation.ProvidedTypes
-
-[]
-type FSharpConfigurationProvider(cfg: TypeProviderConfig) as this =
- class
- inherit TypeProviderForNamespaces(cfg)
- let context = new Context(this, cfg)
- do this.AddNamespace (
- rootNamespace,
- [ AppSettingsTypeProvider.typedAppSettings context
- ResXProvider.typedResources context
- YamlConfigTypeProvider.typedYamlConfig context
- IniFileProvider.typedIniFile context ])
- do this.Disposing.Add (fun _ -> dispose context)
- end
-
-[]
-do ()
\ No newline at end of file
diff --git a/src/FSharp.Configuration/FSharp.Configuration.fsproj b/src/FSharp.Configuration/FSharp.Configuration.fsproj
index 54359838..f8c37183 100644
--- a/src/FSharp.Configuration/FSharp.Configuration.fsproj
+++ b/src/FSharp.Configuration/FSharp.Configuration.fsproj
@@ -1,60 +1,25 @@
-
-
+
+
- Debug
- AnyCPU
- 2.0
- 7e90d6ce-a10b-4858-a5bc-41df7250cbca
- Library
- FSharp.Configuration
+ netstandard2.0;net461
FSharp.Configuration
- v4.5
- FSharp.Configuration
-
+ true
+ PackageReference
+ true
-
- true
- full
- false
- false
- ..\..\bin\
- DEBUG;TRACE
- 3
-
-
- Program
- C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\devenv.exe
-
-
+
+ NET461
-
- pdbonly
- true
- true
- ..\..\bin
- TRACE
- 3
- ..\..\bin\FSharp.Configuration.XML
-
-
- 11
-
-
-
-
- $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets
-
-
-
-
- $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets
-
-
-
-
-
+
+
+
+
+
+ True
+ ProvidedTypesTesting.fs
+
True
ProvidedTypes.fsi
@@ -63,10 +28,6 @@
True
ProvidedTypes.fs
-
- True
- ProvidedTypesTesting.fs
-
@@ -75,43 +36,9 @@
+
+ PreserveNewest
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ..\..\packages\FSharp.Core\lib\net40\FSharp.Core.dll
- True
- True
-
-
-
-
-
-
-
-
- ..\..\packages\SharpYaml\lib\net45\SharpYaml.dll
- True
- True
-
-
-
-
+
\ No newline at end of file
diff --git a/src/FSharp.Configuration/IniFileProvider.fs b/src/FSharp.Configuration/IniFileProvider.fs
deleted file mode 100644
index ae7e1a63..00000000
--- a/src/FSharp.Configuration/IniFileProvider.fs
+++ /dev/null
@@ -1,150 +0,0 @@
-module FSharp.Configuration.IniFileProvider
-
-open System
-open System.IO
-
-module Parser =
- open System.Text.RegularExpressions
-
- type Key = string
- type Value = string
- type Setting = { Key: Key; Value: Value }
- type SectionName = string
- type Section = { Name: SectionName; Settings: Setting list }
-
- type Stream = Stream of int * string list
-
- let (|Regex|_|) pattern = function
- | Stream (n, line :: rest) ->
- let m = Regex.Match (line, pattern)
- if m.Success then
- let values = [ for gr in m.Groups -> gr.Value ]
- Some (values, Stream (n, rest))
- else None
- | _ -> None
-
- let (|Comment|_|) = function
- | Regex @"^\s*;.*" (_, s) -> Some s
- | _ -> None
-
- let (|Header|_|) = function
- | Regex @"\[\s*(\S+)\s*\]" ([_; name], s) -> Some (name, s)
- | _ -> None
-
- let (|Setting|_|) = function
- | Regex @"\s*(\S+)\s*=\s*(.*)" ([_; key; value], s) ->
- Some ({ Key = key; Value = value.Trim() }, s)
- | _ -> None
-
- let (|Settings|_|) s =
- let rec loop s settings =
- match s with
- | Setting (setting, s) -> loop s (setting :: settings)
- | Comment s -> loop s settings
- | _ -> (List.rev settings, s)
- let settings, s = loop s []
- Some (settings, s)
-
- let rec (|Section|_|) = function
- | Header (name, Settings (settings, s)) -> Some ({ Name = name; Settings = settings }, s)
- | _ -> None
-
- let (|Sections|_|) s =
- let rec loop s sections =
- match s with
- | Section (section, s) -> loop s (section :: sections)
- | Comment s -> loop s sections
- | _ -> (sections |> List.rev, s)
- let sections, s = loop s []
- Some (sections, s)
-
- let streamOfLines lines = Stream (0, lines |> Seq.filter (not << String.IsNullOrWhiteSpace) |> List.ofSeq)
- let streamOfFile path = File.ReadLines path |> streamOfLines
- let parse path =
- match streamOfFile path with
- | Sections (sections, _) -> Choice1Of2 sections
- | e -> Choice2Of2 e
-
-open ProviderImplementation.ProvidedTypes
-open System.Globalization
-open System.Runtime.Caching
-
-let getValue (iniFileName: string) (section: string) (key: string) =
- match Parser.parse (Path.GetFileName iniFileName) with
- | Choice1Of2 sections ->
- maybe {
- let! section = sections |> List.tryFind (fun s -> s.Name = section)
- let! setting = section.Settings |> List.tryFind (fun s -> s.Key = key)
- return setting.Value
- }
- | Choice2Of2 _ -> None
-
-let internal typedIniFile (context: Context) =
- let iniFile = erasedType thisAssembly rootNamespace "IniFile" None
- let cache = new MemoryCache(name = "IniFileProvider")
- context.AddDisposable cache
-
- iniFile.DefineStaticParameters(
- parameters = [ ProvidedStaticParameter ("configFileName", typeof) ],
- instantiationFunction = (fun typeName parameterValues ->
- let value = lazy (
- match parameterValues with
- | [| :? string as iniFileName |] ->
- let typeDef = erasedType thisAssembly rootNamespace typeName (Some true)
- let niceName = createNiceNameProvider()
- try
- let filePath = findConfigFile context.ResolutionFolder iniFileName
- match Parser.parse filePath with
- | Choice1Of2 sections ->
- for section in sections do
- let sectionTy = ProvidedTypeDefinition(section.Name, Some typeof, hideObjectMethods = true)
- for setting in section.Settings do
- let sectionName = section.Name
- let key = setting.Key
- let prop =
- match setting.Value with
- | ValueParser.Int value -> ProvidedProperty(key, typeof, isStatic = true, getterCode = fun _ ->
- <@@
- match getValue filePath sectionName key with
- | Some v -> Int32.Parse v
- | None -> value
- @@>)
- | ValueParser.Bool value -> ProvidedProperty(key, typeof, isStatic = true, getterCode = fun _ ->
- <@@
- match getValue filePath sectionName key with
- | Some v -> Boolean.Parse v
- | None -> value
- @@>)
- | ValueParser.Float value -> ProvidedProperty(key, typeof, isStatic = true, getterCode = fun _ ->
- <@@
- match getValue filePath sectionName key with
- | Some v -> Double.Parse (v, NumberStyles.Any, CultureInfo.InvariantCulture)
- | None -> value
- @@>)
- | value -> ProvidedProperty(key, typeof, isStatic = true, getterCode = fun _ ->
- <@@
- match getValue filePath sectionName key with
- | Some v -> v
- | None -> value
- @@>)
-
- prop.AddXmlDoc (sprintf "Returns the value from %s from section %s with key %s" iniFileName section.Name setting.Key)
- prop.AddDefinitionLocation(1, 1, filePath)
- sectionTy.AddMember prop
-
- typeDef.AddMember sectionTy
- | Choice2Of2 e -> failwithf "%A" e
-
- let name = niceName "ConfigFileName"
- let getValue = <@@ filePath @@>
- let prop = ProvidedProperty(name, typeof, isStatic = true, getterCode = fun _ -> getValue)
-
- prop.AddXmlDoc "Returns the Filename"
-
- typeDef.AddMember prop
- context.WatchFile filePath
- typeDef
- with _ -> typeDef
- | x -> failwithf "unexpected parameter values %A" x)
- cache.GetOrAdd (typeName, value)))
- iniFile
\ No newline at end of file
diff --git a/src/FSharp.Configuration/paket.references b/src/FSharp.Configuration/paket.references
index 9eb4f66e..54b4818c 100644
--- a/src/FSharp.Configuration/paket.references
+++ b/src/FSharp.Configuration/paket.references
@@ -1,5 +1,8 @@
-SharpYaml
+YamlDotNet
FSharp.Core
+
+System.Configuration.ConfigurationManager
+
File: ProvidedTypes.fsi .
File: ProvidedTypes.fs .
File: ProvidedTypesTesting.fs .
\ No newline at end of file
diff --git a/tests/FSharp.Configuration.Tests/AppSettingsProvider.Tests.fs b/tests/FSharp.Configuration.Tests/AppSettingsProvider.Tests.fs
index d633f3ee..00d86f1c 100644
--- a/tests/FSharp.Configuration.Tests/AppSettingsProvider.Tests.fs
+++ b/tests/FSharp.Configuration.Tests/AppSettingsProvider.Tests.fs
@@ -23,18 +23,17 @@ let [] tests =
testCase "Can read multiple connection strings from the config file" (fun _ -> Expect.notEqual Settings.ConnectionStrings.Test1 Settings.ConnectionStrings.Test2 "value")
]
-[]
-let fakeConfig = __SOURCE_DIRECTORY__ + @"/../../packages/FAKE/tools/FAKE.Deploy.exe.config"
-type FakeSettings = AppSettings
+// []
+// let fakeConfig = __SOURCE_DIRECTORY__ + @"/../../packages/build/FAKE/tools/FAKE.Deploy.exe.config"
+// type FakeSettings = AppSettings
-let [] test =
- testCase "Can read different configuration file" (fun _ ->
- [| __SOURCE_DIRECTORY__; ".."; ".."; "packages"; "FAKE"; "tools"; "FAKE.Deploy.exe" |]
- |> System.IO.Path.Combine |> System.IO.Path.GetFullPath
- |> FakeSettings.SelectExecutableFile
+// let [] test =
+// testCase "Can read different configuration file" (fun _ ->
+// [| __SOURCE_DIRECTORY__; ".."; ".."; "packages"; "build"; "FAKE"; "tools"; "FAKE.Deploy.exe" |]
+// |> System.IO.Path.Combine |> System.IO.Path.GetFullPath
+// |> FakeSettings.SelectExecutableFile
- #if INTERACTIVE //Travis can't handle fakeConfig-directory
- FakeSettings.ServerName =! "localhost"
- #endif
- )
-
\ No newline at end of file
+// #if INTERACTIVE //Travis can't handle fakeConfig-directory
+// FakeSettings.ServerName =! "localhost"
+// #endif
+// )
diff --git a/tests/FSharp.Configuration.Tests/FSharp.Configuration.Tests.fsproj b/tests/FSharp.Configuration.Tests/FSharp.Configuration.Tests.fsproj
index ad1abf55..882884a4 100644
--- a/tests/FSharp.Configuration.Tests/FSharp.Configuration.Tests.fsproj
+++ b/tests/FSharp.Configuration.Tests/FSharp.Configuration.Tests.fsproj
@@ -1,65 +1,20 @@
-
-
+
+
+
- Debug
- AnyCPU
- 2.0
- e789c72a-5cfd-436b-8ef1-61aa2852a89f
Exe
- FSharp.Configuration.Tests
+ net5.0;net461
FSharp.Configuration.Tests
- v4.6.1
- FSharp.Configuration.Tests
-
- ..\..\
- true
+ true
true
+ true
+
+ true
-
- true
- full
- false
- false
- bin\Debug\
- DEBUG;TRACE
- 3
-
-
- Project
-
-
-
-
- false
+
+ NET461
-
- pdbonly
- true
- true
- bin\Release\
- TRACE
- 3
-
-
-
-
- 11
-
-
-
-
- $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets
-
-
-
-
- $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets
-
-
-
-
-
@@ -70,7 +25,6 @@
Always
-
@@ -82,83 +36,33 @@
-
- ..\..\bin\FSharp.Configuration.dll
-
-
-
-
-
-
-
- C:\Program Files (x86)\Reference Assemblies\Microsoft\WindowsPowerShell\3.0\System.Management.Automation.dll
-
+
+ FSharp.Configuration.Runtime
+ {7e90d6ce-a10b-4858-a5bc-41df7250cbca}
+ True
+
-
-
-
-
-
-
- ..\..\packages\test\Argu\lib\net45\Argu.dll
- True
- True
-
-
-
-
-
-
-
-
- ..\..\packages\test\Expecto\lib\net461\Expecto.dll
- True
- True
-
-
-
-
-
-
-
-
- ..\..\packages\test\FSharp.Core\lib\net45\FSharp.Core.dll
- True
- True
-
-
-
-
-
-
-
-
- ..\..\packages\test\Mono.Cecil\lib\net40\Mono.Cecil.dll
- True
- True
-
-
- ..\..\packages\test\Mono.Cecil\lib\net40\Mono.Cecil.Mdb.dll
- True
- True
-
-
- ..\..\packages\test\Mono.Cecil\lib\net40\Mono.Cecil.Pdb.dll
- True
- True
-
-
- ..\..\packages\test\Mono.Cecil\lib\net40\Mono.Cecil.Rocks.dll
- True
- True
-
-
-
-
+
+
\ No newline at end of file
diff --git a/tests/FSharp.Configuration.Tests/ResXProvider.Tests.fs b/tests/FSharp.Configuration.Tests/ResXProvider.Tests.fs
index e0a08f56..1c6c115f 100644
--- a/tests/FSharp.Configuration.Tests/ResXProvider.Tests.fs
+++ b/tests/FSharp.Configuration.Tests/ResXProvider.Tests.fs
@@ -3,16 +3,24 @@ module FSharp.Configuration.Tests.ResXTests
open FSharp.Configuration
open Expecto
+#if NET461
+
type Resource1 = ResXProvider<"Resource1.resx">
let [] tests =
- testList "ResX Provider tests" [
- testCase "Can return a string from the resource file" (fun _ -> Expect.equal Resource1.Greetings "Hello World!" "value")
-
- testCase "Can return an image from the resource file" (fun _ ->
+ // https://github.com/Microsoft/msbuild/issues/2221
+ ptestList "ResX Provider tests" [
+ testCase "Can return a string from the resource file" (fun _ ->
+ Expect.equal Resource1.Greetings "Hello World!" "value")
+
+ testCase "Can return an image from the resource file" (fun _ ->
Expect.isNotNull Resource1.Flowers "Flowers"
Expect.equal typeof (Resource1.Flowers.GetType()) "value")
-
- testCase "Can return an int from the resource file" (fun _ -> Expect.equal Resource1.Answer 42 "value")
- testCase "Can return a text file from the resource file" (fun _ -> Expect.equal Resource1.TextFile "Text" "value")
- ]
\ No newline at end of file
+
+ testCase "Can return an int from the resource file" (fun _ ->
+ Expect.equal Resource1.Answer 42 "value")
+ testCase "Can return a text file from the resource file" (fun _ ->
+ Expect.equal Resource1.TextFile "Text" "value")
+ ]
+
+#endif
diff --git a/tests/FSharp.Configuration.Tests/Settings2.yaml b/tests/FSharp.Configuration.Tests/Settings2.yaml
index 33b63ba2..1cb022b2 100644
--- a/tests/FSharp.Configuration.Tests/Settings2.yaml
+++ b/tests/FSharp.Configuration.Tests/Settings2.yaml
@@ -11,8 +11,8 @@
Password: pass2
CheckPeriod: 0:00:01:00.0000000
ErrorNotificationRecipients:
- - user1@sample.com
- - user2@sample.com
+ - user1@sample.com
+ - user2@sample.com
DB:
ConnectionString: Data Source=server1;Initial Catalog=Database1;Integrated Security=SSPI;
NumberOfDeadlockRepeats: 11
diff --git a/tests/FSharp.Configuration.Tests/YamlProvider.Tests.fs b/tests/FSharp.Configuration.Tests/YamlProvider.Tests.fs
index 73334902..64b4570c 100644
--- a/tests/FSharp.Configuration.Tests/YamlProvider.Tests.fs
+++ b/tests/FSharp.Configuration.Tests/YamlProvider.Tests.fs
@@ -16,6 +16,9 @@ type private Listener(event: IEvent) =
do event.Add (fun _ -> incr events)
member __.Events = !events
+let private getPath fileName =
+ Path.Combine(__SOURCE_DIRECTORY__, fileName)
+
let [] tests =
testList "Yaml Config Provider tests" [
testCase "Can return a string from the settings file" (fun _ ->
@@ -78,19 +81,20 @@ let [] tests =
settings.DB.NumberOfDeadlockRepeats <- 11
settings.DB.DefaultTimeout <- System.TimeSpan.FromMinutes 6.
settings.JustStuff.SomeDoubleValue <- 0.5
- settings.Save "SettingsModifed.yaml"
- assertFilesAreEqual "SettingsModifed.yaml" "Settings2.yaml")
+ let tempFile = Path.GetTempFileName()
+ settings.Save tempFile
+ assertFilesAreEqual tempFile (getPath "Settings2.yaml"))
testCase "Can save settings to the file it was loaded from last time" (fun _ ->
let settings = Settings()
let tempFile = Path.GetTempFileName()
try
- File.Copy ("Settings.yaml", tempFile, overwrite=true)
+ File.Copy (getPath "Settings.yaml", tempFile, overwrite=true)
settings.Load tempFile
settings.DB.NumberOfDeadlockRepeats <- 11
settings.DB.DefaultTimeout <- System.TimeSpan.FromMinutes 6.
settings.Save()
- assertFilesAreEqual tempFile "Settings2.yaml"
+ assertFilesAreEqual tempFile (getPath "Settings2.yaml")
finally File.Delete tempFile)
testCase "Throws exception during saving if it was not loaded from a file and location is not specified" (fun _ ->
@@ -184,7 +188,7 @@ let [] tests =
let settings = Settings()
let tempFile = Path.GetTempFileName()
try
- File.Copy ("Settings.yaml", tempFile, overwrite = true)
+ File.Copy (getPath "Settings.yaml", tempFile, overwrite = true)
settings.LoadAndWatch tempFile |> ignore
finally
File.Delete tempFile)
@@ -195,7 +199,7 @@ let [] tests =
let mutable err = false
settings.Error.Add(fun _ -> err <- true)
try
- File.Copy ("Settings.yaml", tempFile, overwrite=true)
+ File.Copy (getPath "Settings.yaml", tempFile, overwrite=true)
use __ = settings.LoadAndWatch tempFile
System.Threading.Thread.Sleep(800)
let f = new FileStream(tempFile, FileMode.Append)
diff --git a/tests/FSharp.Configuration.Tests/app.config b/tests/FSharp.Configuration.Tests/app.config
index 035347c1..10a2eed9 100644
--- a/tests/FSharp.Configuration.Tests/app.config
+++ b/tests/FSharp.Configuration.Tests/app.config
@@ -14,56 +14,89 @@
-
-
-
+
+
+
+
+
-
-
+ True
+
+
-
-
+ True
+
+
-
-
+ True
+
+
-
-
+ True
+
+
-
-
+ True
+
+
-
-
+ True
+
+
-
-
+ True
+
+
-
-
+ True
+
+
-
-
+ True
+
+
-
-
+ True
+
+
True
-
-
+
+
-
-
-
-
-
\ No newline at end of file
+
+ True
+
+
+
+
+ True
+
+
+
+
+ True
+
+
+
+
+ True
+
+
+
+
+ True
+
+
+
+
\ No newline at end of file
diff --git a/tests/FSharp.Configuration.Tests/paket.references b/tests/FSharp.Configuration.Tests/paket.references
index 4e7bb524..c681598e 100644
--- a/tests/FSharp.Configuration.Tests/paket.references
+++ b/tests/FSharp.Configuration.Tests/paket.references
@@ -1,3 +1,4 @@
group Test
FSharp.Core
- Expecto
\ No newline at end of file
+ Expecto
+ System.Resources.Extensions
\ No newline at end of file
diff --git a/tests/FSharp.Configuration.Web.Test/packages.config b/tests/FSharp.Configuration.Web.Test/packages.config
index 243cf971..391662b6 100644
--- a/tests/FSharp.Configuration.Web.Test/packages.config
+++ b/tests/FSharp.Configuration.Web.Test/packages.config
@@ -1,7 +1,7 @@
-
+