Skip to content

Commit f7702f9

Browse files
authored
Merge pull request #2 from CodeShayk/release/v2.0.0
Release/v2.0.0
2 parents cd76e6e + 530aed6 commit f7702f9

203 files changed

Lines changed: 3000 additions & 1770 deletions

File tree

Some content is hidden

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

.github/workflows/PullRequest-CI.yml

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ jobs:
1010
Run-Lint:
1111
runs-on: ubuntu-latest
1212
env:
13-
github-token: '${{ secrets.GITHUB_TOKEN }}'
13+
github-token: '${{ secrets.GH_Packages }}'
1414
steps:
1515
- name: Step-01 Checkout code
1616
uses: actions/checkout@v3
@@ -52,7 +52,7 @@ jobs:
5252
- name: Step-04 Install .NET
5353
uses: actions/setup-dotnet@v3
5454
with:
55-
dotnet-version: 6.0.x
55+
dotnet-version: 9.0.x
5656

5757
- name: Step-05 Restore dependencies
5858
run: dotnet restore
@@ -85,7 +85,7 @@ jobs:
8585
outputs:
8686
semVersion: ${{ needs.Build-Release.outputs.semVersion }}
8787
env:
88-
github-token: '${{ secrets.GITHUB_TOKEN }}'
88+
github-token: '${{ secrets.GH_Packages }}'
8989
nuget-token: '${{ secrets.NUGET_API_KEY }}'
9090
working-directory: /home/runner/work/Schemio/Schemio
9191
steps:
@@ -100,16 +100,16 @@ jobs:
100100

101101
- name: Step-03 Publish to Github Packages
102102
run: find -name "*.nupkg" -print -exec gpr push -k ${{env.github-token}} {} \;
103-
104-
- name: Step-03 Release to Nuget Org
105-
if: ${{ startsWith(github.head_ref, 'release/')}}
106-
run: dotnet nuget push ${{env.working-directory}}/src/Schemio/bin/Release/*.nupkg --skip-duplicate --api-key ${{ env.nuget-token }} --source https://api.nuget.org/v3/index.json
107103

108104
Release:
109105
name: Release to Nuget
110106
needs: [Package]
111107
if: ${{ startsWith(github.head_ref, 'release/')}}
112108
runs-on: ubuntu-latest
109+
env:
110+
github-token: '${{ secrets.GH_Packages }}'
111+
nuget-token: '${{ secrets.NUGET_API_KEY }}'
112+
working-directory: /home/runner/work/Schemio/Schemio
113113
steps:
114114
- uses: actions/checkout@v2
115115

@@ -145,10 +145,10 @@ jobs:
145145
# TAG_FORMAT: v*
146146

147147
# API key to authenticate with NuGet server, or a token, issued for GITHUB_USER if you use GPR
148-
# NUGET_KEY: ${{secrets.NUGET_API_KEY}}
148+
NUGET_KEY: ${{secrets.NUGET_API_KEY}}
149149

150150
# NuGet server uri hosting the packages, defaults to https://api.nuget.org
151-
# NUGET_SOURCE: https://api.nuget.org
151+
NUGET_SOURCE: https://api.nuget.org/v3/index.json
152152

153153
# Flag to toggle pushing symbols along with nuget package to the server, disabled by default
154154
# INCLUDE_SYMBOLS: false

.github/workflows/PullRequest-CodeQL.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,4 @@ jobs:
7373
- name: Perform CodeQL Analysis
7474
uses: github/codeql-action/analyze@v2
7575
with:
76-
category: "/language:${{matrix.language}}"
76+
category: "/language:${{matrix.language}}"

GitVersion.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
next-version: 1.0.0
1+
next-version: 2.0.0
22
tag-prefix: '[vV]'
33
mode: ContinuousDeployment
44
branches:

Images/Schemio-Control-Flow.png

108 KB
Loading

LICENSE

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
MIT License
2+
3+
Copyright (c) 2024 Code Shayk
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE.

README.md

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,25 @@
1-
# <img src="https://github.com/CodeShayk/Schemio/blob/master/Images/ninja-icon-16.png" alt="ninja" style="width:30px;"/> Schemio v1.0
1+
# <img src="https://github.com/CodeShayk/Schemio/blob/master/Images/ninja-icon-16.png" alt="ninja" style="width:30px;"/> Schemio v2.0
22
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/CodeShayk/Schemio/blob/master/LICENSE.md)
33
[![Master-Build](https://github.com/CodeShayk/Schemio/actions/workflows/Build-Master.yml/badge.svg)](https://github.com/CodeShayk/Schemio/actions/workflows/Build-Master.yml)
44
[![GitHub Release](https://img.shields.io/github/v/release/CodeShayk/Schemio?logo=github&sort=semver)](https://github.com/CodeShayk/Schemio/releases/latest)
55
[![Master-CodeQL](https://github.com/CodeShayk/Schemio/actions/workflows/Master-CodeQL.yml/badge.svg)](https://github.com/CodeShayk/Schemio/actions/workflows/Master-CodeQL.yml)
6-
[![.Net 8.0](https://img.shields.io/badge/.Net-8.0-blue)](https://dotnet.microsoft.com/en-us/download/dotnet/8.0)
6+
[![.Net 9.0](https://img.shields.io/badge/.Net-9.0-blue)](https://dotnet.microsoft.com/en-us/download/dotnet/9.0)
77
--
88
#### Nuget Packages
99
| Package | Latest | Details |
1010
| --------| --------| --------|
1111
| Schemio.Core|[![NuGet version](https://badge.fury.io/nu/Schemio.Core.svg)](https://badge.fury.io/nu/Schemio.Core) | Provides `core` functionality to configure nested queries and transformers. With ability to map schema paths (XPath/JSONPath) to entity's object graph. `No QueryEngine` provided and requires implementing IQueryEngine to execute IQuery instances. |
1212
| Schemio.SQL|[![NuGet version](https://badge.fury.io/nu/Schemio.SQL.svg)](https://badge.fury.io/nu/Schemio.SQL)| Provides schemio with query engine using `Dapper` to execute SQL queries. |
1313
| Schemio.EntityFramework|[![NuGet version](https://badge.fury.io/nu/Schemio.EntityFramework.svg)](https://badge.fury.io/nu/Schemio.EntityFramework)| Provides schemio with `Entity Framework` query engine to execute queries using DbContext. |
14+
| Schemio.API|[![NuGet version](https://badge.fury.io/nu/Schemio.Api.svg)](https://badge.fury.io/nu/Schemio.Api)| Provides schemio with `Web Api` query engine to execute apis using HttpClient. |
1415

1516
## Concept
1617
### What is Schemio?
17-
`Schemio` is a data aggregation framework that
18-
- allows fetching `aggregated data` from `heterogeneous` data storages. You could combine queries targetting different data platforms (example. SQL, API, Cache) to return an aggregated data entity.
19-
- allows `conditionally` fetching only `parts` of the data entity. You could retrieve an aggregated data entity with selective sections of its `object graph` populated depending on the context passed with the request.
18+
`Schemio` is a data aggregation framework using queries that can target different data platforms.
19+
20+
Key benefits:
21+
- allows fetching `aggregated` data from `heterogeneous` data storages. You could combine queries targetting different data platforms (example. `SQL`, `API`, `Cache`) to return an aggregated data `entity`.
22+
- allows `selectively` fetching only `parts` of the aggregated data entity. You could retrieve an aggregated data entity with only `sections` of its `object graph` populated with data depending upon the `schema paths` passed with the request.
2023

2124
### When to use Schemio?
2225
Schemio is perfect fit for many use cases. Few examples that require the service tier to dynamically fetch aggregated data with high performance, availability and scalability are
@@ -28,21 +31,24 @@ Schemio is perfect fit for many use cases. Few examples that require the service
2831
2932
## Getting Started?
3033
### i. Installation
31-
Install the latest nuget package as appropriate for Core, SQL using Dapper or EntityFramework.
34+
Install the latest nuget package as appropriate for `Core`, `Web API`, `SQL` using `Dapper` or `EntityFramework` using commands below.
3235

3336
`Scemio.Core` - for installing schemio for `bespoke` implementation of query engine.
3437
```
3538
NuGet\Install-Package Schemio.Core
3639
```
3740
`Schemio.SQL` - for installing schemio for SQL with `Dapper` engine.
3841
```
39-
NuGet\Install-Package Schemio.SQL
42+
NuGet\Install-Package Schemio.SQL
4043
```
4144
`Schemio.EntityFramework` - for installing schemio for SQL with `EntityFramework` engine.
4245
```
4346
NuGet\Install-Package Schemio.EntityFramework
4447
```
45-
48+
`Schemio.API` - for installing schemio for Web API with `HttpClient` engine.
49+
```
50+
NuGet\Install-Package Schemio.API
51+
```
4652
### ii. Developer Guide
4753

4854
Please see [Developer Guide](https://codeshayk.github.io/Schemio/) for details on how to implement schemio in your project.
@@ -56,11 +62,11 @@ If you are having problems, please let me know by [raising a new issue](https://
5662
This project is licensed with the [MIT license](LICENSE).
5763

5864
## Version History
59-
The main branch is now on .NET 8.0. The following previous versions are available:
65+
The main branch is now on .NET 9.0. The following previous versions are available:
6066
| Version | Release Notes | Developer Guide |
6167
| -------- | --------|--------|
6268
| [`v1.0.0`](https://github.com/CodeShayk/Schemio/tree/v1.0.0) | [Notes](https://github.com/CodeShayk/Schemio/releases/tag/v1.0.0) | [Guide](https://github.com/CodeShayk/Schemio/blob/v1.0.0/index.md) |
63-
| [`Pre-Release v2.0.0`](https://github.com/CodeShayk/Schemio/tree/v2.0.0) | [Notes](https://github.com/CodeShayk/Schemio/releases/tag/v2.0.0) | [Guide](https://github.com/CodeShayk/Schemio/blob/v2.0.0/index.md) |
69+
| [`v2.0.0`](https://github.com/CodeShayk/Schemio/tree/v2.0.0) | [Notes](https://github.com/CodeShayk/Schemio/releases/tag/v2.0.0) | [Guide](https://github.com/CodeShayk/Schemio/blob/v2.0.0/index.md) |
6470

6571
## Credits
6672
Thank you for reading. Please fork, explore, contribute and report. Happy Coding !! :)

Schemio.sln

Lines changed: 37 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,17 @@ VisualStudioVersion = 17.5.33516.290
55
MinimumVisualStudioVersion = 10.0.40219.1
66
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{F41DA3D8-A0E9-4A05-8A35-78313C0F5804}"
77
EndProject
8-
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio", "src\Schemio\Schemio.Core.csproj", "{6F017146-B95A-4081-9CC0-B0245F78D72B}"
9-
EndProject
108
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{07BAE427-96CF-4F9B-80A9-48CFB0A89CF3}"
119
EndProject
1210
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "solution", "solution", "{AF995FEF-BB94-48D0-B02B-6671DA73056B}"
1311
ProjectSection(SolutionItems) = preProject
1412
.gitignore = .gitignore
13+
index.md = index.md
1514
LICENSE.md = LICENSE.md
1615
README.md = README.md
1716
EndProjectSection
1817
EndProject
19-
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.SQL", "src\Schemio.SQL\Schemio.SQL.csproj", "{1A0CB973-23C9-4A17-905E-59510CD18932}"
20-
EndProject
21-
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.EntityFramework", "src\Schemio.EntityFramework\Schemio.EntityFramework.csproj", "{6B92CC17-B7DB-446F-BF2F-A93696D48B5D}"
22-
EndProject
23-
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.Tests", "tests\Schemio.Tests\Schemio.Tests.csproj", "{B09236CB-BBD2-4DCF-A698-74CCCAB29FFB}"
18+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.Core.Tests", "tests\Schemio.Core.Tests\Schemio.Core.Tests.csproj", "{B09236CB-BBD2-4DCF-A698-74CCCAB29FFB}"
2419
EndProject
2520
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.SQL.Tests", "tests\Schemio.SQL.Tests\Schemio.SQL.Tests.csproj", "{1E319404-8EF0-40A1-A9D7-A404A71A98C4}"
2621
EndProject
@@ -35,24 +30,22 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "github", "github", "{39FD80
3530
EndProject
3631
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.EntityFramework.Tests", "tests\Schemio.EntityFramework.Tests\Schemio.EntityFramework.Tests.csproj", "{FE039675-00BE-4DC5-945F-14E7625170D0}"
3732
EndProject
33+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.Core", "src\Schemio.Core\Schemio.Core.csproj", "{4F9B6FE3-CAC4-4594-84AD-98D1ECDE180C}"
34+
EndProject
35+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.EntityFramework", "src\Schemio.EntityFramework\Schemio.EntityFramework.csproj", "{E8F8C13E-2E05-4092-84FD-B7B7B12DABBB}"
36+
EndProject
37+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.SQL", "src\Schemio.SQL\Schemio.SQL.csproj", "{52986844-698F-486B-AEC9-846AAF50CF46}"
38+
EndProject
39+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.API", "src\Schemio.API\Schemio.API.csproj", "{0C1A05D2-653D-4F88-B397-BA53E0BA7281}"
40+
EndProject
41+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.API.Tests", "tests\Schemio.API.Tests\Schemio.API.Tests.csproj", "{D0EE40C1-87EF-413D-A046-DC37D58BC344}"
42+
EndProject
3843
Global
3944
GlobalSection(SolutionConfigurationPlatforms) = preSolution
4045
Debug|Any CPU = Debug|Any CPU
4146
Release|Any CPU = Release|Any CPU
4247
EndGlobalSection
4348
GlobalSection(ProjectConfigurationPlatforms) = postSolution
44-
{6F017146-B95A-4081-9CC0-B0245F78D72B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
45-
{6F017146-B95A-4081-9CC0-B0245F78D72B}.Debug|Any CPU.Build.0 = Debug|Any CPU
46-
{6F017146-B95A-4081-9CC0-B0245F78D72B}.Release|Any CPU.ActiveCfg = Release|Any CPU
47-
{6F017146-B95A-4081-9CC0-B0245F78D72B}.Release|Any CPU.Build.0 = Release|Any CPU
48-
{1A0CB973-23C9-4A17-905E-59510CD18932}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
49-
{1A0CB973-23C9-4A17-905E-59510CD18932}.Debug|Any CPU.Build.0 = Debug|Any CPU
50-
{1A0CB973-23C9-4A17-905E-59510CD18932}.Release|Any CPU.ActiveCfg = Release|Any CPU
51-
{1A0CB973-23C9-4A17-905E-59510CD18932}.Release|Any CPU.Build.0 = Release|Any CPU
52-
{6B92CC17-B7DB-446F-BF2F-A93696D48B5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
53-
{6B92CC17-B7DB-446F-BF2F-A93696D48B5D}.Debug|Any CPU.Build.0 = Debug|Any CPU
54-
{6B92CC17-B7DB-446F-BF2F-A93696D48B5D}.Release|Any CPU.ActiveCfg = Release|Any CPU
55-
{6B92CC17-B7DB-446F-BF2F-A93696D48B5D}.Release|Any CPU.Build.0 = Release|Any CPU
5649
{B09236CB-BBD2-4DCF-A698-74CCCAB29FFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
5750
{B09236CB-BBD2-4DCF-A698-74CCCAB29FFB}.Debug|Any CPU.Build.0 = Debug|Any CPU
5851
{B09236CB-BBD2-4DCF-A698-74CCCAB29FFB}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -65,18 +58,40 @@ Global
6558
{FE039675-00BE-4DC5-945F-14E7625170D0}.Debug|Any CPU.Build.0 = Debug|Any CPU
6659
{FE039675-00BE-4DC5-945F-14E7625170D0}.Release|Any CPU.ActiveCfg = Release|Any CPU
6760
{FE039675-00BE-4DC5-945F-14E7625170D0}.Release|Any CPU.Build.0 = Release|Any CPU
61+
{4F9B6FE3-CAC4-4594-84AD-98D1ECDE180C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
62+
{4F9B6FE3-CAC4-4594-84AD-98D1ECDE180C}.Debug|Any CPU.Build.0 = Debug|Any CPU
63+
{4F9B6FE3-CAC4-4594-84AD-98D1ECDE180C}.Release|Any CPU.ActiveCfg = Release|Any CPU
64+
{4F9B6FE3-CAC4-4594-84AD-98D1ECDE180C}.Release|Any CPU.Build.0 = Release|Any CPU
65+
{E8F8C13E-2E05-4092-84FD-B7B7B12DABBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
66+
{E8F8C13E-2E05-4092-84FD-B7B7B12DABBB}.Debug|Any CPU.Build.0 = Debug|Any CPU
67+
{E8F8C13E-2E05-4092-84FD-B7B7B12DABBB}.Release|Any CPU.ActiveCfg = Release|Any CPU
68+
{E8F8C13E-2E05-4092-84FD-B7B7B12DABBB}.Release|Any CPU.Build.0 = Release|Any CPU
69+
{52986844-698F-486B-AEC9-846AAF50CF46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
70+
{52986844-698F-486B-AEC9-846AAF50CF46}.Debug|Any CPU.Build.0 = Debug|Any CPU
71+
{52986844-698F-486B-AEC9-846AAF50CF46}.Release|Any CPU.ActiveCfg = Release|Any CPU
72+
{52986844-698F-486B-AEC9-846AAF50CF46}.Release|Any CPU.Build.0 = Release|Any CPU
73+
{0C1A05D2-653D-4F88-B397-BA53E0BA7281}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
74+
{0C1A05D2-653D-4F88-B397-BA53E0BA7281}.Debug|Any CPU.Build.0 = Debug|Any CPU
75+
{0C1A05D2-653D-4F88-B397-BA53E0BA7281}.Release|Any CPU.ActiveCfg = Release|Any CPU
76+
{0C1A05D2-653D-4F88-B397-BA53E0BA7281}.Release|Any CPU.Build.0 = Release|Any CPU
77+
{D0EE40C1-87EF-413D-A046-DC37D58BC344}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
78+
{D0EE40C1-87EF-413D-A046-DC37D58BC344}.Debug|Any CPU.Build.0 = Debug|Any CPU
79+
{D0EE40C1-87EF-413D-A046-DC37D58BC344}.Release|Any CPU.ActiveCfg = Release|Any CPU
80+
{D0EE40C1-87EF-413D-A046-DC37D58BC344}.Release|Any CPU.Build.0 = Release|Any CPU
6881
EndGlobalSection
6982
GlobalSection(SolutionProperties) = preSolution
7083
HideSolutionNode = FALSE
7184
EndGlobalSection
7285
GlobalSection(NestedProjects) = preSolution
73-
{6F017146-B95A-4081-9CC0-B0245F78D72B} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804}
74-
{1A0CB973-23C9-4A17-905E-59510CD18932} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804}
75-
{6B92CC17-B7DB-446F-BF2F-A93696D48B5D} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804}
7686
{B09236CB-BBD2-4DCF-A698-74CCCAB29FFB} = {07BAE427-96CF-4F9B-80A9-48CFB0A89CF3}
7787
{1E319404-8EF0-40A1-A9D7-A404A71A98C4} = {07BAE427-96CF-4F9B-80A9-48CFB0A89CF3}
7888
{39FD806A-D320-43C9-800F-E9D9BCC90623} = {AF995FEF-BB94-48D0-B02B-6671DA73056B}
7989
{FE039675-00BE-4DC5-945F-14E7625170D0} = {07BAE427-96CF-4F9B-80A9-48CFB0A89CF3}
90+
{4F9B6FE3-CAC4-4594-84AD-98D1ECDE180C} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804}
91+
{E8F8C13E-2E05-4092-84FD-B7B7B12DABBB} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804}
92+
{52986844-698F-486B-AEC9-846AAF50CF46} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804}
93+
{0C1A05D2-653D-4F88-B397-BA53E0BA7281} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804}
94+
{D0EE40C1-87EF-413D-A046-DC37D58BC344} = {07BAE427-96CF-4F9B-80A9-48CFB0A89CF3}
8095
EndGlobalSection
8196
GlobalSection(ExtensibilityGlobals) = postSolution
8297
SolutionGuid = {C0FF62D6-1374-4939-A546-432862338528}

0 commit comments

Comments
 (0)