Introduction
Hi, GSoC 2015 is almost over and in this blog post I want to draw a line under my activities related to GnuplotRB project and compare project proposal with developed gem.
Activities during this summer
CI, programming style and tests
Travis CI and Co
To be sure that I'm not breaking anything with new contributions, I added Travis CI build configuration for my project and used Codeclimate with its testcoverage gem. I ran tests (RSpec) via Travis on both MRI (2.0, 2.1, 2.2) and Jruby (9.0.0.0).
I also used Rubocop to check my code from time to time for style and code complexity issues.
For documenting I used RDoc until I realized that Rubydoc uses YARD to parse gem's documentation =). After it I fixed docs to satisfy YARD syntax so now it's readable on Rubydoc.
Functional style in Ruby
From the very beginning GnuplotRB's classes were immutable. Every time
user changed it, a new object with given parameters was instantiated.
Now that's true for simple methods (not the ones ending with !
or =
).
Destructive update methods (#option!(value)
or #option = value
) change
state of existing object. The idea is taken from Ruby standart library (e.g., Array#sort
and Array#sort!
).
Pre-midterm contributions
Basic staff classes
I started gem development by designing several staff classes: Terminal, Datablock and Dataset. Their main purpose was to create a robust base for other plottable classes such as Plot and Multiplot.
GnuplotRB::Plot class
My first milestone was to develop staff classes and GnuplotRB::Plot that would allow users to plot 2D graphs. During second week I implemented Plot as container of Datasets with its own plotting methods.
GnuplotRB::Splot and Multiplot
After Plot
was developed it was pretty simple to implement Splot
on its base.
The only difference between them is in constructor: the main plotting command for
Plot
is 'plot'
while for Splot
it's 'splot'
.
Multiplot is a little bit different: it is container of plots so I had to implement handy methods for updating plots multiplot consists of.
Since most plotting
methods (#to_png
, #to_canvas
etc) were the same for Plot
and Multiplot
, I decided
to move them to Plottable
module and mixin it into both classes. A little bit later I
also moved all methods related to option handling into OptionHandling
module and added it
into Plottable
via Module.extend
. Later it allowed me to make Dataset
plottable just by adding
#plot
method and mixing in it Plottable
module.
Project state before midterm
See a blog post.
Post-midterm contributions
Error handling
For now error handling wors in the following way:
- Gem checks if given terminal is available with current Gnuplot installation
(e.g., if user tries to call Plot#to_missing_term
, he will recieve an error).
- Before outputting each command to Gnuplot pipe, GnuplotRB::Terminal
now checks
stderr for errors. This is far from ideal and if you have any ideas how to
imrove it, please take a part in a discussion.
GnuplotRB::Animation
GnuplotRB::Animation
is just container for plots with its own rules
of outputting them. I created it as Multiplot
's child,
wrote new #plot
and restricted some plotting possibilities (e.g., '#to_png').
Since up to this moment all other plottable classes were able to
embed themselves into iRuby notebooks, I wanted to embed Animation
's GIFs too.
Now they are embedded as HTML =): GIF is converted to BASE64 and then inserted
as <img .../>
tag.
GnuplotRB::Fit
This module contain several public methods: ::fit_polynomial
, ::fit_exp
,
::fit_log
, ::fit_sin
. Each of them fits given data with methematical function
mentioned in its name. If you want to use another function, I recommend you to
look at ::fit
method that accepts function as an argument.
The main problem I faced with was to get output from Gnuplot. Since Terminal's ErrorHandling catchs all the output, I had to write a method that collected all the errors and took data from them.
Notebooks
During GSoC I wrote several notebook to show GnuplotRB's features and provide examples for users. You can find them all in the notebook folder.
The rest
During last two weeks of GSoC I fixed my docs (made them compatible with YARD) and tests (improved coverage and found pair of bugs).
I also wrote a blog post for sciruby.com to introduce the gem to community.
Comparison
All features mentioned in project proposal were developed.
Interface of GnuplotRB gem is very similar to proposed.
I only added safe and destructive update methods and
support for iRuby and Daru containers. I planned to provide
GnuplotRB with Approximation
class for fitting data, but
later decided to add Fit
module instead.