Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
10.00% |
1 / 10 |
CRAP | |
10.14% |
7 / 69 |
| ReadOnlyCache | |
0.00% |
0 / 1 |
|
10.00% |
1 / 10 |
823.05 | |
10.14% |
7 / 69 |
| __construct() | |
100.00% |
1 / 1 |
1 | |
100.00% |
4 / 4 |
|||
| has($name, $groups = null, $flag = null) | |
0.00% |
0 / 1 |
6.60 | |
60.00% |
3 / 5 |
|||
| get($name, $groups = null, $flag = null) | |
0.00% |
0 / 1 |
30 | |
0.00% |
0 / 6 |
|||
| getAll($groups = null, $flag = null) | |
0.00% |
0 / 1 |
72 | |
0.00% |
0 / 15 |
|||
| load() | |
0.00% |
0 / 1 |
56 | |
0.00% |
0 / 25 |
|||
| setLocation($location) | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 4 |
|||
| getLocation() | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
| setParameters(Parameters $parameters) | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| getDefaultLocation() | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| getCurrentWorkingDirectory() | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 5 |
|||
| <?php | |
| namespace Environaut\Cache; | |
| use Environaut\Cache\IReadOnlyCache; | |
| use Environaut\Config\Parameters; | |
| use Environaut\Report\Results\Settings\Setting; | |
| class ReadOnlyCache implements IReadOnlyCache | |
| { | |
| const DEFAULT_PATH = './'; | |
| const DEFAULT_NAME = '.environaut'; | |
| const DEFAULT_EXTENSION = '.cache'; | |
| /** | |
| * @var string location of the cache file | |
| */ | |
| protected $location = null; | |
| /** | |
| * @var Parameters runtime parameters | |
| */ | |
| protected $parameters; | |
| /** | |
| * @var array of ISetting implementing settings | |
| */ | |
| protected $settings = array(); | |
| public function __construct() | |
| { | |
| $this->location = null; | |
| $this->parameters = new Parameters(); | |
| $this->settings = array(); | |
| } | |
| /** | |
| * Returns whether a cached value for a setting from the loaded cache exists, that matches the given criterias. | |
| * | |
| * @param string $name key of wanted setting | |
| * @param mixed $groups group name of setting, default is null and matches always | |
| * @param integer $flag setting type to match, default is null and matches always | |
| * | |
| * @return boolean true if value for that setting is in cache; false otherwise | |
| */ | |
| public function has($name, $groups = null, $flag = null) | |
| { | |
| foreach ($this->settings as $setting) { | |
| if (($setting->getName() === $name) && $setting->matchesGroup($groups) && $setting->matchesFlag($flag)) { | |
| return true; | |
| } | |
| } | |
| return false; | |
| } | |
| /** | |
| * Returns the first setting from the loaded cache that matches the given criterias. | |
| * | |
| * @param string $name key of wanted setting | |
| * @param mixed $groups group name of setting, default is null and matches always | |
| * @param integer $flag setting type to match, default is null and matches always | |
| * | |
| * @return ISetting|null matching setting | |
| */ | |
| public function get($name, $groups = null, $flag = null) | |
| { | |
| $found = null; | |
| foreach ($this->settings as $setting) { | |
| if (($setting->getName() === $name) && $setting->matchesGroup($groups) && $setting->matchesFlag($flag)) { | |
| return $setting; | |
| } | |
| } | |
| return $found; | |
| } | |
| /** | |
| * Returns an array of settings matching the given criterias. | |
| * | |
| * @param mixed $groups name of a group or array of group names or null for all settings regardless of group | |
| * @param type $flag only return settings that match the given flag value | |
| * | |
| * @return array of setting instances matching the specification | |
| * | |
| * @throws \InvalidArgumentException if $groups is neither null nor a string or an array | |
| */ | |
| public function getAll($groups = null, $flag = null) | |
| { | |
| $settings = array(); | |
| if (null === $groups) { | |
| foreach ($this->settings as $setting) { | |
| $settings[] = $setting; | |
| } | |
| } elseif (is_string($groups) || is_array($groups)) { | |
| foreach ($this->settings as $setting) { | |
| if ($setting->matchesGroup($groups) && $setting->matchesFlag($flag)) { | |
| $settings[] = $setting; | |
| } | |
| } | |
| } else { | |
| throw new \InvalidArgumentException( | |
| 'Only a null value, a single string as group name or an array of group names are supported.' | |
| ); | |
| } | |
| return $settings; | |
| } | |
| /** | |
| * Loads the settings from the configured or default location. | |
| * | |
| * @return boolean true, if reading from cache succeeded; false otherwise. | |
| * | |
| * @throws \InvalidArgumentException on invalid or broken cache file | |
| */ | |
| public function load() | |
| { | |
| $location = $this->location; | |
| // no location given from commandline -> use config values or fallback to default location | |
| if (empty($location)) { | |
| $location = $this->parameters->get( | |
| 'read_location', | |
| $this->parameters->get( | |
| 'location', | |
| $this->getDefaultLocation() | |
| ) | |
| ); | |
| } | |
| $this->location = $location; | |
| if (!is_readable($location) || !is_file($location)) { | |
| return false; | |
| } | |
| $content = file_get_contents($location); | |
| if (false === $content) { | |
| return false; | |
| } | |
| $result = json_decode($content, true); | |
| if (null === $result) { | |
| throw new \InvalidArgumentException('Cache could not be decoded from file: ' . $location); | |
| } | |
| $items = array(); | |
| foreach ($result as $setting) { | |
| $items[] = new Setting($setting['name'], $setting['value'], $setting['group'], $setting['flag']); | |
| } | |
| $this->settings = $items; | |
| return true; | |
| } | |
| /** | |
| * Sets the given location as the cache location to use. | |
| * | |
| * @param string $location cache file path | |
| * | |
| * @return ReadOnlyCache this instance for fluent API support | |
| * | |
| * @throws \InvalidArgumentException if location is not readable | |
| */ | |
| public function setLocation($location) | |
| { | |
| if (!is_readable($location)) { | |
| throw new \InvalidArgumentException('Given cache location "' . $location . '" is not readable.'); | |
| } | |
| $this->location = $location; | |
| return $this; | |
| } | |
| /** | |
| * Returns the location currently set on the cache. | |
| * | |
| * @return string cache file location currently configured | |
| */ | |
| public function getLocation() | |
| { | |
| return $this->location; | |
| } | |
| /** | |
| * Runtime parameters to configure the cache operations. | |
| * | |
| * @param Parameters $parameters runtime parameters | |
| * | |
| * @return ReadOnlyCache this instance for fluent API support | |
| */ | |
| public function setParameters(Parameters $parameters) | |
| { | |
| $this->parameters = $parameters; | |
| return $this; | |
| } | |
| /** | |
| * Returns the default location used for the cache file. Defaults to "./.environaut.cache". | |
| * | |
| * @return string file path and name | |
| */ | |
| protected function getDefaultLocation() | |
| { | |
| return $this->getCurrentWorkingDirectory() . DIRECTORY_SEPARATOR . | |
| self::DEFAULT_PATH . self::DEFAULT_NAME . self::DEFAULT_EXTENSION; | |
| } | |
| /** | |
| * @return string current working directory | |
| */ | |
| protected function getCurrentWorkingDirectory() | |
| { | |
| $dir = getcwd(); | |
| if (false === $dir) { | |
| $dir = __DIR__; // fallback to folder of current class in case of strange errors | |
| } | |
| return $dir; | |
| } | |
| } |