/+junk/pygooglechart-py3k

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/%2Bjunk/pygooglechart-py3k

« back to all changes in this revision

Viewing changes to pygooglechart.py

  • Committer: gak
  • Date: 2008-08-23 07:31:12 UTC
  • Revision ID: git-v1:d25980565dd2640f4d700e85f0fab48a685c8ed7
Fixed bug where the module would download twice (#7) (Evan Lezar)

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
20
 
21
21
"""
22
 
from __future__ import division
23
22
 
24
23
import os
25
24
import urllib
33
32
# Helper variables and functions
34
33
# -----------------------------------------------------------------------------
35
34
 
36
 
__version__ = '0.2.2'
 
35
__version__ = '0.2.1'
37
36
__author__ = 'Gerald Kaszuba'
38
37
 
39
38
reo_colour = re.compile('^([A-Fa-f0-9]{2,2}){3,4}$')
101
100
    def float_scale_value(cls, value, range):
102
101
        lower, upper = range
103
102
        assert(upper > lower)
104
 
        scaled = (value - lower) * (cls.max_value / (upper - lower))
 
103
        scaled = (value - lower) * (float(cls.max_value) / (upper - lower))
105
104
        return scaled
106
105
 
107
106
    @classmethod
163
162
                else:
164
163
                    raise DataOutOfRangeException()
165
164
            encoded_data.append(','.join(sub_data))
166
 
        return 'chd=t:' + '%7c'.join(encoded_data)
 
165
        return 'chd=t:' + '|'.join(encoded_data)
167
166
 
168
167
    @classmethod
169
168
    def scale_value(cls, value, range):
258
257
        self.values = [str(a) for a in values]
259
258
 
260
259
    def __repr__(self):
261
 
        return '%i:%%7c%s' % (self.axis_index, '%7c'.join(self.values))
 
260
        return '%i:|%s' % (self.axis_index, '|'.join(self.values))
262
261
 
263
262
 
264
263
class RangeAxis(Axis):
302
301
        self.height = height
303
302
        self.data = []
304
303
        self.set_title(title)
305
 
        self.set_title_style(None, None)
306
304
        self.set_legend(legend)
307
305
        self.set_legend_position(None)
308
306
        self.set_colours(colours)
347
345
        # optional arguments
348
346
        if self.title:
349
347
            url_bits.append('chtt=%s' % self.title)
350
 
        if self.title_colour and self.title_font_size:
351
 
            url_bits.append('chts=%s,%s' % (self.title_colour, \
352
 
                self.title_font_size))
353
348
        if self.legend:
354
 
            url_bits.append('chdl=%s' % '%7c'.join(self.legend))
 
349
            url_bits.append('chdl=%s' % '|'.join(self.legend))
355
350
        if self.legend_position:
356
351
            url_bits.append('chdlp=%s' % (self.legend_position))
357
352
        if self.colours:
358
353
            url_bits.append('chco=%s' % ','.join(self.colours))            
359
354
        if self.colours_within_series:
360
 
            url_bits.append('chco=%s' % '%7c'.join(self.colours_within_series))
 
355
            url_bits.append('chco=%s' % '|'.join(self.colours_within_series))
361
356
        ret = self.fill_to_url()
362
357
        if ret:
363
358
            url_bits.append(ret)
374
369
                else:
375
370
                    values = ('1', )
376
371
                style.append(','.join(values))
377
 
            url_bits.append('chls=%s' % '%7c'.join(style))
 
372
            url_bits.append('chls=%s' % '|'.join(style))
378
373
        if self.grid:
379
374
            url_bits.append('chg=%s' % self.grid)
380
375
        return url_bits
400
395
        else:
401
396
            self.title = None
402
397
 
403
 
    def set_title_style(self, colour, font_size):
404
 
        if not colour is None:
405
 
            _check_colour(colour)
406
 
        self.title_colour = colour
407
 
        self.title_font_size = font_size
408
 
 
409
398
    def set_legend(self, legend):
410
399
        """legend needs to be a list, tuple or None"""
411
400
        assert(isinstance(legend, list) or isinstance(legend, tuple) or
458
447
        assert(angle >= 0 and angle <= 90)
459
448
        assert(len(args) % 2 == 0)
460
449
        args = list(args)  # args is probably a tuple and we need to mutate
461
 
        for a in xrange(int(len(args) / 2)):
 
450
        for a in xrange(len(args) / 2):
462
451
            col = args[a * 2]
463
452
            offset = args[a * 2 + 1]
464
453
            _check_colour(col)
485
474
                areas.append('%s,%s,%s' % (area, self.fill_types[area], \
486
475
                    self.fill_area[area]))
487
476
        if areas:
488
 
            return 'chf=' + '%7c'.join(areas)
 
477
            return 'chf=' + '|'.join(areas)
489
478
 
490
479
    # Data
491
480
    # -------------------------------------------------------------------------
614
603
 
615
604
    def set_axis_labels(self, axis_type, values):
616
605
        assert(axis_type in Axis.TYPES)
617
 
        values = [urllib.quote(str(a)) for a in values]
 
606
        values = [urllib.quote(a) for a in values]
618
607
        axis_index = len(self.axis)
619
608
        axis = LabelAxis(axis_index, axis_type, values)
620
609
        self.axis.append(axis)
664
653
        url_bits = []
665
654
        url_bits.append('chxt=%s' % ','.join(available_axis))
666
655
        if label_axis:
667
 
            url_bits.append('chxl=%s' % '%7c'.join(label_axis))
 
656
            url_bits.append('chxl=%s' % '|'.join(label_axis))
668
657
        if range_axis:
669
 
            url_bits.append('chxr=%s' % '%7c'.join(range_axis))
 
658
            url_bits.append('chxr=%s' % '|'.join(range_axis))
670
659
        if positions:
671
 
            url_bits.append('chxp=%s' % '%7c'.join(positions))
 
660
            url_bits.append('chxp=%s' % '|'.join(positions))
672
661
        if styles:
673
 
            url_bits.append('chxs=%s' % '%7c'.join(styles))
 
662
            url_bits.append('chxs=%s' % '|'.join(styles))
674
663
        return '&'.join(url_bits)
675
664
 
676
665
    # Markers, Ranges and Fill area (chm)
677
666
    # -------------------------------------------------------------------------
678
667
 
679
668
    def markers_to_url(self):        
680
 
        return 'chm=%s' % '%7c'.join([','.join(a) for a in self.markers])
 
669
        return 'chm=%s' % '|'.join([','.join(a) for a in self.markers])
681
670
 
682
671
    def add_marker(self, index, point, marker_type, colour, size, priority=0):
683
672
        self.markers.append((marker_type, colour, str(index), str(point), \
687
676
        self.markers.append(('r', colour, '0', str(start), str(stop)))
688
677
 
689
678
    def add_data_line(self, colour, data_set, size, priority=0):
690
 
        self.markers.append(('D', colour, str(data_set), '0', str(size), \
691
 
            str(priority)))
 
679
        self.markers.append(('D', colour, str(data_set), '0', str(size), str(priority)))
692
680
 
693
 
    def add_marker_text(self, string, colour, data_set, data_point, size, \
694
 
            priority=0):
695
 
        self.markers.append((str(string), colour, str(data_set), \
696
 
            str(data_point), str(size), str(priority)))        
 
681
    def add_marker_text(self, string, colour, data_set, data_point, size, priority=0):
 
682
        self.markers.append((str(string), colour, str(data_set), str(data_point), str(size), str(priority)))        
697
683
 
698
684
    def add_vertical_range(self, colour, start, stop):
699
685
        self.markers.append(('R', colour, '0', str(start), str(stop)))
899
885
    def get_url_bits(self, data_class=None):
900
886
        url_bits = Chart.get_url_bits(self, data_class=data_class)
901
887
        if self.pie_labels:
902
 
            url_bits.append('chl=%s' % '%7c'.join(self.pie_labels))
 
888
            url_bits.append('chl=%s' % '|'.join(self.pie_labels))
903
889
        return url_bits
904
890
 
905
891
    def annotated_data(self):
908
894
        for dataset in self.data:
909
895
            yield ('x', dataset)
910
896
 
911
 
    def scaled_data(self, data_class, x_range=None, y_range=None):
912
 
        if not x_range:
913
 
            x_range = [0, sum(self.data[0])]
914
 
        return Chart.scaled_data(self, data_class, x_range, self.y_range)
915
 
 
916
897
 
917
898
class PieChart2D(PieChart):
918
899
 
1003
984
        if self.encoding:
1004
985
            url_bits.append('choe=%s' % self.encoding)
1005
986
        if self.ec_level:
1006
 
            url_bits.append('chld=%s%%7c%s' % (self.ec_level, self.margin))
 
987
            url_bits.append('chld=%s|%s' % (self.ec_level, self.margin))
1007
988
        return url_bits
1008
989
 
1009
990
    def set_encoding(self, encoding):