Skip to content

Commit 01f8ceb

Browse files
authored
Merge pull request #2 from KaririCode-Framework/develop
Enhance Dotenv Component: Improved Parsing, Type Detection, and Unit Tests
2 parents 308ee97 + 29e15be commit 01f8ceb

39 files changed

+2149
-129
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,4 @@ tests/lista_de_arquivos.php
6363
tests/lista_de_arquivos_test.php
6464
lista_de_arquivos.txt
6565
lista_de_arquivos_tests.txt
66+
add_static_to_providers.php

README.md

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
# KaririCode Framework: Dotenv Component
22

3-
[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md)
4-
[![pt-br](https://img.shields.io/badge/lang-pt--br-green.svg)](README.pt-br.md)
3+
[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md) [![pt-br](https://img.shields.io/badge/lang-pt--br-green.svg)](README.pt-br.md)
54

6-
![PHP](https://img.shields.io/badge/PHP-777BB4?style=for-the-badge&logo=php&logoColor=white)
7-
![Docker](https://img.shields.io/badge/Docker-2496ED?style=for-the-badge&logo=docker&logoColor=white)
8-
![PHPUnit](https://img.shields.io/badge/PHPUnit-3776AB?style=for-the-badge&logo=php&logoColor=white)
5+
![PHP](https://img.shields.io/badge/PHP-777BB4?style=for-the-badge&logo=php&logoColor=white) ![Docker](https://img.shields.io/badge/Docker-2496ED?style=for-the-badge&logo=docker&logoColor=white) ![PHPUnit](https://img.shields.io/badge/PHPUnit-3776AB?style=for-the-badge&logo=php&logoColor=white)
96

107
A robust and flexible environment variable management component for the KaririCode Framework, providing advanced features for handling .env files in PHP applications.
118

README.pt-br.md

Lines changed: 29 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,28 @@
11
# KaririCode Framework: Componente Dotenv
22

3-
[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md)
4-
[![pt-br](https://img.shields.io/badge/lang-pt--br-green.svg)](README.pt-br.md)
3+
[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md) [![pt-br](https://img.shields.io/badge/lang-pt--br-green.svg)](README.pt-br.md)
54

6-
![PHP](https://img.shields.io/badge/PHP-777BB4?style=for-the-badge&logo=php&logoColor=white)
7-
![Docker](https://img.shields.io/badge/Docker-2496ED?style=for-the-badge&logo=docker&logoColor=white)
8-
![PHPUnit](https://img.shields.io/badge/PHPUnit-3776AB?style=for-the-badge&logo=php&logoColor=white)
5+
![PHP](https://img.shields.io/badge/PHP-777BB4?style=for-the-badge&logo=php&logoColor=white) ![Docker](https://img.shields.io/badge/Docker-2496ED?style=for-the-badge&logo=docker&logoColor=white) ![PHPUnit](https://img.shields.io/badge/PHPUnit-3776AB?style=for-the-badge&logo=php&logoColor=white)
96

10-
Um componente robusto e flexível para gerenciamento de variáveis de ambiente do KaririCode Framework, fornecendo recursos avançados para manipulação de arquivos .env em aplicações PHP.
7+
Um componente robusto e flexível para gerenciamento de variáveis de ambiente no KaririCode Framework, fornecendo recursos avançados para lidar com arquivos .env em aplicações PHP.
118

12-
## Características
9+
## Funcionalidades
1310

14-
- Análise e carregamento de variáveis de ambiente a partir de arquivos .env
11+
- Parse e carregamento de variáveis de ambiente a partir de arquivos .env
1512
- Suporte para interpolação de variáveis
1613
- **Detecção e conversão automática de tipos**
1714
- Detecta e converte tipos comuns (string, inteiro, float, booleano, array, JSON)
18-
- Preserva os tipos de dados para uso mais preciso em sua aplicação
15+
- Preserva tipos de dados para uso mais preciso em sua aplicação
1916
- **Sistema de tipos personalizável**
2017
- Extensível com detectores e conversores de tipos personalizados
2118
- Controle refinado sobre como suas variáveis de ambiente são processadas
2219
- Modo estrito para validação de nomes de variáveis
23-
- Fácil acesso às variáveis de ambiente através de uma função auxiliar global
20+
- Acesso fácil às variáveis de ambiente por meio de uma função auxiliar global
2421
- Suporte para estruturas de dados complexas (arrays e JSON) em variáveis de ambiente
2522

2623
## Instalação
2724

28-
Para instalar o componente Dotenv do KaririCode em seu projeto, execute o seguinte comando:
25+
Para instalar o componente Dotenv do KaririCode no seu projeto, execute o seguinte comando:
2926

3027
```bash
3128
composer require kariricode/dotenv
@@ -46,10 +43,10 @@ KARIRI_APP_DEBUG=true
4643
KARIRI_APP_URL=https://kariricode.com
4744
KARIRI_MAIL_FROM_NAME="${KARIRI_APP_NAME}"
4845
KARIRI_JSON_CONFIG={"key": "value", "nested": {"subkey": "subvalue"}}
49-
KARIRI_ARRAY_CONFIG=["item1", "item2", "item com espaços"]
46+
KARIRI_ARRAY_CONFIG=["item1", "item2", "item with spaces"]
5047
```
5148

52-
2. No arquivo de inicialização da sua aplicação:
49+
2. No arquivo de bootstrap da sua aplicação:
5350

5451
```php
5552
<?php
@@ -84,28 +81,28 @@ O componente Dotenv do KaririCode detecta e converte automaticamente os seguinte
8481
Exemplo:
8582

8683
```env
87-
STRING_VAR=Olá Mundo
84+
STRING_VAR=Hello World
8885
INT_VAR=42
8986
FLOAT_VAR=3.14
9087
BOOL_VAR=true
9188
NULL_VAR=null
9289
ARRAY_VAR=["item1", "item2", "item3"]
93-
JSON_VAR={"chave": "valor", "aninhado": {"subchave": "subvalor"}}
90+
JSON_VAR={"key": "value", "nested": {"subkey": "subvalue"}}
9491
```
9592

96-
Quando acessadas usando a função `env()`, estas variáveis serão automaticamente convertidas para seus tipos PHP apropriados:
93+
Quando acessadas usando a função `env()`, essas variáveis serão automaticamente convertidas para seus tipos PHP apropriados:
9794

9895
```php
99-
$stringVar = env('STRING_VAR'); // string: "Olá Mundo"
96+
$stringVar = env('STRING_VAR'); // string: "Hello World"
10097
$intVar = env('INT_VAR'); // inteiro: 42
10198
$floatVar = env('FLOAT_VAR'); // float: 3.14
10299
$boolVar = env('BOOL_VAR'); // booleano: true
103100
$nullVar = env('NULL_VAR'); // null
104101
$arrayVar = env('ARRAY_VAR'); // array: ["item1", "item2", "item3"]
105-
$jsonVar = env('JSON_VAR'); // array: ["chave" => "valor", "aninhado" => ["subchave" => "subvalor"]]
102+
$jsonVar = env('JSON_VAR'); // array: ["key" => "value", "nested" => ["subkey" => "subvalue"]]
106103
```
107104

108-
Esta tipagem automática garante que você esteja trabalhando com os tipos de dados corretos em sua aplicação, reduzindo erros relacionados a tipos e melhorando a confiabilidade geral do código.
105+
Essa tipagem automática garante que você esteja trabalhando com os tipos corretos em sua aplicação, reduzindo erros relacionados a tipos e melhorando a confiabilidade geral do código.
109106

110107
### Uso Avançado
111108

@@ -116,18 +113,18 @@ Crie detectores de tipo personalizados para lidar com formatos específicos:
116113
```php
117114
use KaririCode\Dotenv\Type\Detector\AbstractTypeDetector;
118115

119-
class DetectorPersonalizado extends AbstractTypeDetector
116+
class CustomDetector extends AbstractTypeDetector
120117
{
121118
public const PRIORITY = 100;
122119

123120
public function detect(mixed $value): ?string
124121
{
125122
// Sua lógica de detecção aqui
126-
// Retorne o tipo detectado como uma string, ou null se não for detectado
123+
// Retorne o tipo detectado como uma string, ou null se não detectado
127124
}
128125
}
129126

130-
$dotenv->addTypeDetector(new DetectorPersonalizado());
127+
$dotenv->addTypeDetector(new CustomDetector());
131128
```
132129

133130
#### Conversores de Tipo Personalizados
@@ -137,20 +134,20 @@ Crie conversores de tipo personalizados para lidar com tipos de dados específic
137134
```php
138135
use KaririCode\Dotenv\Contract\TypeCaster;
139136

140-
class ConversorPersonalizado implements TypeCaster
137+
class CustomCaster implements TypeCaster
141138
{
142139
public function cast(mixed $value): mixed
143140
{
144141
// Sua lógica de conversão aqui
145142
}
146143
}
147144

148-
$dotenv->addTypeCaster('tipo_personalizado', new ConversorPersonalizado());
145+
$dotenv->addTypeCaster('custom_type', new CustomCaster());
149146
```
150147

151148
## Desenvolvimento e Testes
152149

153-
Para fins de desenvolvimento e testes, este pacote usa Docker e Docker Compose para garantir consistência em diferentes ambientes. Um Makefile é fornecido para facilitar a execução de comandos.
150+
Para fins de desenvolvimento e teste, este pacote utiliza Docker e Docker Compose para garantir consistência entre diferentes ambientes. Um Makefile é fornecido para conveniência.
154151

155152
### Pré-requisitos
156153

@@ -173,7 +170,7 @@ Para fins de desenvolvimento e testes, este pacote usa Docker e Docker Compose p
173170
make setup-env
174171
```
175172

176-
3. Inicie os contêineres Docker:
173+
3. Inicie os containers Docker:
177174

178175
```bash
179176
make up
@@ -187,23 +184,23 @@ Para fins de desenvolvimento e testes, este pacote usa Docker e Docker Compose p
187184
### Comandos Make Disponíveis
188185

189186
- `make up`: Inicia todos os serviços em segundo plano
190-
- `make down`: Para e remove todos os contêineres
187+
- `make down`: Para e remove todos os containers
191188
- `make build`: Constrói as imagens Docker
192-
- `make shell`: Acessa o shell do contêiner PHP
189+
- `make shell`: Acessa o shell do container PHP
193190
- `make test`: Executa os testes
194191
- `make coverage`: Executa a cobertura de testes com formatação visual
195192
- `make cs-fix`: Executa o PHP CS Fixer para corrigir o estilo do código
196193
- `make quality`: Executa todos os comandos de qualidade (cs-check, test, security-check)
197194

198-
Para uma lista completa dos comandos disponíveis, execute:
195+
Para uma lista completa de comandos disponíveis, execute:
199196

200197
```bash
201198
make help
202199
```
203200

204201
## Licença
205202

206-
Este projeto está licenciado sob a Licença MIT - veja o arquivo [LICENSE](LICENSE) para detalhes.
203+
Este projeto está licenciado sob a Licença MIT - veja o arquivo [LICENSE](LICENSE) para mais detalhes.
207204

208205
## Suporte e Comunidade
209206

@@ -214,15 +211,8 @@ Este projeto está licenciado sob a Licença MIT - veja o arquivo [LICENSE](LICE
214211
## Agradecimentos
215212

216213
- A equipe do KaririCode Framework e contribuidores.
217-
- Inspirado por outras bibliotecas PHP Dotenv populares.
214+
- Inspirado por outras bibliotecas populares de Dotenv para PHP.
218215

219216
---
220217

221-
## Agradecimentos
222-
223-
- A equipe do KaririCode Framework e contribuidores.
224-
- Inspirado por outras bibliotecas PHP Dotenv populares.
225-
226-
---
227-
228-
Construído com ❤️ pela equipe KaririCode. Capacitando desenvolvedores para construir aplicações PHP mais robustas e flexíveis.
218+
Construído com ❤️ pela equipe KaririCode. Capacitando desenvolvedores a criar aplicações PHP mais robustas e flexíveis.

create_structure.php

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?php
2+
3+
$structure = [
4+
'tests/Unit/Contract' => ['DotenvTest.php'],
5+
'tests/Unit/Loader' => ['ArrayLoaderTest.php', 'FileLoaderTest.php'],
6+
'tests/Unit/Parser' => ['DefaultParserTest.php', 'StrictParserTest.php'],
7+
'tests/Unit/Type/Caster' => [
8+
'ArrayCasterTest.php',
9+
'BooleanCasterTest.php',
10+
'FloatCasterTest.php',
11+
'IntegerCasterTest.php',
12+
'JsonCasterTest.php',
13+
'NullCasterTest.php',
14+
'StringCasterTest.php',
15+
'TypeCasterRegistryTest.php'
16+
],
17+
'tests/Unit/Type/Detector' => [
18+
'ArrayDetectorTest.php',
19+
'BooleanDetectorTest.php',
20+
'JsonDetectorTest.php',
21+
'NullDetectorTest.php',
22+
'NumericDetectorTest.php',
23+
'StringDetectorTest.php',
24+
'TypeDetectorRegistryTest.php'
25+
],
26+
'tests/Unit' => ['DotenvTest.php', 'DotenvFactoryTest.php'],
27+
'tests/Integration' => ['DotenvIntegrationTest.php', 'TypeSystemIntegrationTest.php'],
28+
'tests/Functional' => ['DotenvFunctionalTest.php']
29+
];
30+
31+
foreach ($structure as $dir => $files) {
32+
// Cria o diretório, caso não exista
33+
if (!is_dir($dir)) {
34+
mkdir($dir, 0777, true);
35+
echo "Diretório criado: $dir\n";
36+
}
37+
38+
// Cria os arquivos dentro do diretório
39+
foreach ($files as $file) {
40+
$filePath = $dir . '/' . $file;
41+
file_put_contents($filePath, "<?php\n\n// Test case for $file\n");
42+
echo "Arquivo criado: $filePath\n";
43+
}
44+
}
45+
46+
echo "Estrutura de diretórios e arquivos criada com sucesso!\n";

docker-compose.yml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
version: "3.8"
2-
31
services:
42
php:
53
container_name: kariricode-dotenv

phpunit.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
colors="true">
1313
<php>
1414
<ini name="error_reporting" value="-1" />
15-
<ini name="display_errors" value="1" />
15+
<ini name="display_errors" value="On" />
16+
<ini name="display_startup_errors" value="On" />
1617
<env name="KERNEL_CLASS" value="HeliusTelemetry\Tests\TestKernel"/>
1718
<env name="SYMFONY_DEPRECATIONS_HELPER" value="disabled"/>
1819
<server name="APP_ENV" value="test" force="true" />

src/Dotenv.php

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,17 @@ public function load(): void
2525
$content = $this->loader->load();
2626
$parsed = $this->parser->parse($content);
2727

28-
foreach ($parsed as $key => $value) {
29-
$processedValue = $this->typeSystem->processValue($value);
30-
$this->setEnvironmentVariable($key, $processedValue);
28+
if (!empty($parsed)) {
29+
foreach ($parsed as $key => $value) {
30+
$processedValue = $this->typeSystem->processValue($value);
31+
$this->setEnvironmentVariable($key, $processedValue);
32+
}
3133
}
3234
}
3335

34-
public function addTypeDetector(TypeDetector $caster): self
36+
public function addTypeDetector(TypeDetector $detector): self
3537
{
36-
$this->typeSystem->registerDetector($caster);
38+
$this->typeSystem->registerDetector($detector);
3739

3840
return $this;
3941
}

src/DotenvFactory.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@
66

77
use KaririCode\Dotenv\Loader\FileLoader;
88
use KaririCode\Dotenv\Parser\DefaultParser;
9+
use KaririCode\Dotenv\Parser\StrictParser;
910

1011
class DotenvFactory
1112
{
1213
public static function create(string $path, bool $strict = false): Dotenv
1314
{
14-
$parser = new DefaultParser($strict);
15+
$parser = $strict ? new StrictParser() : new DefaultParser();
1516
$loader = new FileLoader($path);
1617

1718
return new Dotenv($parser, $loader);

src/Loader/FileLoader.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ public function __construct(string $filePath)
1818

1919
public function load(): string
2020
{
21-
if (!$this->isFileReadable($this->filePath)) {
22-
throw new InvalidFileException(sprintf('Unable to read the environment file at %s.', $this->filePath));
21+
if (!file_exists($this->filePath)) {
22+
throw new InvalidFileException(sprintf('The environment file %s does not exist.', $this->filePath));
2323
}
2424

25-
$contents = file_get_contents($this->filePath);
25+
$contents = $this->getFileContents($this->filePath);
2626

2727
if (false === $contents) {
2828
throw new InvalidFileException(sprintf('Unable to read the environment file at %s.', $this->filePath));
@@ -31,8 +31,8 @@ public function load(): string
3131
return $contents;
3232
}
3333

34-
private function isFileReadable(string $filePath): bool
34+
protected function getFileContents(string $filePath): string|false
3535
{
36-
return is_readable($filePath) && is_file($filePath);
36+
return file_get_contents($filePath);
3737
}
3838
}

0 commit comments

Comments
 (0)