Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/endpoint implementations #1

Merged
merged 19 commits into from
Mar 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions .github/workflows/dotnet.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ on:
push:
branches: [ "main" ]
pull_request:
types: [opened, reopened, synchronize]
branches: [ "main" ]

jobs:
Expand All @@ -12,14 +13,18 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4

- name: Setup .NET
uses: actions/setup-dotnet@v3
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x

- name: Restore dependencies
run: dotnet restore

- name: Build
run: dotnet build --no-restore
- name: Test

- name: Integration Tests
run: dotnet test --no-build --verbosity normal
9 changes: 4 additions & 5 deletions carbon-intensity-sdk.sln
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "carbon-intensity-sdk", "src
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "carbon-intensity-sdk.test", "tests\carbon-intensity-sdk.test\carbon-intensity-sdk.test.csproj", "{E184E634-3ACA-4C12-9D63-8B4963DC7A24}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "sample-client", "src\sample-client\sample-client.csproj", "{AD6DAB25-77B2-4FB0-916E-E64DD73F3537}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "github", "github", "{91033E69-A766-41DB-A3DD-FEC8078B31AF}"
ProjectSection(SolutionItems) = preProject
.github\workflows\dotnet.yml = .github\workflows\dotnet.yml
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand All @@ -23,10 +26,6 @@ Global
{E184E634-3ACA-4C12-9D63-8B4963DC7A24}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E184E634-3ACA-4C12-9D63-8B4963DC7A24}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E184E634-3ACA-4C12-9D63-8B4963DC7A24}.Release|Any CPU.Build.0 = Release|Any CPU
{AD6DAB25-77B2-4FB0-916E-E64DD73F3537}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AD6DAB25-77B2-4FB0-916E-E64DD73F3537}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AD6DAB25-77B2-4FB0-916E-E64DD73F3537}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AD6DAB25-77B2-4FB0-916E-E64DD73F3537}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down
31 changes: 31 additions & 0 deletions src/carbon-intensity-sdk/CarbonIntensityClient.Generation.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using CarbonIntensitySdk.Models;

namespace CarbonIntensitySdk
{
public partial class CarbonIntensityClient
{
/// <summary>
/// Get generation mix for current half hour
/// </summary>
/// <returns><see cref="T:GenerationMixData"/></returns>
public async Task<GenerationMixData> GetGenerationMix()
{
var data = await facade.CallApi<ApiDataResponse<GenerationMixData>>("generation");

return data.Data;
}

/// <summary>
/// Get generation mix between from and to datetimes
/// </summary>
/// <param name="from">Start Datetime in in ISO8601 format YYYY-MM-DDThh:mmZ e.g. 2017-08-25T12:35Z</param>
/// <param name="to">End datetime in in ISO8601 format YYYY-MM-DDThh:mmZ e.g. 2017-08-25T12:35Z</param>
/// <returns><see cref="T:GenerationMixData[]"/></returns>
public async Task<GenerationMixData[]> GetGenerationMix(DateTime from, DateTime to)
{
var data = await facade.CallApi<ApiListDataResponse<GenerationMixData>>($"generation/{from:yyyy-MM-ddTHH:mmZ}/{to:yyyy-MM-ddTHH:mmZ}");

return data.Data;
}
}
}
128 changes: 128 additions & 0 deletions src/carbon-intensity-sdk/CarbonIntensityClient.Intensity.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
using CarbonIntensitySdk.Models;
using CarbonIntensitySdk.Extensions;

namespace CarbonIntensitySdk
{
public partial class CarbonIntensityClient(CarbonIntensityFacade facade)
{
/// <summary>
/// Get Carbon Intensity data for current half hour
/// </summary>
/// <returns><see cref="T:CarbonIntensityData"/></returns>
public async Task<CarbonIntensityData> GetIntensityForCurrentHalfHour()
{
var data = await facade.CallApi<ApiListDataResponse<CarbonIntensityData>>("intensity");

data.Data.AssertHasSingleEntry();

return data.Data[0];
}

/// <summary>
/// Get Carbon Intensity data for today
/// </summary>
/// <returns><see cref="T:CarbonIntensityData[]"/></returns>
public async Task<CarbonIntensityData[]> GetIntensitiesForToday()
{
var data = await facade.CallApi<ApiListDataResponse<CarbonIntensityData>>("intensity/date");

return data.Data;
}

/// <summary>
/// Get Carbon Intensity data for specific date
/// </summary>
/// <param name="date">Date in YYYY-MM-DD format e.g. 2017-08-25</param>
/// <returns><see cref="T:CarbonIntensityData[]"/></returns>
public async Task<CarbonIntensityData[]> GetIntensitiesForDate(DateTime date)
{
var data = await facade.CallApi<ApiListDataResponse<CarbonIntensityData>>($"intensity/date/{date:yyyy-MM-dd}");

return data.Data;
}

/// <summary>
/// Get Carbon Intensity data for a specific date and half hour settlement period
/// </summary>
/// <param name="date">Date in YYYY-MM-DD format e.g. 2017-08-25</param>
/// <param name="period">Half hour settlement period between 1-48 e.g. 42</param>
/// <returns><see cref="T:CarbonIntensityData"/></returns>
public async Task<CarbonIntensityData> GetIntensityForDateAndPeriod(DateTime date, int period)
{
var data = await facade.CallApi<ApiListDataResponse<CarbonIntensityData>>($"intensity/date/{date:yyyy-MM-dd}/{period}");

data.Data.AssertHasSingleEntry();

return data.Data[0];
}

/// <summary>
/// Get Carbon Intensity factors for each fuel type
/// </summary>
/// <returns><see cref="T:CarbonFactors"/></returns>
public async Task<CarbonFactors> GetCarbonFactors()
{
var data = await facade.CallApi<ApiListDataResponse<CarbonFactors>>("intensity/factors");

data.Data.AssertHasSingleEntry();

return data.Data[0];
}

/// <summary>
/// Get Carbon Intensity data for specific half hour period
/// </summary>
/// <param name="from"></param>
/// <returns><see cref="T:CarbonIntensityData"/></returns>
public async Task<CarbonIntensityData> GetIntensityFrom(DateTime from)
{
var data = await facade.CallApi<ApiListDataResponse<CarbonIntensityData>>($"intensity/{from:yyyy-MM-ddTHH:mmZ}");

data.Data.AssertHasSingleEntry();

return data.Data[0];
}

/// <summary>
/// Get Carbon Intensity data between from and to datetime
/// </summary>
/// <param name="from"></param>
/// <param name="to"></param>
/// <returns><see cref="T:CarbonIntensityData[]"/></returns>
public async Task<CarbonIntensityData[]> GetIntensityBetween(DateTime from, DateTime to)
{
var data = await facade.CallApi<ApiListDataResponse<CarbonIntensityData>>($"intensity/{from:yyyy-MM-ddTHH:mmZ}/{to:yyyy-MM-ddTHH:mmZ}");

return data.Data;
}

/// <summary>
/// Get Carbon Intensity statistics between from and to datetime
/// </summary>
/// <param name="from"></param>
/// <param name="to"></param>
/// <returns><see cref="T:CarbonIntensityStatisticsData[]"/></returns>
public async Task<CarbonIntensityStatisticsData> GetIntensityStatsBetween(DateTime from, DateTime to)
{
var data = await facade.CallApi<ApiListDataResponse<CarbonIntensityStatisticsData>>($"intensity/stats/{from:yyyy-MM-ddTHH:mmZ}/{to:yyyy-MM-ddTHH:mmZ}");

data.Data.AssertHasSingleEntry();

return data.Data[0];
}

/// <summary>
/// Get block average Carbon Intensity statistics between from and to datetime
/// </summary>
/// <param name="from">Start datetime in ISO8601 format YYYY-MM-DDThh:mmZ e.g. '2017-08-25T12:35Z'</param>
/// <param name="to">End datetime in ISO8601 format YYYY-MM-DDThh:mmZ e.g. '2017-08-26T17:00Z'</param>
/// <param name="blockLengthHours">Block length in hours i.e. a block length of 2 hrs over a 24 hr period returns 12 items with the average, max, min for each 2 hr block e.g. 2017-08-26T17:00Z/2017-08-27T17:00Z/2</param>
/// <returns><see cref="T:CarbonIntensityStatisticsData[]"/></returns>
public async Task<CarbonIntensityStatisticsData[]> GetBlockAverageIntensityStats(DateTime from, DateTime to, int blockLengthHours)
{
var data = await facade.CallApi<ApiListDataResponse<CarbonIntensityStatisticsData>>($"intensity/stats/{from:yyyy-MM-ddTHH:mmZ}/{to:yyyy-MM-ddTHH:mmZ}/{blockLengthHours}");

return data.Data;
}
}
}
76 changes: 76 additions & 0 deletions src/carbon-intensity-sdk/CarbonIntensityClient.Regional.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
using CarbonIntensitySdk.Enums;
using CarbonIntensitySdk.Extensions;
using CarbonIntensitySdk.Models;

namespace CarbonIntensitySdk
{
public partial class CarbonIntensityClient
{
/// <summary>
/// Get Carbon Intensity data for current half hour for GB regions
/// </summary>
/// <returns><see cref="T:RegionalIntensityData"/></returns>
public async Task<RegionalIntensityData[]> GetRegionalData()
{
var data = await facade.CallApi<ApiListDataResponse<RegionalIntensityData>>("regional");

return data.Data;
}

public async Task<RegionalIntensityData[]> GetRegionalData(DateTime from, DateTime to)
{
var data = await facade.CallApi<ApiListDataResponse<RegionalIntensityData>>($"regional/intensity/{from:yyyy-MM-ddTHH:mmZ}/{to:yyyy-MM-ddTHH:mmZ}");
return data.Data;
}

/// <summary>
/// Get Carbon Intensity data for current half hour for the specified country
/// </summary>
/// <param name="country"></param>
/// <returns><see cref="T:CountryIntensityData"/></returns>
public async Task<CountryIntensityData> GetCountryData(Country country)
{
var region = country switch
{
Country.England => Region.England,
Country.Scotland => Region.Scotland,
Country.Wales => Region.Wales,
_ => throw new ArgumentOutOfRangeException(nameof(country), country, null)
};

return await GetRegionData(region);
}

public async Task<PostcodeIntensityData> GetPostcodeData(string postcode)
{
var data = await facade.CallApi<ApiListDataResponse<PostcodeIntensityData>>($"regional/postcode/{postcode}");

data.Data.AssertHasSingleEntry();
data.Data[0].Intensities.AssertHasSingleEntry();

return data.Data[0];
}

public async Task<PostcodeIntensityData> GetPostcodeData(string postcode, DateTime from, DateTime to)
{
var data = await facade.CallApi<ApiDataResponse<PostcodeIntensityData>>($"regional/intensity/{from:yyyy-MM-ddTHH:mmZ}/{to:yyyy-MM-ddTHH:mmZ}/postcode/{postcode}");
return data.Data;
}

public async Task<CountryIntensityData> GetRegionData(Region region)
{
var data = await facade.CallApi<ApiListDataResponse<CountryIntensityData>>($"regional/regionid/{(int)region}");

data.Data.AssertHasSingleEntry();
data.Data[0].Intensities.AssertHasSingleEntry();

return data.Data[0];
}

public async Task<CountryIntensityData> GetRegionData(Region region, DateTime from, DateTime to)
{
var data = await facade.CallApi<ApiDataResponse<CountryIntensityData>>($"regional/intensity/{from:yyyy-MM-ddTHH:mmZ}/{to:yyyy-MM-ddTHH:mmZ}/regionid/{(int)region}");
return data.Data;
}
}
}
82 changes: 0 additions & 82 deletions src/carbon-intensity-sdk/CarbonIntensityClient.cs

This file was deleted.

9 changes: 9 additions & 0 deletions src/carbon-intensity-sdk/Enums/Country.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace CarbonIntensitySdk.Enums
{
public enum Country
{
England = 0,
Scotland = 1,
Wales = 2
}
}
Loading