Updated README.md

Added LICENSE
Added tests (Unfinished)
Added Codebase
Added .gitignore
Added .idea files
This commit is contained in:
Netkas 2022-12-14 04:28:12 -05:00
parent 2ce6ed5418
commit a24349b0b5
13 changed files with 366 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
build/

View file

@ -0,0 +1,26 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="IncorrectHttpHeaderInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="customHeaders">
<set>
<option value="Subject" />
<option value="Reply-To" />
<option value="X-JSON-Schema" />
<option value="X-JSON-Type" />
<option value="X-JSON-Path" />
<option value="X-Java-Type" />
<option value="X-Region-Id" />
<option value="X-GraphQL-Variables" />
<option value="X-SSH-Private-Key" />
<option value="X-Args-0" />
<option value="X-Args-1" />
<option value="X-Args-2" />
<option value="X-Args-3" />
<option value="X-Args-4" />
<option value="X-Args-5" />
</set>
</option>
</inspection_tool>
</profile>
</component>

8
.idea/modules.xml generated Normal file
View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/optslib.iml" filepath="$PROJECT_DIR$/.idea/optslib.iml" />
</modules>
</component>
</project>

11
.idea/optslib.iml generated Normal file
View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

19
.idea/php.xml generated Normal file
View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="MessDetectorOptionsConfiguration">
<option name="transferred" value="true" />
</component>
<component name="PHPCSFixerOptionsConfiguration">
<option name="transferred" value="true" />
</component>
<component name="PHPCodeSnifferOptionsConfiguration">
<option name="transferred" value="true" />
</component>
<component name="PhpProjectSharedConfiguration" php_language_level="7.0" />
<component name="PhpStanOptionsConfiguration">
<option name="transferred" value="true" />
</component>
<component name="PsalmOptionsConfiguration">
<option name="transferred" value="true" />
</component>
</project>

6
.idea/vcs.xml generated Normal file
View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

18
LICENSE Normal file
View file

@ -0,0 +1,18 @@
Copyright 2022 Nosial All Rights Reserved.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the Software
is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

14
Makefile Normal file
View file

@ -0,0 +1,14 @@
debug:
ncc build --config="debug"
release:
ncc build --config="release"
install:
ncc package install --package="build/release/net.nosial.optslib.ncc"
install-debug:
ncc package install --package="build/debug/net.nosial.optslib.ncc"
uninstall:
ncc package uninstall -y --package="net.nosial.optslib"

109
README.md Normal file
View file

@ -0,0 +1,109 @@
# OptsLib
A very simple Options parser and command-line arguments
handling library for PHP.
## Usage
The usage of this library is very simple, there are
two functions that you can use to parse options.
### parseArgument()
Can be used to parse a single argument string/array, this is useful for
parsing command line arguments. The second argument is the maximum number
of arguments that can be parsed, this is to prevent infinite loops.
```php
<?php
require_once('ncc');
import('net.nosial.optslib', 'latest');
$input = '--foo --bar="test" -y --username test';
$parsed = \OptsLib\Parse::parseArgument($input);
echo $parsed['foo']; // true
echo $parsed['bar']; // "test"
echo $parsed['y']; // true
echo $parsed['username']; // "test"
```
### getArguments()
This method is used to access the `$argv` array
if it's not set, an empty array is returned.
```php
<?php
require_once('ncc');
import('net.nosial.optslib', 'latest');
$arguments = \OptsLib\Parse::getArguments();
echo $arguments['output-file']; // "test.txt"
echo $arguments['input-file']; // "test.txt"
echo $arguments['log']; // "verbose"
```
## building
In order to use this library you need to install it
via `ncc`, this can be done using NCC's command-line
interface or mentioning this library in your `package.json`
file's dependencies, for instance:
```json
{
"dependencies": {
"net.nosial.optslib": "nosial/libs.opts=latest@n64"
}
}
```
If you don't have N64's repository added to your NCC
configuration, you can add it using the following command:
```bash
$ sudo ncc source add --name n64 --type gitlab --host git.n64.cc
```
Building is done using [NCC](https://git.n64.cc/nosial/ncc),
you can build it using the following command:
```bash
$ git clone https://git.n64.cc/nosial/libs/optslib.git
$ cd optlibs
$ ncc build --config release
# or
$ make release
```
### installing
Once you have built the library, you can install it using
the following command:
```bash
$ sudo ncc install -p="build/release/net.nosial.optslib.ncc"
# or
$ sudo make install
```
## License
This library is licensed under the MIT license, see the LICENSE file
for more information.
## Contributing
If you want to contribute to this project, you can do so by
creating a merge request on the [GitLab repository](https://git.n64.cc/nosial/libs/optslib).
## Contact
If you have any questions, you can contact us on [Telegram](https://t.me/NosialDiscussions).

42
project.json Normal file
View file

@ -0,0 +1,42 @@
{
"project": {
"compiler": {
"extension": "php",
"minimum_version": "8.0",
"maximum_version": "8.2"
},
"options": []
},
"assembly": {
"name": "OptsLib",
"package": "net.nosial.optslib",
"version": "1.0.0",
"uuid": "20aefdfa-7b91-11ed-919f-cb63712c8e36"
},
"build": {
"source_path": "src",
"default_configuration": "debug",
"define_constants": {
"ASSEMBLY_NAME": "%ASSEMBLY.NAME%",
"ASSEMBLY_PACKAGE": "%ASSEMBLY.PACKAGE%",
"ASSEMBLY_VERSION": "%ASSEMBLY.VERSION%",
"ASSEMBLY_UID": "%ASSEMBLY.UID%"
},
"configurations": [
{
"name": "debug",
"output_path": "build/debug",
"define_constants": {
"DEBUG": "1"
}
},
{
"name": "release",
"output_path": "build/release",
"define_constants": {
"DEBUG": "0"
}
}
]
}
}

104
src/OptsLib/Parse.php Normal file
View file

@ -0,0 +1,104 @@
<?php
namespace OptsLib;
class Parse
{
private static $Regex = "/(?(?=-)-(?(?=-)-(?'bigflag'[^\\s=]+)|(?'smallflag'\\S))(?:\\s*=\\s*|\\s+)(?(?!-)(?(?=[\\\"\\'])((?<![\\\\])['\"])(?'string'(?:.(?!(?<![\\\\])\\3))*.?)\\3|(?'value'\\S+)))(?:\\s+)?|(?'unmatched'\\S+))/";
/**
* @var array
*/
private static $ArgsCache;
/**
* Parses the input arguments into an array of flags and values
*
* @param $input
* @param int $max_arguments
* @return array
*/
public static function parseArgument($input, int $max_arguments=1000): array
{
if (is_string($input))
{
$flags = $input;
}
elseif(is_array($input))
{
$flags = implode(' ', $input);
}
else
{
global $argv;
if(isset($argv) && count($argv) > 1)
{
array_shift($argv);
}
$flags = implode(' ', $argv);
}
$configs = array();
preg_match_all(self::$Regex, $flags, $matches, PREG_SET_ORDER);
foreach ($matches as $index => $match)
{
if (isset($match['value']) && $match['value'] !== '')
{
$value = $match['value'];
}
else if (isset($match['string']) && $match['string'] !== '')
{
// fix escaped quotes
$value = str_replace("\\\"", "\"", $match['string']);
$value = str_replace("\\'", "'", $value);
}
else
{
$value = true;
}
if (isset($match['bigflag']) && $match['bigflag'] !== '')
{
$configs[$match['bigflag']] = $value;
}
if (isset($match['smallflag']) && $match['smallflag'] !== '')
{
$configs[$match['smallflag']] = $value;
}
if (isset($match['unmatched']) && $match['unmatched'] !== '')
{
$configs[$match['unmatched']] = true;
}
if ($index >= $max_arguments)
break;
}
return $configs;
}
/**
* Returns the arguments from the command line
*
* @return array
*/
public static function getArguments(): array
{
if(self::$ArgsCache == null)
{
if(isset($argv))
{
self::$ArgsCache = self::parseArgument($argv);
}
else
{
self::$ArgsCache = [];
}
}
return self::$ArgsCache;
}
}

View file

@ -0,0 +1,4 @@
<?php
$parse = \OptsLib\Parse::getArguments();
var_dump($parse);

4
tests/parse_test.php Normal file
View file

@ -0,0 +1,4 @@
<?php
$parse = \OptsLib\Parse::parseArgument('test --foo=bar --baz=qux --quux --corge --grault=garply --waldo --fred --plugh --xyzzy --thud');
var_dump($parse);