The state of packaging Tarek Ziad tarek@critsend.com @tarek_ziade - - PowerPoint PPT Presentation

the state of packaging
SMART_READER_LITE
LIVE PREVIEW

The state of packaging Tarek Ziad tarek@critsend.com @tarek_ziade - - PowerPoint PPT Presentation

The state of packaging Tarek Ziad tarek@critsend.com @tarek_ziade Friday, February 19, 2010 Google Moderator http://tiny.cc/packaging13 Friday, February 19, 2010 Packaging sucks Friday, February 19, 2010 2007 We need to package and


slide-1
SLIDE 1

The state of packaging

tarek@critsend.com @tarek_ziade

Tarek Ziadé

Friday, February 19, 2010
slide-2
SLIDE 2

http://tiny.cc/packaging13

Google Moderator

Friday, February 19, 2010
slide-3
SLIDE 3

Packaging sucks

Friday, February 19, 2010
slide-4
SLIDE 4

We need to package and release our Python apps !

  • n all systems !

I’ll work on it !

Packaging ? mm.. Distutils or Setuptools should work

2007

Friday, February 19, 2010
slide-5
SLIDE 5

So how do we install

  • ur product ?

Sweet ! How do we remove it ? Are you kidding ? easy_install foo Manually But boss, you want a portable installer !

2007

Friday, February 19, 2010
slide-6
SLIDE 6

I’ll use virtualenv !

And create local installation with everything For every app sysadmins will hate me

2008

Friday, February 19, 2010
slide-7
SLIDE 7

But I want to improve packaging !

Let’s try to fix things from the root This will be my contribution to Python

2008-9

Friday, February 19, 2010
slide-8
SLIDE 8

Distutils Setuptools Developer PoV

?

Friday, February 19, 2010
slide-9
SLIDE 9

site-packages

pip install foo easy_install foo

python setup.py install

User PoV

Friday, February 19, 2010
slide-10
SLIDE 10

Distutils Setuptools Pip Distribute PyPM Enstaller numpy.distutils 4suite.distutils Global PoV

Friday, February 19, 2010
slide-11
SLIDE 11

Standardization

Friday, February 19, 2010
slide-12
SLIDE 12
  • 1. Metadata standardization
  • 2. Version schemas
  • 3. Installed distributions index

What is presented

Friday, February 19, 2010
slide-13
SLIDE 13
  • build/compiling flaws in Distutils
  • target-specific binary distributions

problems

  • trillions of things we are working on...

What is not presented

Friday, February 19, 2010
slide-14
SLIDE 14

Distutils is not cmake

Friday, February 19, 2010
slide-15
SLIDE 15

Metadata standardization

Part 1

Friday, February 19, 2010
slide-16
SLIDE 16

PEP 314

Metadata for Python Software Package 1.1

Actual

Friday, February 19, 2010
slide-17
SLIDE 17

PKG-INFO example

M e t a d a t a

  • V

e r s i

  • n

: 1 . N a m e : p i p V e r s i

  • n

: . 6 S u m m a r y : p i p i n s t a l l s p a c k a g e s . P y t h

  • n

p a c k a g e s . A n e a s y _ i n s t a l l r e p l a c e m e n t H

  • m

e

  • p

a g e : h t t p : / / p i p .

  • p

e n p l a n s .

  • r

g A u t h

  • r

: T h e O p e n P l a n n i n g P r

  • j

e c t A u t h

  • r
  • e

m a i l : p y t h

  • n
  • v

i r t u a l e n v @ g r

  • u

p s . g

  • g

l e . c

  • m

L i c e n s e : M I T K e y w

  • r

d s : e a s y _ i n s t a l l d i s t u t i l s s e t u p t

  • l

s e g g v i r t u a l e n v P l a t f

  • r

m : U N K N O W N C l a s s i fi e r : D e v e l

  • p

m e n t S t a t u s : : 4

  • B

e t a C l a s s i fi e r : I n t e n d e d A u d i e n c e : : D e v e l

  • p

e r s C l a s s i fi e r : L i c e n s e : : O S I A p p r

  • v

e d : : M I T L i c e n s e C l a s s i fi e r : T

  • p

i c : : S

  • f

t w a r e D e v e l

  • p

m e n t : : B u i l d T

  • l

s

Friday, February 19, 2010
slide-18
SLIDE 18

Project Distribution

python setup.py sdist

setup.py PKG-INFO

PyPI

PKG-INFO

Target system

PKG-INFO

(PEP 314) (PEP 314) (PEP 314)

Distutils metadata cycle

setup(options)

Friday, February 19, 2010
slide-19
SLIDE 19

Project Distribution

python setup.py sdist

setup.py PKG-INFO

PyPI

PKG-INFO

Target system

PKG-INFO

(PEP 314) (PEP 314) (PEP 314)

Setuptools metadata cycle

setup(options) + requires.txt + .... + requires.txt + .... + ?????

Friday, February 19, 2010
slide-20
SLIDE 20

PEP 345

Metadata for Python Software Package 1.2

Accepted

Friday, February 19, 2010
slide-21
SLIDE 21

Requires-Dist

Requires-Dist: zope.interface (>3.5) Requires-Dist: PasteDeploy

Friday, February 19, 2010
slide-22
SLIDE 22

Version specifiers

<, >, <=, >=, == and !=

Requires-Dist: zope.interface (>3.5, <4.0)

Friday, February 19, 2010
slide-23
SLIDE 23

Version specifiers

  • > 2.6, < 3
  • 3.5 means 3.5.x
  • 2.5.0 means >=2.5.0,<2.5.1
  • >=3.1,!=3.1.3,<3.2
Friday, February 19, 2010
slide-24
SLIDE 24

Requires-Python

Requires-Python: >2.4 Requires-Python: >=2.5, <2.7

Friday, February 19, 2010
slide-25
SLIDE 25

Requires-External

Requires-External: libxslt Requires-External: libpng (>=1.5)

Friday, February 19, 2010
slide-26
SLIDE 26

Provides-Dist

Provides-Dist: transaction Provides-Dist: ZODB

Zodb transaction

Friday, February 19, 2010
slide-27
SLIDE 27

Obsoletes-Dist

Obsoletes-Dist: Setuptools

Friday, February 19, 2010
slide-28
SLIDE 28

Project-URL

Project-URL: Bug Tracker, http://bitbucket.org/tarek/distribute/issues Project-URL: Repository, http://bitbucket.org/tarek/distribute/src

Friday, February 19, 2010
slide-29
SLIDE 29

Description

Description: This project provides powerful math functions |For example, you can use `sum()` to sum numbers: | |Example:: | | >>> sum(1, 2) | 3 |

Friday, February 19, 2010
slide-30
SLIDE 30

PEP 345 - Summary

  • Requires-Dist *
  • Obsoletes-Dist *
  • Provides-Dist *
  • Requires-External
  • Requires-Python *
  • Project-URL
  • Description

* with version specifier

Friday, February 19, 2010
slide-31
SLIDE 31

PEP 345 for developers

Friday, February 19, 2010
slide-32
SLIDE 32

PEP 345 for developers

Friday, February 19, 2010
slide-33
SLIDE 33

Environment markers

Friday, February 19, 2010
slide-34
SLIDE 34

Dynamic metadata fields

Friday, February 19, 2010
slide-35
SLIDE 35

PyPI

MyProject.tar.gz

Pip

Metadata

python setup.py egg_info

Dynamic metadata

local

python setup.py install get dependencies

Friday, February 19, 2010
slide-36
SLIDE 36

Environment Markers

Requires-Dist: value (version); marker

  • sys.platform == 'win32' and

platform.machine == 'i386'

  • 'linux' in sys.platform
  • python_version == '2.4'
Friday, February 19, 2010
slide-37
SLIDE 37

Environment Markers

  • python_version = '%s.%s' % (sys.version_info[0],

sys.version_info[1])

  • python_full_version = sys.version.split()[0]
  • os.name = os.name
  • sys.platform = sys.platform
  • platform.version = platform.version()
  • platform.machine = platform.machine()
  • a free string, like '2.4', or 'win32'
Friday, February 19, 2010
slide-38
SLIDE 38

Environment Markers

  • Requires-Python
  • Requires-External
  • Requires-Dist
  • Provides-Dist
  • Obsoletes-Dist
  • Classifier
Friday, February 19, 2010
slide-39
SLIDE 39

Pseudo-static metadata fields

Friday, February 19, 2010
slide-40
SLIDE 40

PyPI

MyProject.tar.gz

Pip

Pseudo-static metadata

local

python setup.py install get dependencies

+ metadata

Friday, February 19, 2010
slide-41
SLIDE 41

I love PEP 345 !

Friday, February 19, 2010
slide-42
SLIDE 42

Version schemas

Part 2

Friday, February 19, 2010
slide-43
SLIDE 43

20090105 RC unreleased.unofficialdev 1.*

Brought to you by PyPI

Friday, February 19, 2010
slide-44
SLIDE 44

Distutils’ LooseVersion StrictVersion Setuptools’ parse_version()

Version 1 > Version 2 ?

Result vary....

Friday, February 19, 2010
slide-45
SLIDE 45

Distutils Setuptools

>>> import pkg_resources >>> V =

pkg_resources.parse_version

>>> V('1.2rc1') < V('1.2') True >>> V('1.2-a1') < V('1.2') True >>> V('1.2a1') < V('1.2') True >>> import distutils.version >>> V = distutils.version.LooseVersion >>> V('1.2rc1') < V('1.2') False >>> V('1.2-a1') < V('1.2') False >>> V('1.2a1') < V('1.2') False

Friday, February 19, 2010
slide-46
SLIDE 46
  • final version
  • pre-final version
  • post-release versions
  • development versions at all stages

Version scheme requirements

Friday, February 19, 2010
slide-47
SLIDE 47
  • final
  • MAJOR.MINOR.MICRO
  • pre-final
  • a1, a2, b1...c1, rc2, ...
  • post-release
  • +r145, -r1256, ...
  • development
  • dev12, ~dev12, -dev12, ...

Version scheme requirements

Friday, February 19, 2010
slide-48
SLIDE 48

PEP 386

Interoperable version comparison scheme

Accepted

Friday, February 19, 2010
slide-49
SLIDE 49

N.N[.N]+[{a|b|c|rc}N[.N]+][.postN][.devN]

major, minor, micro post- tag extra numbers pre- tag dev tag

N = integer

Friday, February 19, 2010
slide-50
SLIDE 50

1 . a 1 < 1 . a 2 < 1 . b 2 < 1 . c 1 < 1 . < 1 . 1

Friday, February 19, 2010
slide-51
SLIDE 51

1.0a1 < 1.0a2.dev345 < 1.0b1 < 1.0.dev432 < 1.0

development versions

Friday, February 19, 2010
slide-52
SLIDE 52

suggest_normalized_version(your scheme) PEP 386 compatible scheme

Friday, February 19, 2010
slide-53
SLIDE 53

>>> from verlib import NormalizedVersion >>> NormalizedVersion('1.2-a1') < NormalizedVersion('1.2') Traceback (most recent call last): ... raise IrrationalVersionError(s) verlib.IrrationalVersionError: 1.2-a1 >>> from verlib import suggest_normalized_version >>> suggest_normalized_version('1.2-a1') '1.2a1' >>> NormalizedVersion('1.2a1') < NormalizedVersion('1.2') True

Interoperable version tool

Friday, February 19, 2010
slide-54
SLIDE 54

PEP 386 @ PyPI distributions

90% 8% 3%

Direct match suggest_normalized_version No match

Friday, February 19, 2010
slide-55
SLIDE 55

We love PEP 386

Friday, February 19, 2010
slide-56
SLIDE 56

Installed distributions index

Part 3

Friday, February 19, 2010
slide-57
SLIDE 57

PEP 262

A database of installed packages

Aborted draft

Friday, February 19, 2010
slide-58
SLIDE 58

MyProject

PKG-INFO

Target system

(PEP 314)

Distutils standard

site-packages

python setup.py install

MyProject.egg-info

file

Directory

Friday, February 19, 2010
slide-59
SLIDE 59

MyProject

PKG-INFO

Target system

(PEP 314)

Setuptools’ own standard

+ requires.txt + ....

site-packages

MyProject.egg-info

PKG-INFO

easy_install MyProject

requires.txt SOURCES.txt

file

Directory

Friday, February 19, 2010
slide-60
SLIDE 60

MyProject

PKG-INFO

Target system

(PEP 314)

Pip’s own standard

+ requires.txt + ....

site-packages

MyProject.egg-info

PKG-INFO

pip install MyProject

requires.txt SOURCES.txt installed_files.txt

file

Directory

Friday, February 19, 2010
slide-61
SLIDE 61

PEP 376

Interoperable .egg-info structure

Work in progress Replaces 262

Friday, February 19, 2010
slide-62
SLIDE 62

PEP 376

  • .egg-info becomes a directory
  • INSTALLER
  • RECORD
  • REQUESTED
  • query functions in Distutils
  • uninstall function in Distutils
Friday, February 19, 2010
slide-63
SLIDE 63

More after the sprints

Friday, February 19, 2010
slide-64
SLIDE 64

Conclusion Summit output

Friday, February 19, 2010
slide-65
SLIDE 65

Q/A Google Moderator

Friday, February 19, 2010
slide-66
SLIDE 66

Thanks ! http://ziade.org

#distutils @ freenode @tarek_ziade

Friday, February 19, 2010