Skip to content

Commit c85e4b7

Browse files
committed
add xtb project for schema generation
1 parent e4430db commit c85e4b7

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+2941
-83
lines changed

.github/workflows/ci-pipeline-validation.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ env:
1616
jobs:
1717
build:
1818

19-
runs-on: ubuntu-latest
19+
runs-on: windows-latest
2020

2121
steps:
2222
- uses: actions/checkout@v3

GitVersion.yml

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
assembly-versioning-scheme: MajorMinorPatch
2+
assembly-file-versioning-scheme: MajorMinorPatch
3+
tag-prefix: '[vV]?'
4+
version-in-branch-pattern: (?<version>[vV]?\d+(\.\d+)?(\.\d+)?).*
5+
major-version-bump-message: \+semver:\s?(breaking|major)
6+
minor-version-bump-message: \+semver:\s?(feature|minor)
7+
patch-version-bump-message: \+semver:\s?(fix|patch)
8+
no-bump-message: \+semver:\s?(none|skip)
9+
tag-pre-release-weight: 60000
10+
commit-date-format: yyyy-MM-dd
11+
merge-message-formats: {}
12+
update-build-number: true
13+
semantic-version-format: Strict
14+
strategies:
15+
- ConfiguredNextVersion
16+
- Mainline
17+
branches:
18+
main:
19+
mode: ContinuousDeployment
20+
label: ''
21+
increment: Patch
22+
prevent-increment:
23+
of-merged-branch: true
24+
track-merge-target: false
25+
track-merge-message: true
26+
regex: ^master$|^main$
27+
source-branches: []
28+
is-source-branch-for: []
29+
tracks-release-branches: false
30+
is-release-branch: false
31+
is-main-branch: true
32+
pre-release-weight: 55000
33+
feature:
34+
mode: ContinuousDelivery
35+
label: '{BranchName}'
36+
increment: Patch
37+
prevent-increment:
38+
when-current-commit-tagged: false
39+
track-merge-message: true
40+
regex: ^features?[\/-](?<BranchName>.+)
41+
source-branches:
42+
- main
43+
is-source-branch-for: []
44+
is-main-branch: false
45+
pre-release-weight: 30000
46+
hotfix:
47+
mode: ContinuousDelivery
48+
label: '{BranchName}'
49+
increment: Patch
50+
prevent-increment:
51+
when-current-commit-tagged: false
52+
regex: ^hotfix(es)?[\/-](?<BranchName>.+)
53+
source-branches:
54+
- main
55+
is-source-branch-for: []
56+
is-release-branch: true
57+
is-main-branch: false
58+
pre-release-weight: 30000
59+
pull-request:
60+
mode: ContinuousDelivery
61+
label: PullRequest{Number}
62+
increment: Inherit
63+
prevent-increment:
64+
of-merged-branch: true
65+
when-current-commit-tagged: false
66+
track-merge-message: true
67+
regex: ^(pull-requests|pull|pr)[\/-](?<Number>\d*)
68+
source-branches:
69+
- main
70+
- feature
71+
- hotfix
72+
is-source-branch-for: []
73+
pre-release-weight: 30000
74+
unknown:
75+
increment: Patch
76+
prevent-increment:
77+
when-current-commit-tagged: false
78+
regex: (?<BranchName>.+)
79+
source-branches:
80+
- main
81+
is-source-branch-for: []
82+
pre-release-weight: 30000
83+
ignore:
84+
sha: []
85+
paths: []
86+
mode: ContinuousDelivery
87+
label: '{BranchName}'
88+
increment: Inherit
89+
prevent-increment:
90+
of-merged-branch: false
91+
when-branch-merged: false
92+
when-current-commit-tagged: true
93+
track-merge-target: false
94+
track-merge-message: true
95+
commit-message-incrementing: Enabled
96+
regex: ''
97+
source-branches: []
98+
is-source-branch-for: []
99+
tracks-release-branches: false
100+
is-release-branch: false
101+
is-main-branch: false
2.91 KB
Loading

src/Dataverse.ConfigurationMigrationTool/Console.Tests/CodeCoverage.runsettings

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<DataCollector friendlyName="XPlat code coverage">
66
<Configuration>
77
<Format>cobertura,opencover</Format>
8-
<Exclude>[*]Dataverse.ConfigurationMigrationTool.Console.Services.Dataverse.Connection.*,[*]Dataverse.ConfigurationMigrationTool.Console.Services.Dataverse.Configuration.*</Exclude>
8+
<Exclude>[*]Dataverse.ConfigurationMigrationTool.Console.Services.Dataverse.Connection.*,[*]Dataverse.ConfigurationMigrationTool.Console.Services.Dataverse.Configuration.*,[*]Dataverse.ConfigurationMigrationTool.XrmToolBox.*</Exclude>
99
<ExcludeByFile>**/Program.cs,**/IServiceCollectionExtensions.cs</ExcludeByFile>
1010
<SkipAutoProps>true</SkipAutoProps>
1111
</Configuration>

src/Dataverse.ConfigurationMigrationTool/Console.Tests/Features/Import/Validators/Rules/EntitySchemas/EntitySchemaValidatorTests.cs

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -1,110 +1,117 @@
1-
using System.Xml.Serialization;
1+
using System.Collections.Generic;
2+
using System.Xml.Serialization;
23

3-
namespace Dataverse.ConfigurationMigrationTool.Console.Features.Shared.Domain;
4+
namespace Dataverse.ConfigurationMigrationTool.Console.Features.Shared.Domain
5+
{
6+
[XmlRoot(ElementName = "field")]
7+
public class FieldSchema
8+
{
49

5-
// using System.Xml.Serialization;
6-
// XmlSerializer serializer = new XmlSerializer(typeof(Entities));
7-
// using (StringReader reader = new StringReader(xml))
8-
// {
9-
// var test = (Entities)serializer.Deserialize(reader);
10-
// }
10+
[XmlAttribute(AttributeName = "displayname")]
11+
public string Displayname { get; set; }
1112

12-
[XmlRoot(ElementName = "field")]
13-
public class FieldSchema
14-
{
13+
[XmlAttribute(AttributeName = "name")]
14+
public string Name { get; set; }
1515

16-
[XmlAttribute(AttributeName = "displayname")]
17-
public string Displayname { get; set; }
16+
[XmlAttribute(AttributeName = "type")]
17+
public string Type { get; set; }
1818

19-
[XmlAttribute(AttributeName = "name")]
20-
public string Name { get; set; }
19+
[XmlAttribute(AttributeName = "customfield")]
20+
public bool Customfield { get; set; }
2121

22-
[XmlAttribute(AttributeName = "type")]
23-
public string Type { get; set; }
22+
[XmlAttribute(AttributeName = "primaryKey")]
23+
public bool PrimaryKey { get; set; }
2424

25-
[XmlAttribute(AttributeName = "customfield")]
26-
public bool Customfield { get; set; }
25+
[XmlAttribute(AttributeName = "lookupType")]
26+
public string LookupType { get; set; }
27+
public bool ShouldSerializeCustomfield()
28+
{
29+
return Customfield;
30+
}
31+
public bool ShouldSerializePrimaryKey()
32+
{
33+
return PrimaryKey;
34+
}
35+
}
2736

28-
[XmlAttribute(AttributeName = "primaryKey")]
29-
public bool PrimaryKey { get; set; }
37+
[XmlRoot(ElementName = "fields")]
38+
public class FieldsSchema
39+
{
3040

31-
[XmlAttribute(AttributeName = "lookupType")]
32-
public string LookupType { get; set; }
33-
}
41+
[XmlElement(ElementName = "field")]
42+
public List<FieldSchema> Field { get; set; } = new List<FieldSchema>();
43+
}
3444

35-
[XmlRoot(ElementName = "fields")]
36-
public class FieldsSchema
37-
{
45+
[XmlRoot(ElementName = "relationship")]
46+
public class RelationshipSchema
47+
{
3848

39-
[XmlElement(ElementName = "field")]
40-
public List<FieldSchema> Field { get; set; } = new List<FieldSchema>();
41-
}
49+
[XmlAttribute(AttributeName = "name")]
50+
public string Name { get; set; }
4251

43-
[XmlRoot(ElementName = "relationship")]
44-
public class RelationshipSchema
45-
{
52+
[XmlAttribute(AttributeName = "manyToMany")]
53+
public bool ManyToMany { get; set; }
4654

47-
[XmlAttribute(AttributeName = "name")]
48-
public string Name { get; set; }
55+
[XmlAttribute(AttributeName = "isreflexive")]
56+
public bool Isreflexive { get; set; }
4957

50-
[XmlAttribute(AttributeName = "manyToMany")]
51-
public bool ManyToMany { get; set; }
58+
[XmlAttribute(AttributeName = "relatedEntityName")]
59+
public string RelatedEntityName { get; set; }
5260

53-
[XmlAttribute(AttributeName = "isreflexive")]
54-
public bool Isreflexive { get; set; }
61+
[XmlAttribute(AttributeName = "m2mTargetEntity")]
62+
public string M2mTargetEntity { get; set; }
5563

56-
[XmlAttribute(AttributeName = "relatedEntityName")]
57-
public string RelatedEntityName { get; set; }
64+
[XmlAttribute(AttributeName = "m2mTargetEntityPrimaryKey")]
65+
public string M2mTargetEntityPrimaryKey { get; set; }
66+
}
5867

59-
[XmlAttribute(AttributeName = "m2mTargetEntity")]
60-
public string M2mTargetEntity { get; set; }
68+
[XmlRoot(ElementName = "relationships")]
69+
public class RelationshipsSchema
70+
{
6171

62-
[XmlAttribute(AttributeName = "m2mTargetEntityPrimaryKey")]
63-
public string M2mTargetEntityPrimaryKey { get; set; }
64-
}
72+
[XmlElement(ElementName = "relationship")]
73+
public List<RelationshipSchema> Relationship { get; set; } = new List<RelationshipSchema>();
74+
}
6575

66-
[XmlRoot(ElementName = "relationships")]
67-
public class RelationshipsSchema
68-
{
76+
[XmlRoot(ElementName = "entity")]
77+
public class EntitySchema
78+
{
6979

70-
[XmlElement(ElementName = "relationship")]
71-
public List<RelationshipSchema> Relationship { get; set; } = new List<RelationshipSchema>();
72-
}
80+
[XmlElement(ElementName = "fields")]
81+
public FieldsSchema Fields { get; set; } = new FieldsSchema();
7382

74-
[XmlRoot(ElementName = "entity")]
75-
public class EntitySchema
76-
{
83+
[XmlElement(ElementName = "relationships")]
84+
public RelationshipsSchema Relationships { get; set; } = new RelationshipsSchema();
7785

78-
[XmlElement(ElementName = "fields")]
79-
public FieldsSchema Fields { get; set; } = new FieldsSchema();
86+
[XmlAttribute(AttributeName = "name")]
87+
public string Name { get; set; }
8088

81-
[XmlElement(ElementName = "relationships")]
82-
public RelationshipsSchema Relationships { get; set; } = new RelationshipsSchema();
89+
[XmlAttribute(AttributeName = "displayname")]
90+
public string Displayname { get; set; }
8391

84-
[XmlAttribute(AttributeName = "name")]
85-
public string Name { get; set; }
92+
[XmlAttribute(AttributeName = "etc")]
93+
public int Etc { get; set; }
8694

87-
[XmlAttribute(AttributeName = "displayname")]
88-
public string Displayname { get; set; }
95+
[XmlAttribute(AttributeName = "primaryidfield")]
96+
public string Primaryidfield { get; set; }
8997

90-
[XmlAttribute(AttributeName = "etc")]
91-
public int Etc { get; set; }
98+
[XmlAttribute(AttributeName = "primarynamefield")]
99+
public string Primarynamefield { get; set; }
92100

93-
[XmlAttribute(AttributeName = "primaryidfield")]
94-
public string Primaryidfield { get; set; }
101+
[XmlAttribute(AttributeName = "disableplugins")]
102+
public bool Disableplugins { get; set; }
103+
}
95104

96-
[XmlAttribute(AttributeName = "primarynamefield")]
97-
public string Primarynamefield { get; set; }
105+
[XmlRoot(ElementName = "entities")]
106+
public class DataSchema
107+
{
98108

99-
[XmlAttribute(AttributeName = "disableplugins")]
100-
public bool Disableplugins { get; set; }
109+
[XmlElement(ElementName = "entity")]
110+
public List<EntitySchema> Entity { get; set; }
111+
}
101112
}
102113

103-
[XmlRoot(ElementName = "entities")]
104-
public class DataSchema
105-
{
106114

107-
[XmlElement(ElementName = "entity")]
108-
public List<EntitySchema> Entity { get; set; }
109-
}
115+
116+
110117

Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1-
namespace Dataverse.ConfigurationMigrationTool.Console.Features.Shared;
1+
using System.Threading.Tasks;
22

3-
public interface IFileDataService
3+
namespace Dataverse.ConfigurationMigrationTool.Console.Features.Shared
44
{
5-
Task<T> ReadAsync<T>(string path);
6-
Task WriteAsync<T>(T obj, string path);
5+
public interface IFileDataService
6+
{
7+
Task<T> ReadAsync<T>(string path);
8+
Task WriteAsync<T>(T obj, string path);
9+
}
710
}
11+
12+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using System.Collections.Generic;
2+
using System.ComponentModel;
3+
4+
namespace Dataverse.ConfigurationMigrationTool.XrmToolBox.Common
5+
{
6+
public static class BindingListExtensions
7+
{
8+
public static void AddRange<T>(this BindingList<T> list, IEnumerable<T> values)
9+
{
10+
foreach (var value in values)
11+
{
12+
list.Add(value);
13+
}
14+
}
15+
public static void RemoveRange<T>(this BindingList<T> list, IEnumerable<T> values)
16+
{
17+
foreach (var value in values)
18+
{
19+
list.Remove(value);
20+
}
21+
}
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using Microsoft.Xrm.Sdk;
2+
3+
namespace Dataverse.ConfigurationMigrationTool.XrmToolBox.Common
4+
{
5+
public static class EntityExtensions
6+
{
7+
public static Entity GetAliasedEntity(this Entity entity, string alias)
8+
{
9+
var aliasedEntity = new Entity();
10+
foreach (var attribute in entity.Attributes)
11+
{
12+
if (attribute.Key.StartsWith(alias + "."))
13+
{
14+
var attributeName = attribute.Key.Substring(alias.Length + 1);
15+
aliasedEntity[attributeName] = ((AliasedValue)attribute.Value)?.Value;
16+
}
17+
}
18+
19+
return aliasedEntity;
20+
}
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
namespace Dataverse.ConfigurationMigrationTool.XrmToolBox.Common
2+
{
3+
public static class ToolConstants
4+
{
5+
public const string Name = "Configuration Migration Tool";
6+
public const string Description = "This tool is a remake of the offical Microsoft Configuration Migration Tool with extended capabilities and supports more data types.";
7+
public const string SmallImage = "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAADsAAAA7AF5KHG9AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAABGdJREFUWIXtl11sVFUQx39zzildursEhUKxwAMkBEMgaQndBMRgaCTR+kAiGnkyAauBF1EjwQdTTagJkhjiJ9HEEBQ/6pMCjdJAqAaBpqBIEIgQEQ20pQrd3dK6e874sFstPuC9Ij7xT07m3nPn/mfO3Jk558It/IeY3aoT4r7j/o2hhg06QR0PY2nwBusNR4uWL3G8DjTE4ZK4xhc9pw8Vha1qGB8MBFsavizFMP3403I+Kl+sCCxer/d75XkD24LSg1ALPABMH9EpCI3AuzfFASxHDrQyF0RHppa06JOXLaeAGcCwUSbFoYz9Cf6O+S06u1jBajV0VAzT2d0igzfK+b9C5jdrRY1npRruw7AgGCYpJIMhp4aLXjiklp3VP9PW1iY+EuvHamf2siJYmrwlEyyTvSUdLHnv6PWOrqJld7aPHdK0WrsV6lVADaiURjCl+1GZvqfzZbk3iv1ZW7TDW5aOro4/pStdewfe0W00sB24cv040Q98GGn1gCgfAP3/oHYFZbsT4czYNFOygyw00KBQLZAEcqr0AAdJczjkaYzqQIAen2QqV8mgZBQmAykgr0JvELoGihyoMjQ64NPBLOeMsC8IJxCOlRVTRphUhDUM8IkxWCBSqxVhm80zFBx7EY4b4bhXcqIkBaoNPDrO8Z4XahxwFnh/sIJNCU8G2KMgoqVcEKBc9F1RI4ByFuXgsLDeGepU6RBDIoyQ6YgaZ5wfos4meKKqwBtqmKbX9oacKgcRduZTvB3VfqLAkpxldaXnTS/UYEmMejwIdKmwO1HBW8Ym2B+EfPBsbN8q94Q8qWCpTRRIdrwqaYV1KJLM8UVUB4Yq+BxBbGDTT82yLBRJOk8tSurSI5K08Lgo+eEC+6VplRYR2j18i2WBCnNUuBwMt6lhYjCMCRaCoa9zs0Rqs7O2aJ+3HFPDV0VHfbDUe8tvwTLeOyZ6S2W5HL1RaFYliOFH4DXgDmBOWY4pc54XYW3UCAisRbkaDBe0xHl7mbMWqCyr9aA85hB+D2N5SIeYh7AAeEFKJZNV6AnCIcZxkizLozoQBOtTPMggs0XIqPCSQFpLOdUXDIcHEnyXLLBCmlapqnBJDZ0K3wehTyy5AOPUUF201KllcTAMd26WSGU4a4v2e4sJlv3ecsI7+tQw4B3pomFicMzzjiXeknbAUVF2VSVpzV4lI7BXFRlpy6Mq5+uoEQCOqnLKFnhKHXVB2RcggYJcu/8ecRcsmRrPynyOjcYyNUAeSClkgYvAIZRdNedoi2r99BSWzexlhbe0BmUyUAASQA7oBboU2vMX2RFjUTcHsQ8k81u0akyRu4OhsWh4p7tFTt6IAyaO8l3P6vrKYX5VpV2V5Wn44RoFVbnzFZ0ShzPusbyXv+p4Rg7O1r+onwXHL95QEzaztOB4BrhwUxwwRTqCHTWhTAPWlDeXfhGaT6+T9jicsXNg4QY9jGOth0XeMDdYhrzjmIzlo2/WyeW4fLHRsCH+79ctXA9/AGIK2nJS1ldXAAAAAElFTkSuQmCC";
8+
public const string BigImage = "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";
9+
}
10+
}

0 commit comments

Comments
 (0)