Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
28 / 28
100.00% covered (success)
100.00%
2 / 2
CRAP
100.00% covered (success)
100.00%
1 / 1
FilterRunnerFactory
100.00% covered (success)
100.00%
28 / 28
100.00% covered (success)
100.00%
2 / 2
3
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 newRunner
100.00% covered (success)
100.00%
27 / 27
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2
3namespace MediaWiki\Extension\AbuseFilter;
4
5use MediaWiki\Config\ServiceOptions;
6use MediaWiki\Extension\AbuseFilter\ChangeTags\ChangeTagger;
7use MediaWiki\Extension\AbuseFilter\Consequences\ConsequencesExecutorFactory;
8use MediaWiki\Extension\AbuseFilter\Hooks\AbuseFilterHookRunner;
9use MediaWiki\Extension\AbuseFilter\Parser\RuleCheckerFactory;
10use MediaWiki\Extension\AbuseFilter\Variables\VariableHolder;
11use MediaWiki\Extension\AbuseFilter\Variables\VariablesManager;
12use MediaWiki\Extension\AbuseFilter\Watcher\EmergencyWatcher;
13use MediaWiki\Extension\AbuseFilter\Watcher\UpdateHitCountWatcher;
14use MediaWiki\Title\Title;
15use MediaWiki\User\User;
16use Psr\Log\LoggerInterface;
17use Wikimedia\ObjectCache\BagOStuff;
18use Wikimedia\Stats\IBufferingStatsdDataFactory;
19use Wikimedia\Stats\NullStatsdDataFactory;
20
21class FilterRunnerFactory {
22    public const SERVICE_NAME = 'AbuseFilterFilterRunnerFactory';
23
24    public function __construct(
25        private readonly AbuseFilterHookRunner $hookRunner,
26        private readonly FilterProfiler $filterProfiler,
27        private readonly ChangeTagger $changeTagger,
28        private readonly FilterLookup $filterLookup,
29        private readonly RuleCheckerFactory $ruleCheckerFactory,
30        private readonly ConsequencesExecutorFactory $consExecutorFactory,
31        private readonly AbuseLoggerFactory $abuseLoggerFactory,
32        private readonly VariablesManager $varManager,
33        private readonly EmergencyCache $emergencyCache,
34        private readonly UpdateHitCountWatcher $updateHitCountWatcher,
35        private readonly EmergencyWatcher $emergencyWatcher,
36        private readonly BagOStuff $localCache,
37        private readonly LoggerInterface $logger,
38        private readonly LoggerInterface $editStashLogger,
39        private readonly IBufferingStatsdDataFactory $statsdDataFactory,
40        private readonly ServiceOptions $options
41    ) {
42    }
43
44    /**
45     * @param User $user
46     * @param Title $title
47     * @param VariableHolder $vars
48     * @param string $group
49     * @return FilterRunner
50     */
51    public function newRunner(
52        User $user,
53        Title $title,
54        VariableHolder $vars,
55        string $group
56    ): FilterRunner {
57        // TODO Add a method to this class taking these as params? Add a hook for custom watchers
58        $watchers = [ $this->updateHitCountWatcher, $this->emergencyWatcher ];
59        return new FilterRunner(
60            $this->hookRunner,
61            $this->filterProfiler,
62            $this->changeTagger,
63            $this->filterLookup,
64            $this->ruleCheckerFactory,
65            $this->consExecutorFactory,
66            $this->abuseLoggerFactory,
67            $this->varManager,
68            $this->emergencyCache,
69            $watchers,
70            new EditStashCache(
71                $this->localCache,
72                // Bots do not use edit stashing, so avoid distorting the stats
73                $user->isBot() ? new NullStatsdDataFactory() : $this->statsdDataFactory,
74                $this->varManager,
75                $this->editStashLogger,
76                $title,
77                $group
78            ),
79            $this->logger,
80            $this->options,
81            $user,
82            $title,
83            $vars,
84            $group
85        );
86    }
87}