Skip to content

Commit

Permalink
Merge pull request #77 from mexx/StringReaderProvider
Browse files Browse the repository at this point in the history
Add StringReader provider
  • Loading branch information
vasily-kirichenko authored Feb 14, 2017
2 parents f1d6d63 + a699538 commit e2104ab
Show file tree
Hide file tree
Showing 6 changed files with 73 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/FSharp.Management/FSharp.Management.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@
<Compile Include="FileSystemProvider.fs" />
<Compile Include="CommonFolders.fs" />
<Compile Include="RegistryProvider.fs" />
<Compile Include="StringReaderProvider.fs" />
<Compile Include="SystemTypeProviders.fs" />
<None Include="paket.references" />
</ItemGroup>
Expand Down
36 changes: 36 additions & 0 deletions src/FSharp.Management/StringReaderProvider.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
module internal FSharp.Management.StringReaderProvider

open ProviderImplementation.ProvidedTypes
open FSharp.Management.Helper
open System.IO

let createType typeName filePath =
let typedStringReader = erasedType<obj> thisAssembly rootNamespace typeName

let content = File.ReadAllText(filePath)

let contentField = ProvidedLiteralField("Content", typeof<string>, content)
contentField.AddXmlDoc(sprintf "Content of '%s'" filePath)
typedStringReader.AddMember contentField

typedStringReader

let createTypedStringReader (resolutionFolder: string) =
let typedStringReader = erasedType<obj> thisAssembly rootNamespace "StringReader"

typedStringReader.DefineStaticParameters(
parameters =
[ ProvidedStaticParameter("path", typeof<string>) ],
instantiationFunction = (fun typeName parameterValues ->
match parameterValues with
| [| :? string as path |] ->
let filePath =
match Path.IsPathRooted(path) with
| false -> Path.Combine(resolutionFolder, path)
| true -> path
if not <| File.Exists(filePath) then
failwithf "Specified file [%s] could not be found" path
createType typeName filePath
| _ -> failwith "Wrong static parameters to type provider"))

typedStringReader
6 changes: 6 additions & 0 deletions src/FSharp.Management/SystemTypeProviders.fs
Original file line number Diff line number Diff line change
Expand Up @@ -46,5 +46,11 @@ type public SystemTimeZonesProvider(cfg : TypeProviderConfig) as this =
]
this.AddNamespace(rootNamespace, [root])

[<TypeProvider>]
/// [omit]
type public StringReaderProvider(cfg : TypeProviderConfig) as this =
inherit TypeProviderForNamespaces()
do this.AddNamespace(rootNamespace, [ StringReaderProvider.createTypedStringReader cfg.ResolutionFolder ])

[<TypeProviderAssembly>]
do()
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@
<Compile Include="PowerShellProvider.Tests.fs" />
<Compile Include="WMI.Tests.fs" />
<Compile Include="SystemTimeZonesProvider.Tests.fs" />
<Compile Include="StringReaderProvider.Tests.fs" />
<None Include="paket.references" />
<None Include="testModule.psm1" />
</ItemGroup>
Expand Down
9 changes: 9 additions & 0 deletions tests/FSharp.Management.Tests/StringReaderProvider.Tests.data
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam scelerisque leo ut mauris ullamcorper posuere. Aliquam quis nulla dolor. Aliquam erat volutpat. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Pellentesque leo ipsum, imperdiet vehicula quam nec, egestas condimentum purus. Donec rutrum lacus ac turpis lacinia blandit. Cras sollicitudin dapibus interdum. Sed dapibus elementum turpis, at feugiat lectus interdum sed. Integer faucibus non turpis nec ullamcorper. Nam eget tincidunt ex.

Quisque vitae nulla leo. Nunc ultricies facilisis tellus, et placerat libero pulvinar et. Phasellus mollis consectetur orci in vestibulum. Integer ultricies tortor vitae condimentum dictum. Mauris id mi ante. Ut congue dolor erat, pretium aliquam neque iaculis at. Sed dictum dolor vel tellus finibus, eget tempus ligula dignissim. Ut cursus nibh magna, a feugiat risus maximus eu.

Cras accumsan vulputate neque, eu euismod tellus congue vitae. Donec at nunc est. Ut libero sapien, imperdiet nec sem vel, tincidunt feugiat turpis. Vestibulum lectus nunc, rhoncus eu tellus sed, egestas congue ex. Phasellus sed interdum lacus. Curabitur rutrum, lectus in mattis sodales, augue ex tristique enim, sit amet elementum est sem non erat. Integer sit amet libero augue. Nulla in suscipit dolor. Mauris ac porta orci, vitae varius tellus. Nunc nec consectetur dui.

Vivamus rhoncus porta nibh, quis auctor sapien fermentum quis. Maecenas nunc lectus, efficitur vitae arcu sit amet, volutpat efficitur eros. Aenean pellentesque tellus et placerat mollis. Nullam nisl lectus, bibendum sit amet varius at, scelerisque in augue. Phasellus vehicula erat sed felis iaculis rutrum. Aenean elementum ullamcorper mauris, vel aliquam diam suscipit ac. Duis eget congue felis. Proin placerat lorem odio, luctus bibendum justo dapibus et. Sed in ornare mauris. Nulla facilisi. Fusce ultricies purus id augue cursus viverra. Donec maximus risus id metus suscipit volutpat. Duis eu lacinia odio. Nullam sit amet nunc arcu.

Etiam pulvinar dui a eros ullamcorper luctus. Nam lobortis urna vitae lorem maximus, ac rhoncus felis ultricies. Morbi vestibulum ultricies urna, sed suscipit velit vehicula in. Sed iaculis velit nec ligula cursus semper. Nam sed felis vitae dui aliquet interdum sed sed eros. Donec porta ex a dolor blandit, non tempor purus molestie. Pellentesque viverra diam quis fringilla commodo. Praesent ut enim ac massa imperdiet pellentesque in eget nunc. Curabitur imperdiet erat sit amet condimentum maximus. Proin tincidunt sem sed lorem congue, nec scelerisque libero viverra.
20 changes: 20 additions & 0 deletions tests/FSharp.Management.Tests/StringReaderProvider.Tests.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
module FSharp.Management.Tests.StringReaderProviderTests

open FSharp.Management
open NUnit.Framework
open FsUnitTyped

type LoremIpsum = StringReader<"StringReaderProvider.Tests.data">

[<Test>]
let ``StringReader provider reads the file correctly``() =
LoremIpsum.Content
|> shouldEqual <| """Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam scelerisque leo ut mauris ullamcorper posuere. Aliquam quis nulla dolor. Aliquam erat volutpat. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Pellentesque leo ipsum, imperdiet vehicula quam nec, egestas condimentum purus. Donec rutrum lacus ac turpis lacinia blandit. Cras sollicitudin dapibus interdum. Sed dapibus elementum turpis, at feugiat lectus interdum sed. Integer faucibus non turpis nec ullamcorper. Nam eget tincidunt ex.
Quisque vitae nulla leo. Nunc ultricies facilisis tellus, et placerat libero pulvinar et. Phasellus mollis consectetur orci in vestibulum. Integer ultricies tortor vitae condimentum dictum. Mauris id mi ante. Ut congue dolor erat, pretium aliquam neque iaculis at. Sed dictum dolor vel tellus finibus, eget tempus ligula dignissim. Ut cursus nibh magna, a feugiat risus maximus eu.
Cras accumsan vulputate neque, eu euismod tellus congue vitae. Donec at nunc est. Ut libero sapien, imperdiet nec sem vel, tincidunt feugiat turpis. Vestibulum lectus nunc, rhoncus eu tellus sed, egestas congue ex. Phasellus sed interdum lacus. Curabitur rutrum, lectus in mattis sodales, augue ex tristique enim, sit amet elementum est sem non erat. Integer sit amet libero augue. Nulla in suscipit dolor. Mauris ac porta orci, vitae varius tellus. Nunc nec consectetur dui.
Vivamus rhoncus porta nibh, quis auctor sapien fermentum quis. Maecenas nunc lectus, efficitur vitae arcu sit amet, volutpat efficitur eros. Aenean pellentesque tellus et placerat mollis. Nullam nisl lectus, bibendum sit amet varius at, scelerisque in augue. Phasellus vehicula erat sed felis iaculis rutrum. Aenean elementum ullamcorper mauris, vel aliquam diam suscipit ac. Duis eget congue felis. Proin placerat lorem odio, luctus bibendum justo dapibus et. Sed in ornare mauris. Nulla facilisi. Fusce ultricies purus id augue cursus viverra. Donec maximus risus id metus suscipit volutpat. Duis eu lacinia odio. Nullam sit amet nunc arcu.
Etiam pulvinar dui a eros ullamcorper luctus. Nam lobortis urna vitae lorem maximus, ac rhoncus felis ultricies. Morbi vestibulum ultricies urna, sed suscipit velit vehicula in. Sed iaculis velit nec ligula cursus semper. Nam sed felis vitae dui aliquet interdum sed sed eros. Donec porta ex a dolor blandit, non tempor purus molestie. Pellentesque viverra diam quis fringilla commodo. Praesent ut enim ac massa imperdiet pellentesque in eget nunc. Curabitur imperdiet erat sit amet condimentum maximus. Proin tincidunt sem sed lorem congue, nec scelerisque libero viverra."""

0 comments on commit e2104ab

Please sign in to comment.