platform/docs/config_gap_analysis.md
2024-11-12 01:00:05 -07:00

8.7 KiB

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

Implementation Gaps

1. Missing Package Structure

// 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

// 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

// 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

// 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

// 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

// 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

// 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

// 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

// 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
  2. Check Laravel Compatibility Roadmap
  3. Follow Testing Guide
  4. Use Foundation Integration Guide
  5. Review Config Package Specification

2. Implementation Process

For each config feature:

  1. Write tests following Testing Guide
  2. Implement following Laravel patterns
  3. Document following Getting Started Guide
  4. Integrate following Foundation Integration Guide

3. Quality Requirements

All implementations must:

  1. Pass all tests (see Testing Guide)
  2. Meet Laravel compatibility requirements
  3. Follow integration patterns (see Foundation Integration Guide)
  4. Match specifications in Config Package Specification

4. Integration Considerations

When implementing config features:

  1. Follow patterns in Foundation Integration Guide
  2. Ensure Laravel compatibility per Laravel Compatibility Roadmap
  3. Use testing approaches from Testing Guide
  4. Follow development setup in Getting Started Guide

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

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

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