diff src/Generator/BaseGenerator.php @ 1:ca36acd2bef2

Have a base going, there is definitly a lot wrong with some of the files and the general structure but overall, it's a starting point
author luka
date Sat, 24 Jun 2023 01:08:01 -0400
parents
children cf9993c5c7df
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Generator/BaseGenerator.php	Sat Jun 24 01:08:01 2023 -0400
@@ -0,0 +1,243 @@
+<?php
+
+namespace Wizzard\MagicForger\Generator;
+
+use DB;
+
+use Illuminate\Routing\Console\ControllerMakeCommand;
+
+use Symfony\Component\Console\Attribute\AsCommand;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+use Wizzard\MagicForger\Replacer;
+
+#[AsCommand(name: 'mf')]
+class BaseGenerator extends ControllerMakeCommand
+{
+    protected $schema;
+		protected $tables;
+
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $name = 'mf';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = 'Generates any (or all) of the available files.';
+
+    /**
+     * Execute the console command.
+     */
+    public function handle()
+    {
+
+        // First we need to ensure that the table exists, then we can
+        if (!$this->tableExists($this->getTableInput())) {
+            $this->components->error('The table: "'.$this->getTableInput().'" does not exist in the database.');
+
+            return false;
+        }
+
+        if ($this->option('all')) {
+            $this->input->setOption('factory', true);
+            $this->input->setOption('seed', true);
+            $this->input->setOption('migration', true);
+            $this->input->setOption('controller', true);
+            $this->input->setOption('model', true);
+        }
+
+        if ($this->option('factory')) {
+            $this->createFactory();
+        }
+
+        if ($this->option('migration')) {
+            $this->createMigration();
+        }
+
+        if ($this->option('seed')) {
+            $this->createSeeder();
+        }
+
+        if ($this->option('controller')) {
+            $this->createController();
+        }
+
+        if ($this->option('model')) {
+            $this->createModel();
+        }
+
+//TODO: when working on an actual 
+        $name = $this->qualifyClass($this->getTableInput());
+
+        $path = $this->getPath($name);
+				dd($name, $path);
+
+        // Next, We will check to see if the class already exists. If it does, we don't want
+        // to create the class and overwrite the user's code. So, we will bail out so the
+        // code is untouched. Otherwise, we will continue generating this class' files.
+        if ((! $this->hasOption('force') ||
+             ! $this->option('force')) &&
+             $this->alreadyExists($this->getNameInput())) {
+            $this->components->error($this->type.' already exists.');
+
+            return false;
+        }
+
+        // Next, we will generate the path to the location where this class' file should get
+        // written. Then, we will build the class and make the proper replacements on the
+        // stub files so that it gets the correctly formatted namespace and class name.
+        $this->makeDirectory($path);
+
+        $this->files->put($path, $this->sortImports($this->buildClass($name)));
+
+        $info = $this->type;
+
+        if (in_array(CreatesMatchingTest::class, class_uses_recursive($this))) {
+            if ($this->handleTestCreation($path)) {
+                $info .= ' and test';
+            }
+        }
+
+        $this->components->info(sprintf('%s [%s] created successfully.', $info, $path));
+        echo "Generating Replacements\n";
+        $replacer = new Replacer();
+
+        $table_name = 'timesheet_statuses';
+        $model_name = $replacer->model_name($table_name);
+        $controller_name = $replacer->controller_name($table_name);
+        $human_readable = $replacer->human_readable($table_name);
+        $human_readable_lc = $replacer->human_readable_lc($table_name);
+        $replacer->log("Table Name : $table_name");
+        $replacer->log("Model Name : $model_name");
+        $replacer->log("Controller Name : $controller_name");
+        $replacer->log("Human Readable: $human_readable");
+        $replacer->log("Human Readable LC: $human_readable_lc");
+
+        echo "Stub Location\n";
+        $replacer->log($this->getStub());
+
+    }
+
+    protected function promptForMissingArguments(InputInterface $input, OutputInterface $output)
+    {
+        $table = null;
+        while ($table === null) {
+            $table = $this->components->askWithCompletion(
+                'What Table should we use?',
+                $this->possibleTables()
+            );
+        }
+
+        $input->setArgument('table', $table);
+        parent::promptForMissingArguments($input, $output);
+    }
+
+    /**
+     * Get the console command arguments.
+     *
+     * @return array
+     */
+    protected function getArguments()
+    {
+        return [
+            ['table', InputOption::VALUE_REQUIRED, 'The table to generate files for.'],
+        ];
+    }
+
+    /**
+     * Prompt for missing input arguments using the returned questions.
+     *
+     * @return array
+     */
+    protected function promptForMissingArgumentsUsing()
+    {
+        return [
+        ];
+    }
+
+    /**
+     * Get the console command options.
+     *
+     * @return array
+     */
+    protected function getOptions()
+    {
+        return [
+            /* ['type', null, InputOption::VALUE_REQUIRED, 'Manually specify the controller stub file to use'], */
+            /* ['force', null, InputOption::VALUE_NONE, 'Create the class even if the controller already exists'], */
+            /* ['invokable', 'i', InputOption::VALUE_NONE, 'Generate a single method, invokable controller class'], */
+
+            ['table', null, InputOption::VALUE_REQUIRED, 'The table to generate files for.'],
+            ['all', 'a', InputOption::VALUE_NONE, 'Generate a migration, seeder, factory, policy, resource controller, and form request classes for the model'],
+
+        ];
+    }
+
+    /**
+     * Interact further with the user if they were prompted for missing arguments.
+     *
+     * @return void
+     */
+    protected function afterPromptingForMissingArguments(InputInterface $input, OutputInterface $output)
+    {
+    }
+
+    ////////////////////////////////////////////
+    ///				TO GO IN THE BASE CLASS				 ///
+    ////////////////////////////////////////////
+
+    /**
+     * Get the desired class table from the input.
+     *
+     * @return string
+     */
+    protected function getTableInput()
+    {
+        return trim($this->argument('table'));
+    }
+
+    protected function tableExists(string $table_name): bool
+    {
+        return in_array($table_name, $this->getTables());
+    }
+
+    /**
+     * Get a list of possible table names.
+     */
+    protected function possibleTables()
+    {
+
+				return $this->getTables();
+    }
+		
+    /**
+     * Get the tables in the schema
+     */
+    protected function getTables()
+    {
+        $tables = $this->getSchema()->listTableNames();
+
+        return collect($tables)
+            ->all();
+    }
+
+    /**
+     * Get the database schema
+     */
+    protected function getSchema()
+    {
+        if (is_null($this->schema)) {
+            $this->schema = DB::connection()->getDoctrineSchemaManager();
+        }
+
+        return $this->schema;
+    }
+}