Deprecate Zend\Dom\Query in favor of more logical OO approach #5356

Merged
merged 5 commits into from Nov 1, 2013

Projects

None yet

7 participants

@ThomasCantonnet
Contributor

Hello everyone,

I am quite a heavy user of DOMDocument XPath queries and I have always been bothered by the Dom implementation in ZF2. The Zend\Dom\Query class seems very illogical as an object and contains quite a lot of inefficiencies and lacks access to the used DOMDocument generated from a string.

I created Zend\Dom\Document which makes more sense, because we are querying this object and not the other way around (creating a Query object that generates a DOMDocument which we then query and that we can't even access).

Zend\Dom\Query class:

$query = new Query($html);
$query->execute('a'); // Generation of a DOMDocument
$query->execute('span'); // Generation of another DOMDocument from the same input string
$query->getDOMDocument(): // Impossible

Zend\Dom\Document class:

$document = new Document($html);
$document->query('a', Document::QUERY_CSS);
$document->query('//span', Document::QUERY_XPATH);
$dom      = $document->getDomDocument();
$dom->createTextNode('<node></node>');

Problems solved:

  • Addition of a method to get the created DOMDocument instance
  • Caching of generated DOMDocument on each query
  • More logical object (Document VS Query)
  • Only one method to query a document

The methods more or less stay the same, I reused the tests already available for Query and added some for the new behavior. I deprecated Zend\Dom\Query in favor of this new class.

I'm in favor of adding this to a ZF2.* future release because I consider this more like an a new feature (new logic & different object) than a component refactor. ZF3 is very far away and Zend\Dom is currently lacking a proper DOMDocument wrapper.

@blanchonvincent blanchonvincent commented on an outdated diff Oct 26, 2013
library/Zend/Dom/Document.php
+ $this->xpathNamespaces[] = $matches[1];
+ $type = static::DOC_XHTML;
+ }
+ }
+
+ // Unsetting previously registered DOMDocument
+ $this->domDocument = null;
+ $this->stringDocument = !empty($document) ? $document : null;
+
+ $this->setType($forcedType ?: (!empty($document) ? $type : null));
+ $this->setEncoding($forcedEncoding);
+
+ return $this;
+ }
+
+ public function getType()
@blanchonvincent
blanchonvincent Oct 26, 2013 Contributor

docblock missing

@blanchonvincent blanchonvincent commented on an outdated diff Oct 26, 2013
library/Zend/Dom/Document.php
+ // Unsetting previously registered DOMDocument
+ $this->domDocument = null;
+ $this->stringDocument = !empty($document) ? $document : null;
+
+ $this->setType($forcedType ?: (!empty($document) ? $type : null));
+ $this->setEncoding($forcedEncoding);
+
+ return $this;
+ }
+
+ public function getType()
+ {
+ return $this->type;
+ }
+
+ protected function setType($type)
@blanchonvincent
blanchonvincent Oct 26, 2013 Contributor

docblock missing

@blanchonvincent blanchonvincent commented on an outdated diff Oct 26, 2013
library/Zend/Dom/Document.php
+ return $this;
+ }
+
+ public function getType()
+ {
+ return $this->type;
+ }
+
+ protected function setType($type)
+ {
+ $this->type = $type;
+
+ return $this;
+ }
+
+ public function getDomDocument()
@blanchonvincent
blanchonvincent Oct 26, 2013 Contributor

docblock missing

@blanchonvincent blanchonvincent commented on an outdated diff Oct 26, 2013
library/Zend/Dom/Document.php
+ }
+
+ public function getDomDocument()
+ {
+ if (null === ($stringDocument = $this->getStringDocument())) {
+ throw new Exception\RuntimeException('Cannot get DOMDocument; no document registered');
+ }
+
+ if (null === $this->domDocument) {
+ $this->domDocument = $this->getDomFromString($stringDocument);
+ }
+
+ return $this->domDocument;
+ }
+
+ protected function setDomDocument(DOMDocument $domDocument)
@blanchonvincent
blanchonvincent Oct 26, 2013 Contributor

docblock missing

@blanchonvincent blanchonvincent commented on an outdated diff Oct 26, 2013
library/Zend/Dom/Document.php
+
+ if (null === $this->domDocument) {
+ $this->domDocument = $this->getDomFromString($stringDocument);
+ }
+
+ return $this->domDocument;
+ }
+
+ protected function setDomDocument(DOMDocument $domDocument)
+ {
+ $this->domDocument = $domDocument;
+
+ return $this;
+ }
+
+ public function getEncoding()
@blanchonvincent
blanchonvincent Oct 26, 2013 Contributor

docblock missing

@blanchonvincent blanchonvincent commented on an outdated diff Oct 26, 2013
library/Zend/Dom/Document.php
+ return $this->domDocument;
+ }
+
+ protected function setDomDocument(DOMDocument $domDocument)
+ {
+ $this->domDocument = $domDocument;
+
+ return $this;
+ }
+
+ public function getEncoding()
+ {
+ return $this->encoding;
+ }
+
+ public function setEncoding($encoding)
@blanchonvincent
blanchonvincent Oct 26, 2013 Contributor

docblock missing

@blanchonvincent blanchonvincent commented on an outdated diff Oct 26, 2013
library/Zend/Dom/Document.php
+ return $this;
+ }
+
+ public function getEncoding()
+ {
+ return $this->encoding;
+ }
+
+ public function setEncoding($encoding)
+ {
+ $this->encoding = $encoding;
+
+ return $this->encoding;
+ }
+
+ public function getErrors()
@blanchonvincent
blanchonvincent Oct 26, 2013 Contributor

docblock missing

@blanchonvincent blanchonvincent commented on an outdated diff Oct 26, 2013
library/Zend/Dom/Document.php
+ return $this->encoding;
+ }
+
+ public function setEncoding($encoding)
+ {
+ $this->encoding = $encoding;
+
+ return $this->encoding;
+ }
+
+ public function getErrors()
+ {
+ return $this->errors;
+ }
+
+ protected function setErrors($errors)
@blanchonvincent
blanchonvincent Oct 26, 2013 Contributor

docblock missing

@blanchonvincent blanchonvincent and 1 other commented on an outdated diff Oct 26, 2013
library/Zend/Dom/Document.php
+ return $this->encoding;
+ }
+
+ public function getErrors()
+ {
+ return $this->errors;
+ }
+
+ protected function setErrors($errors)
+ {
+ $this->errors = $errors;
+
+ return $this;
+ }
+
+ protected function getDomFromString($stringDocument)
@blanchonvincent
blanchonvincent Oct 26, 2013 Contributor

docblock missing & maybe "getDomDocumentFromString"

@ThomasCantonnet
ThomasCantonnet Oct 26, 2013 Contributor

argh I forgot the docblocks...on it.

yeah it makes more sense for that method name

@blanchonvincent blanchonvincent and 1 other commented on an outdated diff Oct 26, 2013
library/Zend/Dom/Document.php
+
+ protected function setType($type)
+ {
+ $this->type = $type;
+
+ return $this;
+ }
+
+ public function getDomDocument()
+ {
+ if (null === ($stringDocument = $this->getStringDocument())) {
+ throw new Exception\RuntimeException('Cannot get DOMDocument; no document registered');
+ }
+
+ if (null === $this->domDocument) {
+ $this->domDocument = $this->getDomFromString($stringDocument);
@blanchonvincent
blanchonvincent Oct 26, 2013 Contributor

I think the method "getDomFromString" is useless because you should call "getDomFromString" only on an a valid string document. So, only the string document setting by "setStringDocument". You must not use "getDomFromString" with an other string document.

@blanchonvincent
blanchonvincent Oct 26, 2013 Contributor

You should have the code of "getDomFromString" inline in this method.

@ThomasCantonnet
ThomasCantonnet Oct 26, 2013 Contributor

I'd like to keep a getter/setter logic as much as possible. Any logic should be decoupled from those IMHO. I can move the exception throw to the getDomFromString though.

@blanchonvincent blanchonvincent and 1 other commented on an outdated diff Oct 26, 2013
library/Zend/Dom/Document.php
+ */
+ public function queryCss($query)
+ {
+ $xpathQuery = Css2Xpath::transform($query);
+ return $this->queryXpath($xpathQuery, $query);
+ }
+
+ /**
+ * Perform an XPath query
+ *
+ * @param string|array $xpathQuery
+ * @param string|null $query CSS selector query
+ * @throws Exception\RuntimeException
+ * @return NodeList
+ */
+ public function queryXpath($xpathQuery, $query = null)
@blanchonvincent
blanchonvincent Oct 26, 2013 Contributor

the second parameter "$query" is very dirty. You should try to remove it if you can. Maybe with an other intermediate protected method.

@ThomasCantonnet
ThomasCantonnet Oct 26, 2013 Contributor

good point, i ported this from the old code but I might refactor this because it would be a good idea

@blanchonvincent blanchonvincent and 1 other commented on an outdated diff Oct 26, 2013
library/Zend/Dom/Document.php
+ libxml_disable_entity_loader(false);
+ libxml_use_internal_errors(false);
+
+ if (!$success) {
+ throw new Exception\RuntimeException(sprintf('Error parsing document (type == %s)', $type));
+ }
+
+ return $domDoc;
+ }
+
+ /**
+ * Perform a CSS selector query
+ *
+ * @param string $query
+ * @return NodeList
+ */
@blanchonvincent
blanchonvincent Oct 26, 2013 Contributor

You should add "* @throws Exception\RuntimeException" like queryXpath() method ?

@ThomasCantonnet
ThomasCantonnet Oct 26, 2013 Contributor

yup indeed

@blanchonvincent blanchonvincent commented on the diff Oct 26, 2013
library/Zend/Dom/Document.php
+ $type = static::DOC_XHTML;
+ }
+
+ // Breaking XML declaration to make syntax highlighting work
+ if ('<' . '?xml' == substr(trim($document), 0, 5)) {
+ $type = static::DOC_XML;
+ if (preg_match('/<html[^>]*xmlns="([^"]+)"[^>]*>/i', $document, $matches)) {
+ $this->xpathNamespaces[] = $matches[1];
+ $type = static::DOC_XHTML;
+ }
+ }
+
+ // Unsetting previously registered DOMDocument
+ $this->domDocument = null;
+ $this->stringDocument = !empty($document) ? $document : null;
+
@blanchonvincent
blanchonvincent Oct 26, 2013 Contributor

$errors attributes must be empty now

@ThomasCantonnet
ThomasCantonnet Oct 26, 2013 Contributor

Nice catch, thanks

@blanchonvincent blanchonvincent and 1 other commented on an outdated diff Oct 26, 2013
library/Zend/Dom/Document.php
+ * Get raw document
+ * @return null|string
+ */
+ public function getStringDocument()
+ {
+ return $this->stringDocument;
+ }
+
+ /**
+ * Set raw document
+ * @param string|null $document
+ * @param string|null $forcedType Type for the provided document (see constants)
+ * @param string|null $forcedEncoding Encoding for the provided document
+ * @return Document
+ */
+ public function setStringDocument($document, $forcedType = null, $forcedEncoding = null)
@blanchonvincent
blanchonvincent Oct 26, 2013 Contributor

@ThomasCantonnet Hmmm "public" visibility ... is it really useful ? if you want to parse an other document, you should have to create an other object. What do you think? The object logical is related to the content.

You can't change the nodeList in a NodeList object because you want to read an list of nodes. It's the same here, but you want make queries on a document.

@ThomasCantonnet
ThomasCantonnet Oct 26, 2013 Contributor

I'm in favor of the most flexibility with getters & setters, I do agree that the document is strongly related to the content but I think that properties you can set via constructor should be settable via public method as well. Methods that set attributes internally should be protected.

That's why I have setStringDocument & setType as public, and all others on protected.

@blanchonvincent
Contributor

👍 nice refactoring. Maybe we have to keep this work for ZF3 ? cc @Maks3w

@ThomasCantonnet
Contributor

@blanchonvincent It does qualify for a refactoring, I agree, but if we want to fully do this, we would need to change NodeList as well because I can't for the life of me figure out why it needs a cssQuery and an xPathQuery in the constructor. I would need to adress that as well as the CSS2Xpath class that should be a simple static method...

But I'd really like to see this in the next ZF2 release though :(

@blanchonvincent
Contributor

@ThomasCantonnet I think it's too important to have this in the next release. And, yes, I have the same opinion, you need to change NodeList (you can have cssQuery && xpathQuery when you use the queryCss, because the cssQuery is transformed to a xpathQuery :) ).

@samsonasik samsonasik and 1 other commented on an outdated diff Oct 26, 2013
library/Zend/Dom/Document.php
+
+ /**
+ * Get raw document
+ * @return null|string
+ */
+ public function getStringDocument()
+ {
+ return $this->stringDocument;
+ }
+
+ /**
+ * Set raw document
+ * @param string|null $document
+ * @param string|null $forcedType Type for the provided document (see constants)
+ * @param string|null $forcedEncoding Encoding for the provided document
+ * @return Document
Thomas Cantonnet Review fixes 4775b03
@blanchonvincent
Contributor

@ThomasCantonnet Maybe you can have a Zend\Dom\Document (with encoding, errors, document transformation to domdocument) and a Zend\Dom\Query (cssQuery & xpathQuery) which will use a Zend\Dom\Document.

Your code will be more decoupled and easier to test & maintain.

@ThomasCantonnet
Contributor

@blanchonvincent Having an object just to store 2 properties and a NodeList seems like a lot of unncessary overhead to me, don't you think ? In this case all we need to do is rename NodeList to Query

@blanchonvincent
Contributor

@ThomasCantonnet no because the "setStringDocument" and the "getDomDocument" logic will be moved into a same class, and the query logic will be on an other class.

@blanchonvincent
Contributor

@ThomasCantonnet SRP = Single Responsibility Principle :)

@ThomasCantonnet
Contributor

Can you give me more details on how you view this new architecture? I'm not sure I'm following.

@sasezaki sasezaki commented on the diff Oct 26, 2013
library/Zend/Dom/Document.php
+ *
+ * @return null|string
+ * @throws Exception\RuntimeException
+ */
+ public function getDomDocument()
+ {
+ if (null === ($stringDocument = $this->getStringDocument())) {
+ throw new Exception\RuntimeException('Cannot get DOMDocument; no document registered');
+ }
+
+ if (null === $this->domDocument) {
+ $this->domDocument = $this->getDomDocumentFromString($stringDocument);
+ }
+
+ return $this->domDocument;
+ }
@sasezaki
sasezaki Oct 26, 2013 Contributor

When getDomDoument() called twice, getStringDocument() called twice ?

can be ?

if (null === $this->domDocument) {
    if (null === ($stringDocument = $this->getStringDocument())) {
@ThomasCantonnet
ThomasCantonnet Oct 26, 2013 Contributor

getStringDocument() is a simple pointer to the property $stringDocument.

@weierophinney
Member

A few things to note:

  • If you have completely new classes, this is completely Backwards Compatible (BC), meaning we can push it into 2.3.0.
  • I agree with @blanchonvincent -- have one class for Document, another for Query (I'd call the new one Zend\Dom\Document\Query to keep BC). This keeps the responsibilities clear, and makes testing easier, as Blanchon noted.
  • I also agree with Blanchon that a public setter for the document string/object doesn't make sense. This should be passed to the constructor, and remain immutable. If you want to query a different document, you should create a new instance.
  • Finally, once the design is solid, let's also update Zend\Test to use the new functionality. :)
@ThomasCantonnet
Contributor

@weierophinney Thanks for your input, I'll look into it during the week if I have time.

On Dom\Query though, should I change all the functions while keeping BC or create a different class ? I'm not sure I can keep BC with the state of Dom\Query.

@ThomasCantonnet
Contributor

@weierophinney @blanchonvincent Alright guys, deprecated a lot of classes but it looks much cleaner now :)

I added a Query object and refactored the NodeList object, what do you guys think about it now?

$document = new Document($html, Document::DOC_XHTML, 'UTF-8');
$query    = new Document\Query('.foo', Document\Query::TYPE_CSS);
$result   = $document->execute($query);
echo $result->count();
@weierophinney weierophinney commented on an outdated diff Oct 30, 2013
library/Zend/Dom/Document.php
+ if (!$success) {
+ throw new Exception\RuntimeException(sprintf('Error parsing document (type == %s)', $type));
+ }
+
+ return $domDoc;
+ }
+
+ /**
+ * Perform a query on generated DOMDocument
+ *
+ * @param Document\Query $query
+ * @param string $queryType
+ * @throws Exception\RuntimeException
+ * @return NodeList
+ */
+ public function execute(Document\Query $query)
@weierophinney
weierophinney Oct 30, 2013 Member

I would argue that this method belongs on the Query class, and it should accept a Document as an argument. That method would then return a NodeList.

@weierophinney weierophinney commented on an outdated diff Oct 30, 2013
library/Zend/Dom/Document.php
+
+ return $domDoc;
+ }
+
+ /**
+ * Perform a query on generated DOMDocument
+ *
+ * @param Document\Query $query
+ * @param string $queryType
+ * @throws Exception\RuntimeException
+ * @return NodeList
+ */
+ public function execute(Document\Query $query)
+ {
+ $domDoc = $this->getDomDocument();
+ $nodeList = $this->getNodeList($domDoc, $query->getContent());
@weierophinney
weierophinney Oct 30, 2013 Member

I would create a NodeList object, that puts the logic of getNodeList into its constructor. It would be an iterable object.

@weierophinney
weierophinney Oct 30, 2013 Member

Or, rather, have a factory method in NodeList that accepts the Document and the query content, and returns a NodeList instance.

@ThomasCantonnet
Contributor

@weierophinney Here goes, hope I understood you correctly ;)

@blanchonvincent blanchonvincent commented on the diff Oct 31, 2013
library/Zend/Dom/Document.php
+ public function getStringDocument()
+ {
+ return $this->stringDocument;
+ }
+
+ /**
+ * Set raw document
+ *
+ * @param string|null $document
+ * @param string|null $forcedType Type for the provided document (see constants)
+ * @param string|null $forcedEncoding Encoding for the provided document
+ * @return self
+ */
+ protected function setStringDocument($document, $forcedType = null, $forcedEncoding = null)
+ {
+ $type = static::DOC_HTML;
@blanchonvincent
blanchonvincent Oct 31, 2013 Contributor

These 3 lines are useless if $forcedType is used. Use if statement instead of the setType call

@ThomasCantonnet
ThomasCantonnet Nov 1, 2013 Contributor

Sorry Vincent, I didn't quite get what you mean here ?

@blanchonvincent
Contributor

@ThomasCantonnet I think the class NodeList must be only a container, NodeList must be have only the node list, not the factory method, no logic business. Put the logic business in the execute method in Query class.

@blanchonvincent
Contributor

@ThomasCantonnet the parameter of the method execute is a document, strange ...

maybe :

$document = new Document($html, Document::DOC_XHTML, 'UTF-8');
$query    = new Document\Query('.foo', Document\Query::TYPE_CSS);
$result   = $document->query($query);

instead of :

$document = new Document($html, Document::DOC_XHTML, 'UTF-8');
$query    = new Document\Query('.foo', Document\Query::TYPE_CSS);
$result   = $document->execute($document);

Maybe you can create class Zend\Document\Query\Xpath and Css to do :

$document = new Document($html, Document::DOC_XHTML, 'UTF-8');
$query    = new Document\Query\Css('.foo');
$result   = $document->query($query);

?

@ThomasCantonnet
Contributor

@blanchonvincent Matthew thinks the query logic should be in the Document\Query class. Initially I had it so the document executes a query like you said.

Look at the outdated diff.

I would argue that this method belongs on the Query class, and it should accept a Document as an argument. That method would then return a NodeList.

When it comes to the NodeList class, also have a look at what @weierophinney said in the previous diff.

I've changed the tests so many times I think I'm gonna stop here until we reach a consensus ;)

@blanchonvincent
Contributor

@ThomasCantonnet yep ok, why not. Wait the @weierophinney feedback.

@weierophinney
Member

@ThomasCantonnet I think the class NodeList must be only a container, NodeList must be have only the node list, not the factory method, no logic business. Put the logic business in the execute method in Query class.

After reviewing, I agree with this. You can remove the factory method from NodeList, and then have the execute method of Query prepare the data to inject into the NodeList.

@weierophinney
Member

@ThomasCantonnet the parameter of the method execute is a document, strange ...

I disagree, @blanchonvincent. Look at how PHP's DOM library works, particularly DOMXPath::query -- that accepts the expression and the DOM node (or document).

With that said, @ThomasCantonnet - it may make sense to make that mirroring even more clear, and maybe do the following:

  • Remove the constructor to the Query class
  • Make the execute method signature execute($expression, Document $document, $type = static::TYPE_XPATH). Then parse the $expression if we have a CSS expression, before handing it off to DOMXPath.

Usage would then become:

$document = new Document($contents);
$nodelist    = Query($someExpression, $document, Query::TYPE_CSS);
foreach ($nodelist as $node) {
    // ...
}

Or, more succinctly, for those who like Perl golf:

foreach (Query($someExpression, new Document($contents), Query::TYPE_CSS) as $node) {
    // ...
}

Both of which look quite clean to me.

@ThomasCantonnet
Contributor

OK guys, I removed the NodeList factory method and changed Query::execute to be a static method with Matthew's proposition for a signature.

Do we agree now ? :)

@weierophinney weierophinney was assigned Nov 1, 2013
@weierophinney weierophinney added a commit that referenced this pull request Nov 1, 2013
@weierophinney weierophinney [#5356] Deprecate Css2Xpath
- Marked Css2Xpath::transform as deprecated. It now triggers an
  E_USER_DEPRECATED error and proxies to Zend\Dom\Document\Query::cssToXpath().
064fb12
@weierophinney weierophinney added a commit that referenced this pull request Nov 1, 2013
@weierophinney weierophinney [#5356] Updated README
- Detailed the deprecation of `Zend\Dom\Css2Xpath::transform`
a44b1b1
@weierophinney weierophinney added a commit that referenced this pull request Nov 1, 2013
@weierophinney weierophinney Merge branch 'feature/5356' into develop
Close #5356
0398b38
@weierophinney weierophinney merged commit f72c22d into zendframework:develop Nov 1, 2013
@weierophinney
Member

Merged to develop for release with 2.3.0. @ThomasCantonnet -- can you do a new PR that will update Zend\Test\PHPUnit to use the new API, please?

@ThomasCantonnet
Contributor

Sure, I'll see what I can do!

Le 1 nov. 2013 à 22:33, weierophinney notifications@github.com a écrit :

Merged to develop for release with 2.3.0. @ThomasCantonnet -- can you do a new PR that will update Zend\Test\PHPUnit to use the new API, please?


Reply to this email directly or view it on GitHub.

@ThomasCantonnet ThomasCantonnet deleted the ThomasCantonnet:query-deprecated branch Nov 2, 2013
@Maks3w Maks3w added a commit that referenced this pull request Nov 3, 2013
@Maks3w Maks3w [#5356] Fix constant
Fix typo added in 064fb12
d435a7e
@Maks3w Maks3w referenced this pull request Nov 3, 2013
Merged

Fixes for #5356 #5408

@Maks3w
Member
Maks3w commented Nov 3, 2013

@ThomasCantonnet @weierophinney I already made the PR for fix Zend\Test. See #5356

@Maks3w
Member
Maks3w commented Nov 3, 2013

Well in true I fixed the deprecated call which made ZendTest\Test tests fail

@jmleroux
Contributor

The documentation needs an update.

@weierophinney weierophinney added a commit to zendframework/zend-dom that referenced this pull request May 15, 2015
@weierophinney weierophinney Merge pull request zendframework/zendframework#5356 from ThomasCanton…
…net/query-deprecated

Deprecate Zend\Dom\Query in favor of more logical OO approach

Conflicts:
	tests/ZendTest/Dom/QueryTest.php
32d3dc7
@weierophinney weierophinney added a commit to zendframework/zend-dom that referenced this pull request May 15, 2015
@weierophinney weierophinney [zendframework/zendframework#5356] Deprecate Css2Xpath
- Marked Css2Xpath::transform as deprecated. It now triggers an
  E_USER_DEPRECATED error and proxies to Zend\Dom\Document\Query::cssToXpath().
10cf192
@weierophinney weierophinney added a commit to zendframework/zend-dom that referenced this pull request May 15, 2015
@weierophinney weierophinney Merge branch 'feature/5356' into develop 8758a64
@gianarb gianarb pushed a commit to zendframework/zend-dom that referenced this pull request May 15, 2015
@Maks3w Maks3w [zendframework/zendframework#5356] Fix constant
Fix typo added in 064fb125603dede6a85a2a0c5409a078c69a12b5
e19f45e
@gianarb gianarb pushed a commit to zendframework/zend-dom that referenced this pull request May 15, 2015
@Maks3w Maks3w [zendframework/zendframework#5356] Replace deprecated call
Issued introduced by 064fb125603dede6a85a2a0c5409a078c69a12b5
3f6c1ee
@gianarb gianarb pushed a commit to zendframework/zend-dom that referenced this pull request May 15, 2015
@Maks3w Maks3w [zendframework/zendframework#5356] Rename test case.
Css2Xpath is not longer tested by the file.
486891e
@gianarb gianarb pushed a commit to zendframework/zend-dom that referenced this pull request May 15, 2015
@Maks3w Maks3w [zendframework/zendframework#5356] Remove unnecessary/unused `use`s f0d5143
@gianarb gianarb pushed a commit to zendframework/zend-dom that referenced this pull request May 15, 2015
@Maks3w Maks3w [zendframework/zendframework#5356] Improve docblocks 1d9a741
@gianarb gianarb pushed a commit to zendframework/zend-dom that referenced this pull request May 15, 2015
@Maks3w Maks3w [zendframework/zendframework#5356] Throws exception without save and …
…throw again.
11f05e0
@weierophinney weierophinney added a commit to zendframework/zend-dom that referenced this pull request May 15, 2015
@weierophinney weierophinney Merge pull request zendframework/zendframework#5408 from Maks3w/hotfi… 29e968f
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment