Skip to content

Commit 629d147

Browse files
committed
Extracted logic related with expander initialization into ExpanderInitalizer
1 parent 1181f80 commit 629d147

13 files changed

+123
-74
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?php
2+
3+
namespace Coduo\PHPMatcher\Exception;
4+
5+
class InvalidArgumentException extends Exception
6+
{
7+
}

src/Coduo/PHPMatcher/Factory/SimpleFactory.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,6 @@ protected function buildScalarMatchers()
5959
*/
6060
protected function buildParser()
6161
{
62-
return new Parser(new Lexer());
62+
return new Parser(new Lexer(), new Parser\ExpanderInitializer());
6363
}
6464
}

src/Coduo/PHPMatcher/Parser.php

Lines changed: 6 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,10 @@
44

55
use Coduo\PHPMatcher\AST;
66
use Coduo\PHPMatcher\Exception\Exception;
7-
use Coduo\PHPMatcher\Exception\InvalidExpanderTypeException;
87
use Coduo\PHPMatcher\Exception\PatternException;
9-
use Coduo\PHPMatcher\Exception\UnknownExpanderClassException;
108
use Coduo\PHPMatcher\Exception\UnknownExpanderException;
119
use Coduo\PHPMatcher\Matcher\Pattern;
10+
use Coduo\PHPMatcher\Parser\ExpanderInitializer;
1211

1312
class Parser
1413
{
@@ -20,26 +19,17 @@ class Parser
2019
private $lexer;
2120

2221
/**
23-
* @var array
22+
* @var ExpanderInitializer
2423
*/
25-
private $expanderDefinitions = array(
26-
"startsWith" => "Coduo\\PHPMatcher\\Matcher\\Pattern\\Expander\\StartsWith",
27-
"endsWith" => "Coduo\\PHPMatcher\\Matcher\\Pattern\\Expander\\EndsWith",
28-
"notEmpty" => "Coduo\\PHPMatcher\\Matcher\\Pattern\\Expander\\NotEmpty",
29-
"lowerThan" => "Coduo\\PHPMatcher\\Matcher\\Pattern\\Expander\\LowerThan",
30-
"greaterThan" => "Coduo\\PHPMatcher\\Matcher\\Pattern\\Expander\\GreaterThan",
31-
"inArray" => "Coduo\\PHPMatcher\\Matcher\\Pattern\\Expander\\InArray",
32-
"contains" => "Coduo\\PHPMatcher\\Matcher\\Pattern\\Expander\\Contains",
33-
34-
"oneOf" => "Coduo\\PHPMatcher\\Matcher\\Pattern\\Expander\\OneOf"
35-
);
24+
private $expanderInitializer;
3625

3726
/**
3827
* @param Lexer $lexer
3928
*/
40-
public function __construct(Lexer $lexer)
29+
public function __construct(Lexer $lexer, ExpanderInitializer $expanderInitializer)
4130
{
4231
$this->lexer = $lexer;
32+
$this->expanderInitializer = $expanderInitializer;
4333
}
4434

4535
/**
@@ -66,11 +56,7 @@ public function parse($pattern)
6656
$AST = $this->getAST($pattern);
6757
$pattern = new Pattern\TypePattern((string) $AST->getType());
6858
foreach ($AST->getExpanders() as $expander) {
69-
if (!array_key_exists($expander->getName(), $this->expanderDefinitions)) {
70-
throw new UnknownExpanderException(sprintf("Unknown expander \"%s\"", $expander->getName()));
71-
}
72-
73-
$pattern->addExpander($this->initializeExpander($expander));
59+
$pattern->addExpander($this->expanderInitializer->initialize($expander));
7460
}
7561

7662
return $pattern;
@@ -86,20 +72,6 @@ public function getAST($pattern)
8672
return $this->getPattern();
8773
}
8874

89-
/**
90-
* @param $expanderName
91-
* @param $expanderFQCN Fully-Qualified Class Name that implements PatternExpander interface
92-
* @throws UnknownExpanderClassException
93-
*/
94-
public function addExpanderDefinition($expanderName, $expanderFQCN)
95-
{
96-
if (!class_exists($expanderFQCN)) {
97-
throw new UnknownExpanderClassException(sprintf("Class \"%s\" does not exists.", $expanderFQCN));
98-
}
99-
100-
$this->expanderDefinitions[$expanderName] = $expanderFQCN;
101-
}
102-
10375
/**
10476
* Create AST root
10577
*
@@ -347,33 +319,4 @@ private function endOfPattern()
347319
{
348320
return is_null($this->lexer->lookahead);
349321
}
350-
351-
/**
352-
* @param AST\Expander $expanderNode
353-
* @throws InvalidExpanderTypeException
354-
* @return Pattern\PatternExpander
355-
*/
356-
private function initializeExpander(AST\Expander $expanderNode)
357-
{
358-
$reflection = new \ReflectionClass($this->expanderDefinitions[$expanderNode->getName()]);
359-
360-
if ($expanderNode->hasArguments()) {
361-
$arguments = array();
362-
foreach ($expanderNode->getArguments() as $argument) {
363-
$arguments[] = ($argument instanceof AST\Expander)
364-
? $this->initializeExpander($argument)
365-
: $argument;
366-
}
367-
368-
$expander = $reflection->newInstanceArgs($arguments);
369-
} else {
370-
$expander = $reflection->newInstance();
371-
}
372-
373-
if (!$expander instanceof Pattern\PatternExpander) {
374-
throw new InvalidExpanderTypeException();
375-
}
376-
377-
return $expander;
378-
}
379322
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
<?php
2+
3+
namespace Coduo\PHPMatcher\Parser;
4+
5+
use Coduo\PHPMatcher\AST\Expander;
6+
use Coduo\PHPMatcher\Exception\InvalidArgumentException;
7+
use Coduo\PHPMatcher\Exception\InvalidExpanderTypeException;
8+
use Coduo\PHPMatcher\Exception\UnknownExpanderClassException;
9+
use Coduo\PHPMatcher\Exception\UnknownExpanderException;
10+
use Coduo\PHPMatcher\Matcher\Pattern\PatternExpander;
11+
12+
class ExpanderInitializer
13+
{
14+
/**
15+
* @var array
16+
*/
17+
private $expanderDefinitions = array(
18+
"startsWith" => "Coduo\\PHPMatcher\\Matcher\\Pattern\\Expander\\StartsWith",
19+
"endsWith" => "Coduo\\PHPMatcher\\Matcher\\Pattern\\Expander\\EndsWith",
20+
"notEmpty" => "Coduo\\PHPMatcher\\Matcher\\Pattern\\Expander\\NotEmpty",
21+
"lowerThan" => "Coduo\\PHPMatcher\\Matcher\\Pattern\\Expander\\LowerThan",
22+
"greaterThan" => "Coduo\\PHPMatcher\\Matcher\\Pattern\\Expander\\GreaterThan",
23+
"inArray" => "Coduo\\PHPMatcher\\Matcher\\Pattern\\Expander\\InArray",
24+
"contains" => "Coduo\\PHPMatcher\\Matcher\\Pattern\\Expander\\Contains",
25+
26+
"oneOf" => "Coduo\\PHPMatcher\\Matcher\\Pattern\\Expander\\OneOf"
27+
);
28+
29+
/**
30+
* @param string $expanderName
31+
* @param string $expanderFQCN Fully-Qualified Class Name that implements PatternExpander interface
32+
* @throws UnknownExpanderClassException
33+
*/
34+
public function setExpanderDefinition($expanderName, $expanderFQCN)
35+
{
36+
if (!class_exists($expanderFQCN)) {
37+
throw new UnknownExpanderClassException(sprintf("Class \"%s\" does not exists.", $expanderFQCN));
38+
}
39+
40+
$this->expanderDefinitions[$expanderName] = $expanderFQCN;
41+
}
42+
43+
/**
44+
* @param $expanderName
45+
* @return bool
46+
*/
47+
public function hasExpanderDefinition($expanderName)
48+
{
49+
return array_key_exists($expanderName, $this->expanderDefinitions);
50+
}
51+
52+
/**
53+
* @param $expanderName
54+
* @return string
55+
* @throws InvalidArgumentException
56+
*/
57+
public function getExpanderDefinition($expanderName)
58+
{
59+
if (!$this->hasExpanderDefinition($expanderName)) {
60+
throw new InvalidArgumentException(sprintf("Definition for \"%s\" expander does not exists.", $expanderName));
61+
}
62+
63+
return $this->expanderDefinitions[$expanderName];
64+
}
65+
66+
/**
67+
* @param Expander $expanderNode
68+
* @throws InvalidExpanderTypeException
69+
* @throws UnknownExpanderException
70+
* @return PatternExpander
71+
*/
72+
public function initialize(Expander $expanderNode)
73+
{
74+
if (!array_key_exists($expanderNode->getName(), $this->expanderDefinitions)) {
75+
throw new UnknownExpanderException(sprintf("Unknown expander \"%s\"", $expanderNode->getName()));
76+
}
77+
78+
$reflection = new \ReflectionClass($this->expanderDefinitions[$expanderNode->getName()]);
79+
80+
if ($expanderNode->hasArguments()) {
81+
$arguments = array();
82+
foreach ($expanderNode->getArguments() as $argument) {
83+
$arguments[] = ($argument instanceof Expander)
84+
? $this->initialize($argument)
85+
: $argument;
86+
}
87+
88+
$expander = $reflection->newInstanceArgs($arguments);
89+
} else {
90+
$expander = $reflection->newInstance();
91+
}
92+
93+
if (!$expander instanceof PatternExpander) {
94+
throw new InvalidExpanderTypeException();
95+
}
96+
97+
return $expander;
98+
}
99+
}

tests/Coduo/PHPMatcher/Matcher/ArrayMatcherTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class ArrayMatcherTest extends \PHPUnit_Framework_TestCase
1515

1616
public function setUp()
1717
{
18-
$parser = new Parser(new Lexer());
18+
$parser = new Parser(new Lexer(), new Parser\ExpanderInitializer());
1919
$this->matcher = new Matcher\ArrayMatcher(
2020
new Matcher\ChainMatcher(array(
2121
new Matcher\CallbackMatcher(),
@@ -55,7 +55,7 @@ public function test_negative_match_when_cant_find_matcher_that_can_match_array_
5555
new Matcher\ChainMatcher(array(
5656
new Matcher\WildcardMatcher()
5757
)),
58-
$parser = new Parser(new Lexer())
58+
$parser = new Parser(new Lexer(), new Parser\ExpanderInitializer())
5959
);
6060

6161
$this->assertFalse($matcher->match(array('test' => 1), array('test' => 1)));

tests/Coduo/PHPMatcher/Matcher/DoubleMatcherTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class DoubleMatcherTest extends \PHPUnit_Framework_TestCase
1414

1515
public function setUp()
1616
{
17-
$this->matcher = new DoubleMatcher(new Parser(new Lexer()));
17+
$this->matcher = new DoubleMatcher(new Parser(new Lexer(), new Parser\ExpanderInitializer()));
1818
}
1919

2020
/**

tests/Coduo/PHPMatcher/Matcher/IntegerMatcherTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class IntegerMatcherTest extends \PHPUnit_Framework_TestCase
1414

1515
public function setUp()
1616
{
17-
$this->matcher = new IntegerMatcher(new Parser(new Lexer()));
17+
$this->matcher = new IntegerMatcher(new Parser(new Lexer(), new Parser\ExpanderInitializer()));
1818
}
1919

2020
/**

tests/Coduo/PHPMatcher/Matcher/JsonMatcherTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class JsonMatcherTest extends \PHPUnit_Framework_TestCase
1515

1616
public function setUp()
1717
{
18-
$parser = new Parser(new Lexer());
18+
$parser = new Parser(new Lexer(), new Parser\ExpanderInitializer());
1919
$scalarMatchers = new Matcher\ChainMatcher(array(
2020
new Matcher\CallbackMatcher(),
2121
new Matcher\ExpressionMatcher(),

tests/Coduo/PHPMatcher/Matcher/StringMatcherTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class StringMatcherTest extends \PHPUnit_Framework_TestCase
1515

1616
public function setUp()
1717
{
18-
$parser = new Parser(new Lexer());
18+
$parser = new Parser(new Lexer(), new Parser\ExpanderInitializer());
1919
$this->matcher = new StringMatcher($parser);
2020
}
2121
/**

tests/Coduo/PHPMatcher/Matcher/XmlMatcherTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class XmlMatcherTest extends \PHPUnit_Framework_TestCase
1515

1616
public function setUp()
1717
{
18-
$parser = new Parser(new Lexer());
18+
$parser = new Parser(new Lexer(), new Parser\ExpanderInitializer());
1919
$scalarMatchers = new Matcher\ChainMatcher(array(
2020
new Matcher\CallbackMatcher(),
2121
new Matcher\ExpressionMatcher(),

tests/Coduo/PHPMatcher/MatcherTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class MatcherTest extends \PHPUnit_Framework_TestCase
2020
public function setUp()
2121
{
2222
$this->captureMatcher = new Matcher\CaptureMatcher();
23-
$parser = new Parser(new Lexer());
23+
$parser = new Parser(new Lexer(), new Parser\ExpanderInitializer());
2424
$scalarMatchers = new Matcher\ChainMatcher(array(
2525
$this->captureMatcher,
2626
new Matcher\CallbackMatcher(),

tests/Coduo/PHPMatcher/ParserSyntaxErrorTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class ParserSyntaxErrorTest extends \PHPUnit_Framework_TestCase
1414

1515
public function setUp()
1616
{
17-
$this->parser = new Parser(new Lexer());
17+
$this->parser = new Parser(new Lexer(), new Parser\ExpanderInitializer());
1818
}
1919

2020
/**

tests/Coduo/PHPMatcher/ParserTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class ParserTest extends \PHPUnit_Framework_TestCase
1515

1616
public function setUp()
1717
{
18-
$this->parser = new Parser(new Lexer());
18+
$this->parser = new Parser(new Lexer(), new Parser\ExpanderInitializer());
1919
}
2020

2121
public function test_simple_pattern_without_expanders()

0 commit comments

Comments
 (0)