Passed
Push — use-sandbox ( 45b29c )
by MusikAnimal
06:38
created

AutoEdits::getUseSandbox()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 0
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types = 1);
4
5
namespace App\Model;
6
7
use App\Repository\AutoEditsRepository;
8
use App\Repository\EditRepository;
9
use App\Repository\PageRepository;
10
use App\Repository\UserRepository;
11
12
/**
13
 * AutoEdits returns statistics about automated edits made by a user.
14
 */
15
class AutoEdits extends Model
16
{
17
    protected EditRepository $editRepo;
18
    protected PageRepository $pageRepo;
19
    protected UserRepository $userRepo;
20
21
    /** @var null|string The tool we're searching for when fetching (semi-)automated edits. */
22
    protected ?string $tool;
23
24
    /** @var Edit[] The list of non-automated contributions. */
25
    protected array $nonAutomatedEdits;
26
27
    /** @var Edit[] The list of automated contributions. */
28
    protected array $automatedEdits;
29
30
    /** @var int Total number of edits. */
31
    protected int $editCount;
32
33
    /** @var int Total number of non-automated edits. */
34
    protected int $automatedCount;
35
36
    /** @var array Counts of known automated tools used by the given user. */
37
    protected array $toolCounts;
38
39
    /** @var int Total number of edits made with the tools. */
40
    protected int $toolsTotal;
41
42
    /** @var int Default number of results to show per page when fetching (non-)automated edits. */
43
    public const RESULTS_PER_PAGE = 50;
44
45
    /**
46
     * Constructor for the AutoEdits class.
47
     * @param AutoEditsRepository $repository
48
     * @param EditRepository $editRepo
49
     * @param PageRepository $pageRepo
50
     * @param UserRepository $userRepo
51
     * @param Project $project
52
     * @param User $user
53
     * @param int|string $namespace Namespace ID or 'all'
54
     * @param false|int $start Start date as Unix timestamp.
55
     * @param false|int $end End date as Unix timestamp.
56
     * @param null $tool The tool we're searching for when fetching (semi-)automated edits.
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $tool is correct as it would always require null to be passed?
Loading history...
57
     * @param false|int $offset Unix timestamp. Used for pagination.
58
     * @param int|null $limit Number of results to return.
59
     */
60
    public function __construct(
61
        AutoEditsRepository $repository,
62
        EditRepository $editRepo,
63
        PageRepository $pageRepo,
64
        UserRepository $userRepo,
65
        Project $project,
66
        User $user,
67
        $namespace = 0,
68
        $start = false,
69
        $end = false,
70
        $tool = null,
71
        $offset = false,
72
        ?int $limit = self::RESULTS_PER_PAGE
73
    ) {
74
        $this->repository = $repository;
75
        $this->editRepo = $editRepo;
76
        $this->pageRepo = $pageRepo;
77
        $this->userRepo = $userRepo;
78
        $this->project = $project;
79
        $this->user = $user;
80
        $this->namespace = $namespace;
81
        $this->start = $start;
82
        $this->end = $end;
83
        $this->tool = $tool;
84
        $this->offset = $offset;
85
        $this->limit = $limit ?? self::RESULTS_PER_PAGE;
86
    }
87
88
    /**
89
     * The tool we're limiting the results to when fetching
90
     * (semi-)automated contributions.
91
     * @return null|string
92
     */
93
    public function getTool(): ?string
94
    {
95
        return $this->tool;
96
    }
97
98
    /**
99
     * Get the raw edit count of the user.
100
     * @return int
101
     */
102
    public function getEditCount(): int
103
    {
104
        if (!isset($this->editCount)) {
105
            $this->editCount = $this->user->countEdits(
0 ignored issues
show
Bug introduced by
The method countEdits() does not exist on null. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

105
            /** @scrutinizer ignore-call */ 
106
            $this->editCount = $this->user->countEdits(

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
106
                $this->project,
107
                $this->namespace,
108
                $this->start,
109
                $this->end
110
            );
111
        }
112
113
        return $this->editCount;
114
    }
115
116
    /**
117
     * Get the number of edits this user made using semi-automated tools.
118
     * This is not the same as self::getToolCounts because the regex can overlap.
119
     * @return int Result of query, see below.
120
     */
121
    public function getAutomatedCount(): int
122
    {
123
        if (isset($this->automatedCount)) {
124
            return $this->automatedCount;
125
        }
126
127
        $this->automatedCount = $this->repository->countAutomatedEdits(
0 ignored issues
show
Bug introduced by
The method countAutomatedEdits() does not exist on App\Repository\Repository. It seems like you code against a sub-type of App\Repository\Repository such as App\Repository\EditCounterRepository or App\Repository\AutoEditsRepository. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

127
        /** @scrutinizer ignore-call */ 
128
        $this->automatedCount = $this->repository->countAutomatedEdits(
Loading history...
128
            $this->project,
129
            $this->user,
130
            $this->namespace,
131
            $this->start,
132
            $this->end
133
        );
134
135
        return $this->automatedCount;
136
    }
137
138
    /**
139
     * Get the percentage of all edits made using automated tools.
140
     * @return float
141
     */
142
    public function getAutomatedPercentage(): float
143
    {
144
        return $this->getEditCount() > 0
145
            ? ($this->getAutomatedCount() / $this->getEditCount()) * 100
146
            : 0;
147
    }
148
149
    /**
150
     * Get non-automated contributions for this user.
151
     * @param bool $raw Wether to return raw data from the database, or get Edit objects.
152
     * @return string[]|Edit[]
153
     */
154
    public function getNonAutomatedEdits(bool $raw = false): array
155
    {
156
        if (isset($this->nonAutomatedEdits)) {
157
            return $this->nonAutomatedEdits;
158
        }
159
160
        $revs = $this->repository->getNonAutomatedEdits(
0 ignored issues
show
Bug introduced by
The method getNonAutomatedEdits() does not exist on App\Repository\Repository. It seems like you code against a sub-type of App\Repository\Repository such as App\Repository\AutoEditsRepository. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

160
        /** @scrutinizer ignore-call */ 
161
        $revs = $this->repository->getNonAutomatedEdits(
Loading history...
161
            $this->project,
162
            $this->user,
163
            $this->namespace,
164
            $this->start,
165
            $this->end,
166
            $this->offset,
167
            $this->limit
168
        );
169
170
        if ($raw) {
171
            return $revs;
172
        }
173
174
        $this->nonAutomatedEdits = Edit::getEditsFromRevs(
175
            $this->pageRepo,
176
            $this->editRepo,
177
            $this->userRepo,
178
            $this->project,
179
            $this->user,
0 ignored issues
show
Bug introduced by
It seems like $this->user can also be of type null; however, parameter $user of App\Model\Edit::getEditsFromRevs() does only seem to accept App\Model\User, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

179
            /** @scrutinizer ignore-type */ $this->user,
Loading history...
180
            $revs
181
        );
182
183
        return $this->nonAutomatedEdits;
184
    }
185
186
    /**
187
     * Get automated contributions for this user.
188
     * @param bool $raw Whether to return raw data from the database, or get Edit objects.
189
     * @return Edit[]
190
     */
191
    public function getAutomatedEdits(bool $raw = false): array
192
    {
193
        if (isset($this->automatedEdits)) {
194
            return $this->automatedEdits;
195
        }
196
197
        $revs = $this->repository->getAutomatedEdits(
0 ignored issues
show
Bug introduced by
The method getAutomatedEdits() does not exist on App\Repository\Repository. It seems like you code against a sub-type of App\Repository\Repository such as App\Repository\AutoEditsRepository. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

197
        /** @scrutinizer ignore-call */ 
198
        $revs = $this->repository->getAutomatedEdits(
Loading history...
198
            $this->project,
199
            $this->user,
200
            $this->namespace,
201
            $this->start,
202
            $this->end,
203
            $this->tool,
204
            $this->offset
205
        );
206
207
        if ($raw) {
208
            return $revs;
209
        }
210
211
        $this->automatedEdits = Edit::getEditsFromRevs(
212
            $this->pageRepo,
213
            $this->editRepo,
214
            $this->userRepo,
215
            $this->project,
216
            $this->user,
0 ignored issues
show
Bug introduced by
It seems like $this->user can also be of type null; however, parameter $user of App\Model\Edit::getEditsFromRevs() does only seem to accept App\Model\User, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

216
            /** @scrutinizer ignore-type */ $this->user,
Loading history...
217
            $revs
218
        );
219
220
        return $this->automatedEdits;
221
    }
222
223
    /**
224
     * Get counts of known automated tools used by the given user.
225
     * @return array Each tool that they used along with the count and link:
226
     *                  [
227
     *                      'Twinkle' => [
228
     *                          'count' => 50,
229
     *                          'link' => 'Wikipedia:Twinkle',
230
     *                      ],
231
     *                  ]
232
     */
233
    public function getToolCounts(): array
234
    {
235
        if (isset($this->toolCounts)) {
236
            return $this->toolCounts;
237
        }
238
239
        $this->toolCounts = $this->repository->getToolCounts(
0 ignored issues
show
Bug introduced by
The method getToolCounts() does not exist on App\Repository\Repository. It seems like you code against a sub-type of App\Repository\Repository such as App\Repository\AutoEditsRepository. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

239
        /** @scrutinizer ignore-call */ 
240
        $this->toolCounts = $this->repository->getToolCounts(
Loading history...
240
            $this->project,
241
            $this->user,
242
            $this->namespace,
243
            $this->start,
244
            $this->end
245
        );
246
247
        return $this->toolCounts;
248
    }
249
250
    /**
251
     * Get a list of all available tools for the Project.
252
     * @return array
253
     */
254
    public function getAllTools(): array
255
    {
256
        return $this->repository->getTools($this->project);
0 ignored issues
show
Bug introduced by
The method getTools() does not exist on App\Repository\Repository. Did you maybe mean getToolsConnection()? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

256
        return $this->repository->/** @scrutinizer ignore-call */ getTools($this->project);

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
257
    }
258
259
    /**
260
     * Get the combined number of edits made with each tool. This is calculated separately from
261
     * self::getAutomatedCount() because the regex can sometimes overlap, and the counts are actually different.
262
     * @return int
263
     */
264
    public function getToolsTotal(): int
265
    {
266
        if (!isset($this->toolsTotal)) {
267
            $this->toolsTotal = array_reduce($this->getToolCounts(), function ($a, $b) {
268
                return $a + $b['count'];
269
            });
270
        }
271
272
        return $this->toolsTotal;
273
    }
274
275
    /**
276
     * @return bool
277
     */
278
    public function getUseSandbox(): bool
279
    {
280
        return $this->repository->getUseSandbox();
0 ignored issues
show
Bug introduced by
The method getUseSandbox() does not exist on App\Repository\Repository. It seems like you code against a sub-type of App\Repository\Repository such as App\Repository\AutoEditsRepository. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

280
        return $this->repository->/** @scrutinizer ignore-call */ getUseSandbox();
Loading history...
281
    }
282
}
283