Security update for permissions_by_term
[yaffs-website] / vendor / behat / gherkin / src / Behat / Gherkin / Gherkin.php
diff --git a/vendor/behat/gherkin/src/Behat/Gherkin/Gherkin.php b/vendor/behat/gherkin/src/Behat/Gherkin/Gherkin.php
new file mode 100644 (file)
index 0000000..e457cd8
--- /dev/null
@@ -0,0 +1,142 @@
+<?php
+
+/*
+ * This file is part of the Behat Gherkin.
+ * (c) Konstantin Kudryashov <ever.zet@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Gherkin;
+
+use Behat\Gherkin\Filter\FeatureFilterInterface;
+use Behat\Gherkin\Filter\LineFilter;
+use Behat\Gherkin\Filter\LineRangeFilter;
+use Behat\Gherkin\Loader\FileLoaderInterface;
+use Behat\Gherkin\Loader\LoaderInterface;
+
+/**
+ * Gherkin manager.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+class Gherkin
+{
+    const VERSION = '4.4-dev';
+
+    /**
+     * @var LoaderInterface[]
+     */
+    protected $loaders = array();
+    /**
+     * @var FeatureFilterInterface[]
+     */
+    protected $filters = array();
+
+    /**
+     * Adds loader to manager.
+     *
+     * @param LoaderInterface $loader Feature loader
+     */
+    public function addLoader(LoaderInterface $loader)
+    {
+        $this->loaders[] = $loader;
+    }
+
+    /**
+     * Adds filter to manager.
+     *
+     * @param FeatureFilterInterface $filter Feature filter
+     */
+    public function addFilter(FeatureFilterInterface $filter)
+    {
+        $this->filters[] = $filter;
+    }
+
+    /**
+     * Sets filters to the parser.
+     *
+     * @param FeatureFilterInterface[] $filters
+     */
+    public function setFilters(array $filters)
+    {
+        $this->filters = array();
+        array_map(array($this, 'addFilter'), $filters);
+    }
+
+    /**
+     * Sets base features path.
+     *
+     * @param string $path Loaders base path
+     */
+    public function setBasePath($path)
+    {
+        foreach ($this->loaders as $loader) {
+            if ($loader instanceof FileLoaderInterface) {
+                $loader->setBasePath($path);
+            }
+        }
+    }
+
+    /**
+     * Loads & filters resource with added loaders.
+     *
+     * @param mixed                    $resource Resource to load
+     * @param FeatureFilterInterface[] $filters  Additional filters
+     *
+     * @return array
+     */
+    public function load($resource, array $filters = array())
+    {
+        $filters = array_merge($this->filters, $filters);
+
+        $matches = array();
+        if (preg_match('/^(.*)\:(\d+)-(\d+|\*)$/', $resource, $matches)) {
+            $resource = $matches[1];
+            $filters[] = new LineRangeFilter($matches[2], $matches[3]);
+        } elseif (preg_match('/^(.*)\:(\d+)$/', $resource, $matches)) {
+            $resource = $matches[1];
+            $filters[] = new LineFilter($matches[2]);
+        }
+
+        $loader = $this->resolveLoader($resource);
+
+        if (null === $loader) {
+            return array();
+        }
+
+        $features = array();
+        foreach ($loader->load($resource) as $feature) {
+            foreach ($filters as $filter) {
+                $feature = $filter->filterFeature($feature);
+
+                if (!$feature->hasScenarios() && !$filter->isFeatureMatch($feature)) {
+                    continue 2;
+                }
+            }
+
+            $features[] = $feature;
+        }
+
+        return $features;
+    }
+
+    /**
+     * Resolves loader by resource.
+     *
+     * @param mixed $resource Resource to load
+     *
+     * @return LoaderInterface
+     */
+    public function resolveLoader($resource)
+    {
+        foreach ($this->loaders as $loader) {
+            if ($loader->supports($resource)) {
+                return $loader;
+            }
+        }
+
+        return null;
+    }
+}