public static async Task <IReadOnlyCollection <FileInfo> > GenerateClientSourceCode(ProgramOptions options) { var schema = await GraphQlGenerator.RetrieveSchema(options.ServiceUrl, options.Authorization); var generatorConfiguration = new GraphQlGeneratorConfiguration { CSharpVersion = options.CSharpVersion, ClassPostfix = options.ClassPostfix, GeneratePartialClasses = options.PartialClasses, MemberAccessibility = options.MemberAccessibility, IdTypeMapping = options.IdTypeMapping }; var generator = new GraphQlGenerator(generatorConfiguration); if (options.OutputType == OutputType.SingleFile) { await File.WriteAllTextAsync(options.OutputPath, generator.GenerateFullClientCSharpFile(schema, options.Namespace)); return(new[] { new FileInfo(options.OutputPath) }); } var multipleFileGenerationContext = new MultipleFileGenerationContext(schema, options.OutputPath, options.Namespace); generator.Generate(multipleFileGenerationContext); return(multipleFileGenerationContext.Files); }
private static async Task GenerateClientSourceCode(ProgramOptions options, List <FileInfo> generatedFiles) { GraphQlSchema schema; if (String.IsNullOrWhiteSpace(options.ServiceUrl)) { schema = GraphQlGenerator.DeserializeGraphQlSchema(await File.ReadAllTextAsync(options.SchemaFileName)); } else { if (!KeyValueParameterParser.TryGetCustomHeaders(options.Header, out var headers, out var headerParsingErrorMessage)) { throw new InvalidOperationException(headerParsingErrorMessage); } schema = await GraphQlGenerator.RetrieveSchema(new HttpMethod(options.HttpMethod), options.ServiceUrl, headers); } var generatorConfiguration = new GraphQlGeneratorConfiguration { CSharpVersion = options.CSharpVersion, ClassPrefix = options.ClassPrefix, ClassSuffix = options.ClassSuffix, GeneratePartialClasses = options.PartialClasses, MemberAccessibility = options.MemberAccessibility, IdTypeMapping = options.IdTypeMapping, FloatTypeMapping = options.FloatTypeMapping, JsonPropertyGeneration = options.JsonPropertyAttribute }; if (!KeyValueParameterParser.TryGetCustomClassMapping(options.ClassMapping, out var customMapping, out var customMappingParsingErrorMessage)) { throw new InvalidOperationException(customMappingParsingErrorMessage); } foreach (var kvp in customMapping) { generatorConfiguration.CustomClassNameMapping.Add(kvp); } var generator = new GraphQlGenerator(generatorConfiguration); if (options.OutputType == OutputType.SingleFile) { await File.WriteAllTextAsync(options.OutputPath, generator.GenerateFullClientCSharpFile(schema, options.Namespace)); generatedFiles.Add(new FileInfo(options.OutputPath)); } else { var multipleFileGenerationContext = new MultipleFileGenerationContext(schema, options.OutputPath, options.Namespace); generator.Generate(multipleFileGenerationContext); generatedFiles.AddRange(multipleFileGenerationContext.Files); } }
public void MultipleFileGeneration() { var configuration = new GraphQlGeneratorConfiguration { CommentGeneration = CommentGenerationOption.CodeSummary | CommentGenerationOption.DescriptionAttribute, CSharpVersion = CSharpVersion.Newest }; var generator = new GraphQlGenerator(configuration); var tempPath = Path.GetTempPath(); var directoryInfo = Directory.CreateDirectory(Path.Combine(tempPath, "GraphQlGeneratorTest")); try { var context = new MultipleFileGenerationContext(DeserializeTestSchema("TestSchema2"), directoryInfo.FullName, "GraphQlGeneratorTest", "GraphQlGeneratorTest.csproj"); generator.Generate(context); var files = directoryInfo.GetFiles().OrderBy(f => f.Name).ToArray(); var fileNames = files.Select(f => f.Name); fileNames.ShouldBe( new[] { "About.cs", "AboutItem.cs", "AboutItemQueryBuilder.cs", "AboutQueryBuilder.cs", "Address.cs", "AddressQueryBuilder.cs", "AppState.cs", "AppStateFronScreen.cs", "AppStateFronScreenMutation.cs", "AppStateFronScreenQueryBuilder.cs", "AppStateJourney.cs", "AppStateJourneyMutation.cs", "AppStateJourneyQueryBuilder.cs", "AppStateMutation.cs", "AppStateQueryBuilder.cs", "Avatar.cs", "AwayMode.cs", "AwayModeQueryBuilder.cs", "AwayModeSettings.cs", "AwayModeSettingsQueryBuilder.cs", "BaseClasses.cs", "Comparison.cs", "ComparisonData.cs", "ComparisonDataQueryBuilder.cs", "ComparisonQueryBuilder.cs", "Consumption.cs", "ConsumptionMonth.cs", "ConsumptionMonthQueryBuilder.cs", "ConsumptionQueryBuilder.cs", "CreditCard.cs", "CreditCardQueryBuilder.cs", "DayNightSchedule.cs", "DayNightScheduleQueryBuilder.cs", "DayNightScheduleSettings.cs", "DayNightScheduleSettingsQueryBuilder.cs", "Disaggregation.cs", "DisaggregationQueryBuilder.cs", "EnergyDeal.cs", "EnergyDealQueryBuilder.cs", "Feed.cs", "FeedItem.cs", "FeedItemQueryBuilder.cs", "FeedQueryBuilder.cs", "GqlMutationError.cs", "GqlMutationErrorQueryBuilder.cs", "GqlMutationGeneralResponse.cs", "GqlMutationGeneralResponseQueryBuilder.cs", "GraphQlGeneratorTest.csproj", "GraphQlTypes.cs", "Greeting.cs", "GreetingQueryBuilder.cs", "Home.cs", "HomeMutation.cs", "HomeMutationQueryBuilder.cs", "HomeProfileQuestion.cs", "HomeProfileQuestionAnswer.cs", "HomeProfileQuestionInput.cs", "HomeProfileQuestionInputQueryBuilder.cs", "HomeProfileQuestionQueryBuilder.cs", "HomeQueryBuilder.cs", "IncludeDirective.cs", "Invoice.cs", "InvoicePayment.cs", "InvoicePaymentQueryBuilder.cs", "InvoiceQueryBuilder.cs", "InvoiceSection.cs", "InvoiceSectionQueryBuilder.cs", "Me.cs", "MeMutation.cs", "MeMutationQueryBuilder.cs", "MeQueryBuilder.cs", "Mutation.cs", "MutationQueryBuilder.cs", "PairableDevice.cs", "PairableDeviceOAuth.cs", "PairableDeviceOAuthQueryBuilder.cs", "PairableDeviceQueryBuilder.cs", "PairDeviceResult.cs", "PairDeviceResultQueryBuilder.cs", "PaymentMethod.cs", "PaymentMethodQueryBuilder.cs", "PreLiveComparison.cs", "PreLiveComparisonQueryBuilder.cs", "PriceRating.cs", "PriceRatingColorOffset.cs", "PriceRatingColorOffsetQueryBuilder.cs", "PriceRatingEntry.cs", "PriceRatingEntryQueryBuilder.cs", "PriceRatingQueryBuilder.cs", "PriceRatingRoot.cs", "PriceRatingRootQueryBuilder.cs", "ProcessStep.cs", "ProcessStepQueryBuilder.cs", "Producer.cs", "ProducerBullet.cs", "ProducerBulletQueryBuilder.cs", "ProducerQueryBuilder.cs", "Production.cs", "ProductionMonth.cs", "ProductionMonthQueryBuilder.cs", "ProductionQueryBuilder.cs", "ProductionValue.cs", "ProductionValueQueryBuilder.cs", "PushNotification.cs", "PushNotificationQueryBuilder.cs", "Query.cs", "QueryQueryBuilder.cs", "Report.cs", "ReportCell.cs", "ReportCellQueryBuilder.cs", "ReportQueryBuilder.cs", "ReportRoot.cs", "ReportRootQueryBuilder.cs", "Resolution.cs", "Sensor.cs", "SensorHistory.cs", "SensorHistoryQueryBuilder.cs", "SensorHistoryValue.cs", "SensorHistoryValueQueryBuilder.cs", "SensorQueryBuilder.cs", "SignupStatus.cs", "SignupStatusQueryBuilder.cs", "SkipDirective.cs", "Subscription.cs", "SubscriptionQueryBuilder.cs", "Thermostat.cs", "ThermostatCapability.cs", "ThermostatCapabilityQueryBuilder.cs", "ThermostatMeasurement.cs", "ThermostatMeasurementQueryBuilder.cs", "ThermostatMeasurements.cs", "ThermostatMeasurementsQueryBuilder.cs", "ThermostatMode.cs", "ThermostatModeQueryBuilder.cs", "ThermostatMutation.cs", "ThermostatMutationQueryBuilder.cs", "ThermostatQueryBuilder.cs", "ThermostatState.cs", "ThermostatStateQueryBuilder.cs", "Wallet.cs", "WalletQueryBuilder.cs", "Weather.cs", "WeatherEntry.cs", "WeatherEntryQueryBuilder.cs", "WeatherQueryBuilder.cs" }); var fileSizes = files.Where(f => f.Name != "BaseClasses.cs").Select(f => f.Length); fileSizes.ShouldBe( new long[] { 370, 399, 1295, 1082, 902, 4131, 443, 493, 2056, 1831, 379, 1038, 1076, 1609, 1675, 680, 418, 1507, 422, 1334, 716, 415, 1365, 4006, 887, 686, 3557, 4906, 402, 1312, 490, 2119, 537, 2296, 1149, 6812, 371, 1153, 495, 600, 2706, 2476, 413, 1389, 385, 1215, 368, 5985, 518, 2132, 1881, 845, 7805, 803, 1454, 417, 1433, 4626, 17076, 731, 1550, 551, 2587, 9743, 896, 5100, 1025, 476, 3221, 7042, 358, 1339, 467, 425, 1445, 1890, 499, 2175, 455, 1733, 545, 2501, 691, 495, 1921, 505, 2085, 3516, 679, 3759, 512, 2080, 600, 461, 1749, 2837, 996, 719, 3864, 5591, 822, 4380, 444, 1682, 347, 1283, 588, 675, 3451, 2781, 374, 1105, 404, 513, 483, 1902, 472, 1765, 2209, 483, 2143, 706, 777, 4324, 862, 454, 1756, 796, 4433, 508, 2005, 425, 1388, 413, 2590, 4949, 510, 2124, 482, 1874, 485, 1154, 3506, 1874 }); var expectedOutput = GetTestResource("ExpectedMultipleFilesContext.Avatar"); File.ReadAllText(Path.Combine(directoryInfo.FullName, "Avatar.cs")).ShouldBe(expectedOutput); expectedOutput = GetTestResource("ExpectedMultipleFilesContext.Home"); File.ReadAllText(Path.Combine(directoryInfo.FullName, "Home.cs")).ShouldBe(expectedOutput); expectedOutput = GetTestResource("ExpectedMultipleFilesContext.IncludeDirective"); File.ReadAllText(Path.Combine(directoryInfo.FullName, "IncludeDirective.cs")).ShouldBe(expectedOutput); expectedOutput = GetTestResource("ExpectedMultipleFilesContext.MutationQueryBuilder"); File.ReadAllText(Path.Combine(directoryInfo.FullName, "MutationQueryBuilder.cs")).ShouldBe(expectedOutput); } finally { Directory.Delete(directoryInfo.FullName, true); } }
public void MultipleFileGeneration() { var configuration = new GraphQlGeneratorConfiguration { CommentGeneration = CommentGenerationOption.CodeSummary | CommentGenerationOption.DescriptionAttribute, CSharpVersion = CSharpVersion.Newest }; var generator = new GraphQlGenerator(configuration); var tempPath = Path.GetTempPath(); var directoryInfo = Directory.CreateDirectory(Path.Combine(tempPath, "GraphQlGeneratorTest")); try { var context = new MultipleFileGenerationContext(DeserializeTestSchema("TestSchema2"), directoryInfo.FullName, "GraphQlGeneratorTest", "GraphQlGeneratorTest.csproj"); generator.Generate(context); var files = directoryInfo.GetFiles().OrderBy(f => f.Name).ToArray(); var fileNames = files.Select(f => f.Name); fileNames.ShouldBe( new[] { "About.cs", "AboutItem.cs", "AboutItemQueryBuilder.cs", "AboutQueryBuilder.cs", "Address.cs", "AddressQueryBuilder.cs", "AppState.cs", "AppStateFronScreen.cs", "AppStateFronScreenMutation.cs", "AppStateFronScreenQueryBuilder.cs", "AppStateJourney.cs", "AppStateJourneyMutation.cs", "AppStateJourneyQueryBuilder.cs", "AppStateMutation.cs", "AppStateQueryBuilder.cs", "Avatar.cs", "AwayMode.cs", "AwayModeQueryBuilder.cs", "AwayModeSettings.cs", "AwayModeSettingsQueryBuilder.cs", "BaseClasses.cs", "Comparison.cs", "ComparisonData.cs", "ComparisonDataQueryBuilder.cs", "ComparisonQueryBuilder.cs", "Consumption.cs", "ConsumptionMonth.cs", "ConsumptionMonthQueryBuilder.cs", "ConsumptionQueryBuilder.cs", "CreditCard.cs", "CreditCardQueryBuilder.cs", "DayNightSchedule.cs", "DayNightScheduleQueryBuilder.cs", "DayNightScheduleSettings.cs", "DayNightScheduleSettingsQueryBuilder.cs", "Disaggregation.cs", "DisaggregationQueryBuilder.cs", "EnergyDeal.cs", "EnergyDealQueryBuilder.cs", "Feed.cs", "FeedItem.cs", "FeedItemQueryBuilder.cs", "FeedQueryBuilder.cs", "GqlMutationError.cs", "GqlMutationErrorQueryBuilder.cs", "GqlMutationGeneralResponse.cs", "GqlMutationGeneralResponseQueryBuilder.cs", "GraphQlGeneratorTest.csproj", "GraphQlTypes.cs", "Greeting.cs", "GreetingQueryBuilder.cs", "Home.cs", "HomeMutation.cs", "HomeMutationQueryBuilder.cs", "HomeProfileQuestion.cs", "HomeProfileQuestionAnswer.cs", "HomeProfileQuestionInput.cs", "HomeProfileQuestionInputQueryBuilder.cs", "HomeProfileQuestionQueryBuilder.cs", "HomeQueryBuilder.cs", "IncludeDirective.cs", "Invoice.cs", "InvoicePayment.cs", "InvoicePaymentQueryBuilder.cs", "InvoiceQueryBuilder.cs", "InvoiceSection.cs", "InvoiceSectionQueryBuilder.cs", "Me.cs", "MeMutation.cs", "MeMutationQueryBuilder.cs", "MeQueryBuilder.cs", "Mutation.cs", "MutationQueryBuilder.cs", "PairableDevice.cs", "PairableDeviceOAuth.cs", "PairableDeviceOAuthQueryBuilder.cs", "PairableDeviceQueryBuilder.cs", "PairDeviceResult.cs", "PairDeviceResultQueryBuilder.cs", "PaymentMethod.cs", "PaymentMethodQueryBuilder.cs", "PreLiveComparison.cs", "PreLiveComparisonQueryBuilder.cs", "PriceRating.cs", "PriceRatingColorOffset.cs", "PriceRatingColorOffsetQueryBuilder.cs", "PriceRatingEntry.cs", "PriceRatingEntryQueryBuilder.cs", "PriceRatingQueryBuilder.cs", "PriceRatingRoot.cs", "PriceRatingRootQueryBuilder.cs", "ProcessStep.cs", "ProcessStepQueryBuilder.cs", "Producer.cs", "ProducerBullet.cs", "ProducerBulletQueryBuilder.cs", "ProducerQueryBuilder.cs", "Production.cs", "ProductionMonth.cs", "ProductionMonthQueryBuilder.cs", "ProductionQueryBuilder.cs", "ProductionValue.cs", "ProductionValueQueryBuilder.cs", "PushNotification.cs", "PushNotificationQueryBuilder.cs", "Query.cs", "QueryQueryBuilder.cs", "Report.cs", "ReportCell.cs", "ReportCellQueryBuilder.cs", "ReportQueryBuilder.cs", "ReportRoot.cs", "ReportRootQueryBuilder.cs", "Resolution.cs", "Sensor.cs", "SensorHistory.cs", "SensorHistoryQueryBuilder.cs", "SensorHistoryValue.cs", "SensorHistoryValueQueryBuilder.cs", "SensorQueryBuilder.cs", "SignupStatus.cs", "SignupStatusQueryBuilder.cs", "SkipDirective.cs", "Subscription.cs", "SubscriptionQueryBuilder.cs", "Thermostat.cs", "ThermostatCapability.cs", "ThermostatCapabilityQueryBuilder.cs", "ThermostatMeasurement.cs", "ThermostatMeasurementQueryBuilder.cs", "ThermostatMeasurements.cs", "ThermostatMeasurementsQueryBuilder.cs", "ThermostatMode.cs", "ThermostatModeQueryBuilder.cs", "ThermostatMutation.cs", "ThermostatMutationQueryBuilder.cs", "ThermostatQueryBuilder.cs", "ThermostatState.cs", "ThermostatStateQueryBuilder.cs", "Wallet.cs", "WalletQueryBuilder.cs", "Weather.cs", "WeatherEntry.cs", "WeatherEntryQueryBuilder.cs", "WeatherQueryBuilder.cs" }); var fileSizes = files.Where(f => f.Name != "BaseClasses.cs").Select(f => f.Length); fileSizes.ShouldBe( new long[] { 446, 475, 1371, 1158, 978, 4207, 519, 569, 2132, 1907, 455, 1114, 1152, 1685, 1751, 756, 494, 1583, 498, 1410, 792, 491, 1441, 4082, 963, 762, 3633, 4982, 478, 1388, 566, 2195, 613, 2372, 1225, 6888, 447, 1229, 571, 676, 2782, 2552, 489, 1465, 461, 1291, 368, 6061, 594, 2208, 1957, 921, 7881, 879, 1530, 493, 1509, 4702, 17152, 807, 1626, 627, 2663, 9819, 972, 5176, 1101, 552, 3297, 7118, 434, 1415, 543, 501, 1521, 1966, 575, 2251, 531, 1809, 621, 2577, 767, 571, 1997, 581, 2161, 3592, 755, 3835, 588, 2156, 676, 537, 1825, 2913, 1072, 795, 3940, 5667, 898, 4456, 520, 1758, 423, 1359, 664, 751, 3527, 2857, 450, 1181, 480, 589, 559, 1978, 548, 1841, 2285, 559, 2219, 782, 853, 4400, 938, 530, 1832, 872, 4509, 584, 2081, 501, 1464, 489, 2666, 5025, 586, 2200, 558, 1950, 561, 1230, 3582, 1950 }); var expectedOutput = GetTestResource("ExpectedMultipleFilesContext.Avatar"); File.ReadAllText(Path.Combine(directoryInfo.FullName, "Avatar.cs")).ShouldBe(expectedOutput); expectedOutput = GetTestResource("ExpectedMultipleFilesContext.Home"); File.ReadAllText(Path.Combine(directoryInfo.FullName, "Home.cs")).ShouldBe(expectedOutput); expectedOutput = GetTestResource("ExpectedMultipleFilesContext.IncludeDirective"); File.ReadAllText(Path.Combine(directoryInfo.FullName, "IncludeDirective.cs")).ShouldBe(expectedOutput); expectedOutput = GetTestResource("ExpectedMultipleFilesContext.MutationQueryBuilder"); File.ReadAllText(Path.Combine(directoryInfo.FullName, "MutationQueryBuilder.cs")).ShouldBe(expectedOutput); } finally { Directory.Delete(directoryInfo.FullName, true); } }
public static async Task <IReadOnlyCollection <FileInfo> > GenerateClientSourceCode(ProgramOptions options) { var isServiceUrlMissing = String.IsNullOrWhiteSpace(options.ServiceUrl); if (isServiceUrlMissing && String.IsNullOrWhiteSpace(options.SchemaFileName)) { System.Console.WriteLine("ERROR: Either \"serviceUrl\" or \"schemaFileName\" parameter must be specified. "); Environment.Exit(4); } if (!isServiceUrlMissing && !String.IsNullOrWhiteSpace(options.SchemaFileName)) { System.Console.WriteLine("ERROR: \"serviceUrl\" and \"schemaFileName\" parameters are mutually exclusive. "); Environment.Exit(5); } GraphQlSchema schema; if (isServiceUrlMissing) { schema = GraphQlGenerator.DeserializeGraphQlSchema(await File.ReadAllTextAsync(options.SchemaFileName)); } else { if (!KeyValueParameterParser.TryGetCustomHeaders(options.Headers, out var headers, out var headerParsingErrorMessage)) { System.Console.WriteLine("ERROR: " + headerParsingErrorMessage); Environment.Exit(3); } schema = await GraphQlGenerator.RetrieveSchema(options.ServiceUrl, headers); } var generatorConfiguration = new GraphQlGeneratorConfiguration { CSharpVersion = options.CSharpVersion, ClassPrefix = options.ClassPrefix, ClassSuffix = options.ClassSuffix, GeneratePartialClasses = options.PartialClasses, MemberAccessibility = options.MemberAccessibility, IdTypeMapping = options.IdTypeMapping, FloatTypeMapping = options.FloatTypeMapping, JsonPropertyGeneration = options.JsonPropertyAttribute }; if (!KeyValueParameterParser.TryGetCustomClassMapping(options.ClassMapping, out var customMapping, out var customMappingParsingErrorMessage)) { System.Console.WriteLine("ERROR: " + customMappingParsingErrorMessage); Environment.Exit(3); } foreach (var kvp in customMapping) { generatorConfiguration.CustomClassNameMapping.Add(kvp); } var generator = new GraphQlGenerator(generatorConfiguration); if (options.OutputType == OutputType.SingleFile) { await File.WriteAllTextAsync(options.OutputPath, generator.GenerateFullClientCSharpFile(schema, options.Namespace)); return(new[] { new FileInfo(options.OutputPath) }); } var multipleFileGenerationContext = new MultipleFileGenerationContext(schema, options.OutputPath, options.Namespace); generator.Generate(multipleFileGenerationContext); return(multipleFileGenerationContext.Files); }