minor fixes

This commit is contained in:
arabcoders
2025-04-05 20:17:21 +03:00
parent 23f965754e
commit eece04ce22
3 changed files with 25 additions and 10 deletions

View File

@@ -323,7 +323,7 @@ class CreateUsersCommand extends Command
]);
$perUser = ConfigFile::open(
file: $dryRun ? fopen("php://memory", 'a') : $config_file,
file: $dryRun ? "php://memory" : $config_file,
type: 'yaml',
autoSave: !$dryRun,
autoCreate: !$dryRun,

View File

@@ -27,7 +27,7 @@ final class ConfigFile implements ArrayAccess, LoggerAwareInterface
/**
* ConfigFile constructor.
*
* @param string|resource $file The config file.
* @param string $file The config file.
* @param string $type The content type. Default to 'yaml'.
* @param bool $autoSave Auto save changes. Default to 'true'.
* @param bool $autoCreate Auto create the file if it does not exist. Default is 'false'.
@@ -37,7 +37,7 @@ final class ConfigFile implements ArrayAccess, LoggerAwareInterface
* @throws InvalidArgumentException If the content type is invalid.
*/
public function __construct(
private readonly mixed $file,
private readonly string $file,
private readonly string $type = 'yaml',
private readonly bool $autoSave = true,
private readonly bool $autoCreate = false,
@@ -51,7 +51,7 @@ final class ConfigFile implements ArrayAccess, LoggerAwareInterface
]));
}
if (false === is_resource($file) && false === file_exists($this->file)) {
if (false === file_exists($this->file) && false === str_starts_with($this->file, 'php://')) {
if (false === $this->autoCreate) {
throw new InvalidArgumentException(r("File '{file}' does not exist.", ['file' => $file]));
}
@@ -174,6 +174,7 @@ final class ConfigFile implements ArrayAccess, LoggerAwareInterface
if (false === $override) {
clearstatcache(true, $this->file);
$newHash = $this->getFileHash();
if (false === hash_equals($this->file_hash, $newHash)) {
$this->logger?->warning(
"File '{file}' has been modified since last load. re-applying changes on top of the new data.",
@@ -194,7 +195,7 @@ final class ConfigFile implements ArrayAccess, LoggerAwareInterface
$json_encode = $this->opts['json_encode'];
}
if (true === $this->autoBackup && false === is_resource($this->file)) {
if (true === $this->autoBackup) {
try {
copy($this->file, $this->file . '.bak');
} catch (\Exception) {
@@ -202,7 +203,7 @@ final class ConfigFile implements ArrayAccess, LoggerAwareInterface
}
}
$stream = new Stream($this->file, 'w');
$stream = Stream::make($this->file, 'w');
$stream->write(
match ($this->type) {
'yaml' => Yaml::dump($this->data, inline: 8, indent: 2),
@@ -212,6 +213,7 @@ final class ConfigFile implements ArrayAccess, LoggerAwareInterface
])),
}
);
$stream->close();
$this->operations = [];
@@ -364,10 +366,6 @@ final class ConfigFile implements ArrayAccess, LoggerAwareInterface
private function getFileHash(): string
{
if (is_resource($this->file)) {
return hash('sha256', (string)Stream::make($this->file, 'r'));
}
return hash_file('sha256', $this->file);
}
}

View File

@@ -228,6 +228,23 @@ class ConfigFileTest extends TestCase
}
}
public function test_configFile_set_php_stream_wrapper()
{
file_put_contents('php://temp', file_get_contents(__DIR__ . '/../Fixtures/test_servers.yaml'));
$params['file'] = 'php://temp';
try {
$class = new ConfigFile(...$params);
$this->assertInstanceOf(ConfigFile::class, $class);
} catch (Throwable $e) {
$this->fail("it shouldn't throw exception for php:// streams. {$e->getMessage()}");
}
$class = ConfigFile::open(...$params);
$this->assertInstanceOf(ConfigFile::class, $class);
$this->assertEmpty($class->getAll(), 'php:// streams should be empty, when re-opened.');
}
public function test_configFile_set()
{
$params['file'] = tempnam(sys_get_temp_dir(), 'test');