Skip to content

Commit a8e90ee

Browse files
committed
include additional files in processing set (for sharing fragments)
1 parent 285b7a2 commit a8e90ee

File tree

10 files changed

+189
-4
lines changed

10 files changed

+189
-4
lines changed

Tocsoft.GraphQLCodeGen.Cli/CodeGenerator.cs

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -154,17 +154,32 @@ private List<string> DefaultTemplates(string outputPath)
154154
public IEnumerable<CodeGeneratorSettings> GenerateSettings(CodeGeneratorSettingsLoaderDefaults settings, IEnumerable<string> paths)
155155
{
156156
var root = Directory.GetCurrentDirectory();
157-
IEnumerable<string> sourceFilePaths = paths.SelectMany(x => GlobExpander.FindFiles(root, x));
158157

159-
var sourceFiles = sourceFilePaths.Select(x => Load(x, settings)).ToList();
158+
// we need to multi pass the source files looking for items to load
159+
var toProcess = new Queue<string>(paths.SelectMany(x => GlobExpander.FindFiles(root, x)));
160+
List<SimpleSourceFile> sourceFiles = new List<SimpleSourceFile>();
161+
List<string> processedPaths = new List<string>();
162+
while (toProcess.Any())
163+
{
164+
var path = toProcess.Dequeue();
165+
processedPaths.Add(path);
166+
var loaded = Load(path, settings);
167+
var newPaths = loaded.Includes.Where(x => !processedPaths.Contains(x));
168+
foreach (var p in newPaths)
169+
{
170+
toProcess.Enqueue(p);
171+
}
172+
sourceFiles.Add(loaded);
173+
174+
}
160175

161176
var grouped = sourceFiles.GroupBy(x => new
162177
{
163178
x.ClassName,
164179
x.OutputPath,
165180
x.Format,
166181
hash = x.SettingsHash()
167-
});
182+
}).ToList();
168183

169184

170185
return grouped.Select(x =>
@@ -213,6 +228,9 @@ internal class SimpleSettings
213228
[JsonConverter(typeof(SingleOrArrayConverter<string>))]
214229
public List<string> Template { get; set; }
215230

231+
[JsonConverter(typeof(SingleOrArrayConverter<string>))]
232+
public List<string> Include { get; set; }
233+
216234
public bool Root { get; set; } = false;
217235
}
218236

@@ -230,7 +248,6 @@ private void LoadSettingsTree(SimpleSourceFile file)
230248
{
231249
Stack<SimpleSettings> settingsList = new Stack<SimpleSettings>();
232250
var directory = Path.GetDirectoryName(file.Path);
233-
var rooted = false;
234251
while (directory != null)
235252
{
236253
var settingsFile = Path.Combine(directory, "gqlsettings.json");
@@ -300,6 +317,10 @@ private SimpleSourceFile Load(string path, CodeGeneratorSettingsLoaderDefaults s
300317
var templateFiles = GlobExpander.FindFiles(root, m.val);
301318
file.Templates.AddRange(templateFiles);
302319
break;
320+
case "include":
321+
var includeFiles = GlobExpander.FindFiles(root, m.val);
322+
file.Includes.AddRange(includeFiles);
323+
break;
303324
default:
304325
break;
305326
}
@@ -375,6 +396,15 @@ private bool ExpandSettings(string path, SimpleSourceFile file)
375396
}
376397
}
377398

399+
if (settings.Include != null)
400+
{
401+
foreach (var t in settings.Include)
402+
{
403+
var files = GlobExpander.FindFiles(root, t);
404+
file.Includes.AddRange(files);
405+
}
406+
}
407+
378408
if (string.IsNullOrWhiteSpace(file.SchemaSource?.Location))
379409
{
380410
if (settings.Schema != null && !string.IsNullOrWhiteSpace(settings.Schema.Location))
@@ -429,6 +459,7 @@ internal class SimpleSourceFile
429459
public string ClassName { get; set; }
430460
public string OutputPath { get; set; }
431461
public List<string> Templates { get; set; } = new List<string>();
462+
public List<string> Includes { get; set; } = new List<string>();
432463
public SchemaSource SchemaSource { get; set; }
433464

434465
internal string SettingsHash()
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#! schema:schema.gql
2+
#! output: Client.cs
3+
#! class: Sample.Client.GitHub.GitHubClient
4+
5+
fragment user on User {
6+
id,
7+
username
8+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
schema
2+
{
3+
query: Query
4+
}
5+
6+
type User {
7+
id: ID!
8+
username: String
9+
first_name: String
10+
last_name: String
11+
full_name: String
12+
name: String @deprecated
13+
}
14+
15+
type Query {
16+
User(id: ID!): User
17+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#! schema:schema.gql
2+
#! output: Client.cs
3+
#! class: Sample.Client.GitHub.GitHubClient
4+
#! include: include.gql
5+
6+
query ($login:ID!){
7+
User(id: $login){
8+
...user
9+
}
10+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"root": true,
3+
"schema": "schema.gql",
4+
"output": "Client.cs",
5+
"class": "Sample.Client.GitHub.GitHubClient",
6+
"include": "include.gql"
7+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
fragment user on User {
2+
id,
3+
username
4+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
schema
2+
{
3+
query: Query
4+
}
5+
6+
type User {
7+
id: ID!
8+
username: String
9+
first_name: String
10+
last_name: String
11+
full_name: String
12+
name: String @deprecated
13+
}
14+
15+
type Query {
16+
User(id: ID!): User
17+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
query ($login:ID!){
2+
User(id: $login){
3+
...user
4+
}
5+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
using System;
2+
using System.Linq;
3+
using System.Threading.Tasks;
4+
using Tocsoft.GraphQLCodeGen.Cli;
5+
using Xunit;
6+
7+
namespace Tocsoft.GraphQLCodeGen.Tests
8+
{
9+
public class Includes
10+
{
11+
FakeLogger logger;
12+
CodeGeneratorSettingsLoader settingsLoader;
13+
public Includes()
14+
{
15+
logger = new FakeLogger();
16+
settingsLoader = new CodeGeneratorSettingsLoader(logger);
17+
}
18+
19+
[Theory]
20+
[InlineData("./Files/Includes/using_includes.gql")]
21+
[InlineData("./Files/Includes_Settings/using_includes.gql")]
22+
public async Task LoadFieldsFromFragments(string rootQuery)
23+
{
24+
var settings = settingsLoader.GenerateSettings(new CodeGeneratorSettingsLoaderDefaults(), new[] { rootQuery });
25+
26+
CodeGenerator generator = new CodeGenerator(logger, settings.Single());
27+
28+
await generator.LoadSource();
29+
generator.Parse();
30+
31+
var model = generator.Model;
32+
33+
var resultType = Assert.Single(model.Types.Where(x => x.Name == "user" && x.IsInterface));
34+
}
35+
36+
37+
[Theory]
38+
[InlineData("./Files/Includes/using_includes.gql")]
39+
[InlineData("./Files/Includes_Settings/using_includes.gql")]
40+
public async Task RenderInterfaces(string rootQuery)
41+
{
42+
var settings = settingsLoader.GenerateSettings(new CodeGeneratorSettingsLoaderDefaults(), new[] { rootQuery });
43+
44+
CodeGenerator generator = new CodeGenerator(logger, settings.Single());
45+
46+
await generator.LoadSource();
47+
generator.Parse();
48+
generator.Render();
49+
var code = generator.GeneratedCode;
50+
51+
Assert.Contains("interface IUser", code);
52+
Assert.Contains("class UserResult : IUser", code);
53+
Assert.Contains(@"query ($login:ID!){
54+
User(id: $login){
55+
...user
56+
}
57+
}
58+
fragment user on User {
59+
id,
60+
username
61+
}".Trim().Replace("\r",""), code.Replace("\r", ""));
62+
}
63+
}
64+
65+
}

Tocsoft.GraphQLCodeGen.Tests/Tocsoft.GraphQLCodeGen.Tests.csproj

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,27 @@
4545
</ItemGroup>
4646

4747
<ItemGroup>
48+
<None Update="Files\Includes_Settings\gqlsettings.json">
49+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
50+
</None>
51+
<None Update="Files\Includes_Settings\include.gql">
52+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
53+
</None>
54+
<None Update="Files\Includes_Settings\schema.gql">
55+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
56+
</None>
57+
<None Update="Files\Includes_Settings\using_includes.gql">
58+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
59+
</None>
60+
<None Update="Files\Includes\schema.gql">
61+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
62+
</None>
63+
<None Update="Files\Includes\using_includes.gql">
64+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
65+
</None>
66+
<None Update="Files\Includes\include.gql">
67+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
68+
</None>
4869
<None Update="Files\Fragements\schema.gql">
4970
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
5071
</None>

0 commit comments

Comments
 (0)