Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
28 / 28
100.00% covered (success)
100.00%
15 / 15
CRAP
100.00% covered (success)
100.00%
1 / 1
ImportDetails
100.00% covered (success)
100.00%
28 / 28
100.00% covered (success)
100.00%
15 / 15
17
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 setPageLanguage
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 setTemplates
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 setCategories
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getSourceLinkTarget
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getSourceFileExtension
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getSourceFileName
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getPageLanguage
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getImageDisplayUrl
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getSourceUrl
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getTextRevisions
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getFileRevisions
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getTemplates
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getCategories
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getOriginalHash
100.00% covered (success)
100.00%
11 / 11
100.00% covered (success)
100.00%
1 / 1
3
1<?php
2
3namespace FileImporter\Data;
4
5use MediaWiki\Linker\LinkTarget;
6
7/**
8 * Contains the details from the source site for the import.
9 *
10 * @license GPL-2.0-or-later
11 * @author Addshore
12 */
13class ImportDetails {
14
15    private SourceUrl $sourceUrl;
16    private LinkTarget $sourceLinkTarget;
17    /** @var string|null */
18    private $pageLanguage;
19    private TextRevisions $textRevisions;
20    private FileRevisions $fileRevisions;
21    /** @var string[] */
22    private array $templates = [];
23    /** @var string[] */
24    private array $categories = [];
25
26    public function __construct(
27        SourceUrl $sourceUrl,
28        LinkTarget $sourceLinkTarget,
29        TextRevisions $textRevisions,
30        FileRevisions $fileRevisions
31    ) {
32        $this->sourceUrl = $sourceUrl;
33        $this->sourceLinkTarget = $sourceLinkTarget;
34        $this->textRevisions = $textRevisions;
35        $this->fileRevisions = $fileRevisions;
36    }
37
38    public function setPageLanguage( ?string $languageCode ): void {
39        $this->pageLanguage = $languageCode;
40    }
41
42    /**
43     * @param string[] $templates
44     */
45    public function setTemplates( array $templates ): void {
46        $this->templates = $templates;
47    }
48
49    /**
50     * @param string[] $categories
51     */
52    public function setCategories( array $categories ): void {
53        $this->categories = $categories;
54    }
55
56    public function getSourceLinkTarget(): LinkTarget {
57        return $this->sourceLinkTarget;
58    }
59
60    /**
61     * @return string File extension. Example: 'png'
62     */
63    public function getSourceFileExtension(): string {
64        return pathinfo( $this->sourceLinkTarget->getText(), PATHINFO_EXTENSION );
65    }
66
67    /**
68     * @return string Filename with no namespace prefix or file extension. Example: 'Berlin'
69     */
70    public function getSourceFileName(): string {
71        return pathinfo( $this->sourceLinkTarget->getText(), PATHINFO_FILENAME );
72    }
73
74    /**
75     * @return string|null
76     */
77    public function getPageLanguage() {
78        return $this->pageLanguage;
79    }
80
81    public function getImageDisplayUrl(): string {
82        return $this->fileRevisions->getLatest()->getField( 'thumburl' );
83    }
84
85    public function getSourceUrl(): SourceUrl {
86        return $this->sourceUrl;
87    }
88
89    public function getTextRevisions(): TextRevisions {
90        return $this->textRevisions;
91    }
92
93    public function getFileRevisions(): FileRevisions {
94        return $this->fileRevisions;
95    }
96
97    /**
98     * List of templates directly or indirectly transcluded in the latest revision of the file
99     * description page.
100     *
101     * @return string[]
102     */
103    public function getTemplates(): array {
104        return $this->templates;
105    }
106
107    /**
108     * List of categories present in the latest revision of the file description page.
109     *
110     * @return string[]
111     */
112    public function getCategories(): array {
113        return $this->categories;
114    }
115
116    /**
117     * Returns a string hash based on the initial value of the object. The string must not exceed
118     * 255 bytes (255 ASCII characters or less when it contains Unicode characters that
119     * need to be UTF-8 encoded) to allow using indexes on all database systems.
120     *
121     * Can be used to see if two ImportDetails objects appear to be for the same URL and have
122     * the same number of text and file revisions.
123     * Used to detect changes to a file between the start and end of an import.
124     */
125    public function getOriginalHash(): string {
126        $hashes = [
127            sha1( $this->sourceLinkTarget->getText() ),
128            sha1( $this->sourceUrl->getUrl() ),
129            sha1( (string)count( $this->getTextRevisions()->toArray() ) ),
130            sha1( (string)count( $this->getFileRevisions()->toArray() ) ),
131        ];
132
133        foreach ( $this->getTextRevisions()->toArray() as $textRevision ) {
134            $hashes[] = $textRevision->getField( 'sha1' ) ?? '';
135        }
136
137        foreach ( $this->getFileRevisions()->toArray() as $fileRevision ) {
138            $hashes[] = $fileRevision->getField( 'sha1' ) ?? '';
139        }
140
141        return sha1( implode( '|', $hashes ) );
142    }
143
144}