• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

eliashaeussler / phpstan-config / 22738980121

05 Mar 2026 10:06PM UTC coverage: 64.364% (-32.3%) from 96.654%
22738980121

Pull #132

github

eliashaeussler
[FEATURE] Add custom rule to compare composer.json and ext_emconf.php
Pull Request #132: [FEATURE] Add custom rule to compare composer.json and ext_emconf.php

153 of 371 new or added lines in 11 files covered. (41.24%)

410 of 637 relevant lines covered (64.36%)

4.55 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/Resource/Local/JsonFile.php
1
<?php
2

3
declare(strict_types=1);
4

5
/*
6
 * This file is part of the Composer package "eliashaeussler/phpstan-config".
7
 *
8
 * Copyright (C) 2023-2026 Elias Häußler <elias@haeussler.dev>
9
 *
10
 * This program is free software: you can redistribute it and/or modify
11
 * it under the terms of the GNU General Public License as published by
12
 * the Free Software Foundation, either version 3 of the License, or
13
 * (at your option) any later version.
14
 *
15
 * This program is distributed in the hope that it will be useful,
16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
 * GNU General Public License for more details.
19
 *
20
 * You should have received a copy of the GNU General Public License
21
 * along with this program. If not, see <https://www.gnu.org/licenses/>.
22
 */
23

24
namespace EliasHaeussler\PHPStanConfig\Resource\Local;
25

26
use JsonException;
27

28
use function array_key_exists;
29
use function file_get_contents;
30
use function is_array;
31
use function is_file;
32
use function json_decode;
33

34
/**
35
 * JsonFile.
36
 *
37
 * @author Elias Häußler <elias@haeussler.dev>
38
 * @license GPL-3.0-or-later
39
 */
40
final class JsonFile
41
{
42
    /**
43
     * @var array<string, array<mixed>|null>
44
     */
45
    private static array $parsed = [];
46

NEW
47
    public function __construct(
×
48
        public readonly string $path,
NEW
49
    ) {}
×
50

51
    /**
52
     * @return array<mixed>|null
53
     */
NEW
54
    public function parse(): ?array
×
55
    {
NEW
56
        if (array_key_exists($this->path, self::$parsed)) {
×
NEW
57
            return self::$parsed[$this->path];
×
58
        }
59

NEW
60
        if (!is_file($this->path)) {
×
NEW
61
            return null;
×
62
        }
63

NEW
64
        $content = file_get_contents($this->path);
×
65

NEW
66
        if (false === $content) {
×
NEW
67
            return null;
×
68
        }
69

70
        try {
NEW
71
            $decoded = json_decode($content, true, 512, JSON_THROW_ON_ERROR);
×
NEW
72
        } catch (JsonException) {
×
NEW
73
            return null;
×
74
        }
75

NEW
76
        if (!is_array($decoded)) {
×
NEW
77
            $decoded = null;
×
78
        }
79

NEW
80
        return self::$parsed[$this->path] = $decoded;
×
81
    }
82
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc