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

Yoast / wordpress-seo / 6987097851

25 Nov 2023 04:49AM UTC coverage: 49.206% (-0.1%) from 49.302%
6987097851

push

github

web-flow
Merge pull request #20878 from Yoast/JRF/ghactions-minor-tweak

GH Actions: update a few links in inline comments

15305 of 31104 relevant lines covered (49.21%)

4.03 hits per line

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

84.78
/src/presentations/indexable-presentation.php
1
<?php
2

3
namespace Yoast\WP\SEO\Presentations;
4

5
use Yoast\WP\SEO\Context\Meta_Tags_Context;
6
use Yoast\WP\SEO\Generators\Breadcrumbs_Generator;
7
use Yoast\WP\SEO\Generators\Open_Graph_Image_Generator;
8
use Yoast\WP\SEO\Generators\Open_Graph_Locale_Generator;
9
use Yoast\WP\SEO\Generators\Schema_Generator;
10
use Yoast\WP\SEO\Generators\Twitter_Image_Generator;
11
use Yoast\WP\SEO\Helpers\Current_Page_Helper;
12
use Yoast\WP\SEO\Helpers\Image_Helper;
13
use Yoast\WP\SEO\Helpers\Indexable_Helper;
14
use Yoast\WP\SEO\Helpers\Open_Graph\Values_Helper;
15
use Yoast\WP\SEO\Helpers\Options_Helper;
16
use Yoast\WP\SEO\Helpers\Permalink_Helper;
17
use Yoast\WP\SEO\Helpers\Url_Helper;
18
use Yoast\WP\SEO\Helpers\User_Helper;
19
use Yoast\WP\SEO\Models\Indexable;
20

21
/**
22
 * Class Indexable_Presentation.
23
 *
24
 * Presentation object for indexables.
25
 *
26
 * @property string       $title
27
 * @property string       $meta_description
28
 * @property array        $robots
29
 * @property string       $canonical
30
 * @property string       $rel_next
31
 * @property string       $rel_prev
32
 * @property string       $open_graph_type
33
 * @property string       $open_graph_title
34
 * @property string       $open_graph_description
35
 * @property array        $open_graph_images
36
 * @property int          $open_graph_image_id
37
 * @property string       $open_graph_image
38
 * @property string       $open_graph_url
39
 * @property string       $open_graph_site_name
40
 * @property string       $open_graph_article_publisher
41
 * @property string       $open_graph_article_author
42
 * @property string       $open_graph_article_published_time
43
 * @property string       $open_graph_article_modified_time
44
 * @property string       $open_graph_locale
45
 * @property string       $open_graph_fb_app_id
46
 * @property string       $permalink
47
 * @property array        $schema
48
 * @property string       $twitter_card
49
 * @property string       $twitter_title
50
 * @property string       $twitter_description
51
 * @property string       $twitter_image
52
 * @property string       $twitter_creator
53
 * @property string       $twitter_site
54
 * @property object|array $source
55
 * @property array        $breadcrumbs
56
 * @property int          $estimated_reading_time_minutes
57
 * @property array        $googlebot
58
 * @property array        $bingbot
59
 */
60
class Indexable_Presentation extends Abstract_Presentation {
61

62
        /**
63
         * The indexable.
64
         *
65
         * @var Indexable
66
         */
67
        public $model;
68

69
        /**
70
         * The meta tags context.
71
         *
72
         * @var Meta_Tags_Context
73
         */
74
        public $context;
75

76
        /**
77
         * The Schema generator.
78
         *
79
         * @var Schema_Generator
80
         */
81
        protected $schema_generator;
82

83
        /**
84
         * The Open Graph image generator.
85
         *
86
         * @var Open_Graph_Image_Generator
87
         */
88
        protected $open_graph_image_generator;
89

90
        /**
91
         * The Twitter image generator.
92
         *
93
         * @var Twitter_Image_Generator
94
         */
95
        protected $twitter_image_generator;
96

97
        /**
98
         * The Open Graph locale generator.
99
         *
100
         * @var Open_Graph_Locale_Generator
101
         */
102
        private $open_graph_locale_generator;
103

104
        /**
105
         * The breadcrumbs generator.
106
         *
107
         * @var Breadcrumbs_Generator
108
         */
109
        private $breadcrumbs_generator;
110

111
        /**
112
         * The current page helper.
113
         *
114
         * @var Current_Page_Helper
115
         */
116
        protected $current_page;
117

118
        /**
119
         * The image helper.
120
         *
121
         * @var Image_Helper
122
         */
123
        protected $image;
124

125
        /**
126
         * The options helper.
127
         *
128
         * @var Options_Helper
129
         */
130
        protected $options;
131

132
        /**
133
         * The URL helper.
134
         *
135
         * @var Url_Helper
136
         */
137
        protected $url;
138

139
        /**
140
         * The user helper.
141
         *
142
         * @var User_Helper
143
         */
144
        protected $user;
145

146
        /**
147
         * The indexable helper.
148
         *
149
         * @var Indexable_Helper
150
         */
151
        protected $indexable_helper;
152

153
        /**
154
         * The permalink helper.
155
         *
156
         * @var Permalink_Helper
157
         */
158
        protected $permalink_helper;
159

160
        /**
161
         * The values helper.
162
         *
163
         * @var Values_Helper
164
         */
165
        protected $values_helper;
166

167
        /**
168
         * Sets the generator dependencies.
169
         *
170
         * @required
171
         *
172
         * @param Schema_Generator            $schema_generator            The schema generator.
173
         * @param Open_Graph_Locale_Generator $open_graph_locale_generator The Open Graph locale generator.
174
         * @param Open_Graph_Image_Generator  $open_graph_image_generator  The Open Graph image generator.
175
         * @param Twitter_Image_Generator     $twitter_image_generator     The Twitter image generator.
176
         * @param Breadcrumbs_Generator       $breadcrumbs_generator       The breadcrumbs generator.
177
         */
178
        public function set_generators(
×
179
                Schema_Generator $schema_generator,
180
                Open_Graph_Locale_Generator $open_graph_locale_generator,
181
                Open_Graph_Image_Generator $open_graph_image_generator,
182
                Twitter_Image_Generator $twitter_image_generator,
183
                Breadcrumbs_Generator $breadcrumbs_generator
184
        ) {
185
                $this->schema_generator            = $schema_generator;
×
186
                $this->open_graph_locale_generator = $open_graph_locale_generator;
×
187
                $this->open_graph_image_generator  = $open_graph_image_generator;
×
188
                $this->twitter_image_generator     = $twitter_image_generator;
×
189
                $this->breadcrumbs_generator       = $breadcrumbs_generator;
×
190
        }
191

192
        /**
193
         * Used by dependency injection container to inject the helpers.
194
         *
195
         * @required
196
         *
197
         * @param Image_Helper        $image        The image helper.
198
         * @param Options_Helper      $options      The options helper.
199
         * @param Current_Page_Helper $current_page The current page helper.
200
         * @param Url_Helper          $url          The URL helper.
201
         * @param User_Helper         $user         The user helper.
202
         * @param Indexable_Helper    $indexable    The indexable helper.
203
         * @param Permalink_Helper    $permalink    The permalink helper.
204
         * @param Values_Helper       $values       The values helper.
205
         */
206
        public function set_helpers(
×
207
                Image_Helper $image,
208
                Options_Helper $options,
209
                Current_Page_Helper $current_page,
210
                Url_Helper $url,
211
                User_Helper $user,
212
                Indexable_Helper $indexable,
213
                Permalink_Helper $permalink,
214
                Values_Helper $values
215
        ) {
216
                $this->image            = $image;
×
217
                $this->options          = $options;
×
218
                $this->current_page     = $current_page;
×
219
                $this->url              = $url;
×
220
                $this->user             = $user;
×
221
                $this->indexable_helper = $indexable;
×
222
                $this->permalink_helper = $permalink;
×
223
                $this->values_helper    = $values;
×
224
        }
225

226
        /**
227
         * Gets the permalink from the indexable or generates it if dynamic permalinks are enabled.
228
         *
229
         * @return string The permalink.
230
         */
231
        public function generate_permalink() {
6✔
232
                if ( $this->indexable_helper->dynamic_permalinks_enabled() ) {
6✔
233
                        return $this->permalink_helper->get_permalink_for_indexable( $this->model );
2✔
234
                }
235

236
                if ( \is_date() ) {
4✔
237
                        return $this->current_page->get_date_archive_permalink();
×
238
                }
239

240
                if ( \is_attachment() ) {
4✔
241
                        global $wp;
×
242
                        return \trailingslashit( \home_url( $wp->request ) );
×
243
                }
244

245
                return $this->model->permalink;
4✔
246
        }
247

248
        /**
249
         * Generates the title.
250
         *
251
         * @return string The title.
252
         */
253
        public function generate_title() {
4✔
254
                if ( $this->model->title ) {
4✔
255
                        return $this->model->title;
2✔
256
                }
257

258
                return '';
2✔
259
        }
260

261
        /**
262
         * Generates the meta description.
263
         *
264
         * @return string The meta description.
265
         */
266
        public function generate_meta_description() {
4✔
267
                if ( $this->model->description ) {
4✔
268
                        return $this->model->description;
2✔
269
                }
270

271
                return '';
2✔
272
        }
273

274
        /**
275
         * Generates the robots value.
276
         *
277
         * @return array The robots value.
278
         */
279
        public function generate_robots() {
10✔
280
                $robots = $this->get_base_robots();
10✔
281

282
                return $this->filter_robots( $robots );
10✔
283
        }
284

285
        /**
286
         * Gets the base robots value.
287
         *
288
         * @return array The base robots value.
289
         */
290
        protected function get_base_robots() {
10✔
291
                return [
5✔
292
                        'index'             => ( $this->model->is_robots_noindex === true ) ? 'noindex' : 'index',
10✔
293
                        'follow'            => ( $this->model->is_robots_nofollow === true ) ? 'nofollow' : 'follow',
10✔
294
                        'max-snippet'       => 'max-snippet:-1',
10✔
295
                        'max-image-preview' => 'max-image-preview:large',
10✔
296
                        'max-video-preview' => 'max-video-preview:-1',
10✔
297
                ];
5✔
298
        }
299

300
        /**
301
         * Run the robots output content through the `wpseo_robots` filter.
302
         *
303
         * @param array $robots The meta robots values to filter.
304
         *
305
         * @return array The filtered meta robots values.
306
         */
307
        protected function filter_robots( $robots ) {
10✔
308
                // Remove values that are only listened to when indexing.
309
                if ( $robots['index'] === 'noindex' ) {
10✔
310
                        $robots['imageindex']        = null;
2✔
311
                        $robots['archive']           = null;
2✔
312
                        $robots['snippet']           = null;
2✔
313
                        $robots['max-snippet']       = null;
2✔
314
                        $robots['max-image-preview'] = null;
2✔
315
                        $robots['max-video-preview'] = null;
2✔
316
                }
317

318
                $robots_string = \implode( ', ', \array_filter( $robots ) );
10✔
319

320
                /**
321
                 * Filter: 'wpseo_robots' - Allows filtering of the meta robots output of Yoast SEO.
322
                 *
323
                 * @api string $robots The meta robots directives to be echoed.
324
                 *
325
                 * @param Indexable_Presentation $presentation The presentation of an indexable.
326
                 */
327
                $robots_filtered = \apply_filters( 'wpseo_robots', $robots_string, $this );
10✔
328

329
                // Convert the robots string back to an array.
330
                if ( \is_string( $robots_filtered ) ) {
10✔
331
                        $robots_values = \explode( ', ', $robots_filtered );
10✔
332
                        $robots_new    = [];
10✔
333

334
                        foreach ( $robots_values as $value ) {
10✔
335
                                $key = $value;
10✔
336

337
                                // Change `noindex` to `index.
338
                                if ( \strpos( $key, 'no' ) === 0 ) {
10✔
339
                                        $key = \substr( $value, 2 );
6✔
340
                                }
341
                                // Change `max-snippet:-1` to `max-snippet`.
342
                                $colon_position = \strpos( $key, ':' );
10✔
343
                                if ( $colon_position !== false ) {
10✔
344
                                        $key = \substr( $value, 0, $colon_position );
4✔
345
                                }
346

347
                                $robots_new[ $key ] = $value;
10✔
348
                        }
349

350
                        $robots = $robots_new;
10✔
351
                }
352

353
                if ( \is_bool( $robots_filtered ) && ( $robots_filtered === false ) ) {
10✔
354
                        return [
355
                                'index'  => 'noindex',
×
356
                                'follow' => 'nofollow',
357
                        ];
358
                }
359

360
                if ( ! $robots_filtered ) {
10✔
361
                        return [];
×
362
                }
363

364
                /**
365
                 * Filter: 'wpseo_robots_array' - Allows filtering of the meta robots output array of Yoast SEO.
366
                 *
367
                 * @api array $robots The meta robots directives to be used.
368
                 *
369
                 * @param Indexable_Presentation $presentation The presentation of an indexable.
370
                 */
371
                return \apply_filters( 'wpseo_robots_array', \array_filter( $robots ), $this );
10✔
372
        }
373

374
        /**
375
         * Generates the canonical.
376
         *
377
         * @return string The canonical.
378
         */
379
        public function generate_canonical() {
12✔
380
                if ( $this->model->canonical ) {
12✔
381
                        return $this->model->canonical;
2✔
382
                }
383

384
                if ( $this->permalink ) {
10✔
385
                        return $this->permalink;
8✔
386
                }
387

388
                return '';
2✔
389
        }
390

391
        /**
392
         * Generates the rel prev.
393
         *
394
         * @return string The rel prev value.
395
         */
396
        public function generate_rel_prev() {
2✔
397
                return '';
2✔
398
        }
399

400
        /**
401
         * Generates the rel next.
402
         *
403
         * @return string The rel prev next.
404
         */
405
        public function generate_rel_next() {
2✔
406
                return '';
2✔
407
        }
408

409
        /**
410
         * Generates the Open Graph type.
411
         *
412
         * @return string The Open Graph type.
413
         */
414
        public function generate_open_graph_type() {
2✔
415
                return 'website';
2✔
416
        }
417

418
        /**
419
         * Generates the open graph title.
420
         *
421
         * @return string The open graph title.
422
         */
423
        public function generate_open_graph_title() {
6✔
424
                if ( $this->model->open_graph_title ) {
6✔
425
                        $open_graph_title = $this->model->open_graph_title;
2✔
426
                }
427

428
                if ( empty( $open_graph_title ) ) {
6✔
429
                        // The helper applies a filter, but we don't have a default value at this stage so we pass an empty string.
430
                        $open_graph_title = $this->values_helper->get_open_graph_title( '', $this->model->object_type, $this->model->object_sub_type );
4✔
431
                }
432

433
                if ( empty( $open_graph_title ) ) {
6✔
434
                        $open_graph_title = $this->title;
2✔
435
                }
436

437
                return $open_graph_title;
6✔
438
        }
439

440
        /**
441
         * Generates the open graph description.
442
         *
443
         * @return string The open graph description.
444
         */
445
        public function generate_open_graph_description() {
6✔
446
                if ( $this->model->open_graph_description ) {
6✔
447
                        $open_graph_description = $this->model->open_graph_description;
2✔
448
                }
449

450
                if ( empty( $open_graph_description ) ) {
6✔
451
                        // The helper applies a filter, but we don't have a default value at this stage so we pass an empty string.
452
                        $open_graph_description = $this->values_helper->get_open_graph_description( '', $this->model->object_type, $this->model->object_sub_type );
4✔
453
                }
454

455
                if ( empty( $open_graph_description ) ) {
6✔
456
                        $open_graph_description = $this->meta_description;
2✔
457
                }
458

459
                return $open_graph_description;
6✔
460
        }
461

462
        /**
463
         * Generates the open graph images.
464
         *
465
         * @return array The open graph images.
466
         */
467
        public function generate_open_graph_images() {
4✔
468
                if ( $this->context->open_graph_enabled === false ) {
4✔
469
                        return [];
2✔
470
                }
471

472
                return $this->open_graph_image_generator->generate( $this->context );
2✔
473
        }
474

475
        /**
476
         * Generates the open graph image ID.
477
         *
478
         * @return string The open graph image ID.
479
         */
480
        public function generate_open_graph_image_id() {
×
481
                if ( $this->model->open_graph_image_id ) {
×
482
                        return $this->model->open_graph_image_id;
×
483
                }
484

485
                return $this->values_helper->get_open_graph_image_id( 0, $this->model->object_type, $this->model->object_sub_type );
×
486
        }
487

488
        /**
489
         * Generates the open graph image URL.
490
         *
491
         * @return string The open graph image URL.
492
         */
493
        public function generate_open_graph_image() {
×
494
                if ( $this->model->open_graph_image ) {
×
495
                        return $this->model->open_graph_image;
×
496
                }
497

498
                return $this->values_helper->get_open_graph_image( '', $this->model->object_type, $this->model->object_sub_type );
×
499
        }
500

501
        /**
502
         * Generates the open graph url.
503
         *
504
         * @return string The open graph url.
505
         */
506
        public function generate_open_graph_url() {
4✔
507
                if ( $this->model->canonical ) {
4✔
508
                        return $this->model->canonical;
2✔
509
                }
510

511
                return $this->permalink;
2✔
512
        }
513

514
        /**
515
         * Generates the open graph article publisher.
516
         *
517
         * @return string The open graph article publisher.
518
         */
519
        public function generate_open_graph_article_publisher() {
2✔
520
                return '';
2✔
521
        }
522

523
        /**
524
         * Generates the open graph article author.
525
         *
526
         * @return string The open graph article author.
527
         */
528
        public function generate_open_graph_article_author() {
2✔
529
                return '';
2✔
530
        }
531

532
        /**
533
         * Generates the open graph article published time.
534
         *
535
         * @return string The open graph article published time.
536
         */
537
        public function generate_open_graph_article_published_time() {
2✔
538
                return '';
2✔
539
        }
540

541
        /**
542
         * Generates the open graph article modified time.
543
         *
544
         * @return string The open graph article modified time.
545
         */
546
        public function generate_open_graph_article_modified_time() {
2✔
547
                return '';
2✔
548
        }
549

550
        /**
551
         * Generates the open graph locale.
552
         *
553
         * @return string The open graph locale.
554
         */
555
        public function generate_open_graph_locale() {
10✔
556
                return $this->open_graph_locale_generator->generate( $this->context );
10✔
557
        }
558

559
        /**
560
         * Generates the open graph site name.
561
         *
562
         * @return string The open graph site name.
563
         */
564
        public function generate_open_graph_site_name() {
4✔
565
                return $this->context->wordpress_site_name;
4✔
566
        }
567

568
        /**
569
         * Generates the Twitter card type.
570
         *
571
         * @return string The Twitter card type.
572
         */
573
        public function generate_twitter_card() {
2✔
574
                return $this->context->twitter_card;
2✔
575
        }
576

577
        /**
578
         * Generates the Twitter title.
579
         *
580
         * @return string The Twitter title.
581
         */
582
        public function generate_twitter_title() {
16✔
583
                if ( $this->model->twitter_title ) {
16✔
584
                        return $this->model->twitter_title;
2✔
585
                }
586

587
                if ( $this->context->open_graph_enabled === true ) {
14✔
588
                        $social_template_title = $this->values_helper->get_open_graph_title( '', $this->model->object_type, $this->model->object_sub_type );
12✔
589
                        $open_graph_title      = $this->open_graph_title;
12✔
590

591
                        // If the helper returns a value and it's different from the OG value in the indexable,
592
                        // output it in a twitter: tag.
593
                        if ( ! empty( $social_template_title ) && $social_template_title !== $open_graph_title ) {
12✔
594
                                return $social_template_title;
2✔
595
                        }
596

597
                        // If the OG title is set, let og: tag take care of this.
598
                        if ( ! empty( $open_graph_title ) ) {
10✔
599
                                return '';
4✔
600
                        }
601
                }
602

603
                if ( $this->title ) {
8✔
604
                        return $this->title;
6✔
605
                }
606

607
                return '';
2✔
608
        }
609

610
        /**
611
         * Generates the Twitter description.
612
         *
613
         * @return string The Twitter description.
614
         */
615
        public function generate_twitter_description() {
16✔
616
                if ( $this->model->twitter_description ) {
16✔
617
                        return $this->model->twitter_description;
2✔
618
                }
619

620
                if ( $this->context->open_graph_enabled === true ) {
14✔
621
                        $social_template_description = $this->values_helper->get_open_graph_description( '', $this->model->object_type, $this->model->object_sub_type );
12✔
622
                        $open_graph_description      = $this->open_graph_description;
12✔
623

624
                        // If the helper returns a value and it's different from the OG value in the indexable,
625
                        // output it in a twitter: tag.
626
                        if ( ! empty( $social_template_description ) && $social_template_description !== $open_graph_description ) {
12✔
627
                                return $social_template_description;
2✔
628
                        }
629

630
                        // If the OG description is set, let og: tag take care of this.
631
                        if ( ! empty( $open_graph_description ) ) {
10✔
632
                                return '';
4✔
633
                        }
634
                }
635

636
                if ( $this->meta_description ) {
8✔
637
                        return $this->meta_description;
6✔
638
                }
639

640
                return '';
2✔
641
        }
642

643
        /**
644
         * Generates the Twitter image.
645
         *
646
         * @return string The Twitter image.
647
         */
648
        public function generate_twitter_image() {
12✔
649
                $images = $this->twitter_image_generator->generate( $this->context );
12✔
650
                $image  = \reset( $images );
12✔
651

652
                // Use a user-defined Twitter image, if present.
653
                if ( $image && $this->context->indexable->twitter_image_source === 'set-by-user' ) {
12✔
654
                        return $image['url'];
2✔
655
                }
656

657
                // Let the Open Graph tags, if enabled, handle the rest of the fallback hierarchy.
658
                if ( $this->context->open_graph_enabled === true && $this->open_graph_images ) {
10✔
659
                        return '';
2✔
660
                }
661

662
                // Set a Twitter tag with the featured image, or a prominent image from the content, if present.
663
                if ( $image ) {
8✔
664
                        return $image['url'];
4✔
665
                }
666

667
                return '';
4✔
668
        }
669

670
        /**
671
         * Generates the Twitter creator.
672
         *
673
         * @return string The Twitter creator.
674
         */
675
        public function generate_twitter_creator() {
2✔
676
                return '';
2✔
677
        }
678

679
        /**
680
         * Generates the Twitter site.
681
         *
682
         * @return string The Twitter site.
683
         */
684
        public function generate_twitter_site() {
8✔
685
                switch ( $this->context->site_represents ) {
8✔
686
                        case 'person':
8✔
687
                                $twitter = $this->user->get_the_author_meta( 'twitter', (int) $this->context->site_user_id );
4✔
688
                                if ( empty( $twitter ) ) {
4✔
689
                                        $twitter = $this->options->get( 'twitter_site' );
2✔
690
                                }
691
                                break;
4✔
692
                        case 'company':
4✔
693
                        default:
694
                                $twitter = $this->options->get( 'twitter_site' );
4✔
695
                                break;
4✔
696
                }
697

698
                return $twitter;
8✔
699
        }
700

701
        /**
702
         * Generates the source.
703
         *
704
         * @return array The source.
705
         */
706
        public function generate_source() {
2✔
707
                return [];
2✔
708
        }
709

710
        /**
711
         * Generates the schema for the page.
712
         *
713
         * @codeCoverageIgnore Wrapper method.
714
         *
715
         * @return array The Schema object.
716
         */
717
        public function generate_schema() {
718
                return $this->schema_generator->generate( $this->context );
719
        }
720

721
        /**
722
         * Generates the breadcrumbs for the page.
723
         *
724
         * @codeCoverageIgnore Wrapper method.
725
         *
726
         * @return array The breadcrumbs.
727
         */
728
        public function generate_breadcrumbs() {
729
                return $this->breadcrumbs_generator->generate( $this->context );
730
        }
731

732
        /**
733
         * Generates the estimated reading time.
734
         *
735
         * @codeCoverageIgnore Wrapper method.
736
         *
737
         * @return int|null The estimated reading time.
738
         */
739
        public function generate_estimated_reading_time_minutes() {
740
                if ( $this->model->estimated_reading_time_minutes !== null ) {
741
                        return $this->model->estimated_reading_time_minutes;
742
                }
743

744
                if ( $this->context->post === null ) {
745
                        return null;
746
                }
747

748
                // 200 is the approximate estimated words per minute across languages.
749
                $words_per_minute = 200;
750
                $words            = \str_word_count( \wp_strip_all_tags( $this->context->post->post_content ) );
751
                return (int) \round( $words / $words_per_minute );
752
        }
753

754
        /**
755
         * Strips all nested dependencies from the debug info.
756
         *
757
         * @return array
758
         */
759
        public function __debugInfo() {
2✔
760
                return [
1✔
761
                        'model'   => $this->model,
2✔
762
                        'context' => $this->context,
2✔
763
                ];
1✔
764
        }
765
}
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

© 2025 Coveralls, Inc