PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 4.17.1
MailPoet – Newsletters, Email Marketing, and Automation v4.17.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 4 years ago index.php 3 years ago
DebugCommand.php
135 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\ClassMetadataInterface;
16 use MailPoetVendor\Symfony\Component\Validator\Mapping\Factory\MetadataFactoryInterface;
17 class DebugCommand extends Command
18 {
19 protected static $defaultName = 'debug:validator';
20 protected static $defaultDescription = 'Display validation constraints for classes';
21 private $validator;
22 public function __construct(MetadataFactoryInterface $validator)
23 {
24 parent::__construct();
25 $this->validator = $validator;
26 }
27 protected function configure()
28 {
29 $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'
30 The <info>%command.name% 'App\Entity\Dummy'</info> command dumps the validators for the dummy class.
31 The <info>%command.name% src/</info> command dumps the validators for the `src` directory.
32 EOF
33 );
34 }
35 protected function execute(InputInterface $input, OutputInterface $output) : int
36 {
37 $class = $input->getArgument('class');
38 if (\class_exists($class)) {
39 $this->dumpValidatorsForClass($input, $output, $class);
40 return 0;
41 }
42 try {
43 foreach ($this->getResourcesByPath($class) as $class) {
44 $this->dumpValidatorsForClass($input, $output, $class);
45 }
46 } catch (DirectoryNotFoundException $exception) {
47 $io = new SymfonyStyle($input, $output);
48 $io->error(\sprintf('Neither class nor path were found with "%s" argument.', $input->getArgument('class')));
49 return 1;
50 }
51 return 0;
52 }
53 private function dumpValidatorsForClass(InputInterface $input, OutputInterface $output, string $class) : void
54 {
55 $io = new SymfonyStyle($input, $output);
56 $title = \sprintf('<info>%s</info>', $class);
57 $rows = [];
58 $dump = new Dumper($output);
59 foreach ($this->getConstrainedPropertiesData($class) as $propertyName => $constraintsData) {
60 foreach ($constraintsData as $data) {
61 $rows[] = [$propertyName, $data['class'], \implode(', ', $data['groups']), $dump($data['options'])];
62 }
63 }
64 if (!$rows) {
65 if (\false === $input->getOption('show-all')) {
66 return;
67 }
68 $io->section($title);
69 $io->text('No validators were found for this class.');
70 return;
71 }
72 $io->section($title);
73 $table = new Table($output);
74 $table->setHeaders(['Property', 'Name', 'Groups', 'Options']);
75 $table->setRows($rows);
76 $table->setColumnMaxWidth(3, 80);
77 $table->render();
78 }
79 private function getConstrainedPropertiesData(string $class) : array
80 {
81 $data = [];
82 $classMetadata = $this->validator->getMetadataFor($class);
83 foreach ($classMetadata->getConstrainedProperties() as $constrainedProperty) {
84 $data[$constrainedProperty] = $this->getPropertyData($classMetadata, $constrainedProperty);
85 }
86 return $data;
87 }
88 private function getPropertyData(ClassMetadataInterface $classMetadata, string $constrainedProperty) : array
89 {
90 $data = [];
91 $propertyMetadata = $classMetadata->getPropertyMetadata($constrainedProperty);
92 foreach ($propertyMetadata as $metadata) {
93 foreach ($metadata->getConstraints() as $constraint) {
94 $data[] = ['class' => \get_class($constraint), 'groups' => $constraint->groups, 'options' => $this->getConstraintOptions($constraint)];
95 }
96 }
97 return $data;
98 }
99 private function getConstraintOptions(Constraint $constraint) : array
100 {
101 $options = [];
102 foreach (\array_keys(\get_object_vars($constraint)) as $propertyName) {
103 // Groups are dumped on a specific column.
104 if ('groups' === $propertyName) {
105 continue;
106 }
107 $options[$propertyName] = $constraint->{$propertyName};
108 }
109 \ksort($options);
110 return $options;
111 }
112 private function getResourcesByPath(string $path) : array
113 {
114 $finder = new Finder();
115 $finder->files()->in($path)->name('*.php')->sortByName(\true);
116 $classes = [];
117 foreach ($finder as $file) {
118 $fileContent = \file_get_contents($file->getRealPath());
119 \preg_match('/namespace (.+);/', $fileContent, $matches);
120 $namespace = $matches[1] ?? null;
121 if (!\preg_match('/class +([^{ ]+)/', $fileContent, $matches)) {
122 // no class found
123 continue;
124 }
125 $className = \trim($matches[1]);
126 if (null !== $namespace) {
127 $classes[] = $namespace . '\\' . $className;
128 } else {
129 $classes[] = $className;
130 }
131 }
132 return $classes;
133 }
134 }
135