From c10ecf19e20218982e91811b2e139184860c6ced Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Mon, 23 Feb 2015 13:15:29 +0100 Subject: [PATCH] Initial commit --- .gitattributes | 25 ++ .gitignore | 185 +++++++++ .paket/paket.bootstrapper.exe | Bin 0 -> 13360 bytes .paket/paket.targets | 36 ++ .travis.yml | 6 + FSharpx.Async.sln | 62 +++ LICENSE.txt | 24 ++ README.md | 31 ++ RELEASE_NOTES.md | 13 + appveyor.yml | 9 + build.cmd | 18 + build.fsx | 357 ++++++++++++++++++ build.sh | 38 ++ docs/content/index.fsx | 67 ++++ docs/content/tutorial.fsx | 19 + docs/files/img/logo-template.pdn | Bin 0 -> 15052 bytes docs/files/img/logo.png | Bin 0 -> 1581 bytes docs/tools/generate.fsx | 129 +++++++ docs/tools/templates/template.cshtml | 58 +++ lib/README.md | 11 + nuget/FSharpx.Async.nuspec | 23 ++ paket.dependencies | 10 + paket.lock | 27 ++ src/FSharpx.Async/AssemblyInfo.fs | 12 + src/FSharpx.Async/FSharpx.Async.fsproj | 73 ++++ src/FSharpx.Async/Library.fs | 16 + src/FSharpx.Async/Script.fsx | 8 + .../FSharpx.Async.Tests.fsproj | 94 +++++ tests/FSharpx.Async.Tests/Tests.fs | 10 + tests/FSharpx.Async.Tests/paket.references | 2 + 30 files changed, 1363 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .paket/paket.bootstrapper.exe create mode 100644 .paket/paket.targets create mode 100644 .travis.yml create mode 100644 FSharpx.Async.sln create mode 100644 LICENSE.txt create mode 100644 README.md create mode 100644 RELEASE_NOTES.md create mode 100644 appveyor.yml create mode 100644 build.cmd create mode 100644 build.fsx create mode 100644 build.sh create mode 100644 docs/content/index.fsx create mode 100644 docs/content/tutorial.fsx create mode 100644 docs/files/img/logo-template.pdn create mode 100644 docs/files/img/logo.png create mode 100644 docs/tools/generate.fsx create mode 100644 docs/tools/templates/template.cshtml create mode 100644 lib/README.md create mode 100644 nuget/FSharpx.Async.nuspec create mode 100644 paket.dependencies create mode 100644 paket.lock create mode 100644 src/FSharpx.Async/AssemblyInfo.fs create mode 100644 src/FSharpx.Async/FSharpx.Async.fsproj create mode 100644 src/FSharpx.Async/Library.fs create mode 100644 src/FSharpx.Async/Script.fsx create mode 100644 tests/FSharpx.Async.Tests/FSharpx.Async.Tests.fsproj create mode 100644 tests/FSharpx.Async.Tests/Tests.fs create mode 100644 tests/FSharpx.Async.Tests/paket.references diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..206349c --- /dev/null +++ b/.gitattributes @@ -0,0 +1,25 @@ +# Auto detect text files +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp text=auto eol=lf +*.fs diff=csharp text=auto eol=lf +*.fsi diff=csharp text=auto eol=lf +*.fsx diff=csharp text=auto eol=lf +*.sln text eol=crlf merge=union +*.csproj merge=union +*.vbproj merge=union +*.fsproj merge=union +*.dbproj merge=union + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a2d9b47 --- /dev/null +++ b/.gitignore @@ -0,0 +1,185 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Xamarin Studio / monodevelop user-specific +*.userprefs + +# Build results + +[Dd]ebug/ +[Rr]elease/ +x64/ +build/ +[Bb]in/ +[Oo]bj/ + +# Enable "build/" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets +!packages/*/build/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.log +*.scc + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +*.ncrunch* +.*crunch*.local.xml + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.Publish.xml + +# Enable nuget.exe in the .nuget folder (though normally executables are not tracked) +!.nuget/NuGet.exe + +# Windows Azure Build Output +csx +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +sql/ +*.Cache +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.[Pp]ublish.xml +*.pfx +*.publishsettings + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +App_Data/*.mdf +App_Data/*.ldf + + +#LightSwitch generated files +GeneratedArtifacts/ +_Pvt_Extensions/ +ModelManifest.xml + +# ========================= +# Windows detritus +# ========================= + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Mac desktop service store files +.DS_Store + +# =================================================== +# Exclude F# project specific directories and files +# =================================================== + +# NuGet Packages Directory +packages/ + +# Generated documentation folder +docs/output/ + +# Temp folder used for publishing docs +temp/ + +# Test results produced by build +TestResults.xml + +# Nuget outputs +nuget/*.nupkg +release.cmd +release.sh +localpackages/ +paket-files +*.orig +.paket/paket.exe +docs/content/license.md +docs/content/release-notes.md diff --git a/.paket/paket.bootstrapper.exe b/.paket/paket.bootstrapper.exe new file mode 100644 index 0000000000000000000000000000000000000000..a87c0883186768b34051e15c2ae735d3275ef1a0 GIT binary patch literal 13360 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 Q#kv&zaUk#V@-T${3tjxGR{#J2 literal 0 HcmV?d00001 diff --git a/.paket/paket.targets b/.paket/paket.targets new file mode 100644 index 0000000..bdfa61b --- /dev/null +++ b/.paket/paket.targets @@ -0,0 +1,36 @@ + + + + + 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) + + $(PaketCommand) restore + $(PaketBootStrapperCommand) + + RestorePackages; $(BuildDependsOn); + + + + + + + + + + + + + \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..5340e01 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,6 @@ +language: csharp + +sudo: false # use the new container-based Travis infrastructure + +script: + - ./build.sh All diff --git a/FSharpx.Async.sln b/FSharpx.Async.sln new file mode 100644 index 0000000..6077381 --- /dev/null +++ b/FSharpx.Async.sln @@ -0,0 +1,62 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".paket", ".paket", "{63297B98-5CED-492C-A5B7-A5B4F73CF142}" + ProjectSection(SolutionItems) = preProject + paket.dependencies = paket.dependencies + paket.lock = paket.lock + EndProjectSection +EndProject +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{A6A6AF7D-D6E3-442D-9B1E-58CC91879BE1}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharpx.Async", "src\FSharpx.Async\FSharpx.Async.fsproj", "{2D4F3D0E-0E18-48D7-9C27-98864039393D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "project", "project", "{BF60BC93-E09B-4E5F-9D85-95A519479D54}" + ProjectSection(SolutionItems) = preProject + build.fsx = build.fsx + nuget\FSharpx.Async.nuspec = nuget\FSharpx.Async.nuspec + README.md = README.md + RELEASE_NOTES.md = RELEASE_NOTES.md + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{83F16175-43B1-4C90-A1EE-8E351C33435D}" + ProjectSection(SolutionItems) = preProject + docs\tools\generate.fsx = docs\tools\generate.fsx + docs\tools\templates\template.cshtml = docs\tools\templates\template.cshtml + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "content", "content", "{8E6D5255-776D-4B61-85F9-73C37AA1FB9A}" + ProjectSection(SolutionItems) = preProject + docs\content\index.fsx = docs\content\index.fsx + docs\content\tutorial.fsx = docs\content\tutorial.fsx + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{ED8079DD-2B06-4030-9F0F-DC548F98E1C4}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharpx.Async.Tests", "tests\FSharpx.Async.Tests\FSharpx.Async.Tests.fsproj", "{ADBD32DB-B7AC-4E81-9507-28F329AF23E7}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2D4F3D0E-0E18-48D7-9C27-98864039393D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2D4F3D0E-0E18-48D7-9C27-98864039393D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2D4F3D0E-0E18-48D7-9C27-98864039393D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2D4F3D0E-0E18-48D7-9C27-98864039393D}.Release|Any CPU.Build.0 = Release|Any CPU + {ADBD32DB-B7AC-4E81-9507-28F329AF23E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ADBD32DB-B7AC-4E81-9507-28F329AF23E7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ADBD32DB-B7AC-4E81-9507-28F329AF23E7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ADBD32DB-B7AC-4E81-9507-28F329AF23E7}.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} + {8E6D5255-776D-4B61-85F9-73C37AA1FB9A} = {A6A6AF7D-D6E3-442D-9B1E-58CC91879BE1} + {ADBD32DB-B7AC-4E81-9507-28F329AF23E7} = {ED8079DD-2B06-4030-9F0F-DC548F98E1C4} + EndGlobalSection +EndGlobal diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..68a49da --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/README.md b/README.md new file mode 100644 index 0000000..22a4372 --- /dev/null +++ b/README.md @@ -0,0 +1,31 @@ +[![Issue Stats](http://issuestats.com/github/fsprojects/ProjectScaffold/badge/issue)](http://issuestats.com/github/fsprojects/ProjectScaffold) +[![Issue Stats](http://issuestats.com/github/fsprojects/ProjectScaffold/badge/pr)](http://issuestats.com/github/fsprojects/ProjectScaffold) + +# ProjectScaffold + +This project can be used to scaffold a prototypical .NET solution including file system layout and tooling. This includes a build process that: + +* updates all AssemblyInfo files +* compiles the application and runs all test projects +* generates [SourceLinks](https://github.com/ctaggart/SourceLink) +* generates API docs based on XML document tags +* generates [documentation based on Markdown files](http://fsprojects.github.io/ProjectScaffold/writing-docs.html) +* generates [NuGet](http://www.nuget.org) packages +* and allows a simple [one step release process](http://fsprojects.github.io/ProjectScaffold/release-process.html). + +In order to start the scaffolding process run + + $ build.cmd // on windows + $ build.sh // on mono + +Read the [Getting started tutorial](http://fsprojects.github.io/ProjectScaffold/index.html#Getting-started) to learn more. + +Documentation: http://fsprojects.github.io/ProjectScaffold + +## Maintainer(s) + +- [@forki](https://github.com/forki) +- [@pblasucci](https://github.com/pblasucci) +- [@sergey-tihon](https://github.com/sergey-tihon) + +The default maintainer account for projects under "fsprojects" is [@fsgit](https://github.com/fsgit) - F# Community Project Incubation Space (repo management) diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md new file mode 100644 index 0000000..aeccdf5 --- /dev/null +++ b/RELEASE_NOTES.md @@ -0,0 +1,13 @@ +### 1.0 - Unreleased +* More awesome stuff coming +* Added SourceLink for Source Indexing PDB + +#### 0.5.1-beta - November 6 2013 +* Improved quality of solution-wide README.md files + +#### 0.5.0-beta - October 29 2013 +* Improved quality of solution-wide README.md files + +#### 0.0.1-beta - October 24 2013 +* Changed name from fsharp-project-scaffold to FSharp.ProjectScaffold +* Initial release diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000..0198468 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,9 @@ +init: + - git config --global core.autocrlf input +build_script: + - cmd: build.cmd +test: off +version: 0.0.1.{build} +artifacts: + - path: bin + name: bin diff --git a/build.cmd b/build.cmd new file mode 100644 index 0000000..79c3cd5 --- /dev/null +++ b/build.cmd @@ -0,0 +1,18 @@ +@echo off +cls + +.paket\paket.bootstrapper.exe +if errorlevel 1 ( + exit /b %errorlevel% +) + +.paket\paket.exe restore +if errorlevel 1 ( + exit /b %errorlevel% +) + +IF NOT EXIST build.fsx ( + .paket\paket.exe update + packages\FAKE\tools\FAKE.exe init.fsx +) +packages\FAKE\tools\FAKE.exe build.fsx %* diff --git a/build.fsx b/build.fsx new file mode 100644 index 0000000..227d1a2 --- /dev/null +++ b/build.fsx @@ -0,0 +1,357 @@ +// -------------------------------------------------------------------------------------- +// FAKE build script +// -------------------------------------------------------------------------------------- + +#r @"packages/FAKE/tools/FakeLib.dll" + +open Fake +open Fake.Git +open Fake.AssemblyInfoFile +open Fake.ReleaseNotesHelper +open System +open System.IO +#if MONO +#else +#load "packages/SourceLink.Fake/tools/Fake.fsx" +open SourceLink +#endif + +// -------------------------------------------------------------------------------------- +// START TODO: Provide project-specific details below +// -------------------------------------------------------------------------------------- + +// 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') +let project = "FSharpx.Async" + +// Short summary of the project +// (used as description in AssemblyInfo and as a short summary for NuGet package) +let summary = "Async extensions for F#" + +// Longer description of the project +// (used as a description for NuGet package; line breaks are automatically cleaned up) +let description = "Async extensions for F#" + +// List of author names (for NuGet package) +let authors = [ "Thomas Petricek, David Thomas, Steffen Forkmann" ] + +// Tags for your project (for NuGet package) +let tags = "F#, async, fsharp" + +// File system information +let solutionFile = "FSharpx.Async.sln" + +// Pattern specifying assemblies to be tested using NUnit +let testAssemblies = "tests/**/bin/Release/*Tests*.dll" + +// Git configuration (used for publishing documentation in gh-pages branch) +// The profile where the project is posted +let gitOwner = "fsprojects" +let gitHome = "https://github.com/" + gitOwner + +// The name of the project on GitHub +let gitName = "FSharpx.Async" + +// The url for the raw files hosted +let gitRaw = environVarOrDefault "gitRaw" "https://raw.github.com/fsprojects" + +// -------------------------------------------------------------------------------------- +// END TODO: The rest of the file includes standard build steps +// -------------------------------------------------------------------------------------- + +// Read additional information from the release notes document +let release = LoadReleaseNotes "RELEASE_NOTES.md" + +let genFSAssemblyInfo (projectPath) = + let projectName = System.IO.Path.GetFileNameWithoutExtension(projectPath) + let folderName = System.IO.Path.GetDirectoryName(projectPath) + let basePath = "src" @@ folderName + 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) = + let projectName = System.IO.Path.GetFileNameWithoutExtension(projectPath) + let folderName = System.IO.Path.GetDirectoryName(projectPath) + let basePath = folderName @@ "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 ] + +// Generate assembly info files with the right version & up-to-date information +Target "AssemblyInfo" (fun _ -> + let fsProjs = !! "src/**/*.fsproj" + let csProjs = !! "src/**/*.csproj" + fsProjs |> Seq.iter genFSAssemblyInfo + csProjs |> Seq.iter genCSAssemblyInfo +) + +// -------------------------------------------------------------------------------------- +// Clean build results + +Target "Clean" (fun _ -> + CleanDirs ["bin"; "temp"] +) + +Target "CleanDocs" (fun _ -> + CleanDirs ["docs/output"] +) + +// -------------------------------------------------------------------------------------- +// Build library & test project + +Target "Build" (fun _ -> + !! solutionFile + |> MSBuildRelease "" "Rebuild" + |> ignore +) + +// -------------------------------------------------------------------------------------- +// Run the unit tests using test runner + +Target "RunTests" (fun _ -> + !! testAssemblies + |> NUnit (fun p -> + { p with + DisableShadowCopy = true + TimeOut = TimeSpan.FromMinutes 20. + OutputFile = "TestResults.xml" }) +) + +#if MONO +#else +// -------------------------------------------------------------------------------------- +// SourceLink allows Source Indexing on the PDB generated by the compiler, this allows +// the ability to step through the source code of external libraries https://github.com/ctaggart/SourceLink + +Target "SourceLink" (fun _ -> + let baseUrl = sprintf "%s/%s/{0}/%%var2%%" gitRaw (project.ToLower()) + use repo = new GitRepo(__SOURCE_DIRECTORY__) + !! "src/**/*.fsproj" + |> Seq.iter (fun f -> + let proj = VsProj.LoadRelease f + logfn "source linking %s" proj.OutputFilePdb + let files = proj.Compiles -- "**/AssemblyInfo.fs" + repo.VerifyChecksums files + proj.VerifyPdbChecksums files + proj.CreateSrcSrv baseUrl repo.Revision (repo.Paths files) + Pdbstr.exec proj.OutputFilePdb proj.OutputFilePdbSrcSrv + ) +) +#endif + +// -------------------------------------------------------------------------------------- +// Build a NuGet package + +Target "NuGet" (fun _ -> + NuGet (fun p -> + { p with + Authors = authors + Project = project + Summary = summary + Description = description + Version = release.NugetVersion + ReleaseNotes = String.Join(Environment.NewLine, release.Notes) + WorkingDir = "." + Tags = tags + OutputPath = "bin" + AccessKey = getBuildParamOrDefault "nugetkey" "" + Publish = hasBuildParam "nugetkey" + Dependencies = [] }) + ("nuget/" + project + ".nuspec") +) + +// -------------------------------------------------------------------------------------- +// Generate the documentation + +Target "GenerateReferenceDocs" (fun _ -> + if not <| executeFSIWithArgs "docs/tools" "generate.fsx" ["--define:RELEASE"; "--define:REFERENCE"] [] then + failwith "generating reference documentation failed" +) + +let generateHelp' fail debug = + let args = + if debug then ["--define:HELP"] + else ["--define:RELEASE"; "--define:HELP"] + if executeFSIWithArgs "docs/tools" "generate.fsx" args [] then + traceImportant "Help generated" + else + if fail then + failwith "generating help documentation failed" + else + 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 +) + +Target "GenerateHelpDebug" (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 true +) + +Target "KeepRunning" (fun _ -> + use watcher = new FileSystemWatcher(DirectoryInfo("docs/content").FullName,"*.*") + watcher.EnableRaisingEvents <- true + watcher.Changed.Add(fun e -> generateHelp false) + watcher.Created.Add(fun e -> generateHelp false) + watcher.Renamed.Add(fun e -> generateHelp false) + watcher.Deleted.Add(fun e -> generateHelp false) + + traceImportant "Waiting for help edits. Press any key to stop." + + System.Console.ReadKey() |> ignore + + watcher.EnableRaisingEvents <- false + watcher.Dispose() +) + +Target "GenerateDocs" DoNothing + +let createIndexFsx lang = + let content = """(*** hide ***) +// This block of code is omitted in the generated HTML documentation. Use +// it to define helpers that you do not want to show in the documentation. +#I "../../../bin" + +(** +F# Project Scaffold ({0}) +========================= +*) +""" + let targetDir = "docs/content" @@ lang + let targetFile = targetDir @@ "index.fsx" + ensureDirectory targetDir + System.IO.File.WriteAllText(targetFile, System.String.Format(content, lang)) + +Target "AddLangDocs" (fun _ -> + let args = System.Environment.GetCommandLineArgs() + if args.Length < 4 then + failwith "Language not specified." + + args.[3..] + |> Seq.iter (fun lang -> + if lang.Length <> 2 && lang.Length <> 3 then + failwithf "Language must be 2 or 3 characters (ex. 'de', 'fr', 'ja', 'gsw', etc.): %s" lang + + let templateFileName = "template.cshtml" + let templateDir = "docs/tools/templates" + let langTemplateDir = templateDir @@ lang + let langTemplateFileName = langTemplateDir @@ templateFileName + + if System.IO.File.Exists(langTemplateFileName) then + failwithf "Documents for specified language '%s' have already been added." lang + + ensureDirectory langTemplateDir + Copy langTemplateDir [ templateDir @@ templateFileName ] + + createIndexFsx lang) +) + +// -------------------------------------------------------------------------------------- +// Release Scripts + +Target "ReleaseDocs" (fun _ -> + let tempDocsDir = "temp/gh-pages" + CleanDir tempDocsDir + Repository.cloneSingleBranch "" (gitHome + "/" + gitName + ".git") "gh-pages" 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 +) + +#load "paket-files/fsharp/FAKE/modules/Octokit/Octokit.fsx" +open Octokit + +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 + // TODO: |> uploadFile "PATH_TO_FILE" + |> releaseDraft + |> Async.RunSynchronously +) + +Target "BuildPackage" DoNothing + +// -------------------------------------------------------------------------------------- +// Run all targets by default. Invoke 'build ' to override + +Target "All" DoNothing + +"Clean" + ==> "AssemblyInfo" + ==> "Build" + ==> "RunTests" + =?> ("GenerateReferenceDocs",isLocalBuild) + =?> ("GenerateDocs",isLocalBuild) + ==> "All" + =?> ("ReleaseDocs",isLocalBuild) + +"All" +#if MONO +#else + =?> ("SourceLink", Pdbstr.tryFind().IsSome ) +#endif + ==> "NuGet" + ==> "BuildPackage" + +"CleanDocs" + ==> "GenerateHelp" + ==> "GenerateReferenceDocs" + ==> "GenerateDocs" + +"CleanDocs" + ==> "GenerateHelpDebug" + +"GenerateHelp" + ==> "KeepRunning" + +"ReleaseDocs" + ==> "Release" + +"BuildPackage" + ==> "Release" + +RunTargetOrDefault "All" diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..b6ac64b --- /dev/null +++ b/build.sh @@ -0,0 +1,38 @@ +#!/bin/bash +if test "$OS" = "Windows_NT" +then + # use .Net + + .paket/paket.bootstrapper.exe + exit_code=$? + if [ $exit_code -ne 0 ]; then + exit $exit_code + fi + + .paket/paket.exe restore + exit_code=$? + if [ $exit_code -ne 0 ]; then + exit $exit_code + fi + + [ ! -e build.fsx ] && .paket/paket.exe update + [ ! -e build.fsx ] && packages/FAKE/tools/FAKE.exe init.fsx + packages/FAKE/tools/FAKE.exe $@ --fsiargs -d:MONO build.fsx +else + # use mono + mono .paket/paket.bootstrapper.exe + exit_code=$? + if [ $exit_code -ne 0 ]; then + exit $exit_code + fi + + mono .paket/paket.exe restore + exit_code=$? + if [ $exit_code -ne 0 ]; then + exit $exit_code + fi + + [ ! -e build.fsx ] && mono .paket/paket.exe update + [ ! -e build.fsx ] && mono packages/FAKE/tools/FAKE.exe init.fsx + mono packages/FAKE/tools/FAKE.exe $@ --fsiargs -d:MONO build.fsx +fi diff --git a/docs/content/index.fsx b/docs/content/index.fsx new file mode 100644 index 0000000..631de22 --- /dev/null +++ b/docs/content/index.fsx @@ -0,0 +1,67 @@ +(*** hide ***) +// This block of code is omitted in the generated HTML documentation. Use +// it to define helpers that you do not want to show in the documentation. +#I "../../bin" + +(** +F# Project Scaffold +=================== + +Documentation + +
+
+
+
+ The F# ProjectTemplate library can be installed from NuGet: +
PM> Install-Package FSharpx.Async
+
+
+
+
+ +Example +------- + +This example demonstrates using a function defined in this sample library. + +*) +#r "FSharpx.Async.dll" +open FSharpx.Async + +printfn "hello = %i" <| Library.hello 0 + +(** +Some more info + +Samples & documentation +----------------------- + +The library comes with comprehensible documentation. +It can include tutorials automatically generated from `*.fsx` files in [the content folder][content]. +The API reference is automatically generated from Markdown comments in the library implementation. + + * [Tutorial](tutorial.html) contains a further explanation of this sample library. + + * [API Reference](reference/index.html) contains automatically generated documentation for all types, modules + and functions in the library. This includes additional brief samples on using most of the + functions. + +Contributing and copyright +-------------------------- + +The project is hosted on [GitHub][gh] where you can [report issues][issues], fork +the project and submit pull requests. If you're adding a new public API, please also +consider adding [samples][content] that can be turned into a documentation. You might +also want to read the [library design notes][readme] to understand how it works. + +The library is available under Public Domain license, which allows modification and +redistribution for both commercial and non-commercial purposes. For more information see the +[License file][license] in the GitHub repository. + + [content]: https://github.com/fsprojects/FSharpx.Async/tree/master/docs/content + [gh]: https://github.com/fsprojects/FSharpx.Async + [issues]: https://github.com/fsprojects/FSharpx.Async/issues + [readme]: https://github.com/fsprojects/FSharpx.Async/blob/master/README.md + [license]: https://github.com/fsprojects/FSharpx.Async/blob/master/LICENSE.txt +*) diff --git a/docs/content/tutorial.fsx b/docs/content/tutorial.fsx new file mode 100644 index 0000000..b04eac7 --- /dev/null +++ b/docs/content/tutorial.fsx @@ -0,0 +1,19 @@ +(*** hide ***) +// This block of code is omitted in the generated HTML documentation. Use +// it to define helpers that you do not want to show in the documentation. +#I "../../bin" + +(** +Introducing your project +======================== + +Say more + +*) +#r "FSharpx.Async.dll" +open FSharpx.Async + +Library.hello 0 +(** +Some more info +*) diff --git a/docs/files/img/logo-template.pdn b/docs/files/img/logo-template.pdn new file mode 100644 index 0000000000000000000000000000000000000000..52606f5701c62c79bca692489b4d19150329a5e3 GIT binary patch literal 15052 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 PmMh&#w`1pP#_E3ov+rLx literal 0 HcmV?d00001 diff --git a/docs/files/img/logo.png b/docs/files/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8a2b81b9eb60b9bd48e50daed8ab02a46ee4992f GIT binary patch literal 1581 zcmXw3dr%W+5Wl3S(FfL4WtA!Y%7hEfB!WB|b8zRyCiVIVTx zNzPm!kts^~A#+bmdOVOCle8;y)vowVJNH%WRc?h-Y9RnDXcF+bn z*li~;306aP%Y%y_0u+mAh&qS~58j$LH~q#G z(!AI7P7v@a;K4anPh1DRbFD{?CC`k4tH9`WpLUy8FJIZ&Ii50G%=g!EI`_@yHw=Ec z=jKi23khOhIw@uVsAYKr)=cunp1k<@G3BZAvlAk{wfW3t?TVfRh!}mVDil!J0WWlD z3%}LeE(WSh7j%QSNvLtZ*W;c&roXfii2sXub+u%OU|XU6CK6!I2&}+Z!O@)L}$~ZX;#W(qagHT z71H?4SU^yr9j8p=&f*U4Zmu~(<4}3Q;KhMCgk57OH1o0=vDbDeJlhOG@UYRlcj+!l zR&kXeG(uh~Dg6&&i4w;(*$!rzE7IKcSk_Fcs{m23@{D*jhIsVppUhHARrKQ8LG?u4 zBN}BZGVz8uIDpY5SyqBT1w7x8>wYC08jB2q```#kF{@YG6v&H^H%LlYy`>Lm6d!~= zwvWFNr!zcrtVJc)x(<`~S%g(V^^`H3H-vys4vLDLzqg6~&tQRa|$R z*ku3G;X1JCE!AJi>b+b~bDZw6)-bzsN%$Mo<7GMX4DNP3ZJGzWN+Ev!2aC;4_T+%$ zO5<9xc7at4lw5qc=hm2AI>c`C+NDdVQ31~@o&`(4jfL2awpVp;-xQ5cP|s2$A$C3V zMAwipYc*(j1|)}^U}J6}h-^9xa^P53gAXH*EXSG*^dYYk z3FpKeKWJt&mSHllRRb)R9CL6@hh~O%{5`-~ce$*}_97@*b9fu}#3XxVg~|?omiifh+Hsmj>=l_z6AzHj%P zh9}7VaJVZ*w+<*dGr}Yk37JWCJiXKDFk<0meCm1n1*b!Zh2hMsABR7*2lEj%fRFdH zVWE_cr~s-Bsw)*rRP*%zFHtiJ&C|ofM4a4m VXWV0Pq6A; +// otherwise, use the current 'output' directory. +#if RELEASE +let root = website +#else +let root = "file://" + (__SOURCE_DIRECTORY__ @@ "../output") +#endif + +// Paths with template/source/output locations +let bin = __SOURCE_DIRECTORY__ @@ "../../bin" +let content = __SOURCE_DIRECTORY__ @@ "../content" +let output = __SOURCE_DIRECTORY__ @@ "../output" +let files = __SOURCE_DIRECTORY__ @@ "../files" +let templates = __SOURCE_DIRECTORY__ @@ "templates" +let formatting = __SOURCE_DIRECTORY__ @@ "../../packages/FSharp.Formatting/" +let docTemplate = formatting @@ "templates/docpage.cshtml" + +// Where to look for *.csproj templates (in this order) +let layoutRootsAll = new System.Collections.Generic.Dictionary() +layoutRootsAll.Add("en",[ templates; formatting @@ "templates" + formatting @@ "templates/reference" ]) +subDirectories (directoryInfo templates) +|> Seq.iter (fun d -> + let name = d.Name + if name.Length = 2 || name.Length = 3 then + layoutRootsAll.Add( + name, [templates @@ name + formatting @@ "templates" + formatting @@ "templates/reference" ])) + +// Copy static files and CSS + JS from F# Formatting +let copyFiles () = + CopyRecursive files output true |> Log "Copying file: " + ensureDirectory (output @@ "content") + CopyRecursive (formatting @@ "styles") (output @@ "content") true + |> Log "Copying styles and scripts: " + +let references = + if isMono then + // Workaround compiler errors in Razor-ViewEngine + let d = RazorEngine.Compilation.ReferenceResolver.UseCurrentAssembliesReferenceResolver() + let loadedList = d.GetReferences () |> Seq.map (fun r -> r.GetFile()) |> Seq.cache + // We replace the list and add required items manually as mcs doesn't like duplicates... + let getItem name = loadedList |> Seq.find (fun l -> l.Contains name) + [ (getItem "FSharp.Core").Replace("4.3.0.0", "4.3.1.0") + Path.GetFullPath "./../../packages/FSharp.Compiler.Service/lib/net40/FSharp.Compiler.Service.dll" + Path.GetFullPath "./../../packages/FSharp.Formatting/lib/net40/System.Web.Razor.dll" + Path.GetFullPath "./../../packages/FSharp.Formatting/lib/net40/RazorEngine.dll" + Path.GetFullPath "./../../packages/FSharp.Formatting/lib/net40/FSharp.Literate.dll" + Path.GetFullPath "./../../packages/FSharp.Formatting/lib/net40/FSharp.CodeFormat.dll" + Path.GetFullPath "./../../packages/FSharp.Formatting/lib/net40/FSharp.MetadataFormat.dll" ] + |> Some + else None + +// Build API reference from XML comments +let buildReference () = + CleanDir (output @@ "reference") + let binaries = + referenceBinaries + |> List.map (fun lib-> bin @@ lib) + MetadataFormat.Generate + ( binaries, output @@ "reference", layoutRootsAll.["en"], + parameters = ("root", root)::info, + sourceRepo = githubLink @@ "tree/master", + sourceFolder = __SOURCE_DIRECTORY__ @@ ".." @@ "..", + publicOnly = true, libDirs = [bin], + ?assemblyReferences = references ) + +// Build documentation from `fsx` and `md` files in `docs/content` +let buildDocumentation () = + let subdirs = Directory.EnumerateDirectories(content, "*", SearchOption.AllDirectories) + for dir in Seq.append [content] subdirs do + let sub = if dir.Length > content.Length then dir.Substring(content.Length + 1) else "." + let langSpecificPath(lang, path:string) = + path.Split([|'/'; '\\'|], System.StringSplitOptions.RemoveEmptyEntries) + |> Array.exists(fun i -> i = lang) + let layoutRoots = + let key = layoutRootsAll.Keys |> Seq.tryFind (fun i -> langSpecificPath(i, dir)) + match key with + | Some lang -> layoutRootsAll.[lang] + | None -> layoutRootsAll.["en"] // "en" is the default language + Literate.ProcessDirectory + ( dir, docTemplate, output @@ sub, + replacements = ("root", root)::info, + layoutRoots = layoutRoots, + ?assemblyReferences = references, + generateAnchors = true ) + +// Generate +copyFiles() +#if HELP +buildDocumentation() +#endif +#if REFERENCE +buildReference() +#endif diff --git a/docs/tools/templates/template.cshtml b/docs/tools/templates/template.cshtml new file mode 100644 index 0000000..ae73593 --- /dev/null +++ b/docs/tools/templates/template.cshtml @@ -0,0 +1,58 @@ + + + + + @Title + + + + + + + + + + + + + + + +
+ +
+
+
+ @RenderBody() +
+
+ F# Project + +
+
+
+ Fork me on GitHub + + diff --git a/lib/README.md b/lib/README.md new file mode 100644 index 0000000..11cdd7a --- /dev/null +++ b/lib/README.md @@ -0,0 +1,11 @@ +This file is in the `lib` directory. + +Any **libraries** on which your project depends and which are **NOT managed via NuGet** should be kept **in this directory**. +This typically includes custom builds of third-party software, private (i.e. to a company) codebases, and native libraries. + +--- +NOTE: + +This file is a placeholder, used to preserve directory structure in Git. + +This file does not need to be edited. diff --git a/nuget/FSharpx.Async.nuspec b/nuget/FSharpx.Async.nuspec new file mode 100644 index 0000000..3c95726 --- /dev/null +++ b/nuget/FSharpx.Async.nuspec @@ -0,0 +1,23 @@ + + + + @project@ + @build.number@ + @authors@ + @authors@ + http://github.com/fsprojects/FSharpx.Async/blob/master/LICENSE.txt + http://fsprojects.github.com/FSharpx.Async + https://raw.githubusercontent.com/fsprojects/ProjectScaffold/master/docs/files/img/logo.png + false + @summary@ + @description@ + @releaseNotes@ + Copyright 2013 + @tags@ + + + + + + + diff --git a/paket.dependencies b/paket.dependencies new file mode 100644 index 0000000..fa7072a --- /dev/null +++ b/paket.dependencies @@ -0,0 +1,10 @@ +source https://nuget.org/api/v2 + +nuget FSharp.Formatting +nuget NUnit +nuget NUnit.Runners +nuget Nuget.CommandLine +nuget FAKE +nuget SourceLink.Fake + +github fsharp/FAKE modules/Octokit/Octokit.fsx \ No newline at end of file diff --git a/paket.lock b/paket.lock new file mode 100644 index 0000000..543fb05 --- /dev/null +++ b/paket.lock @@ -0,0 +1,27 @@ +NUGET + remote: https://nuget.org/api/v2 + specs: + FAKE (3.17.5) + FSharp.Compiler.Service (0.0.82) + FSharp.Formatting (2.7.4) + FSharp.Compiler.Service (>= 0.0.82) + FSharpVSPowerTools.Core (>= 1.7.0) + FSharpVSPowerTools.Core (1.7.0) + FSharp.Compiler.Service (>= 0.0.81) + Microsoft.Bcl (1.1.9) + Microsoft.Bcl.Build (>= 1.0.14) + Microsoft.Bcl.Build (1.0.21) + Microsoft.Net.Http (2.2.28) + Microsoft.Bcl (>= 1.1.9) + Microsoft.Bcl.Build (>= 1.0.14) + NuGet.CommandLine (2.8.3) + NUnit (2.6.4) + NUnit.Runners (2.6.4) + Octokit (0.6.2) + Microsoft.Net.Http + SourceLink.Fake (0.4.2) +GITHUB + remote: fsharp/FAKE + specs: + modules/Octokit/Octokit.fsx (575e7ab5050d2ddec80ba8d3a98cfb10ba327965) + Octokit \ No newline at end of file diff --git a/src/FSharpx.Async/AssemblyInfo.fs b/src/FSharpx.Async/AssemblyInfo.fs new file mode 100644 index 0000000..890bc31 --- /dev/null +++ b/src/FSharpx.Async/AssemblyInfo.fs @@ -0,0 +1,12 @@ +namespace System +open System.Reflection + +[] +[] +[] +[] +[] +do () + +module internal AssemblyVersionInformation = + let [] Version = "1.0" diff --git a/src/FSharpx.Async/FSharpx.Async.fsproj b/src/FSharpx.Async/FSharpx.Async.fsproj new file mode 100644 index 0000000..53f8b32 --- /dev/null +++ b/src/FSharpx.Async/FSharpx.Async.fsproj @@ -0,0 +1,73 @@ + + + + + Debug + AnyCPU + 2.0 + 2d4f3d0e-0e18-48d7-9c27-98864039393d + Library + FSharpx.Async + FSharpx.Async + v4.0 + 4.3.0.0 + FSharpx.Async + + + + true + full + false + false + ..\..\bin + DEBUG;TRACE + 3 + ..\..\bin\FSharpx.Async.xml + + + pdbonly + true + true + ..\..\bin + TRACE + 3 + ..\..\bin\FSharpx.Async.xml + + + + + False + + + + + + + + + + + 11 + + + + + $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets + + + + + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets + + + + + + + diff --git a/src/FSharpx.Async/Library.fs b/src/FSharpx.Async/Library.fs new file mode 100644 index 0000000..68fb368 --- /dev/null +++ b/src/FSharpx.Async/Library.fs @@ -0,0 +1,16 @@ +namespace FSharpx.Async + +/// Documentation for my library +/// +/// ## Example +/// +/// let h = Library.hello 1 +/// printfn "%d" h +/// +module Library = + + /// Returns 42 + /// + /// ## Parameters + /// - `num` - whatever + let hello num = 42 diff --git a/src/FSharpx.Async/Script.fsx b/src/FSharpx.Async/Script.fsx new file mode 100644 index 0000000..ac02886 --- /dev/null +++ b/src/FSharpx.Async/Script.fsx @@ -0,0 +1,8 @@ +// Learn more about F# at http://fsharp.org. See the 'F# Tutorial' project +// for more guidance on F# programming. + +#load "Library.fs" +open FSharpx.Async + +let num = Library.hello 42 +printfn "%i" num diff --git a/tests/FSharpx.Async.Tests/FSharpx.Async.Tests.fsproj b/tests/FSharpx.Async.Tests/FSharpx.Async.Tests.fsproj new file mode 100644 index 0000000..5a15a64 --- /dev/null +++ b/tests/FSharpx.Async.Tests/FSharpx.Async.Tests.fsproj @@ -0,0 +1,94 @@ + + + + + Debug + AnyCPU + 2.0 + adbd32db-b7ac-4e81-9507-28f329af23e7 + Library + FSharpx.Async.Tests + FSharpx.Async.Tests + v4.0 + 4.3.0.0 + FSharpx.Async.Tests + + ..\..\ + + + true + full + false + false + bin\Debug\ + DEBUG;TRACE + 3 + bin\Debug\fsharp_project_scaffold_tests.XML + Project + + + + + + + pdbonly + true + true + bin\Release\ + TRACE + 3 + bin\Release\FSharpx.Async.Tests.xml + + + 11 + + + + + $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets + + + + + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets + + + + + + + + + + + + + True + + + + + + + + FSharpx.Async + {2d4f3d0e-0e18-48d7-9c27-98864039393d} + True + + + + + + + ..\..\packages\NUnit\lib\nunit.framework.dll + True + True + + + diff --git a/tests/FSharpx.Async.Tests/Tests.fs b/tests/FSharpx.Async.Tests/Tests.fs new file mode 100644 index 0000000..0328ab1 --- /dev/null +++ b/tests/FSharpx.Async.Tests/Tests.fs @@ -0,0 +1,10 @@ +module FSharpx.Async.Tests + +open FSharpx.Async +open NUnit.Framework + +[] +let ``hello returns 42`` () = + let result = Library.hello 42 + printfn "%i" result + Assert.AreEqual(42,result) diff --git a/tests/FSharpx.Async.Tests/paket.references b/tests/FSharpx.Async.Tests/paket.references new file mode 100644 index 0000000..37c33ed --- /dev/null +++ b/tests/FSharpx.Async.Tests/paket.references @@ -0,0 +1,2 @@ +NUnit +NUnit.Runners \ No newline at end of file