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

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

  # design data model to store messages
  # define logic to send messages
  # add all necessary views to send/read/(reply to?) messages
  # 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.