conda / conda

A system-level, binary package and environment manager running on all major operating systems and platforms.
https://docs.conda.io/projects/conda/
Other
6.46k stars 1.68k forks source link

SPIKE: PEP440 Version Sorting #11721

Open ForgottenProgramme opened 2 years ago

ForgottenProgramme commented 2 years ago

Description

[!NOTE] The following was originally written by @ukoethe and published to the GitHub wiki (see https://github.com/conda/conda/issues/11665).

Conda's version numbering scheme is modeled after PEP 386 and PEP 440. It distinguishes four version types: release (only numbers), development ('.dev' in the version string), pre-release ('a', 'rc' etc. in the version string) and post-release ('.post' in the version string). Conda also accepts version strings that do not conform to these PEPs, but treats them differently. In addition, build numbers and build strings are used in version comparison when version strings are equal.

I tested conda's version ordering over various channels. Results for package blaze in channel blaze are especially interesting. Apparently, early blaze versions designated development versions by underscores, making the version strings non-conforming.

The order of these versions is unintuitive: expected order | `conda search -c blaze blaze` -- | -- 0.6.6_11_ge3e0799-np19py27_34 | 0.6.6-np19py27_32 0.6.6_21_g04be433-np19py27_35 | 0.6.6-np19py27_33 0.6.6_22_g6ff9ad3-np19py27_36 | 0.6.6.post165.g1e11da0-np19py27_51 0.6.6_23_ge503c3b-np19py27_37 | 0.6.6_11_ge3e0799-np19py27_34 0.6.6_24_gdaabf6e-np19py27_38 | 0.6.6_146_gf42d086-np19py27_46 0.6.6_28_g074c621-np19py27_39 | 0.6.6_160_g20d54c9-np19py27_47 0.6.6_30_g1ae87a0-np19py27_42 | 0.6.6_162_g55422ee-np19py27_49 0.6.6_81_g62013c0-np19py27_43 | 0.6.6_21_g04be433-np19py27_35 0.6.6_81_g1452714-np19py27_45 | 0.6.6_22_g6ff9ad3-np19py27_36 0.6.6_81_gad44da2-np19py27_44 | 0.6.6_23_ge503c3b-np19py27_37 0.6.6_146_gf42d086-np19py27_46 | 0.6.6_24_gdaabf6e-np19py27_38 0.6.6_160_g20d54c9-np19py27_47 | 0.6.6_28_g074c621-np19py27_39 0.6.6_162_g55422ee-np19py27_49 | 0.6.6_30_g1ae87a0-np19py27_42 0.6.6-np19py27_32 | 0.6.6_81_g1452714-np19py27_45 0.6.6-np19py27_33 | 0.6.6_81_g62013c0-np19py27_43 0.6.6.post165.g1e11da0-np19py27_51 | 0.6.6_81_gad44da2-np19py27_44 0.6.7-np19py27_52 | 0.6.7-np19py27_52

To investigate the matter in detail, I created a test channel ukoethe-test. The channel contains a single package test that comes in 624 versions. The versions comprise various examples of the four types in both coforming and non-conforming ('.suffix' in the version string) form, along with various instances of build number and build string. It turns out that conda's order is partially counter-intuitive:

When all strings conform to PEP 440, conda sorts

1.1.1.dev1 < 1.1.1 < 1.1.1.post1 < 1.1.1a1 < 1.1.1dev1 < 1.1.1post1 < 1.1.1rc1 

When no string conforms, conda sorts

1.1.1.dev1.sx < 1.1.1.post1.sx < 1.1.1.sx < 1.1.1a1.sx < 1.1.1dev1.sx < 1.1.1rc1.sx < 1.1.1post1.sx
Detailed results are listed in the tables below: expected order (conforming stings) | `conda search -c ukoethe-test test` -- | -- 1.1.1.dev1-2_py33 | 1.1.1.dev1-2_py33 1.1.1dev1-2_py33 | 1.1.1.dev1-2_py27 1.1.1.dev1-2_py27 | 1.1.1.dev1-2 1.1.1dev1-2_py27 | 1.1.1.dev1-1_py33 1.1.1.dev1-2 | 1.1.1.dev1-1_py27 1.1.1dev1-2 | 1.1.1.dev1-1 1.1.1.dev1-1_py33 | 1.1.1.dev2-2_py33 1.1.1dev1-1_py33 | 1.1.1.dev2-2_py27 1.1.1.dev1-1_py27 | 1.1.1.dev2-2 1.1.1dev1-1_py27 | 1.1.1.dev2-1_py33 1.1.1.dev1-1 | 1.1.1.dev2-1_py27 1.1.1dev1-1 | 1.1.1.dev2-1 1.1.1.dev2-2_py33 | 1.1.1-2_py33 1.1.1dev2-2_py33 | 1.1.1-2_py27 1.1.1.dev2-2_py27 | 1.1.1-2 1.1.1dev2-2_py27 | 1.1.1-1_py33 1.1.1.dev2-2 | 1.1.1-1_py27 1.1.1dev2-2 | 1.1.1-1 1.1.1.dev2-1_py33 | 1.1.1.post1-2_py33 1.1.1dev2-1_py33 | 1.1.1.post1-2_py27 1.1.1.dev2-1_py27 | 1.1.1.post1-2 1.1.1dev2-1_py27 | 1.1.1.post1-1_py33 1.1.1.dev2-1 | 1.1.1.post1-1_py27 1.1.1dev2-1 | 1.1.1.post1-1 1.1.1a1-2_py33 | 1.1.1.post2-2_py33 1.1.1a1-2_py27 | 1.1.1.post2-2_py27 1.1.1a1-2 | 1.1.1.post2-2 1.1.1a1-1_py33 | 1.1.1.post2-1_py33 1.1.1a1-1_py27 | 1.1.1.post2-1_py27 1.1.1a1-1 | 1.1.1.post2-1 1.1.1a2-2_py33 | 1.1.1a1-2_py33 1.1.1a2-2_py27 | 1.1.1a1-2_py27 1.1.1a2-2 | 1.1.1a1-2 1.1.1a2-1_py33 | 1.1.1a1-1_py33 1.1.1a2-1_py27 | 1.1.1a1-1_py27 1.1.1a2-1 | 1.1.1a1-1 1.1.1rc1-2_py33 | 1.1.1a2-2_py33 1.1.1rc1-2_py27 | 1.1.1a2-2_py27 1.1.1rc1-2 | 1.1.1a2-2 1.1.1rc1-1_py33 | 1.1.1a2-1_py33 1.1.1rc1-1_py27 | 1.1.1a2-1_py27 1.1.1rc1-1 | 1.1.1a2-1 1.1.1rc2-2_py33 | 1.1.1dev1-2_py33 1.1.1rc2-2_py27 | 1.1.1dev1-2_py27 1.1.1rc2-2 | 1.1.1dev1-2 1.1.1rc2-1_py33 | 1.1.1dev1-1_py33 1.1.1rc2-1_py27 | 1.1.1dev1-1_py27 1.1.1rc2-1 | 1.1.1dev1-1 1.1.1-2_py33 | 1.1.1dev2-2_py33 1.1.1-2_py27 | 1.1.1dev2-2_py27 1.1.1-2 | 1.1.1dev2-2 1.1.1-1_py33 | 1.1.1dev2-1_py33 1.1.1-1_py27 | 1.1.1dev2-1_py27 1.1.1-1 | 1.1.1dev2-1 1.1.1.post1-2_py33 | 1.1.1post1-2_py33 1.1.1.post1-2_py27 | 1.1.1post1-2_py27 1.1.1.post1-2 | 1.1.1post1-2 1.1.1.post1-1_py33 | 1.1.1post1-1_py33 1.1.1.post1-1_py27 | 1.1.1post1-1_py27 1.1.1.post1-1 | 1.1.1post1-1 1.1.1.post2-2_py33 | 1.1.1post2-2_py33 1.1.1.post2-2_py27 | 1.1.1post2-2_py27 1.1.1.post2-2 | 1.1.1post2-2 1.1.1.post2-1_py33 | 1.1.1post2-1_py33 1.1.1.post2-1_py27 | 1.1.1post2-1_py27 1.1.1.post2-1 | 1.1.1post2-1 1.1.1post1-2_py33 | 1.1.1rc1-2_py33 1.1.1post1-2_py27 | 1.1.1rc1-2_py27 1.1.1post1-2 | 1.1.1rc1-2 1.1.1post1-1_py33 | 1.1.1rc1-1_py33 1.1.1post1-1_py27 | 1.1.1rc1-1_py27 1.1.1post1-1 | 1.1.1rc1-1 1.1.1post2-2_py33 | 1.1.1rc2-2_py33 1.1.1post2-2_py27 | 1.1.1rc2-2_py27 1.1.1post2-2 | 1.1.1rc2-2 1.1.1post2-1_py33 | 1.1.1rc2-1_py33 1.1.1post2-1_py27 | 1.1.1rc2-1_py27 1.1.1post2-1 | 1.1.1rc2-1 1.1.2.dev1-2_py33 | 1.1.2.dev1-2_py33 1.1.2dev1-2_py33 | 1.1.2.dev1-2_py27 1.1.2.dev1-2_py27 | 1.1.2.dev1-2 1.1.2dev1-2_py27 | 1.1.2.dev1-1_py33 1.1.2.dev1-2 | 1.1.2.dev1-1_py27 1.1.2dev1-2 | 1.1.2.dev1-1 1.1.2.dev1-1_py33 | 1.1.2.dev2-2_py33 1.1.2dev1-1_py33 | 1.1.2.dev2-2_py27 1.1.2.dev1-1_py27 | 1.1.2.dev2-2 1.1.2dev1-1_py27 | 1.1.2.dev2-1_py33 1.1.2.dev1-1 | 1.1.2.dev2-1_py27 1.1.2dev1-1 | 1.1.2.dev2-1 1.1.2.dev2-2_py33 | 1.1.2-2_py33 1.1.2dev2-2_py33 | 1.1.2-2_py27 1.1.2.dev2-2_py27 | 1.1.2-2 1.1.2dev2-2_py27 | 1.1.2-1_py33 1.1.2.dev2-2 | 1.1.2-1_py27 1.1.2dev2-2 | 1.1.2-1 1.1.2.dev2-1_py33 | 1.1.2.post1-2_py33 1.1.2dev2-1_py33 | 1.1.2.post1-2_py27 1.1.2.dev2-1_py27 | 1.1.2.post1-2 1.1.2dev2-1_py27 | 1.1.2.post1-1_py33 1.1.2.dev2-1 | 1.1.2.post1-1_py27 1.1.2dev2-1 | 1.1.2.post1-1 1.1.2a1-2_py33 | 1.1.2.post2-2_py33 1.1.2a1-2_py27 | 1.1.2.post2-2_py27 1.1.2a1-2 | 1.1.2.post2-2 1.1.2a1-1_py33 | 1.1.2.post2-1_py33 1.1.2a1-1_py27 | 1.1.2.post2-1_py27 1.1.2a1-1 | 1.1.2.post2-1 1.1.2a2-2_py33 | 1.1.2a1-2_py33 1.1.2a2-2_py27 | 1.1.2a1-2_py27 1.1.2a2-2 | 1.1.2a1-2 1.1.2a2-1_py33 | 1.1.2a1-1_py33 1.1.2a2-1_py27 | 1.1.2a1-1_py27 1.1.2a2-1 | 1.1.2a1-1 1.1.2rc1-2_py33 | 1.1.2a2-2_py33 1.1.2rc1-2_py27 | 1.1.2a2-2_py27 1.1.2rc1-2 | 1.1.2a2-2 1.1.2rc1-1_py33 | 1.1.2a2-1_py33 1.1.2rc1-1_py27 | 1.1.2a2-1_py27 1.1.2rc1-1 | 1.1.2a2-1 1.1.2rc2-2_py33 | 1.1.2dev1-2_py33 1.1.2rc2-2_py27 | 1.1.2dev1-2_py27 1.1.2rc2-2 | 1.1.2dev1-2 1.1.2rc2-1_py33 | 1.1.2dev1-1_py33 1.1.2rc2-1_py27 | 1.1.2dev1-1_py27 1.1.2rc2-1 | 1.1.2dev1-1 1.1.2-2_py33 | 1.1.2dev2-2_py33 1.1.2-2_py27 | 1.1.2dev2-2_py27 1.1.2-2 | 1.1.2dev2-2 1.1.2-1_py33 | 1.1.2dev2-1_py33 1.1.2-1_py27 | 1.1.2dev2-1_py27 1.1.2-1 | 1.1.2dev2-1 1.1.2.post1-2_py33 | 1.1.2post1-2_py33 1.1.2.post1-2_py27 | 1.1.2post1-2_py27 1.1.2.post1-2 | 1.1.2post1-2 1.1.2.post1-1_py33 | 1.1.2post1-1_py33 1.1.2.post1-1_py27 | 1.1.2post1-1_py27 1.1.2.post1-1 | 1.1.2post1-1 1.1.2.post2-2_py33 | 1.1.2post2-2_py33 1.1.2.post2-2_py27 | 1.1.2post2-2_py27 1.1.2.post2-2 | 1.1.2post2-2 1.1.2.post2-1_py33 | 1.1.2post2-1_py33 1.1.2.post2-1_py27 | 1.1.2post2-1_py27 1.1.2.post2-1 | 1.1.2post2-1 1.1.2post1-2_py33 | 1.1.2rc1-2_py33 1.1.2post1-2_py27 | 1.1.2rc1-2_py27 1.1.2post1-2 | 1.1.2rc1-2 1.1.2post1-1_py33 | 1.1.2rc1-1_py33 1.1.2post1-1_py27 | 1.1.2rc1-1_py27 1.1.2post1-1 | 1.1.2rc1-1 1.1.2post2-2_py33 | 1.1.2rc2-2_py33 1.1.2post2-2_py27 | 1.1.2rc2-2_py27 1.1.2post2-2 | 1.1.2rc2-2 1.1.2post2-1_py33 | 1.1.2rc2-1_py33 1.1.2post2-1_py27 | 1.1.2rc2-1_py27 1.1.2post2-1 | 1.1.2rc2-1 1.2.1.dev1-2_py33 | 1.2.1.dev1-2_py33 1.2.1dev1-2_py33 | 1.2.1.dev1-2_py27 1.2.1.dev1-2_py27 | 1.2.1.dev1-2 1.2.1dev1-2_py27 | 1.2.1.dev1-1_py33 1.2.1.dev1-2 | 1.2.1.dev1-1_py27 1.2.1dev1-2 | 1.2.1.dev1-1 1.2.1.dev1-1_py33 | 1.2.1.dev2-2_py33 1.2.1dev1-1_py33 | 1.2.1.dev2-2_py27 1.2.1.dev1-1_py27 | 1.2.1.dev2-2 1.2.1dev1-1_py27 | 1.2.1.dev2-1_py33 1.2.1.dev1-1 | 1.2.1.dev2-1_py27 1.2.1dev1-1 | 1.2.1.dev2-1 1.2.1.dev2-2_py33 | 1.2.1-2_py33 1.2.1dev2-2_py33 | 1.2.1-2_py27 1.2.1.dev2-2_py27 | 1.2.1-2 1.2.1dev2-2_py27 | 1.2.1-1_py33 1.2.1.dev2-2 | 1.2.1-1_py27 1.2.1dev2-2 | 1.2.1-1 1.2.1.dev2-1_py33 | 1.2.1.post1-2_py33 1.2.1dev2-1_py33 | 1.2.1.post1-2_py27 1.2.1.dev2-1_py27 | 1.2.1.post1-2 1.2.1dev2-1_py27 | 1.2.1.post1-1_py33 1.2.1.dev2-1 | 1.2.1.post1-1_py27 1.2.1dev2-1 | 1.2.1.post1-1 1.2.1a1-2_py33 | 1.2.1.post2-2_py33 1.2.1a1-2_py27 | 1.2.1.post2-2_py27 1.2.1a1-2 | 1.2.1.post2-2 1.2.1a1-1_py33 | 1.2.1.post2-1_py33 1.2.1a1-1_py27 | 1.2.1.post2-1_py27 1.2.1a1-1 | 1.2.1.post2-1 1.2.1a2-2_py33 | 1.2.1a1-2_py33 1.2.1a2-2_py27 | 1.2.1a1-2_py27 1.2.1a2-2 | 1.2.1a1-2 1.2.1a2-1_py33 | 1.2.1a1-1_py33 1.2.1a2-1_py27 | 1.2.1a1-1_py27 1.2.1a2-1 | 1.2.1a1-1 1.2.1rc1-2_py33 | 1.2.1a2-2_py33 1.2.1rc1-2_py27 | 1.2.1a2-2_py27 1.2.1rc1-2 | 1.2.1a2-2 1.2.1rc1-1_py33 | 1.2.1a2-1_py33 1.2.1rc1-1_py27 | 1.2.1a2-1_py27 1.2.1rc1-1 | 1.2.1a2-1 1.2.1rc2-2_py33 | 1.2.1dev1-2_py33 1.2.1rc2-2_py27 | 1.2.1dev1-2_py27 1.2.1rc2-2 | 1.2.1dev1-2 1.2.1rc2-1_py33 | 1.2.1dev1-1_py33 1.2.1rc2-1_py27 | 1.2.1dev1-1_py27 1.2.1rc2-1 | 1.2.1dev1-1 1.2.1-2_py33 | 1.2.1dev2-2_py33 1.2.1-2_py27 | 1.2.1dev2-2_py27 1.2.1-2 | 1.2.1dev2-2 1.2.1-1_py33 | 1.2.1dev2-1_py33 1.2.1-1_py27 | 1.2.1dev2-1_py27 1.2.1-1 | 1.2.1dev2-1 1.2.1.post1-2_py33 | 1.2.1post1-2_py33 1.2.1.post1-2_py27 | 1.2.1post1-2_py27 1.2.1.post1-2 | 1.2.1post1-2 1.2.1.post1-1_py33 | 1.2.1post1-1_py33 1.2.1.post1-1_py27 | 1.2.1post1-1_py27 1.2.1.post1-1 | 1.2.1post1-1 1.2.1.post2-2_py33 | 1.2.1post2-2_py33 1.2.1.post2-2_py27 | 1.2.1post2-2_py27 1.2.1.post2-2 | 1.2.1post2-2 1.2.1.post2-1_py33 | 1.2.1post2-1_py33 1.2.1.post2-1_py27 | 1.2.1post2-1_py27 1.2.1.post2-1 | 1.2.1post2-1 1.2.1post1-2_py33 | 1.2.1rc1-2_py33 1.2.1post1-2_py27 | 1.2.1rc1-2_py27 1.2.1post1-2 | 1.2.1rc1-2 1.2.1post1-1_py33 | 1.2.1rc1-1_py33 1.2.1post1-1_py27 | 1.2.1rc1-1_py27 1.2.1post1-1 | 1.2.1rc1-1 1.2.1post2-2_py33 | 1.2.1rc2-2_py33 1.2.1post2-2_py27 | 1.2.1rc2-2_py27 1.2.1post2-2 | 1.2.1rc2-2 1.2.1post2-1_py33 | 1.2.1rc2-1_py33 1.2.1post2-1_py27 | 1.2.1rc2-1_py27 1.2.1post2-1 | 1.2.1rc2-1 1.2.2.dev1-2_py33 | 1.2.2.dev1-2_py33 1.2.2dev1-2_py33 | 1.2.2.dev1-2_py27 1.2.2.dev1-2_py27 | 1.2.2.dev1-2 1.2.2dev1-2_py27 | 1.2.2.dev1-1_py33 1.2.2.dev1-2 | 1.2.2.dev1-1_py27 1.2.2dev1-2 | 1.2.2.dev1-1 1.2.2.dev1-1_py33 | 1.2.2.dev2-2_py33 1.2.2dev1-1_py33 | 1.2.2.dev2-2_py27 1.2.2.dev1-1_py27 | 1.2.2.dev2-2 1.2.2dev1-1_py27 | 1.2.2.dev2-1_py33 1.2.2.dev1-1 | 1.2.2.dev2-1_py27 1.2.2dev1-1 | 1.2.2.dev2-1 1.2.2.dev2-2_py33 | 1.2.2-2_py33 1.2.2dev2-2_py33 | 1.2.2-2_py27 1.2.2.dev2-2_py27 | 1.2.2-2 1.2.2dev2-2_py27 | 1.2.2-1_py33 1.2.2.dev2-2 | 1.2.2-1_py27 1.2.2dev2-2 | 1.2.2-1 1.2.2.dev2-1_py33 | 1.2.2.post1-2_py33 1.2.2dev2-1_py33 | 1.2.2.post1-2_py27 1.2.2.dev2-1_py27 | 1.2.2.post1-2 1.2.2dev2-1_py27 | 1.2.2.post1-1_py33 1.2.2.dev2-1 | 1.2.2.post1-1_py27 1.2.2dev2-1 | 1.2.2.post1-1 1.2.2a1-2_py33 | 1.2.2.post2-2_py33 1.2.2a1-2_py27 | 1.2.2.post2-2_py27 1.2.2a1-2 | 1.2.2.post2-2 1.2.2a1-1_py33 | 1.2.2.post2-1_py33 1.2.2a1-1_py27 | 1.2.2.post2-1_py27 1.2.2a1-1 | 1.2.2.post2-1 1.2.2a2-2_py33 | 1.2.2a1-2_py33 1.2.2a2-2_py27 | 1.2.2a1-2_py27 1.2.2a2-2 | 1.2.2a1-2 1.2.2a2-1_py33 | 1.2.2a1-1_py33 1.2.2a2-1_py27 | 1.2.2a1-1_py27 1.2.2a2-1 | 1.2.2a1-1 1.2.2rc1-2_py33 | 1.2.2a2-2_py33 1.2.2rc1-2_py27 | 1.2.2a2-2_py27 1.2.2rc1-2 | 1.2.2a2-2 1.2.2rc1-1_py33 | 1.2.2a2-1_py33 1.2.2rc1-1_py27 | 1.2.2a2-1_py27 1.2.2rc1-1 | 1.2.2a2-1 1.2.2rc2-2_py33 | 1.2.2dev1-2_py33 1.2.2rc2-2_py27 | 1.2.2dev1-2_py27 1.2.2rc2-2 | 1.2.2dev1-2 1.2.2rc2-1_py33 | 1.2.2dev1-1_py33 1.2.2rc2-1_py27 | 1.2.2dev1-1_py27 1.2.2rc2-1 | 1.2.2dev1-1 1.2.2-2_py33 | 1.2.2dev2-2_py33 1.2.2-2_py27 | 1.2.2dev2-2_py27 1.2.2-2 | 1.2.2dev2-2 1.2.2-1_py33 | 1.2.2dev2-1_py33 1.2.2-1_py27 | 1.2.2dev2-1_py27 1.2.2-1 | 1.2.2dev2-1 1.2.2.post1-2_py33 | 1.2.2post1-2_py33 1.2.2.post1-2_py27 | 1.2.2post1-2_py27 1.2.2.post1-2 | 1.2.2post1-2 1.2.2.post1-1_py33 | 1.2.2post1-1_py33 1.2.2.post1-1_py27 | 1.2.2post1-1_py27 1.2.2.post1-1 | 1.2.2post1-1 1.2.2.post2-2_py33 | 1.2.2post2-2_py33 1.2.2.post2-2_py27 | 1.2.2post2-2_py27 1.2.2.post2-2 | 1.2.2post2-2 1.2.2.post2-1_py33 | 1.2.2post2-1_py33 1.2.2.post2-1_py27 | 1.2.2post2-1_py27 1.2.2.post2-1 | 1.2.2post2-1 1.2.2post1-2_py33 | 1.2.2rc1-2_py33 1.2.2post1-2_py27 | 1.2.2rc1-2_py27 1.2.2post1-2 | 1.2.2rc1-2 1.2.2post1-1_py33 | 1.2.2rc1-1_py33 1.2.2post1-1_py27 | 1.2.2rc1-1_py27 1.2.2post1-1 | 1.2.2rc1-1 1.2.2post2-2_py33 | 1.2.2rc2-2_py33 1.2.2post2-2_py27 | 1.2.2rc2-2_py27 1.2.2post2-2 | 1.2.2rc2-2 1.2.2post2-1_py33 | 1.2.2rc2-1_py33 1.2.2post2-1_py27 | 1.2.2rc2-1_py27 1.2.2post2-1 | 1.2.2rc2-1 expected order (non-conforming stings) | conda search -c ukoethe-test test -- | -- 1.1.1.dev1.suffix-2_py33 | 1.1.1.dev1.suffix-2_py33 1.1.1dev1.suffix-2_py33 | 1.1.1.dev1.suffix-2_py27 1.1.1.dev1.suffix-2_py27 | 1.1.1.dev1.suffix-2 1.1.1dev1.suffix-2_py27 | 1.1.1.dev1.suffix-1_py33 1.1.1.dev1.suffix-2 | 1.1.1.dev1.suffix-1_py27 1.1.1dev1.suffix-2 | 1.1.1.dev1.suffix-1 1.1.1.dev1.suffix-1_py33 | 1.1.1.dev2.suffix-2_py33 1.1.1dev1.suffix-1_py33 | 1.1.1.dev2.suffix-2_py27 1.1.1.dev1.suffix-1_py27 | 1.1.1.dev2.suffix-2 1.1.1dev1.suffix-1_py27 | 1.1.1.dev2.suffix-1_py33 1.1.1.dev1.suffix-1 | 1.1.1.dev2.suffix-1_py27 1.1.1dev1.suffix-1 | 1.1.1.dev2.suffix-1 1.1.1.dev2.suffix-2_py33 | 1.1.1.post1.suffix-2_py33 1.1.1dev2.suffix-2_py33 | 1.1.1.post1.suffix-2_py27 1.1.1.dev2.suffix-2_py27 | 1.1.1.post1.suffix-2 1.1.1dev2.suffix-2_py27 | 1.1.1.post1.suffix-1_py33 1.1.1.dev2.suffix-2 | 1.1.1.post1.suffix-1_py27 1.1.1dev2.suffix-2 | 1.1.1.post1.suffix-1 1.1.1.dev2.suffix-1_py33 | 1.1.1.post2.suffix-2_py33 1.1.1dev2.suffix-1_py33 | 1.1.1.post2.suffix-2_py27 1.1.1.dev2.suffix-1_py27 | 1.1.1.post2.suffix-2 1.1.1dev2.suffix-1_py27 | 1.1.1.post2.suffix-1_py33 1.1.1.dev2.suffix-1 | 1.1.1.post2.suffix-1_py27 1.1.1dev2.suffix-1 | 1.1.1.post2.suffix-1 1.1.1a1.suffix-2_py33 | 1.1.1.suffix-2_py33 1.1.1a1.suffix-2_py27 | 1.1.1.suffix-2_py27 1.1.1a1.suffix-2 | 1.1.1.suffix-2 1.1.1a1.suffix-1_py33 | 1.1.1.suffix-1_py33 1.1.1a1.suffix-1_py27 | 1.1.1.suffix-1_py27 1.1.1a1.suffix-1 | 1.1.1.suffix-1 1.1.1a2.suffix-2_py33 | 1.1.1a1.suffix-2_py33 1.1.1a2.suffix-2_py27 | 1.1.1a1.suffix-2_py27 1.1.1a2.suffix-2 | 1.1.1a1.suffix-2 1.1.1a2.suffix-1_py33 | 1.1.1a1.suffix-1_py33 1.1.1a2.suffix-1_py27 | 1.1.1a1.suffix-1_py27 1.1.1a2.suffix-1 | 1.1.1a1.suffix-1 1.1.1rc1.suffix-2_py33 | 1.1.1a2.suffix-2_py33 1.1.1rc1.suffix-2_py27 | 1.1.1a2.suffix-2_py27 1.1.1rc1.suffix-2 | 1.1.1a2.suffix-2 1.1.1rc1.suffix-1_py33 | 1.1.1a2.suffix-1_py33 1.1.1rc1.suffix-1_py27 | 1.1.1a2.suffix-1_py27 1.1.1rc1.suffix-1 | 1.1.1a2.suffix-1 1.1.1rc2.suffix-2_py33 | 1.1.1dev1.suffix-2_py33 1.1.1rc2.suffix-2_py27 | 1.1.1dev1.suffix-2_py27 1.1.1rc2.suffix-2 | 1.1.1dev1.suffix-2 1.1.1rc2.suffix-1_py33 | 1.1.1dev1.suffix-1_py33 1.1.1rc2.suffix-1_py27 | 1.1.1dev1.suffix-1_py27 1.1.1rc2.suffix-1 | 1.1.1dev1.suffix-1 1.1.1.suffix-2_py33 | 1.1.1rc1.suffix-2_py33 1.1.1.suffix-2_py27 | 1.1.1rc1.suffix-2_py27 1.1.1.suffix-2 | 1.1.1rc1.suffix-2 1.1.1.suffix-1_py33 | 1.1.1rc1.suffix-1_py33 1.1.1.suffix-1_py27 | 1.1.1rc1.suffix-1_py27 1.1.1.suffix-1 | 1.1.1rc1.suffix-1 1.1.1.post1.suffix-2_py33 | 1.1.1rc2.suffix-2_py33 1.1.1.post1.suffix-2_py27 | 1.1.1rc2.suffix-2_py27 1.1.1.post1.suffix-2 | 1.1.1rc2.suffix-2 1.1.1.post1.suffix-1_py33 | 1.1.1rc2.suffix-1_py33 1.1.1.post1.suffix-1_py27 | 1.1.1rc2.suffix-1_py27 1.1.1.post1.suffix-1 | 1.1.1rc2.suffix-1 1.1.1.post2.suffix-2_py33 | 1.1.1dev2.suffix-2_py33 1.1.1.post2.suffix-2_py27 | 1.1.1dev2.suffix-2_py27 1.1.1.post2.suffix-2 | 1.1.1dev2.suffix-2 1.1.1.post2.suffix-1_py33 | 1.1.1dev2.suffix-1_py33 1.1.1.post2.suffix-1_py27 | 1.1.1dev2.suffix-1_py27 1.1.1.post2.suffix-1 | 1.1.1dev2.suffix-1 1.1.1post1.suffix-2_py33 | 1.1.1post1.suffix-2_py33 1.1.1post1.suffix-2_py27 | 1.1.1post1.suffix-2_py27 1.1.1post1.suffix-2 | 1.1.1post1.suffix-2 1.1.1post1.suffix-1_py33 | 1.1.1post1.suffix-1_py33 1.1.1post1.suffix-1_py27 | 1.1.1post1.suffix-1_py27 1.1.1post1.suffix-1 | 1.1.1post1.suffix-1 1.1.1post2.suffix-2_py33 | 1.1.1post2.suffix-2_py33 1.1.1post2.suffix-2_py27 | 1.1.1post2.suffix-2_py27 1.1.1post2.suffix-2 | 1.1.1post2.suffix-2 1.1.1post2.suffix-1_py33 | 1.1.1post2.suffix-1_py33 1.1.1post2.suffix-1_py27 | 1.1.1post2.suffix-1_py27 1.1.1post2.suffix-1 | 1.1.1post2.suffix-1 1.1.2.dev1.suffix-2_py33 | 1.1.2.dev1.suffix-2_py33 1.1.2dev1.suffix-2_py33 | 1.1.2.dev1.suffix-2_py27 1.1.2.dev1.suffix-2_py27 | 1.1.2.dev1.suffix-2 1.1.2dev1.suffix-2_py27 | 1.1.2.dev1.suffix-1_py33 1.1.2.dev1.suffix-2 | 1.1.2.dev1.suffix-1_py27 1.1.2dev1.suffix-2 | 1.1.2.dev1.suffix-1 1.1.2.dev1.suffix-1_py33 | 1.1.2.dev2.suffix-2_py33 1.1.2dev1.suffix-1_py33 | 1.1.2.dev2.suffix-2_py27 1.1.2.dev1.suffix-1_py27 | 1.1.2.dev2.suffix-2 1.1.2dev1.suffix-1_py27 | 1.1.2.dev2.suffix-1_py33 1.1.2.dev1.suffix-1 | 1.1.2.dev2.suffix-1_py27 1.1.2dev1.suffix-1 | 1.1.2.dev2.suffix-1 1.1.2.dev2.suffix-2_py33 | 1.1.2.post1.suffix-2_py33 1.1.2dev2.suffix-2_py33 | 1.1.2.post1.suffix-2_py27 1.1.2.dev2.suffix-2_py27 | 1.1.2.post1.suffix-2 1.1.2dev2.suffix-2_py27 | 1.1.2.post1.suffix-1_py33 1.1.2.dev2.suffix-2 | 1.1.2.post1.suffix-1_py27 1.1.2dev2.suffix-2 | 1.1.2.post1.suffix-1 1.1.2.dev2.suffix-1_py33 | 1.1.2.post2.suffix-2_py33 1.1.2dev2.suffix-1_py33 | 1.1.2.post2.suffix-2_py27 1.1.2.dev2.suffix-1_py27 | 1.1.2.post2.suffix-2 1.1.2dev2.suffix-1_py27 | 1.1.2.post2.suffix-1_py33 1.1.2.dev2.suffix-1 | 1.1.2.post2.suffix-1_py27 1.1.2dev2.suffix-1 | 1.1.2.post2.suffix-1 1.1.2a1.suffix-2_py33 | 1.1.2.suffix-2_py33 1.1.2a1.suffix-2_py27 | 1.1.2.suffix-2_py27 1.1.2a1.suffix-2 | 1.1.2.suffix-2 1.1.2a1.suffix-1_py33 | 1.1.2.suffix-1_py33 1.1.2a1.suffix-1_py27 | 1.1.2.suffix-1_py27 1.1.2a1.suffix-1 | 1.1.2.suffix-1 1.1.2a2.suffix-2_py33 | 1.1.2a1.suffix-2_py33 1.1.2a2.suffix-2_py27 | 1.1.2a1.suffix-2_py27 1.1.2a2.suffix-2 | 1.1.2a1.suffix-2 1.1.2a2.suffix-1_py33 | 1.1.2a1.suffix-1_py33 1.1.2a2.suffix-1_py27 | 1.1.2a1.suffix-1_py27 1.1.2a2.suffix-1 | 1.1.2a1.suffix-1 1.1.2rc1.suffix-2_py33 | 1.1.2a2.suffix-2_py33 1.1.2rc1.suffix-2_py27 | 1.1.2a2.suffix-2_py27 1.1.2rc1.suffix-2 | 1.1.2a2.suffix-2 1.1.2rc1.suffix-1_py33 | 1.1.2a2.suffix-1_py33 1.1.2rc1.suffix-1_py27 | 1.1.2a2.suffix-1_py27 1.1.2rc1.suffix-1 | 1.1.2a2.suffix-1 1.1.2rc2.suffix-2_py33 | 1.1.2dev1.suffix-2_py33 1.1.2rc2.suffix-2_py27 | 1.1.2dev1.suffix-2_py27 1.1.2rc2.suffix-2 | 1.1.2dev1.suffix-2 1.1.2rc2.suffix-1_py33 | 1.1.2dev1.suffix-1_py33 1.1.2rc2.suffix-1_py27 | 1.1.2dev1.suffix-1_py27 1.1.2rc2.suffix-1 | 1.1.2dev1.suffix-1 1.1.2.suffix-2_py33 | 1.1.2rc1.suffix-2_py33 1.1.2.suffix-2_py27 | 1.1.2rc1.suffix-2_py27 1.1.2.suffix-2 | 1.1.2rc1.suffix-2 1.1.2.suffix-1_py33 | 1.1.2rc1.suffix-1_py33 1.1.2.suffix-1_py27 | 1.1.2rc1.suffix-1_py27 1.1.2.suffix-1 | 1.1.2rc1.suffix-1 1.1.2.post1.suffix-2_py33 | 1.1.2rc2.suffix-2_py33 1.1.2.post1.suffix-2_py27 | 1.1.2rc2.suffix-2_py27 1.1.2.post1.suffix-2 | 1.1.2rc2.suffix-2 1.1.2.post1.suffix-1_py33 | 1.1.2rc2.suffix-1_py33 1.1.2.post1.suffix-1_py27 | 1.1.2rc2.suffix-1_py27 1.1.2.post1.suffix-1 | 1.1.2rc2.suffix-1 1.1.2.post2.suffix-2_py33 | 1.1.2dev2.suffix-2_py33 1.1.2.post2.suffix-2_py27 | 1.1.2dev2.suffix-2_py27 1.1.2.post2.suffix-2 | 1.1.2dev2.suffix-2 1.1.2.post2.suffix-1_py33 | 1.1.2dev2.suffix-1_py33 1.1.2.post2.suffix-1_py27 | 1.1.2dev2.suffix-1_py27 1.1.2.post2.suffix-1 | 1.1.2dev2.suffix-1 1.1.2post1.suffix-2_py33 | 1.1.2post1.suffix-2_py33 1.1.2post1.suffix-2_py27 | 1.1.2post1.suffix-2_py27 1.1.2post1.suffix-2 | 1.1.2post1.suffix-2 1.1.2post1.suffix-1_py33 | 1.1.2post1.suffix-1_py33 1.1.2post1.suffix-1_py27 | 1.1.2post1.suffix-1_py27 1.1.2post1.suffix-1 | 1.1.2post1.suffix-1 1.1.2post2.suffix-2_py33 | 1.1.2post2.suffix-2_py33 1.1.2post2.suffix-2_py27 | 1.1.2post2.suffix-2_py27 1.1.2post2.suffix-2 | 1.1.2post2.suffix-2 1.1.2post2.suffix-1_py33 | 1.1.2post2.suffix-1_py33 1.1.2post2.suffix-1_py27 | 1.1.2post2.suffix-1_py27 1.1.2post2.suffix-1 | 1.1.2post2.suffix-1 1.2.1.dev1.suffix-2_py33 | 1.2.1.dev1.suffix-2_py33 1.2.1dev1.suffix-2_py33 | 1.2.1.dev1.suffix-2_py27 1.2.1.dev1.suffix-2_py27 | 1.2.1.dev1.suffix-2 1.2.1dev1.suffix-2_py27 | 1.2.1.dev1.suffix-1_py33 1.2.1.dev1.suffix-2 | 1.2.1.dev1.suffix-1_py27 1.2.1dev1.suffix-2 | 1.2.1.dev1.suffix-1 1.2.1.dev1.suffix-1_py33 | 1.2.1.dev2.suffix-2_py33 1.2.1dev1.suffix-1_py33 | 1.2.1.dev2.suffix-2_py27 1.2.1.dev1.suffix-1_py27 | 1.2.1.dev2.suffix-2 1.2.1dev1.suffix-1_py27 | 1.2.1.dev2.suffix-1_py33 1.2.1.dev1.suffix-1 | 1.2.1.dev2.suffix-1_py27 1.2.1dev1.suffix-1 | 1.2.1.dev2.suffix-1 1.2.1.dev2.suffix-2_py33 | 1.2.1.post1.suffix-2_py33 1.2.1dev2.suffix-2_py33 | 1.2.1.post1.suffix-2_py27 1.2.1.dev2.suffix-2_py27 | 1.2.1.post1.suffix-2 1.2.1dev2.suffix-2_py27 | 1.2.1.post1.suffix-1_py33 1.2.1.dev2.suffix-2 | 1.2.1.post1.suffix-1_py27 1.2.1dev2.suffix-2 | 1.2.1.post1.suffix-1 1.2.1.dev2.suffix-1_py33 | 1.2.1.post2.suffix-2_py33 1.2.1dev2.suffix-1_py33 | 1.2.1.post2.suffix-2_py27 1.2.1.dev2.suffix-1_py27 | 1.2.1.post2.suffix-2 1.2.1dev2.suffix-1_py27 | 1.2.1.post2.suffix-1_py33 1.2.1.dev2.suffix-1 | 1.2.1.post2.suffix-1_py27 1.2.1dev2.suffix-1 | 1.2.1.post2.suffix-1 1.2.1a1.suffix-2_py33 | 1.2.1.suffix-2_py33 1.2.1a1.suffix-2_py27 | 1.2.1.suffix-2_py27 1.2.1a1.suffix-2 | 1.2.1.suffix-2 1.2.1a1.suffix-1_py33 | 1.2.1.suffix-1_py33 1.2.1a1.suffix-1_py27 | 1.2.1.suffix-1_py27 1.2.1a1.suffix-1 | 1.2.1.suffix-1 1.2.1a2.suffix-2_py33 | 1.2.1a1.suffix-2_py33 1.2.1a2.suffix-2_py27 | 1.2.1a1.suffix-2_py27 1.2.1a2.suffix-2 | 1.2.1a1.suffix-2 1.2.1a2.suffix-1_py33 | 1.2.1a1.suffix-1_py33 1.2.1a2.suffix-1_py27 | 1.2.1a1.suffix-1_py27 1.2.1a2.suffix-1 | 1.2.1a1.suffix-1 1.2.1rc1.suffix-2_py33 | 1.2.1a2.suffix-2_py33 1.2.1rc1.suffix-2_py27 | 1.2.1a2.suffix-2_py27 1.2.1rc1.suffix-2 | 1.2.1a2.suffix-2 1.2.1rc1.suffix-1_py33 | 1.2.1a2.suffix-1_py33 1.2.1rc1.suffix-1_py27 | 1.2.1a2.suffix-1_py27 1.2.1rc1.suffix-1 | 1.2.1a2.suffix-1 1.2.1rc2.suffix-2_py33 | 1.2.1dev1.suffix-2_py33 1.2.1rc2.suffix-2_py27 | 1.2.1dev1.suffix-2_py27 1.2.1rc2.suffix-2 | 1.2.1dev1.suffix-2 1.2.1rc2.suffix-1_py33 | 1.2.1dev1.suffix-1_py33 1.2.1rc2.suffix-1_py27 | 1.2.1dev1.suffix-1_py27 1.2.1rc2.suffix-1 | 1.2.1dev1.suffix-1 1.2.1.suffix-2_py33 | 1.2.1rc1.suffix-2_py33 1.2.1.suffix-2_py27 | 1.2.1rc1.suffix-2_py27 1.2.1.suffix-2 | 1.2.1rc1.suffix-2 1.2.1.suffix-1_py33 | 1.2.1rc1.suffix-1_py33 1.2.1.suffix-1_py27 | 1.2.1rc1.suffix-1_py27 1.2.1.suffix-1 | 1.2.1rc1.suffix-1 1.2.1.post1.suffix-2_py33 | 1.2.1rc2.suffix-2_py33 1.2.1.post1.suffix-2_py27 | 1.2.1rc2.suffix-2_py27 1.2.1.post1.suffix-2 | 1.2.1rc2.suffix-2 1.2.1.post1.suffix-1_py33 | 1.2.1rc2.suffix-1_py33 1.2.1.post1.suffix-1_py27 | 1.2.1rc2.suffix-1_py27 1.2.1.post1.suffix-1 | 1.2.1rc2.suffix-1 1.2.1.post2.suffix-2_py33 | 1.2.1dev2.suffix-2_py33 1.2.1.post2.suffix-2_py27 | 1.2.1dev2.suffix-2_py27 1.2.1.post2.suffix-2 | 1.2.1dev2.suffix-2 1.2.1.post2.suffix-1_py33 | 1.2.1dev2.suffix-1_py33 1.2.1.post2.suffix-1_py27 | 1.2.1dev2.suffix-1_py27 1.2.1.post2.suffix-1 | 1.2.1dev2.suffix-1 1.2.1post1.suffix-2_py33 | 1.2.1post1.suffix-2_py33 1.2.1post1.suffix-2_py27 | 1.2.1post1.suffix-2_py27 1.2.1post1.suffix-2 | 1.2.1post1.suffix-2 1.2.1post1.suffix-1_py33 | 1.2.1post1.suffix-1_py33 1.2.1post1.suffix-1_py27 | 1.2.1post1.suffix-1_py27 1.2.1post1.suffix-1 | 1.2.1post1.suffix-1 1.2.1post2.suffix-2_py33 | 1.2.1post2.suffix-2_py33 1.2.1post2.suffix-2_py27 | 1.2.1post2.suffix-2_py27 1.2.1post2.suffix-2 | 1.2.1post2.suffix-2 1.2.1post2.suffix-1_py33 | 1.2.1post2.suffix-1_py33 1.2.1post2.suffix-1_py27 | 1.2.1post2.suffix-1_py27 1.2.1post2.suffix-1 | 1.2.1post2.suffix-1 1.2.2.dev1.suffix-2_py33 | 1.2.2.dev1.suffix-2_py33 1.2.2dev1.suffix-2_py33 | 1.2.2.dev1.suffix-2_py27 1.2.2.dev1.suffix-2_py27 | 1.2.2.dev1.suffix-2 1.2.2dev1.suffix-2_py27 | 1.2.2.dev1.suffix-1_py33 1.2.2.dev1.suffix-2 | 1.2.2.dev1.suffix-1_py27 1.2.2dev1.suffix-2 | 1.2.2.dev1.suffix-1 1.2.2.dev1.suffix-1_py33 | 1.2.2.dev2.suffix-2_py33 1.2.2dev1.suffix-1_py33 | 1.2.2.dev2.suffix-2_py27 1.2.2.dev1.suffix-1_py27 | 1.2.2.dev2.suffix-2 1.2.2dev1.suffix-1_py27 | 1.2.2.dev2.suffix-1_py33 1.2.2.dev1.suffix-1 | 1.2.2.dev2.suffix-1_py27 1.2.2dev1.suffix-1 | 1.2.2.dev2.suffix-1 1.2.2.dev2.suffix-2_py33 | 1.2.2.post1.suffix-2_py33 1.2.2dev2.suffix-2_py33 | 1.2.2.post1.suffix-2_py27 1.2.2.dev2.suffix-2_py27 | 1.2.2.post1.suffix-2 1.2.2dev2.suffix-2_py27 | 1.2.2.post1.suffix-1_py33 1.2.2.dev2.suffix-2 | 1.2.2.post1.suffix-1_py27 1.2.2dev2.suffix-2 | 1.2.2.post1.suffix-1 1.2.2.dev2.suffix-1_py33 | 1.2.2.post2.suffix-2_py33 1.2.2dev2.suffix-1_py33 | 1.2.2.post2.suffix-2_py27 1.2.2.dev2.suffix-1_py27 | 1.2.2.post2.suffix-2 1.2.2dev2.suffix-1_py27 | 1.2.2.post2.suffix-1_py33 1.2.2.dev2.suffix-1 | 1.2.2.post2.suffix-1_py27 1.2.2dev2.suffix-1 | 1.2.2.post2.suffix-1 1.2.2a1.suffix-2_py33 | 1.2.2.suffix-2_py33 1.2.2a1.suffix-2_py27 | 1.2.2.suffix-2_py27 1.2.2a1.suffix-2 | 1.2.2.suffix-2 1.2.2a1.suffix-1_py33 | 1.2.2.suffix-1_py33 1.2.2a1.suffix-1_py27 | 1.2.2.suffix-1_py27 1.2.2a1.suffix-1 | 1.2.2.suffix-1 1.2.2a2.suffix-2_py33 | 1.2.2a1.suffix-2_py33 1.2.2a2.suffix-2_py27 | 1.2.2a1.suffix-2_py27 1.2.2a2.suffix-2 | 1.2.2a1.suffix-2 1.2.2a2.suffix-1_py33 | 1.2.2a1.suffix-1_py33 1.2.2a2.suffix-1_py27 | 1.2.2a1.suffix-1_py27 1.2.2a2.suffix-1 | 1.2.2a1.suffix-1 1.2.2rc1.suffix-2_py33 | 1.2.2a2.suffix-2_py33 1.2.2rc1.suffix-2_py27 | 1.2.2a2.suffix-2_py27 1.2.2rc1.suffix-2 | 1.2.2a2.suffix-2 1.2.2rc1.suffix-1_py33 | 1.2.2a2.suffix-1_py33 1.2.2rc1.suffix-1_py27 | 1.2.2a2.suffix-1_py27 1.2.2rc1.suffix-1 | 1.2.2a2.suffix-1 1.2.2rc2.suffix-2_py33 | 1.2.2dev1.suffix-2_py33 1.2.2rc2.suffix-2_py27 | 1.2.2dev1.suffix-2_py27 1.2.2rc2.suffix-2 | 1.2.2dev1.suffix-2 1.2.2rc2.suffix-1_py33 | 1.2.2dev1.suffix-1_py33 1.2.2rc2.suffix-1_py27 | 1.2.2dev1.suffix-1_py27 1.2.2rc2.suffix-1 | 1.2.2dev1.suffix-1 1.2.2.suffix-2_py33 | 1.2.2rc1.suffix-2_py33 1.2.2.suffix-2_py27 | 1.2.2rc1.suffix-2_py27 1.2.2.suffix-2 | 1.2.2rc1.suffix-2 1.2.2.suffix-1_py33 | 1.2.2rc1.suffix-1_py33 1.2.2.suffix-1_py27 | 1.2.2rc1.suffix-1_py27 1.2.2.suffix-1 | 1.2.2rc1.suffix-1 1.2.2.post1.suffix-2_py33 | 1.2.2rc2.suffix-2_py33 1.2.2.post1.suffix-2_py27 | 1.2.2rc2.suffix-2_py27 1.2.2.post1.suffix-2 | 1.2.2rc2.suffix-2 1.2.2.post1.suffix-1_py33 | 1.2.2rc2.suffix-1_py33 1.2.2.post1.suffix-1_py27 | 1.2.2rc2.suffix-1_py27 1.2.2.post1.suffix-1 | 1.2.2rc2.suffix-1 1.2.2.post2.suffix-2_py33 | 1.2.2dev2.suffix-2_py33 1.2.2.post2.suffix-2_py27 | 1.2.2dev2.suffix-2_py27 1.2.2.post2.suffix-2 | 1.2.2dev2.suffix-2 1.2.2.post2.suffix-1_py33 | 1.2.2dev2.suffix-1_py33 1.2.2.post2.suffix-1_py27 | 1.2.2dev2.suffix-1_py27 1.2.2.post2.suffix-1 | 1.2.2dev2.suffix-1 1.2.2post1.suffix-2_py33 | 1.2.2post1.suffix-2_py33 1.2.2post1.suffix-2_py27 | 1.2.2post1.suffix-2_py27 1.2.2post1.suffix-2 | 1.2.2post1.suffix-2 1.2.2post1.suffix-1_py33 | 1.2.2post1.suffix-1_py33 1.2.2post1.suffix-1_py27 | 1.2.2post1.suffix-1_py27 1.2.2post1.suffix-1 | 1.2.2post1.suffix-1 1.2.2post2.suffix-2_py33 | 1.2.2post2.suffix-2_py33 1.2.2post2.suffix-2_py27 | 1.2.2post2.suffix-2_py27 1.2.2post2.suffix-2 | 1.2.2post2.suffix-2 1.2.2post2.suffix-1_py33 | 1.2.2post2.suffix-1_py33 1.2.2post2.suffix-1_py27 | 1.2.2post2.suffix-1_py27 1.2.2post2.suffix-1 | 1.2.2post2.suffix-1

Additional Context

maximlt commented 1 year ago

Hi @ForgottenProgramme,

Bokeh, since its 3.0 release, pushes dev packages with .devX and rc suffixes. Before that it used devX and rc, notice the dot added now in .devX. This is exactly what PEP440 prescribes: [N!]N(.N)*[{a|b|rc}N][.postN][.devN].

Right now downloading a dev package from PyPI (pip install bokeh --pre) installs an rcX version, rightfully so. However downloading a dev package from the bokeh/label/dev channel (conda install -c bokeh/label/dev bokeh) installs a .devX version instead of the expected rcX version :(

Would you like me to open a new issue?

ForgottenProgramme commented 1 year ago

Hey, @maximlt! Yes, please feel free to open an issue and link to this SPIKE. :)

github-actions[bot] commented 7 months ago

Hi there, thank you for your contribution!

This issue has been automatically marked as stale because it has not had recent activity. It will be closed automatically if no further activity occurs.

If you would like this issue to remain open please:

  1. Verify that you can still reproduce the issue at hand
  2. Comment that the issue is still reproducible and include:
    • What OS and version you reproduced the issue on
    • What steps you followed to reproduce the issue

NOTE: If this issue was closed prematurely, please leave a comment.

Thanks!