Additional changes to support rate_limit API call

This commit is contained in:
Mark Taylor
2015-07-26 22:03:19 +01:00
parent d88f180cd6
commit e092a109ea
17 changed files with 94 additions and 117 deletions
@@ -55,9 +55,9 @@ namespace Octokit.Reactive
/// Gets API Rate Limits (API service rather than header info).
/// </summary>
/// <exception cref="ApiException">Thrown when a general API error occurs.</exception>
/// <returns>An <see cref="MiscRateLimits"/> of Rate Limits.</returns>
/// <returns>An <see cref="MiscellaneousRateLimit"/> of Rate Limits.</returns>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate")]
IObservable<MiscRateLimits> GetRateLimits();
IObservable<MiscellaneousRateLimit> GetRateLimits();
}
}
@@ -79,9 +79,9 @@ namespace Octokit.Reactive
/// Gets API Rate Limits (API service rather than header info).
/// </summary>
/// <exception cref="ApiException">Thrown when a general API error occurs.</exception>
/// <returns>An <see cref="MiscRateLimits"/> of Rate Limits.</returns>
/// <returns>An <see cref="MiscellaneousRateLimit"/> of Rate Limits.</returns>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate")]
public IObservable<MiscRateLimits> GetRateLimits()
public IObservable<MiscellaneousRateLimit> GetRateLimits()
{
return _client.GetRateLimits().ToObservable();
}
@@ -91,24 +91,24 @@ public class MiscellaneousClientTests
Assert.True(result.Resources.Core.Limit > 0);
Assert.True(result.Resources.Core.Remaining > -1);
Assert.True(result.Resources.Core.Remaining <= result.Resources.Core.Limit);
Assert.True(result.Resources.Core.Reset > 0);
Assert.NotNull(result.Resources.Core.ResetAsDateTimeOffset);
Assert.True(result.Resources.Core.ResetAsUtcEpochSeconds > 0);
Assert.NotNull(result.Resources.Core.Reset);
// Test the search limits
Assert.NotNull(result.Resources.Search);
Assert.True(result.Resources.Search.Limit > 0);
Assert.True(result.Resources.Search.Remaining > -1);
Assert.True(result.Resources.Search.Remaining <= result.Resources.Search.Limit);
Assert.True(result.Resources.Search.Reset > 0);
Assert.NotNull(result.Resources.Search.ResetAsDateTimeOffset);
Assert.True(result.Resources.Search.ResetAsUtcEpochSeconds > 0);
Assert.NotNull(result.Resources.Search.Reset);
// Test the depreciated rate limits
Assert.NotNull(result.Rate);
Assert.True(result.Rate.Limit > 0);
Assert.True(result.Rate.Remaining > -1);
Assert.True(result.Rate.Remaining <= result.Rate.Limit);
Assert.True(result.Resources.Search.Reset > 0);
Assert.NotNull(result.Resources.Search.ResetAsDateTimeOffset);
Assert.True(result.Resources.Search.ResetAsUtcEpochSeconds > 0);
Assert.NotNull(result.Resources.Search.Reset);
}
}
@@ -64,19 +64,19 @@ namespace Octokit.Tests.Clients
[Fact]
public async Task RequestsTheRecourceRateLimitEndpoint()
{
IApiResponse<MiscRateLimits> response = new ApiResponse<MiscRateLimits>
IApiResponse<MiscellaneousRateLimit> response = new ApiResponse<MiscellaneousRateLimit>
(
new Response(),
new MiscRateLimits(
new ResourceRateLimits(
new ResourceRateLimit(5000, 4999, 1372700873),
new ResourceRateLimit(30, 18, 1372700873)
new MiscellaneousRateLimit(
new ResourceRateLimit(
new RateLimit(5000, 4999, 1372700873),
new RateLimit(30, 18, 1372700873)
),
new ResourceRateLimit(100, 75, 1372700873)
new RateLimit(100, 75, 1372700873)
)
);
var connection = Substitute.For<IConnection>();
connection.Get<MiscRateLimits>(Args.Uri, null, null).Returns(Task.FromResult(response));
connection.Get<MiscellaneousRateLimit>(Args.Uri, null, null).Returns(Task.FromResult(response));
var client = new MiscellaneousClient(connection);
var result = await client.GetRateLimits();
@@ -91,37 +91,37 @@ namespace Octokit.Tests.Clients
Assert.NotNull(result.Resources.Core);
Assert.Equal(5000, result.Resources.Core.Limit);
Assert.Equal(4999, result.Resources.Core.Remaining);
Assert.Equal(1372700873, result.Resources.Core.Reset);
Assert.Equal(1372700873, result.Resources.Core.ResetAsUtcEpochSeconds);
var expectedReset = DateTimeOffset.ParseExact(
"Mon 01 Jul 2013 5:47:53 PM -00:00",
"ddd dd MMM yyyy h:mm:ss tt zzz",
CultureInfo.InvariantCulture);
Assert.Equal(expectedReset, result.Resources.Core.ResetAsDateTimeOffset);
Assert.Equal(expectedReset, result.Resources.Core.Reset);
// Test the search limits
Assert.NotNull(result.Resources.Search);
Assert.Equal(30, result.Resources.Search.Limit);
Assert.Equal(18, result.Resources.Search.Remaining);
Assert.Equal(1372700873, result.Resources.Search.Reset);
Assert.Equal(1372700873, result.Resources.Search.ResetAsUtcEpochSeconds);
expectedReset = DateTimeOffset.ParseExact(
"Mon 01 Jul 2013 5:47:53 PM -00:00",
"ddd dd MMM yyyy h:mm:ss tt zzz",
CultureInfo.InvariantCulture);
Assert.Equal(expectedReset, result.Resources.Search.ResetAsDateTimeOffset);
Assert.Equal(expectedReset, result.Resources.Search.Reset);
// Test the depreciated rate limits
Assert.NotNull(result.Rate);
Assert.Equal(100, result.Rate.Limit);
Assert.Equal(75, result.Rate.Remaining);
Assert.Equal(1372700873, result.Rate.Reset);
Assert.Equal(1372700873, result.Rate.ResetAsUtcEpochSeconds);
expectedReset = DateTimeOffset.ParseExact(
"Mon 01 Jul 2013 5:47:53 PM -00:00",
"ddd dd MMM yyyy h:mm:ss tt zzz",
CultureInfo.InvariantCulture);
Assert.Equal(expectedReset, result.Rate.ResetAsDateTimeOffset);
Assert.Equal(expectedReset, result.Rate.Reset);
connection.Received()
.Get<MiscRateLimits>(Arg.Is<Uri>(u => u.ToString() == "rate_limit"), null, null);
.Get<MiscellaneousRateLimit>(Arg.Is<Uri>(u => u.ToString() == "rate_limit"), null, null);
}
}
+2 -2
View File
@@ -64,8 +64,8 @@ namespace Octokit
/// Gets API Rate Limits (API service rather than header info).
/// </summary>
/// <exception cref="ApiException">Thrown when a general API error occurs.</exception>
/// <returns>An <see cref="MiscRateLimits"/> of Rate Limits.</returns>
/// <returns>An <see cref="MiscellaneousRateLimit"/> of Rate Limits.</returns>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate")]
Task<MiscRateLimits> GetRateLimits();
Task<MiscellaneousRateLimit> GetRateLimits();
}
}
+3 -5
View File
@@ -121,15 +121,13 @@ namespace Octokit
/// Gets API Rate Limits (API service rather than header info).
/// </summary>
/// <exception cref="ApiException">Thrown when a general API error occurs.</exception>
/// <returns>An <see cref="MiscRateLimits"/> of Rate Limits.</returns>
/// <returns>An <see cref="MiscellaneousRateLimit"/> of Rate Limits.</returns>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate")]
public async Task<MiscRateLimits> GetRateLimits()
public async Task<MiscellaneousRateLimit> GetRateLimits()
{
var endpoint = new Uri("rate_limit", UriKind.Relative);
var response = await _connection.Get<MiscRateLimits>(endpoint, null, null).ConfigureAwait(false);
//var response = await _connection.Get<JsonObject>(endpoint, null, null).ConfigureAwait(false);
var response = await _connection.Get<MiscellaneousRateLimit>(endpoint, null, null).ConfigureAwait(false);
return response.Body;
//return null;
}
}
}
@@ -18,5 +18,14 @@ namespace Octokit.Helpers
{
return new DateTimeOffset(unixTime * TimeSpan.TicksPerSecond + unixEpochTicks, TimeSpan.Zero);
}
/// <summary>
/// Convert <see cref="DateTimeOffset"/> with UTC offset to a Unix tick
/// </summary>
/// <param name="date">Date Time with UTC offset</param>
public static long ToUnixTime(this DateTimeOffset date)
{
return (date.Ticks - unixEpochTicks) / TimeSpan.TicksPerSecond;
}
}
}
+31
View File
@@ -2,17 +2,22 @@
using System.Collections.Generic;
using System.Runtime.Serialization;
using Octokit.Helpers;
using System.Diagnostics;
using System.Globalization;
using Octokit.Internal;
namespace Octokit
{
#if !NETFX_CORE
[Serializable]
#endif
[DebuggerDisplay("{DebuggerDisplay,nq}")]
public class RateLimit
#if !NETFX_CORE
: ISerializable
#endif
{
public RateLimit() {}
public RateLimit(IDictionary<string, string> responseHeaders)
{
@@ -23,6 +28,17 @@ namespace Octokit
Reset = GetHeaderValueAsInt32Safe(responseHeaders, "X-RateLimit-Reset").FromUnixTime();
}
public RateLimit(int limit, int remaining, long reset)
{
Ensure.ArgumentNotNull(limit, "limit");
Ensure.ArgumentNotNull(remaining, "remaining");
Ensure.ArgumentNotNull(reset, "reset");
Limit = limit;
Remaining = remaining;
Reset = reset.FromUnixTime();
}
/// <summary>
/// The maximum number of requests that the consumer is permitted to make per hour.
/// </summary>
@@ -36,8 +52,16 @@ namespace Octokit
/// <summary>
/// The date and time at which the current rate limit window resets
/// </summary>
[ParameterAttribute(Key = "ignoreThisField")]
public DateTimeOffset Reset { get; private set; }
/// <summary>
/// The date and time at which the current rate limit window resets - in UTC epoch seconds
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
[ParameterAttribute(Key = "reset")]
public long ResetAsUtcEpochSeconds { get { return Reset.ToUnixTime(); } private set { Reset = value.FromUnixTime(); } }
static long GetHeaderValueAsInt32Safe(IDictionary<string, string> responseHeaders, string key)
{
string value;
@@ -66,5 +90,12 @@ namespace Octokit
info.AddValue("Reset", Reset.Ticks);
}
#endif
internal string DebuggerDisplay
{
get
{
return String.Format(CultureInfo.InvariantCulture, "Limit {0}, Remaining {1}, Reset {2} ", Limit, Remaining, Reset);
}
}
}
}
@@ -9,11 +9,11 @@ using System.Threading.Tasks;
namespace Octokit
{
[DebuggerDisplay("{DebuggerDisplay,nq}")]
public class MiscRateLimits
public class MiscellaneousRateLimit
{
public MiscRateLimits() {}
public MiscellaneousRateLimit() {}
public MiscRateLimits(ResourceRateLimits resources, ResourceRateLimit rate)
public MiscellaneousRateLimit(ResourceRateLimit resources, RateLimit rate)
{
Ensure.ArgumentNotNull(resources, "resource");
Ensure.ArgumentNotNull(rate, "rate");
@@ -25,12 +25,12 @@ namespace Octokit
/// <summary>
/// Object of resources rate limits
/// </summary>
public ResourceRateLimits Resources { get; private set; }
public ResourceRateLimit Resources { get; private set; }
/// <summary>
/// Legacy rate limit - to be depreciated - https://developer.github.com/v3/rate_limit/#deprecation-notice
/// </summary>
public ResourceRateLimit Rate { get; private set; }
public RateLimit Rate { get; private set; }
internal string DebuggerDisplay
{
+14 -27
View File
@@ -9,47 +9,34 @@ namespace Octokit
[DebuggerDisplay("{DebuggerDisplay,nq}")]
public class ResourceRateLimit
{
public ResourceRateLimit() { }
public ResourceRateLimit() {}
public ResourceRateLimit(int limit, int remaining, long reset)
public ResourceRateLimit(RateLimit core, RateLimit search)
{
Ensure.ArgumentNotNull(limit, "limit");
Ensure.ArgumentNotNull(remaining, "remaining");
Ensure.ArgumentNotNull(reset, "reset");
Ensure.ArgumentNotNull(core, "core");
Ensure.ArgumentNotNull(search, "search");
Limit = limit;
Remaining = remaining;
Reset = reset;
Core = core;
Search = search;
}
/// <summary>
/// Rate limits for core API (rate limit for everything except Search API)
/// </summary>
public RateLimit Core { get; private set; }
/// <summary>
/// The maximum number of requests that the consumer is permitted to make per hour.
/// Rate Limits for Search API
/// </summary>
public int Limit { get; private set; }
/// <summary>
/// The number of requests remaining in the current rate limit window.
/// </summary>
public int Remaining { get; private set; }
/// <summary>
/// The date and time at which the current rate limit window resets - in UTC epoch seconds
/// </summary>
public long Reset { get; private set; }
/// <summary>
/// The date and time at which the current rate limit window resets - as DateTimeOffset
/// </summary>
public DateTimeOffset ResetAsDateTimeOffset { get { return Reset.FromUnixTime(); } }
public RateLimit Search { get; private set; }
internal string DebuggerDisplay
{
get
{
return String.Format(CultureInfo.InvariantCulture, "Limit {0}, Remaining {1}, Reset {2} ", Limit, Remaining, Reset);
return String.Format(CultureInfo.InvariantCulture, "Core: {0}; Search: {1} ", Core.DebuggerDisplay, Search.DebuggerDisplay);
}
}
}
}
@@ -1,42 +0,0 @@
using System;
using System.Diagnostics;
using System.Globalization;
using Octokit.Helpers;
namespace Octokit
{
[DebuggerDisplay("{DebuggerDisplay,nq}")]
public class ResourceRateLimits
{
public ResourceRateLimits() {}
public ResourceRateLimits(ResourceRateLimit core, ResourceRateLimit search)
{
Ensure.ArgumentNotNull(core, "core");
Ensure.ArgumentNotNull(search, "search");
Core = core;
Search = search;
}
/// <summary>
/// Rate limits for core API (rate limit for everything except Search API)
/// </summary>
public ResourceRateLimit Core { get; private set; }
/// <summary>
/// Rate Limits for Search API
/// </summary>
public ResourceRateLimit Search { get; private set; }
internal string DebuggerDisplay
{
get
{
return String.Format(CultureInfo.InvariantCulture, "Core: {0}; Search: {1} ", Core.DebuggerDisplay, Search.DebuggerDisplay);
}
}
}
}
+1 -2
View File
@@ -396,9 +396,8 @@
<Compile Include="Exceptions\TwoFactorAuthorizationException.cs" />
<Compile Include="Http\HttpMessageHandlerFactory.cs" />
<Compile Include="Models\Response\TeamMembership.cs" />
<Compile Include="Models\Response\ResourceRateLimits.cs" />
<Compile Include="Models\Response\ResourceRateLimit.cs" />
<Compile Include="Models\Response\MiscRateLimits.cs" />
<Compile Include="Models\Response\MiscellaneousRateLimit.cs" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project>
+1 -2
View File
@@ -412,9 +412,8 @@
<Compile Include="Models\Request\RepositoryHookTestRequest.cs" />
<Compile Include="Http\HttpMessageHandlerFactory.cs" />
<Compile Include="Models\Response\TeamMembership.cs" />
<Compile Include="Models\Response\ResourceRateLimits.cs" />
<Compile Include="Models\Response\ResourceRateLimit.cs" />
<Compile Include="Models\Response\MiscRateLimits.cs" />
<Compile Include="Models\Response\MiscellaneousRateLimit.cs" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
</Project>
+1 -2
View File
@@ -405,9 +405,8 @@
<Compile Include="Models\Request\RepositoryHookTestRequest.cs" />
<Compile Include="Http\HttpMessageHandlerFactory.cs" />
<Compile Include="Models\Response\TeamMembership.cs" />
<Compile Include="Models\Response\ResourceRateLimits.cs" />
<Compile Include="Models\Response\ResourceRateLimit.cs" />
<Compile Include="Models\Response\MiscRateLimits.cs" />
<Compile Include="Models\Response\MiscellaneousRateLimit.cs" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.MonoTouch.CSharp.targets" />
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+1 -2
View File
@@ -394,9 +394,8 @@
<Compile Include="Exceptions\TwoFactorAuthorizationException.cs" />
<Compile Include="Http\HttpMessageHandlerFactory.cs" />
<Compile Include="Models\Response\TeamMembership.cs" />
<Compile Include="Models\Response\ResourceRateLimits.cs" />
<Compile Include="Models\Response\ResourceRateLimit.cs" />
<Compile Include="Models\Response\MiscRateLimits.cs" />
<Compile Include="Models\Response\MiscellaneousRateLimit.cs" />
</ItemGroup>
<ItemGroup>
<CodeAnalysisDictionary Include="..\CustomDictionary.xml">
+1 -2
View File
@@ -398,9 +398,8 @@
<Compile Include="Exceptions\TwoFactorAuthorizationException.cs" />
<Compile Include="Http\HttpMessageHandlerFactory.cs" />
<Compile Include="Models\Response\TeamMembership.cs" />
<Compile Include="Models\Response\ResourceRateLimits.cs" />
<Compile Include="Models\Response\ResourceRateLimit.cs" />
<Compile Include="Models\Response\MiscRateLimits.cs" />
<Compile Include="Models\Response\MiscellaneousRateLimit.cs" />
</ItemGroup>
<ItemGroup>
<CodeAnalysisDictionary Include="..\CustomDictionary.xml">
+1 -2
View File
@@ -116,10 +116,9 @@
<Compile Include="Models\Response\ContentType.cs" />
<Compile Include="Models\Response\ApplicationAuthorization.cs" />
<Compile Include="Models\Response\GitHubCommitFile.cs" />
<Compile Include="Models\Response\MiscRateLimits.cs" />
<Compile Include="Models\Response\MiscellaneousRateLimit.cs" />
<Compile Include="Models\Response\PublicKey.cs" />
<Compile Include="Models\Response\PullRequestFile.cs" />
<Compile Include="Models\Response\ResourceRateLimits.cs" />
<Compile Include="Models\Response\ResourceRateLimit.cs" />
<Compile Include="Models\Response\RepositoryContent.cs" />
<Compile Include="Models\Response\RepositoryContentChangeSet.cs" />