diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..82cfc4e --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.idea +composer.lock +vendor diff --git a/README.md b/README.md index 4da57f1..44bb13f 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,5 @@ -# utils -Collection of utilites for easier development and app running +# Dev Portal / Utils +Collection of utilities for easier development and app running + +## Documentation +Documentation can be found [here](https://github.com/dev-portal/utils/blob/master/docs/en/index.md) diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..87638f5 --- /dev/null +++ b/composer.json @@ -0,0 +1,24 @@ +{ + "name": "dev-portal/utils", + "description": "Collection of utilities for easier development and app running", + "type": "library", + "license": "MIT", + "authors": [ + { + "name": "Tomáš Blatný", + "email": "blatny.tomas@seznam.cz" + } + ], + "require": { + "nette/di": "^2.3", + "nette/security": "^2.3" + }, + "require-dev": { + "nette/tester": "^1.6" + }, + "autoload": { + "psr-4": { + "DevPortal\\Utils\\": "src/Utils/" + } + } +} diff --git a/docs/en/index.md b/docs/en/index.md new file mode 100644 index 0000000..d325f6f --- /dev/null +++ b/docs/en/index.md @@ -0,0 +1,39 @@ +# Dev Portal / Utils + +## Installation + +Install using composer + +```sh +$ composer require dev-portal/utils +``` + +## Modules + +### Namespace for UserStorage + +This module provides easy configuration of namespace for IUserStorage for Nette Framework. + +First enable it by registering extension into your config neon: + +```yml +extensions: + userNamespace: DevPortal\Utils\DI\UserNamespaceExtension +``` + +You can then configure it: + +```yml +userNamespace: + type: auto + namespace: foo.bar +``` + +`type` attribute can be: + +- `config` or `value` - uses directly namespace from `namespace` attribute +- `dir` or `directory` - uses namespace dependent on absolute path of your project (`%wwwDir%`) +- `auto` - if `namespace` is set, uses it, otherwise uses absolute path of your project + +You can also write your own `IUserNamespaceResolver` and register it under `resolverClass` attribute. +This overrides predefined resolvers. diff --git a/src/Utils/DI/UserNamespaceExtension.php b/src/Utils/DI/UserNamespaceExtension.php new file mode 100644 index 0000000..b526c4a --- /dev/null +++ b/src/Utils/DI/UserNamespaceExtension.php @@ -0,0 +1,98 @@ + 'auto', + 'namespace' => NULL, + 'resolverClass' => NULL, + ]; + + + public function loadConfiguration() + { + $config = $this->validateConfig($this->defaults); + + if (isset($config['resolverClass']) && $config['resolverClass']) { + $this->getContainerBuilder() + ->addDefinition($this->prefix('resolver')) + ->setClass($config['resolverClass']); + return; + } + + switch ($config['type']) { + case 'auto': + if (isset($config['namespace']) && $config['namespace']) { + $this->registerConfigResolver($config['namespace']); + } else { + $this->registerDirectoryResolver(); + } + break; + case 'dir': + case 'directory': + $this->registerDirectoryResolver(); + break; + case 'config': + case 'value': + if (!$config['namespace']) { + throw new InvalidArgumentException('Set configuration value ' . $this->name . '.namespace to use ConfigResolver.'); + } + $this->registerConfigResolver($config['namespace']); + break; + default: + throw new InvalidArgumentException('Invalid configuration value ' . $this->name . '.type: ' . $config['type']); + } + } + + + public function beforeCompile() + { + $builder = $this->getContainerBuilder(); + + if ($name = $builder->getByType(IUserStorage::class)) { + $builder->getDefinition($name) + ->addSetup('setNamespace', [$builder->getByType(IUserNamespaceResolver::class), 'resolve']); + } + } + + + /** + * @param string $namespace + * @return ServiceDefinition + */ + private function registerConfigResolver($namespace) + { + return $this->getContainerBuilder() + ->addDefinition($this->prefix('resolver')) + ->setClass(ConfigResolver::class) + ->setArguments([$namespace]); + } + + + /** + * @return ServiceDefinition + */ + private function registerDirectoryResolver() + { + return $this->getContainerBuilder() + ->addDefinition($this->prefix('resolver')) + ->setClass(DirectoryResolver::class) + ->setArguments(['%wwwDir%']); + } + +} diff --git a/src/Utils/Security/IUserNamespaceResolver.php b/src/Utils/Security/IUserNamespaceResolver.php new file mode 100644 index 0000000..46d7d56 --- /dev/null +++ b/src/Utils/Security/IUserNamespaceResolver.php @@ -0,0 +1,14 @@ +namespace = (string) $namespace; + } + + + /** @return string */ + public function resolve() + { + return $this->namespace; + } + +} diff --git a/src/Utils/Security/NamespaceResolvers/DirectoryResolver.php b/src/Utils/Security/NamespaceResolvers/DirectoryResolver.php new file mode 100644 index 0000000..a27661e --- /dev/null +++ b/src/Utils/Security/NamespaceResolvers/DirectoryResolver.php @@ -0,0 +1,30 @@ +wwwDir = $wwwDir; + } + + + /** @return string */ + public function resolve() + { + return str_replace(DIRECTORY_SEPARATOR, '.', $this->wwwDir); + } + +} diff --git a/tests/Utils/Security/NamespaceResolvers/ConfigResolver.phpt b/tests/Utils/Security/NamespaceResolvers/ConfigResolver.phpt new file mode 100644 index 0000000..6630204 --- /dev/null +++ b/tests/Utils/Security/NamespaceResolvers/ConfigResolver.phpt @@ -0,0 +1,15 @@ +resolve()); diff --git a/tests/Utils/Security/NamespaceResolvers/DirectoryResolver.phpt b/tests/Utils/Security/NamespaceResolvers/DirectoryResolver.phpt new file mode 100644 index 0000000..2289d9b --- /dev/null +++ b/tests/Utils/Security/NamespaceResolvers/DirectoryResolver.phpt @@ -0,0 +1,16 @@ +resolve()); diff --git a/tests/bootstrap.php b/tests/bootstrap.php new file mode 100644 index 0000000..3294843 --- /dev/null +++ b/tests/bootstrap.php @@ -0,0 +1,8 @@ +