Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00%
0 / 1
0.00%
0 / 4
CRAP
0.00%
0 / 93
Directory
0.00%
0 / 1
0.00%
0 / 4
240
0.00%
0 / 93
 __construct(array $options = array())
0.00%
0 / 1
2
0.00%
0 / 6
 setDefaultOptions(OptionsResolverInterface $resolver)
0.00%
0 / 1
2
0.00%
0 / 30
 read()
0.00%
0 / 1
90
0.00%
0 / 43
 write()
0.00%
0 / 1
20
0.00%
0 / 14
<?php
/**
* This file is part of the Statistical Classifier package.
*
* (c) Cam Spiers <camspiers@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Camspiers\StatisticalClassifier\DataSource;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
/**
* @author Cam Spiers <camspiers@gmail.com>
* @package Statistical Classifier
*/
class Directory extends DataArray
{
/**
* Used for docs in category folder
*/
const MODE_DIRECTORY_AS_CATEGORY = 0;
/**
* Used for docs named be category
*/
const MODE_DOCUMENT_AS_CATEGORY = 1;
/**
* Stores the configuration options
* @var array
*/
protected $options;
/**
* Creates the object from an array of options
* @param array $options
*/
public function __construct(array $options = array())
{
$resolver = new OptionsResolver();
$this->setDefaultOptions($resolver);
$this->options = $resolver->resolve($options);
}
/**
* Sets the configuration for the options resolver
* @param OptionsResolverInterface $resolver
*/
protected function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setRequired(
array(
'directory'
)
);
$resolver->setDefaults(
array(
'mode' => self::MODE_DIRECTORY_AS_CATEGORY,
'include' => array(),
'limit' => null
)
);
$resolver->setAllowedValues(
array(
'mode' => array(
self::MODE_DOCUMENT_AS_CATEGORY,
self::MODE_DIRECTORY_AS_CATEGORY
)
)
);
$resolver->setAllowedTypes(
array(
'directory' => 'string',
'mode' => 'int',
'include' => 'array'
)
);
}
/**
* @{inheritdoc}
*/
public function read()
{
$data = array();
if (file_exists($this->options['directory'])) {
$pattern = $this->options['mode'] == self::MODE_DIRECTORY_AS_CATEGORY ? '/*' : '';
if (is_array($this->options['include']) && count($this->options['include']) !== 0) {
$files = array();
foreach ($this->options['include'] as $include) {
$files = array_merge(
$files,
array_slice(
glob(
"{$this->options['directory']}/{$include}{$pattern}",
GLOB_NOSORT
),
0,
$this->options['limit']
)
);
}
} else {
$files = array_slice(
glob("{$this->options['directory']}{$pattern}/*", GLOB_NOSORT),
0,
$this->options['limit']
);
}
foreach ($files as $filename) {
if (is_file($filename)) {
if ($this->options['mode'] === self::MODE_DIRECTORY_AS_CATEGORY) {
$categoryPath = dirname($filename);
} else {
$categoryPath = $filename;
}
$data[] = array(
'category' => basename($categoryPath),
'document' => file_get_contents($filename)
);
}
}
}
return $data;
}
/**
* @{inheritdoc}
*/
public function write()
{
foreach ($this->data as $category => $documents) {
if (!file_exists($this->options['directory'] . '/' . $category)) {
mkdir($this->options['directory'] . '/' . $category);
}
foreach ($documents as $document) {
file_put_contents(
$this->options['directory'] . '/' . $category . '/' . md5($document),
$document
);
}
}
}
}