Compare commits

...

153 commits

Author SHA1 Message Date
88ec33ff1a
Update CHANGELOG.md and Configuration class to use LogLib2
Some checks are pending
CI / release (push) Waiting to run
CI / debug (push) Waiting to run
CI / release-executable (push) Waiting to run
CI / debug-executable (push) Waiting to run
CI / release_executable (push) Waiting to run
CI / debug_executable (push) Waiting to run
CI / check-phpunit (push) Waiting to run
CI / check-phpdoc (push) Waiting to run
CI / generate-phpdoc (push) Blocked by required conditions
CI / test (push) Blocked by required conditions
CI / release-documentation (push) Blocked by required conditions
CI / release-artifacts (push) Blocked by required conditions
- Added entry for version 1.1.7 in CHANGELOG.md
- Updated remote references for dependencies
- Changed logger implementation in Configuration class to use LogLib2
2025-03-14 15:00:35 -04:00
bf71326090
Updated README.md
Some checks are pending
CI / release (push) Waiting to run
CI / debug (push) Waiting to run
CI / release-executable (push) Waiting to run
CI / debug-executable (push) Waiting to run
CI / release_executable (push) Waiting to run
CI / debug_executable (push) Waiting to run
CI / check-phpunit (push) Waiting to run
CI / check-phpdoc (push) Waiting to run
CI / generate-phpdoc (push) Blocked by required conditions
CI / test (push) Blocked by required conditions
CI / release-documentation (push) Blocked by required conditions
CI / release-artifacts (push) Blocked by required conditions
2025-03-11 14:24:20 -04:00
netkas
936485dde7 - 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.
 - Changed properties to become typed properties
2025-01-07 21:14:03 -05:00
netkas
6966fd39d0 Bumped version to 1.1.6 2025-01-07 21:08:11 -05:00
netkas
09b2e88e1c Updated CHANGELOG.md 2024-12-27 15:33:59 -05:00
netkas
561064261c Version fast-forward 2024-12-27 15:32:00 -05:00
netkas
faad3e69de Minor correction 2024-12-27 15:30:08 -05:00
netkas
9e97a6d414 Refactor build process and streamline executable handling 2024-12-27 15:27:57 -05:00
netkas
015f13bf12 Updated CHANGELOG.md 2024-12-27 15:25:49 -05:00
netkas
514d527923 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	.idea/php.xml
#	CHANGELOG.md
#	project.json
#	src/ConfigLib/Configuration.php
2024-12-27 15:25:30 -05:00
netkas
489196267e Bumped version to 1.1.2 2024-12-27 15:20:56 -05:00
netkas
994d4092fc Updated project 2024-12-27 15:20:42 -05:00
netkas
579813315b Add support for CONFIGLIB_PATH environment variable 2024-12-27 15:20:36 -05:00
netkas
28d67deaa8 Deleted unused ci.yml 2024-10-29 00:30:11 -04:00
netkas
3285bec11f Merge remote-tracking branch 'origin/master'
# Conflicts:
#	.github/workflows/ci.yml
#	Makefile
2024-10-29 00:27:32 -04:00
netkas
37a8918198 Updated CHANGELOG.md 2024-10-29 00:26:37 -04:00
netkas
8d6a2c33bd Fixed regex pattern for configuration properties being considered invalid when they contain an underscore. 2024-10-29 00:26:37 -04:00
netkas
6b446ce54a Bumped version to 1.1.4 2024-10-29 00:26:37 -04:00
e704df03df Updated Build System 2024-10-29 00:26:37 -04:00
a7395e4663 Updated Build System 2024-10-29 00:26:37 -04:00
d309385993 Updated Build System 2024-10-29 00:26:37 -04:00
655eca1695 Updated build system 2024-10-29 00:26:37 -04:00
1bcd09cc1e Updated .gitignore 2024-10-29 00:26:37 -04:00
dea75c9eeb Updated build system 2024-10-29 00:26:37 -04:00
5b6be331f0 Updated .gitignore 2024-10-29 00:26:37 -04:00
d56d940da2 Updated build system 2024-10-29 00:26:37 -04:00
1f9c5576e0 Updated build system 2024-10-29 00:26:37 -04:00
876a33ffc7 Added phpdoc.dist.xml 2024-10-29 00:26:37 -04:00
b9679d168f Updated build system 2024-10-29 00:26:37 -04:00
4b05581bb6 Updated build system 2024-10-29 00:26:37 -04:00
742be22eac Bumped Version 2024-10-29 00:26:37 -04:00
aa6dca302f Added upload-dcs stage 2024-10-29 00:26:37 -04:00
b19eeb6720 Updated Build System 2024-10-29 00:26:37 -04:00
netkas
ff2296c786 Fix configuration path resolution and add setup script 2024-10-29 00:26:37 -04:00
netkas
2c05ae8b3c Updated CHANGELOG.md 2024-10-29 00:26:37 -04:00
netkas
beb133dc75 Update version and improve config validation 2024-10-29 00:26:35 -04:00
netkas
6eb1f68f98 Updated ci.yml 2024-10-29 00:26:33 -04:00
netkas
26d2b0acd8 Remove redundant --build-source flag from build steps 2024-10-29 00:26:33 -04:00
netkas
cfbbed5c4a Add --build-source flag to ncc build commands 2024-10-29 00:26:30 -04:00
netkas
230f865093 Updated CHANGELOG.md 2024-10-29 00:26:23 -04:00
e4c494ef58 Bumped version to 1.1.1 2024-10-29 00:26:07 -04:00
376e334cb5 Added upload-docs stage 2024-10-29 00:26:07 -04:00
3c89ebe4a1 Updated Build System 2024-10-29 00:26:07 -04:00
539a180f76 Updated Build System 2024-10-29 00:26:07 -04:00
netkas
6660af9fda Add --path option to display configuration storage path 2024-10-29 00:26:07 -04:00
netkas
02d1cdc8d0 Upgrade PHP configuration to version 8.3 2024-10-29 00:26:07 -04:00
netkas
c51ee499be Refactor Makefile for flexibility and maintenance 2024-10-29 00:26:07 -04:00
netkas
a223dabc28 Updated .gitignore 2024-10-29 00:26:07 -04:00
netkas
58cc299536 Add exit check and update project include paths 2024-10-29 00:26:07 -04:00
netkas
93db7fcd2c Removed test.yml 2024-10-29 00:26:07 -04:00
netkas
ed6d1f191c Refactor temp directory handling and add getVersion method 2024-10-29 00:26:07 -04:00
netkas
389b38283e Fix case inconsistency in project.json configuration schema 2024-10-29 00:26:07 -04:00
Netkas
0caabd860d Update test.yml 2024-10-29 00:26:07 -04:00
Netkas
0f6980bc8a Update test.yml 2024-10-29 00:26:07 -04:00
Netkas
14dfb45e98 Update test.yml 2024-10-29 00:26:07 -04:00
Netkas
58ddce6918 Update test.yml 2024-10-29 00:26:07 -04:00
Netkas
12acabe9b1 Update test.yml 2024-10-29 00:26:07 -04:00
Netkas
ad4805643b Update test.yml 2024-10-29 00:26:07 -04:00
Netkas
2d7c840468 Update test.yml 2024-10-29 00:26:07 -04:00
Netkas
f9d96524e9 Create test.yml 2024-10-29 00:26:07 -04:00
netkas
76ca3f5290 Updated CHANGELOG.md 2024-10-29 00:23:18 -04:00
netkas
0d823c88e7 Fixed regex pattern for configuration properties being considered invalid when they contain an underscore. 2024-10-29 00:23:02 -04:00
netkas
e96695a5d8 Bumped version to 1.1.4 2024-10-25 20:01:15 -04:00
65125c496a Updated Build System 2024-10-13 14:41:27 -04:00
cd4ea10fd6 Updated Build System 2024-10-13 14:35:54 -04:00
bb4a93a364 Updated Build System 2024-10-13 14:32:41 -04:00
2c33fa2f49 Updated build system 2024-10-13 14:26:02 -04:00
8dc2d1c70d Updated .gitignore 2024-10-13 14:23:36 -04:00
56f57f89de Updated build system 2024-10-13 14:23:16 -04:00
19935179a0 Updated .gitignore 2024-10-13 14:17:27 -04:00
1eae8df0e3 Updated build system 2024-10-13 14:17:17 -04:00
371c486c4f Updated build system 2024-10-13 13:37:02 -04:00
7411563758 Added phpdoc.dist.xml 2024-10-13 13:33:37 -04:00
84ad9a9fb3 Updated build system 2024-10-13 13:32:34 -04:00
870a8d6b4e Updated build system 2024-10-13 13:26:57 -04:00
ec741fd3ef Bumped Version 2024-10-13 12:50:47 -04:00
3cf70a1f2b Added upload-dcs stage 2024-10-13 12:50:03 -04:00
a19f372150 Updated Build System 2024-10-13 12:49:20 -04:00
af03b4ffda Merge branch 'master' into dev
# Conflicts:
#	.github/workflows/ci.yml
#	CHANGELOG.md
#	Makefile
#	project.json
2024-10-13 12:48:50 -04:00
94ba9a93df Bumped version to 1.1.1 2024-10-13 12:48:02 -04:00
2fd12137ae Added upload-docs stage 2024-10-13 12:46:52 -04:00
b568f75d0b Updated Build System 2024-10-13 12:39:36 -04:00
d75fbd72d2 Updated Build System 2024-10-12 20:52:22 -04:00
netkas
b8e83d31bc Fix configuration path resolution and add setup script 2024-09-27 13:18:53 -04:00
netkas
489df9f79a Updated CHANGELOG.md 2024-09-26 14:58:09 -04:00
netkas
2f41614d20 Update version and improve config validation 2024-09-26 14:57:27 -04:00
netkas
698e2cb334 Updated ci.yml 2024-09-23 18:50:08 -04:00
netkas
b5874371b1 Remove redundant --build-source flag from build steps 2024-09-23 13:53:02 -04:00
netkas
0c837c6b54 Add --build-source flag to ncc build commands 2024-09-23 13:50:21 -04:00
netkas
386e137547 Updated CHANGELOG.md 2024-09-23 13:48:41 -04:00
netkas
e3b2a3cf9a Add --path option to display configuration storage path 2024-09-23 13:44:19 -04:00
netkas
9f98b4c9b8 Upgrade PHP configuration to version 8.3 2024-09-23 13:44:10 -04:00
netkas
1b94a273b7 Refactor Makefile for flexibility and maintenance 2024-09-23 13:44:01 -04:00
netkas
649d04d8aa Updated .gitignore 2024-09-23 13:37:07 -04:00
netkas
6cdc2336cd Add exit check and update project include paths 2024-09-20 18:41:47 -04:00
netkas
b34005af1b Removed test.yml 2024-09-19 14:01:22 -04:00
netkas
a259f45684 Refactor temp directory handling and add getVersion method 2024-09-19 14:01:10 -04:00
netkas
4299096a09 Fix case inconsistency in project.json configuration schema 2024-09-19 14:00:33 -04:00
Netkas
93efe5741a
Update test.yml 2024-09-17 16:54:34 -04:00
Netkas
0f5036742f
Update test.yml 2024-09-17 16:52:05 -04:00
Netkas
20441809cc
Update test.yml 2024-09-17 16:50:34 -04:00
Netkas
5a24645f09
Update test.yml 2024-09-17 16:39:56 -04:00
Netkas
6abf687e93
Update test.yml 2024-09-17 16:38:06 -04:00
Netkas
a3c9fe41f3
Update test.yml 2024-09-17 16:37:27 -04:00
Netkas
8042e50863
Update test.yml 2024-09-17 16:36:28 -04:00
Netkas
276aec0df6
Create test.yml 2024-09-17 16:33:03 -04:00
badPointer
02d6c75bf3 chore: fix artifacts again 2024-09-17 19:20:51 +00:00
badPointer
b5c7d08e57 chore: fix stages 2024-09-17 19:17:51 +00:00
badPointer
6420b9bfed chore: fix artifact pass 2024-09-17 19:15:48 +00:00
badPointer
bdf6021953 feat: add test stage 2024-09-17 19:12:50 +00:00
badPointer
287d86e9e9 chore: fix builds 2024-09-17 19:08:43 +00:00
sw5ciprl
1c3988206e
Update ci.yml 2024-09-17 21:55:21 +03:00
sw5ciprl
770e327f1a
Update ci.yml 2024-09-17 21:50:32 +03:00
sw5ciprl
64fb1a4bfe
Update ci.yml 2024-09-17 21:47:42 +03:00
netkas
25aba53494 Updated project.json & ci.yml 2024-09-17 14:33:27 -04:00
netkas
fa8a8ea84c Update test stage to ci 2024-09-17 14:29:36 -04:00
netkas
b651079fb5 Update test stage to ci 2024-09-17 14:27:59 -04:00
netkas
2e21dbc2cd Update test stage to ci 2024-09-17 14:24:15 -04:00
netkas
385000907e Added test stage to ci 2024-09-17 14:21:28 -04:00
netkas
414fd0a781 Update CI workflow for main branch and release events 2024-09-17 14:15:11 -04:00
netkas
311132e765 Update CI workflow for main branch and release events 2024-09-17 14:09:22 -04:00
netkas
ad0c7f3e06 Update CI workflow for main branch and release events 2024-09-17 14:06:53 -04:00
netkas
5f52e7dd9e Update CI workflow for main branch and release events 2024-09-17 14:02:28 -04:00
netkas
45b7879186 Update CI workflow for main branch and release events 2024-09-17 13:58:20 -04:00
netkas
9bc1f86e25 Update CI workflow for main branch and release events 2024-09-17 13:55:36 -04:00
netkas
ffc91de77e Update CI workflow for main branch and release events 2024-09-17 13:49:46 -04:00
netkas
17f95d619f Update CI workflow for main branch and release events 2024-09-17 13:46:33 -04:00
netkas
6a4e3de7a3 Update CI workflow for main branch and release events 2024-09-17 13:36:25 -04:00
netkas
cbd4b459bb Update CI workflow for main branch and release events 2024-09-17 13:29:40 -04:00
netkas
813e2c4594 Update CI workflow for main branch and release events 2024-09-17 13:24:47 -04:00
netkas
41ad1ae694 Updated GitHub workflow to dynamically find ncc's build output path. 2024-09-17 13:18:20 -04:00
netkas
93b06e8b00 Added GitHub CI workflow (experimental) 2024-09-17 13:09:31 -04:00
netkas
97404dc382 Bumped ci version to php8.3 2024-09-17 13:01:37 -04:00
netkas
fbff562545 Reverted .gitlab-ci.yml 2024-09-17 12:47:38 -04:00
netkas
a1a6ae01a3 Add Debian sid repository and install phpab 2024-09-17 12:20:52 -04:00
netkas
8c6313c687 Update PHP version in GitLab CI configuration. 2024-09-17 12:18:08 -04:00
netkas
a56622b82a Simplify CI setup by changing phpab installation method 2024-09-17 12:15:34 -04:00
netkas
4224342369 Add .idea/php-test-framework.xml to .gitignore 2024-09-17 12:03:39 -04:00
netkas
65fee96352 Add new PHP include paths and PhpUnit configuration 2024-09-17 12:03:24 -04:00
netkas
06b05c350a Update project version and refine build configurations 2024-09-17 12:03:01 -04:00
netkas
d44020aacf Refactor ConfigLib and remove outdated tests 2024-09-17 12:02:41 -04:00
netkas
b405190389 Add PHPUnit configuration and bootstrap files
Introduced `phpunit.xml` for setting up our PHPUnit test suite with essential settings. Also added `bootstrap.php` to require necessary dependencies and import the `ConfigLib` library. This allows for a standardized testing environment and smoother test execution.
2024-09-17 12:00:36 -04:00
ec3a7834c6
Revert "Corrected CHANGELOG.md"
This reverts commit 85f0aab16b.
2023-08-13 19:00:29 -04:00
85f0aab16b
Corrected CHANGELOG.md 2023-08-13 18:10:58 -04:00
906e168ade
Updated CHANGELOG.md 2023-08-12 08:56:18 -04:00
a48ee620c7
Updated README.md 2023-08-12 08:50:54 -04:00
7d7ab112b6
Updated README.md 2023-08-12 08:50:25 -04:00
544b9f2e1c
Added the ability to override configuration properties with environment variables using the format CONFIGLIB_<CONFIG_NAME>_<PROPERTY_NAME> 2023-08-12 08:39:02 -04:00
b26d818d6b
Corrected a few lines of code in regards to missing variable definitions 2023-08-12 02:20:40 -04:00
8835ad9702
Bumped version to 1.0.4 2023-08-12 01:54:59 -04:00
3224bcc44a
Corrected version 2023-08-12 01:54:27 -04:00
fbf86f7a92
Updated CHANGELOG.md 2023-08-12 01:53:41 -04:00
5afae885db
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 2023-07-13 17:05:32 -04:00
19 changed files with 1311 additions and 227 deletions

552
.github/workflows/ncc_workflow.yml vendored Normal file
View file

@ -0,0 +1,552 @@
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 +1,5 @@
build/
build/
/.idea/php-test-framework.xml
/.idea/gbrowser_project.xml
/.phpunit.result.cache
/reports

View file

@ -1,9 +1,12 @@
image: php:8.1
image: php:8.3
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
@ -20,10 +23,17 @@ before_script:
- git clone https://git.n64.cc/nosial/ncc.git
- cd ncc
- make redist
- php build/src/INSTALL --auto --install-composer
- 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
- cd .. && rm -rf ncc
build:
stage: build
script:
- ncc build --config release --log-level debug
artifacts:
@ -31,6 +41,15 @@ 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,6 +5,7 @@
<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,19 +11,25 @@
</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.2" />
<component name="PhpProjectSharedConfiguration" php_language_level="8.3" />
<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,23 +5,127 @@ 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
@ -30,7 +134,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
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,8 +1,33 @@
build:
ncc build --config="release" --log-level debug
# Variables
DEFAULT_CONFIGURATION ?= release
LOG_LEVEL = debug
install:
sudo ncc package install --package="build/release/net.nosial.configlib.ncc" --skip-dependencies --reinstall -y --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
clean:
rm -rf build
rm -rf build
.PHONY: all install test clean release debug release-executable debug-executable release_executable debug_executable

View file

@ -1,21 +1,33 @@
# 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)
@ -30,6 +42,9 @@ file manually.
* [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 -->
@ -131,6 +146,8 @@ 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:
@ -143,6 +160,8 @@ 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:
@ -151,6 +170,8 @@ 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
@ -198,6 +219,37 @@ 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

3
bootstrap.php Normal file
View file

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

24
main
View file

@ -1,6 +1,24 @@
<?php
require('ncc');
import('net.nosial.configlib', 'latest');
if (PHP_SAPI !== 'cli')
{
print('net.nosial.configlib must be run from the command line.' . PHP_EOL);
exit(1);
}
\ConfigLib\Program::main();
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));

15
phpdoc.dist.xml Normal file
View file

@ -0,0 +1,15 @@
<?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>

11
phpunit.xml Normal file
View file

@ -0,0 +1,11 @@
<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,6 +5,9 @@
"minimum_version": "8.0",
"maximum_version": "8.2"
},
"options": {
"create_symlink": true
},
"update_source": {
"source": "nosial/libs.config@n64",
"repository": {
@ -13,75 +16,126 @@
"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",
"description": "ConfigLib is a library for reading and writing configuration files via the NCC Runtime API",
"version": "1.0.1",
"version": "1.1.7",
"uuid": "9347259e-8e4d-11ed-85a7-fd07cf28ef35"
},
"build": {
"source_path": "src",
"default_configuration": "release",
"main": "main",
"main": "main_policy",
"define_constants": {
"version": "%ASSEMBLY.VERSION%"
"VERSION": "%ASSEMBLY.VERSION%"
},
"dependencies": [
{
"name": "net.nosial.optslib",
"version": "latest",
"source_type": "remote",
"source": "nosial/libs.opts=latest@n64"
"source": "nosial/optslib=latest@github"
},
{
"name": "net.nosial.loglib",
"name": "net.nosial.loglib2",
"version": "latest",
"source_type": "remote",
"source": "nosial/libs.log=latest@n64"
"source": "nosial/loglib2=latest@github"
},
{
"name": "com.symfony.filesystem",
"version": "latest",
"source_type": "remote",
"source": "symfony/filesystem=latest@composer"
"source": "symfony/filesystem=latest@packagist"
},
{
"name": "com.symfony.yaml",
"version": "latest",
"source_type": "remote",
"source": "symfony/yaml=latest@composer"
"source": "symfony/yaml=latest@packagist"
},
{
"name": "com.symfony.process",
"version": "latest",
"source_type": "remote",
"source": "symfony/process=latest@composer"
"source": "symfony/process=latest@packagist"
}
],
"configurations": [
{
"name": "release",
"output_path": "build/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"
}
}
]
}
}
},
"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 Normal file
View file

@ -0,0 +1,14 @@
<?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,12 +1,9 @@
<?php
/** @noinspection PhpMissingFieldTypeInspection */
namespace ConfigLib;
use Exception;
use LogLib\Log;
use ncc\Runtime;
use LogLib2\Logger;
use RuntimeException;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Yaml\Yaml;
@ -14,45 +11,51 @@
class Configuration
{
/**
* The name of the configuration
*
* @var string
* The logger of the class
* @var Logger
*/
private $name;
private Logger $logger;
/**
* The name of the configuration
* @var string|array
*/
private string|array $name;
/**
* The path to the configuration file
*
* @var string
* @var string|null
*/
private $path;
private ?string $path;
/**
* The configuration data
*
* @var array
*/
private $configuration;
private array $configuration;
/**
* Indicates if the current instance is modified
*
* @var bool
*/
private $modified;
private bool $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')
public function __construct(string $name='default', ?string $path=null)
{
$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;
if($env !== false)
{
if(file_exists($env))
@ -61,21 +64,97 @@
}
else
{
Log::warning('net.nosial.configlib', sprintf('Environment variable "%s" points to a non-existent file, resorting to default/builtin configuration', $environment_config));
$this->logger->warning(sprintf('Environment variable "%s" points to a non-existent file, resorting to default/builtin configuration', $env));
}
}
if($this->path === null)
if($path !== null)
{
// Figure out the path to the configuration file
try
if(!is_dir(dirname($path)))
{
$this->path = Runtime::getDataPath('net.nosial.configlib') . DIRECTORY_SEPARATOR . $name . '.conf';
throw new RuntimeException(sprintf('Directory "%s" does not exist', dirname($path)));
}
catch (Exception $e)
if(!is_writable(dirname($path)))
{
throw new RuntimeException('Unable to load package "net.nosial.configlib"', $e);
throw new RuntimeException(sprintf('Directory "%s" is not writable', dirname($path)));
}
$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
@ -92,7 +171,7 @@
}
catch(Exception $e)
{
Log::error('net.nosial.configlib', sprintf('Unable to load configuration "%s", %s', $this->name, $e->getMessage()));
$this->logger->error(sprintf('Unable to load configuration "%s", %s', $this->name, $e->getMessage()), $e);
throw new RuntimeException(sprintf('Unable to load configuration "%s"', $this->name), $e);
}
}
@ -105,14 +184,12 @@
/**
* Validates a key syntax (e.g. "key1.key2.key3")
*
* @param string $input
* @return bool
* @param string $input The key to validate
* @return bool True if the key is valid, false otherwise
*/
private static function validateKey(string $input): bool
{
$pattern = '/^([a-zA-Z]+\.?)+$/';
if (preg_match($pattern, $input))
if (preg_match('/^[a-zA-Z0-9_]+(\.[a-zA-Z0-9_]+)*$/', $input))
{
return true;
}
@ -120,35 +197,6 @@
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
*
@ -157,9 +205,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;
}
@ -179,8 +227,8 @@
}
}
// Return the value at the end of the path
return $current;
// Return the value at the end of the path, or the default if the value is null
return $current ?? $default;
}
/**
@ -191,9 +239,10 @@
* @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
{
if(!self::validateKey($key))
// Validate the provided key
if (!self::validateKey($key))
{
return false;
}
@ -201,37 +250,71 @@
$path = explode('.', $key);
$current = &$this->configuration;
// Navigate to the parent of the value to set
foreach ($path as $key_value)
foreach ($path as $keyPart)
{
if (is_array($current) && array_key_exists($key_value, $current))
if (!is_array($current))
{
$current = &$current[$key_value];
$current = [];
}
elseif($create)
if (!array_key_exists($keyPart, $current))
{
$current[$key_value] = [];
$current = &$current[$key_value];
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];
}
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
* @param mixed $value
* @return bool
* @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
*/
public function setDefault(string $key, mixed $value): bool
{
@ -243,42 +326,11 @@
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
{
@ -311,15 +363,14 @@
}
$this->modified = false;
Log::debug('net.nosial.configlib', sprintf('Configuration "%s" saved', $this->name));
$this->logger->debug(sprintf('Configuration "%s" saved', $this->name));
}
/**
* Loads the Configuration File from the disk
*
* @param bool $force
* @param bool $force If true, the configuration will be reloaded even if it was not modified
* @return void
* @noinspection PhpUnused
*/
public function load(bool $force=false): void
{
@ -328,15 +379,23 @@
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'))
{
$this->import($this->path);
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);
return;
}
$fs = new Filesystem();
if (!$fs->exists($this->path))
{
return;
@ -352,14 +411,47 @@
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;
Log::debug('net.nosial.configlib', 'Loaded configuration file: ' . $this->path);
$this->logger->debug('Loaded configuration file: ' . $this->path);
}
/**
* Returns the name of the configuration
*
* @return string
* @return string The name of the configuration
* @noinspection PhpUnused
*/
public function getName(): string
@ -370,7 +462,7 @@
/**
* Returns the path of the configuration file on disk
*
* @return string
* @return string The path of the configuration file
*/
public function getPath(): string
{
@ -380,7 +472,7 @@
/**
* Returns the configuration
*
* @return array
* @return array The configuration
* @noinspection PhpUnused
*/
public function getConfiguration(): array
@ -391,11 +483,11 @@
/**
* Returns a formatted yaml string of the current configuration
*
* @return string
* @return string The configuration in YAML format
*/
public function toYaml(): string
{
return Yaml::dump($this->configuration, 4, 2);
return Yaml::dump($this->configuration, 4);
}
/**
@ -411,7 +503,7 @@
}
catch(Exception $e)
{
Log::error('net.nosial.configlib', sprintf('Unable to save configuration "%s" to disk, %s', $this->name, $e->getMessage()));
$this->logger->error(sprintf('Unable to save configuration "%s" to disk, %s', $this->name, $e->getMessage()), $e);
}
}
}
@ -419,7 +511,7 @@
/**
* Imports a YAML file into the configuration
*
* @param string $path
* @param string $path The path to the YAML file
* @return void
*/
public function import(string $path): void
@ -441,7 +533,7 @@
/**
* Exports the configuration to a YAML file
*
* @param string $path
* @param string $path The path to export the configuration to
* @return void
*/
public function export(string $path): void

View file

@ -4,20 +4,18 @@
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
*
@ -40,6 +38,7 @@
$editor = $args['editor'] ?? @$args['e'] ?? null;
$export = $args['export'] ?? null;
$import = $args['import'] ?? null;
$path = $args['path'] ?? null;
if($configuration_name === null)
{
@ -53,9 +52,16 @@
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
@ -145,7 +151,7 @@
*/
#[NoReturn] private static function help(): void
{
print('ConfigLib v' . Runtime::getConstant('net.nosial.configlib', 'version') . PHP_EOL . PHP_EOL);
print('ConfigLib v' . self::getVersion() . PHP_EOL . PHP_EOL);
print('Usage: configlib [options]' . PHP_EOL);
print(' -h, --help Displays the help menu' . PHP_EOL);
@ -155,6 +161,7 @@
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);
@ -164,6 +171,7 @@
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);
}
@ -174,10 +182,6 @@
* @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
{
@ -196,21 +200,22 @@
}
else
{
if(!file_exists(Runtime::getDataPath('net.nosial.configlib') . DIRECTORY_SEPARATOR . 'tmp'))
$temporary_directory = sys_get_temp_dir();
if(!file_exists($temporary_directory . DIRECTORY_SEPARATOR . 'configlib'))
{
if (!mkdir($concurrentDirectory = Runtime::getDataPath('net.nosial.configlib') . DIRECTORY_SEPARATOR . 'tmp', 0777, true) && !is_dir($concurrentDirectory))
if (!mkdir($concurrentDirectory = $temporary_directory . DIRECTORY_SEPARATOR . 'configlib', 0777, true) && !is_dir($concurrentDirectory))
{
throw new RuntimeException(sprintf('Directory "%s" was not created', $concurrentDirectory));
}
if(!file_exists(Runtime::getDataPath('net.nosial.configlib') . DIRECTORY_SEPARATOR . 'tmp'))
if(!file_exists($temporary_directory . DIRECTORY_SEPARATOR . 'configlib'))
{
print('Unable to create the temporary path to use' . PHP_EOL);
exit(1);
}
}
$tempPath = Runtime::getDataPath('net.nosial.configlib') . DIRECTORY_SEPARATOR . 'tmp';
$tempPath = $temporary_directory . DIRECTORY_SEPARATOR . 'configlib';
}
$fs = new Filesystem();
@ -276,4 +281,30 @@
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

@ -0,0 +1,107 @@
<?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'));
}
}

View file

@ -1,14 +0,0 @@
<?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();

View file

@ -1,11 +0,0 @@
<?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();