From b41c00c4c450bbae4f48447db1bcc67697e78e48 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sun, 14 Feb 2016 18:04:28 +1100 Subject: [PATCH] extracted pagination function to separate type --- Octokit.Reactive/Octokit.Reactive-Mono.csproj | 5 +- .../Octokit.Reactive-MonoAndroid.csproj | 5 +- .../Octokit.Reactive-Monotouch.csproj | 5 +- Octokit.Reactive/Octokit.Reactive.csproj | 3 + Octokit/Helpers/Pagination.cs | 76 +++++++++++++++++++ Octokit/Octokit-Mono.csproj | 1 + Octokit/Octokit-MonoAndroid.csproj | 1 + Octokit/Octokit-Monotouch.csproj | 1 + Octokit/Octokit-Portable.csproj | 1 + Octokit/Octokit-netcore45.csproj | 1 + Octokit/Octokit.csproj | 3 +- 11 files changed, 98 insertions(+), 4 deletions(-) create mode 100644 Octokit/Helpers/Pagination.cs diff --git a/Octokit.Reactive/Octokit.Reactive-Mono.csproj b/Octokit.Reactive/Octokit.Reactive-Mono.csproj index 10d63457..80fd88f2 100644 --- a/Octokit.Reactive/Octokit.Reactive-Mono.csproj +++ b/Octokit.Reactive/Octokit.Reactive-Mono.csproj @@ -52,6 +52,9 @@ Helpers\Ensure.cs + + Helpers\Pagination.cs + Properties\SolutionInfo.cs @@ -179,4 +182,4 @@ Octokit-Mono - \ No newline at end of file + diff --git a/Octokit.Reactive/Octokit.Reactive-MonoAndroid.csproj b/Octokit.Reactive/Octokit.Reactive-MonoAndroid.csproj index d0f878da..ce887c4c 100644 --- a/Octokit.Reactive/Octokit.Reactive-MonoAndroid.csproj +++ b/Octokit.Reactive/Octokit.Reactive-MonoAndroid.csproj @@ -60,6 +60,9 @@ Helpers\Ensure.cs + + Helpers\Pagination.cs + Properties\SolutionInfo.cs @@ -187,4 +190,4 @@ Octokit-MonoAndroid - \ No newline at end of file + diff --git a/Octokit.Reactive/Octokit.Reactive-Monotouch.csproj b/Octokit.Reactive/Octokit.Reactive-Monotouch.csproj index ce3efdbe..14a1c7ea 100644 --- a/Octokit.Reactive/Octokit.Reactive-Monotouch.csproj +++ b/Octokit.Reactive/Octokit.Reactive-Monotouch.csproj @@ -56,6 +56,9 @@ Helpers\Ensure.cs + + Helpers\Pagination.cs + Properties\SolutionInfo.cs @@ -183,4 +186,4 @@ Octokit-Monotouch - \ No newline at end of file + diff --git a/Octokit.Reactive/Octokit.Reactive.csproj b/Octokit.Reactive/Octokit.Reactive.csproj index 607a71eb..ebf316aa 100644 --- a/Octokit.Reactive/Octokit.Reactive.csproj +++ b/Octokit.Reactive/Octokit.Reactive.csproj @@ -72,6 +72,9 @@ Helpers\Ensure.cs + + Helpers\Pagination.cs + Properties\SolutionInfo.cs diff --git a/Octokit/Helpers/Pagination.cs b/Octokit/Helpers/Pagination.cs new file mode 100644 index 00000000..1acf39ea --- /dev/null +++ b/Octokit/Helpers/Pagination.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; + +namespace Octokit +{ + internal static class Pagination + { + internal static IDictionary Setup(IDictionary parameters, ApiOptions options) + { + parameters = parameters ?? new Dictionary(); + + if (options.PageSize.HasValue) + { + parameters.Add("per_page", options.PageSize.Value.ToString(CultureInfo.InvariantCulture)); + } + + if (options.StartPage.HasValue) + { + parameters.Add("page", options.StartPage.Value.ToString(CultureInfo.InvariantCulture)); + } + + return parameters; + } + + internal static bool ShouldContinue( + Uri uri, + ApiOptions options) + { + if (uri == null) + { + return false; + } + + if (uri.Query.Contains("page=") && options.PageCount.HasValue) + { + var allValues = ToQueryStringDictionary(uri); + + string pageValue; + if (allValues.TryGetValue("page", out pageValue)) + { + var startPage = options.StartPage ?? 1; + var pageCount = options.PageCount.Value; + + var endPage = startPage + pageCount; + if (pageValue.Equals(endPage.ToString(CultureInfo.InvariantCulture), StringComparison.OrdinalIgnoreCase)) + { + return false; + } + } + } + + return true; + } + + static Dictionary ToQueryStringDictionary(Uri uri) + { + return uri.Query.Split('&') + .Select(keyValue => + { + var indexOf = keyValue.IndexOf('='); + if (indexOf > 0) + { + var key = keyValue.Substring(0, indexOf); + var value = keyValue.Substring(indexOf + 1); + return new KeyValuePair(key, value); + } + + //just a plain old value, return it + return new KeyValuePair(keyValue, null); + }) + .ToDictionary(x => x.Key, x => x.Value); + } + } +} diff --git a/Octokit/Octokit-Mono.csproj b/Octokit/Octokit-Mono.csproj index c518b97d..3e4bcc99 100644 --- a/Octokit/Octokit-Mono.csproj +++ b/Octokit/Octokit-Mono.csproj @@ -448,6 +448,7 @@ + \ No newline at end of file diff --git a/Octokit/Octokit-MonoAndroid.csproj b/Octokit/Octokit-MonoAndroid.csproj index 904a34c0..4bda9bba 100644 --- a/Octokit/Octokit-MonoAndroid.csproj +++ b/Octokit/Octokit-MonoAndroid.csproj @@ -456,6 +456,7 @@ + \ No newline at end of file diff --git a/Octokit/Octokit-Monotouch.csproj b/Octokit/Octokit-Monotouch.csproj index 9816e046..8dabb0fa 100644 --- a/Octokit/Octokit-Monotouch.csproj +++ b/Octokit/Octokit-Monotouch.csproj @@ -452,6 +452,7 @@ + diff --git a/Octokit/Octokit-Portable.csproj b/Octokit/Octokit-Portable.csproj index f2faa095..6f03fac3 100644 --- a/Octokit/Octokit-Portable.csproj +++ b/Octokit/Octokit-Portable.csproj @@ -445,6 +445,7 @@ + diff --git a/Octokit/Octokit-netcore45.csproj b/Octokit/Octokit-netcore45.csproj index 2a4d4aa8..7268c43b 100644 --- a/Octokit/Octokit-netcore45.csproj +++ b/Octokit/Octokit-netcore45.csproj @@ -452,6 +452,7 @@ + diff --git a/Octokit/Octokit.csproj b/Octokit/Octokit.csproj index 22536261..0eb8c1d0 100644 --- a/Octokit/Octokit.csproj +++ b/Octokit/Octokit.csproj @@ -102,6 +102,7 @@ + @@ -484,4 +485,4 @@ --> - + \ No newline at end of file