121 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/env php
 | 
						|
<?php
 | 
						|
 | 
						|
use Symfony\Component\Yaml\Yaml;
 | 
						|
 | 
						|
define('ROOT', dirname(__DIR__));
 | 
						|
 | 
						|
require ROOT . '/vendor/autoload.php';
 | 
						|
 | 
						|
const types = [
 | 
						|
    'blob'         => '',
 | 
						|
    'bool'         => 'bool',
 | 
						|
    'char'         => 'string',
 | 
						|
    'datetime'     => '\DateTimeInterface',
 | 
						|
    'timestamp'    => '\DateTimeInterface',
 | 
						|
    'html'         => 'string',
 | 
						|
    'int'          => 'int',
 | 
						|
    'numeric'      => 'float',
 | 
						|
    'serial'       => 'int',
 | 
						|
    'text'         => 'string',
 | 
						|
    'varchar'      => 'string',
 | 
						|
    'phone_number' => 'PhoneNumber',
 | 
						|
];
 | 
						|
 | 
						|
$files = array_merge(glob(ROOT . '/src/Entity/*.php'),
 | 
						|
                     array_merge(glob(ROOT . '/components/*/Entity/*.php'),
 | 
						|
                                 glob(ROOT . '/plugins/*/Entity/*.php')));
 | 
						|
 | 
						|
$classes = [];
 | 
						|
$nullable_no_defaults_warning = [];
 | 
						|
 | 
						|
foreach ($files as $file) {
 | 
						|
 | 
						|
    require_once $file;
 | 
						|
 | 
						|
    $declared = get_declared_classes();
 | 
						|
    foreach ($declared as $dc) {
 | 
						|
        if (preg_match('/(App|(Component|Plugin)\\\\[^\\\\]+)\\\\Entity/', $dc) && !in_array($dc, $classes)) {
 | 
						|
            $class = $dc;
 | 
						|
            $classes[] = $class;
 | 
						|
            break;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    $no_ns_class  = preg_replace('/.*?\\\\/', '', $class);
 | 
						|
    $schema       = $class::schemaDef();
 | 
						|
    $fields       = array_keys($schema['fields']);
 | 
						|
    $fields_code  = [];
 | 
						|
    $methods_code = [];
 | 
						|
    foreach ($fields as $field) {
 | 
						|
        $field_schema   = $schema['fields'][$field];
 | 
						|
        $nullable       = ($field_schema['not null'] ?? false) ? '' : '?';
 | 
						|
        $type           = types[$field_schema['type']];
 | 
						|
        $type           = $type !== '' ? $nullable . $type : $type;
 | 
						|
        $method_name    = str_replace([' ', 'actor'], ['', 'Actor'], ucwords(str_replace('_', ' ', $field)));
 | 
						|
        $length         = $field_schema['length'] ?? null;
 | 
						|
 | 
						|
        $field_setter = "\${$field}";
 | 
						|
        if (\is_int($length)) {
 | 
						|
            if ($nullable === '?') {
 | 
						|
                $field_setter = "\is_null(\${$field}) ? null : \mb_substr(\${$field}, 0, $length)";
 | 
						|
            } else {
 | 
						|
                $field_setter = "\mb_substr(\${$field}, 0, $length)";
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        if (($nullable === '?' || \array_key_exists('default', $field_schema)) && $type != '\DateTimeInterface') {
 | 
						|
            if (!\array_key_exists('default', $field_schema)) {
 | 
						|
                $nullable_no_defaults_warning[] = "{$class}::{$field}";
 | 
						|
            }
 | 
						|
            $default = $field_schema['default'] ?? null;
 | 
						|
            if (\is_string($default)) {
 | 
						|
                $default = "'{$default}'";
 | 
						|
            } elseif (\is_null($default)) {
 | 
						|
                $default = "null";
 | 
						|
            } elseif ($type === 'bool' || $type === '?bool') {
 | 
						|
                $default = $default ? 'true' : 'false';
 | 
						|
            }
 | 
						|
 | 
						|
            $fields_code[]  = "    private {$type} \${$field} = {$default};";
 | 
						|
        } else {
 | 
						|
            $fields_code[]  = "    private {$type} \${$field};";
 | 
						|
        }
 | 
						|
 | 
						|
        $methods_code[] = "    public function set{$method_name}({$type} \${$field}): self" .
 | 
						|
                        "\n    {\n        \$this->{$field} = {$field_setter};\n        return \$this;\n    }" . "\n\n" .
 | 
						|
                        "    public function get{$method_name}()" . ($type !== '' ? ": {$type}" : '') .
 | 
						|
                        "\n    {\n        return \$this->{$field};\n    }" . "\n";
 | 
						|
    }
 | 
						|
 | 
						|
    $fields_code  = implode("\n", $fields_code);
 | 
						|
    $methods_code = implode("\n", $methods_code);
 | 
						|
 | 
						|
    $begin = '// {{{ Autocode';
 | 
						|
    $end   = '// }}} Autocode';
 | 
						|
    $code  = "
 | 
						|
    {$begin}
 | 
						|
    // @codeCoverageIgnoreStart
 | 
						|
{$fields_code}
 | 
						|
 | 
						|
{$methods_code}
 | 
						|
    // @codeCoverageIgnoreEnd
 | 
						|
    {$end}";
 | 
						|
 | 
						|
    foreach (['/\\//' => '\\/', '/ /' => '\\ '] as $from => $to) {
 | 
						|
        $begin = preg_replace($from, $to, $begin);
 | 
						|
        $end   = preg_replace($from, $to, $end);
 | 
						|
    }
 | 
						|
 | 
						|
    $in_file  = file_get_contents($file);
 | 
						|
    $out_file = preg_replace("%\\s*{$begin}.*{$end}%smu", $code, $in_file);
 | 
						|
    file_put_contents($file, $out_file);
 | 
						|
}
 | 
						|
 | 
						|
if (!empty($nullable_no_defaults_warning)) {
 | 
						|
    echo "Warning: The following don't have a default value, but we're assigning it `null`. Doctrine might not like this, so update it\n";
 | 
						|
    foreach ($nullable_no_defaults_warning as $n) {
 | 
						|
        echo "    {$n}\n";
 | 
						|
    }
 | 
						|
}
 |