Esempio n. 1
0
        public async Task <IEnumerable <Issue> > GetIssuesAsync1(
            string ownerName,
            string repoName,
            IProgress <int> progress,
            CancellationToken cancellationToken = default)
        {
            const int maxIssuesCount = 100;
            var       issues         = new List <Issue>();

            var request = new IssuesRequest {
                OwnerName = ownerName, RepoName = repoName, Query = IssuesQuery
            };

            while (true)
            {
                await Task.Delay(100, cancellationToken).ConfigureAwait(false);

                var response = await PostAsync(request, cancellationToken).ConfigureAwait(false);

                issues.AddRange(response.Issues);
                progress?.Report(issues.Count);

                if (!response.HasMorePages || issues.Count >= maxIssuesCount)
                {
                    break;
                }

                request.StartCursor = response.StartCursor;

                cancellationToken.ThrowIfCancellationRequested();
            }

            return(issues);
        }
Esempio n. 2
0
        public async IAsyncEnumerable <Issue> GetIssuesAsync4(
            string ownerName,
            string repoName,
            [EnumeratorCancellation] CancellationToken cancellationToken = default)
        {
            var request = new IssuesRequest {
                OwnerName = ownerName, RepoName = repoName, Query = IssuesQuery
            };

            while (true)
            {
                await Task.Delay(100, cancellationToken).ConfigureAwait(false);

                var response = await PostAsync(request, cancellationToken).ConfigureAwait(false);

                foreach (var issue in response.Issues)
                {
                    yield return(issue);
                }

                if (!response.HasMorePages)
                {
                    yield break;
                }

                request.StartCursor = response.StartCursor;

                cancellationToken.ThrowIfCancellationRequested();
            }
        }
Esempio n. 3
0
        public IObservable <Issue> GetIssuesAsync3(string ownerName, string repoName)
        {
            return(Observable.Create <Issue>(async(observer, cancellationToken) =>
            {
                var request = new IssuesRequest {
                    OwnerName = ownerName, RepoName = repoName, Query = IssuesQuery
                };

                while (true)
                {
                    await Task.Delay(100, cancellationToken).ConfigureAwait(false);

                    var response = await PostAsync(request, cancellationToken).ConfigureAwait(false);

                    foreach (var issue in response.Issues)
                    {
                        observer.OnNext(issue);
                    }

                    if (!response.HasMorePages)
                    {
                        observer.OnCompleted();
                        break;
                    }

                    request.StartCursor = response.StartCursor;

                    cancellationToken.ThrowIfCancellationRequested();
                }
            }));
        }
Esempio n. 4
0
        private async Task <IssuesResponse> PostAsync(IssuesRequest request, CancellationToken token)
        {
            var postBody = request.ToJsonText();

            var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, new Uri("https://api.github.com/graphql"));

            httpRequestMessage.Headers.Add("Authorization", $"Token {GitHubAccessToken}");
            httpRequestMessage.Content = new StringContent(postBody, Encoding.UTF8, "application/json");

            var httpResponseMessage = await myHttpClient.SendAsync(httpRequestMessage, token).ConfigureAwait(false);

            httpResponseMessage.EnsureSuccessStatusCode();

            var responseBody = await httpResponseMessage.Content.ReadAsStringAsync().ConfigureAwait(false);

            return(IssuesResponse.Parse(responseBody));
        }
Esempio n. 5
0
        public IEnumerable <Task <Issue?> > GetIssuesAsync2(
            string ownerName,
            string repoName,
            CancellationToken cancellationToken = default)
        {
            var request = new IssuesRequest {
                OwnerName = ownerName, RepoName = repoName, Query = IssuesQuery
            };
            List <Issue>?currentPage  = null;
            var          currentIndex = 0;

            while (true)
            {
                yield return(GetNextIssueAsync());

                cancellationToken.ThrowIfCancellationRequested();
            }

            async Task <Issue?> GetNextIssueAsync()
            {
                if (currentPage == null || currentIndex >= currentPage.Count)
                {
                    currentIndex = 0;
                    await Task.Delay(100, cancellationToken).ConfigureAwait(false);

                    var currentResponse = await PostAsync(request, cancellationToken).ConfigureAwait(false);

                    currentPage = currentResponse.Issues.ToList();

                    if (currentPage.Count == 0)
                    {
                        return(null);
                    }

                    request.StartCursor = currentResponse.StartCursor;
                }

                return(currentPage[currentIndex++]);
            }
        }