plone.api: plone development best practices revealed

78
plone.api Plone development best practices revealed @nzupan petek, 04. oktober 13

Upload: nejc-zupan

Post on 24-Dec-2014

622 views

Category:

Technology


0 download

DESCRIPTION

The plone.api is an elegant and simple API, built for humans wishing to develop with Plone. It comes with cookbook-like documentation with step-by-step instructions for doing common development tasks in Plone. Recipes try to assume the user does not have extensive knowledge about Plone internals. The talk will be about the philosophy and rationale behind it, what it offers and how to use it. Since recently plone.api's code conventions and style guide have been adopted by the Framework Team as the Plone Core conventions. We'll go through these recommendations and discuss why they are there and why you should start using them in your own code also. Finally, we'll walk through some bits and pieces of plone.api's internal code, to give you the idea of how modern Plone code should be organized and formatted, as an example of coding conventions mentioned above.

TRANSCRIPT

Page 1: plone.api: plone development best practices revealed

plone.apiPlone development best practices revealed

@nzupan

petek, 04. oktober 13

Page 2: plone.api: plone development best practices revealed

Everybody stand up please!

petek, 04. oktober 13

Page 3: plone.api: plone development best practices revealed

petek, 04. oktober 13

Page 4: plone.api: plone development best practices revealed

self.context

petek, 04. oktober 13

Page 5: plone.api: plone development best practices revealed

• 2006

• Student workshop

• Plone 2.5

• Life was good!

petek, 04. oktober 13

Page 6: plone.api: plone development best practices revealed

eestec.net

• Online since 2009

• Switched to Plone 3 during development

• +2500 users

• Several events per month

petek, 04. oktober 13

Page 7: plone.api: plone development best practices revealed

+2500Electrical

Engineering Students

petek, 04. oktober 13

Page 8: plone.api: plone development best practices revealed

no. of new contributors:

petek, 04. oktober 13

Page 9: plone.api: plone development best practices revealed

no. of new contributors:

2

petek, 04. oktober 13

Page 10: plone.api: plone development best practices revealed

eestec.net

• Online since 2009

• ***Switched to Plone 3 during development***

• +2500 users

• Several events per month

petek, 04. oktober 13

Page 11: plone.api: plone development best practices revealed

Plone 3Impossible to: - train - write docs for - stay productive - keep devs happy

petek, 04. oktober 13

Page 12: plone.api: plone development best practices revealed

Plone 4?

petek, 04. oktober 13

Page 13: plone.api: plone development best practices revealed

From where to import that thing?

petek, 04. oktober 13

Page 14: plone.api: plone development best practices revealed

Many ways to get the Site root: which

is correct?

petek, 04. oktober 13

Page 15: plone.api: plone development best practices revealed

Copy/move objects?

target.manage_pasteObjects( source.manage_cutObjects(source_id))

petek, 04. oktober 13

Page 16: plone.api: plone development best practices revealed

Workflow state?workflow = getToolByName(portal,'portal_workflow'

)workflow.getInfoFor(obj, 'review_state')

petek, 04. oktober 13

Page 17: plone.api: plone development best practices revealed

petek, 04. oktober 13

Page 18: plone.api: plone development best practices revealed

plone.api

petek, 04. oktober 13

Page 19: plone.api: plone development best practices revealed

plone.api• Started at Plone Konf Munich (2012)• Alpha release at Belgian Beer Sprint

(2012)• Beta release at Plone Conference in

Arnhem (2013)• RC at Wine Sprint Munich (2013)• 1.0 this week?

petek, 04. oktober 13

Page 20: plone.api: plone development best practices revealed

Inspiration

• PEP20• PEP8• Pareto Principle• SQLAlchemy• Requests

petek, 04. oktober 13

Page 21: plone.api: plone development best practices revealed

From where to import that thing?

petek, 04. oktober 13

Page 22: plone.api: plone development best practices revealed

from plone import api

petek, 04. oktober 13

Page 23: plone.api: plone development best practices revealed

Many ways to get the Site root: which

is correct?

petek, 04. oktober 13

Page 24: plone.api: plone development best practices revealed

api.portal.get()

petek, 04. oktober 13

Page 25: plone.api: plone development best practices revealed

Copy/move objects?

target.manage_pasteObjects( source.manage_cutObjects(source_id))

petek, 04. oktober 13

Page 26: plone.api: plone development best practices revealed

portal = api.portal.get()contact = portal['about']['contact']

api.content.move( source=contact, target=portal,)

petek, 04. oktober 13

Page 27: plone.api: plone development best practices revealed

Workflow state?workflow = getToolByName(portal,'portal_workflow'

)workflow.getInfoFor(obj, 'review_state')

petek, 04. oktober 13

Page 28: plone.api: plone development best practices revealed

api.content.get_state(obj=portal['about']

)

api.content.transition(obj=portal['about'], transition='publish',

)

petek, 04. oktober 13

Page 29: plone.api: plone development best practices revealed

It’s documented!

petek, 04. oktober 13

Page 30: plone.api: plone development best practices revealed

It’s documented

• Document first• Narrative documentation• Advanced usage documentation• Good code comments

petek, 04. oktober 13

Page 31: plone.api: plone development best practices revealed

petek, 04. oktober 13

Page 32: plone.api: plone development best practices revealed

petek, 04. oktober 13

Page 33: plone.api: plone development best practices revealed

It’s documented

• Document first• Narrative documentation• Advanced usage documentation• Good code comments

petek, 04. oktober 13

Page 34: plone.api: plone development best practices revealed

petek, 04. oktober 13

Page 35: plone.api: plone development best practices revealed

It’s tested!

petek, 04. oktober 13

Page 36: plone.api: plone development best practices revealed

It’s tested

• ~99% test coverage• Narrative documentation included• Continuous Integration

petek, 04. oktober 13

Page 37: plone.api: plone development best practices revealed

petek, 04. oktober 13

Page 38: plone.api: plone development best practices revealed

Import and Usage style

from plone import api

portal = api.portal.get()

user = api.user.create(username='bob')

api.content.move(

source=portal['blog'],

id='old-blog',

)petek, 04. oktober 13

Page 39: plone.api: plone development best practices revealed

• get()• get_navigation_root()• get_tool()• get_localized_time()• send_email()• show_message()• get_registry_record()

api.portal

petek, 04. oktober 13

Page 40: plone.api: plone development best practices revealed

api.content

• create()• get()• delete()• copy()• move()• rename()

• get_uuid()• get_view()• get_state()• transition()

petek, 04. oktober 13

Page 41: plone.api: plone development best practices revealed

api.user

• create()• get()• get_users()• get_current()• delete()

• is_anonymous()• get_roles()• get_permissions()• grant_roles()• revoke_roles()

petek, 04. oktober 13

Page 42: plone.api: plone development best practices revealed

api.group

• create()• get()• get_groups()• delete()

• add_user()• remove_user()• get_roles()• get_permissions()• grant_roles()• revoke_roles()

petek, 04. oktober 13

Page 43: plone.api: plone development best practices revealed

api.env

• adopt_roles() • adopt_user()

petek, 04. oktober 13

Page 44: plone.api: plone development best practices revealed

In the wild

• tutorial.todoapp• 150k objects / +1000 users production

site• hands up?

petek, 04. oktober 13

Page 45: plone.api: plone development best practices revealed

Latest Additions

• Various bug fixes• api.env.adopt_user() & api.env.adopt_roles()• Coding style guide!

petek, 04. oktober 13

Page 46: plone.api: plone development best practices revealed

api.env.adopt_roles

petek, 04. oktober 13

Page 47: plone.api: plone development best practices revealed

api.env.adopt_user

petek, 04. oktober 13

Page 48: plone.api: plone development best practices revealed

The Style Guide(included in Plone 5 core)

petek, 04. oktober 13

Page 49: plone.api: plone development best practices revealed

The Style Guide

• PEP 8• PEP 257• Rope project• Google Style Guide• Pylons Coding Style• Tim Pope on Git commit messages

petek, 04. oktober 13

Page 50: plone.api: plone development best practices revealed

Line Length

• 80 chars• # noqa if you need to break it• configure your editor!

petek, 04. oktober 13

Page 51: plone.api: plone development best practices revealed

Breaking Lines

• 1. Break into next line with one additional indent block

petek, 04. oktober 13

Page 52: plone.api: plone development best practices revealed

Breaking Lines

• 2. If this still doesn’t fit the 80-char limit, break into multiple lines

petek, 04. oktober 13

Page 53: plone.api: plone development best practices revealed

Docstrings

petek, 04. oktober 13

Page 54: plone.api: plone development best practices revealed

unittest2

• http://www.voidspace.org.uk/python/articles/unittest2.shtml

• fail* -> use assert* instead

• assertEquals -> assertEqual is the one true way

petek, 04. oktober 13

Page 55: plone.api: plone development best practices revealed

unittest2

• Deprecated:

failUnlessEqual, failIfEqual, failUnlessAlmostEqual, failIfAlmostEqual, failUnless,failUnlessRaises and failIf

petek, 04. oktober 13

Page 56: plone.api: plone development best practices revealed

unittest2

• assertGreater / assertLess / assertGreaterEqual / assertLessEqual

• assertRegexpMatches(text, regexp)

• assertIn(value, sequence)

• assertIs(first, second)

• assertIsNone

petek, 04. oktober 13

Page 57: plone.api: plone development best practices revealed

unittest2

• assertIsInstance / assertNotIsInstance

• assertDictContainsSubset(subset, full)

• assertSequenceEqual(actual, expected)

• assertItemsEqual(actual, expected)

petek, 04. oktober 13

Page 58: plone.api: plone development best practices revealed

unittest2

petek, 04. oktober 13

Page 59: plone.api: plone development best practices revealed

unittest2

• assertMultiLineEqual

• assertSetEqual

• assertDictEqual

• assertListEqual

• assertTupleEqual

petek, 04. oktober 13

Page 60: plone.api: plone development best practices revealed

unittest2

petek, 04. oktober 13

Page 61: plone.api: plone development best practices revealed

String Formatting

• Prefer new-style format()• Use numbering to support Python 2.6

petek, 04. oktober 13

Page 62: plone.api: plone development best practices revealed

Imports

petek, 04. oktober 13

Page 63: plone.api: plone development best practices revealed

Tracking Changes

petek, 04. oktober 13

Page 64: plone.api: plone development best practices revealed

Versioning Scheme

petek, 04. oktober 13

Page 65: plone.api: plone development best practices revealed

Commit Messages

petek, 04. oktober 13

Page 66: plone.api: plone development best practices revealed

Many More

• String quoting• Git workflow & branching model• Release process

petek, 04. oktober 13

Page 67: plone.api: plone development best practices revealed

Bonus Slide: plone.dotfiles

petek, 04. oktober 13

Page 68: plone.api: plone development best practices revealed

Coming up

petek, 04. oktober 13

Page 69: plone.api: plone development best practices revealed

api.env

• api.env.debug_mode()

• api.env.test_mode()

• api.env.plone_version()

• api.env.zope_version()

petek, 04. oktober 13

Page 70: plone.api: plone development best practices revealed

api.system

• Run upgrades

• Cleanup broken objects, utilities, interfaces ...

• Mount things

• Make sysadmins happy!

petek, 04. oktober 13

Page 71: plone.api: plone development best practices revealed

JSON WebServices

• Probably packaged as plone.jsonapi

• One-to-one mapping to plone.api methods

• @@jsonapi view

• Standardized JavaScript writing!

petek, 04. oktober 13

Page 72: plone.api: plone development best practices revealed

BONUS SLIDE!

petek, 04. oktober 13

Page 73: plone.api: plone development best practices revealed

Post-Conference sprint

• Implement remaining plone.api methods

• Get the test coverage even higher!

• Native speakers’ love to our docs

• Let’s get 1.0 release out there!

petek, 04. oktober 13

Page 74: plone.api: plone development best practices revealed

Open Tasks

• Deprecate plone.api on RTD

• Sphinx warnings should break the build

• plone.recipe.codeanalysis

• Coveralls.io

• Various bugs

• Proof-reading documentation

petek, 04. oktober 13

Page 75: plone.api: plone development best practices revealed

Open Tasks

• Changelog decision:

• CHANGES.rst or docs/CHANGES.rst

• “CHANGELOG” or “Changelog” or “CHANGES” or “Changes” for heading

petek, 04. oktober 13

Page 76: plone.api: plone development best practices revealed

Open Tasks

• Permission checks decision:

• apply them?

• go around them?

• let the user decide with “strict=True”?

petek, 04. oktober 13

Page 77: plone.api: plone development best practices revealed

Open Tasks

• THE BIG ONE: usage scope

• use in core? performance issues ...

• use in add-ons? might creep into core

• only allow usage in integration code?

petek, 04. oktober 13

Page 78: plone.api: plone development best practices revealed

Thanks!&

See you at the sprint

http://github.com/plone/plone.api

petek, 04. oktober 13