@mauritsvanrees Jenkins CI reporting about code analysis
See the full report here: https://jenkins.plone.org/job/package-plone.app.contentmenu/47/violations
```
plone/__init__.py:0:1: C101 Coding magic comment not found
plone/app/__init__.py:0:1: C101 Coding magic comment not found
plone/app/contentmenu/__init__.py:0:1: C101 Coding magic comment not found
plone/app/contentmenu/__init__.py:3:1: I003 isort expected 1 blank line in imports, found 0
plone/app/contentmenu/__init__.py:3:1: I003 isort expected 1 blank line in imports, found 0
plone/app/contentmenu/displayviewsmenu.py:0:1: C101 Coding magic comment not found
plone/app/contentmenu/displayviewsmenu.py:4:1: I004 isort found an unexpected blank line in imports
plone/app/contentmenu/displayviewsmenu.py:5:1: I001 isort found an import in the wrong position
plone/app/contentmenu/displayviewsmenu.py:10:5: D001 found implements( replace it with zope.interface.implementer
plone/app/contentmenu/interfaces.py:0:1: C101 Coding magic comment not found
plone/app/contentmenu/interfaces.py:5:1: I001 isort found an import in the wrong position
plone/app/contentmenu/interfaces.py:6:1: I004 isort found an unexpected blank line in imports
plone/app/contentmenu/interfaces.py:7:1: I001 isort found an import in the wrong position
plone/app/contentmenu/interfaces.py:37:1: E305 expected 2 blank lines after class or function definition, found 1
plone/app/contentmenu/interfaces.py:37:1: D001 found directlyProvides( replace it with zope.interface.provider
plone/app/contentmenu/menu.py:0:1: C101 Coding magic comment not found
plone/app/contentmenu/menu.py:2:1: I004 isort found an unexpected blank line in imports
plone/app/contentmenu/menu.py:3:1: I001 isort found an import in the wrong position
plone/app/contentmenu/menu.py:6:1: I001 isort found an import in the wrong position
plone/app/contentmenu/menu.py:7:1: I001 isort found an import in the wrong position
plone/app/contentmenu/menu.py:8:1: I001 isort found an import in the wrong position
plone/app/contentmenu/menu.py:9:1: I001 isort found an import in the wrong position
plone/app/contentmenu/menu.py:10:1: I004 isort found an unexpected blank line in imports
plone/app/contentmenu/menu.py:11:1: I001 isort found an import in the wrong position
plone/app/contentmenu/menu.py:12:1: I001 isort found an import in the wrong position
plone/app/contentmenu/menu.py:13:1: I001 isort found an import in the wrong position
plone/app/contentmenu/menu.py:14:1: I001 isort found an import in the wrong position
plone/app/contentmenu/menu.py:15:1: I001 isort found an import in the wrong position
plone/app/contentmenu/menu.py:16:1: I001 isort found an import in the wrong position
plone/app/contentmenu/menu.py:17:1: I001 isort found an import in the wrong position
plone/app/contentmenu/menu.py:18:1: I004 isort found an unexpected blank line in imports
plone/app/contentmenu/menu.py:28:1: I003 isort expected 1 blank line in imports, found 0
plone/app/contentmenu/menu.py:43:5: D001 found implements( replace it with zope.interface.implementer
plone/app/contentmenu/menu.py:47:9: E128 continuation line under-indented for visual indent
plone/app/contentmenu/menu.py:73:13: E128 continuation line under-indented for visual indent
plone/app/contentmenu/menu.py:81:5: D001 found implements( replace it with zope.interface.implementer
plone/app/contentmenu/menu.py:88:13: E128 continuation line under-indented for visual indent
plone/app/contentmenu/menu.py:98:28: S001 found module formatter
plone/app/contentmenu/menu.py:102:80: E501 line too long (84 > 79 characters)
plone/app/contentmenu/menu.py:104:80: E501 line too long (81 > 79 characters)
plone/app/contentmenu/menu.py:106:36: S001 found module formatter
plone/app/contentmenu/menu.py:123:5: D001 found implements( replace it with zope.interface.implementer
plone/app/contentmenu/menu.py:143:17: E128 continuation line under-indented for visual indent
plone/app/contentmenu/menu.py:147:17: E128 continuation line under-indented for visual indent
plone/app/contentmenu/menu.py:228:5: D001 found implements( replace it with zope.interface.implementer
plone/app/contentmenu/menu.py:230:5: C901 'DisplayMenu.getMenuItems' is too complex (24)
plone/app/contentmenu/menu.py:273:66: E502 the backslash is redundant between brackets
plone/app/contentmenu/menu.py:282:5: E125 continuation line with same indent as next logical line
plone/app/contentmenu/menu.py:292:33: E127 continuation line over-indented for visual indent
plone/app/contentmenu/menu.py:308:35: S001 found module formatter
plone/app/contentmenu/menu.py:321:21: E128 continuation line under-indented for visual indent
plone/app/contentmenu/menu.py:322:21: E128 continuation line under-indented for visual indent
plone/app/contentmenu/menu.py:338:25: E128 continuation line under-indented for visual indent
plone/app/contentmenu/menu.py:340:25: E128 continuation line under-indented for visual indent
plone/app/contentmenu/menu.py:341:33: E128 continuation line under-indented for visual indent
plone/app/contentmenu/menu.py:342:31: S001 found module formatter
plone/app/contentmenu/menu.py:362:33: E127 continuation line over-indented for visual indent
plone/app/contentmenu/menu.py:389:35: S001 found module formatter
plone/app/contentmenu/menu.py:396:80: C812 missing trailing comma
plone/app/contentmenu/menu.py:408:33: E128 continuation line under-indented for visual indent
plone/app/contentmenu/menu.py:414:39: S001 found module formatter
plone/app/contentmenu/menu.py:425:40: Q000 Remove bad quotes.
plone/app/contentmenu/menu.py:427:28: P002 found "hasattr", consider replacing it
plone/app/contentmenu/menu.py:435:29: E128 continuation line under-indented for visual indent
plone/app/contentmenu/menu.py:436:29: E128 continuation line under-indented for visual indent
plone/app/contentmenu/menu.py:451:33: E128 continuation line under-indented for visual indent
plone/app/contentmenu/menu.py:454:33: E128 continuation line under-indented for visual indent
plone/app/contentmenu/menu.py:455:41: E128 continuation line under-indented for visual indent
plone/app/contentmenu/menu.py:456:39: S001 found module formatter
plone/app/contentmenu/menu.py:470:5: D001 found implements( replace it with zope.interface.implementer
plone/app/contentmenu/menu.py:476:9: E128 continuation line under-indented for visual indent
plone/app/contentmenu/menu.py:489:16: S001 found module formatter
plone/app/contentmenu/menu.py:521:25: E127 continuation line over-indented for visual indent
plone/app/contentmenu/menu.py:543:5: D001 found implements( replace it with zope.interface.implementer
plone/app/contentmenu/menu.py:565:19: S001 found module formatter
plone/app/contentmenu/menu.py:583:23: S001 found module formatter
plone/app/contentmenu/menu.py:587:25: E128 continuation line under-indented for visual indent
plone/app/contentmenu/menu.py:605:80: E501 line too long (84 > 79 characters)
plone/app/contentmenu/menu.py:608:21: E128 continuation line under-indented for visual indent
plone/app/contentmenu/menu.py:627:5: D001 found implements( replace it with zope.interface.implementer
plone/app/contentmenu/menu.py:647:26: S001 found module formatter
plone/app/contentmenu/menu.py:655:17: E128 continuation line under-indented for visual indent
plone/app/contentmenu/menu.py:694:5: D001 found implements( replace it with zope.interface.implementer
plone/app/contentmenu/menu.py:710:5: C901 'WorkflowMenu.getMenuItems' is too complex (13)
plone/app/contentmenu/menu.py:728:29: Q000 Remove bad quotes.
plone/app/contentmenu/menu.py:729:29: S001 found module formatter
plone/app/contentmenu/menu.py:743:37: S001 found module formatter
plone/app/contentmenu/menu.py:756:31: S001 found module formatter
plone/app/contentmenu/menu.py:783:33: E127 continuation line over-indented for visual indent
plone/app/contentmenu/tests.py:0:1: C101 Coding magic comment not found
plone/app/contentmenu/tests.py:1:1: I001 isort found an import in the wrong position
plone/app/contentmenu/tests.py:2:1: I004 isort found an unexpected blank line in imports
plone/app/contentmenu/tests.py:3:1: I001 isort found an import in the wrong position
plone/app/contentmenu/tests.py:4:1: I001 isort found an import in the wrong position
plone/app/contentmenu/tests.py:5:1: I001 isort found an import in the wrong position
plone/app/contentmenu/tests.py:6:1: I004 isort found an unexpected blank line in imports
plone/app/contentmenu/tests.py:7:1: E402 module level import not at top of file
plone/app/contentmenu/tests.py:7:1: I001 isort found an import in the wrong position
plone/app/contentmenu/tests.py:8:1: E402 module level import not at top of file
plone/app/contentmenu/tests.py:8:1: I001 isort found an import in the wrong position
plone/app/contentmenu/tests.py:9:1: E402 module level import not at top of file
plone/app/contentmenu/tests.py:9:1: I001 isort found an import in the wrong position
plone/app/contentmenu/tests.py:10:1: E402 module level import not at top of file
plone/app/contentmenu/tests.py:10:1: I001 isort found an import in the wrong position
plone/app/contentmenu/tests.py:11:1: I004 isort found an unexpected blank line in imports
plone/app/contentmenu/tests.py:12:1: E402 module level import not at top of file
plone/app/contentmenu/tests.py:12:1: I001 isort found an import in the wrong position
plone/app/contentmenu/tests.py:13:1: E402 module level import not at top of file
plone/app/contentmenu/tests.py:13:1: I001 isort found an import in the wrong position
plone/app/contentmenu/tests.py:14:1: E402 module level import not at top of file
plone/app/contentmenu/tests.py:14:1: I001 isort found an import in the wrong position
plone/app/contentmenu/tests.py:15:1: E402 module level import not at top of file
plone/app/contentmenu/tests.py:15:1: I001 isort found an import in the wrong position
plone/app/contentmenu/tests.py:16:1: E402 module level import not at top of file
plone/app/contentmenu/tests.py:16:1: I001 isort found an import in the wrong position
plone/app/contentmenu/tests.py:17:1: E402 module level import not at top of file
plone/app/contentmenu/tests.py:17:1: I001 isort found an import in the wrong position
plone/app/contentmenu/tests.py:18:1: I004 isort found an unexpected blank line in imports
plone/app/contentmenu/tests.py:19:1: E402 module level import not at top of file
plone/app/contentmenu/tests.py:20:1: E402 module level import not at top of file
plone/app/contentmenu/tests.py:21:1: E402 module level import not at top of file
plone/app/contentmenu/tests.py:22:1: E402 module level import not at top of file
plone/app/contentmenu/tests.py:23:1: I003 isort expected 1 blank line in imports, found 0
plone/app/contentmenu/tests.py:23:1: I003 isort expected 1 blank line in imports, found 0
plone/app/contentmenu/tests.py:23:1: I003 isort expected 1 blank line in imports, found 0
plone/app/contentmenu/tests.py:23:1: I003 isort expected 1 blank line in imports, found 0
plone/app/contentmenu/tests.py:23:1: I003 isort expected 1 blank line in imports, found 0
plone/app/contentmenu/tests.py:23:1: I003 isort expected 1 blank line in imports, found 0
plone/app/contentmenu/tests.py:34:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:37:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:41:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:41:80: E501 line too long (96 > 79 characters)
plone/app/contentmenu/tests.py:53:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:56:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:63:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:63:80: E501 line too long (80 > 79 characters)
plone/app/contentmenu/tests.py:69:80: E501 line too long (94 > 79 characters)
plone/app/contentmenu/tests.py:81:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:83:14: D001 found failIf( replace it with assertFalse
plone/app/contentmenu/tests.py:86:9: E125 continuation line with same indent as next logical line
plone/app/contentmenu/tests.py:93:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:95:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:95:80: E501 line too long (105 > 79 characters)
plone/app/contentmenu/tests.py:96:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:96:80: E501 line too long (101 > 79 characters)
plone/app/contentmenu/tests.py:102:80: E501 line too long (80 > 79 characters)
plone/app/contentmenu/tests.py:108:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:110:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:116:14: D001 found failIf( replace it with assertFalse
plone/app/contentmenu/tests.py:118:14: D001 found failIf( replace it with assertFalse
plone/app/contentmenu/tests.py:123:9: D001 found directlyProvides( replace it with zope.interface.provider
plone/app/contentmenu/tests.py:125:14: D001 found failIf( replace it with assertFalse
plone/app/contentmenu/tests.py:139:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:146:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:148:14: D001 found failIf( replace it with assertFalse
plone/app/contentmenu/tests.py:161:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:162:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:170:14: D001 found failIf( replace it with assertFalse
plone/app/contentmenu/tests.py:171:14: D001 found failIf( replace it with assertFalse
plone/app/contentmenu/tests.py:181:14: D001 found failIf( replace it with assertFalse
plone/app/contentmenu/tests.py:182:14: D001 found failIf( replace it with assertFalse
plone/app/contentmenu/tests.py:188:35: Q000 Remove bad quotes.
plone/app/contentmenu/tests.py:194:14: D001 found assertEquals( replace it with assertEqual
plone/app/contentmenu/tests.py:194:27: Q000 Remove bad quotes.
plone/app/contentmenu/tests.py:208:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:211:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:215:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:221:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:222:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:223:13: S001 found module formatter
plone/app/contentmenu/tests.py:235:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:236:58: E502 the backslash is redundant between brackets
plone/app/contentmenu/tests.py:237:17: E131 continuation line unaligned for hanging indent
plone/app/contentmenu/tests.py:238:14: D001 found failIf( replace it with assertFalse
plone/app/contentmenu/tests.py:244:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:255:14: D001 found failIf( replace it with assertFalse
plone/app/contentmenu/tests.py:258:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:260:14: D001 found failIf( replace it with assertFalse
plone/app/contentmenu/tests.py:281:80: E501 line too long (81 > 79 characters)
plone/app/contentmenu/tests.py:285:80: E501 line too long (82 > 79 characters)
plone/app/contentmenu/tests.py:290:14: D001 found failIf( replace it with assertFalse
plone/app/contentmenu/tests.py:298:14: D001 found failIf( replace it with assertFalse
plone/app/contentmenu/tests.py:299:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:300:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:300:80: E501 line too long (88 > 79 characters)
plone/app/contentmenu/tests.py:301:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:301:80: E501 line too long (92 > 79 characters)
plone/app/contentmenu/tests.py:311:80: E501 line too long (81 > 79 characters)
plone/app/contentmenu/tests.py:315:9: D001 found directlyProvides( replace it with zope.interface.provider
plone/app/contentmenu/tests.py:322:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:332:14: D001 found failIf( replace it with assertFalse
plone/app/contentmenu/tests.py:345:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:348:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:352:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:354:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:362:42: Q000 Remove bad quotes.
plone/app/contentmenu/tests.py:364:29: Q000 Remove bad quotes.
plone/app/contentmenu/tests.py:366:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:368:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:389:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:395:14: D001 found failIf( replace it with assertFalse
plone/app/contentmenu/tests.py:400:14: D001 found failIf( replace it with assertFalse
plone/app/contentmenu/tests.py:403:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:421:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:431:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:499:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:535:9: D001 found directlyProvides( replace it with zope.interface.provider
plone/app/contentmenu/tests.py:539:14: D001 found failIf( replace it with assertFalse
plone/app/contentmenu/tests.py:567:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:577:7: T000 Todo note found.
plone/app/contentmenu/tests.py:594:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:595:14: D001 found failUnless( replace it with assertTrue
plone/app/contentmenu/tests.py:603:14: D001 found failIf( replace it with assertFalse
plone/app/contentmenu/tests.py:617:26: Q000 Remove bad quotes.
plone/app/contentmenu/view.py:0:1: C101 Coding magic comment not found
plone/app/contentmenu/view.py:4:1: I001 isort found an import in the wrong position
plone/app/contentmenu/view.py:5:1: I004 isort found an unexpected blank line in imports
plone/app/contentmenu/view.py:6:1: I001 isort found an import in the wrong position
plone/app/contentmenu/view.py:7:1: I004 isort found an unexpected blank line in imports
plone/app/contentmenu/view.py:8:1: I001 isort found an import in the wrong position
plone/app/contentmenu/view.py:15:5: D001 found implements( replace it with zope.interface.implementer
```
Follow [these instructions](https://github.com/plone/jenkins.plone.org/blob/master/docs/source/run-qa-on-package.rst) to reproduce it locally.


all tests pass:
success: https://travis-ci.org/stellar/stellar-core/builds/489261017?utm_source=github_status&utm_medium=notification


Updated


@ck4adventure do you know where this should point? it was an old 1.9 link that i had to update :yikes:


Yei


Furthermore it's not useless, because this mount binds prevents the extra NFC packages to work.


Looks good


Good update


Successfully aliased the URL <https://overreactedio-5t0okfgk3.now.sh> to the following alias.

* https://overreacted.io


Successfully aliased the URL <https://blog-yp5pj4m4u.now.sh> to the following aliases.

* https://timostaudinger.com
* https://timo.codes
* https://tms.sh


@esteele Jenkins CI reporting about code analysis
See the full report here: https://jenkins.plone.org/job/package-plone.app.contentrules/64/violations
```
plone/app/contentrules/handlers.py:80:12: P002 found "hasattr", consider replacing it
plone/app/contentrules/handlers.py:82:12: P002 found "hasattr", consider replacing it
plone/app/contentrules/handlers.py:89:8: P002 found "hasattr", consider replacing it
plone/app/contentrules/handlers.py:92:8: P002 found "hasattr", consider replacing it
plone/app/contentrules/actions/copy.py:85:45: C812 missing trailing comma
plone/app/contentrules/actions/copy.py:86:18: C812 missing trailing comma
plone/app/contentrules/actions/copy.py:126:56: C812 missing trailing comma
plone/app/contentrules/actions/logger.py:22:60: C812 missing trailing comma
plone/app/contentrules/actions/logger.py:50:10: C812 missing trailing comma
plone/app/contentrules/actions/logger.py:94:18: C812 missing trailing comma
plone/app/contentrules/actions/mail.py:39:22: C812 missing trailing comma
plone/app/contentrules/actions/mail.py:45:57: C812 missing trailing comma
plone/app/contentrules/actions/mail.py:47:23: C812 missing trailing comma
plone/app/contentrules/actions/mail.py:53:67: C812 missing trailing comma
plone/app/contentrules/actions/mail.py:55:22: C812 missing trailing comma
plone/app/contentrules/actions/mail.py:59:80: C812 missing trailing comma
plone/app/contentrules/actions/mail.py:64:22: C812 missing trailing comma
plone/app/contentrules/actions/mail.py:102:5: C901 'MailActionExecutor.__call__' is too complex (13)
plone/app/contentrules/actions/mail.py:106:74: C812 missing trailing comma
plone/app/contentrules/actions/mail.py:129:78: C812 missing trailing comma
plone/app/contentrules/actions/mail.py:152:19: C812 missing trailing comma
plone/app/contentrules/actions/mail.py:165:19: T000 Todo note found.
plone/app/contentrules/actions/mail.py:176:78: C812 missing trailing comma
plone/app/contentrules/actions/move.py:54:52: C812 missing trailing comma
plone/app/contentrules/actions/move.py:91:18: C812 missing trailing comma
plone/app/contentrules/actions/move.py:144:56: C812 missing trailing comma
plone/app/contentrules/browser/assignments.py:24:5: C901 'ManageAssignments.__call__' is too complex (14)
plone/app/contentrules/browser/assignments.py:154:54: C812 missing trailing comma
plone/app/contentrules/browser/controlpanel.py:83:18: C812 missing trailing comma
plone/app/contentrules/browser/elements.py:29:5: C901 'ManageElements.__call__' is too complex (12)
plone/app/contentrules/browser/elements.py:77:45: C812 missing trailing comma
plone/app/contentrules/conditions/fileextension.py:31:22: C812 missing trailing comma
plone/app/contentrules/conditions/fileextension.py:49:50: C812 missing trailing comma
plone/app/contentrules/conditions/fileextension.py:90:78: C812 missing trailing comma
plone/app/contentrules/conditions/fileextension.py:113:78: C812 missing trailing comma
plone/app/contentrules/conditions/group.py:27:77: C812 missing trailing comma
plone/app/contentrules/conditions/group.py:45:60: C812 missing trailing comma
plone/app/contentrules/conditions/group.py:84:70: C812 missing trailing comma
plone/app/contentrules/conditions/group.py:105:70: C812 missing trailing comma
plone/app/contentrules/conditions/portaltype.py:33:72: C812 missing trailing comma
plone/app/contentrules/conditions/portaltype.py:34:10: C812 missing trailing comma
plone/app/contentrules/conditions/portaltype.py:60:50: C812 missing trailing comma
plone/app/contentrules/conditions/portaltype.py:79:16: P002 found "hasattr", consider replacing it
plone/app/contentrules/conditions/portaltype.py:98:34: C812 missing trailing comma
plone/app/contentrules/conditions/portaltype.py:119:26: C812 missing trailing comma
plone/app/contentrules/conditions/role.py:28:76: C812 missing trailing comma
plone/app/contentrules/conditions/role.py:46:59: C812 missing trailing comma
plone/app/contentrules/conditions/role.py:84:51: C812 missing trailing comma
plone/app/contentrules/conditions/role.py:105:51: C812 missing trailing comma
plone/app/contentrules/conditions/wfstate.py:28:63: C812 missing trailing comma
plone/app/contentrules/conditions/wfstate.py:29:10: C812 missing trailing comma
plone/app/contentrules/conditions/wfstate.py:46:59: C812 missing trailing comma
plone/app/contentrules/conditions/wftransition.py:28:68: C812 missing trailing comma
plone/app/contentrules/conditions/wftransition.py:29:10: C812 missing trailing comma
plone/app/contentrules/exportimport/rules.py:30:1: I004 isort found an unexpected blank line in imports
plone/app/contentrules/exportimport/rules.py:138:11: T000 Todo note found.
plone/app/contentrules/exportimport/rules.py:201:5: C901 'RulesXMLAdapter._initRules' is too complex (21)
plone/app/contentrules/tests/test_action_delete.py:12:1: F401 'plone.app.testing.login' imported but unused
plone/app/contentrules/tests/test_action_delete.py:12:1: I001 isort found an import in the wrong position
plone/app/contentrules/tests/test_action_delete.py:13:1: F401 'plone.app.testing.TEST_USER_ID' imported but unused
plone/app/contentrules/tests/test_action_delete.py:13:1: I001 isort found an import in the wrong position
plone/app/contentrules/tests/test_action_delete.py:14:1: F401 'plone.app.testing.TEST_USER_NAME' imported but unused
plone/app/contentrules/tests/test_action_delete.py:14:1: I001 isort found an import in the wrong position
plone/app/contentrules/tests/test_action_delete.py:15:1: F401 'plone.app.testing.setRoles' imported but unused
plone/app/contentrules/tests/test_action_delete.py:15:1: I001 isort found an import in the wrong position
plone/app/contentrules/tests/test_action_logger.py:6:1: F401 'plone.app.testing.TEST_USER_ID' imported but unused
plone/app/contentrules/tests/test_action_mail.py:50:11: T000 Todo note found.
plone/app/contentrules/tests/test_action_mail.py:95:14: C812 missing trailing comma
plone/app/contentrules/tests/test_action_mail.py:250:73: C812 missing trailing comma
plone/app/contentrules/tests/test_action_workflow.py:70:14: C812 missing trailing comma
plone/app/contentrules/tests/test_action_workflow.py:89:14: C812 missing trailing comma
plone/app/contentrules/tests/test_browser.py:2:80: E501 line too long (84 > 79 characters)
plone/app/contentrules/tests/test_cascading_rule.py:3:80: E501 line too long (84 > 79 characters)
plone/app/contentrules/tests/test_condition_wftransition.py:68:18: C812 missing trailing comma
plone/app/contentrules/tests/test_condition_wftransition.py:83:18: C812 missing trailing comma
plone/app/contentrules/tests/test_condition_wftransition.py:98:18: C812 missing trailing comma
plone/app/contentrules/tests/test_configuration.py:90:80: E501 line too long (85 > 79 characters)
plone/app/contentrules/tests/test_events.py:8:11: T000 Todo note found.
plone/app/contentrules/tests/test_events.py:12:11: T000 Todo note found.
plone/app/contentrules/tests/test_rule_assignment_mapping.py:7:1: F401 'plone.app.contentrules.tests.base.ContentRulesTestCase' imported but unused
plone/app/contentrules/tests/test_traversal.py:4:1: I001 isort found an import in the wrong position
plone/app/contentrules/tests/test_traversal.py:5:1: I001 isort found an import in the wrong position
```
Follow [these instructions](https://github.com/plone/jenkins.plone.org/blob/master/docs/source/run-qa-on-package.rst) to reproduce it locally.


Don't work on smd660 since Whyred Caf release.. Stop copy&paste from msm8998 ;)


The following doc(s) have been deployed to the [4431multid](https://4431multid-static-docs.pantheonsite.io/docs) Multidev environment:
- [/docs/git](https://4431multid-static-docs.pantheonsite.io/docs/git)
- [/docs/multidev-faq](https://4431multid-static-docs.pantheonsite.io/docs/multidev-faq)
- [/docs/terminus/updates](https://4431multid-static-docs.pantheonsite.io/docs/terminus/updates)
- [source/docs/assets/css/main.css](https://github.com/pantheon-systems/documentation/commit/65d3a1fd4b79b6a3f7c0fdce442196692494c001/source/docs/assets/css/main.css)


jk this page exists 😅