Commit b3eda9e69251b0096a1fbeeeb488615393736d15
- Date: Sun Mar 30 21:51:23 +0000 2008
- Committer: Aslak Hellesøy (aslak.hellesoy@gmail.com)
- Author: Aslak Hellesøy (aslak.hellesoy@gmail.com)
- Commit SHA1: b3eda9e69251b0096a1fbeeeb488615393736d15
- Tree SHA1: 1c298c300ecf9b79bb82c98fdb6aff09b587fd8d
- lib/kipling/renderer/timeline/ploticus.rb 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- lib/kipling/renderer/timeline/tabs.rb 26 ++++++++++++++++++++++++++
- lib/kipling/renderer/ascii_bar.rb 32 --------------------------------
- lib/kipling/renderer/ploticus.rb 71 -----------------------------------------------------------------------
- lib/kipling/renderer/timeline/ascii.rb 34 ++++++++++++++++++++++++++++++++++
- lib/kipling/renderer/tabs.rb 24 ------------------------
- lib/kipling/renderer/timeline.rb 3 +++
- lib/kipling/commands/timeline_command.rb 6 ---+++
- lib/kipling/renderer.rb 4 ---+
Commit diff
- Diff rendering mode:
- inline
- side by side
lib/kipling/commands/timeline_command.rb
|   | ||
| 22 | 22 | |
| 23 | 23 | def renderer |
| 24 | 24 | if out =~ /\.png/ |
| 25 | ||
| 25 | Renderer::Timeline::Ploticus.new(:day, out) | |
| 26 | 26 | else |
| 27 | 27 | { |
| 28 | 28 | 'tabs' => lambda do |
| 29 | ||
| 29 | Renderer::Timeline::Tabs.new | |
| 30 | 30 | end, |
| 31 | 31 | 'ascii' => lambda do |
| 32 | ||
| 32 | Renderer::Timeline::Ascii.new(:day, 333333) | |
| 33 | 33 | end |
| 34 | 34 | }[@renderer].call |
| 35 | 35 | end |
| toggle raw diff | ||
lib/kipling/renderer.rb
|   | ||
| 1 | ||
| 2 | ||
| 3 | ||
| 1 | require 'kipling/renderer/timeline' | |
| 4 | 2 | require 'kipling/renderer/snapshot' |
| 5 | 3 | |
| 6 | 4 | module Kipling |
| toggle raw diff | ||
lib/kipling/renderer/ascii_bar.rb
|   | ||
| 0 | ||
| 1 | ||
| 2 | ||
| 3 | ||
| 4 | ||
| 5 | ||
| 6 | ||
| 7 | ||
| 8 | ||
| 9 | ||
| 10 | ||
| 11 | ||
| 12 | ||
| 13 | ||
| 14 | ||
| 15 | ||
| 16 | ||
| 17 | ||
| 18 | ||
| 19 | ||
| 20 | ||
| 21 | ||
| 22 | ||
| 23 | ||
| 24 | ||
| 25 | ||
| 26 | ||
| 27 | ||
| 28 | ||
| 29 | ||
| 30 | ||
| 31 | ||
| toggle raw diff | ||
lib/kipling/renderer/ploticus.rb
|   | ||
| 0 | ||
| 1 | ||
| 2 | ||
| 3 | ||
| 4 | ||
| 5 | ||
| 6 | ||
| 7 | ||
| 8 | ||
| 9 | ||
| 10 | ||
| 11 | ||
| 12 | ||
| 13 | ||
| 14 | ||
| 15 | ||
| 16 | ||
| 17 | ||
| 18 | ||
| 19 | ||
| 20 | ||
| 21 | ||
| 22 | ||
| 23 | ||
| 24 | ||
| 25 | ||
| 26 | ||
| 27 | ||
| 28 | ||
| 29 | ||
| 30 | ||
| 31 | ||
| 32 | ||
| 33 | ||
| 34 | ||
| 35 | ||
| 36 | ||
| 37 | ||
| 38 | ||
| 39 | ||
| 40 | ||
| 41 | ||
| 42 | ||
| 43 | ||
| 44 | ||
| 45 | ||
| 46 | ||
| 47 | ||
| 48 | ||
| 49 | ||
| 50 | ||
| 51 | ||
| 52 | ||
| 53 | ||
| 54 | ||
| 55 | ||
| 56 | ||
| 57 | ||
| 58 | ||
| 59 | ||
| 60 | ||
| 61 | ||
| 62 | ||
| 63 | ||
| 64 | ||
| 65 | ||
| 66 | ||
| 67 | ||
| 68 | ||
| 69 | ||
| 70 | ||
| toggle raw diff | ||
lib/kipling/renderer/tabs.rb
|   | ||
| 0 | ||
| 1 | ||
| 2 | ||
| 3 | ||
| 4 | ||
| 5 | ||
| 6 | ||
| 7 | ||
| 8 | ||
| 9 | ||
| 10 | ||
| 11 | ||
| 12 | ||
| 13 | ||
| 14 | ||
| 15 | ||
| 16 | ||
| 17 | ||
| 18 | ||
| 19 | ||
| 20 | ||
| 21 | ||
| 22 | ||
| 23 | ||
| toggle raw diff | ||
lib/kipling/renderer/timeline.rb
|   | ||
| 1 | require 'kipling/renderer/timeline/ascii' | |
| 2 | require 'kipling/renderer/timeline/tabs' | |
| 3 | require 'kipling/renderer/timeline/ploticus' | |
| toggle raw diff | ||
lib/kipling/renderer/timeline/ascii.rb
|   | ||
| 1 | module Kipling | |
| 2 | module Renderer | |
| 3 | module Timeline | |
| 4 | # Original code from Neelakanth Nadgir, http://blogs.sun.com/realneel/entry/ascii_graphs_using_ruby | |
| 5 | class Ascii | |
| 6 | WIDTH = 72 | |
| 7 | HEIGHT = 16 | |
| 8 | ||
| 9 | def initialize(scale, out) | |
| 10 | end | |
| 11 | ||
| 12 | def render(data, names) | |
| 13 | raise "data must have exactly 2 columns. It was #{data[0].length}" unless data[0].length == 2 | |
| 14 | data = data.map{|a| a[1]} | |
| 15 | ||
| 16 | #Adjust X axis when there are more than WIDTH cols | |
| 17 | if data.length > WIDTH then | |
| 18 | old_values = data; | |
| 19 | data = [] | |
| 20 | 0.upto(WIDTH - 1){ |i| data << old_values[i*old_values.length/WIDTH]} | |
| 21 | end | |
| 22 | max = data.max | |
| 23 | # initialize display with blanks | |
| 24 | display = Array.new(HEIGHT).collect { Array.new(WIDTH, ' ') } | |
| 25 | data.each_with_index do |e, i| | |
| 26 | num= e*HEIGHT/max | |
| 27 | (HEIGHT - 1).downto(HEIGHT - 1 - num){|j| display[j][i] = '|'} | |
| 28 | end | |
| 29 | display.each{|ar| ar.each{|e| putc e}; puts "\n"} #now print | |
| 30 | end | |
| 31 | end | |
| 32 | end | |
| 33 | end | |
| 34 | end | |
| toggle raw diff | ||
lib/kipling/renderer/timeline/ploticus.rb
|   | ||
| 1 | require 'time' | |
| 2 | ||
| 3 | module Kipling | |
| 4 | module Renderer | |
| 5 | module Timeline | |
| 6 | class Ploticus | |
| 7 | # http://ploticus.sourceforge.net/doc/dates.html | |
| 8 | DATE_FORMATS = { | |
| 9 | :day => { | |
| 10 | :script_fmt => '%y/%m/%d', | |
| 11 | :datefmt => 'yy/mm/dd', | |
| 12 | :stubfmt => 'MMMdd', | |
| 13 | :xinc => '"1 day"', | |
| 14 | :mode => 'bars', | |
| 15 | :xyears => 'xyears=yyyy' | |
| 16 | }, | |
| 17 | :hour => { | |
| 18 | :script_fmt => '%y/%m/%d.%H:%M', | |
| 19 | :datefmt => 'yy/mm/dd', | |
| 20 | :stubfmt => 'hh:mm', | |
| 21 | :xinc => '"4 hours"', | |
| 22 | :mode => 'line', | |
| 23 | :xyears => nil | |
| 24 | } | |
| 25 | } | |
| 26 | ||
| 27 | def initialize(scale, out) | |
| 28 | @p = DATE_FORMATS[scale] | |
| 29 | raise "BAD SCALE: #{scale}" if @p.nil? | |
| 30 | @out = out | |
| 31 | end | |
| 32 | ||
| 33 | def render(points, grouping_values) | |
| 34 | script = Tabs.new(@p[:script_fmt]).text(points, grouping_values) | |
| 35 | ||
| 36 | # y=dev y2=done | |
| 37 | n = 0 | |
| 38 | ys = grouping_values.map do |grouping_value| | |
| 39 | n += 1 | |
| 40 | y = (n==1) ? '' : n | |
| 41 | "y#{y}=#{grouping_value}" | |
| 42 | end.join(' ') | |
| 43 | ||
| 44 | # http://ploticus.sourceforge.net/doc/prefab_chron_ex.html | |
| 45 | cmd = <<-EOF | |
| 46 | ploticus -png | |
| 47 | -o #{@out} | |
| 48 | -prefab chron | |
| 49 | header=yes | |
| 50 | x=dt | |
| 51 | #{ys} | |
| 52 | unittype=datetime | |
| 53 | mode=#{@p[:mode]} | |
| 54 | datefmt=#{@p[:datefmt]} | |
| 55 | xinc=#{@p[:xinc]} | |
| 56 | stubfmt=#{@p[:stubfmt]} | |
| 57 | #{@p[:xyears]} | |
| 58 | title=\"Iteration Burndown\" | |
| 59 | barwidth=0.2 | |
| 60 | color=powderblue | |
| 61 | omitweekends=no | |
| 62 | data=stdin | |
| 63 | legendfmt=singleline | |
| 64 | EOF | |
| 65 | cmd = cmd.split(/\n/).join(' ') | |
| 66 | IO.popen(cmd, "w") do |io| | |
| 67 | io << script | |
| 68 | end | |
| 69 | end | |
| 70 | end | |
| 71 | end | |
| 72 | end | |
| 73 | end | |
| toggle raw diff | ||
lib/kipling/renderer/timeline/tabs.rb
|   | ||
| 1 | require 'time' | |
| 2 | ||
| 3 | module Kipling | |
| 4 | module Renderer | |
| 5 | module Timeline | |
| 6 | # Renders a timeline as a tab-delimited file | |
| 7 | class Tabs | |
| 8 | def initialize(time_format = '%y/%m/%d') | |
| 9 | @time_format = time_format | |
| 10 | end | |
| 11 | ||
| 12 | def render(points, grouping_values) | |
| 13 | puts text(points, grouping_values) | |
| 14 | end | |
| 15 | ||
| 16 | def text(points, grouping_values) | |
| 17 | script = "dt #{grouping_values.join(' ')}\n" + points.map do |point| | |
| 18 | point = point.dup | |
| 19 | point[0] = point[0].strftime(@time_format) | |
| 20 | point.join(" ") | |
| 21 | end.join("\n") | |
| 22 | end | |
| 23 | end | |
| 24 | end | |
| 25 | end | |
| 26 | end | |
| toggle raw diff | ||
