336 lines
8.7 KiB
Markdown
336 lines
8.7 KiB
Markdown
|
# Config Package Gap Analysis
|
||
|
|
||
|
## Overview
|
||
|
|
||
|
This document analyzes the gaps between our current configuration handling (in Core package) and Laravel's Config package functionality, identifying what needs to be implemented as a standalone Config package.
|
||
|
|
||
|
> **Related Documentation**
|
||
|
> - See [Config Package Specification](config_package_specification.md) for current implementation
|
||
|
> - See [Laravel Compatibility Roadmap](laravel_compatibility_roadmap.md) for overall status
|
||
|
> - See [Foundation Integration Guide](foundation_integration_guide.md) for integration patterns
|
||
|
> - See [Testing Guide](testing_guide.md) for testing approaches
|
||
|
> - See [Getting Started Guide](getting_started.md) for development setup
|
||
|
|
||
|
## Implementation Gaps
|
||
|
|
||
|
### 1. Missing Package Structure
|
||
|
```dart
|
||
|
// Need to create dedicated Config package:
|
||
|
|
||
|
packages/config/
|
||
|
├── lib/
|
||
|
│ ├── src/
|
||
|
│ │ ├── config_repository.dart
|
||
|
│ │ ├── environment_loader.dart
|
||
|
│ │ ├── config_loader.dart
|
||
|
│ │ └── config_cache.dart
|
||
|
│ └── config.dart
|
||
|
├── test/
|
||
|
└── example/
|
||
|
```
|
||
|
|
||
|
### 2. Missing Core Features
|
||
|
```dart
|
||
|
// 1. Config Repository
|
||
|
class ConfigRepository {
|
||
|
// Need to implement:
|
||
|
T? get<T>(String key, [T? defaultValue]);
|
||
|
void set(String key, dynamic value);
|
||
|
bool has(String key);
|
||
|
Map<String, dynamic> all();
|
||
|
void merge(Map<String, dynamic> items);
|
||
|
}
|
||
|
|
||
|
// 2. Environment Loading
|
||
|
class EnvironmentLoader {
|
||
|
// Need to implement:
|
||
|
Future<void> load([String? path]);
|
||
|
String? get(String key, [String? defaultValue]);
|
||
|
void set(String key, String value);
|
||
|
bool has(String key);
|
||
|
}
|
||
|
|
||
|
// 3. Configuration Loading
|
||
|
class ConfigurationLoader {
|
||
|
// Need to implement:
|
||
|
Future<Map<String, dynamic>> load();
|
||
|
Future<Map<String, dynamic>> loadFile(String path);
|
||
|
Future<void> reload();
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### 3. Missing Laravel Features
|
||
|
```dart
|
||
|
// 1. Package Configuration
|
||
|
class PackageConfig {
|
||
|
// Need to implement:
|
||
|
Future<void> publish(String package, Map<String, String> paths);
|
||
|
Future<void> publishForce(String package, Map<String, String> paths);
|
||
|
List<String> publishedPackages();
|
||
|
}
|
||
|
|
||
|
// 2. Configuration Groups
|
||
|
class ConfigurationGroups {
|
||
|
// Need to implement:
|
||
|
void group(String name, List<String> paths);
|
||
|
List<String> getGroup(String name);
|
||
|
bool hasGroup(String name);
|
||
|
}
|
||
|
|
||
|
// 3. Configuration Caching
|
||
|
class ConfigCache {
|
||
|
// Need to implement:
|
||
|
Future<void> cache(Map<String, dynamic> config);
|
||
|
Future<Map<String, dynamic>?> load();
|
||
|
Future<void> clear();
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Integration Gaps
|
||
|
|
||
|
### 1. Container Integration
|
||
|
```dart
|
||
|
// Need to implement:
|
||
|
|
||
|
class ConfigServiceProvider {
|
||
|
void register() {
|
||
|
// Register config repository
|
||
|
container.singleton<ConfigContract>((c) =>
|
||
|
ConfigRepository(
|
||
|
loader: c.make<ConfigurationLoader>(),
|
||
|
cache: c.make<ConfigCache>()
|
||
|
)
|
||
|
);
|
||
|
|
||
|
// Register environment loader
|
||
|
container.singleton<EnvironmentLoader>((c) =>
|
||
|
EnvironmentLoader(
|
||
|
path: c.make<PathResolver>().base
|
||
|
)
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### 2. Package Integration
|
||
|
```dart
|
||
|
// Need to implement:
|
||
|
|
||
|
class PackageServiceProvider {
|
||
|
void register() {
|
||
|
// Register package config
|
||
|
publishConfig('my-package', {
|
||
|
'config/my-package.php': 'my-package'
|
||
|
});
|
||
|
}
|
||
|
|
||
|
void boot() {
|
||
|
// Merge package config
|
||
|
config.merge({
|
||
|
'my-package': {
|
||
|
'key': 'value'
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### 3. Environment Integration
|
||
|
```dart
|
||
|
// Need to implement:
|
||
|
|
||
|
class EnvironmentServiceProvider {
|
||
|
void boot() {
|
||
|
var env = container.make<EnvironmentLoader>();
|
||
|
|
||
|
// Load environment files
|
||
|
env.load();
|
||
|
|
||
|
if (env.get('APP_ENV') == 'local') {
|
||
|
env.load('.env.local');
|
||
|
}
|
||
|
|
||
|
// Set environment variables
|
||
|
config.set('app.env', env.get('APP_ENV', 'production'));
|
||
|
config.set('app.debug', env.get('APP_DEBUG', 'false') == 'true');
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Documentation Gaps
|
||
|
|
||
|
### 1. Missing API Documentation
|
||
|
```dart
|
||
|
// Need to document:
|
||
|
|
||
|
/// Manages application configuration.
|
||
|
///
|
||
|
/// Provides access to configuration values using dot notation:
|
||
|
/// ```dart
|
||
|
/// var dbHost = config.get<String>('database.connections.mysql.host');
|
||
|
/// ```
|
||
|
class ConfigRepository {
|
||
|
/// Gets a configuration value.
|
||
|
///
|
||
|
/// Returns [defaultValue] if key not found.
|
||
|
T? get<T>(String key, [T? defaultValue]);
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### 2. Missing Usage Examples
|
||
|
```dart
|
||
|
// Need examples for:
|
||
|
|
||
|
// 1. Basic Configuration
|
||
|
var appName = config.get<String>('app.name', 'My App');
|
||
|
var debug = config.get<bool>('app.debug', false);
|
||
|
|
||
|
// 2. Environment Configuration
|
||
|
var dbConfig = {
|
||
|
'host': env('DB_HOST', 'localhost'),
|
||
|
'port': env('DB_PORT', '3306'),
|
||
|
'database': env('DB_DATABASE'),
|
||
|
'username': env('DB_USERNAME'),
|
||
|
'password': env('DB_PASSWORD')
|
||
|
};
|
||
|
|
||
|
// 3. Package Configuration
|
||
|
class MyPackageServiceProvider {
|
||
|
void register() {
|
||
|
publishConfig('my-package', {
|
||
|
'config/my-package.php': 'my-package'
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### 3. Missing Test Coverage
|
||
|
```dart
|
||
|
// Need tests for:
|
||
|
|
||
|
void main() {
|
||
|
group('Config Repository', () {
|
||
|
test('gets nested values', () {
|
||
|
var config = ConfigRepository({
|
||
|
'app': {
|
||
|
'name': 'Test App',
|
||
|
'nested': {'key': 'value'}
|
||
|
}
|
||
|
});
|
||
|
|
||
|
expect(config.get('app.name'), equals('Test App'));
|
||
|
expect(config.get('app.nested.key'), equals('value'));
|
||
|
});
|
||
|
});
|
||
|
|
||
|
group('Environment Loader', () {
|
||
|
test('loads env files', () async {
|
||
|
var env = EnvironmentLoader();
|
||
|
await env.load('.env.test');
|
||
|
|
||
|
expect(env.get('APP_NAME'), equals('Test App'));
|
||
|
expect(env.get('APP_ENV'), equals('testing'));
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Implementation Priority
|
||
|
|
||
|
1. **High Priority**
|
||
|
- Create Config package structure
|
||
|
- Implement core repository
|
||
|
- Add environment loading
|
||
|
- Add configuration loading
|
||
|
|
||
|
2. **Medium Priority**
|
||
|
- Add package configuration
|
||
|
- Add configuration groups
|
||
|
- Add configuration caching
|
||
|
- Add container integration
|
||
|
|
||
|
3. **Low Priority**
|
||
|
- Add helper functions
|
||
|
- Add testing utilities
|
||
|
- Add debugging tools
|
||
|
|
||
|
## Next Steps
|
||
|
|
||
|
1. **Package Creation**
|
||
|
- Create package structure
|
||
|
- Move config code from Core
|
||
|
- Add package dependencies
|
||
|
- Setup testing
|
||
|
|
||
|
2. **Core Implementation**
|
||
|
- Implement ConfigRepository
|
||
|
- Implement EnvironmentLoader
|
||
|
- Implement ConfigurationLoader
|
||
|
- Add caching support
|
||
|
|
||
|
3. **Integration Implementation**
|
||
|
- Add container integration
|
||
|
- Add package support
|
||
|
- Add environment support
|
||
|
- Add service providers
|
||
|
|
||
|
Would you like me to:
|
||
|
1. Create the Config package structure?
|
||
|
2. Start implementing core features?
|
||
|
3. Create detailed implementation plans?
|
||
|
|
||
|
## Development Guidelines
|
||
|
|
||
|
### 1. Getting Started
|
||
|
Before implementing config features:
|
||
|
1. Review [Getting Started Guide](getting_started.md)
|
||
|
2. Check [Laravel Compatibility Roadmap](laravel_compatibility_roadmap.md)
|
||
|
3. Follow [Testing Guide](testing_guide.md)
|
||
|
4. Use [Foundation Integration Guide](foundation_integration_guide.md)
|
||
|
5. Review [Config Package Specification](config_package_specification.md)
|
||
|
|
||
|
### 2. Implementation Process
|
||
|
For each config feature:
|
||
|
1. Write tests following [Testing Guide](testing_guide.md)
|
||
|
2. Implement following Laravel patterns
|
||
|
3. Document following [Getting Started Guide](getting_started.md#documentation)
|
||
|
4. Integrate following [Foundation Integration Guide](foundation_integration_guide.md)
|
||
|
|
||
|
### 3. Quality Requirements
|
||
|
All implementations must:
|
||
|
1. Pass all tests (see [Testing Guide](testing_guide.md))
|
||
|
2. Meet Laravel compatibility requirements
|
||
|
3. Follow integration patterns (see [Foundation Integration Guide](foundation_integration_guide.md))
|
||
|
4. Match specifications in [Config Package Specification](config_package_specification.md)
|
||
|
|
||
|
### 4. Integration Considerations
|
||
|
When implementing config features:
|
||
|
1. Follow patterns in [Foundation Integration Guide](foundation_integration_guide.md)
|
||
|
2. Ensure Laravel compatibility per [Laravel Compatibility Roadmap](laravel_compatibility_roadmap.md)
|
||
|
3. Use testing approaches from [Testing Guide](testing_guide.md)
|
||
|
4. Follow development setup in [Getting Started Guide](getting_started.md)
|
||
|
|
||
|
### 5. Performance Guidelines
|
||
|
Config system must:
|
||
|
1. Cache configuration efficiently
|
||
|
2. Minimize file I/O
|
||
|
3. Support lazy loading
|
||
|
4. Handle environment variables efficiently
|
||
|
5. Meet performance targets in [Laravel Compatibility Roadmap](laravel_compatibility_roadmap.md#performance-benchmarks)
|
||
|
|
||
|
### 6. Testing Requirements
|
||
|
Config tests must:
|
||
|
1. Cover all configuration scenarios
|
||
|
2. Test environment handling
|
||
|
3. Verify caching behavior
|
||
|
4. Check file operations
|
||
|
5. Follow patterns in [Testing Guide](testing_guide.md)
|
||
|
|
||
|
### 7. Documentation Requirements
|
||
|
Config documentation must:
|
||
|
1. Explain configuration patterns
|
||
|
2. Show environment examples
|
||
|
3. Cover caching strategies
|
||
|
4. Include performance tips
|
||
|
5. Follow standards in [Getting Started Guide](getting_started.md#documentation)
|