**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)

**Links to relevant threads in the mailing list**: <a href='https://groups.google.com/d/topic/melange-soc-dev/FtVJXiqLmOA/discussion'>Thread 1</a>

## 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)

**Links to relevant threads in the mailing list**: <a href='https://groups.google.com/d/topic/melange-soc-dev/l5CdVZ7ammw/discussion'>Thread 1</a>

## 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)

**Links to relevant threads in the mailing list**: <a href='https://groups.google.com/d/topic/melange-soc-dev/XHGiLUxBlkM/discussion'>Thread 1</a>

## 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.

This project has a few stages:

  1. design data model to store messages
  1. define logic to send messages
  1. add all necessary views to send/read/(reply to?) messages
  1. support email notifications for messages

Please note that the scope of the project is not just a feature which allows user A to send a message to user B. It should be able to deal with difference groups. Each user, depending on their role should be able to send messages to different groups. For example, an Organization Administrator may want to send a message to: all the mentors for their organization, all the students who submitted a proposal to their organization, all the students who work on a project to their organization, etc.

On the other hand, it is important to be able to determine, for each user, what messages are interesting/sent to her. Proper data model design is crucial for this project and there is no much point in moving on to the next step until all arisen questions have been answered.

**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.