Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 43
0.00% covered (danger)
0.00%
0 / 10
CRAP
0.00% covered (danger)
0.00%
0 / 1
TranslationStatsGraphOptions
0.00% covered (danger)
0.00%
0 / 43
0.00% covered (danger)
0.00%
0 / 10
420
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
2
 bindArray
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
12
 hasValue
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 setValue
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getValue
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 normalize
0.00% covered (danger)
0.00%
0 / 22
0.00% covered (danger)
0.00%
0 / 1
90
 getGroups
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getLanguages
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getFormOptions
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 boundValue
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2declare( strict_types = 1 );
3
4namespace MediaWiki\Extension\Translate\Statistics;
5
6use MediaWiki\Html\FormOptions;
7
8/**
9 * Encapsulates graph options
10 * @author Abijeet Patro
11 * @license GPL-2.0-or-later
12 * @since 2020.09
13 */
14class TranslationStatsGraphOptions {
15    private FormOptions $formOptions;
16    /** @var string[] */
17    public const VALID_SCALES = [ 'years', 'months', 'weeks', 'days', 'hours' ];
18
19    public function __construct() {
20        $this->formOptions = new FormOptions();
21        $this->formOptions->add( 'preview', false );
22        $this->formOptions->add( 'language', [] );
23        $this->formOptions->add( 'count', 'edits' );
24        $this->formOptions->add( 'scale', 'days' );
25        $this->formOptions->add( 'days', 30 );
26        $this->formOptions->add( 'width', 800 );
27        $this->formOptions->add( 'height', 600 );
28        $this->formOptions->add( 'group', [] );
29        $this->formOptions->add( 'uselang', '' );
30        $this->formOptions->add( 'start', '' );
31    }
32
33    public function bindArray( array $inputs ): void {
34        foreach ( $inputs as $key => $value ) {
35            if ( $this->formOptions->validateName( $key ) ) {
36                $this->formOptions[$key] = $value;
37            }
38        }
39    }
40
41    public function hasValue( string $key ): bool {
42        return isset( $this->formOptions[$key] );
43    }
44
45    public function setValue( string $key, $value ): void {
46        $this->formOptions[$key] = $value;
47    }
48
49    public function getValue( string $key ) {
50        return $this->formOptions[$key];
51    }
52
53    public function normalize( array $validCounts ): void {
54        $this->formOptions->validateIntBounds( 'days', 1, 10000 );
55        $this->formOptions->validateIntBounds( 'width', 200, 1000 );
56        $this->formOptions->validateIntBounds( 'height', 200, 1000 );
57
58        if ( $this->formOptions['start'] !== '' ) {
59            $timestamp = wfTimestamp( TS_ISO_8601, $this->formOptions['start'] );
60            if ( $timestamp ) {
61                $this->formOptions['start'] = rtrim( $timestamp, 'Z' );
62            } else {
63                $this->formOptions['start'] = '';
64            }
65        }
66
67        if ( !in_array( $this->formOptions['scale'], self::VALID_SCALES ) ) {
68            $this->formOptions['scale'] = 'days';
69        }
70
71        if ( $this->formOptions['scale'] === 'hours' ) {
72            $this->formOptions->validateIntBounds( 'days', 1, 4 );
73        }
74
75        if ( !in_array( $this->formOptions['count'], $validCounts ) ) {
76            $this->formOptions['count'] = 'edits';
77        }
78
79        foreach ( [ 'group', 'language' ] as $t ) {
80            if ( is_string( $this->formOptions[$t] ) ) {
81                $this->formOptions[$t] = explode( ',', $this->formOptions[$t] );
82            }
83
84            $values = array_map( 'trim', $this->formOptions[$t] );
85            $values = array_splice( $values, 0, 4 );
86            if ( $t === 'group' ) {
87                // BC for old syntax which replaced _ to | which was not allowed
88                $values = preg_replace( '~^page_~', 'page-', $values );
89            }
90            $this->formOptions[$t] = $values;
91        }
92    }
93
94    public function getGroups(): array {
95        return $this->formOptions['group'];
96    }
97
98    public function getLanguages(): array {
99        return $this->formOptions['language'];
100    }
101
102    public function getFormOptions(): FormOptions {
103        return $this->formOptions;
104    }
105
106    public function boundValue( string $key, int $min, int $max ): void {
107        $this->formOptions->validateIntBounds( $key, $min, $max );
108    }
109}