Not My Idea

Carnets Web d'Alexis Métaireau

Archive for the ‘distutils2’ Category

An amazing summer of code working on distutils2

2 comments

The Google Summer of Code I’ve spent working on distutils2 is over. It was a really amazing experience, for many reasons.

First of all, we had a very good team, we were 5 students working on distutils2: Zubin, Éric, Josip, Konrad and me. In addition, Mouad have worked on the PyPI
testing infrastructure. You could find what each person have done on the wiki page of distutils2.

We were in contact with each others really often, helping us when possible (in #distutils), and were continuously aware of the state of the work of each participant. This, in my opinion, have bring us in a good shape.

Then, I’ve learned a lot. Python packaging was completely new to me at the time of the GSoC start, and I was pretty unfamiliar with python good practices too, as I’ve been introducing myself to python in the late 2009.

I’ve recently looked at some python code I wrote just three months ago, and I was amazed to think about many improvements to made on it. I guess this is a good indicator of the path I’ve traveled since I wrote it.

This summer was awesome because I’ve learned about python good practices, now having some strong mercurial knowledge, and I’ve seen a little how the python community works.

Then, I would like to say a big thanks to all the mentors that have hanged around while needed, on IRC or via mail, and especially my mentor for this summer, Tarek Ziadé.

Thanks a lot for your motivation, your leadership and your cheerfulness, even with a new-born and a new work!

Why ?

I wanted to work on python packaging because, as the time pass, we were having a sort of complex tools in this field. Each one wanted to add features to distutils, but not in a standard way.

Now, we have PEPs that describes some format we agreed on (see PEP 345), and we wanted to have a tool on which users can base their code on, that’s distutils2.

My job

I had to provides a way to crawl the PyPI indexes in a simple way, and do some installation / uninstallation scripts.

All the work done is available in my bitbucket repository.

Crawling the PyPI indexes

There are two ways of requesting informations from the indexes: using the "simple" index, that is a kind of REST index, and using XML-RPC.

I’ve done the two implementations, and a high level API to query those twos. Basically, this supports the mirroring infrastructure defined in PEP 381.
So far, the work I’ve done is gonna be used in pip (they’ve basically copy/paste the code, but this will change as soon as we get something completely stable for distutils2), and that’s a good news, as it was the main reason for what I’ve done that.

I’ve tried to have an unified API for the clients, to switch from one to another implementation easily. I’m already thinking of adding others crawlers to this stuff, and it was made to be extensible.

If you want to get more informations about the crawlers/PyPI clients, please refer to the distutils2 documentation, especially the pages about indexes.

You can find the changes I made about this in the distutils2 source code .

Installation / Uninstallation scripts

Next step was to think about an installation script, and an uninstaller.
I’ve not done the uninstaller part, and it’s a smart part, as it’s basically removing some files from the system, so I’ll probably do it in a near future.

distutils2 provides a way to install distributions, and to handle dependencies between releases. For now, this support is only about the last version of the METADATA (1.2) (See, the PEP 345), but I’m working on a compatibility layer for the old metadata, and for the informations provided via PIP requires.txt, for instance.

Extra work

Also, I’ve done some extra work. this includes:

  • working on the PEP 345, and having some discussion about it (about the names of some fields).
  • writing a PyPI server mock, useful for tests. you can find more information about it on the documentation.

Futures plans

As I said, I’ve enjoyed working on distutils2, and the people I’ve met here are really pleasant to work with. So I want to continue contributing on python, and especially on python packaging, because there is still a lot of things to do in this scope, to get something really usable.

I’m not plainly satisfied by the work I’ve done, so I’ll probably tweak it a bit: the installer part is not yet completely finished, and I want to add support for a real REST index in the future.

We’ll talk again of this in the next months, probably, but we definitely need a real REST API for PyPI, as the "simple" index is an ugly hack, in my opinion. I’ll work on a serious proposition about this, maybe involving CouchDB, as it seems to be a good option for what we want here.

Issues

I’ve encountered some issues during this summer. The main one is that’s hard to work remotely, especially being in the same room that we live, with others. I like to just think about a project with other people, a paper and a pencil, no computers. This have been not so possible at the start of the project, as I needed to read a lot of code to understand the codebase, and then to read/write emails.

I’ve finally managed to work in an office, so good point for home/office separation.

I’d not planned there will be so a high number of emails to read, in order to follow what’s up in the python world, and be a part of the community seems to takes some times to read/write emails, especially for those (like me) that arent so confortable with english (but this had brought me some english fu !).

Thanks !

A big thanks to Graine Libre and Makina Corpus, which has offered me to come into their offices from time to time, to share they cheerfulness !
Many thanks too to the Google Summer of Code program for setting up such an initiative. If you’re a student, if you’re interested about FOSS, dont hesitate any second, it’s a really good opportunity to work on interesting projects!

Written by Alexis Metaireau

août 16th, 2010 at 1:54

Posted in Python, distutils2

Tagged with , ,

A distutils2 month — PyPI simple index ready.

2 comments

I’m working for about a month for distutils2, even if I was being a bit busy (as I had some class courses and exams to work on)

I’ll try do sum-up my general feelings here, and the work I’ve made so far. You can also find, if you’re interested, my weekly summaries in a dedicated wiki page.

General feelings

First, and it’s a really important point, the GSoC is going very well, for me as for other students, at least from my perspective. It’s a pleasure to work with such enthusiast people, as this make the global atmosphere very pleasant to live.

First of all, I’ve spent time to read the existing codebase, and to understand what we’re going to do, and what’s the rationale to do so.

It’s really clear for me now: what we’re building is the foundations of a packaging infrastructure in python. The fact is that many projects co-exists, and comes all with their good concepts. Distutils2 tries to take the interesting parts of all, and to provide it in the python standard libs, respecting the recently written PEP about packaging.

With distutils2, it will be simpler to make "things" compatible. So if you think about a new way to deal with distributions and packaging in python, you can use the Distutils2 APIs to do so.

Tasks

My main task while working on distutils2 is to provide an installation and an un-installation command, as described in PEP 376. For this, I first need to get informations about the existing distributions (what’s their version, name, metadata, dependencies, etc.)

The main index, you probably know and use, is PyPI. You can access it at http://pypi.python.org.

PyPI index crawling

There is two ways to get these informations from PyPI: using the simple API, or via xml-rpc calls.

A goal was to use the version specifiers defined in PEP 345 and to provides a way to sort the grabbed distributions depending our needs, to pick the version we want/need.

Using the simple API

The simple API is composed of HTML pages you can access at http://pypi.python.org/simple/.

Distribute and Setuptools already provides a crawler for that, but it deals with their internal mechanisms, and I found that the code was not so clear as I want, that’s why I’ve preferred to pick up the good ideas, and some implementation details, plus re-thinking the global architecture.

The rules are simple: each project have a dedicated page, which allows us to get informations about:

  • the distribution download locations (for some versions)
  • homepage links
  • some other useful informations, as the bugtracker address, for instance.

If you want to find all the distributions of the "EggsAndSpam" project, you could do the following (do not take so attention to the names here, as the API will probably change a bit):

>>> index = SimpleIndex()
>>> index.find("EggsAndSpam")
[EggsAndSpam 1.1, EggsAndSpam 1.2, EggsAndSpam 1.3]

We also could use version specifiers:

>>> index.find("EggsAndSpam (< =1.2)")
[EggsAndSpam 1.1, EggsAndSpam 1.2]

Internally, what’s done here is the following:

  • it process the http://pypi.python.org/simple/FooBar/ page, searching for download URLs.
  • for each found distribution download URL, it creates an object, containing informations about the project name, the version and the URL where the archive remains.
  • it sort the found distributions, using version numbers. The default
    behavior here is to prefer source distributions (over binary ones), and to rely on the last "final" distribution (rather than beta, alpha etc. ones)

So, nothing hard or difficult here.

We provides a bunch of other features, like relying on the new PyPI mirroring
infrastructure
or filter the found distributions by some criterias. If you’re curious, please browse the distutils2 documentation.

Using xml-rpc

We also can make some xmlrpc calls to retreive informations from PyPI. It's a really more reliable way to get informations from from the index (as it's just the index that provides the informations), but cost processes on the PyPI distant server.

For now, this way of querying the xmlrpc client is not available on Distutils2, as I'm working on it. The main pieces are already present (I'll reuse some work I've made from the SimpleIndex querying, and some code already set up), what I need to do is to provide a xml-rpc PyPI mock server, and that's on what I'm
actually working on.

Processes

For now, I'm trying to follow the "documentation, then test, then code" path, and that seems to be really needed while working with a community. Code is hard to read/understand, compared to documentation, and it's easier to change.

While writing the simple index crawling work, I must have done this to avoid some changes on the API, and some loss of time.

Also, I've set up a schedule, and the goal is to be sure everything will be ready in time, for the end of the summer. (And now, I need to learn to follow schedules ...)

Written by Alexis Metaireau

juillet 6th, 2010 at 9:12

A distutils2 sprint in tours

6 comments

Yesterday, as I was traveling to Tours, I’ve took some time to visit Éric, another student who’s working on distutils2 this summer, as a part of the GSoC. Basically, it was to take a drink, discuss a bit about distutils2, our respective tasks and general feelings, and to put a face on a pseudonym.

I’d really enjoyed this time, because Éric knows a lot of things about mercurial and python good practices, and I’m eager to learn about those.

So, we have discussed about things, have not wrote so much code, but have some things to propose so far, about documentation, and I also provides here some bribes of conversations we had.

Documentation

While writing the PyPI simple index crawler documentation, I realized that we miss some structure, or how-to about the documentation. Yep, you read well. We lack documentation on how to make documentation. Heh.

We’re missing some rules to follow, and this lead to a not-so-structured final documentation.

We probably target three type of publics, and we can split the documentation regarding those:

  • Packagers who want to distribute their softwares.
  • End users who need to understand how to use end user commands, like the installer/uninstaller
  • packaging coders who use distutils2, as a base for building a package manager.

We also need to discuss about a pattern to follow while writing documentation. How many parts do we need ? Where to put the API description ? etc. That’s maybe seems to be not so important, but I guess the readers would appreciate to have the same structure all along distutils2 documentation.

Mercurial

I’m really not a mercurial power user. I use it on daily basis, but I lack of basic knowledge about it. Big thanks Éric for sharing yours with me, you’re of a great help.

We have talked about some mercurial extensions that seems to make the life simpler, while used the right way. I’ve not used them so far, so consider this as a personal note.

  • hg histedit, to edit the history
  • hg crecord, to select the changes to commit

We have spent some time to review a merge I made sunday, to re-merge it, and commit the changes as a new changeset. Awesome.

These things make me say I need to read the hg book, and will do as soon as I got some spare time: mercurial seems to be simply great.

So … Great. I’m a powerful merger now !

On using tools

Because we also are hackers, we have shared a bit our ways to code, the tools we use, etc.

Both of us were using vim, and I’ve discovered vimdiff and hgtk, which will completely change the way I navigate into the mercurial history.

We aren’t « power users» , so we have learned from each other about vim tips.

You can find my dotfiles on github, if it could help. They’re not perfect, and not intended to be, because changing all the time, as I learn. Don’t hesitate to have a look, and to propose enhancements if you have !

On being pythonic

My background as an old Java user disserves me so far, as the paradigms are not the same while coding in python. Hard to find the more pythonic way to do, and sometimes hard to unlearn my way to think about software engineering.

Well, it seems that the only solution is to read code, and to re-read import this from times to times ! Coding like a pythonista seems to be a must-read, so, I know what to do.

Conclusion

It was really great. Next time, we’ll need to focus a bit more on distutils2, and to have a bullet list of things to do, but days like this one are opportunities to catch !

We’ll probably do another sprint in a few weeks, stay tuned !

Written by Alexis Metaireau

juillet 6th, 2010 at 2:48

Posted in distutils2

Tagged with ,

GSOC Distutils first report

leave a comment

As I’ve been working on Distutils2 during the past week, taking part of the GSOC program, here is a short summary of what I’ve done so far.

As my courses are not over yet, I’ve not worked as much as I wanted, and this will continues until the end of June. My main tasks are about making installation and uninstallation commands, to have a simple way to install distributions via Distutils2.

To do this, we need to rely on informations provided by the Python Package Index (PyPI), and there is at least two ways to retreive informations from here: XML-RPC and the "simple" API.

So, I’ve been working on porting some Distribute related stuff to Distutils2, cutting off all non distutils’ things, as we do not want to depend from Distribute’s internals. My main work has been about reading the whole code, writing tests about this and making those tests possible.

In fact, there was a need of a pypi mocked server, and, after reading and introducing myself to the distutils behaviors and code, I’ve taken some time to improve the work Konrad makes about this mock.

A PyPI Server mock

The mock is embeded in a thread, to make it available during the tests, in a non blocking way. We first used WSGI and wsgiref in order control what to serve, and to log the requests made to the server, but finally realised that wsgiref is not python 2.4 compatible (and we need to be python 2.4 compatible in Distutils2).

So, we switched to BaseHTTPServer and SimpleHTTPServer, and updated our tests accordingly. It’s been an opportunity to realize that WSGI has been a great step forward for making HTTP servers, and expose a really simplest way to discuss with HTTP !

You can find the modifications I made, and the related docs about this on my bitbucket distutils2 clone.

The PyPI Simple API

So, back to the main problematic: make a python library to access and request information stored on PyPI, via the simple API. As I said, I’ve just grabbed the work made from Distribute, and played a bit with, in order to view what are the different use cases, and started to write the related tests.

The work to come

So, once all use cases covered with tests, I’ll rewrite a bit the grabbed code, and do some software design work (to not expose all things as privates methods, have a clear API, and other things like this), then update the tests accordingly and write a documentation to make this clear.

Next step is to a little client, as I’ve already started here I’ll take you updated !

Written by Alexis Metaireau

juin 4th, 2010 at 12:27

Posted in distutils2

Tagged with , ,

A Distutils2 GSOC

one comment

WOW.

I’ve been accepted to be a part of the Google Summer Of Code program, and will work on python distutils2, with a lot of (intersting!) people.

So, it’s about building the successor of Distutils2, ie. « the python package manager» . Today, there is too many ways to package a python application (pip, setuptools, distribute, distutils, etc.) so there is a huge effort to make in order to make all this packaging stuff interoperable, as pointed out by the PEP 376.

The current state of packaging

In more details, I’m going to work on the Installer / Uninstaller features of Distutils2, and on a PyPI XML-RPC client for distutils2.

Here are the already defined tasks:

  • Implement Distutils2 APIs described in PEP 376.
  • Add the uninstall command.
  • think about a basic installer / uninstaller script. (with deps) — similar to pip/easy_install
  • in a pypi subpackage;
  • Integrate a module similar to setuptools’ package_index’
  • PyPI XML-RPC client for distutils 2: http://bugs.python.org/issue8190

As I’m relatively new to python, I’ll need some extra work in order to apply all good practice, among other things that can make a developper-life joyful.

I’ll post here, each week, my advancement, and my tought about python and especialy python packaging world.

Written by Alexis Metaireau

mai 1st, 2010 at 4:33

Posted in distutils2

Tagged with , ,