Passed
Push — master ( 527891...b6d5b3 )
by Yaroslav
02:51
created

ReportFile   A

Complexity

Total Complexity 37

Size/Duplication

Total Lines 229
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
wmc 37
eloc 52
dl 0
loc 229
ccs 0
cts 71
cp 0
rs 9.44
c 0
b 0
f 0

24 Methods

Rating   Name   Duplication   Size   Complexity  
A screenshotWithVisibleScreen() 0 2 1
A h6() 0 2 1
A setNewLine() 0 4 2
A raw() 0 2 1
A link() 0 2 1
A list() 0 11 5
A addContent() 0 2 3
A listItem() 0 2 1
A h4() 0 2 1
A screenshotWithCombineScreen() 0 2 1
A screenshotWithFitScreen() 0 2 1
A fileName() 0 2 1
A h5() 0 2 1
A filePrefix() 0 2 1
A p() 0 2 1
A isEmpty() 0 5 2
A h3() 0 2 1
A h1() 0 2 1
A h2() 0 2 1
A screenshot() 0 12 3
A appendToFile() 0 12 3
A image() 0 2 1
A br() 0 6 2
A __construct() 0 6 1
1
<?php
2
3
namespace LaravelDuskReporter\Generation;
4
5
use Illuminate\Support\Str;
6
use Laravel\Dusk\Browser;
7
use LaravelDuskReporter\Reporter;
8
9
class ReportFile implements ReportFileContract {
10
    protected Reporter $reporter;
11
12
    protected string $name;
13
14
    protected string $newLine;
15
16
    /**
17
     * ReportFile constructor.
18
     *
19
     * @param Reporter $reporter
20
     * @param string $name
21
     */
22
    public function __construct( Reporter $reporter, string $name ) {
23
        $this->reporter = $reporter;
24
        $this->name     = $name;
25
        $this->setNewLine();
26
27
        $this->reporter->addToTableOfContents( $this->fileName() );
28
    }
29
30
    /**
31
     * @param string|null $newLine
32
     *
33
     * @return $this
34
     */
35
    public function setNewLine( ?string $newLine = null ): static {
36
        $this->newLine = is_string( $newLine ) ? $newLine : '<br>' . PHP_EOL;
37
38
        return $this;
39
    }
40
41
    /**
42
     * @inheritDoc
43
     */
44
    public function isEmpty(): bool {
45
        $filePath = $this->reporter->reportFileName( $this->fileName() );
46
        clearstatcache();
47
48
        return ! ( file_exists( $filePath ) && filesize( $filePath ) );
49
    }
50
51
    /**
52
     * @inheritDoc
53
     */
54
    public function raw( string $content = '', bool|string $newLine = false ): static {
55
        return $this->addContent( $content, $newLine );
56
    }
57
58
    /**
59
     * @inheritDoc
60
     */
61
    public function h1( string $content = '', bool|string $newLine = PHP_EOL . PHP_EOL ): static {
62
        return $this->addContent( "# {$content}", $newLine );
63
    }
64
65
    /**
66
     * @inheritDoc
67
     */
68
    public function h2( string $content = '', bool|string $newLine = PHP_EOL . PHP_EOL ): static {
69
        return $this->addContent( "## {$content}", $newLine );
70
    }
71
72
    /**
73
     * @inheritDoc
74
     */
75
    public function h3( string $content = '', bool|string $newLine = PHP_EOL . PHP_EOL ): static {
76
        return $this->addContent( "### {$content}", $newLine );
77
    }
78
79
    /**
80
     * @inheritDoc
81
     */
82
    public function h4( string $content = '', bool|string $newLine = PHP_EOL . PHP_EOL ): static {
83
        return $this->addContent( "#### {$content}", $newLine );
84
    }
85
86
    /**
87
     * @inheritDoc
88
     */
89
    public function h5( string $content = '', bool|string $newLine = PHP_EOL . PHP_EOL ): static {
90
        return $this->addContent( "##### {$content}", $newLine );
91
    }
92
93
    /**
94
     * @inheritDoc
95
     */
96
    public function h6( string $content = '', bool|string $newLine = PHP_EOL . PHP_EOL ): static {
97
        return $this->addContent( "###### {$content}", $newLine );
98
    }
99
100
    /**
101
     * @inheritDoc
102
     */
103
    public function p( string $content = '', bool|string $newLine = true ): static {
104
        return $this->addContent( $content, $newLine );
105
    }
106
107
    /**
108
     * @inheritDoc
109
     */
110
    public function br( int $count = 1, ?string $lineString = null ): static {
111
        foreach ( range( 1, $count ) as $num ) {
112
            $this->addContent( '', $lineString ?? true );
113
        }
114
115
        return $this;
116
    }
117
118
    /**
119
     * @inheritDoc
120
     */
121
    public function list( array|\ArrayAccess $items = [], bool|string $newLine = PHP_EOL, string $styleType = '-' ): static {
122
        if ( count( $items ) ) {
123
            foreach ( $items as $item ) {
124
                $this->listItem( $item, true, $styleType );
125
            }
126
            if ( $newLine ) {
127
                $this->br( lineString: is_string( $newLine ) ? $newLine : null );
128
            }
129
        }
130
131
        return $this;
132
    }
133
134
    /**
135
     * @inheritDoc
136
     */
137
    public function listItem( string $content = '', bool|string $newLine = PHP_EOL, string $styleType = '-' ): static {
138
        return $this->addContent( "{$styleType} {$content}", $newLine );
139
    }
140
141
    /**
142
     * @inheritDoc
143
     */
144
    public function image( string $url, string $alt = '', bool|string $newLine = true ): static {
145
        return $this->addContent( "![{$alt}]({$url})", $newLine );
146
    }
147
148
    /**
149
     * @inheritDoc
150
     */
151
    public function link( string $url, string $text = '', bool|string $newLine = false ): static {
152
        return $this->addContent( "[{$text}]({$url})", $newLine );
153
    }
154
155
    /**
156
     * @inheritDoc
157
     */
158
    public function screenshot( Browser $browser, ?string $resize = null, ?string $suffix = null, bool|string $newLine = true ): static {
159
        if ( $this->reporter->isScreenshotsDisabled() ) {
160
            return $this;
161
        }
162
163
        $filename = $filepath = $this->reporter->screenshoter()->make( $browser, $this->fileName(), $resize, $suffix );
164
165
        if ( $this->reporter->useScreenshotRelativePath() ) {
166
            $filepath = $this->filePrefix() . Str::afterLast( $filepath, $this->filePrefix() );
167
        }
168
169
        return $this->addContent( "![{$filename}](./{$filepath})", $newLine );
170
    }
171
172
    /**
173
     * @inheritDoc
174
     */
175
    public function screenshotWithVisibleScreen( Browser $browser, ?string $suffix = null, bool|string $newLine = true ): static {
176
        return $this->screenshot( $browser, null, $suffix, $newLine );
177
    }
178
179
    /**
180
     * @inheritDoc
181
     */
182
    public function screenshotWithFitScreen( Browser $browser, ?string $suffix = null, bool|string $newLine = true ): static {
183
        return $this->screenshot( $browser, ReportScreenshotContract::RESIZE_FIT, $suffix, $newLine );
184
    }
185
186
    /**
187
     * @inheritDoc
188
     */
189
    public function screenshotWithCombineScreen( Browser $browser, ?string $suffix = null, bool|string $newLine = true ): static {
190
        return $this->screenshot( $browser, ReportScreenshotContract::RESIZE_COMBINE, $suffix, $newLine );
191
    }
192
193
    /**
194
     * @return string
195
     */
196
    public function fileName(): string {
197
        return $this->name;
198
    }
199
200
    /**
201
     * @return string
202
     */
203
    public function filePrefix(): string {
204
        return Str::afterLast( $this->fileName(), '/' );
205
    }
206
207
    /**
208
     * Save content.
209
     *
210
     * @param string $content
211
     * @param bool|string $newLine
212
     *
213
     * @return static
214
     */
215
    protected function addContent( string $content = '', bool|string $newLine = true ): static {
216
        return $this->appendToFile( $content . ( is_string( $newLine ) ? $newLine : ( $newLine ? $this->newLine : '' ) ) );
217
    }
218
219
    /**
220
     * Append content to file.
221
     *
222
     * @param string $content
223
     *
224
     * @return static
225
     */
226
    protected function appendToFile( string $content ): static {
227
        if ( ! $this->reporter->isReportingDisabled() ) {
228
            $filePath = $this->reporter->reportFileName( $this->fileName() );
229
230
            if ( ! is_dir( $directoryPath = dirname( $filePath ) ) ) {
231
                mkdir( $directoryPath, 0777, true );
232
            }
233
234
            file_put_contents( $filePath, $content, FILE_APPEND | LOCK_EX );
235
        }
236
237
        return $this;
238
    }
239
}
240