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

Yoast / wordpress-seo / 7257244093

19 Dec 2023 04:09AM UTC coverage: 49.388% (-0.002%) from 49.39%
7257244093

push

github

web-flow
Merge pull request #20987 from Yoast/JRF/docs/more-fixes

Docs: more fixes

15425 of 31232 relevant lines covered (49.39%)

4.07 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
                 * @param string                 $robots       The meta robots directives to be echoed.
324
                 * @param Indexable_Presentation $presentation The presentation of an indexable.
325
                 */
326
                $robots_filtered = \apply_filters( 'wpseo_robots', $robots_string, $this );
10✔
327

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

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

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

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

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

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

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

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

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

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

386
                return '';
2✔
387
        }
388

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

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

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

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

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

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

435
                return $open_graph_title;
6✔
436
        }
437

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

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

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

457
                return $open_graph_description;
6✔
458
        }
459

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

470
                return $this->open_graph_image_generator->generate( $this->context );
2✔
471
        }
472

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

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

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

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

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

509
                return $this->permalink;
2✔
510
        }
511

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

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

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

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

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

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

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

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

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

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

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

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

605
                return '';
2✔
606
        }
607

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

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

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

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

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

638
                return '';
2✔
639
        }
640

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

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

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

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

665
                return '';
4✔
666
        }
667

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

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

696
                return $twitter;
8✔
697
        }
698

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

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

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

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

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

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

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