示例#1
0
        private void StartAnalysis(StartAnalysisRequest request)
        {
            var passedDueWorkItemsActor = Context.ActorOf(Context.DI().Props <PassedDueWorkItemsActor>(),
                                                          "passed-due-work-items-actor");

            var passedDueWorkItemsTask =
                passedDueWorkItemsActor.Ask <ActorResponse <IReadOnlyList <string> > >(
                    _iterationWorkItemsRetriever.GetWorkItems(IterationTimeFrame.Current));

            var result = passedDueWorkItemsTask.Result;

            _managersReportMessageSender.SendMessages(result.Content).Wait();

            Context.Stop(Self);
            Sender.Tell(new AnalysisCompleteResponse());
        }
示例#2
0
        private void HandleStartAnalysisRequest(StartAnalysisRequest obj)
        {
            // This is supposed to run on Mondays bi-weekly at the starting of the new iteration.
            if (_currentIterationInfoOptions.Value.StartDate.Date != DateTime.Now.Date)
            {
                Context.Stop(Self);
                Sender.Tell(new AnalysisCompleteResponse());
            }

            var currentIterationWorkItems =
                _workItemsRetriever.GetWorkItems(IterationTimeFrame.Previous);

            // Creating the subordinate actors.
            var estimateWorkItemActor =
                Context.ActorOf(Context.DI().Props <EstimateWorkItemsActor>(), "estimate-work-item-actor");
            var descriptiveTitleActor =
                Context.ActorOf(Context.DI().Props <DescriptiveTitleActor>(), "descriptive-title-actor");
            var descriptionActor =
                Context.ActorOf(Context.DI().Props <DescriptionActor>(), "description-actor");
            var longCodeCompleteActor =
                Context.ActorOf(Context.DI().Props <LongCodeCompleteActor>(), "long-code-complete-actor");
            var greatPreviousIterationActor =
                Context.ActorOf(Context.DI().Props <GreatPreviousIterationActor>(), "great-previous-iteration-actor");
            var openWorkItemsActor =
                Context.ActorOf(Context.DI().Props <OpenWorkItemsActor>(), "open-work-items-actor");

            // Running the actors.
            var tasks = new List <Task>();

            var estimateWorkItemTask = estimateWorkItemActor
                                       .Ask <ActorResponse <IReadOnlyList <string> > >(currentIterationWorkItems);

            tasks.Add(estimateWorkItemTask);

            var descriptiveTitleTask = descriptiveTitleActor
                                       .Ask <ActorResponse <IReadOnlyList <string> > >(currentIterationWorkItems);

            tasks.Add(descriptiveTitleTask);

            var descriptionTask = descriptionActor
                                  .Ask <ActorResponse <IReadOnlyList <string> > >(currentIterationWorkItems);

            tasks.Add(descriptionTask);

            var longCodeCompleteTask = longCodeCompleteActor
                                       .Ask <ActorResponse <IReadOnlyList <string> > >(currentIterationWorkItems);

            tasks.Add(longCodeCompleteTask);

            var greatPreviousIterationTask = greatPreviousIterationActor
                                             .Ask <ActorResponse <IReadOnlyList <string> > >(currentIterationWorkItems);

            tasks.Add(greatPreviousIterationTask);

            var openWorkItemsTask = openWorkItemsActor
                                    .Ask <ActorResponse <IReadOnlyList <string> > >(currentIterationWorkItems);

            tasks.Add(openWorkItemsTask);

            // Waiting for all the of the actors to finish their work and return a response back.
            Task.WaitAll(tasks.ToArray());

            // Collecting the results from each actor.
            var messages = new List <string>();

            messages.AddRange(estimateWorkItemTask.Result.Content);
            messages.AddRange(descriptiveTitleTask.Result.Content);
            messages.AddRange(openWorkItemsTask.Result.Content);
            messages.AddRange(longCodeCompleteTask.Result.Content);

            // There is no reason to congratulate individual members if the team closed
            // all of the work items! This also simplifies the code a little bit.
            if (messages.Any())
            {
                messages.AddRange(greatPreviousIterationTask.Result.Content);
            }

            // Send the messages
            _retrospectiveMessageSender.SendMessages(messages).Wait();

            // Clearing out and exiting.
            Context.Stop(Self);
            Sender.Tell(new AnalysisCompleteResponse());
        }
示例#3
0
        private void StartAnalysis(StartAnalysisRequest request)
        {
            var firstDayOfSprint = _currentIterationInfoOptions.Value.StartDate.Date == DateTime.Now.Date;

            // There is another function that runs when it is the first day of the sprint!
            if (firstDayOfSprint)
            {
                Context.Stop(Self);
                Sender.Tell(new AnalysisCompleteResponse());
                return;
            }

            var lastDayOfSprint           = _currentIterationInfoOptions.Value.FinishDate.Date == DateTime.Now.Date;
            var currentIterationWorkItems = _workItemsRetriever.GetWorkItems(IterationTimeFrame.Current);
            var pendingPullRequests       = _pullRequestsRetriever.GetPullRequests();

            // Creating the subordinate actors.
            var estimateWorkItemActor =
                Context.ActorOf(Context.DI().Props <EstimateWorkItemsActor>(), "estimate-work-item-actor");
            var descriptiveTitleActor =
                Context.ActorOf(Context.DI().Props <DescriptiveTitleActor>(), "descriptive-title-actor");
            var activateWorkItemActor =
                Context.ActorOf(Context.DI().Props <ActivateWorkItemActor>(), "activate-work-item-actor");
            var descriptionActor =
                Context.ActorOf(Context.DI().Props <DescriptionActor>(), "description-actor");
            var longCodeCompleteActor =
                Context.ActorOf(Context.DI().Props <LongCodeCompleteActor>(), "long-code-complete-actor");
            var greatWorkActor =
                Context.ActorOf(Context.DI().Props <GreatWorkActor>(), "great-work-actor");
            var stillActiveWorkItemsActor =
                Context.ActorOf(Context.DI().Props <StillActiveWorkItemsActor>(),
                                "still-active-work-items-actor");

            var pendingPullRequestsActor =
                Context.ActorOf(Context.DI().Props <PendingPullRequestsActor>(), "pending-pull-requests-actor");

            // Running the actors.
            var tasks = new List <Task>();

            var estimateWorkItemTask = estimateWorkItemActor
                                       .Ask <ActorResponse <IReadOnlyList <string> > >(currentIterationWorkItems);

            tasks.Add(estimateWorkItemTask);

            var descriptiveTitleTask = descriptiveTitleActor
                                       .Ask <ActorResponse <IReadOnlyList <string> > >(currentIterationWorkItems);

            tasks.Add(descriptiveTitleTask);

            var activeWorkItemTask = activateWorkItemActor
                                     .Ask <ActorResponse <IReadOnlyList <string> > >(currentIterationWorkItems);

            tasks.Add(activeWorkItemTask);

            var descriptionTask = descriptionActor
                                  .Ask <ActorResponse <IReadOnlyList <string> > >(currentIterationWorkItems);

            tasks.Add(descriptionTask);

            var longCodeCompleteTask = longCodeCompleteActor
                                       .Ask <ActorResponse <IReadOnlyList <string> > >(currentIterationWorkItems);

            tasks.Add(longCodeCompleteTask);

            var greatWorkTask = greatWorkActor
                                .Ask <ActorResponse <IReadOnlyList <string> > >(currentIterationWorkItems);

            tasks.Add(greatWorkTask);

            var dummyStillActiveWorkItemsTask = new Task <ActorResponse <IReadOnlyList <string> > >(
                () =>
                new ActorResponse <IReadOnlyList <string> >(new List <string>(), false));

            dummyStillActiveWorkItemsTask.Start();

            var stillActiveWorkItemsTask = lastDayOfSprint
                                ? stillActiveWorkItemsActor.Ask <ActorResponse <IReadOnlyList <string> > >(currentIterationWorkItems)
                                : dummyStillActiveWorkItemsTask;

            tasks.Add(stillActiveWorkItemsTask);

            var longPendingPullRequestsTask =
                pendingPullRequestsActor.Ask <ActorResponse <IReadOnlyList <string> > >(pendingPullRequests);

            tasks.Add(longPendingPullRequestsTask);

            // Waiting for all the of the actors to finish their work and return a response back.
            Task.WaitAll(tasks.ToArray());

            // Collecting the results from each actor.
            var messages = new List <string>();

            messages.AddRange(estimateWorkItemTask.Result.Content);
            messages.AddRange(descriptiveTitleTask.Result.Content);
            messages.AddRange(descriptionTask.Result.Content);
            messages.AddRange(activeWorkItemTask.Result.Content);
            messages.AddRange(stillActiveWorkItemsTask.Result.Content);
            messages.AddRange(longCodeCompleteTask.Result.Content);
            messages.AddRange(longPendingPullRequestsTask.Result.Content);

            // Sending "great work" message when there are no other messages makes the greeting a little awkward
            // as the greeting asks for completion some work items, but there is none.
            // todo Improve this as I still want to send the positive feedback even if there is nothing else.
            if (messages.Any())
            {
                messages.AddRange(greatWorkTask.Result.Content);
            }

            // Sending the messages from each actor to the message senders. Using a different message sender if it
            // is the last day of the sprint.
            if (lastDayOfSprint)
            {
                _lastDayOfCurrentIterationMessageSender.SendMessages(messages).Wait();
            }
            else
            {
                _currentIterationMessageSender.SendMessages(messages).Wait();
            }

            Context.Stop(Self);
            // This is required for stopping the program. Check out the Ask<> calls in the function classes.
            Sender.Tell(new AnalysisCompleteResponse());
        }