コード例 #1
0
        public async Task Given_An_Article_If_Not_Published_To_Queue_IsSuccessful_Should_Be_False()
        {
            // Arrange
            var article = new Article();

            _wikiArticle.Details(Arg.Any <int>()).Returns(new ExpandedArticleResultSet {
                Items = new Dictionary <string, ExpandedArticle>
                {
                    ["key"] = new ExpandedArticle
                    {
                        Id       = 24324,
                        Abstract = "OCG in effect since September 1, 2007."
                    }
                }
            });

            _wikiArticle.Simple(Arg.Any <long>()).Returns(new ContentResult {
                Sections = new Section[0]
            });
            _banlistDataQueue.Publish(Arg.Any <ArticleProcessed>()).Returns(new YugiohBanlistCompletion());

            // Act
            var result = await _sut.Process(article);

            // Assert
            result.IsSuccessful.Should().BeFalse();
        }
コード例 #2
0
        public async Task Given_An_Article_Should_Invoke_Process_Once()
        {
            // Arrange
            var article = new Article {
                Id = 3242423, CorrelationId = Guid.NewGuid()
            };

            _banlistProcessor.Process(Arg.Any <Article>()).Returns(new ArticleProcessed()
            {
                Article = article, IsSuccessful = true
            });
            _banlistDataQueue.Publish(Arg.Any <ArticleProcessed>()).Returns(new YugiohBanlistCompletion {
                Article = article, IsSuccessful = true
            });

            // Act
            await _sut.ProcessDataFlow(article);

            // Assert
            await _banlistProcessor.Received(1).Process(Arg.Any <Article>());
        }
コード例 #3
0
        public ArticleDataFlow(IBanlistProcessor banlistProcessor, IBanlistDataQueue banlistDataQueue)
        {
            _jobs = new ConcurrentDictionary <Guid, TaskCompletionSource <ArticleCompletion> >();

            // Data flow options
            var maxDegreeOfParallelism = Environment.ProcessorCount;
            var nonGreedy = new ExecutionDataflowBlockOptions {
                BoundedCapacity = maxDegreeOfParallelism, MaxDegreeOfParallelism = maxDegreeOfParallelism
            };

            // Pipeline members
            _articleBufferBlock = new BufferBlock <Article>();

            var banlistProcessorTransformBlock = new TransformBlock <Article, ArticleProcessed>(article => banlistProcessor.Process(article), nonGreedy);
            var publishBanlistTransformBlock   = new TransformBlock <ArticleProcessed, YugiohBanlistCompletion>(articleProcessed => banlistDataQueue.Publish(articleProcessed), nonGreedy);
            var publishToQueueActionBlock      = new ActionBlock <YugiohBanlistCompletion>(yugiohCardCompletion => FinishedProcessing(yugiohCardCompletion));

            // Form the pipeline
            _articleBufferBlock.LinkTo(banlistProcessorTransformBlock);
            banlistProcessorTransformBlock.LinkTo(publishBanlistTransformBlock);
            publishBanlistTransformBlock.LinkTo(publishToQueueActionBlock);
        }
コード例 #4
0
        public async Task <ArticleProcessed> Process(Article article)
        {
            var response = new ArticleProcessed {
                Article = article
            };

            var articleDetailsList = await _wikiArticle.Details((int)article.Id);

            var(_, expandedArticle) = articleDetailsList.Items.First();

            var banlistArticleSummary = BanlistHelpers.ExtractBanlistArticleDetails(expandedArticle.Id, expandedArticle.Abstract);

            if (banlistArticleSummary != null)
            {
                const char beginChar = '「';
                const char endChar   = '」';

                var banlist = new YugiohBanlist
                {
                    ArticleId   = banlistArticleSummary.ArticleId,
                    Title       = expandedArticle.Title,
                    BanlistType = banlistArticleSummary.BanlistType,
                    StartDate   = banlistArticleSummary.StartDate
                };

                var banlistContentResult = await _wikiArticle.Simple(banlistArticleSummary.ArticleId);

                _logger.LogInformation($"{banlist.BanlistType.ToString()}, {banlist.Title}, {banlist.StartDate}");
                foreach (var section in banlistContentResult.Sections)
                {
                    // skip references section
                    if (section.Title.ToLower() == "references")
                    {
                        continue;
                    }

                    // new section
                    var ybls = new YugiohBanlistSection
                    {
                        Title   = StringHelpers.RemoveBetween(section.Title, beginChar, endChar).Trim(),
                        Content = ContentResultHelpers.GetSectionContentList(section).OrderBy(c => c).ToList()
                    };

                    // remove invalid characters
                    if (ybls.Content.Any())
                    {
                        ybls.Content = ybls.Content.Select(c => StringHelpers.RemoveBetween(c, beginChar, endChar)).ToList();
                    }

                    banlist.Sections.Add(ybls);
                }

                response.Banlist = banlist;

                var publishBanlistResult = await _banlistDataQueue.Publish(new ArticleProcessed { Article = article, Banlist = banlist });

                response.IsSuccessful = publishBanlistResult.IsSuccessful;
            }

            return(response);
        }