Skip to content

Commit 3086bb6

Browse files
committed
Merge pull request #1941 from jhancock93/projectfile2
CSharp client: optionally build .csproj file
2 parents 421b70c + 9edbfd6 commit 3086bb6

File tree

5 files changed

+119
-9
lines changed

5 files changed

+119
-9
lines changed

modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,4 +62,10 @@ public class CodegenConstants {
6262
public static final String OPTIONAL_ASSEMBLY_INFO = "optionalAssemblyInfo";
6363
public static final String OPTIONAL_ASSEMBLY_INFO_DESC = "Generate AssemblyInfo.cs (Default: true).";
6464

65+
public static final String OPTIONAL_PROJECT_FILE = "optionalProjectFile";
66+
public static final String OPTIONAL_PROJECT_FILE_DESC = "Generate {PackageName}.csproj (Default: false).";
67+
68+
public static final String OPTIONAL_PROJECT_GUID = "packageGuid";
69+
public static final String OPTIONAL_PROJECT_GUID_DESC = "The GUID that will be associated with the C# project";
70+
6571
}

modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java

Lines changed: 48 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,10 @@ public class CSharpClientCodegen extends DefaultCodegen implements CodegenConfig
2525
@SuppressWarnings({ "unused", "hiding" })
2626
private static final Logger LOGGER = LoggerFactory.getLogger(CSharpClientCodegen.class);
2727
protected boolean optionalAssemblyInfoFlag = true;
28+
protected boolean optionalProjectFileFlag = false;
2829
protected boolean optionalMethodArgumentFlag = true;
2930
protected boolean useDateTimeOffsetFlag = false;
31+
protected String packageGuid = "{" + java.util.UUID.randomUUID().toString().toUpperCase() + "}";
3032
protected String packageTitle = "Swagger Library";
3133
protected String packageProductName = "SwaggerLibrary";
3234
protected String packageDescription = "A library generated from a Swagger doc";
@@ -120,6 +122,9 @@ public CSharpClientCodegen() {
120122
CodegenConstants.OPTIONAL_ASSEMBLY_INFO_DESC).defaultValue(Boolean.TRUE.toString()));
121123
cliOptions.add(new CliOption(CodegenConstants.SOURCE_FOLDER, CodegenConstants.SOURCE_FOLDER_DESC).defaultValue(sourceFolder));
122124
cliOptions.add(CliOption.newBoolean(CodegenConstants.USE_DATETIME_OFFSET, CodegenConstants.USE_DATETIME_OFFSET_DESC));
125+
cliOptions.add(CliOption.newBoolean(CodegenConstants.OPTIONAL_PROJECT_FILE,
126+
CodegenConstants.OPTIONAL_PROJECT_FILE_DESC).defaultValue(Boolean.FALSE.toString()));
127+
cliOptions.add(new CliOption(CodegenConstants.OPTIONAL_PROJECT_GUID, CodegenConstants.OPTIONAL_PROJECT_GUID_DESC));
123128
}
124129

125130
@Override
@@ -164,7 +169,19 @@ public void processOpts() {
164169
additionalProperties.put("packageDescription", packageDescription);
165170
additionalProperties.put("packageCompany", packageCompany);
166171
additionalProperties.put("packageCopyright", packageCopyright);
167-
172+
173+
if (additionalProperties.containsKey(CodegenConstants.OPTIONAL_PROJECT_FILE))
174+
{
175+
setOptionalProjectFileFlag(Boolean.valueOf(
176+
additionalProperties.get(CodegenConstants.OPTIONAL_PROJECT_FILE).toString()));
177+
}
178+
179+
if (additionalProperties.containsKey(CodegenConstants.OPTIONAL_PROJECT_GUID))
180+
{
181+
setPackageGuid((String) additionalProperties.get(CodegenConstants.OPTIONAL_PROJECT_GUID));
182+
}
183+
additionalProperties.put("packageGuid", packageGuid);
184+
168185
if (additionalProperties.containsKey(CodegenConstants.OPTIONAL_METHOD_ARGUMENT)) {
169186
setOptionalMethodArgumentFlag(Boolean.valueOf(additionalProperties
170187
.get(CodegenConstants.OPTIONAL_METHOD_ARGUMENT).toString()));
@@ -175,15 +192,28 @@ public void processOpts() {
175192
setOptionalAssemblyInfoFlag(Boolean.valueOf(additionalProperties
176193
.get(CodegenConstants.OPTIONAL_ASSEMBLY_INFO).toString()));
177194
}
178-
195+
196+
String packageFolder = sourceFolder + File.separator + packageName.replace(".", java.io.File.separator);
197+
String clientPackageDir = sourceFolder + File.separator + clientPackage.replace(".", java.io.File.separator);
198+
199+
//Compute the relative path to the bin directory where the external assemblies live
200+
//This is necessary to properly generate the project file
201+
int packageDepth = packageFolder.length() - packageFolder.replace(java.io.File.separator, "").length();
202+
String binRelativePath = "..\\";
203+
for (int i=0; i < packageDepth; i = i+1)
204+
binRelativePath += "..\\";
205+
binRelativePath += "bin\\";
206+
additionalProperties.put("binRelativePath", binRelativePath);
207+
179208
supportingFiles.add(new SupportingFile("Configuration.mustache",
180-
sourceFolder + File.separator + clientPackage.replace(".", java.io.File.separator), "Configuration.cs"));
209+
clientPackageDir, "Configuration.cs"));
181210
supportingFiles.add(new SupportingFile("ApiClient.mustache",
182-
sourceFolder + File.separator + clientPackage.replace(".", java.io.File.separator), "ApiClient.cs"));
211+
clientPackageDir, "ApiClient.cs"));
183212
supportingFiles.add(new SupportingFile("ApiException.mustache",
184-
sourceFolder + File.separator + clientPackage.replace(".", java.io.File.separator), "ApiException.cs"));
213+
clientPackageDir, "ApiException.cs"));
185214
supportingFiles.add(new SupportingFile("ApiResponse.mustache",
186-
sourceFolder + File.separator + clientPackage.replace(".", java.io.File.separator), "ApiResponse.cs"));
215+
clientPackageDir, "ApiResponse.cs"));
216+
187217
supportingFiles.add(new SupportingFile("Newtonsoft.Json.dll", "bin", "Newtonsoft.Json.dll"));
188218
supportingFiles.add(new SupportingFile("RestSharp.dll", "bin", "RestSharp.dll"));
189219
supportingFiles.add(new SupportingFile("compile.mustache", "", "compile.bat"));
@@ -192,9 +222,11 @@ public void processOpts() {
192222
supportingFiles.add(new SupportingFile("README.md", "", "README.md"));
193223

194224
if (optionalAssemblyInfoFlag) {
195-
supportingFiles.add(new SupportingFile("AssemblyInfo.mustache", "src" + File.separator + "Properties", "AssemblyInfo.cs"));
225+
supportingFiles.add(new SupportingFile("AssemblyInfo.mustache", packageFolder + File.separator + "Properties", "AssemblyInfo.cs"));
226+
}
227+
if (optionalProjectFileFlag) {
228+
supportingFiles.add(new SupportingFile("Project.mustache", packageFolder, clientPackage + ".csproj"));
196229
}
197-
198230
}
199231

200232
@Override
@@ -339,6 +371,10 @@ public void setOptionalAssemblyInfoFlag(boolean flag) {
339371
this.optionalAssemblyInfoFlag = flag;
340372
}
341373

374+
public void setOptionalProjectFileFlag(boolean flag) {
375+
this.optionalProjectFileFlag = flag;
376+
}
377+
342378
public void setOptionalMethodArgumentFlag(boolean flag) {
343379
this.optionalMethodArgumentFlag = flag;
344380
}
@@ -351,7 +387,10 @@ public void useDateTimeOffset(boolean flag) {
351387
typeMapping.put("datetime", "DateTime?");
352388
}
353389

354-
390+
public void setPackageGuid(String packageGuid) {
391+
this.packageGuid = packageGuid;
392+
}
393+
355394
public void setPackageName(String packageName) {
356395
this.packageName = packageName;
357396
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+
<PropertyGroup>
4+
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
5+
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
6+
<ProjectGuid>{{packageGuid}}</ProjectGuid>
7+
<OutputType>Library</OutputType>
8+
<AppDesignerFolder>Properties</AppDesignerFolder>
9+
<RootNamespace>{{packageTitle}}</RootNamespace>
10+
<AssemblyName>{{packageTitle}}</AssemblyName>
11+
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
12+
<FileAlignment>512</FileAlignment>
13+
</PropertyGroup>
14+
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
15+
<DebugSymbols>true</DebugSymbols>
16+
<DebugType>full</DebugType>
17+
<Optimize>false</Optimize>
18+
<OutputPath>bin\Debug\</OutputPath>
19+
<DefineConstants>DEBUG;TRACE</DefineConstants>
20+
<ErrorReport>prompt</ErrorReport>
21+
<WarningLevel>4</WarningLevel>
22+
</PropertyGroup>
23+
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
24+
<DebugType>pdbonly</DebugType>
25+
<Optimize>true</Optimize>
26+
<OutputPath>bin\Release\</OutputPath>
27+
<DefineConstants>TRACE</DefineConstants>
28+
<ErrorReport>prompt</ErrorReport>
29+
<WarningLevel>4</WarningLevel>
30+
</PropertyGroup>
31+
<ItemGroup>
32+
<Reference Include="System" />
33+
<Reference Include="System.Core" />
34+
<Reference Include="System.Net.Http" />
35+
<Reference Include="System.Net.Http.WebRequest" />
36+
<Reference Include="System.Xml.Linq" />
37+
<Reference Include="System.Data.DataSetExtensions" />
38+
<Reference Include="Microsoft.CSharp" />
39+
<Reference Include="System.Data" />
40+
<Reference Include="System.Runtime.Serialization" />
41+
<Reference Include="System.Xml" />
42+
<Reference Include="Newtonsoft.Json">
43+
<SpecificVersion>False</SpecificVersion>
44+
<HintPath>{{binRelativePath}}Newtonsoft.Json.dll</HintPath>
45+
</Reference>
46+
<Reference Include="RestSharp">
47+
<HintPath>{{binRelativePath}}RestSharp.dll</HintPath>
48+
</Reference>
49+
</ItemGroup>
50+
<ItemGroup>
51+
<Compile Include="Properties\AssemblyInfo.cs"/>
52+
<Compile Include="Api\*.cs"/>
53+
<Compile Include="Client\*.cs"/>
54+
<Compile Include="Model\*.cs"/>
55+
</ItemGroup>
56+
<Import Project="$(MsBuildToolsPath)\Microsoft.CSharp.targets" />
57+
</Project>
58+

modules/swagger-codegen/src/test/java/io/swagger/codegen/csharp/CSharpClientOptionsTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ protected void setExpectations() {
3838
times = 1;
3939
clientCodegen.useDateTimeOffset(true);
4040
times = 1;
41+
clientCodegen.setOptionalProjectFileFlag(true);
42+
times = 1;
43+
clientCodegen.setPackageGuid(CSharpClientOptionsProvider.PACKAGE_GUID_VALUE);
44+
times = 1;
4145
}};
4246
}
4347
}

modules/swagger-codegen/src/test/java/io/swagger/codegen/options/CSharpClientOptionsProvider.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ public class CSharpClientOptionsProvider implements OptionsProvider {
1010
public static final String PACKAGE_NAME_VALUE = "swagger_client_csharp";
1111
public static final String PACKAGE_VERSION_VALUE = "1.0.0-SNAPSHOT";
1212
public static final String SOURCE_FOLDER_VALUE = "src_csharp";
13+
public static final String PACKAGE_GUID_VALUE = "{894EAEBB-649A-498C-A735-10D0BD7B73E0}";
1314

1415
@Override
1516
public String getLanguage() {
@@ -26,6 +27,8 @@ public Map<String, String> createOptions() {
2627
.put(CodegenConstants.OPTIONAL_ASSEMBLY_INFO, "true")
2728
.put(CodegenConstants.USE_DATETIME_OFFSET, "true")
2829
.put(CodegenConstants.SOURCE_FOLDER, SOURCE_FOLDER_VALUE)
30+
.put(CodegenConstants.OPTIONAL_PROJECT_FILE, "true")
31+
.put(CodegenConstants.OPTIONAL_PROJECT_GUID, PACKAGE_GUID_VALUE)
2932
.build();
3033
}
3134

0 commit comments

Comments
 (0)