PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.23.1
MailPoet – Newsletters, Email Marketing, and Automation v5.23.1
5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / vendor-prefixed / symfony / validator / Command / DebugCommand.php
mailpoet / vendor-prefixed / symfony / validator / Command Last commit date
DebugCommand.php 1 year ago index.php 3 years ago
DebugCommand.php
170 lines
1 <?php
2 namespace MailPoetVendor\Symfony\Component\Validator\Command;
3 if (!defined('ABSPATH')) exit;
4 use MailPoetVendor\Symfony\Component\Console\Command\Command;
5 use MailPoetVendor\Symfony\Component\Console\Helper\Dumper;
6 use MailPoetVendor\Symfony\Component\Console\Helper\Table;
7 use MailPoetVendor\Symfony\Component\Console\Input\InputArgument;
8 use MailPoetVendor\Symfony\Component\Console\Input\InputInterface;
9 use MailPoetVendor\Symfony\Component\Console\Input\InputOption;
10 use MailPoetVendor\Symfony\Component\Console\Output\OutputInterface;
11 use MailPoetVendor\Symfony\Component\Console\Style\SymfonyStyle;
12 use MailPoetVendor\Symfony\Component\Finder\Exception\DirectoryNotFoundException;
13 use MailPoetVendor\Symfony\Component\Finder\Finder;
14 use MailPoetVendor\Symfony\Component\Validator\Constraint;
15 use MailPoetVendor\Symfony\Component\Validator\Mapping\AutoMappingStrategy;
16 use MailPoetVendor\Symfony\Component\Validator\Mapping\CascadingStrategy;
17 use MailPoetVendor\Symfony\Component\Validator\Mapping\ClassMetadataInterface;
18 use MailPoetVendor\Symfony\Component\Validator\Mapping\Factory\MetadataFactoryInterface;
19 use MailPoetVendor\Symfony\Component\Validator\Mapping\GenericMetadata;
20 use MailPoetVendor\Symfony\Component\Validator\Mapping\TraversalStrategy;
21 class DebugCommand extends Command
22 {
23 protected static $defaultName = 'debug:validator';
24 protected static $defaultDescription = 'Display validation constraints for classes';
25 private $validator;
26 public function __construct(MetadataFactoryInterface $validator)
27 {
28 parent::__construct();
29 $this->validator = $validator;
30 }
31 protected function configure()
32 {
33 $this->addArgument('class', InputArgument::REQUIRED, 'A fully qualified class name or a path')->addOption('show-all', null, InputOption::VALUE_NONE, 'Show all classes even if they have no validation constraints')->setDescription(self::$defaultDescription)->setHelp(<<<'EOF'
34 The <info>%command.name% 'App\Entity\Dummy'</info> command dumps the validators for the dummy class.
35 The <info>%command.name% src/</info> command dumps the validators for the `src` directory.
36 EOF
37 );
38 }
39 protected function execute(InputInterface $input, OutputInterface $output) : int
40 {
41 $class = $input->getArgument('class');
42 if (\class_exists($class)) {
43 $this->dumpValidatorsForClass($input, $output, $class);
44 return 0;
45 }
46 try {
47 foreach ($this->getResourcesByPath($class) as $class) {
48 $this->dumpValidatorsForClass($input, $output, $class);
49 }
50 } catch (DirectoryNotFoundException $exception) {
51 $io = new SymfonyStyle($input, $output);
52 $io->error(\sprintf('Neither class nor path were found with "%s" argument.', $input->getArgument('class')));
53 return 1;
54 }
55 return 0;
56 }
57 private function dumpValidatorsForClass(InputInterface $input, OutputInterface $output, string $class) : void
58 {
59 $io = new SymfonyStyle($input, $output);
60 $title = \sprintf('<info>%s</info>', $class);
61 $rows = [];
62 $dump = new Dumper($output);
63 $classMetadata = $this->validator->getMetadataFor($class);
64 foreach ($this->getClassConstraintsData($classMetadata) as $data) {
65 $rows[] = ['-', $data['class'], \implode(', ', $data['groups']), $dump($data['options'])];
66 }
67 foreach ($this->getConstrainedPropertiesData($classMetadata) as $propertyName => $constraintsData) {
68 foreach ($constraintsData as $data) {
69 $rows[] = [$propertyName, $data['class'], \implode(', ', $data['groups']), $dump($data['options'])];
70 }
71 }
72 if (!$rows) {
73 if (\false === $input->getOption('show-all')) {
74 return;
75 }
76 $io->section($title);
77 $io->text('No validators were found for this class.');
78 return;
79 }
80 $io->section($title);
81 $table = new Table($output);
82 $table->setHeaders(['Property', 'Name', 'Groups', 'Options']);
83 $table->setRows($rows);
84 $table->setColumnMaxWidth(3, 80);
85 $table->render();
86 }
87 private function getClassConstraintsData(ClassMetadataInterface $classMetadata) : iterable
88 {
89 foreach ($classMetadata->getConstraints() as $constraint) {
90 (yield ['class' => \get_class($constraint), 'groups' => $constraint->groups, 'options' => $this->getConstraintOptions($constraint)]);
91 }
92 }
93 private function getConstrainedPropertiesData(ClassMetadataInterface $classMetadata) : array
94 {
95 $data = [];
96 foreach ($classMetadata->getConstrainedProperties() as $constrainedProperty) {
97 $data[$constrainedProperty] = $this->getPropertyData($classMetadata, $constrainedProperty);
98 }
99 return $data;
100 }
101 private function getPropertyData(ClassMetadataInterface $classMetadata, string $constrainedProperty) : array
102 {
103 $data = [];
104 $propertyMetadata = $classMetadata->getPropertyMetadata($constrainedProperty);
105 foreach ($propertyMetadata as $metadata) {
106 $autoMapingStrategy = 'Not supported';
107 if ($metadata instanceof GenericMetadata) {
108 switch ($metadata->getAutoMappingStrategy()) {
109 case AutoMappingStrategy::ENABLED:
110 $autoMapingStrategy = 'Enabled';
111 break;
112 case AutoMappingStrategy::DISABLED:
113 $autoMapingStrategy = 'Disabled';
114 break;
115 case AutoMappingStrategy::NONE:
116 $autoMapingStrategy = 'None';
117 break;
118 }
119 }
120 $traversalStrategy = 'None';
121 if (TraversalStrategy::TRAVERSE === $metadata->getTraversalStrategy()) {
122 $traversalStrategy = 'Traverse';
123 }
124 if (TraversalStrategy::IMPLICIT === $metadata->getTraversalStrategy()) {
125 $traversalStrategy = 'Implicit';
126 }
127 $data[] = ['class' => 'property options', 'groups' => [], 'options' => ['cascadeStrategy' => CascadingStrategy::CASCADE === $metadata->getCascadingStrategy() ? 'Cascade' : 'None', 'autoMappingStrategy' => $autoMapingStrategy, 'traversalStrategy' => $traversalStrategy]];
128 foreach ($metadata->getConstraints() as $constraint) {
129 $data[] = ['class' => \get_class($constraint), 'groups' => $constraint->groups, 'options' => $this->getConstraintOptions($constraint)];
130 }
131 }
132 return $data;
133 }
134 private function getConstraintOptions(Constraint $constraint) : array
135 {
136 $options = [];
137 foreach (\array_keys(\get_object_vars($constraint)) as $propertyName) {
138 // Groups are dumped on a specific column.
139 if ('groups' === $propertyName) {
140 continue;
141 }
142 $options[$propertyName] = $constraint->{$propertyName};
143 }
144 \ksort($options);
145 return $options;
146 }
147 private function getResourcesByPath(string $path) : array
148 {
149 $finder = new Finder();
150 $finder->files()->in($path)->name('*.php')->sortByName(\true);
151 $classes = [];
152 foreach ($finder as $file) {
153 $fileContent = \file_get_contents($file->getRealPath());
154 \preg_match('/namespace (.+);/', $fileContent, $matches);
155 $namespace = $matches[1] ?? null;
156 if (!\preg_match('/class +([^{ ]+)/', $fileContent, $matches)) {
157 // no class found
158 continue;
159 }
160 $className = \trim($matches[1]);
161 if (null !== $namespace) {
162 $classes[] = $namespace . '\\' . $className;
163 } else {
164 $classes[] = $className;
165 }
166 }
167 return $classes;
168 }
169 }
170