Compare commits

..

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

19 changed files with 226 additions and 1310 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 }}

6
.gitignore vendored
View file

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

View file

@ -1,12 +1,9 @@
image: php:8.3
image: php:8.1
before_script:
# Install some stuff that the image doesn't come with
- 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
# Install phive
- 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
- 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 --install-composer
- php build/src/INSTALL --auto --install-composer
- cd .. && rm -rf ncc
build:
stage: build
script:
- ncc build --config release --log-level debug
artifacts:
@ -41,15 +31,6 @@ build:
- build/
rules:
- 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:
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$/tests" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/build" />
<excludeFolder url="file://$MODULE_DIR$/reports" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />

20
.idea/php.xml generated
View file

@ -11,25 +11,19 @@
</component>
<component name="PhpIncludePathManager">
<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="/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>
</component>
<component name="PhpProjectSharedConfiguration" php_language_level="8.3" />
<component name="PhpProjectSharedConfiguration" php_language_level="8.2" />
<component name="PhpStanOptionsConfiguration">
<option name="transferred" value="true" />
</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">
<option name="transferred" value="true" />
</component>

View file

@ -5,127 +5,23 @@ 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/),
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
This update introduces minor improvements
### Added
- Added the ability to override configuration properties with environment variables using the format
`CONFIGLIB_<CONFIG_NAME>_<PROPERTY_NAME>`
### Fixed
- Corrected a few lines of code in regards to missing variable definitions
## [1.0.3] - 2023-07-13
### Fixed
- Fixed `Fatal error: Uncaught TypeError: array_replace_recursive(): Argument #1 ($array) must be of type array, null given in /var/ncc/packages/net.nosial.configlib=1.0.2/src/ConfigLib/Configuration.php:331`
## [1.0.2] - 2023-07-11
### Fixed
- Fixed issue [#1](https://git.n64.cc/nosial/libs/config/-/issues/1) in Configuration->__construct() where the name of
* Fixed issue [#1](https://git.n64.cc/nosial/libs/config/-/issues/1) in Configuration->__construct() where the name of
an environment variable was being used instead of its value when determining the configuration file path. This
incorrect handling resulted in warnings about non-existent files and hindered the proper loading of configuration
files. With this fix, environment variables should now correctly guide the path to the desired configuration files,
improving the flexibility and functionality of the configuration library.
## [1.0.1] - 2023-07-11
### Changed
- Refactored codebase to be more maintainable, readable & more optimized
* Refactored codebase to be more maintainable, readable & more optimized
### Added
- ConfigurationLib will now attempt to load configuration files from Environment Variables if they are set, for example,
* ConfigurationLib will now attempt to load configuration files from Environment Variables if they are set, for example,
if `com.example.application` wants to load `ExampleConfiguration` it will first check if `CONFIGLIB_EXAMPLECONFIGURATION`
is set, and if so, load that file instead of going through the default process of loading the default configuration file.
If the file is not found, it will resort to its default behavior. You can either load an original json configuration
@ -134,8 +30,7 @@ This update introduces minor improvements
or `.yaml` if you want ConfigLib to load it as a yml file, otherwise by default it assumes it is a json file.
## [1.0.0] - 2023-02-23
### Added
- First Release
* First Release

View file

@ -1,33 +1,8 @@
# Variables
DEFAULT_CONFIGURATION ?= release
LOG_LEVEL = debug
build:
ncc build --config="release" --log-level debug
# Default Target
all: release debug release-executable debug-executable release_executable debug_executable
# 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
install:
sudo ncc package install --package="build/release/net.nosial.configlib.ncc" --skip-dependencies --reinstall -y --log-level debug
clean:
rm -rf build
.PHONY: all install test clean release debug release-executable debug-executable release_executable debug_executable
rm -rf build

View file

@ -1,33 +1,21 @@
# ConfigLib
ConfigLib is a PHP library for managing configuration files and storing it in NCC's data, while providing a command
line interface for running functions such as editing configuration files inline or importing/exporting configuration
files.
ConfigLib is a PHP library for managing configuration files and storing it
in NCC's data, while providing a command line interface for running functions
such as editing configuration files inline or importing/exporting
configuration files.
One of the biggest advantages of using something like ConfigLib is that it will allow for more complicated software to
be configured more easily by following the documented instructions on how to alter configuration files, optionally you
could use a builtin editor to edit the configuration file manually.
One of the biggest advantages of using something like ConfigLib is that
it will allow for more complicated software to be configured more easily
by following the documented instructions on how to alter configuration
files, optionally you 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
<!-- TOC -->
* [ConfigLib](#configlib)
* [Community](#community)
* [Table of contents](#table-of-contents)
* [Installation](#installation)
* [Compile from source](#compile-from-source)
@ -42,9 +30,6 @@ We do encourage community support and discussions, please be respectful and foll
* [Editing a configuration file](#editing-a-configuration-file)
* [Using an external editor](#using-an-external-editor)
* [Inline command line editor](#inline-command-line-editor)
* [Environment Variables](#environment-variables)
* [Importing a YAML file](#importing-a-yaml-file)
* [Overriding configuration values](#overriding-configuration-values)
* [License](#license)
<!-- TOC -->
@ -146,8 +131,6 @@ The command line interface can be executed by running `configlib` from the comma
For the rest of this documentation, we will assume that you have the `configlib` command in your global path.
### Exporting a configuration file
To export a configuration file, run the following command:
@ -160,8 +143,6 @@ Exported configuration files are stored as YAML files.
> Note: if the filename is not specified, the configuration file will be exported to the current working directory with the name `<config_name>.yaml`
### Importing a configuration file
To import a configuration file, you must specify a valid yaml file, run the following command:
@ -170,8 +151,6 @@ To import a configuration file, you must specify a valid yaml file, run the foll
configlib --config <config_name> --import <filename>
```
### Editing a configuration file
There are two ways to edit a configuration file using ConfigLib
@ -219,37 +198,6 @@ To edit a property, specify both the `--property` and `--value` options:
configlib --config <config_name> --property database.username --value root
```
### Environment Variables
ConfigLib can be interacted with using environment variables with two functions
- Import a YAML file
- Override configuration values
#### Importing a YAML file
You can tell ConfigLib to load a YAML file by setting the `CONFIGLIB_<CONFIG_NAME>` environment variable with the path
to the YAML file as the value, for example:
```bash
export CONFIGLIB_MYCONFIG=/path/to/myconfig.yaml
```
#### Overriding configuration values
If loading an entire YAML file is too much, you can override specific configuration values by setting the environment
variable `CONFIGLIB_<CONFIG_NAME>_<PROPERTY_NAME>` with the value you want to set, for example:
```bash
export CONFIGLIB_MYCONFIG_DATABASE_USERNAME=root
```
This would override the `database.username` property in the `myconfig` configuration file even if the property is
already set, the environment variable will take precedence.
## License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details

View file

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

24
main
View file

@ -1,24 +1,6 @@
<?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');
\ncc\Classes\Runtime::import('net.nosial.configlib', 'latest');
exit(\ConfigLib\Program::main($argv));
import('net.nosial.configlib', 'latest');
\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",
"maximum_version": "8.2"
},
"options": {
"create_symlink": true
},
"update_source": {
"source": "nosial/libs.config@n64",
"repository": {
@ -16,126 +13,75 @@
"host": "git.n64.cc",
"ssl": true
}
},
"options": {
"create_symlink": true
}
},
"execution_policies":[
{
"name": "main",
"runner": "php",
"execute": {
"target": "main",
"working_directory": "%CWD%",
"tty": 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",
"description": "ConfigLib is a library for reading and writing configuration files via the NCC Runtime API",
"version": "1.0.1",
"uuid": "9347259e-8e4d-11ed-85a7-fd07cf28ef35"
},
"build": {
"source_path": "src",
"default_configuration": "release",
"main": "main_policy",
"main": "main",
"define_constants": {
"VERSION": "%ASSEMBLY.VERSION%"
"version": "%ASSEMBLY.VERSION%"
},
"dependencies": [
{
"name": "net.nosial.optslib",
"version": "latest",
"source": "nosial/optslib=latest@github"
"source_type": "remote",
"source": "nosial/libs.opts=latest@n64"
},
{
"name": "net.nosial.loglib2",
"name": "net.nosial.loglib",
"version": "latest",
"source": "nosial/loglib2=latest@github"
"source_type": "remote",
"source": "nosial/libs.log=latest@n64"
},
{
"name": "com.symfony.filesystem",
"version": "latest",
"source": "symfony/filesystem=latest@packagist"
"source_type": "remote",
"source": "symfony/filesystem=latest@composer"
},
{
"name": "com.symfony.yaml",
"version": "latest",
"source": "symfony/yaml=latest@packagist"
"source_type": "remote",
"source": "symfony/yaml=latest@composer"
},
{
"name": "com.symfony.process",
"version": "latest",
"source": "symfony/process=latest@packagist"
"source_type": "remote",
"source": "symfony/process=latest@composer"
}
],
"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": {
"ncc_configuration": "release"
}
},
{
"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"
}
"output_path": "build/release"
}
]
},
"execution_policies": [
{
"name": "main",
"runner": "php",
"execute": {
"working_directory": "%CWD%",
"silent": false,
"tty": true,
"timeout": null,
"idle_timeout": null,
"target": "main"
}
},
{
"name": "main_policy",
"runner": "php",
"execute": {
"working_directory": "%CWD%",
"silent": false,
"tty": true,
"timeout": null,
"idle_timeout": null,
"target": "main"
}
}
]
}
}
}

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
/** @noinspection PhpMissingFieldTypeInspection */
namespace ConfigLib;
use Exception;
use LogLib2\Logger;
use LogLib\Log;
use ncc\Runtime;
use RuntimeException;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Yaml\Yaml;
class Configuration
{
/**
* The logger of the class
* @var Logger
*/
private Logger $logger;
/**
* The name of the configuration
* @var string|array
*
* @var string
*/
private string|array $name;
private $name;
/**
* The path to the configuration file
* @var string|null
*
* @var string
*/
private ?string $path;
private $path;
/**
* The configuration data
*
* @var array
*/
private array $configuration;
private $configuration;
/**
* Indicates if the current instance is modified
*
* @var bool
*/
private bool $modified;
private $modified;
/**
* Public Constructor
*
* @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
$name = strtolower($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(file_exists($env))
@ -64,97 +61,21 @@
}
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', $environment_config));
}
}
if($path !== null)
if($this->path === null)
{
if(!is_dir(dirname($path)))
// Figure out the path to the configuration file
try
{
throw new RuntimeException(sprintf('Directory "%s" does not exist', dirname($path)));
$this->path = Runtime::getDataPath('net.nosial.configlib') . DIRECTORY_SEPARATOR . $name . '.conf';
}
if(!is_writable(dirname($path)))
catch (Exception $e)
{
throw new RuntimeException(sprintf('Directory "%s" is not writable', dirname($path)));
throw new RuntimeException('Unable to load package "net.nosial.configlib"', $e);
}
$this->path = $path;
}
if ($this->path === null)
{
$filePath = $name . '.conf';
// If the CONFIGLIB_PATH environment variable is set, use it as the configuration path
if(getenv('CONFIGLIB_PATH'))
{
$configDir = getenv('CONFIGLIB_PATH');
}
else
{
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN')
{
$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
@ -171,7 +92,7 @@
}
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);
}
}
@ -184,12 +105,14 @@
/**
* Validates a key syntax (e.g. "key1.key2.key3")
*
* @param string $input The key to validate
* @return bool True if the key is valid, false otherwise
* @param string $input
* @return 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;
}
@ -197,6 +120,35 @@
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
*
@ -205,9 +157,9 @@
* @return mixed The value of the key or the default value
* @noinspection PhpUnused
*/
public function get(string $key, mixed $default = null): mixed
public function get(string $key, mixed $default=null): mixed
{
if (!self::validateKey($key))
if(!self::validateKey($key))
{
return $default;
}
@ -227,8 +179,8 @@
}
}
// Return the value at the end of the path, or the default if the value is null
return $current ?? $default;
// Return the value at the end of the path
return $current;
}
/**
@ -239,10 +191,9 @@
* @param bool $create If true, the key will be created if it does not exist
* @return bool True if the value was set, false otherwise
*/
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;
}
@ -250,71 +201,37 @@
$path = explode('.', $key);
$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];
}
if (!array_key_exists($keyPart, $current))
elseif($create)
{
if ($create)
{
$current[$keyPart] = [];
}
else
{
return false;
}
}
$current = &$current[$keyPart];
}
$current = $value;
$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];
$current[$key_value] = [];
$current = &$current[$key_value];
}
else
{
return false;
}
}
$current = $value;
$this->modified = true;
return true;
}
/**
* 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 mixed $value The value to set
* @return bool True if the value was set, false otherwise
* @param string $key
* @param mixed $value
* @return bool
*/
public function setDefault(string $key, mixed $value): bool
{
@ -326,11 +243,42 @@
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
*
* @return void
* @noinspection PhpUnused
*/
public function clear(): void
{
@ -363,14 +311,15 @@
}
$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
*
* @param bool $force If true, the configuration will be reloaded even if it was not modified
* @param bool $force
* @return void
* @noinspection PhpUnused
*/
public function load(bool $force=false): void
{
@ -379,23 +328,15 @@
return;
}
$fs = new Filesystem();
// If the configuration file is a YAML file, import it instead
if(str_ends_with($this->path, '.yaml') || str_ends_with($this->path, '.yml'))
{
if(!$fs->exists($this->path))
{
throw new RuntimeException(sprintf('Unable to import configuration file "%s" from environment, file does not exist', $this->path));
}
$yaml = file_get_contents($this->path);
$this->configuration = Yaml::parse($yaml);
$this->import($this->path);
return;
}
$fs = new Filesystem();
if (!$fs->exists($this->path))
{
return;
@ -411,47 +352,14 @@
throw new RuntimeException('Unable to read configuration file', $e);
}
$prefix = 'CONFIGLIB_' . strtoupper($this->name) . '_';
foreach (getenv() as $key => $value)
{
if (str_starts_with($key, $prefix))
{
// Remove the prefix and split the rest of the key into parts
$path = explode('_', str_replace($prefix, '', $key));
$current = &$this->configuration;
// Navigate to the parent of the value to set, except for the last part
foreach ($path as $index => $key_value)
{
$key_value = strtolower($key_value); // Convert to lowercase if needed
if ($index < count($path) - 1)
{
if (!is_array($current) || !array_key_exists($key_value, $current))
{
$current[$key_value] = [];
}
$current = &$current[$key_value];
}
else
{
// Set the value for the last part of the path
$current[$key_value] = $value;
}
}
}
}
$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
*
* @return string The name of the configuration
* @return string
* @noinspection PhpUnused
*/
public function getName(): string
@ -462,7 +370,7 @@
/**
* Returns the path of the configuration file on disk
*
* @return string The path of the configuration file
* @return string
*/
public function getPath(): string
{
@ -472,7 +380,7 @@
/**
* Returns the configuration
*
* @return array The configuration
* @return array
* @noinspection PhpUnused
*/
public function getConfiguration(): array
@ -483,11 +391,11 @@
/**
* Returns a formatted yaml string of the current configuration
*
* @return string The configuration in YAML format
* @return string
*/
public function toYaml(): string
{
return Yaml::dump($this->configuration, 4);
return Yaml::dump($this->configuration, 4, 2);
}
/**
@ -503,7 +411,7 @@
}
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 +419,7 @@
/**
* Imports a YAML file into the configuration
*
* @param string $path The path to the YAML file
* @param string $path
* @return void
*/
public function import(string $path): void
@ -533,7 +441,7 @@
/**
* Exports the configuration to a YAML file
*
* @param string $path The path to export the configuration to
* @param string $path
* @return void
*/
public function export(string $path): void

View file

@ -4,18 +4,20 @@
use Exception;
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 RuntimeException;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Process\Process;
use Symfony\Component\Yaml\Exception\ParseException;
use Symfony\Component\Yaml\Yaml;
use function trigger_error;
class Program
{
private static ?string $version = null;
/**
* Main entry point of the program
*
@ -38,7 +40,6 @@
$editor = $args['editor'] ?? @$args['e'] ?? null;
$export = $args['export'] ?? null;
$import = $args['import'] ?? null;
$path = $args['path'] ?? null;
if($configuration_name === null)
{
@ -52,16 +53,9 @@
if(!file_exists($configuration->getPath()))
{
print(sprintf('Configuration \'%s\' does not exist, aborting' . PHP_EOL, $configuration->getName()));
exit(1);
}
if($path !== null)
{
print($configuration->getPath() . PHP_EOL);
exit(0);
}
if($import !== null)
{
try
@ -151,7 +145,7 @@
*/
#[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(' -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(' --export <file> (Optional) Exports the configuration to 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('Examples:' . PHP_EOL . PHP_EOL);
@ -171,7 +164,6 @@
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 --import in.json Import a configuration' . PHP_EOL);
print(' configlib --conf test --path Displays the configuration storage path' . PHP_EOL);
exit(0);
}
@ -182,6 +174,10 @@
* @param array $args
* @param Configuration $configuration
* @return void
* @throws InvalidPackageNameException
* @throws InvalidScopeException
* @throws PackageLockException
* @throws PackageNotFoundException
*/
#[NoReturn] private static function edit(array $args, Configuration $configuration): void
{
@ -200,22 +196,21 @@
}
else
{
$temporary_directory = sys_get_temp_dir();
if(!file_exists($temporary_directory . DIRECTORY_SEPARATOR . 'configlib'))
if(!file_exists(Runtime::getDataPath('net.nosial.configlib') . DIRECTORY_SEPARATOR . 'tmp'))
{
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));
}
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);
exit(1);
}
}
$tempPath = $temporary_directory . DIRECTORY_SEPARATOR . 'configlib';
$tempPath = Runtime::getDataPath('net.nosial.configlib') . DIRECTORY_SEPARATOR . 'tmp';
}
$fs = new Filesystem();
@ -281,30 +276,4 @@
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();