#summary Ideas List for GSoC 2013
#labels Importance-Useful,Featured

*Melange* is the software that powers Google Summer of Code. If improving the way that Google Summer of Code is run as your Google Summer of Code project sounds attractively recursive, please read on!

= Ideas! =

We welcome your ideas, whatever they might be for Melange - but here are a few of our own for what we think might be good student summer projects:

== Developer Workflow Improvements ==

In the last year Melange has gotten serious about mature software development practices, but our work in this area is far from complete. A project oriented around developer workflow would involve removing derived assets from source control, making derivation of those derived assets part of our build process, and running static analysis tools such as lint and documentation extraction over our source code.

*Relevant Skills:* Python, <a href="http://www.buildout.org/">Buildout</a>

*Probable Mentor:* Nathaniel Manista

== Integration of Summer of Code's "Connections" subsystem with Code-in. ==

Melange recently gained a "Connections" subsystem for building relationships between participants, but Connections is only integrated with Summer of Code, one of the two programs that Melange powers. Empowering Code-in with Connections would be a suitable student effort.

*Relevant Skills:* Python, HTML

*Probable Mentor:* _undecided_

== Javascript Tests == 

Melange has a great deal of Javascript code that needs to be extracted from templates and other hiding holes, refined, and tested.
We already have a testing architecture in place (using Testem, Jasmine, PhantomJS) but we need to start writing tests.

*Relevant Skills:* Javascript

*Probable Mentor:* Mario Ferraro (Merio on #melange)

== Javascript List Enhancements ==

Our current lists are always asynchronous and load some time after the page on which they are displayed is loaded. They should be enhanced to be able to be included in the page and viewed statically when as the server deems appropriate. This work would cover both client and server domains and would make use of Javascript, Python, HTML and CSS.

*Relevant Skills:* Javascript, Python, HTML and CSS

*Probable Mentor:* Mario Ferraro (Merio on #melange)

== Functional Tests Focusing on Behavior-Driven Development ==

Following last few years' successful GSoC projects on testing, our focus is mainly on behavior-driven development (BDD) this year. Although Melange is already a relatively mature project, such a technique is still useful to us. First, the biggest obstacles for writing tests is the drudgery taken to write one, so people just don't bother to do so, though they clearly know the importance of testing. The xunit testing framework pioneered by Kent Beck and Erich Gamma has made writing tests much easier. BDD, in my opinion, is another step to reduce the barrier by allowing people to write test cases in a natural language like manner. Second, the natural language like syntax also opens the door for non programmers to write test cases. In the context of Melange, they may include program hosts and other users. Last but not least, when a user requests a new feature, they can use the Domain-specific language (DSL) to describe their needs more accurately, which will also serve as a contract/test cases for development. Thus, it is only needed to be written once but can be used in multiple stages of the project life cycle and also a win-win for both users and developers.

The purpose of this project is to build a good infrastructure on BDD for Melange including defining customised DSL and to write test cases for existing functions/features. Pyccuracy is the recommended framework thanks to its good integration with Selenium and out-of-box DSL for web testing. We are, however, also open to other alternatives, such as Behave and Lettuce. In addition, other proposals on testing are also welcome.

To get started with Melange, you may find the following wikis useful:
https://code.google.com/p/soc/wiki/GettingStarted
https://code.google.com/p/soc/wiki/2013DeveloperDoc
https://code.google.com/p/soc/wiki/PythonStyleGuide

To get started with Melange testing, you may find the following wikis useful:
https://code.google.com/p/soc/wiki/GettingStartedOnTesting
https://code.google.com/p/soc/wiki/TestingGuidelines

To make you become familiar with the Melange code base and demonstrate your ability and enthusiasm, you are recommended to read our issue tracker, find a couple of ones you are interested, and then try to tackle them. Alternatively, you can also write some functional tests for Melange.
https://code.google.com/p/soc/issues/list

The code of Melange are structured in the following way:
* The main code is in app/soc.
* The tests are in tests.
* Unit tests are organized in the way similar to the main code.
* The test utils are tests/*_utils.py
* The existing functional testing infrastructures and tests written by Syed are in the functional_testing branch.

If you have questions not answered here or other wiki pages, please feel free to ask on the mailing list melange-soc-dev@googlegroups.com.

*Relevant Skills:* Python, BDD, Selenium

*Probable Mentor:* Chong Liu (Leo)

== Enhanced Registration Workflow ==

Registering for Melange is too hard and requires too much developer and administrator intervention. This user experience can be greatly smoothed!

*Relevant Skills:* Python, HTML, CSS

*Probable Mentor:* _undecided_

== Messaging System ==

Melange has a need to proxy messages between participants (because Code-in participants are minors who may not be able to reveal their email addresses). Melange should be able to mediate communication between all program participants regardless of constraints about physical location and email availability.

*Relevant Skills:* Python, App Engine

*Probable Mentor:* Daniel Hans

= Orientation =

We would like our prospective students to propose new project ideas and discuss with Melange developers either here (in comments), #melange on freenode.net, or via our mailing list melange-soc-dev@googlegroups.com. 

Every student is encouraged to clone our <a href="http://code.google.com/p/soc/source/checkout>git repository</a>, solve <a href="http://code.google.com/p/soc/issues/list">issues</a> and submit patches as part of the application process. <a href="http://code.google.com/p/soc/wiki/GettingStarted">Here</a> is our getting started guide.