Compare commits

..

No commits in common. "master" and "1.0.4" have entirely different histories.

20 changed files with 218 additions and 1195 deletions

View file

@ -1,552 +0,0 @@
name: CI
on:
push:
branches:
- '**'
release:
types: [created]
workflow_dispatch:
jobs:
release:
runs-on: ubuntu-latest
container:
image: php:8.3
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install dependencies
run: |
apt update -yqq
apt install git libpq-dev libzip-dev zip make wget gnupg -yqq
- name: Install phive
run: |
wget -O phive.phar https://phar.io/releases/phive.phar
wget -O phive.phar.asc https://phar.io/releases/phive.phar.asc
gpg --keyserver hkps://keys.openpgp.org --recv-keys 0x9D8A98B29B2D5D79
gpg --verify phive.phar.asc phive.phar
chmod +x phive.phar
mv phive.phar /usr/local/bin/phive
- name: Install phab
run: |
phive install phpab --global --trust-gpg-keys 0x2A8299CE842DD38C
- name: Install latest version of NCC
run: |
git clone https://git.n64.cc/nosial/ncc.git
cd ncc
make redist
NCC_DIR=$(find build/ -type d -name "ncc_*" | head -n 1)
if [ -z "$NCC_DIR" ]; then
echo "NCC build directory not found"
exit 1
fi
php "$NCC_DIR/INSTALL" --auto
cd .. && rm -rf ncc
- name: Build project
run: |
ncc build --config release --build-source --log-level debug
- name: Upload build artifact
uses: actions/upload-artifact@v4
with:
name: release
path: build/release/net.nosial.configlib.ncc
debug:
runs-on: ubuntu-latest
container:
image: php:8.3
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install dependencies
run: |
apt update -yqq
apt install git libpq-dev libzip-dev zip make wget gnupg -yqq
- name: Install phive
run: |
wget -O phive.phar https://phar.io/releases/phive.phar
wget -O phive.phar.asc https://phar.io/releases/phive.phar.asc
gpg --keyserver hkps://keys.openpgp.org --recv-keys 0x9D8A98B29B2D5D79
gpg --verify phive.phar.asc phive.phar
chmod +x phive.phar
mv phive.phar /usr/local/bin/phive
- name: Install phab
run: |
phive install phpab --global --trust-gpg-keys 0x2A8299CE842DD38C
- name: Install latest version of NCC
run: |
git clone https://git.n64.cc/nosial/ncc.git
cd ncc
make redist
NCC_DIR=$(find build/ -type d -name "ncc_*" | head -n 1)
if [ -z "$NCC_DIR" ]; then
echo "NCC build directory not found"
exit 1
fi
php "$NCC_DIR/INSTALL" --auto
cd .. && rm -rf ncc
- name: Build project
run: |
ncc build --config debug --build-source --log-level debug
- name: Upload build artifact
uses: actions/upload-artifact@v4
with:
name: debug
path: build/debug/net.nosial.configlib.ncc
release-executable:
runs-on: ubuntu-latest
container:
image: php:8.3
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install dependencies
run: |
apt update -yqq
apt install git libpq-dev libzip-dev zip make wget gnupg -yqq
- name: Install phive
run: |
wget -O phive.phar https://phar.io/releases/phive.phar
wget -O phive.phar.asc https://phar.io/releases/phive.phar.asc
gpg --keyserver hkps://keys.openpgp.org --recv-keys 0x9D8A98B29B2D5D79
gpg --verify phive.phar.asc phive.phar
chmod +x phive.phar
mv phive.phar /usr/local/bin/phive
- name: Install phab
run: |
phive install phpab --global --trust-gpg-keys 0x2A8299CE842DD38C
- name: Install latest version of NCC
run: |
git clone https://git.n64.cc/nosial/ncc.git
cd ncc
make redist
NCC_DIR=$(find build/ -type d -name "ncc_*" | head -n 1)
if [ -z "$NCC_DIR" ]; then
echo "NCC build directory not found"
exit 1
fi
php "$NCC_DIR/INSTALL" --auto
cd .. && rm -rf ncc
- name: Build project
run: |
ncc build --config release-executable --build-source --log-level debug
- name: Upload build artifact
uses: actions/upload-artifact@v4
with:
name: release-executable
path: build/release/release_executable_gz
debug-executable:
runs-on: ubuntu-latest
container:
image: php:8.3
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install dependencies
run: |
apt update -yqq
apt install git libpq-dev libzip-dev zip make wget gnupg -yqq
- name: Install phive
run: |
wget -O phive.phar https://phar.io/releases/phive.phar
wget -O phive.phar.asc https://phar.io/releases/phive.phar.asc
gpg --keyserver hkps://keys.openpgp.org --recv-keys 0x9D8A98B29B2D5D79
gpg --verify phive.phar.asc phive.phar
chmod +x phive.phar
mv phive.phar /usr/local/bin/phive
- name: Install phab
run: |
phive install phpab --global --trust-gpg-keys 0x2A8299CE842DD38C
- name: Install latest version of NCC
run: |
git clone https://git.n64.cc/nosial/ncc.git
cd ncc
make redist
NCC_DIR=$(find build/ -type d -name "ncc_*" | head -n 1)
if [ -z "$NCC_DIR" ]; then
echo "NCC build directory not found"
exit 1
fi
php "$NCC_DIR/INSTALL" --auto
cd .. && rm -rf ncc
- name: Build project
run: |
ncc build --config debug-executable --build-source --log-level debug
- name: Upload build artifact
uses: actions/upload-artifact@v4
with:
name: debug-executable
path: build/debug/debug_executable_gz
release_executable:
runs-on: ubuntu-latest
container:
image: php:8.3
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install dependencies
run: |
apt update -yqq
apt install git libpq-dev libzip-dev zip make wget gnupg -yqq
- name: Install phive
run: |
wget -O phive.phar https://phar.io/releases/phive.phar
wget -O phive.phar.asc https://phar.io/releases/phive.phar.asc
gpg --keyserver hkps://keys.openpgp.org --recv-keys 0x9D8A98B29B2D5D79
gpg --verify phive.phar.asc phive.phar
chmod +x phive.phar
mv phive.phar /usr/local/bin/phive
- name: Install phab
run: |
phive install phpab --global --trust-gpg-keys 0x2A8299CE842DD38C
- name: Install latest version of NCC
run: |
git clone https://git.n64.cc/nosial/ncc.git
cd ncc
make redist
NCC_DIR=$(find build/ -type d -name "ncc_*" | head -n 1)
if [ -z "$NCC_DIR" ]; then
echo "NCC build directory not found"
exit 1
fi
php "$NCC_DIR/INSTALL" --auto
cd .. && rm -rf ncc
- name: Build project
run: |
ncc build --config release_executable --build-source --log-level debug
- name: Upload build artifact
uses: actions/upload-artifact@v4
with:
name: release_executable
path: build/release/ConfigLib
debug_executable:
runs-on: ubuntu-latest
container:
image: php:8.3
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install dependencies
run: |
apt update -yqq
apt install git libpq-dev libzip-dev zip make wget gnupg -yqq
- name: Install phive
run: |
wget -O phive.phar https://phar.io/releases/phive.phar
wget -O phive.phar.asc https://phar.io/releases/phive.phar.asc
gpg --keyserver hkps://keys.openpgp.org --recv-keys 0x9D8A98B29B2D5D79
gpg --verify phive.phar.asc phive.phar
chmod +x phive.phar
mv phive.phar /usr/local/bin/phive
- name: Install phab
run: |
phive install phpab --global --trust-gpg-keys 0x2A8299CE842DD38C
- name: Install latest version of NCC
run: |
git clone https://git.n64.cc/nosial/ncc.git
cd ncc
make redist
NCC_DIR=$(find build/ -type d -name "ncc_*" | head -n 1)
if [ -z "$NCC_DIR" ]; then
echo "NCC build directory not found"
exit 1
fi
php "$NCC_DIR/INSTALL" --auto
cd .. && rm -rf ncc
- name: Build project
run: |
ncc build --config debug_executable --build-source --log-level debug
- name: Upload build artifact
uses: actions/upload-artifact@v4
with:
name: debug_executable
path: build/debug/ConfigLib
# Checking for phpunit.xml
check-phpunit:
runs-on: ubuntu-latest
outputs:
phpunit-exists: ${{ steps.check.outputs.phpunit-exists }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Check for phpunit.xml
id: check
run: |
if [ -f phpunit.xml ]; then
echo "phpunit-exists=true" >> $GITHUB_OUTPUT
else
echo "phpunit-exists=false" >> $GITHUB_OUTPUT
fi
# Checking for phpdoc.dist.xml
check-phpdoc:
runs-on: ubuntu-latest
outputs:
phpdoc-exists: ${{ steps.check.outputs.phpdoc-exists }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Check for phpdoc.dist.xml
id: check
run: |
if [ -f phpdoc.dist.xml ]; then
echo "phpdoc-exists=true" >> $GITHUB_OUTPUT
else
echo "phpdoc-exists=false" >> $GITHUB_OUTPUT
fi
generate-phpdoc:
needs: [release, check-phpdoc]
runs-on: ubuntu-latest
container:
image: php:8.3
if: needs.check-phpdoc.outputs.phpdoc-exists == 'true'
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install dependencies
run: |
apt update -yqq
apt install git libpq-dev libzip-dev zip make wget gnupg -yqq
- name: Download PHPDocumentor
run: |
wget https://phpdoc.org/phpDocumentor.phar
chmod +x phpDocumentor.phar
- name: Generate PHPDoc
run: |
php phpDocumentor.phar -d src -t docs
- name: Archive PHPDoc
run: |
zip -r docs.zip docs
- name: Upload PHPDoc
uses: actions/upload-artifact@v4
with:
name: documentation
path: docs.zip
test:
needs: [release, debug, release-executable, debug-executable, release_executable, debug_executable, check-phpunit]
runs-on: ubuntu-latest
container:
image: php:8.3
if: needs.check-phpunit.outputs.phpunit-exists == 'true'
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Download build artifacts
uses: actions/download-artifact@v4
with:
name: release
path: release
- name: Install dependencies
run: |
apt update -yqq
apt install git libpq-dev libzip-dev zip make wget gnupg -yqq
curl -sSLf -o /usr/local/bin/install-php-extensions https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions
chmod +x /usr/local/bin/install-php-extensions
install-php-extensions zip
- name: Install phive
run: |
wget -O phive.phar https://phar.io/releases/phive.phar
wget -O phive.phar.asc https://phar.io/releases/phive.phar.asc
gpg --keyserver hkps://keys.openpgp.org --recv-keys 0x9D8A98B29B2D5D79
gpg --verify phive.phar.asc phive.phar
chmod +x phive.phar
mv phive.phar /usr/local/bin/phive
- name: Install phab
run: |
phive install phpab --global --trust-gpg-keys 0x2A8299CE842DD38C
- name: Install latest version of NCC
run: |
git clone https://git.n64.cc/nosial/ncc.git
cd ncc
make redist
NCC_DIR=$(find build/ -type d -name "ncc_*" | head -n 1)
if [ -z "$NCC_DIR" ]; then
echo "NCC build directory not found"
exit 1
fi
php "$NCC_DIR/INSTALL" --auto
cd .. && rm -rf ncc
- name: Install NCC packages
run: |
ncc package install --package="release/net.nosial.configlib.ncc" --build-source --reinstall -y --log-level debug
- name: Run PHPUnit tests
run: |
wget https://phar.phpunit.de/phpunit-11.3.phar
php phpunit-11.3.phar --configuration phpunit.xml --log-junit reports/junit.xml --log-teamcity reports/teamcity --testdox-html reports/testdox.html --testdox-text reports/testdox.txt
- name: Upload test reports
uses: actions/upload-artifact@v4
with:
name: reports
path: reports
release-documentation:
needs: generate-phpdoc
permissions: write-all
runs-on: ubuntu-latest
container:
image: php:8.3
if: github.event_name == 'release'
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Download documentation artifact
uses: actions/download-artifact@v4
with:
name: documentation
path: documentation
- name: Upload documentation artifact
uses: softprops/action-gh-release@v1
with:
files: |
documentation/*
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
release-artifacts:
needs: [release, debug, release-executable, debug-executable, release_executable, debug_executable]
permissions: write-all
runs-on: ubuntu-latest
container:
image: php:8.3
if: github.event_name == 'release'
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Download release artifact
uses: actions/download-artifact@v4
with:
name: release
path: release
- name: Upload release artifact to release
uses: softprops/action-gh-release@v1
with:
files: |
release/*
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Download debug artifact
uses: actions/download-artifact@v4
with:
name: debug
path: debug
- name: Upload debug artifact to release
uses: softprops/action-gh-release@v1
with:
files: |
debug/*
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Download release-executable artifact
uses: actions/download-artifact@v4
with:
name: release-executable
path: release-executable
- name: Upload release-executable artifact to release
uses: softprops/action-gh-release@v1
with:
files: |
release-executable/*
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Download debug-executable artifact
uses: actions/download-artifact@v4
with:
name: debug-executable
path: debug-executable
- name: Upload debug-executable artifact to release
uses: softprops/action-gh-release@v1
with:
files: |
debug-executable/*
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Download release_executable artifact
uses: actions/download-artifact@v4
with:
name: release_executable
path: release_executable
- name: Upload release_executable artifact to release
uses: softprops/action-gh-release@v1
with:
files: |
release_executable/*
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Download debug_executable artifact
uses: actions/download-artifact@v4
with:
name: debug_executable
path: debug_executable
- name: Upload debug_executable artifact to release
uses: softprops/action-gh-release@v1
with:
files: |
debug_executable/*
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

4
.gitignore vendored
View file

@ -1,5 +1 @@
build/ build/
/.idea/php-test-framework.xml
/.idea/gbrowser_project.xml
/.phpunit.result.cache
/reports

View file

@ -1,12 +1,9 @@
image: php:8.3 image: php:8.1
before_script: before_script:
# Install some stuff that the image doesn't come with # Install some stuff that the image doesn't come with
- apt update -yqq - apt update -yqq
- apt install git libpq-dev libzip-dev zip make wget gnupg -yqq - apt install git libpq-dev libzip-dev zip make wget gnupg -yqq
- curl -sSLf -o /usr/local/bin/install-php-extensions https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions
- chmod +x /usr/local/bin/install-php-extensions
- install-php-extensions zip
# Install phive # Install phive
- wget -O phive.phar https://phar.io/releases/phive.phar - wget -O phive.phar https://phar.io/releases/phive.phar
@ -23,17 +20,10 @@ before_script:
- git clone https://git.n64.cc/nosial/ncc.git - git clone https://git.n64.cc/nosial/ncc.git
- cd ncc - cd ncc
- make redist - make redist
- NCC_DIR=$(find build/ -type d -name "ncc_*" | head -n 1) - php build/src/INSTALL --auto --install-composer
- |
if [ -z "$NCC_DIR" ]; then
echo "NCC build directory not found"
exit 1
fi
- php "$NCC_DIR/INSTALL" --auto --install-composer
- cd .. && rm -rf ncc - cd .. && rm -rf ncc
build: build:
stage: build
script: script:
- ncc build --config release --log-level debug - ncc build --config release --log-level debug
artifacts: artifacts:
@ -41,15 +31,6 @@ build:
- build/ - build/
rules: rules:
- if: $CI_COMMIT_BRANCH - if: $CI_COMMIT_BRANCH
test:
stage: test
script:
- ncc package install --package="build/release/net.nosial.configlib.ncc" --reinstall -y --log-level debug
- wget https://phar.phpunit.de/phpunit-11.3.phar
- php phpunit-11.3.phar --configuration phpunit.xml
rules:
- if: $CI_COMMIT_BRANCH
release: release:
stage: deploy stage: deploy

1
.idea/ConfigLib.iml generated
View file

@ -5,7 +5,6 @@
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" /> <sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/build" /> <excludeFolder url="file://$MODULE_DIR$/build" />
<excludeFolder url="file://$MODULE_DIR$/reports" />
</content> </content>
<orderEntry type="inheritedJdk" /> <orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />

20
.idea/php.xml generated
View file

@ -11,25 +11,19 @@
</component> </component>
<component name="PhpIncludePathManager"> <component name="PhpIncludePathManager">
<include_path> <include_path>
<path value="/var/ncc/packages/net.nosial.optslib=1.1.2" />
<path value="/var/ncc/packages/net.nosial.loglib2=1.0.2" />
<path value="/var/ncc/packages/com.symfony.yaml=v7.1.5" />
<path value="/var/ncc/packages/net.nosial.loglib=2.0.4" />
<path value="/var/ncc/packages/com.symfony.polyfill_mbstring=v1.31.0" />
<path value="/var/ncc/packages/com.symfony.polyfill_ctype=v1.31.0" />
<path value="/usr/share/ncc" />
<path value="/usr/share/php" /> <path value="/usr/share/php" />
<path value="/etc/ncc" />
<path value="/var/ncc/packages/net.nosial.optslib=1.0.0" />
<path value="/var/ncc/packages/net.nosial.loglib=1.0.1" />
<path value="/var/ncc/packages/com.symfony.yaml=6.2.10" />
<path value="/var/ncc/packages/com.symfony.filesystem=6.2.10" />
<path value="/var/ncc/packages/com.symfony.process=6.2.10" />
</include_path> </include_path>
</component> </component>
<component name="PhpProjectSharedConfiguration" php_language_level="8.3" /> <component name="PhpProjectSharedConfiguration" php_language_level="8.2" />
<component name="PhpStanOptionsConfiguration"> <component name="PhpStanOptionsConfiguration">
<option name="transferred" value="true" /> <option name="transferred" value="true" />
</component> </component>
<component name="PhpUnit">
<phpunit_settings>
<PhpUnitSettings load_method="PHPUNIT_PHAR" custom_loader_path="$PROJECT_DIR$/../phpunit.phar" phpunit_phar_path="$PROJECT_DIR$/../phpunit.phar" />
</phpunit_settings>
</component>
<component name="PsalmOptionsConfiguration"> <component name="PsalmOptionsConfiguration">
<option name="transferred" value="true" /> <option name="transferred" value="true" />
</component> </component>

View file

@ -5,89 +5,6 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [1.1.7] - 2025-03-14
This update introduces minor changes
### Changed
- Updated remote references for dependencies
- Updated Library to use net.nosial.loglib2 instead of the now deprecated net.nosial.loglib
## [1.1.6] - 2025-01-07
This update introduces minor improvements
### Changed
- Changed properties to become typed properties
### Added
- Added a new constructor parameter called `path` which is an optional parameter that allows you to specify the path to
the configuration files directory. If not specified the library will proceed with resolving
the path to the configuration files directory using the default method. This will override
the `CONFIGLIB_PATH` environment variable if it is set.
## [1.1.5] - 2024-12-27
This update introduces minor improvements
### Added
- Add support for CONFIGLIB_PATH environment variable to specify the path to the configuration files directory
## [1.1.4] - 2024-10-29
This update introduces a minor bug fix
### Fixed
- Fixed regex pattern for configuration properties being considered invalid when they contain an underscore.
## [1.1.3] - 2024-10-13
This update introduces a new build system
## [1.1.2] - 2024-09-27
> This change has been reverted
This update fixes a critical bug where configuration files may not be found when using different user accounts,
especially when the configuration file is located in a directory that is not accessible by the user account running the
application. This was fixed by changing the way the configuration file path is resolved including by adding a setup
execution unit that will be executed post-installation to ensure that the configuration file is accessible by the user
account running the application.
## [1.1.1] - 2024-09-26
This update introduces a minor bug fix
### Fixed
- Fixed issue where keys containing underscores are considered to be invalid
## [1.1.0] - 2024-09-23
This update introduces changes for PHP 8.3 & NCC 2.1.0+ compatibility
### Added
- Added PhpUnit tests for the library
- Added new option `--path` to the CLI interface to display the path to the configuration file
### Changed
- Updated the codebase to be compatible with PHP 8.3
- Updated the codebase to be compatible with NCC 2.1.0+
- Updated Makefile
### Fixed
- Fixed regex patterns to be more robust
## [1.0.4] - 2023-08-12 ## [1.0.4] - 2023-08-12
This update introduces minor improvements This update introduces minor improvements

View file

@ -1,33 +1,8 @@
# Variables build:
DEFAULT_CONFIGURATION ?= release ncc build --config="release" --log-level debug
LOG_LEVEL = debug
# Default Target install:
all: release debug release-executable debug-executable release_executable debug_executable sudo ncc package install --package="build/release/net.nosial.configlib.ncc" --skip-dependencies --reinstall -y --log-level debug
# Build Steps
release:
ncc build --config=release --log-level $(LOG_LEVEL)
debug:
ncc build --config=debug --log-level $(LOG_LEVEL)
release-executable:
ncc build --config=release-executable --log-level $(LOG_LEVEL)
debug-executable:
ncc build --config=debug-executable --log-level $(LOG_LEVEL)
release_executable:
ncc build --config=release_executable --log-level $(LOG_LEVEL)
debug_executable:
ncc build --config=debug_executable --log-level $(LOG_LEVEL)
install: release
ncc package install --package=build/release/net.nosial.configlib.ncc --skip-dependencies --build-source --reinstall -y --log-level $(LOG_LEVEL)
test: release
[ -f phpunit.xml ] || { echo "phpunit.xml not found"; exit 1; }
phpunit
clean: clean:
rm -rf build rm -rf build
.PHONY: all install test clean release debug release-executable debug-executable release_executable debug_executable

View file

@ -9,25 +9,10 @@ be configured more easily by following the documented instructions on how to alt
could use a builtin editor to edit the configuration file manually. could use a builtin editor to edit the configuration file manually.
## Community
This project and many others from Nosial are available on multiple publicly available and free git repositories at
- [n64](https://git.n64.cc/nosial/configlib)
- [GitHub](https://github.com/nosial/configlib)
- [Codeberg](https://codeberg.org/nosial/configlib)
Issues & Pull Requests are frequently checked and to be referenced accordingly in commits and changes, Nosial remains
dedicated to keep these repositories up to date when possible.
For questions & discussions see the public Telegram community at [@NosialDiscussions](https://t.me/NosialDiscussions).
We do encourage community support and discussions, please be respectful and follow the rules of the community.
## Table of contents ## Table of contents
<!-- TOC --> <!-- TOC -->
* [ConfigLib](#configlib) * [ConfigLib](#configlib)
* [Community](#community)
* [Table of contents](#table-of-contents) * [Table of contents](#table-of-contents)
* [Installation](#installation) * [Installation](#installation)
* [Compile from source](#compile-from-source) * [Compile from source](#compile-from-source)

View file

@ -1,3 +0,0 @@
<?php
require 'ncc';
import('net.nosial.configlib');

24
main
View file

@ -1,24 +1,6 @@
<?php <?php
if (PHP_SAPI !== 'cli')
{
print('net.nosial.configlib must be run from the command line.' . PHP_EOL);
exit(1);
}
if(!isset($argv))
{
if(isset($_SERVER['argv']))
{
$argv = $_SERVER['argv'];
}
else
{
print('net.nosial.configlib failed to run, no $argv found.' . PHP_EOL);
exit(1);
}
}
require('ncc'); require('ncc');
\ncc\Classes\Runtime::import('net.nosial.configlib', 'latest'); import('net.nosial.configlib', 'latest');
exit(\ConfigLib\Program::main($argv));
\ConfigLib\Program::main();

View file

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<phpdocumentor configVersion="3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://www.phpdoc.org" xsi:noNamespaceSchemaLocation="https://raw.githubusercontent.com/phpDocumentor/phpDocumentor/master/data/xsd/phpdoc.xsd">
<paths>
<output>build/docs</output>
<cache>build/cache</cache>
</paths>
<version number="latest">
<api>
<source dsn=".">
<path>src/ConfigLib</path>
</source>
<default-package-name>ConfigLib</default-package-name>
</api>
</version>
</phpdocumentor>

View file

@ -1,11 +0,0 @@
<phpunit bootstrap="bootstrap.php">
<testsuites>
<testsuite name="ConfigLib Test Suite">
<directory>tests</directory>
</testsuite>
</testsuites>
<php>
<ini name="error_reporting" value="-1"/>
<server name="KERNEL_DIR" value="app/"/>
</php>
</phpunit>

View file

@ -5,9 +5,6 @@
"minimum_version": "8.0", "minimum_version": "8.0",
"maximum_version": "8.2" "maximum_version": "8.2"
}, },
"options": {
"create_symlink": true
},
"update_source": { "update_source": {
"source": "nosial/libs.config@n64", "source": "nosial/libs.config@n64",
"repository": { "repository": {
@ -16,126 +13,75 @@
"host": "git.n64.cc", "host": "git.n64.cc",
"ssl": true "ssl": true
} }
}
}, },
"assembly": {
"name": "ConfigLib",
"package": "net.nosial.configlib",
"description": "ConfigLib is a library for reading and writing configuration files via the NCC Runtime API",
"company": "Nosial",
"copyright": "Copyright (c) 2022-2023 Nosial",
"version": "1.1.7",
"uuid": "9347259e-8e4d-11ed-85a7-fd07cf28ef35"
},
"build": {
"source_path": "src",
"default_configuration": "release",
"main": "main_policy",
"define_constants": {
"VERSION": "%ASSEMBLY.VERSION%"
},
"dependencies": [
{
"name": "net.nosial.optslib",
"version": "latest",
"source": "nosial/optslib=latest@github"
},
{
"name": "net.nosial.loglib2",
"version": "latest",
"source": "nosial/loglib2=latest@github"
},
{
"name": "com.symfony.filesystem",
"version": "latest",
"source": "symfony/filesystem=latest@packagist"
},
{
"name": "com.symfony.yaml",
"version": "latest",
"source": "symfony/yaml=latest@packagist"
},
{
"name": "com.symfony.process",
"version": "latest",
"source": "symfony/process=latest@packagist"
}
],
"configurations": [
{
"name": "release",
"build_type": "ncc",
"output": "build/release/%ASSEMBLY.PACKAGE%.ncc"
},
{
"name": "debug",
"build_type": "ncc",
"output": "build/debug/%ASSEMBLY.PACKAGE%.ncc",
"define_constants": {
"DEBUG": "1"
}
},
{
"name": "release-executable",
"build_type": "executable",
"output": "build/release/release_executable_gz",
"options": { "options": {
"ncc_configuration": "release" "create_symlink": true
} }
}, },
{
"name": "debug-executable",
"build_type": "executable",
"output": "build/debug/debug_executable_gz",
"options": {
"ncc_configuration": "debug"
}
},
{
"name": "release_executable",
"build_type": "executable",
"output": "build/release/%ASSEMBLY.NAME%",
"options": {
"ncc_configuration": "release"
}
},
{
"name": "debug_executable",
"build_type": "executable",
"output": "build/debug/%ASSEMBLY.NAME%",
"options": {
"ncc_configuration": "debug"
},
"define_constants": {
"DEBUG": "1"
}
}
]
},
"execution_policies":[ "execution_policies":[
{ {
"name": "main", "name": "main",
"runner": "php", "runner": "php",
"execute": { "execute": {
"target": "main",
"working_directory": "%CWD%", "working_directory": "%CWD%",
"silent": false, "tty": true
"tty": true,
"timeout": null,
"idle_timeout": null,
"target": "main"
} }
}
],
"assembly": {
"name": "ConfigLib",
"package": "net.nosial.configlib",
"company": "Nosial",
"copyright": "Copyright (c) 2022-2023 Nosial",
"description": "ConfigLib is a library for reading and writing configuration files via the NCC Runtime API",
"version": "1.0.4",
"uuid": "9347259e-8e4d-11ed-85a7-fd07cf28ef35"
},
"build": {
"source_path": "src",
"default_configuration": "release",
"main": "main",
"define_constants": {
"version": "%ASSEMBLY.VERSION%"
},
"dependencies": [
{
"name": "net.nosial.optslib",
"version": "latest",
"source_type": "remote",
"source": "nosial/libs.opts=latest@n64"
}, },
{ {
"name": "main_policy", "name": "net.nosial.loglib",
"runner": "php", "version": "latest",
"execute": { "source_type": "remote",
"working_directory": "%CWD%", "source": "nosial/libs.log=latest@n64"
"silent": false, },
"tty": true, {
"timeout": null, "name": "com.symfony.filesystem",
"idle_timeout": null, "version": "latest",
"target": "main" "source_type": "remote",
"source": "symfony/filesystem=latest@composer"
},
{
"name": "com.symfony.yaml",
"version": "latest",
"source_type": "remote",
"source": "symfony/yaml=latest@composer"
},
{
"name": "com.symfony.process",
"version": "latest",
"source_type": "remote",
"source": "symfony/process=latest@composer"
} }
],
"configurations": [
{
"name": "release",
"output_path": "build/release"
} }
] ]
} }
}

14
setup
View file

@ -1,14 +0,0 @@
<?php
$global_directory = $path = DIRECTORY_SEPARATOR . 'etc' . DIRECTORY_SEPARATOR . 'configlib';
//try creating the directory if it doesn't exist
if(!file_exists($global_directory))
{
if(!mkdir($global_directory, 0777, true))
{
exit('Failed to create global directory');
}
chmod($global_directory, 0777);
}

View file

@ -1,61 +1,58 @@
<?php <?php
/** @noinspection PhpMissingFieldTypeInspection */
namespace ConfigLib; namespace ConfigLib;
use Exception; use Exception;
use LogLib2\Logger; use LogLib\Log;
use ncc\Runtime;
use RuntimeException; use RuntimeException;
use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Yaml\Yaml; use Symfony\Component\Yaml\Yaml;
class Configuration class Configuration
{ {
/**
* The logger of the class
* @var Logger
*/
private Logger $logger;
/** /**
* The name of the configuration * The name of the configuration
* @var string|array *
* @var string
*/ */
private string|array $name; private $name;
/** /**
* The path to the configuration file * The path to the configuration file
* @var string|null *
* @var string
*/ */
private ?string $path; private $path;
/** /**
* The configuration data * The configuration data
*
* @var array * @var array
*/ */
private array $configuration; private $configuration;
/** /**
* Indicates if the current instance is modified * Indicates if the current instance is modified
*
* @var bool * @var bool
*/ */
private bool $modified; private $modified;
/** /**
* Public Constructor * Public Constructor
* *
* @param string $name The name of the configuration (e.g. "MyApp" or "net.example.myapp") * @param string $name The name of the configuration (e.g. "MyApp" or "net.example.myapp")
* @param string|null $path The directory where the configuration file will be stored
*/ */
public function __construct(string $name='default', ?string $path=null) public function __construct(string $name='default')
{ {
$this->logger = new Logger('net.nosial.configlib');
// Sanitize $name for a file path // Sanitize $name for a file path
$name = strtolower($name); $name = strtolower($name);
$name = str_replace(array('/', '\\', '.'), '_', $name); $name = str_replace(array('/', '\\', '.'), '_', $name);
$env = getenv(sprintf("CONFIGLIB_%s", strtoupper($name)));
$this->path = null;
$env = getenv(sprintf("CONFIGLIB_%s", strtoupper($name)));
if($env !== false) if($env !== false)
{ {
if(file_exists($env)) if(file_exists($env))
@ -64,97 +61,21 @@
} }
else else
{ {
$this->logger->warning(sprintf('Environment variable "%s" points to a non-existent file, resorting to default/builtin configuration', $env)); Log::warning('net.nosial.configlib', sprintf('Environment variable "%s" points to a non-existent file, resorting to default/builtin configuration', $env));
} }
} }
if($path !== null)
{
if(!is_dir(dirname($path)))
{
throw new RuntimeException(sprintf('Directory "%s" does not exist', dirname($path)));
}
if(!is_writable(dirname($path)))
{
throw new RuntimeException(sprintf('Directory "%s" is not writable', dirname($path)));
}
$this->path = $path;
}
if($this->path === null) if($this->path === null)
{ {
$filePath = $name . '.conf'; // Figure out the path to the configuration file
try
// If the CONFIGLIB_PATH environment variable is set, use it as the configuration path
if(getenv('CONFIGLIB_PATH'))
{ {
$configDir = getenv('CONFIGLIB_PATH'); $this->path = Runtime::getDataPath('net.nosial.configlib') . DIRECTORY_SEPARATOR . $name . '.conf';
} }
else catch (Exception $e)
{ {
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') throw new RuntimeException('Unable to load package "net.nosial.configlib"', $e);
{
$configDir = getenv('APPDATA') ?: getenv('LOCALAPPDATA');
if (!$configDir)
{
// Fallback to system temporary directory
$configDir = sys_get_temp_dir();
} }
$configDir .= DIRECTORY_SEPARATOR . 'ConfigLib';
}
else
{
$homeDir = getenv('HOME') ?: '';
$configDirs = [];
if ($homeDir)
{
$configDirs[] = $homeDir . DIRECTORY_SEPARATOR . '.configlib';
$configDirs[] = $homeDir . DIRECTORY_SEPARATOR . '.config' . DIRECTORY_SEPARATOR . 'configlib';
}
$configDirs[] = '/etc/configlib';
$configDirs[] = '/var/lib/configlib';
$configDir = null;
// Iterate over the list of directories and select the first one that can be created or written to
foreach ($configDirs as $dir)
{
if (file_exists($dir) && is_writable($dir))
{
$configDir = $dir;
break;
}
elseif (!file_exists($dir) && mkdir($dir, 0755, true))
{
$configDir = $dir;
break;
}
}
if (!$configDir)
{
$this->logger->warning(sprintf('Unable to find a proper directory to store configuration paths in, using temporary directory instead: %s', sys_get_temp_dir()));
$configDir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'configlib';
}
}
}
// Ensure the directory exists
if (!file_exists($configDir))
{
if (!mkdir($configDir, 0755, true) && !is_dir($configDir))
{
throw new RuntimeException(sprintf('Directory "%s" was not created', $configDir));
}
}
$this->path = $configDir . DIRECTORY_SEPARATOR . $filePath;
} }
// Set the name // Set the name
@ -171,7 +92,7 @@
} }
catch(Exception $e) catch(Exception $e)
{ {
$this->logger->error(sprintf('Unable to load configuration "%s", %s', $this->name, $e->getMessage()), $e); Log::error('net.nosial.configlib', sprintf('Unable to load configuration "%s", %s', $this->name, $e->getMessage()));
throw new RuntimeException(sprintf('Unable to load configuration "%s"', $this->name), $e); throw new RuntimeException(sprintf('Unable to load configuration "%s"', $this->name), $e);
} }
} }
@ -184,12 +105,14 @@
/** /**
* Validates a key syntax (e.g. "key1.key2.key3") * Validates a key syntax (e.g. "key1.key2.key3")
* *
* @param string $input The key to validate * @param string $input
* @return bool True if the key is valid, false otherwise * @return bool
*/ */
private static function validateKey(string $input): bool private static function validateKey(string $input): bool
{ {
if (preg_match('/^[a-zA-Z0-9_]+(\.[a-zA-Z0-9_]+)*$/', $input)) $pattern = '/^([a-zA-Z]+\.?)+$/';
if (preg_match($pattern, $input))
{ {
return true; return true;
} }
@ -197,6 +120,35 @@
return false; return false;
} }
/**
* Attempts to convert a string to the correct type (int, float, bool, string)
*
* @param $input
* @return float|int|mixed|string
* @noinspection PhpUnusedPrivateMethodInspection
*/
private static function cast($input): mixed
{
if (is_numeric($input))
{
if(str_contains($input, '.'))
{
return (float)$input;
}
if(ctype_digit($input))
{
return (int)$input;
}
}
elseif (in_array(strtolower($input), ['true', 'false']))
{
return filter_var($input, FILTER_VALIDATE_BOOLEAN);
}
return (string)$input;
}
/** /**
* Returns a value from the configuration * Returns a value from the configuration
* *
@ -227,8 +179,8 @@
} }
} }
// Return the value at the end of the path, or the default if the value is null // Return the value at the end of the path
return $current ?? $default; return $current;
} }
/** /**
@ -241,7 +193,6 @@
*/ */
public function set(string $key, mixed $value, bool $create=false): bool public function set(string $key, mixed $value, bool $create=false): bool
{ {
// Validate the provided key
if(!self::validateKey($key)) if(!self::validateKey($key))
{ {
return false; return false;
@ -250,61 +201,27 @@
$path = explode('.', $key); $path = explode('.', $key);
$current = &$this->configuration; $current = &$this->configuration;
foreach ($path as $keyPart) // Navigate to the parent of the value to set
foreach ($path as $key_value)
{ {
if (!is_array($current)) if (is_array($current) && array_key_exists($key_value, $current))
{ {
$current = []; $current = &$current[$key_value];
} }
elseif($create)
if (!array_key_exists($keyPart, $current))
{ {
if ($create) $current[$key_value] = [];
{ $current = &$current[$key_value];
$current[$keyPart] = [];
} }
else else
{ {
return false; return false;
} }
}
$current = &$current[$keyPart];
} }
$current = $value; $current = $value;
$this->modified = true; $this->modified = true;
return true;
}
/**
* Checks if a configuration key exists
*
* @param string $key The key to check (e.g. "key1.key2.key3")
* @return bool True if the key exists, false otherwise
*/
public function exists(string $key): bool
{
// Validate the provided key
if (!self::validateKey($key))
{
return false;
}
$path = explode('.', $key);
$current = $this->configuration;
foreach ($path as $keyPart)
{
if (is_array($current) && array_key_exists($keyPart, $current))
{
$current = $current[$keyPart];
}
else
{
return false;
}
}
return true; return true;
} }
@ -312,9 +229,9 @@
/** /**
* Sets the default value for a key if it does not exist * Sets the default value for a key if it does not exist
* *
* @param string $key The key to set (e.g. "key1.key2.key3") * @param string $key
* @param mixed $value The value to set * @param mixed $value
* @return bool True if the value was set, false otherwise * @return bool
*/ */
public function setDefault(string $key, mixed $value): bool public function setDefault(string $key, mixed $value): bool
{ {
@ -326,11 +243,42 @@
return $this->set($key, $value, true); return $this->set($key, $value, true);
} }
/**
* Checks if the given key exists in the configuration
*
* @param string $key
* @return bool
*/
public function exists(string $key): bool
{
if(!self::validateKey($key))
{
return false;
}
$path = explode('.', $key);
$current = $this->configuration;
foreach ($path as $key_value)
{
if (is_array($current) && array_key_exists($key_value, $current))
{
$current = $current[$key_value];
}
else
{
return false;
}
}
return true;
}
/** /**
* Clears the current configuration data * Clears the current configuration data
* *
* @return void * @return void
* @noinspection PhpUnused
*/ */
public function clear(): void public function clear(): void
{ {
@ -363,14 +311,15 @@
} }
$this->modified = false; $this->modified = false;
$this->logger->debug(sprintf('Configuration "%s" saved', $this->name)); Log::debug('net.nosial.configlib', sprintf('Configuration "%s" saved', $this->name));
} }
/** /**
* Loads the Configuration File from the disk * Loads the Configuration File from the disk
* *
* @param bool $force If true, the configuration will be reloaded even if it was not modified * @param bool $force
* @return void * @return void
* @noinspection PhpUnused
*/ */
public function load(bool $force=false): void public function load(bool $force=false): void
{ {
@ -432,7 +381,6 @@
{ {
$current[$key_value] = []; $current[$key_value] = [];
} }
$current = &$current[$key_value]; $current = &$current[$key_value];
} }
else else
@ -445,13 +393,13 @@
} }
$this->modified = false; $this->modified = false;
$this->logger->debug('Loaded configuration file: ' . $this->path); Log::debug('net.nosial.configlib', 'Loaded configuration file: ' . $this->path);
} }
/** /**
* Returns the name of the configuration * Returns the name of the configuration
* *
* @return string The name of the configuration * @return string
* @noinspection PhpUnused * @noinspection PhpUnused
*/ */
public function getName(): string public function getName(): string
@ -462,7 +410,7 @@
/** /**
* Returns the path of the configuration file on disk * Returns the path of the configuration file on disk
* *
* @return string The path of the configuration file * @return string
*/ */
public function getPath(): string public function getPath(): string
{ {
@ -472,7 +420,7 @@
/** /**
* Returns the configuration * Returns the configuration
* *
* @return array The configuration * @return array
* @noinspection PhpUnused * @noinspection PhpUnused
*/ */
public function getConfiguration(): array public function getConfiguration(): array
@ -483,11 +431,11 @@
/** /**
* Returns a formatted yaml string of the current configuration * Returns a formatted yaml string of the current configuration
* *
* @return string The configuration in YAML format * @return string
*/ */
public function toYaml(): string public function toYaml(): string
{ {
return Yaml::dump($this->configuration, 4); return Yaml::dump($this->configuration, 4, 2);
} }
/** /**
@ -503,7 +451,7 @@
} }
catch(Exception $e) catch(Exception $e)
{ {
$this->logger->error(sprintf('Unable to save configuration "%s" to disk, %s', $this->name, $e->getMessage()), $e); Log::error('net.nosial.configlib', sprintf('Unable to save configuration "%s" to disk, %s', $this->name, $e->getMessage()));
} }
} }
} }
@ -511,7 +459,7 @@
/** /**
* Imports a YAML file into the configuration * Imports a YAML file into the configuration
* *
* @param string $path The path to the YAML file * @param string $path
* @return void * @return void
*/ */
public function import(string $path): void public function import(string $path): void
@ -533,7 +481,7 @@
/** /**
* Exports the configuration to a YAML file * Exports the configuration to a YAML file
* *
* @param string $path The path to export the configuration to * @param string $path
* @return void * @return void
*/ */
public function export(string $path): void public function export(string $path): void

View file

@ -4,18 +4,20 @@
use Exception; use Exception;
use JetBrains\PhpStorm\NoReturn; use JetBrains\PhpStorm\NoReturn;
use ncc\Exceptions\InvalidPackageNameException;
use ncc\Exceptions\InvalidScopeException;
use ncc\Exceptions\PackageLockException;
use ncc\Exceptions\PackageNotFoundException;
use ncc\Runtime;
use OptsLib\Parse; use OptsLib\Parse;
use RuntimeException; use RuntimeException;
use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Process\Process; use Symfony\Component\Process\Process;
use Symfony\Component\Yaml\Exception\ParseException; use Symfony\Component\Yaml\Exception\ParseException;
use Symfony\Component\Yaml\Yaml; use Symfony\Component\Yaml\Yaml;
use function trigger_error;
class Program class Program
{ {
private static ?string $version = null;
/** /**
* Main entry point of the program * Main entry point of the program
* *
@ -38,7 +40,6 @@
$editor = $args['editor'] ?? @$args['e'] ?? null; $editor = $args['editor'] ?? @$args['e'] ?? null;
$export = $args['export'] ?? null; $export = $args['export'] ?? null;
$import = $args['import'] ?? null; $import = $args['import'] ?? null;
$path = $args['path'] ?? null;
if($configuration_name === null) if($configuration_name === null)
{ {
@ -52,16 +53,9 @@
if(!file_exists($configuration->getPath())) if(!file_exists($configuration->getPath()))
{ {
print(sprintf('Configuration \'%s\' does not exist, aborting' . PHP_EOL, $configuration->getName())); print(sprintf('Configuration \'%s\' does not exist, aborting' . PHP_EOL, $configuration->getName()));
exit(1); exit(1);
} }
if($path !== null)
{
print($configuration->getPath() . PHP_EOL);
exit(0);
}
if($import !== null) if($import !== null)
{ {
try try
@ -151,7 +145,7 @@
*/ */
#[NoReturn] private static function help(): void #[NoReturn] private static function help(): void
{ {
print('ConfigLib v' . self::getVersion() . PHP_EOL . PHP_EOL); print('ConfigLib v' . Runtime::getConstant('net.nosial.configlib', 'version') . PHP_EOL . PHP_EOL);
print('Usage: configlib [options]' . PHP_EOL); print('Usage: configlib [options]' . PHP_EOL);
print(' -h, --help Displays the help menu' . PHP_EOL); print(' -h, --help Displays the help menu' . PHP_EOL);
@ -161,7 +155,6 @@
print(' -e, --editor <editor> (Optional) The editor to use (eg; nano, vim, notepad) (External)' . PHP_EOL); print(' -e, --editor <editor> (Optional) The editor to use (eg; nano, vim, notepad) (External)' . PHP_EOL);
print(' --export <file> (Optional) Exports the configuration to a file' . PHP_EOL); print(' --export <file> (Optional) Exports the configuration to a file' . PHP_EOL);
print(' --import <file> (Optional) Imports the configuration from a file' . PHP_EOL); print(' --import <file> (Optional) Imports the configuration from a file' . PHP_EOL);
print(' --path (Optional) Displays the configuration storage path' . PHP_EOL);
print(' --nc (Optional) Disables type casting (eg; \'true\' > True) will always be a string' . PHP_EOL); print(' --nc (Optional) Disables type casting (eg; \'true\' > True) will always be a string' . PHP_EOL);
print('Examples:' . PHP_EOL . PHP_EOL); print('Examples:' . PHP_EOL . PHP_EOL);
@ -171,7 +164,6 @@
print(' configlib --conf test --editor nano Edit the configuration' . PHP_EOL); print(' configlib --conf test --editor nano Edit the configuration' . PHP_EOL);
print(' configlib --conf test --export out.json Export the configuration' . PHP_EOL); print(' configlib --conf test --export out.json Export the configuration' . PHP_EOL);
print(' configlib --conf test --import in.json Import a configuration' . PHP_EOL); print(' configlib --conf test --import in.json Import a configuration' . PHP_EOL);
print(' configlib --conf test --path Displays the configuration storage path' . PHP_EOL);
exit(0); exit(0);
} }
@ -182,6 +174,10 @@
* @param array $args * @param array $args
* @param Configuration $configuration * @param Configuration $configuration
* @return void * @return void
* @throws InvalidPackageNameException
* @throws InvalidScopeException
* @throws PackageLockException
* @throws PackageNotFoundException
*/ */
#[NoReturn] private static function edit(array $args, Configuration $configuration): void #[NoReturn] private static function edit(array $args, Configuration $configuration): void
{ {
@ -200,22 +196,21 @@
} }
else else
{ {
$temporary_directory = sys_get_temp_dir(); if(!file_exists(Runtime::getDataPath('net.nosial.configlib') . DIRECTORY_SEPARATOR . 'tmp'))
if(!file_exists($temporary_directory . DIRECTORY_SEPARATOR . 'configlib'))
{ {
if (!mkdir($concurrentDirectory = $temporary_directory . DIRECTORY_SEPARATOR . 'configlib', 0777, true) && !is_dir($concurrentDirectory)) if (!mkdir($concurrentDirectory = Runtime::getDataPath('net.nosial.configlib') . DIRECTORY_SEPARATOR . 'tmp', 0777, true) && !is_dir($concurrentDirectory))
{ {
throw new RuntimeException(sprintf('Directory "%s" was not created', $concurrentDirectory)); throw new RuntimeException(sprintf('Directory "%s" was not created', $concurrentDirectory));
} }
if(!file_exists($temporary_directory . DIRECTORY_SEPARATOR . 'configlib')) if(!file_exists(Runtime::getDataPath('net.nosial.configlib') . DIRECTORY_SEPARATOR . 'tmp'))
{ {
print('Unable to create the temporary path to use' . PHP_EOL); print('Unable to create the temporary path to use' . PHP_EOL);
exit(1); exit(1);
} }
} }
$tempPath = $temporary_directory . DIRECTORY_SEPARATOR . 'configlib'; $tempPath = Runtime::getDataPath('net.nosial.configlib') . DIRECTORY_SEPARATOR . 'tmp';
} }
$fs = new Filesystem(); $fs = new Filesystem();
@ -281,30 +276,4 @@
exit(0); exit(0);
} }
/**
* Retrieves the current version of the library. If the version is not set, it checks
* if the CONFIGLIB_VERSION constant is defined. If neither is available, it returns 'Unknown'
* and triggers a user warning.
*
* @return string The current version of the library.
* @noinspection PhpUndefinedConstantInspection
*/
public static function getVersion(): string
{
if(self::$version !== null)
{
return self::$version;
}
if(defined('CONFIGLIB_VERSION'))
{
self::$version = CONFIGLIB_VERSION;
return self::$version;
}
self::$version = 'Unknown';
trigger_error('ConfigLib version is unknown', E_USER_WARNING);
return self::$version;
}
} }

View file

@ -1,107 +0,0 @@
<?php
namespace ConfigLib;
use PHPUnit\Framework\TestCase;
class ConfigurationTest extends TestCase
{
public static function setUpBeforeClass(): void
{
$config = new Configuration('test');
if(file_exists($config->getPath()))
{
unlink($config->getPath());
}
}
public function testConstruct(): void
{
$config = new Configuration();
$this->assertInstanceOf(Configuration::class, $config);
}
public function testSetExists(): void
{
$config = new Configuration('test');
$this->assertTrue($config->set('key1.key2', 'value', true));
$this->assertEquals('value', $config->get('key1.key2'));
}
public function testSetNotExists(): void
{
$config = new Configuration('test');
$this->assertFalse($config->set('key1.key3', 'value'));
}
public function testSetInvalidKey(): void
{
$config = new Configuration('test');
$this->assertFalse($config->set('invalid\key', 'value'));
}
public function testGetExists(): void
{
$config = new Configuration('test');
$config->set('key1.key2', 'value');
$this->assertEquals('value', $config->get('key1.key2'));
}
/**
* @test
* Test get method when provided with existing key
*/
public function testGetMethodWithValidKey(): void
{
$config = new Configuration('test');
$this->assertTrue($config->set('key1.key2', 'value', true));
$this->assertEquals('value', $config->get('key1.key2'));
$this->assertTrue($config->set('foo.fizz_buzz', 'value', true));
$this->assertEquals('value', $config->get('foo.fizz_buzz'));
}
/**
* @test
* Test get method when provided with non-existing key
*/
public function testGetMethodWithInvalidKey(): void
{
$config = new Configuration('test');
$this->assertNull($config->get('non.existing.key'));
}
/**
* @test
* Test get method when key format is not valid
*/
public function testGetMethodWithIncorrectKeyFormat(): void
{
$config = new Configuration('test');
$this->assertNull($config->get('incorrect\format'));
}
/**
* @test
* Test get method when provided with existing key and expecting the default value to be returned
*/
public function testGetMethodWithValidKeyExpectingDefaultValue(): void
{
$config = new Configuration('test');
$config->set('key1.key2', null);
$this->assertEquals('default', $config->get('key1.key2', 'default'));
}
/**
* @test
* Test setDefault method when non-existing key is provided
*/
public function testSetDefaultWithNonExistingKey(): void
{
$config = new Configuration('test');
$this->assertTrue($config->setDefault('non.existing.key', 'default'));
$this->assertEquals('default', $config->get('non.existing.key'));
}
}

14
tests/default.php Normal file
View file

@ -0,0 +1,14 @@
<?php
require 'ncc';
import('net.nosial.configlib');
$config = new \ConfigLib\Configuration('test');
$config->setDefault('database.host', '127.0.0.1');
$config->setDefault('database.port', 3306);
$config->setDefault('database.username', 'root');
$config->setDefault('database.password', null);
$config->setDefault('database.name', 'test');
$config->save();

11
tests/edit_test.php Normal file
View file

@ -0,0 +1,11 @@
<?php
require 'ncc';
import('net.nosial.configlib');
$config = new \ConfigLib\Configuration('test');
$config->set('database.host', '192.168.1.1');
$config->set('database.username', 'super_root');
$config->save();

8
tests/load.php Normal file
View file

@ -0,0 +1,8 @@
<?php
require 'ncc';
import('net.nosial.configlib');
$config = new \ConfigLib\Configuration('test');
var_dump($config->getConfiguration());