Skip to content

No caching and no dependency on FSharp.Configuration #85

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Aug 21, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions RELEASE_NOTES.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
#### 0.8.1 - August 21, 2017
* Removed caching and dependency on FSharp.Configuration context [#84](https://github.com/fsprojects/SwaggerProvider/issues/84)

#### 0.8.0 - August 8, 2017
* Better support for optional parameters [#82](https://github.com/fsprojects/SwaggerProvider/issues/82)

Expand Down
1 change: 0 additions & 1 deletion paket.dependencies
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ github fsharp/FSharp.Data src/Json/JsonExtensions.fs
github fsprojects/FSharp.TypeProviders.StarterPack src/ProvidedTypes.fsi
github fsprojects/FSharp.TypeProviders.StarterPack src/ProvidedTypes.fs
github fsprojects/FSharp.TypeProviders.StarterPack src/ProvidedTypesTesting.fs
github fsprojects/FSharp.Configuration src/FSharp.Configuration/TypeProviders.Helper.fs

group Build
framework: net45
Expand Down
23 changes: 13 additions & 10 deletions paket.lock
Original file line number Diff line number Diff line change
Expand Up @@ -20,23 +20,21 @@ GITHUB
src/ProvidedTypes.fs (1dab4f94411500794342f61f877feab772e5a754)
src/ProvidedTypes.fsi (1dab4f94411500794342f61f877feab772e5a754)
src/ProvidedTypesTesting.fs (1dab4f94411500794342f61f877feab772e5a754)
remote: fsprojects/FSharp.Configuration
src/FSharp.Configuration/TypeProviders.Helper.fs (2bd57b3043efc44d1f9b74f9942159a3853291d1)
GROUP Build
RESTRICTION: == net45
NUGET
remote: https://www.nuget.org/api/v2
DotLiquid (2.0.158)
DotLiquid (2.0.168)
FAKE (4.63)
FSharp.Compiler.Service (2.0.0.6)
FSharp.Core (4.2.2)
FSharp.Core (4.2.3)
FSharp.Formatting (2.14.4)
FSharp.Compiler.Service (2.0.0.6)
FSharpVSPowerTools.Core (>= 2.3 < 2.4)
FSharpVSPowerTools.Core (2.3)
FSharp.Compiler.Service (>= 2.0.0.3)
Octokit (0.24)
Suave (2.1.1)
Suave (2.2.1)
FSharp.Core (>= 4.0.0.1)
GITHUB
remote: fsharp/FAKE
Expand All @@ -46,7 +44,7 @@ GROUP OWIN
RESTRICTION: == net461
NUGET
remote: https://www.nuget.org/api/v2
FSharp.Core (4.2.2) - redirects: force
FSharp.Core (4.2.3) - redirects: force
Microsoft.AspNet.WebApi.Client (5.2.3)
Newtonsoft.Json (>= 6.0.4)
Microsoft.AspNet.WebApi.Core (5.2.3)
Expand Down Expand Up @@ -83,9 +81,14 @@ NUGET
FSharp.Compiler.Service (13.0)
System.Collections.Immutable (>= 1.3.1)
System.Reflection.Metadata (>= 1.4.2)
FSharp.Core (4.2.2) - redirects: force
FSharp.Core (4.2.3) - redirects: force
FSharp.Data (2.3.3)
Microsoft.NETCore.Platforms (2.0)
Mono.Cecil (0.10.0-beta6)
System.Collections.Immutable (1.3.1)
System.Reflection.Metadata (1.4.2)
System.Collections.Immutable (>= 1.3.1)
NETStandard.Library (2.0)
Microsoft.NETCore.Platforms (>= 1.1)
System.Collections.Immutable (1.4)
NETStandard.Library (>= 1.6.1)
System.Reflection.Metadata (1.5)
NETStandard.Library (>= 1.6.1)
System.Collections.Immutable (>= 1.4)
8 changes: 4 additions & 4 deletions src/Common/AssemblyInfo.fs
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@ open System.Reflection
[<assembly: AssemblyTitleAttribute("SwaggerProvider")>]
[<assembly: AssemblyProductAttribute("SwaggerProvider")>]
[<assembly: AssemblyDescriptionAttribute("F# Type Provider for Swagger")>]
[<assembly: AssemblyVersionAttribute("0.8.0")>]
[<assembly: AssemblyFileVersionAttribute("0.8.0")>]
[<assembly: AssemblyVersionAttribute("0.8.1")>]
[<assembly: AssemblyFileVersionAttribute("0.8.1")>]
do ()

module internal AssemblyVersionInformation =
let [<Literal>] AssemblyTitle = "SwaggerProvider"
let [<Literal>] AssemblyProduct = "SwaggerProvider"
let [<Literal>] AssemblyDescription = "F# Type Provider for Swagger"
let [<Literal>] AssemblyVersion = "0.8.0"
let [<Literal>] AssemblyFileVersion = "0.8.0"
let [<Literal>] AssemblyVersion = "0.8.1"
let [<Literal>] AssemblyFileVersion = "0.8.1"
Original file line number Diff line number Diff line change
Expand Up @@ -91,10 +91,6 @@
<Paket>True</Paket>
<Link>paket-files/JsonExtensions.fs</Link>
</Compile>
<Compile Include="..\..\paket-files\fsprojects\FSharp.Configuration\src\FSharp.Configuration\TypeProviders.Helper.fs">
<Paket>True</Paket>
<Link>paket-files/TypeProviders.Helper.fs</Link>
</Compile>
<Compile Include="..\Common\AssemblyInfo.fs">
<Link>AssemblyInfo.fs</Link>
</Compile>
Expand Down Expand Up @@ -142,7 +138,7 @@
</Target>
-->
<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')">
<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' Or $(TargetFrameworkVersion) == 'v5.0')">
<ItemGroup>
<Reference Include="FSharp.Core">
<HintPath>..\..\packages\FSharp.Core\lib\net40\FSharp.Core.dll</HintPath>
Expand All @@ -153,7 +149,7 @@
</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')">
<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' Or $(TargetFrameworkVersion) == 'v5.0')">
<ItemGroup>
<Reference Include="YamlDotNet">
<HintPath>..\..\packages\YamlDotNet\lib\net35\YamlDotNet.dll</HintPath>
Expand Down
4 changes: 1 addition & 3 deletions src/SwaggerProvider.DesignTime/SwaggerProvider.fs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
open System
open ProviderImplementation.ProvidedTypes
open Microsoft.FSharp.Core.CompilerServices
open FSharp.Configuration.Helper

/// The Swagger Type Provider.
[<TypeProvider>]
Expand All @@ -18,9 +17,8 @@ type public SwaggerTypeProvider(cfg : TypeProviderConfig) as this =
AppDomain.CurrentDomain.add_AssemblyResolve(fun source args ->
SwaggerProvider.Internal.Configuration.resolveReferencedAssembly args.Name)

let context = new Context(this, cfg)
do
this.RegisterRuntimeAssemblyLocationAsProbingFolder cfg
this.AddNamespace(
SwaggerProviderConfig.NameSpace,
[SwaggerProviderConfig.typedSwaggerProvider context cfg.RuntimeAssembly])
[SwaggerProviderConfig.typedSwaggerProvider cfg.RuntimeAssembly])
135 changes: 64 additions & 71 deletions src/SwaggerProvider.DesignTime/SwaggerProviderConfig.fs
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,14 @@ open Microsoft.FSharp.Quotations
open System
open System.Runtime.Caching
open FSharp.Data
open FSharp.Configuration.Helper
open SwaggerProvider.Internal.Schema
open SwaggerProvider.Internal.Schema.Parsers
open SwaggerProvider.Internal.Compilers

module private SwaggerProviderConfig =
let NameSpace = "SwaggerProvider"

let internal typedSwaggerProvider (context: Context) runtimeAssemlby =
let internal typedSwaggerProvider runtimeAssemlby =
let asm = Assembly.LoadFrom runtimeAssemlby

let swaggerProvider = ProvidedTypeDefinition(asm, NameSpace, "SwaggerProvider", Some typeof<obj>, IsErased = false)
Expand All @@ -32,76 +31,70 @@ module private SwaggerProviderConfig =
<param name='Headers'>Headers that will be used to access the schema.</param>
<param name='IgnoreOperationId'>IgnoreOperationId tells SwaggerProvider not to use `operationsId` and generate method names using `path` only. Default value `false`</param>"""

let cache = new MemoryCache("SwaggerProvider")
context.AddDisposable cache

swaggerProvider.DefineStaticParameters(
parameters=staticParams,
instantiationFunction = (fun typeName args ->
let value = lazy (
let schemaPathRaw = args.[0] :?> string
let ignoreOperationId = args.[2] :?> bool

let schemaData =
match schemaPathRaw.StartsWith("http", true, null) with
| true ->
let headersStr = args.[1] :?> string
let headers =
headersStr.Split('|')
|> Seq.choose (fun x ->
let pair = x.Split('=')
if (pair.Length = 2)
then Some (pair.[0],pair.[1])
else None
)
Http.RequestString(schemaPathRaw, headers=headers,
customizeHttpRequest = fun req ->
req.Credentials <- System.Net.CredentialCache.DefaultNetworkCredentials
req)
| false ->
context.WatchFile schemaPathRaw
schemaPathRaw |> IO.File.ReadAllText

let schema =
if schemaData.Trim().StartsWith("{")
then JsonValue.Parse schemaData |> JsonNodeAdapter |> Parser.parseSwaggerObject
else YamlParser.Parse schemaData |> YamlNodeAdapter |> Parser.parseSwaggerObject

// Create Swagger provider type
let baseTy = Some typeof<SwaggerProvider.Internal.ProvidedSwaggerBaseType>
let ty = ProvidedTypeDefinition(asm, NameSpace, typeName, baseTy, IsErased = false)
ty.AddXmlDoc ("Swagger.io Provider for " + schema.Host)
ty.HideObjectMethods <- true

let protocol =
match schema.Schemes with
| [||] -> "http" // Should use the scheme used to access the Swagger definition itself.
| array -> array.[0]
let ctor =
ProvidedConstructor(
[ProvidedParameter("host", typeof<string>,
optionalValue = sprintf "%s://%s" protocol schema.Host)],
InvokeCode = fun args ->
match args with
| [] -> failwith "Generated constructors should always pass the instance as the first argument!"
| _ -> <@@ () @@>)
ctor.BaseConstructorCall <-
let baseCtor = baseTy.Value.GetConstructors().[0]
fun args -> (baseCtor, args)
ty.AddMember ctor

let defCompiler = DefinitionCompiler(schema)
let opCompiler = OperationCompiler(schema, defCompiler)
ty.AddMembers <| opCompiler.CompilePaths(ignoreOperationId) // Add all operations
ty.AddMembers <| defCompiler.GetProvidedTypes() // Add all compiled types

let tempAsmPath = System.IO.Path.ChangeExtension(System.IO.Path.GetTempFileName(), ".dll")
let tempAsm = ProvidedAssembly tempAsmPath
tempAsm.AddTypes [ty]

ty)
cache.GetOrAdd(typeName, value)
))
parameters=staticParams,
instantiationFunction = (fun typeName args ->
let schemaPathRaw = args.[0] :?> string
let ignoreOperationId = args.[2] :?> bool

let schemaData =
match schemaPathRaw.StartsWith("http", true, null) with
| true ->
let headersStr = args.[1] :?> string
let headers =
headersStr.Split('|')
|> Seq.choose (fun x ->
let pair = x.Split('=')
if (pair.Length = 2)
then Some (pair.[0],pair.[1])
else None
)
Http.RequestString(schemaPathRaw, headers=headers,
customizeHttpRequest = fun req ->
req.Credentials <- System.Net.CredentialCache.DefaultNetworkCredentials
req)
| false ->
schemaPathRaw |> IO.File.ReadAllText

let schema =
if schemaData.Trim().StartsWith("{")
then JsonValue.Parse schemaData |> JsonNodeAdapter |> Parser.parseSwaggerObject
else YamlParser.Parse schemaData |> YamlNodeAdapter |> Parser.parseSwaggerObject

// Create Swagger provider type
let baseTy = Some typeof<SwaggerProvider.Internal.ProvidedSwaggerBaseType>
let ty = ProvidedTypeDefinition(asm, NameSpace, typeName, baseTy, IsErased = false)
ty.AddXmlDoc ("Swagger.io Provider for " + schema.Host)
ty.HideObjectMethods <- true

let protocol =
match schema.Schemes with
| [||] -> "http" // Should use the scheme used to access the Swagger definition itself.
| array -> array.[0]
let ctor =
ProvidedConstructor(
[ProvidedParameter("host", typeof<string>,
optionalValue = sprintf "%s://%s" protocol schema.Host)],
InvokeCode = fun args ->
match args with
| [] -> failwith "Generated constructors should always pass the instance as the first argument!"
| _ -> <@@ () @@>)
ctor.BaseConstructorCall <-
let baseCtor = baseTy.Value.GetConstructors().[0]
fun args -> (baseCtor, args)
ty.AddMember ctor

let defCompiler = DefinitionCompiler(schema)
let opCompiler = OperationCompiler(schema, defCompiler)
ty.AddMembers <| opCompiler.CompilePaths(ignoreOperationId) // Add all operations
ty.AddMembers <| defCompiler.GetProvidedTypes() // Add all compiled types

let tempAsmPath = System.IO.Path.ChangeExtension(System.IO.Path.GetTempFileName(), ".dll")
let tempAsm = ProvidedAssembly tempAsmPath
tempAsm.AddTypes [ty]

ty
))
swaggerProvider


1 change: 0 additions & 1 deletion src/SwaggerProvider.DesignTime/paket.references
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,5 @@ File: NameUtils.fs
File: JsonValue.fs
File: JsonConversions.fs
File: JsonExtensions.fs
File: TypeProviders.Helper.fs
FSharp.Core
YamlDotNet
4 changes: 2 additions & 2 deletions src/SwaggerProvider.Runtime/SwaggerProvider.Runtime.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@
-->
<Import Project="..\..\.paket\paket.targets" />
<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')">
<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' Or $(TargetFrameworkVersion) == 'v5.0')">
<ItemGroup>
<Reference Include="FSharp.Core">
<HintPath>..\..\packages\FSharp.Core\lib\net40\FSharp.Core.dll</HintPath>
Expand All @@ -87,7 +87,7 @@
</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')">
<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' Or $(TargetFrameworkVersion) == 'v5.0')">
<ItemGroup>
<Reference Include="Newtonsoft.Json">
<HintPath>..\..\packages\Newtonsoft.Json\lib\net45\Newtonsoft.Json.dll</HintPath>
Expand Down
2 changes: 1 addition & 1 deletion src/SwaggerProvider/SwaggerProvider.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@
</Target>
-->
<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')">
<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' Or $(TargetFrameworkVersion) == 'v5.0')">
<ItemGroup>
<Reference Include="FSharp.Core">
<HintPath>..\..\packages\FSharp.Core\lib\net40\FSharp.Core.dll</HintPath>
Expand Down
7 changes: 6 additions & 1 deletion tests/SwaggerProvider.ProviderTests/App.config
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,11 @@
<dependentAssembly>
<Paket>True</Paket>
<assemblyIdentity name="System.Collections.Immutable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="1.2.1.0" />
<bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="1.2.2.0" />
</dependentAssembly>
<dependentAssembly>
<Paket>True</Paket>
<assemblyIdentity name="System.Reflection.Metadata" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="1.4.2.0" />
</dependentAssembly>
</assemblyBinding></runtime></configuration>
Original file line number Diff line number Diff line change
Expand Up @@ -218,4 +218,5 @@
</ItemGroup>
</When>
</Choose>
<Import Project="..\..\packages\test\NETStandard.Library\build\NETStandard.Library.targets" Condition="Exists('..\..\packages\test\NETStandard.Library\build\NETStandard.Library.targets')" Label="Paket" />
</Project>
Loading