Parse and validate AT Protocol Lexicons with DTO generation for Laravel
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add lexicon generation location to config

+57 -20
+20 -1
config/schema.php
··· 60 60 61 61 /* 62 62 |-------------------------------------------------------------------------- 63 + | Lexicon Generation Settings 64 + |-------------------------------------------------------------------------- 65 + | 66 + | Configure how Lexicon classes are generated from AT Protocol schemas. 67 + | These settings are separate from Data class generation to allow for 68 + | different organizational structures. 69 + | 70 + */ 71 + 72 + 'lexicons' => [ 73 + // Output directory for generated Lexicon classes 74 + 'output_path' => env('SCHEMA_LEXICON_OUTPUT_PATH', app_path('Lexicons')), 75 + 76 + // Base namespace for generated Lexicon classes 77 + 'base_namespace' => env('SCHEMA_LEXICON_BASE_NAMESPACE', 'App\\Lexicons'), 78 + ], 79 + 80 + /* 81 + |-------------------------------------------------------------------------- 63 82 | Caching Configuration 64 83 |-------------------------------------------------------------------------- 65 84 | ··· 175 194 'user_agent' => env('SCHEMA_HTTP_USER_AGENT', 'SocialDept/Schema'), 176 195 ], 177 196 178 - ]; 197 + ];
+2 -2
src/Console/GenerateCommand.php
··· 29 29 public function handle(): int 30 30 { 31 31 $nsid = $this->argument('nsid'); 32 - $output = $this->option('output') ?? config('schema.generation.output_directory'); 33 - $namespace = $this->option('namespace') ?? config('schema.generation.base_namespace'); 32 + $output = $this->option('output') ?? config('schema.lexicons.output_path'); 33 + $namespace = $this->option('namespace') ?? config('schema.lexicons.base_namespace'); 34 34 $force = $this->option('force'); 35 35 $dryRun = $this->option('dry-run'); 36 36
+4 -4
src/Generator/DTOGenerator.php
··· 49 49 */ 50 50 public function __construct( 51 51 SchemaLoader $schemaLoader, 52 - string $baseNamespace = 'App\\Lexicon', 53 - string $outputDirectory = 'app/Lexicon', 52 + string $baseNamespace = 'App\\Lexicons', 53 + string $outputDirectory = 'app/Lexicons', 54 54 ?TypeParser $typeParser = null, 55 55 ?NamespaceResolver $namespaceResolver = null, 56 56 ?TemplateRenderer $templateRenderer = null, ··· 61 61 $this->outputDirectory = rtrim($outputDirectory, '/'); 62 62 $this->typeParser = $typeParser ?? new TypeParser(schemaLoader: $schemaLoader); 63 63 $this->namespaceResolver = $namespaceResolver ?? new NamespaceResolver($baseNamespace); 64 - $this->templateRenderer = $templateRenderer ?? new TemplateRenderer(); 65 - $this->fileWriter = $fileWriter ?? new FileWriter(); 64 + $this->templateRenderer = $templateRenderer ?? new TemplateRenderer; 65 + $this->fileWriter = $fileWriter ?? new FileWriter; 66 66 } 67 67 68 68 /**
+1 -1
src/Generator/NamespaceResolver.php
··· 14 14 /** 15 15 * Create a new NamespaceResolver. 16 16 */ 17 - public function __construct(string $baseNamespace = 'App\\Lexicon') 17 + public function __construct(string $baseNamespace = 'App\\Lexicons') 18 18 { 19 19 $this->baseNamespace = rtrim($baseNamespace, '\\'); 20 20 }
+1 -1
src/Generator/NamingConverter.php
··· 14 14 /** 15 15 * Create a new NamingConverter. 16 16 */ 17 - public function __construct(string $baseNamespace = 'App\\Lexicon') 17 + public function __construct(string $baseNamespace = 'App\\Lexicons') 18 18 { 19 19 $this->baseNamespace = rtrim($baseNamespace, '\\'); 20 20 }
+25 -9
src/SchemaServiceProvider.php
··· 30 30 ); 31 31 }); 32 32 33 + // Register NamingConverter 34 + $this->app->singleton(Generator\NamingConverter::class, function ($app) { 35 + return new Generator\NamingConverter( 36 + baseNamespace: config('schema.lexicons.base_namespace', 'App\\Lexicons') 37 + ); 38 + }); 39 + 40 + // Register NamespaceResolver 41 + $this->app->singleton(Generator\NamespaceResolver::class, function ($app) { 42 + return new Generator\NamespaceResolver( 43 + baseNamespace: config('schema.lexicons.base_namespace', 'App\\Lexicons') 44 + ); 45 + }); 46 + 33 47 // Register DTOGenerator 34 48 $this->app->singleton(Generator\DTOGenerator::class, function ($app) { 35 49 return new Generator\DTOGenerator( 36 50 schemaLoader: $app->make(Parser\SchemaLoader::class), 37 - baseNamespace: config('schema.generation.base_namespace', 'App\\Lexicon'), 38 - outputDirectory: config('schema.generation.output_directory', 'app/Lexicon') 51 + baseNamespace: config('schema.lexicons.base_namespace', 'App\\Lexicons'), 52 + outputDirectory: config('schema.lexicons.output_path', app_path('Lexicons')), 53 + typeParser: null, 54 + namespaceResolver: $app->make(Generator\NamespaceResolver::class) 39 55 ); 40 56 }); 41 57 ··· 70 86 71 87 // Register AT Protocol validation rules 72 88 $validator->extend('nsid', function ($attribute, $value) { 73 - $rule = new Validation\Rules\Nsid(); 89 + $rule = new Validation\Rules\Nsid; 74 90 $failed = false; 75 91 $rule->validate($attribute, $value, function () use (&$failed) { 76 92 $failed = true; ··· 80 96 }, 'The :attribute is not a valid NSID.'); 81 97 82 98 $validator->extend('did', function ($attribute, $value) { 83 - $rule = new Validation\Rules\Did(); 99 + $rule = new Validation\Rules\Did; 84 100 $failed = false; 85 101 $rule->validate($attribute, $value, function () use (&$failed) { 86 102 $failed = true; ··· 90 106 }, 'The :attribute is not a valid DID.'); 91 107 92 108 $validator->extend('handle', function ($attribute, $value) { 93 - $rule = new Validation\Rules\Handle(); 109 + $rule = new Validation\Rules\Handle; 94 110 $failed = false; 95 111 $rule->validate($attribute, $value, function () use (&$failed) { 96 112 $failed = true; ··· 100 116 }, 'The :attribute is not a valid handle.'); 101 117 102 118 $validator->extend('at_uri', function ($attribute, $value) { 103 - $rule = new Validation\Rules\AtUri(); 119 + $rule = new Validation\Rules\AtUri; 104 120 $failed = false; 105 121 $rule->validate($attribute, $value, function () use (&$failed) { 106 122 $failed = true; ··· 110 126 }, 'The :attribute is not a valid AT URI.'); 111 127 112 128 $validator->extend('at_datetime', function ($attribute, $value) { 113 - $rule = new Validation\Rules\AtDatetime(); 129 + $rule = new Validation\Rules\AtDatetime; 114 130 $failed = false; 115 131 $rule->validate($attribute, $value, function () use (&$failed) { 116 132 $failed = true; ··· 120 136 }, 'The :attribute is not a valid AT Protocol datetime.'); 121 137 122 138 $validator->extend('cid', function ($attribute, $value) { 123 - $rule = new Validation\Rules\Cid(); 139 + $rule = new Validation\Rules\Cid; 124 140 $failed = false; 125 141 $rule->validate($attribute, $value, function () use (&$failed) { 126 142 $failed = true; ··· 156 172 }, 'The :attribute must be at least :min_graphemes graphemes.'); 157 173 158 174 $validator->extend('language', function ($attribute, $value) { 159 - $rule = new Validation\Rules\Language(); 175 + $rule = new Validation\Rules\Language; 160 176 $failed = false; 161 177 $rule->validate($attribute, $value, function () use (&$failed) { 162 178 $failed = true;
+2
src/helpers.php
··· 49 49 return Schema::generate($nsid, $options); 50 50 } 51 51 } 52 + 53 +
+2 -2
tests/Unit/Console/GenerateCommandTest.php
··· 19 19 20 20 config([ 21 21 'schema.sources' => [__DIR__.'/../../fixtures'], 22 - 'schema.generation.output_directory' => sys_get_temp_dir().'/schema-test', 23 - 'schema.generation.base_namespace' => 'Test\\Generated', 22 + 'schema.lexicons.output_path' => sys_get_temp_dir().'/schema-test', 23 + 'schema.lexicons.base_namespace' => 'Test\\Generated', 24 24 ]); 25 25 } 26 26