Compare commits

...

18 Commits

Author SHA1 Message Date
Achim D. Brucker f8fcba9858 Updated project files (compiles, based on latest ProjectScaffold). 2018-07-08 00:12:30 +01:00
Achim D. Brucker 71aece6de5 Updated dependencies. 2018-07-08 00:11:31 +01:00
Achim D. Brucker 75acf31ed1 Ignore directories created by FSLab. 2018-07-08 00:09:02 +01:00
Achim D. Brucker f7467c1ab7 Cleanup. 2018-07-08 00:07:39 +01:00
Achim D. Brucker deb397bdf9 Re-added app.config. 2018-07-07 23:43:36 +01:00
Achim D. Brucker c7a06116f8 Updated dependencies. 2018-07-07 00:37:50 +01:00
Achim D. Brucker efbb132d65 Added fix for type providers. 2018-07-07 00:32:21 +01:00
Achim D. Brucker a232cb4a6a Updated paket template (migration to latest ProjectScaffold). 2018-07-07 00:31:50 +01:00
Achim D. Brucker f2b442eac2 Updated fsproj files (migration to latest ProjectScaffold). 2018-07-07 00:30:42 +01:00
Achim D. Brucker 286ab499fd Updated documentation stubs (migration to latest ProjectScaffold). 2018-07-07 00:16:50 +01:00
Achim D. Brucker e3811224dd Renamed script (migration to latest ProjectScaffold). 2018-07-07 00:15:05 +01:00
Achim D. Brucker 93dc373316 Updated test stubs (migration to latest ProjectScaffold). 2018-07-07 00:14:06 +01:00
Achim D. Brucker f4eef51319 Updated build scripts (migration to latest ProjectScaffold). 2018-07-07 00:10:25 +01:00
Achim D. Brucker 8e91b727fd Updated packet scripts (migration to latest ProjectScaffold). 2018-07-07 00:10:03 +01:00
Achim D. Brucker 5b1e16bce3 Updated build scripts (migration to latest ProjectScaffold). 2018-07-06 22:53:00 +01:00
Achim D. Brucker 4f04eaaa45 Updated build scripts (migration to latest ProjectScaffold). 2018-07-06 22:49:17 +01:00
Achim D. Brucker 9baebec392 Cleanup (migration to latest ProjectScaffold). 2018-07-06 22:45:27 +01:00
Achim D. Brucker c316f1802d Updated git configuration (starting migration to latest ProjectScaffold). 2018-07-06 22:41:14 +01:00
26 changed files with 1004 additions and 2253 deletions

3
.gitattributes vendored
View File

@ -1,3 +1,5 @@
# Auto detect text files
* text=auto
# Custom for Visual Studio
*.cs diff=csharp text=auto eol=lf
@ -10,7 +12,6 @@
*.vbproj merge=union
*.fsproj merge=union
*.dbproj merge=union
*.sh text eol=lf
# Standard to msysgit
*.doc diff=astextplain

38
.gitignore vendored
View File

@ -1,11 +1,3 @@
# ---> C Sharp
# Build Folders (you can keep bin if you'd like, to store dlls and pdbs)
[Bb]in/
[Oo]bj/
# mstest test results
TestResults
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
@ -20,6 +12,7 @@ TestResults
*.exe.mdb
# Build results
[Dd]ebug/
[Rr]elease/
x64/
@ -107,13 +100,8 @@ publish/
# Publish Web Output
*.Publish.xml
# NuGet Packages Directory
packages
# Enable nuget.exe in the .nuget folder (though normally executables are not tracked)
!.nuget/NuGet.exe
# Packet lock file
paket.lock
.paket/paket.exe
# Windows Azure Build Output
csx
@ -126,11 +114,7 @@ AppPackages/
.vscode/
# Others
[Bb]in
[Oo]bj
sql/
TestResults
[Tt]est[Rr]esult*
*.Cache
ClientBin/
[Ss]tyle[Cc]op.*
@ -140,6 +124,7 @@ ClientBin/
*.[Pp]ublish.xml
*.pfx
*.publishsettings
# RIA/Silverlight projects
Generated_Code/
@ -150,8 +135,6 @@ Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# Default archive directory
archive
# SQL Server files
App_Data/*.mdf
App_Data/*.ldf
@ -193,16 +176,25 @@ TestResults.xml
nuget/*.nupkg
release.cmd
release.sh
docs
localpackages/
paket-files
*.orig
.paket/paket.exe
docsrc/content/license.md
docsrc/content/release-notes.md
.fake
docsrc/tools/FSharp.Formatting.svclog
# misc paket files
.paket/paket.exe
paket.lock
# docs
docs
# ignore app.config
src/LogicalHacking.ExtensionDsLab/app.config
# ignore superfluous directories created by FSLab
*/*/DesignTimeURIs/
*/*/WorldBankSchema/
# local resources
src/resources/extensions-schema.sqlite

View File

@ -0,0 +1,299 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- Prevent dotnet template engine to parse this file -->
<!--/-:cnd:noEmit-->
<PropertyGroup>
<!-- make MSBuild track this file for incremental builds. -->
<!-- ref https://blogs.msdn.microsoft.com/msbuild/2005/09/26/how-to-ensure-changes-to-a-custom-target-file-prompt-a-rebuild/ -->
<MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
<!-- Mark that this target file has been loaded. -->
<IsPaketRestoreTargetsFileLoaded>true</IsPaketRestoreTargetsFileLoaded>
<PaketToolsPath>$(MSBuildThisFileDirectory)</PaketToolsPath>
<PaketRootPath>$(MSBuildThisFileDirectory)..\</PaketRootPath>
<PaketRestoreCacheFile>$(PaketRootPath)paket-files\paket.restore.cached</PaketRestoreCacheFile>
<PaketLockFilePath>$(PaketRootPath)paket.lock</PaketLockFilePath>
<MonoPath Condition="'$(MonoPath)' == '' And Exists('/Library/Frameworks/Mono.framework/Commands/mono')">/Library/Frameworks/Mono.framework/Commands/mono</MonoPath>
<MonoPath Condition="'$(MonoPath)' == ''">mono</MonoPath>
<!-- Paket command -->
<PaketExePath Condition=" '$(PaketExePath)' == '' AND Exists('$(PaketRootPath)paket.exe')">$(PaketRootPath)paket.exe</PaketExePath>
<PaketExePath Condition=" '$(PaketExePath)' == '' ">$(PaketToolsPath)paket.exe</PaketExePath>
<PaketCommand Condition=" '$(OS)' == 'Windows_NT'">"$(PaketExePath)"</PaketCommand>
<PaketCommand Condition=" '$(OS)' != 'Windows_NT' ">$(MonoPath) --runtime=v4.0.30319 "$(PaketExePath)"</PaketCommand>
<!-- .net core fdd -->
<_PaketExeExtension>$([System.IO.Path]::GetExtension("$(PaketExePath)"))</_PaketExeExtension>
<PaketCommand Condition=" '$(_PaketExeExtension)' == '.dll' ">dotnet "$(PaketExePath)"</PaketCommand>
<!-- no extension is a shell script -->
<PaketCommand Condition=" '$(_PaketExeExtension)' == '' ">"$(PaketExePath)"</PaketCommand>
<PaketBootStrapperExePath Condition=" '$(PaketBootStrapperExePath)' == '' AND Exists('$(PaketRootPath)paket.bootstrapper.exe')">$(PaketRootPath)paket.bootstrapper.exe</PaketBootStrapperExePath>
<PaketBootStrapperExePath Condition=" '$(PaketBootStrapperExePath)' == '' ">$(PaketToolsPath)paket.bootstrapper.exe</PaketBootStrapperExePath>
<PaketBootStrapperCommand Condition=" '$(OS)' == 'Windows_NT'">"$(PaketBootStrapperExePath)"</PaketBootStrapperCommand>
<PaketBootStrapperCommand Condition=" '$(OS)' != 'Windows_NT' ">$(MonoPath) --runtime=v4.0.30319 "$(PaketBootStrapperExePath)"</PaketBootStrapperCommand>
<!-- Disable automagic references for F# dotnet sdk -->
<!-- This will not do anything for other project types -->
<!-- see https://github.com/fsharp/fslang-design/blob/master/RFCs/FS-1032-fsharp-in-dotnet-sdk.md -->
<DisableImplicitFSharpCoreReference>true</DisableImplicitFSharpCoreReference>
<DisableImplicitSystemValueTupleReference>true</DisableImplicitSystemValueTupleReference>
</PropertyGroup>
<Target Name="PaketRestore" Condition="'$(PaketRestoreDisabled)' != 'True'" BeforeTargets="_GenerateDotnetCliToolReferenceSpecs;_GenerateProjectRestoreGraphPerFramework;_GenerateRestoreGraphWalkPerFramework;CollectPackageReferences" >
<!-- Step 1 Check if lockfile is properly restored -->
<PropertyGroup>
<PaketRestoreRequired>true</PaketRestoreRequired>
<NoWarn>$(NoWarn);NU1603;NU1604;NU1605;NU1608</NoWarn>
</PropertyGroup>
<!-- Because ReadAllText is slow on osx/linux, try to find shasum and awk -->
<PropertyGroup>
<PaketRestoreCachedHasher Condition="'$(OS)' != 'Windows_NT' And '$(PaketRestoreCachedHasher)' == '' And Exists('/usr/bin/shasum') And Exists('/usr/bin/awk')">/usr/bin/shasum "$(PaketRestoreCacheFile)" | /usr/bin/awk '{ print $1 }'</PaketRestoreCachedHasher>
<PaketRestoreLockFileHasher Condition="'$(OS)' != 'Windows_NT' And '$(PaketRestoreLockFileHash)' == '' And Exists('/usr/bin/shasum') And Exists('/usr/bin/awk')">/usr/bin/shasum "$(PaketLockFilePath)" | /usr/bin/awk '{ print $1 }'</PaketRestoreLockFileHasher>
</PropertyGroup>
<!-- If shasum and awk exist get the hashes -->
<Exec StandardOutputImportance="Low" Condition=" '$(PaketRestoreCachedHasher)' != '' " Command="$(PaketRestoreCachedHasher)" ConsoleToMSBuild='true'>
<Output TaskParameter="ConsoleOutput" PropertyName="PaketRestoreCachedHash" />
</Exec>
<Exec StandardOutputImportance="Low" Condition=" '$(PaketRestoreLockFileHasher)' != '' " Command="$(PaketRestoreLockFileHasher)" ConsoleToMSBuild='true'>
<Output TaskParameter="ConsoleOutput" PropertyName="PaketRestoreLockFileHash" />
</Exec>
<!-- Debug whats going on -->
<Message Importance="low" Text="calling paket restore with targetframework=$(TargetFramework) targetframeworks=$(TargetFrameworks)" />
<PropertyGroup Condition="Exists('$(PaketRestoreCacheFile)') ">
<!-- if no hash has been done yet fall back to just reading in the files and comparing them -->
<PaketRestoreCachedHash Condition=" '$(PaketRestoreCachedHash)' == '' ">$([System.IO.File]::ReadAllText('$(PaketRestoreCacheFile)'))</PaketRestoreCachedHash>
<PaketRestoreLockFileHash Condition=" '$(PaketRestoreLockFileHash)' == '' ">$([System.IO.File]::ReadAllText('$(PaketLockFilePath)'))</PaketRestoreLockFileHash>
<PaketRestoreRequired>true</PaketRestoreRequired>
<PaketRestoreRequired Condition=" '$(PaketRestoreLockFileHash)' == '$(PaketRestoreCachedHash)' ">false</PaketRestoreRequired>
<PaketRestoreRequired Condition=" '$(PaketRestoreLockFileHash)' == '' ">true</PaketRestoreRequired>
</PropertyGroup>
<PropertyGroup Condition="'$(PaketPropsVersion)' != '5.174.2' ">
<PaketRestoreRequired>true</PaketRestoreRequired>
</PropertyGroup>
<!-- Do a global restore if required -->
<Exec Command='$(PaketBootStrapperCommand)' Condition="Exists('$(PaketBootStrapperExePath)') AND !(Exists('$(PaketExePath)'))" ContinueOnError="false" />
<Exec Command='$(PaketCommand) restore' Condition=" '$(PaketRestoreRequired)' == 'true' " ContinueOnError="false" />
<!-- Step 2 Detect project specific changes -->
<ItemGroup>
<MyTargetFrameworks Condition="'$(TargetFramework)' != '' " Include="$(TargetFramework)"></MyTargetFrameworks>
<!-- Don't include all frameworks when msbuild explicitly asks for a single one -->
<MyTargetFrameworks Condition="'$(TargetFrameworks)' != '' AND '$(TargetFramework)' == '' " Include="$(TargetFrameworks)"></MyTargetFrameworks>
<PaketResolvedFilePaths Include="@(MyTargetFrameworks -> '$(MSBuildProjectDirectory)\obj\$(MSBuildProjectFile).%(Identity).paket.resolved')"></PaketResolvedFilePaths>
</ItemGroup>
<Message Importance="low" Text="MyTargetFrameworks=@(MyTargetFrameworks) PaketResolvedFilePaths=@(PaketResolvedFilePaths)" />
<PropertyGroup>
<PaketReferencesCachedFilePath>$(MSBuildProjectDirectory)\obj\$(MSBuildProjectFile).paket.references.cached</PaketReferencesCachedFilePath>
<!-- MyProject.fsproj.paket.references has the highest precedence -->
<PaketOriginalReferencesFilePath>$(MSBuildProjectFullPath).paket.references</PaketOriginalReferencesFilePath>
<!-- MyProject.paket.references -->
<PaketOriginalReferencesFilePath Condition=" !Exists('$(PaketOriginalReferencesFilePath)')">$(MSBuildProjectDirectory)\$(MSBuildProjectName).paket.references</PaketOriginalReferencesFilePath>
<!-- paket.references -->
<PaketOriginalReferencesFilePath Condition=" !Exists('$(PaketOriginalReferencesFilePath)')">$(MSBuildProjectDirectory)\paket.references</PaketOriginalReferencesFilePath>
<DoAllResolvedFilesExist>false</DoAllResolvedFilesExist>
<DoAllResolvedFilesExist Condition="Exists(%(PaketResolvedFilePaths.Identity))">true</DoAllResolvedFilesExist>
<PaketRestoreRequired>true</PaketRestoreRequired>
<PaketRestoreRequiredReason>references-file-or-cache-not-found</PaketRestoreRequiredReason>
</PropertyGroup>
<!-- Step 2 a Detect changes in references file -->
<PropertyGroup Condition="Exists('$(PaketOriginalReferencesFilePath)') AND Exists('$(PaketReferencesCachedFilePath)') ">
<PaketRestoreCachedHash>$([System.IO.File]::ReadAllText('$(PaketReferencesCachedFilePath)'))</PaketRestoreCachedHash>
<PaketRestoreReferencesFileHash>$([System.IO.File]::ReadAllText('$(PaketOriginalReferencesFilePath)'))</PaketRestoreReferencesFileHash>
<PaketRestoreRequiredReason>references-file</PaketRestoreRequiredReason>
<PaketRestoreRequired Condition=" '$(PaketRestoreReferencesFileHash)' == '$(PaketRestoreCachedHash)' ">false</PaketRestoreRequired>
</PropertyGroup>
<PropertyGroup Condition="!Exists('$(PaketOriginalReferencesFilePath)') AND !Exists('$(PaketReferencesCachedFilePath)') ">
<!-- If both don't exist there is nothing to do. -->
<PaketRestoreRequired>false</PaketRestoreRequired>
</PropertyGroup>
<!-- Step 2 b detect relevant changes in project file (new targetframework) -->
<PropertyGroup Condition=" '$(DoAllResolvedFilesExist)' != 'true' ">
<PaketRestoreRequired>true</PaketRestoreRequired>
<PaketRestoreRequiredReason>target-framework '$(TargetFramework)' or '$(TargetFrameworks)' files @(PaketResolvedFilePaths)</PaketRestoreRequiredReason>
</PropertyGroup>
<!-- Step 3 Restore project specific stuff if required -->
<Message Condition=" '$(PaketRestoreRequired)' == 'true' " Importance="low" Text="Detected a change ('$(PaketRestoreRequiredReason)') in the project file '$(MSBuildProjectFullPath)', calling paket restore" />
<Exec Command='$(PaketCommand) restore --project "$(MSBuildProjectFullPath)" --target-framework "$(TargetFrameworks)"' Condition=" '$(PaketRestoreRequired)' == 'true' AND '$(TargetFramework)' == '' " ContinueOnError="false" />
<Exec Command='$(PaketCommand) restore --project "$(MSBuildProjectFullPath)" --target-framework "$(TargetFramework)"' Condition=" '$(PaketRestoreRequired)' == 'true' AND '$(TargetFramework)' != '' " ContinueOnError="false" />
<!-- This shouldn't actually happen, but just to be sure. -->
<PropertyGroup>
<DoAllResolvedFilesExist>false</DoAllResolvedFilesExist>
<DoAllResolvedFilesExist Condition="Exists(%(PaketResolvedFilePaths.Identity))">true</DoAllResolvedFilesExist>
</PropertyGroup>
<Error Condition=" '$(DoAllResolvedFilesExist)' != 'true' AND '$(ResolveNuGetPackages)' != 'False' " Text="One Paket file '@(PaketResolvedFilePaths)' is missing while restoring $(MSBuildProjectFile). Please delete 'paket-files/paket.restore.cached' and call 'paket restore'." />
<!-- Step 4 forward all msbuild properties (PackageReference, DotNetCliToolReference) to msbuild -->
<ReadLinesFromFile Condition="($(DesignTimeBuild) != true OR '$(PaketPropsLoaded)' != 'true') AND '@(PaketResolvedFilePaths)' != ''" File="%(PaketResolvedFilePaths.Identity)" >
<Output TaskParameter="Lines" ItemName="PaketReferencesFileLines"/>
</ReadLinesFromFile>
<ItemGroup Condition="($(DesignTimeBuild) != true OR '$(PaketPropsLoaded)' != 'true') AND '@(PaketReferencesFileLines)' != '' " >
<PaketReferencesFileLinesInfo Include="@(PaketReferencesFileLines)" >
<PackageName>$([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[0])</PackageName>
<PackageVersion>$([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[1])</PackageVersion>
<AllPrivateAssets>$([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[4])</AllPrivateAssets>
</PaketReferencesFileLinesInfo>
<PackageReference Include="%(PaketReferencesFileLinesInfo.PackageName)">
<Version>%(PaketReferencesFileLinesInfo.PackageVersion)</Version>
<PrivateAssets Condition=" ('%(PaketReferencesFileLinesInfo.AllPrivateAssets)' == 'true') Or ('$(PackAsTool)' == 'true') ">All</PrivateAssets>
<ExcludeAssets Condition="%(PaketReferencesFileLinesInfo.AllPrivateAssets) == 'exclude'">runtime</ExcludeAssets>
<Publish Condition=" '$(PackAsTool)' == 'true' ">true</Publish>
</PackageReference>
</ItemGroup>
<PropertyGroup>
<PaketCliToolFilePath>$(MSBuildProjectDirectory)/obj/$(MSBuildProjectFile).paket.clitools</PaketCliToolFilePath>
</PropertyGroup>
<ReadLinesFromFile File="$(PaketCliToolFilePath)" >
<Output TaskParameter="Lines" ItemName="PaketCliToolFileLines"/>
</ReadLinesFromFile>
<ItemGroup Condition=" '@(PaketCliToolFileLines)' != '' " >
<PaketCliToolFileLinesInfo Include="@(PaketCliToolFileLines)" >
<PackageName>$([System.String]::Copy('%(PaketCliToolFileLines.Identity)').Split(',')[0])</PackageName>
<PackageVersion>$([System.String]::Copy('%(PaketCliToolFileLines.Identity)').Split(',')[1])</PackageVersion>
</PaketCliToolFileLinesInfo>
<DotNetCliToolReference Include="%(PaketCliToolFileLinesInfo.PackageName)">
<Version>%(PaketCliToolFileLinesInfo.PackageVersion)</Version>
</DotNetCliToolReference>
</ItemGroup>
<!-- Disabled for now until we know what to do with runtime deps - https://github.com/fsprojects/Paket/issues/2964
<PropertyGroup>
<RestoreConfigFile>$(MSBuildProjectDirectory)/obj/$(MSBuildProjectFile).NuGet.Config</RestoreConfigFile>
</PropertyGroup> -->
</Target>
<Target Name="PaketDisableDirectPack" AfterTargets="_IntermediatePack" BeforeTargets="GenerateNuspec" Condition="('$(IsPackable)' == '' Or '$(IsPackable)' == 'true') And Exists('$(MSBuildProjectDirectory)/obj/$(MSBuildProjectFile).references')" >
<PropertyGroup>
<ContinuePackingAfterGeneratingNuspec>false</ContinuePackingAfterGeneratingNuspec>
</PropertyGroup>
</Target>
<Target Name="PaketOverrideNuspec" AfterTargets="GenerateNuspec" Condition="('$(IsPackable)' == '' Or '$(IsPackable)' == 'true') And Exists('$(MSBuildProjectDirectory)/obj/$(MSBuildProjectFile).references')" >
<ItemGroup>
<_NuspecFilesNewLocation Include="$(BaseIntermediateOutputPath)$(Configuration)\*.nuspec"/>
</ItemGroup>
<PropertyGroup>
<PaketProjectFile>$(MSBuildProjectDirectory)/$(MSBuildProjectFile)</PaketProjectFile>
<ContinuePackingAfterGeneratingNuspec>true</ContinuePackingAfterGeneratingNuspec>
<UseNewPack>false</UseNewPack>
<UseNewPack Condition=" '$(NuGetToolVersion)' != '4.0.0' ">true</UseNewPack>
<AdjustedNuspecOutputPath>$(BaseIntermediateOutputPath)$(Configuration)</AdjustedNuspecOutputPath>
<AdjustedNuspecOutputPath Condition="@(_NuspecFilesNewLocation) == ''">$(BaseIntermediateOutputPath)</AdjustedNuspecOutputPath>
</PropertyGroup>
<ItemGroup>
<_NuspecFiles Include="$(AdjustedNuspecOutputPath)\*.nuspec"/>
</ItemGroup>
<Exec Command='$(PaketCommand) fix-nuspecs files "@(_NuspecFiles)" project-file "$(PaketProjectFile)" ' Condition="@(_NuspecFiles) != ''" />
<ConvertToAbsolutePath Condition="@(_NuspecFiles) != ''" Paths="@(_NuspecFiles)">
<Output TaskParameter="AbsolutePaths" PropertyName="NuspecFileAbsolutePath" />
</ConvertToAbsolutePath>
<!-- Call Pack -->
<PackTask Condition="$(UseNewPack)"
PackItem="$(PackProjectInputFile)"
PackageFiles="@(_PackageFiles)"
PackageFilesToExclude="@(_PackageFilesToExclude)"
PackageVersion="$(PackageVersion)"
PackageId="$(PackageId)"
Title="$(Title)"
Authors="$(Authors)"
Description="$(Description)"
Copyright="$(Copyright)"
RequireLicenseAcceptance="$(PackageRequireLicenseAcceptance)"
LicenseUrl="$(PackageLicenseUrl)"
ProjectUrl="$(PackageProjectUrl)"
IconUrl="$(PackageIconUrl)"
ReleaseNotes="$(PackageReleaseNotes)"
Tags="$(PackageTags)"
DevelopmentDependency="$(DevelopmentDependency)"
BuildOutputInPackage="@(_BuildOutputInPackage)"
TargetPathsToSymbols="@(_TargetPathsToSymbols)"
TargetFrameworks="@(_TargetFrameworks)"
AssemblyName="$(AssemblyName)"
PackageOutputPath="$(PackageOutputAbsolutePath)"
IncludeSymbols="$(IncludeSymbols)"
IncludeSource="$(IncludeSource)"
PackageTypes="$(PackageType)"
IsTool="$(IsTool)"
RepositoryUrl="$(RepositoryUrl)"
RepositoryType="$(RepositoryType)"
SourceFiles="@(_SourceFiles->Distinct())"
NoPackageAnalysis="$(NoPackageAnalysis)"
MinClientVersion="$(MinClientVersion)"
Serviceable="$(Serviceable)"
FrameworkAssemblyReferences="@(_FrameworkAssemblyReferences)"
ContinuePackingAfterGeneratingNuspec="$(ContinuePackingAfterGeneratingNuspec)"
NuspecOutputPath="$(AdjustedNuspecOutputPath)"
IncludeBuildOutput="$(IncludeBuildOutput)"
BuildOutputFolder="$(BuildOutputTargetFolder)"
ContentTargetFolders="$(ContentTargetFolders)"
RestoreOutputPath="$(RestoreOutputAbsolutePath)"
NuspecFile="$(NuspecFileAbsolutePath)"
NuspecBasePath="$(NuspecBasePath)"
NuspecProperties="$(NuspecProperties)"/>
<PackTask Condition="! $(UseNewPack)"
PackItem="$(PackProjectInputFile)"
PackageFiles="@(_PackageFiles)"
PackageFilesToExclude="@(_PackageFilesToExclude)"
PackageVersion="$(PackageVersion)"
PackageId="$(PackageId)"
Title="$(Title)"
Authors="$(Authors)"
Description="$(Description)"
Copyright="$(Copyright)"
RequireLicenseAcceptance="$(PackageRequireLicenseAcceptance)"
LicenseUrl="$(PackageLicenseUrl)"
ProjectUrl="$(PackageProjectUrl)"
IconUrl="$(PackageIconUrl)"
ReleaseNotes="$(PackageReleaseNotes)"
Tags="$(PackageTags)"
TargetPathsToAssemblies="@(_TargetPathsToAssemblies->'%(FinalOutputPath)')"
TargetPathsToSymbols="@(_TargetPathsToSymbols)"
TargetFrameworks="@(_TargetFrameworks)"
AssemblyName="$(AssemblyName)"
PackageOutputPath="$(PackageOutputAbsolutePath)"
IncludeSymbols="$(IncludeSymbols)"
IncludeSource="$(IncludeSource)"
PackageTypes="$(PackageType)"
IsTool="$(IsTool)"
RepositoryUrl="$(RepositoryUrl)"
RepositoryType="$(RepositoryType)"
SourceFiles="@(_SourceFiles->Distinct())"
NoPackageAnalysis="$(NoPackageAnalysis)"
MinClientVersion="$(MinClientVersion)"
Serviceable="$(Serviceable)"
AssemblyReferences="@(_References)"
ContinuePackingAfterGeneratingNuspec="$(ContinuePackingAfterGeneratingNuspec)"
NuspecOutputPath="$(AdjustedNuspecOutputPath)"
IncludeBuildOutput="$(IncludeBuildOutput)"
BuildOutputFolder="$(BuildOutputTargetFolder)"
ContentTargetFolders="$(ContentTargetFolders)"
RestoreOutputPath="$(RestoreOutputAbsolutePath)"
NuspecFile="$(NuspecFileAbsolutePath)"
NuspecBasePath="$(NuspecBasePath)"
NuspecProperties="$(NuspecProperties)"/>
</Target>
<!--/+:cnd:noEmit-->
</Project>

View File

@ -1,19 +1,21 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012
# Visual Studio 15
VisualStudioVersion = 15.0.27703.2000
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".paket", ".paket", "{63297B98-5CED-492C-A5B7-A5B4F73CF142}"
ProjectSection(SolutionItems) = preProject
paket.dependencies = paket.dependencies
paket.references = paket.references
paket.lock = paket.lock
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{A6A6AF7D-D6E3-442D-9B1E-58CC91879BE1}"
EndProject
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "LogicalHacking.ExtensionDsLab", "src\LogicalHacking.ExtensionDsLab\LogicalHacking.ExtensionDsLab.fsproj", "{8A2EBFC4-14CE-4D77-81DE-1FD7372C3382}"
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "LogicalHacking.ExtensionDsLab", "src\LogicalHacking.ExtensionDsLab\LogicalHacking.ExtensionDsLab.fsproj", "{B5A5E410-93FC-4353-98C6-DDDE6C458E55}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "project", "project", "{BF60BC93-E09B-4E5F-9D85-95A519479D54}"
ProjectSection(SolutionItems) = preProject
build.fsx = build.fsx
README.md = README.md
RELEASE_NOTES.md = RELEASE_NOTES.md
EndProjectSection
@ -32,7 +34,23 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "content", "content", "{8E6D
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{ED8079DD-2B06-4030-9F0F-DC548F98E1C4}"
EndProject
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "LogicalHacking.ExtensionDsLab.Tests", "tests\LogicalHacking.ExtensionDsLab.Tests\LogicalHacking.ExtensionDsLab.Tests.fsproj", "{661253B3-4C4D-4EBD-87E4-F1C6F010347F}"
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "LogicalHacking.ExtensionDsLab.Tests", "tests\LogicalHacking.ExtensionDsLab.Tests\LogicalHacking.ExtensionDsLab.Tests.fsproj", "{4178526E-9B42-4EDB-8D99-39B7C7DF0705}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "git", "git", "{078A9C52-DDC1-46F4-9235-9E6C89C87AFD}"
ProjectSection(SolutionItems) = preProject
.gitattributes = .gitattributes
.gitignore = .gitignore
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".build", ".build", "{7C6D08E7-3EAC-4335-8F4B-252C193C27C9}"
ProjectSection(SolutionItems) = preProject
.travis.yml = .travis.yml
appveyor.yml = appveyor.yml
build.cmd = build.cmd
build.fsx = build.fsx
build.proj = build.proj
build.sh = build.sh
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -40,14 +58,18 @@ Global
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{8A2EBFC4-14CE-4D77-81DE-1FD7372C3382}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8A2EBFC4-14CE-4D77-81DE-1FD7372C3382}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8A2EBFC4-14CE-4D77-81DE-1FD7372C3382}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8A2EBFC4-14CE-4D77-81DE-1FD7372C3382}.Release|Any CPU.Build.0 = Release|Any CPU
{661253B3-4C4D-4EBD-87E4-F1C6F010347F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{661253B3-4C4D-4EBD-87E4-F1C6F010347F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{661253B3-4C4D-4EBD-87E4-F1C6F010347F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{661253B3-4C4D-4EBD-87E4-F1C6F010347F}.Release|Any CPU.Build.0 = Release|Any CPU
{B5A5E410-93FC-4353-98C6-DDDE6C458E55}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B5A5E410-93FC-4353-98C6-DDDE6C458E55}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B5A5E410-93FC-4353-98C6-DDDE6C458E55}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B5A5E410-93FC-4353-98C6-DDDE6C458E55}.Release|Any CPU.Build.0 = Release|Any CPU
{4178526E-9B42-4EDB-8D99-39B7C7DF0705}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4178526E-9B42-4EDB-8D99-39B7C7DF0705}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4178526E-9B42-4EDB-8D99-39B7C7DF0705}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4178526E-9B42-4EDB-8D99-39B7C7DF0705}.Release|Any CPU.Build.0 = Release|Any CPU
{B7339FEC-0891-4DF8-8BB5-0B806A64F32F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B7339FEC-0891-4DF8-8BB5-0B806A64F32F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B7339FEC-0891-4DF8-8BB5-0B806A64F32F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B7339FEC-0891-4DF8-8BB5-0B806A64F32F}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -55,6 +77,6 @@ Global
GlobalSection(NestedProjects) = preSolution
{83F16175-43B1-4C90-A1EE-8E351C33435D} = {A6A6AF7D-D6E3-442D-9B1E-58CC91879BE1}
{8E6D5255-776D-4B61-85F9-73C37AA1FB9A} = {A6A6AF7D-D6E3-442D-9B1E-58CC91879BE1}
{661253B3-4C4D-4EBD-87E4-F1C6F010347F} = {ED8079DD-2B06-4030-9F0F-DC548F98E1C4}
{4178526E-9B42-4EDB-8D99-39B7C7DF0705} = {ED8079DD-2B06-4030-9F0F-DC548F98E1C4}
EndGlobalSection
EndGlobal

View File

@ -1,18 +1,9 @@
@echo off
cls
.paket\paket.bootstrapper.exe
if errorlevel 1 (
exit /b %errorlevel%
)
.paket\paket.exe restore
if errorlevel 1 (
exit /b %errorlevel%
)
dotnet restore build.proj
IF NOT EXIST build.fsx (
.paket\paket.exe update
packages\build\FAKE\tools\FAKE.exe init.fsx
fake run init.fsx
)
packages\build\FAKE\tools\FAKE.exe build.fsx %*
fake build %*

416
build.fsx
View File

@ -2,16 +2,20 @@
// FAKE build script
// --------------------------------------------------------------------------------------
#r @"packages/build/FAKE/tools/FakeLib.dll"
open Fake
open Fake.Git
open Fake.AssemblyInfoFile
open Fake.ReleaseNotesHelper
open Fake.UserInputHelper
#r "paket: groupref FakeBuild //"
#load "./.fake/build.fsx/intellisense.fsx"
open System
open System.IO
open System.Diagnostics
open Fake.Core
open Fake.Core.TargetOperators
open Fake.DotNet
open Fake.IO
open Fake.IO.FileSystemOperators
open Fake.IO.Globbing.Operators
open Fake.DotNet.Testing
open Fake.Tools
open Fake.Api
// --------------------------------------------------------------------------------------
// START TODO: Provide project-specific details below
@ -36,7 +40,7 @@ let summary = "A data science framework for analyzing Chrome browser extensions.
let description = "A data science framework for analyzing Chrome browser extensions."
// List of author names (for NuGet package)
let authors = [ "Achim D. Brucker" ]
let author = "Achim D. Brucker"
// Tags for your project (for NuGet package)
let tags = "ChromeExtension DataScience BrowserSecurity"
@ -47,8 +51,8 @@ let solutionFile = "LogicalHacking.ExtensionDsLab.sln"
// Default target configuration
let configuration = "Release"
// Pattern specifying assemblies to be tested using NUnit
let testAssemblies = "tests/**/bin" </> configuration </> "*Tests*.dll"
// Pattern specifying assemblies to be tested using Expecto
let testAssemblies = "tests/**/bin" </> configuration </> "**" </> "*Tests.exe"
// Git configuration (used for publishing documentation in gh-pages branch)
// The profile where the project is posted
@ -59,14 +63,16 @@ let gitHome = sprintf "%s/%s" "https://git.logicalhacking.com" gitOwner
let gitName = "ExtensionDsLab"
// The url for the raw files hosted
let gitRaw = environVarOrDefault "gitRaw" "https://git.logicalhacking.com/BrowserSecurity"
let gitRaw = Environment.environVarOrDefault "gitRaw" "https://raw.githubusercontent.com/BrowserSecurity"
let website = "/ExtensionDsLab"
// --------------------------------------------------------------------------------------
// 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 release = ReleaseNotes.load "RELEASE_NOTES.md"
// Helper active pattern for project types
let (|Fsproj|Csproj|Vbproj|Shproj|) (projFileName:string) =
@ -78,30 +84,30 @@ let (|Fsproj|Csproj|Vbproj|Shproj|) (projFileName:string) =
| _ -> failwith (sprintf "Project file %s not supported. Unknown project type." projFileName)
// Generate assembly info files with the right version & up-to-date information
Target "AssemblyInfo" (fun _ ->
Target.create "AssemblyInfo" (fun _ ->
let getAssemblyInfoAttributes projectName =
[ Attribute.Title (projectName)
Attribute.Product project
Attribute.Description summary
Attribute.Version release.AssemblyVersion
Attribute.FileVersion release.AssemblyVersion
Attribute.Configuration configuration ]
[ AssemblyInfo.Title (projectName)
AssemblyInfo.Product project
AssemblyInfo.Description summary
AssemblyInfo.Version release.AssemblyVersion
AssemblyInfo.FileVersion release.AssemblyVersion
AssemblyInfo.Configuration configuration ]
let getProjectDetails projectPath =
let projectName = System.IO.Path.GetFileNameWithoutExtension(projectPath)
let projectName = Path.GetFileNameWithoutExtension(projectPath)
( projectPath,
projectName,
System.IO.Path.GetDirectoryName(projectPath),
Path.GetDirectoryName(projectPath),
(getAssemblyInfoAttributes projectName)
)
!! "src/**/*.??proj"
|> Seq.map getProjectDetails
|> Seq.iter (fun (projFileName, projectName, folderName, attributes) ->
|> Seq.iter (fun (projFileName, _, folderName, attributes) ->
match projFileName with
| Fsproj -> CreateFSharpAssemblyInfo (folderName </> "AssemblyInfo.fs") attributes
| Csproj -> CreateCSharpAssemblyInfo ((folderName </> "Properties") </> "AssemblyInfo.cs") attributes
| Vbproj -> CreateVisualBasicAssemblyInfo ((folderName </> "My Project") </> "AssemblyInfo.vb") attributes
| Fsproj -> AssemblyInfoFile.createFSharp (folderName </> "AssemblyInfo.fs") attributes
| Csproj -> AssemblyInfoFile.createCSharp ((folderName </> "Properties") </> "AssemblyInfo.cs") attributes
| Vbproj -> AssemblyInfoFile.createVisualBasic ((folderName </> "My Project") </> "AssemblyInfo.vb") attributes
| Shproj -> ()
)
)
@ -109,63 +115,57 @@ Target "AssemblyInfo" (fun _ ->
// Copies binaries from default VS location to expected bin folder
// But keeps a subdirectory structure for each project in the
// src folder to support multiple project outputs
Target "CopyBinaries" (fun _ ->
Target.create "CopyBinaries" (fun _ ->
!! "src/**/*.??proj"
-- "src/**/*.shproj"
|> Seq.map (fun f -> ((System.IO.Path.GetDirectoryName f) </> "bin" </> configuration, "bin" </> (System.IO.Path.GetFileNameWithoutExtension f)))
|> Seq.iter (fun (fromDir, toDir) -> CopyDir toDir fromDir (fun _ -> true))
|> Seq.map (fun f -> ((Path.getDirectory f) </> "bin" </> configuration, "bin" </> (Path.GetFileNameWithoutExtension f)))
|> Seq.iter (fun (fromDir, toDir) -> Shell.copyDir toDir fromDir (fun _ -> true))
)
// --------------------------------------------------------------------------------------
// Clean build results
let vsProjProps =
#if MONO
[ ("DefineConstants","MONO"); ("Configuration", configuration) ]
#else
[ ("Configuration", configuration); ("Platform", "Any CPU") ]
#endif
let buildConfiguration = DotNet.Custom <| Environment.environVarOrDefault "configuration" configuration
Target "Clean" (fun _ ->
!! solutionFile |> MSBuildReleaseExt "" vsProjProps "Clean" |> ignore
CleanDirs ["bin"; "temp"; "docs"]
Target.create "Clean" (fun _ ->
Shell.cleanDirs ["bin"; "temp"]
)
Target.create "CleanDocs" (fun _ ->
Shell.cleanDirs ["docs"]
)
// --------------------------------------------------------------------------------------
// Build library & test project
Target "Build" (fun _ ->
!! solutionFile
|> MSBuildReleaseExt "" vsProjProps "Rebuild"
|> ignore
Target.create "Build" (fun _ ->
solutionFile
|> DotNet.build (fun p ->
{ p with
Configuration = buildConfiguration })
)
// --------------------------------------------------------------------------------------
// Run the unit tests using test runner
Target "RunTests" (fun _ ->
Target.create "RunTests" (fun _ ->
!! testAssemblies
|> NUnit (fun p ->
{ p with
DisableShadowCopy = true
TimeOut = TimeSpan.FromMinutes 20.
OutputFile = "TestResults.xml" })
|> Expecto.run id
)
// --------------------------------------------------------------------------------------
// Build a NuGet package
Target "NuGet" (fun _ ->
Paket.Pack(fun p ->
Target.create "NuGet" (fun _ ->
Paket.pack(fun p ->
{ p with
OutputPath = "bin"
Version = release.NugetVersion
ReleaseNotes = toLines release.Notes})
ReleaseNotes = String.toLines release.Notes})
)
Target "PublishNuget" (fun _ ->
Paket.Push(fun p ->
Target.create "PublishNuget" (fun _ ->
Paket.push(fun p ->
{ p with
PublishUrl = "https://www.nuget.org"
WorkingDir = "bin" })
@ -175,193 +175,191 @@ Target "PublishNuget" (fun _ ->
// --------------------------------------------------------------------------------------
// Generate the documentation
// Paths with template/source/output locations
let bin = __SOURCE_DIRECTORY__ @@ "bin"
let content = __SOURCE_DIRECTORY__ @@ "docsrc/content"
let output = __SOURCE_DIRECTORY__ @@ "docs"
let files = __SOURCE_DIRECTORY__ @@ "docsrc/files"
let templates = __SOURCE_DIRECTORY__ @@ "docsrc/tools/templates"
let formatting = __SOURCE_DIRECTORY__ @@ "packages/formatting/FSharp.Formatting"
let docTemplate = "docpage.cshtml"
let fakePath = "packages" </> "build" </> "FAKE" </> "tools" </> "FAKE.exe"
let fakeStartInfo script workingDirectory args fsiargs environmentVars =
(fun (info: 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)
let github_release_user = Environment.environVarOrDefault "github_release_user" gitOwner
let githubLink = sprintf "https://github.com/%s/%s" github_release_user gitName
/// 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
// Specify more information about your project
let info =
[ "project-name", "LogicalHacking.ExtensionDsLab"
"project-author", "Achim D. Brucker"
"project-summary", "A data science framework for analyzing Chrome browser extensions."
"project-github", githubLink
"project-nuget", "http://nuget.org/packages/LogicalHacking.ExtensionDsLab" ]
// Documentation
let buildDocumentationTarget fsiargs target =
trace (sprintf "Building documentation (%s), this could take some time, please wait..." target)
let exit = executeFAKEWithOutput "docsrc/tools" "generate.fsx" fsiargs ["target", target]
if exit <> 0 then
failwith "generating reference documentation failed"
()
let root = website
Target "GenerateReferenceDocs" (fun _ ->
buildDocumentationTarget "-d:RELEASE -d:REFERENCE" "Default"
let referenceBinaries = []
let layoutRootsAll = new System.Collections.Generic.Dictionary<string, string list>()
layoutRootsAll.Add("en",[ templates;
formatting @@ "templates"
formatting @@ "templates/reference" ])
Target.create "ReferenceDocs" (fun _ ->
Directory.ensure (output @@ "reference")
let binaries () =
let manuallyAdded =
referenceBinaries
|> List.map (fun b -> bin @@ b)
let conventionBased =
DirectoryInfo.getSubDirectories <| DirectoryInfo bin
|> Array.collect (fun d ->
let name, dInfo =
let net45Bin =
DirectoryInfo.getSubDirectories d |> Array.filter(fun x -> x.FullName.ToLower().Contains("net45"))
let net47Bin =
DirectoryInfo.getSubDirectories d |> Array.filter(fun x -> x.FullName.ToLower().Contains("net47"))
if net45Bin.Length > 0 then
d.Name, net45Bin.[0]
else
d.Name, net47Bin.[0]
dInfo.GetFiles()
|> Array.filter (fun x ->
x.Name.ToLower() = (sprintf "%s.dll" name).ToLower())
|> Array.map (fun x -> x.FullName)
)
|> List.ofArray
conventionBased @ manuallyAdded
binaries()
|> FSFormatting.createDocsForDlls (fun args ->
{ args with
OutputDirectory = output @@ "reference"
LayoutRoots = layoutRootsAll.["en"]
ProjectParameters = ("root", root)::info
SourceRepository = githubLink @@ "tree/master" }
)
)
let generateHelp' fail debug =
let args =
if debug then "--define:HELP"
else "--define:RELEASE --define:HELP"
try
buildDocumentationTarget args "Default"
traceImportant "Help generated"
with
| e when not fail ->
traceImportant "generating help documentation failed"
let copyFiles () =
Shell.copyRecursive files output true
|> Trace.logItems "Copying file: "
Directory.ensure (output @@ "content")
Shell.copyRecursive (formatting @@ "styles") (output @@ "content") true
|> Trace.logItems "Copying styles and scripts: "
Target.create "Docs" (fun _ ->
File.delete "docsrc/content/release-notes.md"
Shell.copyFile "docsrc/content/" "RELEASE_NOTES.md"
Shell.rename "docsrc/content/release-notes.md" "docsrc/content/RELEASE_NOTES.md"
let generateHelp fail =
generateHelp' fail false
File.delete "docsrc/content/license.md"
Shell.copyFile "docsrc/content/" "LICENSE"
Shell.rename "docsrc/content/license.md" "docsrc/content/LICENSE"
Target "GenerateHelp" (fun _ ->
DeleteFile "docsrc/content/release-notes.md"
CopyFile "docsrc/content/" "RELEASE_NOTES.md"
Rename "docsrc/content/release-notes.md" "docsrc/content/RELEASE_NOTES.md"
DirectoryInfo.getSubDirectories (DirectoryInfo.ofPath 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" ]))
copyFiles ()
for dir in [ content; ] do
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
DeleteFile "docsrc/content/license.md"
CopyFile "docsrc/content/" "LICENSE"
Rename "docsrc/content/license.md" "docsrc/content/LICENSE"
generateHelp true
)
Target "GenerateHelpDebug" (fun _ ->
DeleteFile "docsrc/content/release-notes.md"
CopyFile "docsrc/content/" "RELEASE_NOTES.md"
Rename "docsrc/content/release-notes.md" "docsrc/content/RELEASE_NOTES.md"
DeleteFile "docsrc/content/license.md"
CopyFile "docsrc/content/" "LICENSE"
Rename "docsrc/content/license.md" "docsrc/content/LICENSE"
generateHelp' true true
)
Target "KeepRunning" (fun _ ->
use watcher = !! "docsrc/content/**/*.*" |> WatchChanges (fun changes ->
generateHelp' true true
)
traceImportant "Waiting for help edits. Press any key to stop."
System.Console.ReadKey() |> ignore
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 = "docsrc/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 = "docsrc/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)
FSFormatting.createDocs (fun args ->
{ args with
Source = content
OutputDirectory = output
LayoutRoots = layoutRoots
ProjectParameters = ("root", root)::info
Template = docTemplate } )
)
// --------------------------------------------------------------------------------------
// Release Scripts
#load "paket-files/build/fsharp/FAKE/modules/Octokit/Octokit.fsx"
open Octokit
//#load "paket-files/fsharp/FAKE/modules/Octokit/Octokit.fsx"
//open Octokit
Target "Release" (fun _ ->
let user =
match getBuildParam "github-user" with
| s when not (String.IsNullOrWhiteSpace s) -> s
| _ -> getUserInput "Username: "
let pw =
match getBuildParam "github-pw" with
| s when not (String.IsNullOrWhiteSpace s) -> s
| _ -> getUserPassword "Password: "
let remote =
Git.CommandHelper.getGitResult "" "remote -v"
|> Seq.filter (fun (s: string) -> s.EndsWith("(push)"))
|> Seq.tryFind (fun (s: string) -> s.Contains(gitOwner + "/" + gitName))
|> function None -> gitHome + "/" + gitName | Some (s: string) -> s.Split().[0]
Target.create "Release" (fun _ ->
// not fully converted from FAKE 4
StageAll ""
Git.Commit.Commit "" (sprintf "Bump version to %s" release.NugetVersion)
Branches.pushBranch "" remote (Information.getBranchName "")
//let user =
// match getBuildParam "github-user" with
// | s when not (String.isNullOrWhiteSpace s) -> s
// | _ -> getUserInput "Username: "
//let pw =
// match getBuildParam "github-pw" with
// | s when not (String.isNullOrWhiteSpace s) -> s
// | _ -> getUserPassword "Password: "
//let remote =
// Git.CommandHelper.getGitResult "" "remote -v"
// |> Seq.filter (fun (s: string) -> s.EndsWith("(push)"))
// |> Seq.tryFind (fun (s: string) -> s.Contains(gitOwner + "/" + gitName))
// |> function None -> gitHome + "/" + gitName | Some (s: string) -> s.Split().[0]
Branches.tag "" release.NugetVersion
Branches.pushTag "" remote release.NugetVersion
//Git.Staging.stageAll ""
//Git.Commit.exec "" (sprintf "Bump version to %s" release.NugetVersion)
//Git.Branches.pushBranch "" remote (Git.Information.getBranchName "")
// release on github
createClient user pw
|> createDraft gitOwner gitName release.NugetVersion (release.SemVer.PreRelease <> None) release.Notes
// TODO: |> uploadFile "PATH_TO_FILE"
|> releaseDraft
|> Async.RunSynchronously
//Git.Branches.tag "" release.NugetVersion
//Git.Branches.pushTag "" remote release.NugetVersion
//// release on github
//GitHub.createClient user pw
//|> createDraft gitOwner gitName release.NugetVersion (release.SemVer.PreRelease <> None) release.Notes
//// TODO: |> uploadFile "PATH_TO_FILE"
//|> releaseDraft
//|> Async.RunSynchronously
// using simplified FAKE 5 release for now
Git.Staging.stageAll ""
Git.Commit.exec "" (sprintf "Bump version to %s" release.NugetVersion)
Git.Branches.push ""
Git.Branches.tag "" release.NugetVersion
Git.Branches.pushTag "" "origin" release.NugetVersion
)
Target "BuildPackage" DoNothing
Target.create "BuildPackage" ignore
Target.create "GenerateDocs" ignore
// --------------------------------------------------------------------------------------
// Run all targets by default. Invoke 'build <Target>' to override
Target "All" DoNothing
Target.create "All" ignore
"AssemblyInfo"
"Clean"
==> "AssemblyInfo"
==> "Build"
==> "CopyBinaries"
==> "RunTests"
==> "GenerateReferenceDocs"
==> "GenerateDocs"
==> "NuGet"
==> "BuildPackage"
==> "All"
"GenerateHelp"
==> "GenerateReferenceDocs"
==> "GenerateDocs"
"RunTests" ?=> "CleanDocs"
"GenerateHelpDebug"
==> "KeepRunning"
"CleanDocs"
==>"Docs"
==> "ReferenceDocs"
==> "GenerateDocs"
"Clean"
==> "Release"
@ -370,4 +368,4 @@ Target "All" DoNothing
==> "PublishNuget"
==> "Release"
RunTargetOrDefault "All"
Target.runOrDefault "All"

24
build.proj Normal file
View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<Project>
<Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
<PropertyGroup>
<TargetFramework>net47</TargetFramework>
</PropertyGroup>
<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
<PropertyGroup>
<RepoRootDir>$([System.IO.Path]::GetFullPath("$(MSBuildThisFileDirectory)"))</RepoRootDir>
<BuildDependsOn>
</BuildDependsOn>
<CoreBuildDependsOn>
</CoreBuildDependsOn>
</PropertyGroup>
<Target Name="Build">
<Exec IgnoreStandardErrorWarningFormat="true" Command="fake build" WorkingDirectory="$(RepoRootDir)" />
</Target>
<Target Name="Pack">
</Target>
<Target Name="Test">
</Target>
<Target Name="VSTest" DependsOnTargets="Test" />
<Import Project=".paket\Paket.Restore.targets" />
</Project>

View File

@ -1,77 +1,15 @@
#!/usr/bin/env bash
# to properly set Travis permissions: https://stackoverflow.com/questions/33820638/travis-yml-gradlew-permission-denied
# git update-index --chmod=+x fake.sh
# git commit -m "permission access for travis"
set -eu
set -o pipefail
cd "$(dirname "$0")"
dotnet restore build.proj
PAKET_BOOTSTRAPPER_EXE=.paket/paket.bootstrapper.exe
PAKET_EXE=.paket/paket.exe
FAKE_EXE=packages/build/FAKE/tools/FAKE.exe
FSIARGS=""
FSIARGS2=""
OS=${OS:-"unknown"}
if [ "$OS" != "Windows_NT" ]
then
# Can't use FSIARGS="--fsiargs -d:MONO" in zsh, so split it up
# (Can't use arrays since dash can't handle them)
FSIARGS="--fsiargs"
FSIARGS2="-d:MONO"
if [ ! -f build.fsx ]; then
fake run init.fsx
fi
run() {
if [ "$OS" != "Windows_NT" ]
then
mono "$@"
else
"$@"
fi
}
yesno() {
# NOTE: Defaults to NO
read -p "$1 [y/N] " ynresult
case "$ynresult" in
[yY]*) true ;;
*) false ;;
esac
}
set +e
run $PAKET_BOOTSTRAPPER_EXE
bootstrapper_exitcode=$?
set -e
if [ "$OS" != "Windows_NT" ] &&
[ $bootstrapper_exitcode -ne 0 ] &&
[ $(certmgr -list -c Trust | grep X.509 | wc -l) -le 1 ] &&
[ $(certmgr -list -c -m Trust | grep X.509 | wc -l) -le 1 ]
then
echo "Your Mono installation has no trusted SSL root certificates set up."
echo "This may result in the Paket bootstrapper failing to download Paket"
echo "because Github's SSL certificate can't be verified. One way to fix"
echo "this issue would be to download the list of SSL root certificates"
echo "from the Mozilla project by running the following command:"
echo ""
echo " mozroots --import --sync"
echo ""
echo "This will import over 100 SSL root certificates into your Mono"
echo "certificate repository."
echo ""
if yesno "Run 'mozroots --import --sync' now?"
then
mozroots --import --sync
else
echo "Attempting to continue without running mozroots. This might fail."
fi
# Re-run bootstrapper whether or not the user ran mozroots, because maybe
# they fixed the problem in a separate terminal window.
run $PAKET_BOOTSTRAPPER_EXE
fi
run $PAKET_EXE restore
[ ! -e build.fsx ] && run $PAKET_EXE update
[ ! -e build.fsx ] && run $FAKE_EXE init.fsx
run $FAKE_EXE "$@" $FSIARGS $FSIARGS2 build.fsx
fake build $@

View File

@ -1,7 +1,7 @@
(*** 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/LogicalHacking.ExtensionDsLab"
#I "../../bin"
(**
LogicalHacking.ExtensionDsLab
@ -46,4 +46,22 @@ The API reference is automatically generated from Markdown comments in the libra
* [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/LogicalHacking.ExtensionDsLab/tree/master/docs/content
[gh]: https://github.com/fsprojects/LogicalHacking.ExtensionDsLab
[issues]: https://github.com/fsprojects/LogicalHacking.ExtensionDsLab/issues
[readme]: https://github.com/fsprojects/LogicalHacking.ExtensionDsLab/blob/master/README.md
[license]: https://github.com/fsprojects/LogicalHacking.ExtensionDsLab/blob/master/LICENSE
*)

View File

@ -1,7 +1,7 @@
(*** 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/LogicalHacking.ExtensionDsLab"
#I "../../bin"
(**
Introducing your project

View File

@ -1,145 +0,0 @@
// --------------------------------------------------------------------------------------
// Builds the documentation from `.fsx` and `.md` files in the 'docsrc/content' directory
// (the generated documentation is stored in the 'docsrc/output' directory)
// --------------------------------------------------------------------------------------
// Binaries that have XML documentation (in a corresponding generated XML file)
// Any binary output / copied to bin/projectName/projectName.dll will
// automatically be added as a binary to generate API docs for.
// for binaries output to root bin folder please add the filename only to the
// referenceBinaries list below in order to generate documentation for the binaries.
// (This is the original behaviour of ProjectScaffold prior to multi project support)
let referenceBinaries = []
// Web site location for the generated documentation
let website = "/LogicalHacking.ExtensionDsLab"
let githubLink = "https://git.logicalhacking.com/BrowserSecurity/ExtensionDsLab"
// Specify more information about your project
let info =
[ "project-name", "LogicalHacking.ExtensionDsLab"
"project-author", "Achim D. Brucker"
"project-summary", "A data science framework for analyzing Chrome browser extensions."
"project-github", githubLink
"project-nuget", "http://nuget.org/packages/LogicalHacking.ExtensionDsLab" ]
// --------------------------------------------------------------------------------------
// For typical project, no changes are needed below
// --------------------------------------------------------------------------------------
#load "../../packages/build/FSharp.Formatting/FSharp.Formatting.fsx"
#I "../../packages/build/FAKE/tools/"
#r "FakeLib.dll"
open Fake
open System.IO
open Fake.FileHelper
open FSharp.Literate
open FSharp.MetadataFormat
// When called from 'build.fsx', use the public project URL as <root>
// otherwise, use the current 'output' directory.
#if RELEASE
let root = website
#else
let root = "file://" + (__SOURCE_DIRECTORY__ @@ "../../docs")
#endif
// Paths with template/source/output locations
let bin = __SOURCE_DIRECTORY__ @@ "../../bin"
let content = __SOURCE_DIRECTORY__ @@ "../content"
let output = __SOURCE_DIRECTORY__ @@ "../../docs"
let files = __SOURCE_DIRECTORY__ @@ "../files"
let templates = __SOURCE_DIRECTORY__ @@ "templates"
let formatting = __SOURCE_DIRECTORY__ @@ "../../packages/build/FSharp.Formatting/"
let docTemplate = "docpage.cshtml"
// Where to look for *.csproj templates (in this order)
let layoutRootsAll = new System.Collections.Generic.Dictionary<string, string list>()
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 binaries =
let manuallyAdded =
referenceBinaries
|> List.map (fun b -> bin @@ b)
let conventionBased =
directoryInfo bin
|> subDirectories
|> Array.map (fun d -> d.FullName @@ (sprintf "%s.dll" d.Name))
|> List.ofArray
conventionBased @ manuallyAdded
let libDirs =
let conventionBasedbinDirs =
directoryInfo bin
|> subDirectories
|> Array.map (fun d -> d.FullName)
|> List.ofArray
conventionBasedbinDirs @ [bin]
// Build API reference from XML comments
let buildReference () =
CleanDir (output @@ "reference")
MetadataFormat.Generate
( binaries, output @@ "reference", layoutRootsAll.["en"],
parameters = ("root", root)::info,
sourceRepo = githubLink @@ "tree/master",
sourceFolder = __SOURCE_DIRECTORY__ @@ ".." @@ "..",
publicOnly = true,libDirs = libDirs )
// Build documentation from `fsx` and `md` files in `docs/content`
let buildDocumentation () =
// First, process files which are placed in the content root directory.
Literate.ProcessDirectory
( content, docTemplate, output, replacements = ("root", root)::info,
layoutRoots = layoutRootsAll.["en"],
generateAnchors = true,
processRecursive = false)
// And then process files which are placed in the sub directories
// (some sub directories might be for specific language).
let subdirs = Directory.EnumerateDirectories(content, "*", SearchOption.TopDirectoryOnly)
for dir in subdirs do
let dirname = (new DirectoryInfo(dir)).Name
let layoutRoots =
// Check whether this directory name is for specific language
let key = layoutRootsAll.Keys
|> Seq.tryFind (fun i -> i = dirname)
match key with
| Some lang -> layoutRootsAll.[lang]
| None -> layoutRootsAll.["en"] // "en" is the default language
Literate.ProcessDirectory
( dir, docTemplate, output @@ dirname, replacements = ("root", root)::info,
layoutRoots = layoutRoots,
generateAnchors = true )
// Generate
copyFiles()
#if HELP
buildDocumentation()
#endif
#if REFERENCE
buildReference()
#endif

26
fsc.props Normal file
View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- see https://github.com/Microsoft/visualfsharp/issues/3303 -->
<Project>
<!-- Type providers currently can't run inside the .NET Core 2.0 hosted compiler, see https://github.com/Microsoft/visualfsharp/pull/3658#issuecomment-334773415 -->
<PropertyGroup>
<IsWindows Condition="'$(OS)' == 'Windows_NT'">true</IsWindows>
<IsOSX Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::OSX)))' == 'true'">true</IsOSX>
<IsLinux Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Linux)))' == 'true'">true</IsLinux>
</PropertyGroup>
<PropertyGroup Condition="'$(IsWindows)' == 'true' AND Exists('C:\Program Files (x86)\Microsoft SDKs\F#\4.1\Framework\v4.0\fsc.exe')">
<FscToolPath>C:\Program Files (x86)\Microsoft SDKs\F#\4.1\Framework\v4.0</FscToolPath>
<FscToolExe>fsc.exe</FscToolExe>
</PropertyGroup>
<PropertyGroup Condition="'$(IsWindows)' == 'true' AND Exists('C:\Program Files (x86)\Microsoft SDKs\F#\10.1\Framework\v4.0\fsc.exe')">
<FscToolPath>C:\Program Files (x86)\Microsoft SDKs\F#\10.1\Framework\v4.0</FscToolPath>
<FscToolExe>fsc.exe</FscToolExe>
</PropertyGroup>
<PropertyGroup Condition="'$(IsOSX)' == 'true' AND Exists('/Library/Frameworks/Mono.framework/Versions/Current/Commands/fsharpc')">
<FscToolPath>/Library/Frameworks/Mono.framework/Versions/Current/Commands</FscToolPath>
<FscToolExe>fsharpc</FscToolExe>
</PropertyGroup>
<PropertyGroup Condition="'$(IsLinux)' == 'true' AND Exists('/usr/bin/fsharpc')">
<FscToolPath>/usr/bin</FscToolPath>
<FscToolExe>fsharpc</FscToolExe>
</PropertyGroup>
</Project>

View File

@ -1,28 +1,42 @@
framework: >= net45
framework: auto-detect
source https://nuget.org/api/v2
# The setting below means your libraries will assume a minimum target of .NET 4.5 + F# 4.0.
#
# To increase the minimum assumed .NET Framework, change the TargetFrameworkVersion in the .fsproj project files.
#
# To increase the minimum assumed F# version to F# 4.1, change to
# nuget FSharp.Core ~> 4.1.0 redirects: force
nuget FSharp.Core
nuget Argu
nuget FSharp.Core ~> 4.0.0.1 redirects: force
nuget Expecto
nuget Expecto.BenchmarkDotNet
nuget Expecto.FsCheck
nuget Expecto.VisualStudio.TestAdapter version_in_path: true
clitool dotnet-fake
group Formatting
source https://nuget.org/api/v2
source https://ci.appveyor.com/nuget/fsharp-formatting
nuget FSharp.Formatting prerelease
nuget FSharp.Formatting.CommandTool prerelease
group FakeBuild
source https://api.nuget.org/v3/index.json
storage: none
nuget Fake.Core.Target
nuget Fake.IO.FileSystem
nuget Fake.DotNet.Cli
nuget Fake.Tools.Git
nuget Fake.DotNet.MSBuild
nuget Fake.Core.ReleaseNotes
nuget Fake.DotNet.AssemblyInfoFile
nuget Fake.DotNet.Paket
nuget Fake.DotNet.Testing.Expecto
nuget Fake.DotNet.FSFormatting
nuget Fake.Api.GitHub
group Main
nuget FsLab
nuget Mysql.Data
nuget SQLProvider
group Build
source https://nuget.org/api/v2
nuget FAKE
nuget FSharp.Formatting
github fsharp/FAKE modules/Octokit/Octokit.fsx
group Test
source https://nuget.org/api/v2
nuget NUnit ~> 2
nuget NUnit.Runners ~> 2
nuget MySql.Data 6.10.7
nuget SQLProvider

View File

@ -1,565 +0,0 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Google.DataTable.Net.Wrapper</name>
</assembly>
<members>
<member name="T:Google.DataTable.Net.Wrapper.Cell">
<summary>
Each cell is an object containing an actual value of the column type,
plus an optional string-formatted version of the value that you provide.
<example>For example: a numeric column might be assigned the value 7
and the formatted value "seven".
If a formatted value is supplied, a chart will use the actual value for
calculations and rendering, but might show the formatted value where appropriate,
for example if the user hovers over a point. Each cell also has an optional
map of arbitrary name/value pairs.
</example>
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.IPropertyMap.AddProperty(Google.DataTable.Net.Wrapper.Property)">
<summary>
Adds a new property to the list of properties.
</summary>
<param name="p"></param>
<returns></returns>
</member>
<member name="M:Google.DataTable.Net.Wrapper.IPropertyMap.RemoveProperty(Google.DataTable.Net.Wrapper.Property)">
<summary>
Removes a property from the Property Map
</summary>
<param name="p"></param>
</member>
<member name="M:Google.DataTable.Net.Wrapper.IPropertyMap.RemoveProperty(System.Int32)">
<summary>
Removes a property from the Property Map by an index.
</summary>
<param name="index"></param>
</member>
<member name="P:Google.DataTable.Net.Wrapper.IPropertyMap.PropertyMap">
<summary>
Returns a list of currently assigned properties to the Cell
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Cell.#ctor">
<summary>
Default constructor
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Cell.#ctor(System.Object)">
<summary>
Constructor that accepts a value
</summary>
<param name="value"></param>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Cell.#ctor(System.Object,System.String)">
<summary>
Constructor that accepts a value and formatted properties.
</summary>
<param name="value"></param>
<param name="formatted"></param>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Cell.AddProperty(Google.DataTable.Net.Wrapper.Property)">
<summary>
Adds a new property to the list of properties.
</summary>
<param name="p"></param>
<returns></returns>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Cell.RemoveProperty(Google.DataTable.Net.Wrapper.Property)">
<summary>
Removes a property from the Property Map
</summary>
<param name="p"></param>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Cell.RemoveProperty(System.Int32)">
<summary>
Removes a property from the Property Map by an index.
</summary>
<param name="index"></param>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Cell.GetFormattedValue(Google.DataTable.Net.Wrapper.ColumnType,System.Object)">
<summary>
Returns the value formated depending on the object type.
</summary>
<param name="columnType"></param>
<param name="value"></param>
<returns></returns>
</member>
<member name="P:Google.DataTable.Net.Wrapper.Cell.ColumnType">
<summary>
Column type represents the type of value that the current cell holds.
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.Cell.Value">
<summary>
[Optional] The cell value. The data ColumnType should match the column data ColumnType.
If null, the whole object should be empty and have neither v nor f properties.
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.Cell.Formatted">
<summary>
[Optional] A string version of the v value, formatted for display.
The values should match, so if you specify Date(2008, 0, 1) for v,
you should specify "January 1, 2008" or some such string for this property.
This value is not checked against the v value. The visualization will not use this value
for calculation, only as a label for display. If omitted, a string version of v will be used.
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.Cell.PropertyMap">
<summary>
Returns a list of currently assigned properties to the Cell
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Column.GetJson(System.IO.StreamWriter)">
<summary>
Returns the Json string as expected by the Google Api
</summary>
<returns></returns>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Column.AddProperty(Google.DataTable.Net.Wrapper.Property)">
<summary>
Adds a new property to the list of properties.
</summary>
<param name="p"></param>
<returns></returns>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Column.RemoveProperty(Google.DataTable.Net.Wrapper.Property)">
<summary>
Removes a property from the Property Map
</summary>
<param name="p"></param>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Column.RemoveProperty(System.Int32)">
<summary>
Removes a property from the Property Map by an index.
</summary>
<param name="index"></param>
</member>
<member name="P:Google.DataTable.Net.Wrapper.Column.Id">
<summary>
id [Optional] String ID of the column. Must be unique in the table.
Use basic alphanumeric characters, so the host page does not require
fancy escapes to access the column in JavaScript. Be careful not to
choose a JavaScript keyword. Example: id:'col_1'
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.Column.Label">
<summary>
label [Optional] String value that some visualizations display for this column.
<example>Example: label:'Height'</example>
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.Column.ColumnType">
<summary>
ColumnType [Required] Data ColumnType of the data in the column.
Supports the following string values (examples include the v: property, described later):
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.Column.Role">
<summary>
A column role describes the purpose of the data in that column:
for example, a column might hold data describing tooltip text,
data point annotations, or uncertainty indicators.
</summary>
<remarks>
More info about the role can be read here
https://developers.google.com/chart/interactive/docs/roles
</remarks>
</member>
<member name="P:Google.DataTable.Net.Wrapper.Column.Pattern">
<summary>
pattern [Optional] String pattern that was used by a data source
to format numeric, date, or time column values.
This is for reference only; you probably won't need to read
the pattern, and it isn't required to exist.
The Google Visualization client does not use this value
(it reads the cell's formatted value).
If the DataTable has come from a data source in response to a query
with a format clause, the pattern you specified in that clause
will probably be returned in this value.
The recommended pattern standards are the ICU DecimalFormat and SimpleDateFormat.
<remarks>
<see cref="!:http://icu-project.org/apiref/icu4j/com/ibm/icu/text/SimpleDateFormat.html"/>
<see cref="!:http://icu-project.org/apiref/icu4j/com/ibm/icu/text/DecimalFormat.html"/>
</remarks>
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.Column.PropertyMap">
<summary>
p [Optional] An object that is a map of custom values applied to the cell.
These values can be of any JavaScript ColumnType.
If your visualization supports any cell-level properties,
it will describe them; otherwise, this property will be ignored.
<example>
Example: p:{style: 'border: 1px solid green;'}.
</example>
</summary>
<remarks>
Returns a list of currently assigned properties to the Cell
</remarks>
</member>
<member name="P:Google.DataTable.Net.Wrapper.ColumnRole.Annotation">
<summary>
Text to display on the chart near the associated data point.
The text displays without any user interaction.
Annotations and annotation text can be assigned to both
data points and categories (axis labels).
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.ColumnRole.AnnotationText">
<summary>
Extended text to display when the user hovers
over the associated annotation
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.ColumnRole.Certainty">
<summary>
ndicates whether a data point is certain or not.
How this is displayed depends on the chart type—for
example, it might be indicated by dashed lines or a striped fill.
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.ColumnRole.Emphasis">
<summary>
Emphasizes specified chart data points. Displayed as a
thick line and/or large point.
For line and area charts, the segment
between two data points is emphasized if and only if
both data points are emphasized.
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.ColumnRole.Interval">
<summary>
ndicates potential data range for a specific point.
Intervals are usually displayed as I-bar style range indicators.
Interval columns are numeric columns; add interval columns in
pairs, marking the low and high value of the bar. Interval
values should be added in increasing value, from left to right.
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.ColumnRole.Scope">
<summary>
Indicates whether a point is in or out of scope.
If a point is out of scope, it is visually de-emphasized.
For line and area charts, the segment between two data points
is in scope if either endpoint is in scope.
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.ColumnRole.Tooltip">
<summary>
Text to display when the user hovers over the data point
associated with this row.
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.ColumnRole.Domain">
<summary>
You should not need to assign this role explicitly unless designing
a multi-domain chart (shown here); the basic
format of the data table enables the charting engine to infer which
columns are domain columns. However, you should be aware of
which columns are domain columns so that you know which other
columns can modify it.
Domain columns specify labels along the major axis of the chart.
Multiple domain columns can sometimes be used to support multiple
scales within the same chart.
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.ColumnRole.Data">
<summary>
You should not need to assign this role explicitly; the basic
format of the data table enables the charting engine to
infer which columns are domain columns. However, you sould be
aware of which columns are data columns so that you know which
other columns can modify it.
Data role columns specify series data to render in the chart.
For most charts, one column = one series, but this can vary
by chart type (for example, scatter charts require two data
columns for the first series, and an additional one for each
additional series; candlestick charts require four data columns
for each series).
</summary>
</member>
<member name="T:Google.DataTable.Net.Wrapper.Extension.EnumerableExtension">
<summary>
Extension class for lists.
</summary>
</member>
<!-- Badly formed XML comment ignored for member "M:Google.DataTable.Net.Wrapper.Extension.EnumerableExtension.ToGoogleDataTable``1(System.Collections.Generic.IEnumerable{``0})" -->
<member name="M:Google.DataTable.Net.Wrapper.Extension.EnumerableExtension.NewColumn``1(Google.DataTable.Net.Wrapper.Extension.DataTableConfig{``0},Google.DataTable.Net.Wrapper.Column,System.Func{``0,System.Object},System.Func{``0,System.String})">
<summary>
Creates a new column
</summary>
<typeparam name="T"></typeparam>
<param name="source"></param>
<param name="col"></param>
<param name="rowValue"></param>
<param name="rowFormat"></param>
<returns></returns>
</member>
<member name="T:Google.DataTable.Net.Wrapper.Extension.SystemDataTableExtension">
<summary>
Class that implements an extension for a System.Data.DataTable
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Extension.SystemDataTableExtension.ToGoogleDataTable(System.Data.DataTable)">
<summary>
Converts a System.Data.DataTable into a Google.DataTable.Net.Wrapper.DataTable
</summary>
<param name="source"></param>
<returns></returns>
</member>
<member name="T:Google.DataTable.Net.Wrapper.DataTable">
<summary>
A DataTable represents a basic two-dimensional table.
All data (cells) in each column must have the same data type.
Each cell in the table holds a value.
<remarks>
For more information about the usage of the serialized DataTable please visit:
https://developers.google.com/chart/interactive/docs/reference#DataTable
</remarks>
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.DataTable.#ctor">
<summary>
Default constructor
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.DataTable.NewRow">
<summary>
Creates a new DataRow with the same schema as the table.
</summary>
<returns>A new row with the same schema as the table</returns>
</member>
<member name="M:Google.DataTable.Net.Wrapper.DataTable.AddRow(Google.DataTable.Net.Wrapper.Row)">
<summary>
Adds a row to the list of rows
attached to the current DataTable
</summary>
<param name="row">a row created with NewRow() method</param>
<returns></returns>
</member>
<member name="M:Google.DataTable.Net.Wrapper.DataTable.AddColumn(Google.DataTable.Net.Wrapper.Column)">
<summary>
Adds a new column to the current DataTable
</summary>
<param name="column"></param>
<returns></returns>
</member>
<member name="M:Google.DataTable.Net.Wrapper.DataTable.GetJson">
<summary>
Returns a Json string compatible with the Google DataTable notation.
</summary>
<returns></returns>
</member>
<member name="M:Google.DataTable.Net.Wrapper.DataTable.JsonizeRows(System.IO.StreamWriter)">
<summary>
Serializes the Rows.
<remarks>
The choice to have inline both the row and the cell
serialization is purely for the performance reasons.
</remarks>
</summary>
<param name="sw"></param>
</member>
<member name="M:Google.DataTable.Net.Wrapper.DataTable.JsonizeColumns(System.IO.StreamWriter)">
<summary>
Serializes the Columns into the Json format
</summary>
<returns></returns>
</member>
<member name="P:Google.DataTable.Net.Wrapper.DataTable.Columns">
<summary>
Returns a list of already assigned columns to the current DataTable
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.DataTable.Rows">
<summary>
Returns a list of already assigned rows to the current DataTable
</summary>
</member>
<member name="T:Google.DataTable.Net.Wrapper.ColumnType">
<summary>
ColumnType [Required] Data ColumnType of the data in the column. Supports the following string values (examples include the v: property, described later):
'boolean' - JavaScript boolean value ('true' or 'false'). Example value: v:'true'
'number' - JavaScript number value. Example values: v:7 , v:3.14, v:-55
'string' - JavaScript string value. Example value: v:'hello'
'date' - JavaScript Date object (zero-based month), with the time truncated. Example value: v:new Date(2008, 0, 15)
'datetime' - JavaScript Date object including the time. Example value: v:new Date(2008, 0, 15, 14, 30, 45)
'timeofday' - Array of three numbers and an optional fourth, representing hour (0 indicates midnight), minute, second, and optional millisecond. Example values: v:[8, 15, 0], v: [6, 12, 1, 144]
</summary>
</member>
<member name="F:Google.DataTable.Net.Wrapper.ColumnType.String">
<summary>
JavaScript string value. Example value: v:'hello'
</summary>
</member>
<member name="F:Google.DataTable.Net.Wrapper.ColumnType.Number">
<summary>
JavaScript number value. Example values: v:7 , v:3.14, v:-55
</summary>
</member>
<member name="F:Google.DataTable.Net.Wrapper.ColumnType.Boolean">
<summary>
JavaScript boolean value ('true' or 'false'). Example value: v:'true'
</summary>
</member>
<member name="F:Google.DataTable.Net.Wrapper.ColumnType.Date">
<summary>
JavaScript Date object (zero-based month), with the time truncated. Example value: v:new Date(2008, 0, 15)
</summary>
</member>
<member name="F:Google.DataTable.Net.Wrapper.ColumnType.Datetime">
<summary>
JavaScript Date object including the time. Example value: v:new Date(2008, 0, 15, 14, 30, 45)
</summary>
</member>
<member name="F:Google.DataTable.Net.Wrapper.ColumnType.Timeofday">
<summary>
Array of three numbers and an optional fourth, representing hour (0 indicates midnight), minute, second, and optional millisecond. Example values: v:[8, 15, 0], v: [6, 12, 1, 144]
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Common.Helper.DoubleQuoteString2(System.String)">
<summary>
Wraps the string around double quotes.
</summary>
<param name="value"></param>
<returns></returns>
</member>
<member name="T:Google.DataTable.Net.Wrapper.Extension.DataTableConfig`1">
<summary>
Helper class for the generic lists.
</summary>
<typeparam name="T"></typeparam>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Extension.DataTableConfig`1.AddColumn(Google.DataTable.Net.Wrapper.Column,System.Func{`0,Google.DataTable.Net.Wrapper.Cell})">
<summary>
Adds a new Column to a Google.DataTable.Net.Wrapper.DataTable
</summary>
<param name="col"></param>
<param name="cellFunction"></param>
<returns></returns>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Extension.DataTableConfig`1.Build">
<summary>
Build a new Google.DataTable.Net.Wrapper.DataTable()
</summary>
<returns></returns>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Extension.DataTableConfig`1.ToDataTable``1(System.Collections.Generic.List{``0})">
<summary>
Convert a List{T} to a DataTable.
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Extension.DataTableConfig`1.IsNullable(System.Type)">
<summary>
Determine of specified type is nullable
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Extension.DataTableConfig`1.GetCoreType(System.Type)">
<summary>
Return underlying type if type is Nullable otherwise return the type
</summary>
</member>
<member name="T:Google.DataTable.Net.Wrapper.Property">
<summary>
Reserved for future usages.
P values in reality should be a name -> value map
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Property.#ctor">
<summary>
Default constructor
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Property.#ctor(System.String,System.String)">
<summary>
Constructor that has as input name and value
</summary>
<param name="name"></param>
<param name="value"></param>
</member>
<member name="T:Google.DataTable.Net.Wrapper.Row">
<summary>
A row is an array of cells,
plus an optional map of arbitrary name/value pairs that you can assign.
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Row.#ctor">
<summary>
Internal constructor as we don't allow the direct generation
of the row due to the fact that the table Attribute is set
internally
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Row.AddCellRange(Google.DataTable.Net.Wrapper.Cell[])">
<summary>
Adds a range of Cell objects
</summary>
<param name="cells"></param>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Row.AddCell(Google.DataTable.Net.Wrapper.Cell)">
<summary>
Adds a single cell to the Row
</summary>
<param name="cell"></param>
<returns></returns>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Row.AddProperty(Google.DataTable.Net.Wrapper.Property)">
<summary>
Adds a new property to the list of properties.
</summary>
<param name="p"></param>
<returns></returns>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Row.RemoveProperty(Google.DataTable.Net.Wrapper.Property)">
<summary>
Removes a property from the Property Map
</summary>
<param name="p"></param>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Row.RemoveProperty(System.Int32)">
<summary>
Removes a property from the Property Map by an index.
</summary>
<param name="index"></param>
</member>
<member name="P:Google.DataTable.Net.Wrapper.Row.ColumnTypes">
<summary>
A reference to the available column types of the table.
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.Row.Cells">
<summary>
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.Row.PropertyMap">
<summary>
Returns a list of currently assigned properties to the Row
</summary>
</member>
<member name="T:Google.DataTable.Net.Wrapper.SystemDataTableConverter">
<summary>
Responsible for converting the System.Data.DataTable into
Google.DataTable.Net.Wrapper.DataTable.
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.SystemDataTableConverter.Convert(System.Data.DataTable)">
<summary>
Responsible for converting the System.Data.DataTable into
Google.DataTable.Net.Wrapper.DataTable.
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.SystemDataTableConverter.GetColumnTypeFromType(System.Type)">
<summary>
For more info about System.Data.DataColumn Types
http://msdn.microsoft.com/en-us/library/system.data.datacolumn.datatype.aspx
</summary>
<param name="t"></param>
<returns></returns>
</member>
</members>
</doc>

View File

@ -1,284 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>8a2ebfc4-14ce-4d77-81de-1fd7372c3382</ProjectGuid>
<OutputType>Library</OutputType>
<TargetFrameworks>net47</TargetFrameworks>
<RootNamespace>LogicalHacking.ExtensionDsLab</RootNamespace>
<AssemblyName>LogicalHacking.ExtensionDsLab</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<Name>LogicalHacking.ExtensionDsLab</Name>
<TargetFrameworkProfile />
<DocumentationFile>.\bin\$(Configuration)\$(AssemblyName).xml</DocumentationFile>
<OutputType>Library</OutputType>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<!-- Optional: Declare that the Repository URL can be published to NuSpec -->
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<!-- Optional: Embed source files that are not tracked by the source control manager to the PDB -->
<EmbedUntrackedSources>true</EmbedUntrackedSources>
<!-- Optional: Include PDB in the built .nupkg -->
<AllowedOutputExtensionsInPackageBuildOutputFolder>$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb</AllowedOutputExtensionsInPackageBuildOutputFolder>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<Tailcalls>false</Tailcalls>
<OutputPath>.\bin\Debug</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<WarningLevel>3</WarningLevel>
<OtherFlags>--warnon:1182</OtherFlags>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<Tailcalls>true</Tailcalls>
<OutputPath>.\bin\Release</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<WarningLevel>3</WarningLevel>
<OtherFlags>--warnon:1182</OtherFlags>
</PropertyGroup>
<PropertyGroup>
<MinimumVisualStudioVersion Condition="'$(MinimumVisualStudioVersion)' == ''">11</MinimumVisualStudioVersion>
</PropertyGroup>
<Choose>
<When Condition="'$(VisualStudioVersion)' == '11.0'">
<PropertyGroup Condition="Exists('$(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets')">
<FSharpTargetsPath>$(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets</FSharpTargetsPath>
</PropertyGroup>
</When>
<Otherwise>
<PropertyGroup Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets')">
<FSharpTargetsPath>$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets</FSharpTargetsPath>
</PropertyGroup>
</Otherwise>
</Choose>
<Import Project="$(FSharpTargetsPath)" Condition="Exists('$(FSharpTargetsPath)')" />
<Import Project="..\..\.paket\paket.targets" />
<ItemGroup>
<Compile Include="SqlConnector.fs" />
<None Include="Scripts\Script.fsx" />
<None Include="paket.references" />
<None Include="paket.template" />
<Content Include="Google.DataTable.Net.Wrapper.XML">
<Paket>True</Paket>
</Content>
<Content Include="app.config" />
</ItemGroup>
<ItemGroup>
<Reference Include="mscorlib" />
<Reference Include="System" />
<Reference Include="System.Core" />/
<Reference Include="System.Numerics" /></ItemGroup>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="Deedle">
<HintPath>..\..\packages\Deedle\lib\net40\Deedle.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="Deedle.RProvider.Plugin">
<HintPath>..\..\packages\Deedle.RPlugin\lib\net40\Deedle.RProvider.Plugin.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="DynamicInterop">
<HintPath>..\..\packages\DynamicInterop\lib\net40\DynamicInterop.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="FSharp.Charting">
<HintPath>..\..\packages\FSharp.Charting\lib\net40\FSharp.Charting.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="FSharp.Core">
<HintPath>..\..\packages\FSharp.Core\lib\net40\FSharp.Core.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="System.Xml.Linq">
<Paket>True</Paket>
</Reference>
<Reference Include="FSharp.Data">
<HintPath>..\..\packages\FSharp.Data\lib\net40\FSharp.Data.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="Google.DataTable.Net.Wrapper">
<HintPath>..\..\packages\Google.DataTable.Net.Wrapper\lib\Google.DataTable.Net.Wrapper.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="MathNet.Numerics">
<HintPath>..\..\packages\MathNet.Numerics\lib\net40\MathNet.Numerics.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="MathNet.Numerics.FSharp">
<HintPath>..\..\packages\MathNet.Numerics.FSharp\lib\net40\MathNet.Numerics.FSharp.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="Newtonsoft.Json">
<HintPath>..\..\packages\Newtonsoft.Json\lib\net45\Newtonsoft.Json.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="RDotNet">
<HintPath>..\..\packages\R.NET.Community\lib\net40\RDotNet.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
<Reference Include="RDotNet.NativeLibrary">
<HintPath>..\..\packages\R.NET.Community\lib\net40\RDotNet.NativeLibrary.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="RDotNet.FSharp">
<HintPath>..\..\packages\R.NET.Community.FSharp\lib\net40\RDotNet.FSharp.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="RProvider">
<HintPath>..\..\packages\RProvider\lib\net40\RProvider.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
<Reference Include="RProvider.Runtime">
<HintPath>..\..\packages\RProvider\lib\net40\RProvider.Runtime.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="FSharp.Data.SqlProvider">
<HintPath>..\..\packages\SQLProvider\lib\FSharp.Data.SqlProvider.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
<Reference Include="MySql.Data">
<HintPath>..\..\packages\MySql.Data\lib\net45\MySql.Data.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="Suave">
<HintPath>..\..\packages\Suave\lib\net40\Suave.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="XPlot.GoogleCharts">
<HintPath>..\..\packages\XPlot.GoogleCharts\lib\net45\XPlot.GoogleCharts.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="XPlot.GoogleCharts.Deedle">
<HintPath>..\..\packages\XPlot.GoogleCharts.Deedle\lib\net45\XPlot.GoogleCharts.Deedle.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="XPlot.Plotly">
<HintPath>..\..\packages\XPlot.Plotly\lib\net45\XPlot.Plotly.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
</Project>
<Import Project="..\..\fsc.props" />
<Import Project="..\..\.paket\Paket.Restore.targets" />
</Project>

View File

@ -1,17 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
<add name="ProductionExtensionDB" providerName="FSharp.Data.Sql.SqlTypeProvider"
connectionString="Server=dbknecht.mherzberg.de;Database=extensions;User=achim;Password=kNFuBiEJVu5DDKZ5"/>
</connectionStrings>
<runtime>
<assemblyBinding
xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<Paket>True</Paket>
<assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="4.4.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@ -1,3 +1,5 @@
FSharp.Core
FsLab
SQLProvider
Mysql.Data
SQLProvider

View File

@ -1,4 +1,5 @@
type project
type file
id LogicalHacking.ExtensionDsLab
title
LogicalHacking.ExtensionDsLab
owners
@ -8,11 +9,13 @@ authors
projectUrl
https://git.logicalhacking.com/BrowserSecurity/ExtensionDsLab
iconUrl
https://git.logicalhacking.com/BrowserSecurity/ExtensionDsLab/master/docs/files/img/logo.png
https://raw.githubusercontent.com/BrowserSecurity/ExtensionDsLab/master/docs/files/img/logo.png
licenseUrl
https://git.logicalhacking.com/BrowserSecurity/ExtensionDsLab/raw/master/LICENSE
https://git.logicalhacking.com/BrowserSecurity/ExtensionDsLab/blob/master/LICENSE
requireLicenseAcceptance
false
language
F#
copyright
Copyright 2017
tags
@ -22,4 +25,5 @@ summary
description
A data science framework for analyzing Chrome browser extensions.
files
../../bin/LogicalHacking.ExtensionDsLab ==> lib

View File

@ -0,0 +1,245 @@
namespace LogicalHacking.ExtensionDsLab.Tests
open FsCheck
open System
module GeneratorsCode =
//https://msdn.microsoft.com/en-us/library/system.char.iswhitespace(v=vs.110).aspx
let spaceSeparator = [
'\u0020'
'\u1680'
'\u2000'
'\u2001'
'\u2002'
'\u2003'
'\u2004'
'\u2005'
'\u2006'
'\u2007'
'\u2008'
'\u2009'
'\u200A'
'\u202F'
'\u205F'
'\u3000'
]
let lineSeparator = ['\u2028']
let paragraphSeparator = ['\u2029']
let miscWhitespace = [
'\u0009'
'\u000A'
'\u000B'
'\u000C'
'\u000D'
'\u0085'
'\u00A0'
]
let whiteSpace =
List.concat [spaceSeparator; lineSeparator; paragraphSeparator; miscWhitespace]
let nonDigitalString() =
gen {
let! a = Arb.generate<NonEmptyString>
return! Gen.elements [a.ToString()]
}
|> Gen.filter(fun x ->
let (isInt, _) =Int32.TryParse x
not isInt)
let whitespaceString() =
let length =
Gen.sample 1 1 <| Gen.choose (1, 30)
|> List.head
|> int
Gen.arrayOfLength length <| Gen.elements whiteSpace
|> Gen.map (fun x -> new string(x))
let nonEmptyNonAllWhitespaceString() =
gen {
return!
Arb.generate<NonEmptyString>
}
|> Gen.filter (fun x ->
let charA = x.ToString().ToCharArray()
Array.fold (fun s t ->
if List.exists (fun x' -> x' = t) whiteSpace |> not then true
else s
) false charA )
|> Gen.map (fun x -> x.ToString())
let genNonEmptyNonAllWhitespaceStringList() =
let positiveInt = Arb.generate<PositiveInt>
let length =
Gen.sample 30 1 positiveInt
|> List.head
|> int
Gen.listOfLength length <| nonEmptyNonAllWhitespaceString()
let genDigitsInWhiteSpace () =
gen {
let! frontWhitespace = whitespaceString()
let! digits = Arb.generate<NonNegativeInt>
let! endWhitespace = whitespaceString()
return sprintf "%s%s%s" frontWhitespace (digits.ToString()) endWhitespace
}
let validDigits digits length =
if digits.ToString().Length = length then
digits.ToString()
elif digits.ToString().Length < length then
digits.ToString().PadLeft(length, '0')
else
digits.ToString().Substring(0, length)
let invalidDigits digits length =
if digits.ToString().Length = length then
sprintf "0%s" <| digits.ToString()
else
digits.ToString()
let genDigitsOfLengthInWhiteSpace length =
gen {
let! frontWhitespace = whitespaceString()
let! digits = Arb.generate<NonNegativeInt>
let! endWhitespace = whitespaceString()
return sprintf "%s%s%s" frontWhitespace (validDigits digits length) endWhitespace |> Some
}
|> Gen.filter Option.isSome
|> Gen.map (fun x -> x.Value)
let inputZip5Plus4() =
gen {
let! digits = Arb.generate<NonNegativeInt>
return validDigits digits 9
}
let genUsPhone7() =
gen {
let! digitsExchange = Arb.generate<NonNegativeInt>
let exchange = validDigits digitsExchange 3
let! digitsSuffix = Arb.generate<NonNegativeInt>
let suffix = validDigits digitsSuffix 4
let! divide = Gen.elements["";"-";" -";" -";"- ";"- ";" ";" ";]
let! start = Gen.elements["";" ";]
let! after = Gen.elements["";" ";]
return sprintf "%s%s%s%s%s" start exchange divide suffix after
}
let genUsPhone10() =
gen {
let! digitsAreaCode = Arb.generate<NonNegativeInt>
let areaCode = validDigits digitsAreaCode 3
let! usPhone7 = genUsPhone7()
let! start = Gen.elements["";" ";"(";"( ";"( ";" (";" (";" ( ";]
let! divide = Gen.elements["";" ";")";" )";" )";") ";") ";" ) ";]
return sprintf "%s%s%s%s" start areaCode divide usPhone7
}
let genUsPhone() =
gen {
let! usPhone7 = genUsPhone7()
let! usPhone10 = genUsPhone10()
return! Gen.elements [usPhone7; usPhone10]
}
let genUsPhoneList() =
Gen.listOf <| genUsPhone()
let genOtherPhone() =
//other phone accespts any digit at least 5 and no more than 14 long
//to do: fix to reject international prefixes
gen {
let! length = Gen.choose (5, 14)
return! genDigitsOfLengthInWhiteSpace length
}
let genOtherPhoneList() =
Gen.listOf <| genOtherPhone()
let genPhoneList() =
gen {
let! usPhone = genUsPhoneList()
let! otherPhone = genOtherPhoneList()
return
usPhone
|> List.append otherPhone
|> List.sortDescending
}
let genCallingCode() =
let callingCode digits length =
let x = validDigits digits length
if x.StartsWith("0") then
x.Replace("0", "1")
else x
|> UInt16.Parse
gen {
let! digits = Arb.generate<NonNegativeInt>
let! callingCode = Gen.elements [callingCode digits 4 |> Some; callingCode digits 3 |> Some; callingCode digits 2 |> Some; callingCode digits 1 |> Some; None]
return callingCode
}
let genPhoneNumber() =
gen {
let! callingCodeRaw = genCallingCode()
let callingCode = callingCodeRaw |> Option.map (fun x -> x.ToString())
let! usPhone = genUsPhone()
let! otherPhone = genOtherPhone()
let! phone = Gen.elements[usPhone; otherPhone]
let! extensionRaw = Arb.generate<NonNegativeInt>
let! extension = Gen.elements [extensionRaw.ToString() |> Some; None]
let! whiteSpace1Raw = whitespaceString()
let! whiteSpace2Raw = whitespaceString()
let! whiteSpace3Raw = whitespaceString()
let! whiteSpace4Raw = whitespaceString()
let! whiteSpace5Raw = whitespaceString()
let! whiteSpace1 = Gen.elements [whiteSpace1Raw |> Some; None]
let! whiteSpace2 = Gen.elements [whiteSpace2Raw |> Some; None]
let! whiteSpace3 = Gen.elements [whiteSpace3Raw |> Some; None]
let! whiteSpace4 = Gen.elements [whiteSpace4Raw |> Some; None]
let! whiteSpace5 = Gen.elements [whiteSpace5Raw |> Some; None]
let symbolValueWhitespace symbol value whiteSpace =
sprintf "%s%s%s%s" symbol (defaultArg whiteSpace String.Empty) value (defaultArg whiteSpace String.Empty)
let phoneNumber =
sprintf "%s%s%s%s%s%s"
(defaultArg whiteSpace1 String.Empty)
(match callingCode with | Some x -> symbolValueWhitespace "+" x whiteSpace2 | None -> String.Empty)
phone
(defaultArg whiteSpace3 String.Empty)
(match extension with | Some x -> symbolValueWhitespace "X" x whiteSpace4 | None -> String.Empty)
(defaultArg whiteSpace5 String.Empty)
return (callingCode, phone, extension, phoneNumber)
}
let genUri() =
gen {
let! uriRaw = nonEmptyNonAllWhitespaceString()
let! uri = Gen.elements [" http://" + uriRaw; " https://" + uriRaw; " ftp://" + uriRaw; " ftps://" + uriRaw;]
return uri
}
type Generators =
static member NonEmptyStringList() =
{new Arbitrary<string list>() with
override __.Generator =
GeneratorsCode.genNonEmptyNonAllWhitespaceStringList()
}

View File

@ -1,565 +0,0 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Google.DataTable.Net.Wrapper</name>
</assembly>
<members>
<member name="T:Google.DataTable.Net.Wrapper.Cell">
<summary>
Each cell is an object containing an actual value of the column type,
plus an optional string-formatted version of the value that you provide.
<example>For example: a numeric column might be assigned the value 7
and the formatted value "seven".
If a formatted value is supplied, a chart will use the actual value for
calculations and rendering, but might show the formatted value where appropriate,
for example if the user hovers over a point. Each cell also has an optional
map of arbitrary name/value pairs.
</example>
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.IPropertyMap.AddProperty(Google.DataTable.Net.Wrapper.Property)">
<summary>
Adds a new property to the list of properties.
</summary>
<param name="p"></param>
<returns></returns>
</member>
<member name="M:Google.DataTable.Net.Wrapper.IPropertyMap.RemoveProperty(Google.DataTable.Net.Wrapper.Property)">
<summary>
Removes a property from the Property Map
</summary>
<param name="p"></param>
</member>
<member name="M:Google.DataTable.Net.Wrapper.IPropertyMap.RemoveProperty(System.Int32)">
<summary>
Removes a property from the Property Map by an index.
</summary>
<param name="index"></param>
</member>
<member name="P:Google.DataTable.Net.Wrapper.IPropertyMap.PropertyMap">
<summary>
Returns a list of currently assigned properties to the Cell
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Cell.#ctor">
<summary>
Default constructor
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Cell.#ctor(System.Object)">
<summary>
Constructor that accepts a value
</summary>
<param name="value"></param>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Cell.#ctor(System.Object,System.String)">
<summary>
Constructor that accepts a value and formatted properties.
</summary>
<param name="value"></param>
<param name="formatted"></param>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Cell.AddProperty(Google.DataTable.Net.Wrapper.Property)">
<summary>
Adds a new property to the list of properties.
</summary>
<param name="p"></param>
<returns></returns>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Cell.RemoveProperty(Google.DataTable.Net.Wrapper.Property)">
<summary>
Removes a property from the Property Map
</summary>
<param name="p"></param>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Cell.RemoveProperty(System.Int32)">
<summary>
Removes a property from the Property Map by an index.
</summary>
<param name="index"></param>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Cell.GetFormattedValue(Google.DataTable.Net.Wrapper.ColumnType,System.Object)">
<summary>
Returns the value formated depending on the object type.
</summary>
<param name="columnType"></param>
<param name="value"></param>
<returns></returns>
</member>
<member name="P:Google.DataTable.Net.Wrapper.Cell.ColumnType">
<summary>
Column type represents the type of value that the current cell holds.
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.Cell.Value">
<summary>
[Optional] The cell value. The data ColumnType should match the column data ColumnType.
If null, the whole object should be empty and have neither v nor f properties.
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.Cell.Formatted">
<summary>
[Optional] A string version of the v value, formatted for display.
The values should match, so if you specify Date(2008, 0, 1) for v,
you should specify "January 1, 2008" or some such string for this property.
This value is not checked against the v value. The visualization will not use this value
for calculation, only as a label for display. If omitted, a string version of v will be used.
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.Cell.PropertyMap">
<summary>
Returns a list of currently assigned properties to the Cell
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Column.GetJson(System.IO.StreamWriter)">
<summary>
Returns the Json string as expected by the Google Api
</summary>
<returns></returns>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Column.AddProperty(Google.DataTable.Net.Wrapper.Property)">
<summary>
Adds a new property to the list of properties.
</summary>
<param name="p"></param>
<returns></returns>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Column.RemoveProperty(Google.DataTable.Net.Wrapper.Property)">
<summary>
Removes a property from the Property Map
</summary>
<param name="p"></param>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Column.RemoveProperty(System.Int32)">
<summary>
Removes a property from the Property Map by an index.
</summary>
<param name="index"></param>
</member>
<member name="P:Google.DataTable.Net.Wrapper.Column.Id">
<summary>
id [Optional] String ID of the column. Must be unique in the table.
Use basic alphanumeric characters, so the host page does not require
fancy escapes to access the column in JavaScript. Be careful not to
choose a JavaScript keyword. Example: id:'col_1'
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.Column.Label">
<summary>
label [Optional] String value that some visualizations display for this column.
<example>Example: label:'Height'</example>
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.Column.ColumnType">
<summary>
ColumnType [Required] Data ColumnType of the data in the column.
Supports the following string values (examples include the v: property, described later):
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.Column.Role">
<summary>
A column role describes the purpose of the data in that column:
for example, a column might hold data describing tooltip text,
data point annotations, or uncertainty indicators.
</summary>
<remarks>
More info about the role can be read here
https://developers.google.com/chart/interactive/docs/roles
</remarks>
</member>
<member name="P:Google.DataTable.Net.Wrapper.Column.Pattern">
<summary>
pattern [Optional] String pattern that was used by a data source
to format numeric, date, or time column values.
This is for reference only; you probably won't need to read
the pattern, and it isn't required to exist.
The Google Visualization client does not use this value
(it reads the cell's formatted value).
If the DataTable has come from a data source in response to a query
with a format clause, the pattern you specified in that clause
will probably be returned in this value.
The recommended pattern standards are the ICU DecimalFormat and SimpleDateFormat.
<remarks>
<see cref="!:http://icu-project.org/apiref/icu4j/com/ibm/icu/text/SimpleDateFormat.html"/>
<see cref="!:http://icu-project.org/apiref/icu4j/com/ibm/icu/text/DecimalFormat.html"/>
</remarks>
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.Column.PropertyMap">
<summary>
p [Optional] An object that is a map of custom values applied to the cell.
These values can be of any JavaScript ColumnType.
If your visualization supports any cell-level properties,
it will describe them; otherwise, this property will be ignored.
<example>
Example: p:{style: 'border: 1px solid green;'}.
</example>
</summary>
<remarks>
Returns a list of currently assigned properties to the Cell
</remarks>
</member>
<member name="P:Google.DataTable.Net.Wrapper.ColumnRole.Annotation">
<summary>
Text to display on the chart near the associated data point.
The text displays without any user interaction.
Annotations and annotation text can be assigned to both
data points and categories (axis labels).
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.ColumnRole.AnnotationText">
<summary>
Extended text to display when the user hovers
over the associated annotation
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.ColumnRole.Certainty">
<summary>
ndicates whether a data point is certain or not.
How this is displayed depends on the chart type—for
example, it might be indicated by dashed lines or a striped fill.
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.ColumnRole.Emphasis">
<summary>
Emphasizes specified chart data points. Displayed as a
thick line and/or large point.
For line and area charts, the segment
between two data points is emphasized if and only if
both data points are emphasized.
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.ColumnRole.Interval">
<summary>
ndicates potential data range for a specific point.
Intervals are usually displayed as I-bar style range indicators.
Interval columns are numeric columns; add interval columns in
pairs, marking the low and high value of the bar. Interval
values should be added in increasing value, from left to right.
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.ColumnRole.Scope">
<summary>
Indicates whether a point is in or out of scope.
If a point is out of scope, it is visually de-emphasized.
For line and area charts, the segment between two data points
is in scope if either endpoint is in scope.
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.ColumnRole.Tooltip">
<summary>
Text to display when the user hovers over the data point
associated with this row.
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.ColumnRole.Domain">
<summary>
You should not need to assign this role explicitly unless designing
a multi-domain chart (shown here); the basic
format of the data table enables the charting engine to infer which
columns are domain columns. However, you should be aware of
which columns are domain columns so that you know which other
columns can modify it.
Domain columns specify labels along the major axis of the chart.
Multiple domain columns can sometimes be used to support multiple
scales within the same chart.
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.ColumnRole.Data">
<summary>
You should not need to assign this role explicitly; the basic
format of the data table enables the charting engine to
infer which columns are domain columns. However, you sould be
aware of which columns are data columns so that you know which
other columns can modify it.
Data role columns specify series data to render in the chart.
For most charts, one column = one series, but this can vary
by chart type (for example, scatter charts require two data
columns for the first series, and an additional one for each
additional series; candlestick charts require four data columns
for each series).
</summary>
</member>
<member name="T:Google.DataTable.Net.Wrapper.Extension.EnumerableExtension">
<summary>
Extension class for lists.
</summary>
</member>
<!-- Badly formed XML comment ignored for member "M:Google.DataTable.Net.Wrapper.Extension.EnumerableExtension.ToGoogleDataTable``1(System.Collections.Generic.IEnumerable{``0})" -->
<member name="M:Google.DataTable.Net.Wrapper.Extension.EnumerableExtension.NewColumn``1(Google.DataTable.Net.Wrapper.Extension.DataTableConfig{``0},Google.DataTable.Net.Wrapper.Column,System.Func{``0,System.Object},System.Func{``0,System.String})">
<summary>
Creates a new column
</summary>
<typeparam name="T"></typeparam>
<param name="source"></param>
<param name="col"></param>
<param name="rowValue"></param>
<param name="rowFormat"></param>
<returns></returns>
</member>
<member name="T:Google.DataTable.Net.Wrapper.Extension.SystemDataTableExtension">
<summary>
Class that implements an extension for a System.Data.DataTable
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Extension.SystemDataTableExtension.ToGoogleDataTable(System.Data.DataTable)">
<summary>
Converts a System.Data.DataTable into a Google.DataTable.Net.Wrapper.DataTable
</summary>
<param name="source"></param>
<returns></returns>
</member>
<member name="T:Google.DataTable.Net.Wrapper.DataTable">
<summary>
A DataTable represents a basic two-dimensional table.
All data (cells) in each column must have the same data type.
Each cell in the table holds a value.
<remarks>
For more information about the usage of the serialized DataTable please visit:
https://developers.google.com/chart/interactive/docs/reference#DataTable
</remarks>
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.DataTable.#ctor">
<summary>
Default constructor
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.DataTable.NewRow">
<summary>
Creates a new DataRow with the same schema as the table.
</summary>
<returns>A new row with the same schema as the table</returns>
</member>
<member name="M:Google.DataTable.Net.Wrapper.DataTable.AddRow(Google.DataTable.Net.Wrapper.Row)">
<summary>
Adds a row to the list of rows
attached to the current DataTable
</summary>
<param name="row">a row created with NewRow() method</param>
<returns></returns>
</member>
<member name="M:Google.DataTable.Net.Wrapper.DataTable.AddColumn(Google.DataTable.Net.Wrapper.Column)">
<summary>
Adds a new column to the current DataTable
</summary>
<param name="column"></param>
<returns></returns>
</member>
<member name="M:Google.DataTable.Net.Wrapper.DataTable.GetJson">
<summary>
Returns a Json string compatible with the Google DataTable notation.
</summary>
<returns></returns>
</member>
<member name="M:Google.DataTable.Net.Wrapper.DataTable.JsonizeRows(System.IO.StreamWriter)">
<summary>
Serializes the Rows.
<remarks>
The choice to have inline both the row and the cell
serialization is purely for the performance reasons.
</remarks>
</summary>
<param name="sw"></param>
</member>
<member name="M:Google.DataTable.Net.Wrapper.DataTable.JsonizeColumns(System.IO.StreamWriter)">
<summary>
Serializes the Columns into the Json format
</summary>
<returns></returns>
</member>
<member name="P:Google.DataTable.Net.Wrapper.DataTable.Columns">
<summary>
Returns a list of already assigned columns to the current DataTable
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.DataTable.Rows">
<summary>
Returns a list of already assigned rows to the current DataTable
</summary>
</member>
<member name="T:Google.DataTable.Net.Wrapper.ColumnType">
<summary>
ColumnType [Required] Data ColumnType of the data in the column. Supports the following string values (examples include the v: property, described later):
'boolean' - JavaScript boolean value ('true' or 'false'). Example value: v:'true'
'number' - JavaScript number value. Example values: v:7 , v:3.14, v:-55
'string' - JavaScript string value. Example value: v:'hello'
'date' - JavaScript Date object (zero-based month), with the time truncated. Example value: v:new Date(2008, 0, 15)
'datetime' - JavaScript Date object including the time. Example value: v:new Date(2008, 0, 15, 14, 30, 45)
'timeofday' - Array of three numbers and an optional fourth, representing hour (0 indicates midnight), minute, second, and optional millisecond. Example values: v:[8, 15, 0], v: [6, 12, 1, 144]
</summary>
</member>
<member name="F:Google.DataTable.Net.Wrapper.ColumnType.String">
<summary>
JavaScript string value. Example value: v:'hello'
</summary>
</member>
<member name="F:Google.DataTable.Net.Wrapper.ColumnType.Number">
<summary>
JavaScript number value. Example values: v:7 , v:3.14, v:-55
</summary>
</member>
<member name="F:Google.DataTable.Net.Wrapper.ColumnType.Boolean">
<summary>
JavaScript boolean value ('true' or 'false'). Example value: v:'true'
</summary>
</member>
<member name="F:Google.DataTable.Net.Wrapper.ColumnType.Date">
<summary>
JavaScript Date object (zero-based month), with the time truncated. Example value: v:new Date(2008, 0, 15)
</summary>
</member>
<member name="F:Google.DataTable.Net.Wrapper.ColumnType.Datetime">
<summary>
JavaScript Date object including the time. Example value: v:new Date(2008, 0, 15, 14, 30, 45)
</summary>
</member>
<member name="F:Google.DataTable.Net.Wrapper.ColumnType.Timeofday">
<summary>
Array of three numbers and an optional fourth, representing hour (0 indicates midnight), minute, second, and optional millisecond. Example values: v:[8, 15, 0], v: [6, 12, 1, 144]
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Common.Helper.DoubleQuoteString2(System.String)">
<summary>
Wraps the string around double quotes.
</summary>
<param name="value"></param>
<returns></returns>
</member>
<member name="T:Google.DataTable.Net.Wrapper.Extension.DataTableConfig`1">
<summary>
Helper class for the generic lists.
</summary>
<typeparam name="T"></typeparam>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Extension.DataTableConfig`1.AddColumn(Google.DataTable.Net.Wrapper.Column,System.Func{`0,Google.DataTable.Net.Wrapper.Cell})">
<summary>
Adds a new Column to a Google.DataTable.Net.Wrapper.DataTable
</summary>
<param name="col"></param>
<param name="cellFunction"></param>
<returns></returns>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Extension.DataTableConfig`1.Build">
<summary>
Build a new Google.DataTable.Net.Wrapper.DataTable()
</summary>
<returns></returns>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Extension.DataTableConfig`1.ToDataTable``1(System.Collections.Generic.List{``0})">
<summary>
Convert a List{T} to a DataTable.
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Extension.DataTableConfig`1.IsNullable(System.Type)">
<summary>
Determine of specified type is nullable
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Extension.DataTableConfig`1.GetCoreType(System.Type)">
<summary>
Return underlying type if type is Nullable otherwise return the type
</summary>
</member>
<member name="T:Google.DataTable.Net.Wrapper.Property">
<summary>
Reserved for future usages.
P values in reality should be a name -> value map
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Property.#ctor">
<summary>
Default constructor
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Property.#ctor(System.String,System.String)">
<summary>
Constructor that has as input name and value
</summary>
<param name="name"></param>
<param name="value"></param>
</member>
<member name="T:Google.DataTable.Net.Wrapper.Row">
<summary>
A row is an array of cells,
plus an optional map of arbitrary name/value pairs that you can assign.
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Row.#ctor">
<summary>
Internal constructor as we don't allow the direct generation
of the row due to the fact that the table Attribute is set
internally
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Row.AddCellRange(Google.DataTable.Net.Wrapper.Cell[])">
<summary>
Adds a range of Cell objects
</summary>
<param name="cells"></param>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Row.AddCell(Google.DataTable.Net.Wrapper.Cell)">
<summary>
Adds a single cell to the Row
</summary>
<param name="cell"></param>
<returns></returns>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Row.AddProperty(Google.DataTable.Net.Wrapper.Property)">
<summary>
Adds a new property to the list of properties.
</summary>
<param name="p"></param>
<returns></returns>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Row.RemoveProperty(Google.DataTable.Net.Wrapper.Property)">
<summary>
Removes a property from the Property Map
</summary>
<param name="p"></param>
</member>
<member name="M:Google.DataTable.Net.Wrapper.Row.RemoveProperty(System.Int32)">
<summary>
Removes a property from the Property Map by an index.
</summary>
<param name="index"></param>
</member>
<member name="P:Google.DataTable.Net.Wrapper.Row.ColumnTypes">
<summary>
A reference to the available column types of the table.
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.Row.Cells">
<summary>
</summary>
</member>
<member name="P:Google.DataTable.Net.Wrapper.Row.PropertyMap">
<summary>
Returns a list of currently assigned properties to the Row
</summary>
</member>
<member name="T:Google.DataTable.Net.Wrapper.SystemDataTableConverter">
<summary>
Responsible for converting the System.Data.DataTable into
Google.DataTable.Net.Wrapper.DataTable.
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.SystemDataTableConverter.Convert(System.Data.DataTable)">
<summary>
Responsible for converting the System.Data.DataTable into
Google.DataTable.Net.Wrapper.DataTable.
</summary>
</member>
<member name="M:Google.DataTable.Net.Wrapper.SystemDataTableConverter.GetColumnTypeFromType(System.Type)">
<summary>
For more info about System.Data.DataColumn Types
http://msdn.microsoft.com/en-us/library/system.data.datacolumn.datatype.aspx
</summary>
<param name="t"></param>
<returns></returns>
</member>
</members>
</doc>

View File

@ -1,302 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>661253b3-4c4d-4ebd-87e4-f1c6f010347f</ProjectGuid>
<OutputType>Library</OutputType>
<TargetFramework>net47</TargetFramework>
<RootNamespace>LogicalHacking.ExtensionDsLab.Tests</RootNamespace>
<AssemblyName>LogicalHacking.ExtensionDsLab.Tests</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<Name>LogicalHacking.ExtensionDsLab.Tests</Name>
<TargetFrameworkProfile />
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<Tailcalls>false</Tailcalls>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<WarningLevel>3</WarningLevel>
<StartAction>Project</StartAction>
<StartProgram>
</StartProgram>
<StartArguments>
</StartArguments>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<Tailcalls>true</Tailcalls>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<WarningLevel>3</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<MinimumVisualStudioVersion Condition="'$(MinimumVisualStudioVersion)' == ''">11</MinimumVisualStudioVersion>
</PropertyGroup>
<Choose>
<When Condition="'$(VisualStudioVersion)' == '11.0'">
<PropertyGroup Condition="Exists('$(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets')">
<FSharpTargetsPath>$(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets</FSharpTargetsPath>
</PropertyGroup>
</When>
<Otherwise>
<PropertyGroup Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets')">
<FSharpTargetsPath>$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets</FSharpTargetsPath>
</PropertyGroup>
</Otherwise>
</Choose>
<Import Project="$(FSharpTargetsPath)" />
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
<Import Project="..\..\.paket\paket.targets" />
<ItemGroup>
<Compile Include="Generators.fs" />
<Compile Include="Tests.fs" />
<Compile Include="RunTests.fs" />
<None Include="paket.references" />
<Content Include="Google.DataTable.Net.Wrapper.XML">
<Paket>True</Paket>
</Content>
<Content Include="app.config" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<Reference Include="mscorlib" />
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Numerics" />
<ProjectReference Include="..\..\src\LogicalHacking.ExtensionDsLab\LogicalHacking.ExtensionDsLab.fsproj">
<Name>LogicalHacking.ExtensionDsLab</Name>
<Project>{8a2ebfc4-14ce-4d77-81de-1fd7372c3382}</Project>
<Private>True</Private>
</ProjectReference>
</ItemGroup>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="Deedle">
<HintPath>..\..\packages\Deedle\lib\net40\Deedle.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="Deedle.RProvider.Plugin">
<HintPath>..\..\packages\Deedle.RPlugin\lib\net40\Deedle.RProvider.Plugin.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="DynamicInterop">
<HintPath>..\..\packages\DynamicInterop\lib\net40\DynamicInterop.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="FSharp.Charting">
<HintPath>..\..\packages\FSharp.Charting\lib\net40\FSharp.Charting.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="FSharp.Core">
<HintPath>..\..\packages\FSharp.Core\lib\net40\FSharp.Core.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="System.Xml.Linq">
<Paket>True</Paket>
</Reference>
<Reference Include="FSharp.Data">
<HintPath>..\..\packages\FSharp.Data\lib\net40\FSharp.Data.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="Google.DataTable.Net.Wrapper">
<HintPath>..\..\packages\Google.DataTable.Net.Wrapper\lib\Google.DataTable.Net.Wrapper.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="MathNet.Numerics">
<HintPath>..\..\packages\MathNet.Numerics\lib\net40\MathNet.Numerics.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="MathNet.Numerics.FSharp">
<HintPath>..\..\packages\MathNet.Numerics.FSharp\lib\net40\MathNet.Numerics.FSharp.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="Newtonsoft.Json">
<HintPath>..\..\packages\Newtonsoft.Json\lib\net45\Newtonsoft.Json.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="RDotNet">
<HintPath>..\..\packages\R.NET.Community\lib\net40\RDotNet.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
<Reference Include="RDotNet.NativeLibrary">
<HintPath>..\..\packages\R.NET.Community\lib\net40\RDotNet.NativeLibrary.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="RDotNet.FSharp">
<HintPath>..\..\packages\R.NET.Community.FSharp\lib\net40\RDotNet.FSharp.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="RProvider">
<HintPath>..\..\packages\RProvider\lib\net40\RProvider.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
<Reference Include="RProvider.Runtime">
<HintPath>..\..\packages\RProvider\lib\net40\RProvider.Runtime.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="FSharp.Data.SqlProvider">
<HintPath>..\..\packages\SQLProvider\lib\FSharp.Data.SqlProvider.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="Suave">
<HintPath>..\..\packages\Suave\lib\net40\Suave.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="XPlot.GoogleCharts">
<HintPath>..\..\packages\XPlot.GoogleCharts\lib\net45\XPlot.GoogleCharts.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="XPlot.GoogleCharts.Deedle">
<HintPath>..\..\packages\XPlot.GoogleCharts.Deedle\lib\net45\XPlot.GoogleCharts.Deedle.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7')">
<ItemGroup>
<Reference Include="XPlot.Plotly">
<HintPath>..\..\packages\XPlot.Plotly\lib\net45\XPlot.Plotly.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<ItemGroup>
<Reference Include="nunit.framework">
<HintPath>..\..\packages\test\NUnit\lib\nunit.framework.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</Project>
<Import Project="..\..\fsc.props" />
<Import Project="..\..\.paket\Paket.Restore.targets" />
</Project>

View File

@ -0,0 +1,13 @@
namespace LogicalHacking.ExtensionDsLab.Tests
open Expecto
module RunTests =
[<EntryPoint>]
let main args =
Tests.runTestsWithArgs defaultConfig args Tests.testSimpleTests |> ignore
0

View File

@ -1,26 +1,27 @@
(*
* This file is part of the ExtensionDsLab project.
* Copyright (c) 2017 LogicalHacking.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*)
module LogicalHacking.ExtensionDsLab.Tests
namespace LogicalHacking.ExtensionDsLab.Tests
open NUnit.Framework
open Expecto
open FsCheck
open GeneratorsCode
module Tests =
let config10k = { FsCheckConfig.defaultConfig with maxTest = 10000}
// bug somewhere: registering arbitrary generators causes Expecto VS test adapter not to work
//let config10k = { FsCheckConfig.defaultConfig with maxTest = 10000; arbitrary = [typeof<Generators>] }
let configReplay = { FsCheckConfig.defaultConfig with maxTest = 10000 ; replay = Some <| (1940624926, 296296394) }
[<Tests>]
let testSimpleTests =
testList "DomainTypes.Tag" [
testCase "equality" <| fun () ->
let result = 42
Expect.isTrue (result = 42) "Expected True"
testPropertyWithConfig config10k "whitespace" <|
fun () ->
Prop.forAll (Arb.fromGen <| whitespaceString())
(fun (x : string) ->
x = x)
]
[<Test>]
let ``hello returns 42`` () =
let result = 42
printfn "%i" result
Assert.AreEqual(42,result)

View File

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime><assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<Paket>True</Paket>
<assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="4.4.0.0" />
</dependentAssembly>
</assemblyBinding></runtime></configuration>

View File

@ -1,6 +1,6 @@
FSharp.Core
FsLab
SQLProvider
group Test
NUnit
NUnit.Runners
Expecto
Expecto.BenchmarkDotNet
Expecto.FsCheck
Expecto.VisualStudio.TestAdapter