GSoC Proposal - Active Resource Discovery

Hello,

I submitted a proposal for the GSoC about adding a discovery file for
ActiveResource. This discovery file will allow developers to explore
(through an API) the resources that are available on a REST service. I
will also add a set of rake tasks for adding automatically generating
the REST clients.

This idea was originally posted on the rails GSoC wiki. Do any of you
guys have any ideas on anything else that can be made by adding a
discovery procedure to REST services?

Hi carlosk,

I really like the idea of being able to expose an API of REST services
automatically. Can you post your proposal here?

Here are some of my suggestions for things you can think about. Some
of them may be hit or miss. I imagine you could utilize something like
rake routes to generate possible services. However, I wonder how you
would handle before_filters that limit access to some services. For
example if a service required user credentials. Some other things to
consider would be the type of communication being used. Some services
may use any combination of xml, json, etc... Think about how you might
figure out which protocol is used for consumption and publication.
Also, what kind of information does the API require to be sent to it
for a particular service? The model might be a good place to look for
this, but it may not have all the information you need. Lastly, what
rules determine if a resource is included in the API? Is there some
place that you can restrict resources from being included in the API?

Thanks for the Reply Allen. I'll try to add some of your suggestions
to my proposal. This is the original proposal that I submitted:

Abstract:
Currently ActiveResource requires developers to know the domain of the
REST service. The only way of knowing if a resource is available is if
the service includes some documentation. This project will develop a
standard resource discovery procedure for Rails. With this new
standard developers will be able to add code that can dynamically work
with the resources exposed through REST. As an example set of rake
tasks for generating REST client classes would be created.

Content:

About Me:
My name is Carlos Kirkconnell and I'm a Fulbright Scholar from
Honduras. I'm currently getting a Master in Software Engineering at
Kansas State University. I made my undergrad degree in Honduras and I
studied Computer Science. After graduating, I worked both as a
university professor and as project manager. I developed software for
around 5 years.

Most of my work on the industry was done using the .net Framework.
With every successive release of the .net framework, I saw how things
were getting more complex and I completely disliked how Visual Studio
encourages developers to write bad code.

Around 2 and a half years ago, I heard about a new framework called
rails. I investigated about it and I fell in love with it. The code
was so clean! Design patterns were encouraged! I finally felt I was
really working on an MVC pattern. Database migrations turned to be the
final solution for the constant headache we were experiencing at my
job. I adapted a rails project to one of our .net solutions, and used
migrations to keep multiple databases up to date. This implementation
was a success. I've been using rails since that then.

I quitted my job after I got the Fulbright scholarship. Currently on
my spare time I'm working a web application that integrates with
basecamp.

Why do you use Rails? How would you like to see it improve?

Rails is the best framework that I've ever used for developing web
applications. I like the freedom that a dynamic language like ruby
gives me. That combined with rails turns developing web applications a
fun experience.

One thing about rails that I would like to see improve is the process
of communicating with other apps. The default approach requires the
coder to know the names and structures of all the resources published
by a web site. I believe that a more streamlined approach could be
made in order to ease the job of developers that want to communicate
through REST between web apps.

Why is this important to the Rails community at large? Why is this
important to you?

This project is important for the Rails community for two reasons:

It will allow developers to explore the resources available through
REST and, in most cases, without needing any special documentation
about the resources, information about the resources would be
available.
Developers would be able to automate the creation of REST client
classes by using a rake task, reducing the amount of code required to
write.
This change will allow applications to be able to dynamically
"explore" websites searching for resources.

This project is important for me because, for my graduation project,
my research area is going to be distributed web application. This
project will be a great experience for my research area.

List a clear set of goals/milestones you'll hit during the summer. Be
specific.

For this project I pretend to accomplish the following milestones:

Discovery File for REST: My first goal would be to use the
information found in the routes.rb file to generate either an XRDS
file (http://en.wikipedia.org/wiki/XRDS) or an RDF file (http://
en.wikipedia.org/wiki/Resource_Description_Framework). I would
probably have to discuss with my mentor what's the best option.
Discovery API: After creating the Discovery File, I would create an
API that will read that information and present it to developers as a
useful data structure that could be explored.
Rake Tasks: Finally I will create rake tasks for both automating the
creation of ActiveResource client classes and to inform developers
about the resources found on REST server.
Namespaces for ActiveResource: Since the names of the resources on
other sites might conflict with the classes of your domain, I will
need to assign the REST clients to a namespace.

Give a rough timeline for hitting these milestones.

Discovery File for REST: June 12
Discovery API: July 3
Rake Tasks: July 30
Namespaces: Aug 7
Wrapping Everything Up: Aug 21

How will you measure progress? How will you handle falling behind?

I will use basecamp to keep track of my milestones. In the event of
falling behind I will talk to my mentor to find the best solution to
solve the problem that is stopping me.

What are the "unknowns" in this project for you? What kind of pitfalls
could you run into?

I've never made a rails plugins, but I know there are tons of
tutorials out there about how to make one. Another challenge might be
how to read the routes.rb file. I would need to investigate about how
routes work internally in rails.

Hey Carlos,

I'm currently doing a school project where we are creating two rails
applications that are going to talk to each other. When I was
researching some stuff I found some basic auth stuff that was build
into rails. I think this is a very viable way to handle authentication
when requesting protected resources. You may already know about this,
but here are some links that explain it better:

The comments here are useful
http://github.com/rails/rails/blob/dd2eb1ea7c34eb6496feaf7e42100f37a8dae76b/actionpack/lib/action_controller/http_authentication.rb
Simple step by step video on how to set it up for a controller
http://railscasts.com/episodes/82-http-basic-authentication

XRDS is in the process of being obsoleted, to be replaced with XRD.
Although the spec is not complete, new applications would be well
served by moving to XRD. It's been blogged extensively here:
http://www.hueniverse.com/hueniverse/xrd/

Gregg