Skip to content

Commit

Permalink
Prevent creating properties from infinite recursive attribute group refs
Browse files Browse the repository at this point in the history
Prevent duplicate elements from multiple group refs in choices
Add schema downloader script
Add XBRL schema
  • Loading branch information
Michael Ganss committed Jan 18, 2022
1 parent add51cc commit 5485b25
Show file tree
Hide file tree
Showing 45 changed files with 5,757 additions and 12 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -299,3 +299,4 @@ __pycache__/
*.xsd.cs
/coverage.xml
/coverage.netcoreapp2.2.xml
.vscode
18 changes: 18 additions & 0 deletions XmlSchemaClassGenerator.Tests/XmlTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ private static IEnumerable<string> ConvertXml(string name, string xsd, Generator
const string DtsxPattern = "xsd/dtsx/dtsx2.xsd";
const string WfsPattern = "xsd/wfs/schemas.opengis.net/wfs/2.0/wfs.xsd";
const string EppPattern = "xsd/epp/*.xsd";
const string XbrlPattern = "xsd/xbrl/xhtml-inlinexbrl-1_1.xsd";

// IATA test takes too long to perform every time

Expand Down Expand Up @@ -523,6 +524,23 @@ public void TestEpp()
TestSamples("epp", EppPattern);
}

[Fact, TestPriority(1)]
[UseCulture("en-US")]
public void TestXbrl()
{
var output = new FileWatcherOutputWriter(Path.Combine("output", "xbrl"));
var generator = new Generator
{
OutputWriter = output,
GenerateInterfaces = false,
UniqueTypeNamesAcrossNamespaces = true,
};
generator.NamespaceProvider.Add(new NamespaceKey("http://www.xbrl.org/2003/XLink"), "XbrlLink");
var assembly = Compiler.Generate("xbrl", XbrlPattern, generator);
Assert.NotNull(assembly);
//TestSamples("xbrl", XbrlPattern);
}

private void TestSamples(string name, string pattern)
{
var assembly = Compiler.GetAssembly(name);
Expand Down
59 changes: 59 additions & 0 deletions XmlSchemaClassGenerator.Tests/tools/download.csx
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#! "net6.0"

using System.Net.Http;
using System.Xml;
using System.Xml.Linq;

var opts = Args.Where(a => a.StartsWith("-"));

if (Args.Except(opts).Count() < 1)
{
Console.WriteLine("Usage: dotnet script download.csx [-ddestination] URL...");
return;
}

XNamespace xs = "http://www.w3.org/2001/XMLSchema";
var xsds = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
var client = new HttpClient();
var destination = opts.FirstOrDefault(a => a.StartsWith("-d"))?[2..] ?? ".";

void Download(string url, string destination)
{
destination = Path.GetFullPath(destination);

var key = $"{url}:{destination}";

if (xsds.Contains(key)) return;

Console.WriteLine($"Downloading {url} to {destination}");

xsds.Add(key);

var xsd = client.GetStringAsync(url).Result;
var document = XDocument.Parse(xsd);
var uri = new Uri(url);
var fileName = Path.GetFileName(uri.LocalPath);
var dir = new Uri(uri, ".");
var locations = document.Descendants(xs + "include")
.Concat(document.Descendants(xs + "import"))
.Concat(document.Descendants(xs + "redefine"))
.Select(e => e.Attribute("schemaLocation")?.Value)
.Where(a => a != null && !new Uri(a, UriKind.RelativeOrAbsolute).IsAbsoluteUri);

Directory.CreateDirectory(destination);
File.WriteAllText(Path.Join(destination, fileName), xsd);

foreach (var location in locations)
{
var locationUri = new Uri(dir, location).OriginalString;
var locationDest = Path.GetDirectoryName(Path.Join(destination, location));
Download(locationUri, locationDest);
}
}

foreach (var url in Args.Except(opts))
{
Download(url, destination);
}

Console.WriteLine("Done.");
6 changes: 6 additions & 0 deletions XmlSchemaClassGenerator.Tests/tools/omnisharp.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"script": {
"enableScriptNuGetReferences": true,
"defaultTargetFramework": "net5.0"
}
}
Loading

0 comments on commit 5485b25

Please sign in to comment.