Skip to content

Commit

Permalink
Commons divisions almost done.
Browse files Browse the repository at this point in the history
  • Loading branch information
mikaeldui committed Nov 13, 2022
1 parent ddd1d68 commit c1fb5da
Show file tree
Hide file tree
Showing 10 changed files with 219 additions and 33 deletions.
69 changes: 69 additions & 0 deletions UnitedKingdom.Parliament.Client.Tests/CommonsTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,74 @@ public async Task GetDivisionsAsync()
Assert.IsTrue(result.Items.Any());
Assert.IsNotNull(result.Items.First().Title);
}

[TestMethod]
public async Task GetDivisionByIdAsync()
{
using ParliamentClient client = new();
var result = await client.Commons.Divisions.GetDivisionAsync(1540507);
Assert.IsNotNull(result);
Assert.IsNotNull(result.Title);
}

[TestMethod]
public async Task GetDivisionAsync()
{
using ParliamentClient client = new();
var divisions = await client.Commons.Divisions.GetDivisionsAsync(options =>
{
options.PageSize = 20;
options.Sort.Add("-date");
});
var result = await client.Commons.Divisions.GetDivisionAsync(divisions.Items.First());
Assert.IsNotNull(result);
Assert.IsNotNull(result.Title);
}

[TestMethod]
public async Task GetDivisionsBySessionAsync()
{
using ParliamentClient client = new();
var divisions = await client.Commons.Divisions.GetDivisionsAsync(options =>
{
options.PageSize = 20;
options.Sort.Add("-date");
});
var division = await client.Commons.Divisions.GetDivisionAsync(divisions.Items.First());
var result = await client.Commons.Divisions.GetDivisionsBySessionAsync(division.Session.First());
Assert.IsNotNull(result);
Assert.IsTrue(result.Items.Any());
Assert.IsNotNull(result.Items.First().Title);
}

[TestMethod]
public async Task GetDivisionsByUinAsync()
{
using ParliamentClient client = new();
var divisions = await client.Commons.Divisions.GetDivisionsAsync(options =>
{
options.PageSize = 20;
options.Sort.Add("-date");
});
var result = await client.Commons.Divisions.GetDivisionsByUinAsync(divisions.Items.First().Uin);
Assert.IsNotNull(result);
Assert.IsTrue(result.Items.Any());
Assert.IsNotNull(result.Items.First().Title);
}

[TestMethod]
public async Task GetDivisionVoteAsync()
{
using ParliamentClient client = new();
var divisions = await client.Commons.Divisions.GetDivisionsAsync(options =>
{
options.PageSize = 20;
options.Sort.Add("-date");
});
var division = await client.Commons.Divisions.GetDivisionAsync(divisions.Items.First());
var result = await client.Commons.Divisions.GetDivisionVoteAsync(division.GetId(), division.Votes.First().GetId());
Assert.IsNotNull(result);
Assert.IsNotNull(result.MemberParty);
}
}
}
28 changes: 28 additions & 0 deletions UnitedKingdom.Parliament.Client/Models/CommonsDivision.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
using System.Text.Json.Serialization;

namespace UnitedKingdom.Parliament
{
public class CommonsDivision : LinkedData
{
public DateTimeValue Date { get; set; }
public string Title { get; set; }
public string Uin { get; set; }

// Extended

public StringValue[]? AbstainCount { get; set; }
public StringValue[]? AyesCount { get; set; }
public bool? DeferredVote { get; set; }
public StringValue[]? DidNotVoteCount { get; set; }
public StringValue[]? ErrorVoteCount { get; set; }
public StringValue[]? Margin { get; set; }
public StringValue[]? NoesVoteCount { get; set; }
public StringValue[]? NoneligibleCount { get; set; }
public StringValue[]? SuspendedOrExpelledVotesCount { get; set; }
public string? DivisionNumber { get; set; }
public Uri[]? Legislature { get; set; }
public string[]? Session { get; set; }
[JsonPropertyName("vote")]
public CommonsDivisionVote[]? Votes { get; set; }
}
}
10 changes: 10 additions & 0 deletions UnitedKingdom.Parliament.Client/Models/CommonsDivisionVote.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace UnitedKingdom.Parliament
{
public class CommonsDivisionVote : LinkedData
{
public Member[]? Member { get; set; }
public string MemberParty { get; set; }
public StringValue MemberGender { get; set; }
public StringValue MemberPrinted { get; set; }
}
}
7 changes: 7 additions & 0 deletions UnitedKingdom.Parliament.Client/Models/Member.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace UnitedKingdom.Parliament
{
public class Member : LinkedData
{
public StringValue Label { get; set; }
}
}
48 changes: 31 additions & 17 deletions UnitedKingdom.Parliament.Client/ParliamentCommonsDivisionsClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,24 +15,38 @@ public class ParliamentCommonsDivisionsClient
/// <summary>
/// All Commons Divisions.
/// </summary>
public async Task<ParliamentPage<CommonsDivision>?> GetDivisionsAsync(Action<ParliamentPageOptions>? options = null) =>
await _restClient.GetPageAsync<CommonsDivision>("commonsdivisions", options);
}
public async Task<ParliamentListPage<CommonsDivision>?> GetDivisionsAsync(Action<ParliamentPageOptions>? options = null) =>
await _restClient.GetListPageAsync<CommonsDivision>("commonsdivisions", options);

public class CommonsDivision
{
[JsonPropertyName("_about")]
public Uri About { get; set; }
public Date Date { get; set; }
public string Title { get; set; }
public string Uin { get; set; }
}
/// <summary>
/// Commons Division by ID.
/// </summary>
public async Task<CommonsDivision?> GetDivisionAsync(int id) =>
await _restClient.GetItemAsync<CommonsDivision>("commonsdivisions/" + id);

public class Date
{
[JsonPropertyName("_value")]
public DateTime Value { get; set; }
[JsonPropertyName("_datatype")]
public string DataType { get; set; }
/// <summary>
/// Commons Division.
/// </summary>
public async Task<CommonsDivision?> GetDivisionAsync(CommonsDivision division) =>
await GetDivisionAsync(division.GetId());

/// <summary>
/// Commons Divisions by Session.
/// </summary>
public async Task<ParliamentListPage<CommonsDivision>?> GetDivisionsBySessionAsync(string session, Action<ParliamentPageOptions>? options = null) =>
await _restClient.GetListPageAsync<CommonsDivision>("commonsdivisions?session=" + session, options);

/// <summary>
/// Commons Divisions by UIN.
/// </summary>
public async Task<ParliamentListPage<CommonsDivision>?> GetDivisionsByUinAsync(string uin, Action<ParliamentPageOptions>? options = null) =>
await _restClient.GetListPageAsync<CommonsDivision>("commonsdivisions?uin=" + uin, options);


/// <summary>
/// Commons Division Vote by ID.
/// </summary>
public async Task<CommonsDivisionVote?> GetDivisionVoteAsync(int divisionId, int voteId) =>
await _restClient.GetItemAsync<CommonsDivisionVote>($"resources/{divisionId}/vote/{voteId}");
}
}
14 changes: 12 additions & 2 deletions UnitedKingdom.Parliament.Client/Rest/ParliamentRestClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ internal class ParliamentRestClient : HttpClient
return result.Result;
}

public async Task<ParliamentPage<TResult>?> GetPageAsync<TResult>(string url, Action<ParliamentPageOptions>? options = null)
public async Task<ParliamentListPage<TResult>?> GetListPageAsync<TResult>(string url, Action<ParliamentPageOptions>? options = null)
{
if (options != null)
{
Expand All @@ -35,8 +35,18 @@ internal class ParliamentRestClient : HttpClient
else
url += "?" + queryString;
}
var result = await GetAsync<ParliamentPage<TResult>>(url);
var result = await GetAsync<ParliamentListPage<TResult>>(url);
return result;
}

public async Task<ParliamentItemPage<TResult>?> GetItemPageAsync<TResult>(string url) =>
await GetAsync<ParliamentItemPage<TResult>>(url);

public async Task<TResult?> GetItemAsync<TResult>(string url)
{
var result = await GetAsync<ParliamentItemPage<TResult>>(url);
if (result == null) return default;
return result.PrimaryTopic;
}
}
}
29 changes: 29 additions & 0 deletions UnitedKingdom.Parliament.Client/Schema/IValue.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using System.ComponentModel;
using System.Text.Json.Serialization;

namespace UnitedKingdom.Parliament
{
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
public interface IValue
{
[JsonPropertyName("_value")]
object Value { get; set; }
}

[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
public class StringValue : IValue
{
[JsonPropertyName("_value")]
public string Value { get; set; }
object IValue.Value { get => Value; set => Value = (string)value; }
}

public class DateTimeValue : IValue
{
[JsonPropertyName("_value")]
public DateTime Value { get; set; }
[JsonPropertyName("_datatype")]
public string DataType { get; set; }
object IValue.Value { get => Value; set => Value = (DateTime)value; }
}
}
20 changes: 20 additions & 0 deletions UnitedKingdom.Parliament.Client/Schema/LinkedData.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using System.Text.Json.Serialization;

namespace UnitedKingdom.Parliament
{
public abstract class LinkedData
{
[JsonPropertyName("_about")]
public Uri About { get; set; }
/// <summary>
/// Can be one or multiple URLs.
/// </summary>
public object? Type { get; set; }
public Uri? IsPrimaryTopicOf { get; set; }

/// <summary>
/// Get the numeric resource ID.
/// </summary>
public int GetId() => int.Parse(About.AbsolutePath.AfterLast('/'));
}
}
Original file line number Diff line number Diff line change
@@ -1,29 +1,32 @@
using System.Text.Json.Serialization;

namespace UnitedKingdom.Parliament.Rest
namespace UnitedKingdom.Parliament
{
public class ParliamentPage<TType>
public abstract class ParliamentPageBase : LinkedData
{
[JsonPropertyName("_about")]
public Uri About { get; set; }
public Uri Definition { get; set; }
public Uri ExtendedMetadataVersion { get; set; }
}

public class ParliamentListPage<TType> : ParliamentPageBase
{
public TType[]? Items { get; set; }
public Uri First { get; set; }
public Uri HasPart { get; set; }
/// <summary>
/// Can be one of multiple URLs.
/// </summary>
public object IsPartOf { get; set; }
public TType? PrimaryTopic { get; set; }
public TType[]? Items { get; set; }
public int ItemsPerPage { get; set; }
public Uri Next { get; set; }
public int Page { get; set; }
public int StartIndex { get; set; }
public int TotalResults { get; set; }
/// <summary>
/// Can be one or multiple URLs.
/// </summary>
public object Type { get; set; }
}


public class ParliamentItemPage<TType> : ParliamentPageBase
{
public TType? PrimaryTopic { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,4 @@
<PackageReference Include="MikaelDui.Extensions" Version="*" />
</ItemGroup>

<ItemGroup>
<Folder Include="Models\" />
</ItemGroup>

</Project>

0 comments on commit c1fb5da

Please sign in to comment.