changeset 11:3426c7e91c24 main-dev

Modifying generaters and replacers
author luka
date Wed, 24 Apr 2024 19:53:42 -0400
parents a9ff874afdbd
children 7ee152c22478
files .php-cs-fixer.cache composer.json src/ConfigHelper.php src/Generator/Controller/stubs/controller.stub src/Generator/Model/ModelGenerator.php src/Generator/Model/stubs/model.stub src/Generator/Requests/stubs/request.stub src/Replacer/Replacer.php src/Replacer/TableReplacer.php
diffstat 9 files changed, 105 insertions(+), 38 deletions(-) [+]
line wrap: on
line diff
--- a/.php-cs-fixer.cache	Sat Dec 02 10:20:32 2023 -0500
+++ b/.php-cs-fixer.cache	Wed Apr 24 19:53:42 2024 -0400
@@ -1,1 +1,1 @@
-{"php":"8.2.12","version":"3.19.1","indent":"    ","lineEnding":"\n","rules":{"align_multiline_comment":true,"array_syntax":true,"backtick_to_shell_exec":true,"binary_operator_spaces":true,"blank_line_before_statement":{"statements":["return"]},"cast_spaces":true,"class_attributes_separation":{"elements":{"method":"one"}},"class_definition":{"single_line":true},"class_reference_name_casing":true,"clean_namespace":true,"concat_space":true,"curly_braces_position":{"allow_single_line_anonymous_functions":true,"allow_single_line_empty_anonymous_classes":true},"declare_parentheses":true,"echo_tag_syntax":true,"empty_loop_body":{"style":"braces"},"empty_loop_condition":true,"fully_qualified_strict_types":true,"function_typehint_space":true,"general_phpdoc_tag_rename":{"replacements":{"inheritDocs":"inheritDoc"}},"global_namespace_import":{"import_classes":false,"import_constants":false,"import_functions":false},"include":true,"increment_style":true,"integer_literal_case":true,"lambda_not_used_import":true,"linebreak_after_opening_tag":true,"magic_constant_casing":true,"magic_method_casing":true,"method_argument_space":{"on_multiline":"ignore"},"native_function_casing":true,"native_function_type_declaration_casing":true,"no_alias_language_construct_call":true,"no_alternative_syntax":true,"no_binary_string":true,"no_blank_lines_after_phpdoc":true,"no_empty_comment":true,"no_empty_phpdoc":true,"no_empty_statement":true,"no_extra_blank_lines":{"tokens":["attribute","case","continue","curly_brace_block","default","extra","parenthesis_brace_block","square_brace_block","switch","throw","use"]},"no_leading_namespace_whitespace":true,"no_mixed_echo_print":true,"no_multiline_whitespace_around_double_arrow":true,"no_null_property_initialization":true,"no_short_bool_cast":true,"no_singleline_whitespace_before_semicolons":true,"no_spaces_around_offset":true,"no_superfluous_phpdoc_tags":{"remove_inheritdoc":true},"no_trailing_comma_in_singleline":true,"no_unneeded_control_parentheses":{"statements":["break","clone","continue","echo_print","others","return","switch_case","yield","yield_from"]},"no_unneeded_curly_braces":{"namespaces":true},"no_unneeded_import_alias":true,"no_unset_cast":true,"no_unused_imports":true,"no_useless_concat_operator":true,"no_useless_nullsafe_operator":true,"no_whitespace_before_comma_in_array":true,"normalize_index_brace":true,"nullable_type_declaration_for_default_null_value":{"use_nullable_type_declaration":false},"object_operator_without_whitespace":true,"operator_linebreak":{"only_booleans":true},"ordered_imports":{"imports_order":["class","function","const"],"sort_algorithm":"alpha"},"php_unit_fqcn_annotation":true,"php_unit_method_casing":true,"phpdoc_align":true,"phpdoc_annotation_without_dot":true,"phpdoc_indent":true,"phpdoc_inline_tag_normalizer":true,"phpdoc_no_access":true,"phpdoc_no_alias_tag":true,"phpdoc_no_package":true,"phpdoc_no_useless_inheritdoc":true,"phpdoc_order":{"order":["param","return","throws"]},"phpdoc_return_self_reference":true,"phpdoc_scalar":true,"phpdoc_separation":true,"phpdoc_single_line_var_spacing":true,"phpdoc_summary":true,"phpdoc_tag_type":{"tags":{"inheritDoc":"inline"}},"phpdoc_to_comment":true,"phpdoc_trim":true,"phpdoc_trim_consecutive_blank_line_separation":true,"phpdoc_types":true,"phpdoc_types_order":{"null_adjustment":"always_last","sort_algorithm":"none"},"phpdoc_var_without_name":true,"semicolon_after_instruction":true,"simple_to_complex_string_variable":true,"single_class_element_per_statement":true,"single_import_per_statement":true,"single_line_comment_spacing":true,"single_line_comment_style":{"comment_types":["hash"]},"single_line_throw":true,"single_quote":true,"single_space_around_construct":true,"space_after_semicolon":{"remove_in_empty_for_expressions":true},"standardize_increment":true,"standardize_not_equals":true,"switch_continue_to_break":true,"trailing_comma_in_multiline":true,"trim_array_spaces":true,"types_spaces":true,"unary_operator_spaces":true,"whitespace_after_comma_in_array":true,"yoda_style":true,"blank_line_after_opening_tag":true,"blank_line_between_import_groups":true,"blank_lines_before_namespace":true,"compact_nullable_typehint":true,"declare_equal_normalize":true,"lowercase_cast":true,"lowercase_static_reference":true,"new_with_braces":true,"no_blank_lines_after_class_opening":true,"no_leading_import_slash":true,"no_whitespace_in_blank_line":true,"ordered_class_elements":{"order":["use_trait"]},"return_type_declaration":true,"short_scalar_cast":true,"single_trait_insert_per_statement":true,"ternary_operator_spaces":true,"visibility_required":true,"blank_line_after_namespace":true,"constant_case":true,"control_structure_braces":true,"control_structure_continuation_position":true,"elseif":true,"function_declaration":true,"indentation_type":true,"line_ending":true,"lowercase_keywords":true,"no_break_comment":true,"no_closing_tag":true,"no_multiple_statements_per_line":true,"no_space_around_double_colon":true,"no_spaces_after_function_name":true,"no_spaces_inside_parenthesis":true,"no_trailing_whitespace":true,"no_trailing_whitespace_in_comment":true,"single_blank_line_at_eof":true,"single_line_after_imports":true,"statement_indentation":true,"switch_case_semicolon_to_colon":true,"switch_case_space":true,"encoding":true},"hashes":{"src\/Generator\/Route\/RouteGenerator.php":"02bf90516b88a1b0b00a84afb10d8a45","src\/Generator\/Controller\/ControllerGenerator.php":"717cdb9124e7e4afe4a28e17b94089e9","src\/Generator\/Model\/ModelGenerator.php":"31743678bf017f63680db19e9682df45","src\/Generator\/Generator.php":"c7cd32166a24be83f6575d33f6c4ba80","src\/Generator\/Requests\/UpdateRequestGenerator.php":"63475513d258b0727637db19629d4ac6","src\/Generator\/Requests\/RequestGenerator.php":"93fbc04a1ea18b794ee7f24902ae9cc1","src\/Generator\/Requests\/StoreRequestGenerator.php":"42bac2b426288d9a08216dfc5fe45faf","src\/Generator\/BaseGenerator.php":"c0aa37a727252383bc28aebf7a0019ec","src\/MagicForgerServiceProvider.php":"00c1321ad894d1e0807036dbe9114bf2","src\/Replacer\/Replacer.php":"501a0ebcf606a7602973b6033ee54b8e","src\/Replacer\/TableReplacer.php":"dc289802665136521abf6ffea0203732","src\/ConfigHelper.php":"c11480fee67c40ca948c38c14bed7d16"}}
\ No newline at end of file
+{"php":"8.2.12","version":"3.19.1","indent":"    ","lineEnding":"\n","rules":{"align_multiline_comment":true,"array_syntax":true,"backtick_to_shell_exec":true,"binary_operator_spaces":true,"blank_line_before_statement":{"statements":["return"]},"cast_spaces":true,"class_attributes_separation":{"elements":{"method":"one"}},"class_definition":{"single_line":true},"class_reference_name_casing":true,"clean_namespace":true,"concat_space":true,"curly_braces_position":{"allow_single_line_anonymous_functions":true,"allow_single_line_empty_anonymous_classes":true},"declare_parentheses":true,"echo_tag_syntax":true,"empty_loop_body":{"style":"braces"},"empty_loop_condition":true,"fully_qualified_strict_types":true,"function_typehint_space":true,"general_phpdoc_tag_rename":{"replacements":{"inheritDocs":"inheritDoc"}},"global_namespace_import":{"import_classes":false,"import_constants":false,"import_functions":false},"include":true,"increment_style":true,"integer_literal_case":true,"lambda_not_used_import":true,"linebreak_after_opening_tag":true,"magic_constant_casing":true,"magic_method_casing":true,"method_argument_space":{"on_multiline":"ignore"},"native_function_casing":true,"native_function_type_declaration_casing":true,"no_alias_language_construct_call":true,"no_alternative_syntax":true,"no_binary_string":true,"no_blank_lines_after_phpdoc":true,"no_empty_comment":true,"no_empty_phpdoc":true,"no_empty_statement":true,"no_extra_blank_lines":{"tokens":["attribute","case","continue","curly_brace_block","default","extra","parenthesis_brace_block","square_brace_block","switch","throw","use"]},"no_leading_namespace_whitespace":true,"no_mixed_echo_print":true,"no_multiline_whitespace_around_double_arrow":true,"no_null_property_initialization":true,"no_short_bool_cast":true,"no_singleline_whitespace_before_semicolons":true,"no_spaces_around_offset":true,"no_superfluous_phpdoc_tags":{"remove_inheritdoc":true},"no_trailing_comma_in_singleline":true,"no_unneeded_control_parentheses":{"statements":["break","clone","continue","echo_print","others","return","switch_case","yield","yield_from"]},"no_unneeded_curly_braces":{"namespaces":true},"no_unneeded_import_alias":true,"no_unset_cast":true,"no_unused_imports":true,"no_useless_concat_operator":true,"no_useless_nullsafe_operator":true,"no_whitespace_before_comma_in_array":true,"normalize_index_brace":true,"nullable_type_declaration_for_default_null_value":{"use_nullable_type_declaration":false},"object_operator_without_whitespace":true,"operator_linebreak":{"only_booleans":true},"ordered_imports":{"imports_order":["class","function","const"],"sort_algorithm":"alpha"},"php_unit_fqcn_annotation":true,"php_unit_method_casing":true,"phpdoc_align":true,"phpdoc_annotation_without_dot":true,"phpdoc_indent":true,"phpdoc_inline_tag_normalizer":true,"phpdoc_no_access":true,"phpdoc_no_alias_tag":true,"phpdoc_no_package":true,"phpdoc_no_useless_inheritdoc":true,"phpdoc_order":{"order":["param","return","throws"]},"phpdoc_return_self_reference":true,"phpdoc_scalar":true,"phpdoc_separation":true,"phpdoc_single_line_var_spacing":true,"phpdoc_summary":true,"phpdoc_tag_type":{"tags":{"inheritDoc":"inline"}},"phpdoc_to_comment":true,"phpdoc_trim":true,"phpdoc_trim_consecutive_blank_line_separation":true,"phpdoc_types":true,"phpdoc_types_order":{"null_adjustment":"always_last","sort_algorithm":"none"},"phpdoc_var_without_name":true,"semicolon_after_instruction":true,"simple_to_complex_string_variable":true,"single_class_element_per_statement":true,"single_import_per_statement":true,"single_line_comment_spacing":true,"single_line_comment_style":{"comment_types":["hash"]},"single_line_throw":true,"single_quote":true,"single_space_around_construct":true,"space_after_semicolon":{"remove_in_empty_for_expressions":true},"standardize_increment":true,"standardize_not_equals":true,"switch_continue_to_break":true,"trailing_comma_in_multiline":true,"trim_array_spaces":true,"types_spaces":true,"unary_operator_spaces":true,"whitespace_after_comma_in_array":true,"yoda_style":true,"blank_line_after_opening_tag":true,"blank_line_between_import_groups":true,"blank_lines_before_namespace":true,"compact_nullable_typehint":true,"declare_equal_normalize":true,"lowercase_cast":true,"lowercase_static_reference":true,"new_with_braces":true,"no_blank_lines_after_class_opening":true,"no_leading_import_slash":true,"no_whitespace_in_blank_line":true,"ordered_class_elements":{"order":["use_trait"]},"return_type_declaration":true,"short_scalar_cast":true,"single_trait_insert_per_statement":true,"ternary_operator_spaces":true,"visibility_required":true,"blank_line_after_namespace":true,"constant_case":true,"control_structure_braces":true,"control_structure_continuation_position":true,"elseif":true,"function_declaration":true,"indentation_type":true,"line_ending":true,"lowercase_keywords":true,"no_break_comment":true,"no_closing_tag":true,"no_multiple_statements_per_line":true,"no_space_around_double_colon":true,"no_spaces_after_function_name":true,"no_spaces_inside_parenthesis":true,"no_trailing_whitespace":true,"no_trailing_whitespace_in_comment":true,"single_blank_line_at_eof":true,"single_line_after_imports":true,"statement_indentation":true,"switch_case_semicolon_to_colon":true,"switch_case_space":true,"encoding":true},"hashes":{"src\/Generator\/Route\/RouteGenerator.php":"02bf90516b88a1b0b00a84afb10d8a45","src\/Generator\/Controller\/ControllerGenerator.php":"717cdb9124e7e4afe4a28e17b94089e9","src\/Generator\/Model\/ModelGenerator.php":"00eeb5bd27acee0bff89fac12dfd21ac","src\/Generator\/Generator.php":"c7cd32166a24be83f6575d33f6c4ba80","src\/Generator\/Requests\/UpdateRequestGenerator.php":"63475513d258b0727637db19629d4ac6","src\/Generator\/Requests\/RequestGenerator.php":"93fbc04a1ea18b794ee7f24902ae9cc1","src\/Generator\/Requests\/StoreRequestGenerator.php":"42bac2b426288d9a08216dfc5fe45faf","src\/Generator\/BaseGenerator.php":"c0aa37a727252383bc28aebf7a0019ec","src\/MagicForgerServiceProvider.php":"00c1321ad894d1e0807036dbe9114bf2","src\/Replacer\/Replacer.php":"501a0ebcf606a7602973b6033ee54b8e","src\/Replacer\/TableReplacer.php":"dc289802665136521abf6ffea0203732","src\/ConfigHelper.php":"6821f761a93d04ff466da1529442b304","src\/Replacer\/BladeReplacer.php":"fc8e7f3f50008e83d690d1fea0b19193"}}
\ No newline at end of file
--- a/composer.json	Sat Dec 02 10:20:32 2023 -0500
+++ b/composer.json	Wed Apr 24 19:53:42 2024 -0400
@@ -9,7 +9,8 @@
     },
     "minimum-stability": "stable",
     "require": {
-        "laravel/framework": ">=10.3"
+        "laravel/framework": ">=10.3",
+        "doctrine/dbal": "^3.6"
     },
 		"extra": {
     	"laravel": {
--- a/src/ConfigHelper.php	Sat Dec 02 10:20:32 2023 -0500
+++ b/src/ConfigHelper.php	Wed Apr 24 19:53:42 2024 -0400
@@ -2,6 +2,8 @@
 
 namespace Wizzard\MagicForger;
 
+use Illuminate\Support\Collection;
+
 class ConfigHelper
 {
     // Config array
@@ -11,32 +13,32 @@
     public const CONFIG_FILE_NAME = 'mf_config.php';
 
     // Config path variable
-    public static $config_path;
+    public static string $config_path;
 
     /**
-     * Set up configuration path
-     *
-     * @param string $base_path
+     * Set up configuration path.
+     * @return void
      */
-    public static function setup_config_path(string $base_path)
+    public static function setup_config_path(string $base_path): void
     {
         self::$config_path = $base_path.'/'.self::CONFIG_FILE_NAME;
     }
 
     /**
-     * Get configuration path
+     * Get configuration path.
      *
      * @return string
      */
-    protected static function get_config_path()
+    protected static function get_config_path(): string
     {
         return self::$config_path;
     }
 
     /**
-     * Write configuration into a file
+     * Write configuration into a file.
+     * @return void
      */
-    public static function write_config()
+    public static function write_config(): void
     {
         $path = self::get_config_path();
         $str = '<?php
@@ -48,18 +50,20 @@
     }
 
     /**
-     * Read configuration from a file
+     * Read configuration from a file.
+     * @return void
      */
-    public static function read_config()
+    public static function read_config(): void
     {
         $path = self::get_config_path();
         self::$config = include $path;
     }
 
     /**
-     * Print configuration
+     * Print configuration.
+     * @return void
      */
-    public static function print_config()
+    public static function print_config(): void
     {
         self::varexport(self::$config);
     }
@@ -71,11 +75,10 @@
      *
      * @see https://www.php.net/manual/en/function.var-export.php
      *
-     * @param mixed $expression
-     * @param boolean $return
-     * @return mixed
+     * @param bool $return
+     * @return string|string[]|null
      */
-    public static function varexport($expression, $return = false)
+    public static function varexport(mixed $expression, $return = false): string|array|null
     {
         $export = var_export($expression, true);
         $patterns = [
@@ -90,31 +93,47 @@
         } else {
             echo $export;
         }
+				return null;
     }
 
     /**
-     * Format the given file
-     *
-     * @param string $path
+     * Format the given file.
+     * @return void
      */
-    protected static function format_file(string $path)
+    protected static function format_file(string $path): void
     {
         exec('php-cs-fixer fix '.$path);
     }
 
     /**
-     * Set up tables
+     * Set up tables.
      */
-    public static function set_up_tables()
+		public static function set_up_tables(): Collection	
     {
         $schema = \DB::connection()->getDoctrineSchemaManager();
-        // get all the tables available in the database
         $tables = collect($schema->listTableNames())->all();
+        $table_foreign_keys = [];
+        foreach ($tables as $table) {
+            $table_foreign_keys[$table] = $schema->listTableForeignKeys($table);
+        }
 
         $insert_tables = [];
         foreach ($tables as $table) {
             $columns = [];
-            $table_columns = $schema->introspectTable($table)->getColumns();
+            $table_columns = $schema->listTableColumns($table);
+
+            // Initiate new arrays for foreign keys
+            $foreign_keys = [];
+            $foreign_keys_reverse = [];
+
+            // Check foreign key references from this table
+            $foreign_keys_list = $table_foreign_keys[$table];
+            foreach ($foreign_keys_list as $fk) {
+                $foreign_keys[$fk->getLocalColumns()[0]] = [
+                            'foreign_table' => $fk->getForeignTableName(),
+                            'foreign_column' => $fk->getForeignColumns()[0],
+                          ];
+            }
 
             foreach ($table_columns as $column) {
                 $full_class = get_class($column->getType());
@@ -131,24 +150,40 @@
                                       ],
                                 ];
             }
-
+            // Check foreign key references to this table
+            foreach ($tables as $other_table) {
+                if ($other_table != $table) {
+                    $foreign_keys_list = $table_foreign_keys[$other_table];
+                    foreach ($foreign_keys_list as $fk) {
+                        if ($fk->getForeignTableName() == $table) {
+                            $foreign_keys_reverse[] = [
+                                               'table' => $other_table,
+                                               'column' => $fk->getLocalColumns()[0],
+                                          ];
+                        }
+                    }
+                }
+            }
             $insert_tables[$table] = [];
             $insert_tables[$table]['columns'] = $columns;
+            $insert_tables[$table]['foreign_keys'] = $foreign_keys; // Foreign keys FROM this table
+            $insert_tables[$table]['foreign_keys_reverse'] = $foreign_keys_reverse; // Foreign keys TO this table
             $insert_tables[$table]['type'] = 'default';
         }
-        // Merge the new tables configuration into the initial config
+
         self::merge_array_priority(self::$config['tables'], $insert_tables);
 
         return $tables;
     }
 
     /**
-     * Merge two arrays and ensure priority values do not get overwritten
+     * Merge two arrays and ensure priority values do not get overwritten.
      *
      * @param array $priority
      * @param array $merged
+     * @return void
      */
-    private static function merge_array_priority(&$priority, $merged)
+    private static function merge_array_priority(&$priority, $merged): void
     {
         foreach ($merged as $key => $value) {
             // if the priority key is not set, automatically add the merged values
--- a/src/Generator/Controller/stubs/controller.stub	Sat Dec 02 10:20:32 2023 -0500
+++ b/src/Generator/Controller/stubs/controller.stub	Wed Apr 24 19:53:42 2024 -0400
@@ -41,7 +41,7 @@
 				${{ modelVariable }} = new {{ model }}();
 
 				//insert the values into the model
-				// {{ valuesForCreation }}
+        ${{ modelVariable }}->map_values($validated);
 
 				${{ modelVariable }}->save();
 
@@ -80,7 +80,7 @@
 				$validated = $request->validated();
 
         // Set the variables
-				//{{ valuesForCreation }}
+        ${{ modelVariable }}->map_values($validated);
 
 				${{ modelVariable }}->save();
 
--- a/src/Generator/Model/ModelGenerator.php	Sat Dec 02 10:20:32 2023 -0500
+++ b/src/Generator/Model/ModelGenerator.php	Wed Apr 24 19:53:42 2024 -0400
@@ -51,7 +51,7 @@
      * Resolve the fully-qualified path to the stub.
      *
      * @param string $stub
-     *
+    *
      * @return string
      */
     protected function resolveStubPath($stub)
--- a/src/Generator/Model/stubs/model.stub	Sat Dec 02 10:20:32 2023 -0500
+++ b/src/Generator/Model/stubs/model.stub	Wed Apr 24 19:53:42 2024 -0400
@@ -40,4 +40,13 @@
 				$item->updated_by = \Auth::user()->id;
 			});
 		}
+
+
+		//relations
+
+		// BelongsTo
+
+		// HasMany
+		
+
 }
--- a/src/Generator/Requests/stubs/request.stub	Sat Dec 02 10:20:32 2023 -0500
+++ b/src/Generator/Requests/stubs/request.stub	Wed Apr 24 19:53:42 2024 -0400
@@ -22,7 +22,7 @@
     public function rules(): array
     {
         return [
-            //
+            // {{ valuesForValidation }} 
         ];
     }
 }
--- a/src/Replacer/Replacer.php	Sat Dec 02 10:20:32 2023 -0500
+++ b/src/Replacer/Replacer.php	Wed Apr 24 19:53:42 2024 -0400
@@ -89,8 +89,8 @@
      */
     public function model_variable(string $name): string
     {
-        /* return Str::singular($name); */
-        return 'item';
+        return Str::singular($name);
+        /* return 'item'; */
     }
 
     /**
--- a/src/Replacer/TableReplacer.php	Sat Dec 02 10:20:32 2023 -0500
+++ b/src/Replacer/TableReplacer.php	Wed Apr 24 19:53:42 2024 -0400
@@ -29,6 +29,26 @@
         return $insert;
     }
 
+    protected function getAttributes()
+    {
+        $insert = '';
+        foreach ($this->get_columns() as $column) {
+            $insert .= "'".$column->getName()."' => '',\n";
+        }
+
+        return $insert;
+    }
+
+    protected function getValuesForValidation()
+    {
+        $insert = '';
+        foreach ($this->get_columns() as $column) {
+            $insert .= "'".$column->getName()."' => 'nullable',\n";
+        }
+
+        return $insert;
+    }
+
     public function apply_inserts(string $target): string
     {
         $inserts = $this->get_all_keywords($target);
@@ -48,7 +68,9 @@
         $table_name = $this->getTableInput();
         $replacements = [
                         '// {{ valuesForCreation }}' => self::getValuesForCreation(),
-        ];
+                        '# {{ atributeInsertPoint }}' => self::getAttributes(),
+            						'// {{ valuesForValidation }}' => self::getValuesForValidation(),
+			        ];
 
         foreach ($replacements as $key => &$replacement) {
             $replacement = $replacement."\n".$key;