As luck would have it today we had a hack day at local.ch, so I got to spend a workday on that idea. I got positive feedback from my co-workers, so I have now published the skeleton on github. The project is called “servicegen” for now – no nice name has come up yet. ;-)
See the README on github for information about the ideas.
Somehow the tasks for creating a web service are always more or less the same.
- Specify URL schema
- Validate input parameters
- Request data: either from a database or from at least one other web service
- Identify output format using URL or HTTP headers
- Output data in the correct format
And I think that even web.py doesn’t do a good enough job of making this easy and really fast.
I’m starting to think that a DSL might be the correct way to that. The only project I know which partially does that is ActiveWebService from the Ruby on Rails project.
I just hacked together two very simple prototypes of how such service specification could look. I’m interested in two things:
- Does something like that exist already?
- Is it a stupid idea?
See my two examples derived from real services I developed inside local.ch:
Last week I had to solve a non-trivial problem for my background: clustering of content. I had to write a program which takes a bunch of search results and clusters them together by content. So similar results would go into the same group.
I started with Carrot2 – a Java framework for exactly that purpose. The only available documentation is the API reference and some examples. The API documentation contains 796 classes. That’s no typo, count them if you must. I spent literally two working days trying to get it running. I got it running somehow but got stuck when I had to customize text distance function.
That’s when I started to search for other packages. I found python-cluster. It exposes two classes (for the two different clustering algorithms) with a constructor and one method each. All I have to pass it is the list of results and a distance function.
I was up and running literally in less than an hour. Most of that I spent on a reasonable distance algorithm.
Not passing any judgment here. Both frameworks have their strengths. But I found it a very good example of the different philosophies in the two camps.
It would be very interesting to try out the same approach for source code. Basically you could use source code – e.g. your current project – as the learning source. And then by having a more efficient input method than the current demo it might actually be an efficient way to re-use code.