Support for Drupal 7 is ending on 5 January 2025—it’s time to migrate to Drupal 10! Learn about the many benefits of Drupal 10 and find migration tools in our resource center.
follow-up from #1184944: Make entities classed objects, introduce CRUD support. This issue is for migrating the node entity to the new system.
See #1346204: [meta] Drupal 8 Entity API improvements for the general roadmap.
Note: We can move all revision specific stuff just over to the node controller for now, and implement a proper revisions-enabled controller later on.
Comments
Comment #1
xjmRecategorizing per #1346204-11: [meta] Drupal 8 Entity API improvements.
Comment #2
larowlanWill we get this?
Comment #3
sunComment #4
loganfsmyth CreditAttribution: loganfsmyth commentedHas anyone started anything on this yet? I'd be up for giving it a shot.
Comment #5
yched CreditAttribution: yched commentedIf the issue is still marked 'unassigned', go for it !
Comment #6
loganfsmyth CreditAttribution: loganfsmyth commentedAlright, I'll give this a shot.
I saw that it was unassigned, but I'm terrible at remembering to assign things to myself when I look at them, so figured it couldn't hurt to post first since this is a big issue.
Comment #7
loganfsmyth CreditAttribution: loganfsmyth commentedQuick post for testing. There is still lots to do. I know the node revision test isn't working, but I want to see what else fails outside of Node module's tests.
Comment #9
loganfsmyth CreditAttribution: loganfsmyth commentedAnother shot at testing. I think the basics should all be working.
One issue that I have run into, that I think still may break sometimes in the current code, is the new behavior for updating values. Previously if you left a node property empty on a node that already existed, then drupal_write_record will be smart enough to exclude the value from the UPDATE query. Now though, with all node properties defined in a class, drupal_write_record will ALWAYS try to update all columns in the table. That means that to maintain current behavior, the original values need to be manually copied from node->original in the presave.
While this isn't the end of the world, it is a change in the API and required some changes in a few tests to make them pass. Several places rely on being able to essentially grab nid and vid, and construct whole new object. That will no longer work because doing so will set all other node properties back to their default values.
Comment #11
loganfsmyth CreditAttribution: loganfsmyth commentedOne more time, this time based on most recent HEAD instead of last week.
Comment #12
aspilicious CreditAttribution: aspilicious commentedI rly HATE the fact that we have to COPY entire functions (and edit add 3 lines of code) just to support revisions :( *sigh*.
But I guess this is they way to go as long we don't have revision support in the base entity class.
ps: I'm talking about Save, Delete and invokHook in node.entity.inc
Comment #13
loganfsmyth CreditAttribution: loganfsmyth commentedI entirely agree. I kept everything in the Node controller because that's what the issue body said to do, but I'm not a big fan either. I may very well try to just move the revision logic to Entity module. I don't think it makes sense to have revision loading support built in but not revision saving/deleting.
Comment #14
aspilicious CreditAttribution: aspilicious commentedno don't move it to entity yet. There is a seperate issue for that.
Comment #15
aspilicious CreditAttribution: aspilicious commentedI'm uploading a patch withtype hinting (I think I covered everything).
Would like to see what testbot thinks. This is probably to big to do at once. So I suggest reviewing #11 and fixing the type hinting in a followup.
Comment #17
aspilicious CreditAttribution: aspilicious commentedNeeds review for #11...
Will leave this for a followup...
Comment #19
fagook, I've done a first review of #11 :
Ouch. I wasn't aware of this hack :( entity_create() seems wrong here though, as there is no new node to create upon edit. For now, I think we should fix this to not create an entity at all. Just access $form_state['node'] to read the node type as it won't change anyway, then let's have fun mangling form values... (no need for having $node afterwards).
typo. Also, what does 'indicator' mean?
ouch. I guess best just introduce predelete also for node-types.
However, I guess those node-type specific hooks should die anyway... But that's another issue :/
Missing comment.
Needs to be removed.
Comment #20
loganfsmyth CreditAttribution: loganfsmyth commented@aspilicious Thanks for the type hinting. Unfortunately a lot of places have two types so there is too much hinting. For example node_access can take either $node for 'view', 'update', 'delete' or $node_type if op is 'create'.
@fago Thanks for the initial review. Lots left to do, but getting there.
Comment #21
loganfsmyth CreditAttribution: loganfsmyth commentedFixed the stuff fago mentioned and included the type hinting.
Comment #22
loganfsmyth CreditAttribution: loganfsmyth commentedThat failed, it just didn't recognize it properly. That's what I get for changing "one more quick thing" :P
Comment #23
loganfsmyth CreditAttribution: loganfsmyth commentedComment #25
loganfsmyth CreditAttribution: loganfsmyth commented* Forum was treating the results of a query on the node table as a node object.
* Comment's documentation was missing that $node can be NULL
* Node's indexing says pass a node, but all you need is to pass an object containing a nid.
** I guess this is kind of a change in the API, but seemed like the thing to do. Thoughts?
Comment #26
klausiComment is not correct, DrupalDefaultEntityController?
Doc block missing, it should state that it overrides a parent method. Also: why did you have to override the default method?
Same here and on the other methods on this controller.
Comment exceeds 80 characters.
missing comma at the end.
That looks wrong. Shouldn't you use $node->createDuplicate()?
node_save() is a legacy function and should not be used anymore. Try entity_create('node', $edit)->save() instead.
Comment #27
amateescu CreditAttribution: amateescu commented- fixed all problems from #26
* the delete() method is overriden because we need to delete node revisions as well.
- cleaned-up some unneeded newlines from node.entity.inc
- replaced all occurences of
node_save()
with$node->save()
- replaced all occurences of
clone $node
with$node->createDuplicate()
Comment #28
klausi"the delete() method is overriden because we need to delete node revisions as well"
That should be in the patch, not only in your comment :-P
Seriously, please document why any particular method is overridden.
Comment #29
David_Rothstein CreditAttribution: David_Rothstein commentedNot really sure I understand that.... We have node_load(); why would we not want to use node_save() also?
It seems to me that for basic API consistency reasons, if we use one we should use the other too.
Comment #30
loganfsmyth CreditAttribution: loganfsmyth commentedI agree with David, is getting rid of node_save really happening?
'clone $node' and '$node->createDuplicate()' do two different things. CreateDuplicate sets nid and vid to null make duplicating the node easier. The places I used 'clone' preserve nid and vid. Previously the tests were creating new node objects with the same nid by casting a new array to an object and setting different properties on that new object. I figured cloning the original and changing the properties on the clone made more sense with classes.
Comment #31
klausi@David_Rothstein: because node_save() has no benefit really. It just adds one more function call and is longer to type; node_load() is different because I don't have to specify an entity type and I consider it a convenience function.
node_load() and node_save() are fundamentally different concepts. The first retrieves an object from an id, while the second executes an operation on an object I already have at hand. So I would also argue for API consistency: whenever we have methods on entities that accomplish the same as a function, we should use the method. In the end we should remove node_save() from Drupal 9.
@loganfsmyth: urgs, so I guess I was wrong about clone, sorry about that.
Comment #32
loganfsmyth CreditAttribution: loganfsmyth commentedI don't have any more time to make progress on this, sorry.
Comment #33
cosmicdreams CreditAttribution: cosmicdreams commentedLooks like what this issue needs in the short term is to pass the failed tests. I'll try to work on that tonight.
Comment #34
cosmicdreams CreditAttribution: cosmicdreams commentedTo start with, a reroll
Comment #35
cosmicdreams CreditAttribution: cosmicdreams commentedI'd like to see how many tests still fail after the reroll.
Comment #37
cosmicdreams CreditAttribution: cosmicdreams commentedyea, that's what I thought. I dissected the way this patch is applying and was able to discern this to be best merging of the old patch with HEAD. Let's see how it performs.
Comment #39
cosmicdreams CreditAttribution: cosmicdreams commentedOh man that patch is filled with fail. Can anyone reroll this patch better?
I'll see if I can fix my patch since the old one doesn't apply cleanly.
Comment #40
duellj CreditAttribution: duellj commentedI'll attempt to reroll this patch against HEAD
Comment #41
duellj CreditAttribution: duellj commentedRerolled patch against head. It seems like a lot of the problems were due to #965300: Change LANGUAGE_NONE to LANGUAGE_NOT_SPECIFIED; add LANGUAGE_NOT_APPLICABLE and LANGUAGE_MULTIPLE, mainly $node->language is now $node->langcode.
Some notes:
Removed, unless there's a specific reason why that's in there
Comment #42
RobLoachWe could move this to modules/node/lib/Drupal/node/Node.php . Doesn't need to be part of this issue though! Looks pretty good to me! If that language issue goes through, I'd consider this pretty good. Changing to needs review to see what the bot says.
Comment #43
duellj CreditAttribution: duellj commentedThere's a problem with with CommentHelperCase::postComment() (the first parameter can either be a $node or NULL). Removed type hinting for that method.
Comment #45
duellj CreditAttribution: duellj commentedAlright, let's try this again. I did remove one test from node.test:
Since the first argument to _node_revision_access() is being type cast, this throws a Recoverable Error, which I think is enough of a test.
I also removed a lot of the changes from clone $node to $node->createDuplicate(). Most of these were in tests, and were causing tests to fail.
There's still a major test that's failing: Language upgrade test. It looks like it's having trouble finding the NodeStorageController class. Here's the error:
Rob Loach suggested moving the classes to modules/node/lib/Drupal/node/Node.php (and NodeStorageController.php), but that didn't work with the upgrade test to autoload the necessary classes. Anyone have any direction on how to fix this?
We'll see what testbot says about the other tests
Comment #47
duellj CreditAttribution: duellj commentedIt looks like autoloader isn't registered in UpgradePathTest (wtf). If add manually call the autoloader, everything works fine:
Obviously this won't fly. Calling spl_autoload_functions() shows that only Symfony\Component\ClassLoader\UniversalClassLoader is the only autoload function that's registered.
I can create a new issue for this (since it seems unrelated), but the patch in #45 won't apply until this is fixed
Comment #48
duellj CreditAttribution: duellj commentedCreated issue for UpgradePathTest bug: #1495024: Convert the entity system to PSR-0
Comment #49
duellj CreditAttribution: duellj commentedPer fago's suggestion here: http://drupal.org/node/1495024#comment-5773606, manually adding in the autoloaders to UpgradePathTest in order for tests to pass. The same method is being used in #1361232: Make the taxonomy entities classed objects. Once the entity system is converted to PSR-0, these can be removed.
Comment #50
klausiOverall the patch looks pretty good. Some problems:
This should use config() instead of variable_get(), right?
unreleated change? Git merge problems? Also elsewhere.
unrelated change to this issue? Also elsewhere.
unrelated change?
why "content_type" and not "content type"?
Description should be "A node entity."
why is this test function removed?
unrelated change, again. There are also other cache related changes that do not belong into this patch.
Comment #51
duellj CreditAttribution: duellj commentedI apologize, git mishap. Pulled in the latest into my 8.x branch, and forgot to merge it into this issue branch. Here's a new patch without all the unrelated changes. Thanks for the catch klausi.
Comment #52
duellj CreditAttribution: duellj commentedNow that all the cruft is removed, here's a cleanup from #50 (for items related to this issue):
Changed "content_type" to "content type"
This is a cleanup from #965300: Change LANGUAGE_NONE to LANGUAGE_NOT_SPECIFIED; add LANGUAGE_NOT_APPLICABLE and LANGUAGE_MULTIPLE, where language was changed to langcode for nodes.
Should we standardize on referring to "node objects" as "node entities"? There are quite a few places where "node object" is used. Might be a separate issue, since it looks like "comment object" is used over "comment entity".
Comment #53
duellj CreditAttribution: duellj commentedOk, it looks like the "object" -> "entity is being standardized here: #1480866: Add type-hinting and parameter type docmentation for comment objects. Updated patch to refer to $node params as "node entity"
Comment #54
Lars Toomre CreditAttribution: Lars Toomre commentedIf you are adding type hinting to a @param or @return directive for a function, please add it all of them in that docblock. It looks really strange to have it on only one of the parameters. Thanks!
Comment #55
aspilicious CreditAttribution: aspilicious commentedSome very minor stuff
This needs an @param for the entity. Is revision saving entity based at this moment? If not why are we typehinting with EntityInterface and not Node?
Only one space needed after '//'
Out of scope but LOL.
Comment #56
BerdirLooks like there are constants for this in comment.module, COMMENT_NODE_HIDDEN and the like. (Yeah node.module and comment.module are nicely interwangled)
Most of these seem to be missing @var.
Note sure if the referenced upgrade path related issue should be dealt with first, as most upgrade tests are affected by this. It can be activated again now that taxonomy entity classes are in.
Comment #57
duellj CreditAttribution: duellj commentedFixed issues from #55 and #56. Also removed the upgrade path related fixes, since they are now in HEAD thanks to the taxonomy entity commit.
@Lars Toomre: type hinting all of the parameters where $node appears is probably outside the scope of this patch.
Comment #59
duellj CreditAttribution: duellj commentedOk, it looks like some things changed when the taxonomy patch went in. This should fix most of the tests.
Is there any reason why NodeStorageController is overriding save() and delete() just to handle revisions? Why not use postSave() and postDelete(), so there's not so much duplicated code?
Comment #60
duellj CreditAttribution: duellj commentedComment #62
fagoI'm not aware of any. So if it works out with the helper methods only, I'd see no reason to not use them.
This should be in the preSave() method too.
And this in postSave().
I think initializing this should be done create().
This does now what the comment says we must not do. Maybe just clone the entity for now.
Why are we cloning here? What's wrong with just updating the node and saving it?
Same here.
Same here.
Comment #63
aspilicious CreditAttribution: aspilicious commentedIf we do the revision stuff in postDelete the caches will be cleared alrdy.
If we handle the revisions in postSave other modules can't alter it before it gets saved as a revision
Comment #64
fagoRight. I don't think that order matters here though - we don't rely on the static caches.
Alterations would need to happen during presave anyway. In contrast I'd consider it a bug that the revision data is not yet saved when the hook says it's post-insert. Looking at node_save() it's correctly working in d7 already, thus we'll have to take care to keep that order (save revision first, then insert/update) hooks.
Comment #65
duellj CreditAttribution: duellj commentedaspilicious is right, I accidentally switched the order of revision execution, which is where many of the errors from #59 came from. Restored proper revision handling in NodeStorageController::save().
Also moved alot of the code form NodeStorageController::invokeHook() to the appropriate methods calls.
Comment #67
aspilicious CreditAttribution: aspilicious commentedOne of the test is probably failing because
$node->original isn't set somehow
The comment suggest to just unset the $node->log ....
EDIT: this is added in #9 but I think it's wrong
Comment #68
duellj CreditAttribution: duellj commentedOk, looks like moving code out of NodeStorageController::invokeHook() broke some code order, so moving back. Tests should pass now.
Comment #69
duellj CreditAttribution: duellj commented#68: node-class-1361234-67.patch queued for re-testing.
Comment #71
Berdir#1512564: Remove entity info from the Entity classes landed, so you need to implement the id() and bundle() method's in the Node class.
Also, just like the User patch already has been, it probably makes sense to convert this to PSR-0 already.
Comment #72
duellj CreditAttribution: duellj commentedYup, working on converting it to PSR-0. Thanks for the update, I was wondering why tests were failing now.
Comment #73
RobLoachFor reference, #1495024: Convert the entity system to PSR-0. PSR-0 doesn't really have to be part of this patch, could easily be done in a follow up.
Comment #74
duellj CreditAttribution: duellj commentedI went ahead and converted Node and NodeStorageController to PSR-0, and added in the id() and bundle() methods to Node. Let's see what testbot says.
Comment #76
BerdirTo fix the exceptions, you need to add a use statement to all files with Node type hints.
Also, the class name needs to be fully qualified in doc blocks AFAIK (someone confirm please), which means a search and replace for "@param Node" with "@param Drupal\node\Node" and the same for @return.
Comment #77
aspilicious CreditAttribution: aspilicious commentedI can confirm everything Berdir says
Comment #78
duellj CreditAttribution: duellj commented@Berdir: It looks like the class names only need to be fully qualified for API docs: http://drupal.org/node/1353118 ( see http://drupal.org/node/1495024#comment-5855632). Let me know if I'm wrong, and I can update the doc blocks.
Thanks for the suggestion to fix the exception tests. There was also a broken test due to the way the caches were being reset in Node::save().
Comment #79
Crell CreditAttribution: Crell commentedIDEs won't properly auto-complete or read class names in docblocks unless they're fully qualified. If the docs don't say to always use fully qualified names in docblocks, they should. :-)
Comment #80
duellj CreditAttribution: duellj commentedOk, changed Node class names to be fully qualified in all docblocks.
Comment #81
Lars Toomre CreditAttribution: Lars Toomre commentedFYI... The recent issue adding type hinting to comment module did not use fully qualified paths. Either this patch or that one needs to be changed so that they match.
Edit: That was issue #1480866: Add type-hinting and parameter type docmentation for comment objects.
Comment #82
duellj CreditAttribution: duellj commented@Lars I think that can be taken care of in #1533020: Convert comment.module entity classes to PSR-0
Comment #83
Berdir@Lars: That's because Comment is not ported to PSR-0 and does not use namespaces yet, which essentially means that "Comment" *is* the fully qualified name. This will be changed in the linked issue where the docblocks will need to be updated.
Comment #84
aspilicious CreditAttribution: aspilicious commentedThe comment and the code doesn't match anymore. So we have to rewrite the comment or the code. If we rewrite the comment we should know WHY it's safe to change the comment.
-12 days to next Drupal core point release.
Comment #85
duellj CreditAttribution: duellj commentedLooks like that was done as a work around with the integration of entity classes and drupal_write_record (http://drupal.org/node/1361234#comment-5455070).
This was fixed in the taxonomy entity patch: http://drupal.org/node/1361232#comment-5437548, so I reverted the change back to the original code. Let's see if testbot complains.
Comment #86
BerdirLooks like $node->log is currently not defined as a property on the Node class, I'm not sure if it should be. It's not part of the main node table but node_revision (which is always present), no idea what the pattern there is. There is similar stuff e.g. in Comment, where we define a number of things in attachLoad() and also fetch certain things from the user table (which should IMHO be removed in the long-term as it breaks entity caching completely).
Do we have a rule what needs to be documented and what not?
If it is a property defined as public $log, then "unset($node->log);" would feel wrong to me.
Comment #87
Crell CreditAttribution: Crell commentedunset($node->log) if log is a defined property is wrong, I agree. That said, log is not, AFAIK, an actual property of the node. Rather, it's a weird control-y variable that's more form element than entity. It's a hold-over from the way that nodes are sometimes not nodes but form_state relabeled as a node, which is a legacy from Drupal 3 and a source of all sorts of grotesque bugs. :-) It should be redeveloped into something else.
Comment #88
stevectorShould log be converted to a field? That's probably a debate for a different issue. I think it could be resolved following the conversion of nodes to classed objects.
Comment #89
sunI'd strongly suggest to perform any functional changes to node revisions in a dedicated separate issue. It needs a proper discussion and also needs to be verified that we're not breaking any assumptions, which may or may not be covered by tests currently.
Thus, for this issue and patch, retain the old unset() code.
Comment #90
stevectorThanks sun, agreed. Follow up issue at #1537214: Clean up node revision log message handling or convert it to a field
Comment #91
aspilicious CreditAttribution: aspilicious commentedRerolled, can we please commit this? To many files affected...
Comment #93
sunReviewed all changes. This patch is RTBC after resolving the remaining test failure.
Comment #94
aspilicious CreditAttribution: aspilicious commentedLet's try this one
Comment #96
aspilicious CreditAttribution: aspilicious commentedAnd what if we "Use" the Node class...
Comment #97
aspilicious CreditAttribution: aspilicious commentedIn fact I just made a typo
Comment #98
xjmAlright, I just did a "quick" (45 min) review. Two things popped out at me but it turns out they are already discussed in the issue:
I was going to ask what the deal is here but it seems to be answered in #52. Seems like it should have been a followup for the original issue, though. I guess it is needed before we can use Entity?
A justification for removing this is in #45. It was added in #1064954: _node_revision_access() static usage to codify the expected behavior of
_node_revision_access()
.Aside, I definitely prefer the type-hinting as a followup like we are doing with User, but too late now. :)
Comment #99
BerdirOk, sun stated in #93 that this is RTBC once the tests pass, xjm did not find anything in #98, neither do I.
RTBC.
Comment #100
sun#97: node-class-1361234-97.patch queued for re-testing.
Comment #102
sunRe-rolled against HEAD.
Comment #103
sun#102: drupal8.node-class.102.patch queued for re-testing.
Comment #104
fagoI've done another close review:
According to the coding styles we do not use a leading \.
This comment leaves it unclear what the value of the property will be.
This won't work as $this->entityInfo does not exist any more.
Again no leading \.
Just storing the global user's id into revision_uid isn't a good idea and doesn't fly with the idea of an entity-save() method at all. Let's better take the value of the $entity->revision_uid property + just default to the current user for now.
Again, there is no $node->timestamp property. This should deal with the $node->revision_timestamp instead. We should always use one and the same property for loading and storing properties, or it's not really a property ;)
Comment #105
fagoattached patch fixes the issues mentioned above. I noted that createDuplicate() is generally broken, thus I opened #1547300: createDuplicate() is broken for most entity types and needs tests for fixing for other entity types.
Updated patch + interdiff attached, also see the 8.x-entity-node branch of http://drupal.org/sandbox/fago/1497344
Comment #106
duellj CreditAttribution: duellj commentedComment #107
Berdir#105: d8-entity-node.patch queued for re-testing.
Comment #109
aspilicious CreditAttribution: aspilicious commented1) Git apply --reject IS AWESOME
2) Can we get this is soonish prety please?
Comment #111
Berdir#109: node-class-1361234-109.patch queued for re-testing.
Comment #113
aspilicious CreditAttribution: aspilicious commented#109: node-class-1361234-109.patch queued for re-testing.
Comment #114
fagoouch, the interim committed entity_load_multiple patch broke it.
I had a look at the reroll of #109 - it looks good to me. Also the tests the bot is failing with work for me. Attached is a re-roll that also fixes the @return docs for node_load().
Comment #115
BerdirThe test failures are caused by #1541792: Enable dynamic allowed list values function with additional context, you can ignore them.
Comment #116
fagook thanks. imo this is good to go. I leave it to someone else to RTBC it as I've done some changes since it was.
Comment #117
aspilicious CreditAttribution: aspilicious commentedOw yeah!
Comment #118
sun#114: d8-entity-node.patch queued for re-testing.
Comment #119
catch待てました.
Comment #120
sunDoesn't seem to be pushed yet: http://drupal.org/node/3060/commits
Comment #121
xjmIt's there now. :)
http://drupalcode.org/project/drupal.git/commit/51c004a
Comment #122
xjmActually, I think this needs to be added to the change notification:
http://drupal.org/node/1400186
Comment #123
aspilicious CreditAttribution: aspilicious commentedAdded the new Classes like we did with taxonomy and comments. Don't think there are other API changes.
Comment #124
xjmI think we also need to document the PSR-0 namespacing of these classes under a subheader on http://drupal.org/node/1479568, preferably in a nice pretty table like we have for the others. This applies to the other entity conversions as well. Edit: Only Node and User are namespaced so far.
Comment #125
aspilicious CreditAttribution: aspilicious commentedIt is possible we introduced some random test failures: http://drupal.org/node/1431634#comment-5923178
:( sad sad
Comment #126
BerdirOk, we did mess up a bit. Luckily, just a bit and I got extremely lucky and got the test failure right on the first time I tried to execute it.
Due to fago's rename from $node->timestamp to $node->revision_timestamp, we did update the existing property, which was used by the submit callback *after* calling save() so the confirmation message used the new timestamp where it should have used to old one. This failed when the difference was enough to be in a different minute.
See patch for details.
To test this, we need to fake a node revision entry far enough into the past to to be sure that the old and new revision time is different enough to trigger this. I haven't yet found time to do this. We might want to commit this asap, I guess...
Comment #127
xjmIn this case I agree; let's fix the bot first, and then add the test as followup.
Comment #128
xjmComment #129
webchickOK, Committed and pushed that hotfix to 8.x to un-screw-up testbot. Thanks, Berdir!
Moving back to ... active?
Comment #130
BerdirUpdated http://drupal.org/node/1400186 to use a table, please review. I think one problem will be that this table will not have enough space once the entity classes have been renamed, so maybe the third column should be changed to "Type" that is either "Entity" or "StorageController", without namespaces.
Comment #131
xjmThe change notification looks good to me. Now it's back to test coverage for #126?
Comment #132
aspilicious CreditAttribution: aspilicious commentedYeah we need the coverage
Comment #133
BerdirThis turned out to be easier than I thought. Patch simply updates the timestamp to yesterday and then does another revert to make sure that we consistently get a test fail with the old code.
Two patches , the tests + a revert of the commited bugfixed and the tests only patch. The tests-only patch is the one that needs to be commited.
Comment #134
sunIn any case, what kind of coding style is that? ;)
Also, the assertion message can be shortened, and $group is reserved for whatever, but not this.
I.e.:
Comment #135
BerdirErm, that's not the assertion message, that's the text we're looking for on the page ;) We can't shorten that ;) And the group wasn't the group, that was the assertion message :p
Agreed that one's not necessary either, though. Let's try this.
Comment #136
aspilicious CreditAttribution: aspilicious commentedI'm marking this rtbc, others have 3 days to proof me wrong ;)
Comment #137
catchLooks good to me too. Committed/pushed to 8.x.