CoreLibs composer v8.0.5 update test
This commit is contained in:
Vendored
+78
@@ -0,0 +1,78 @@
|
||||
# dotenv: readEnvFile()
|
||||
|
||||
A simple implementation of <https://github.com/vlucas/phpdotenv>
|
||||
|
||||
This is not a functional replacement, but a very simple implementation of the basic functions.
|
||||
|
||||
It is recommended to create a `.env.example` example file that is checked into the
|
||||
repository. The `.env` should *NEVER* be checked into anything
|
||||
|
||||
## How to install
|
||||
|
||||
`composer require gullevek/dotEnv`
|
||||
|
||||
## Run it
|
||||
|
||||
Create a `.env` file in the current folder.
|
||||
Create a file like below
|
||||
|
||||
```php
|
||||
require '../vendor/autoload.php';
|
||||
gullevek\dotEnv\DotEnv::readEnvFile(__DIR__);
|
||||
```
|
||||
|
||||
All data will be in the `$_ENV` array
|
||||
|
||||
## How it works
|
||||
|
||||
Put the function where it is needed or put it in a file and load it.
|
||||
|
||||
if not parameter is given it will use `__DIR__` as base path.
|
||||
Second parameter is file name override. Default is `.env`
|
||||
|
||||
Data is loaded into _ENV only.
|
||||
|
||||
If there is already an entry in _ENV then it will not be overwritten.
|
||||
|
||||
## .env file example
|
||||
|
||||
A valid entry has to start with an alphanumeric string, underscores are allowed and
|
||||
then have an equal sign (=). After the equal sign the data block starts. Data can be
|
||||
quoted with double quotes (") and if this is done can stretch over multiple lines.
|
||||
The openeing double quote must be on the same lign as the requal sign (=). If double
|
||||
quoted (") charcters are used it will read each line until another double quote (")
|
||||
character is found. Everything after that is ignored.
|
||||
|
||||
Any spaces before the variable or before and after the equal sign (=) are ignored.
|
||||
|
||||
Line is read until `PHP_EOL`. So any trailing spaces are read too.
|
||||
|
||||
Any line that is not valid is ignored.
|
||||
|
||||
```ini
|
||||
# this line is ignored
|
||||
SOMETHING=A
|
||||
OTHER="A B C"
|
||||
MULTI_LINE="1 2 3
|
||||
4 5 6
|
||||
7 8 9" ; and this is ignored
|
||||
ESCAPE="String \" inside \" other "
|
||||
DOUBLE="I will be used"
|
||||
DOUBLE="This will be ignored"
|
||||
```
|
||||
|
||||
## Development
|
||||
|
||||
### Phan
|
||||
|
||||
`vendor/bin/phan --analyze-twice`
|
||||
|
||||
### PHPstan
|
||||
|
||||
`vendor/bin/phpstan`
|
||||
|
||||
### PHPUnit
|
||||
|
||||
Unit tests have to be run from base folder with
|
||||
|
||||
`vendor/bin/phpunit test/phpUnitTests/`
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"name": "gullevek/dotenv",
|
||||
"description": "Simple .env file processing and storing in _ENV array",
|
||||
"keywords": [".env", "dotenv", "_ENV", "environment variables"],
|
||||
"type": "library",
|
||||
"license": "MIT",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"gullevek\\dotEnv\\": "src/",
|
||||
"gullevek\\dotenv\\": "src/"
|
||||
}
|
||||
},
|
||||
"authors": [
|
||||
{
|
||||
"name": "Clemens Schwaighofer",
|
||||
"email": "gullevek@gullevek.org",
|
||||
"homepage": "http://gullevek.org"
|
||||
}
|
||||
],
|
||||
"homepage": "https://github.com/gullevek/dotEnv",
|
||||
"minimum-stability": "dev",
|
||||
"require": {
|
||||
"php": ">=7.4.0"
|
||||
},
|
||||
"archive": {
|
||||
"exclude": ["/test/", "/test/*", "/phpstan.neon", "/psalm.xml", "/.phan/", "/.vscode/", "/phpunit.xml"]
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^9",
|
||||
"phpstan/phpstan": "^1.10",
|
||||
"phan/phan": "^5.4"
|
||||
}
|
||||
}
|
||||
+110
@@ -0,0 +1,110 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace gullevek\dotEnv;
|
||||
|
||||
class DotEnv
|
||||
{
|
||||
/** @var string constant comment char, set to # */
|
||||
private const COMMENT_CHAR = '#';
|
||||
|
||||
/**
|
||||
* parses .env file
|
||||
*
|
||||
* Rules for .env file
|
||||
* variable is any alphanumeric string followed by = on the same line
|
||||
* content starts with the first non space part
|
||||
* strings can be contained in "
|
||||
* strings MUST be contained in " if they are multiline
|
||||
* if string starts with " it will match until another " is found
|
||||
* anything AFTER " is ignored
|
||||
* if there are two variables with the same name only the first is used
|
||||
* variables are case sensitive
|
||||
*
|
||||
* @param string $path Folder to file, default is __DIR__
|
||||
* @param string $env_file What file to load, default is .env
|
||||
* @return int -1 other error
|
||||
* 0 for success full load
|
||||
* 1 for file loadable, no data or data already loaded
|
||||
* 2 for file not readable or open failed
|
||||
* 3 for file not found
|
||||
*/
|
||||
public static function readEnvFile(
|
||||
string $path = __DIR__,
|
||||
string $env_file = '.env'
|
||||
): int {
|
||||
// default -1;
|
||||
$status = -1;
|
||||
$env_file_target = $path . DIRECTORY_SEPARATOR . $env_file;
|
||||
// this is not a file -> abort
|
||||
if (!is_file($env_file_target)) {
|
||||
$status = 3;
|
||||
return $status;
|
||||
}
|
||||
// cannot open file -> abort
|
||||
if (!is_readable($env_file_target)) {
|
||||
$status = 2;
|
||||
return $status;
|
||||
}
|
||||
// open file
|
||||
if (($fp = fopen($env_file_target, 'r')) === false) {
|
||||
$status = 2;
|
||||
return $status;
|
||||
}
|
||||
// set to readable but not yet any data loaded
|
||||
$status = 1;
|
||||
$block = false;
|
||||
$var = '';
|
||||
while ($line = fgets($fp)) {
|
||||
// main match for variable = value part
|
||||
if (preg_match("/^\s*([\w_.]+)\s*=\s*((\"?).*)/", $line, $matches)) {
|
||||
$var = $matches[1];
|
||||
$value = $matches[2];
|
||||
$quotes = $matches[3];
|
||||
// write only if env is not set yet, and write only the first time
|
||||
if (empty($_ENV[$var])) {
|
||||
if (!empty($quotes)) {
|
||||
// match greedy for first to last so we move any " if there are
|
||||
if (preg_match('/^"(.*[^\\\])"/U', $value, $matches)) {
|
||||
$value = $matches[1];
|
||||
} else {
|
||||
// this is a multi line
|
||||
$block = true;
|
||||
// first " in string remove
|
||||
// add removed new line back because this is a multi line
|
||||
$value = ltrim($value, '"') . PHP_EOL;
|
||||
}
|
||||
} else {
|
||||
// strip any quotes at end for unquoted single line
|
||||
// an right hand spaces are removed too
|
||||
$value = false !== ($pos = strpos($value, self::COMMENT_CHAR)) ?
|
||||
rtrim(substr($value, 0, $pos)) : $value;
|
||||
}
|
||||
// if block is set, we strip line of slashes
|
||||
$_ENV[$var] = $block === true ? stripslashes($value) : $value;
|
||||
// set successful load
|
||||
$status = 0;
|
||||
}
|
||||
} elseif ($block === true) {
|
||||
// read line until there is a unescaped "
|
||||
// this also strips everything after the last "
|
||||
if (preg_match("/(.*[^\\\])\"/", $line, $matches)) {
|
||||
$block = false;
|
||||
// strip ending " and EVERYTHING that follows after that
|
||||
$line = $matches[1];
|
||||
}
|
||||
// just be sure it is init before we fill
|
||||
if (!isset($_ENV[$var])) {
|
||||
$_ENV[$var] = '';
|
||||
}
|
||||
// strip line of slashes
|
||||
$_ENV[$var] .= stripslashes($line);
|
||||
}
|
||||
}
|
||||
fclose($fp);
|
||||
return $status;
|
||||
}
|
||||
}
|
||||
|
||||
// __END__
|
||||
Reference in New Issue
Block a user