buildhawk 0.1

Sign up to get free protection for your applications and to get access to all the features.
data/HISTORY ADDED
@@ -0,0 +1,2 @@
1
+ 0.1.0 - 18 September 2010
2
+ * First release! Supports basic build time graph, no error checking.
data/README.rdoc ADDED
@@ -0,0 +1,34 @@
1
+ = Buildhawk
2
+
3
+ Historical information about your build, on a webpage!
4
+ Currently only graphs time taken, as stored in git notes.
5
+
6
+ == Status
7
+
8
+ Pretty raw: hackish script, no error checking, no test suite. I am adding to it as I use on one of my projects. Only checked on ruby 1.9.2.
9
+
10
+ == Usage
11
+
12
+ gem install buildhawk
13
+
14
+ buildhawk --title "My App Name" # In your project directory, output HTML to stdout
15
+ buildhawk | browser # Using http://gist.github.com/318247
16
+
17
+ You need to store the build time in git notes. The following rake task should work for a standard ruby project with rvm. See http://rhnh.net/2010/09/06/storing-build-time-in-git-notes-with-zsh for more explanation.
18
+
19
+ namespace :build do
20
+ desc "Run specs and store the time taken in a git note on HEAD"
21
+ task :time do
22
+ # ruby/rake are not aliased by rvm in the new zsh environment, so
23
+ # have to explicitly call it using the rvm command stored in .rvmrc:
24
+ # rvm 1.9.2@myapp rake
25
+ #
26
+ # "2> >( )" construct redirects STDERR (where @time@ prints to) to the
27
+ # bracketed commands. ZSH allows us to redirect it twice, once to git,
28
+ # once to cat (back to STDOUT).
29
+ formatter = "tail -n 1 | cut -f 11 -d ' ' - "
30
+ exec((%{zsh -c "(time `cat .rvmrc` rake) } +
31
+ %{2> >(#{formatter} | git notes --ref=buildtime add -F - -f ) } +
32
+ %{2> >(#{formatter} | cat)"}))
33
+ end
34
+ end
data/bin/buildhawk ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'buildhawk.rb'))
data/lib/buildhawk.rb ADDED
@@ -0,0 +1,37 @@
1
+ require 'optparse'
2
+ require 'erubis'
3
+ require 'json'
4
+
5
+ options = {}
6
+ optparse = OptionParser.new do|opts|
7
+ # Set a banner, displayed at the top
8
+ # of the help screen.
9
+ opts.banner = "Usage: buildhawk [options]"
10
+
11
+ # Define the options, and what they do
12
+ options[:title] = nil
13
+ opts.on( '-t', '--title TITLE', 'Set the title of the app' ) do |title|
14
+ options[:title] = title
15
+ end
16
+
17
+ # This displays the help screen, all programs are
18
+ # assumed to have this option.
19
+ opts.on( '-h', '--help', 'Display this screen' ) do
20
+ puts opts
21
+ exit
22
+ end
23
+ end
24
+
25
+ optparse.parse!
26
+
27
+ data = `git log --pretty=format:"%h\t%s\t%N" --show-notes=buildtime | egrep "[0-9]$"`
28
+ data = data.lines.map {|x|
29
+ x.split("\t")
30
+ }.map {|x|
31
+ [x[2].chomp, {:ref => x[0], :subject => x[1..-2] * "\t"}]
32
+ }.reverse
33
+
34
+ input = File.read(File.dirname(__FILE__) + '/template.erb')
35
+ eruby = Erubis::Eruby.new(input)
36
+
37
+ puts eruby.result(:data => data, :title => options[:title] || "Untitled")
data/lib/template.erb ADDED
@@ -0,0 +1,91 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
5
+
6
+ <script type="text/javascript" src="http://github.com/xaviershay/tufte-graph/raw/line/raphael.js"></script>
7
+ <script type="text/javascript" src="http://github.com/xaviershay/tufte-graph/raw/line/raphael.path.methods.js"></script>
8
+ <script type="text/javascript" src="http://github.com/xaviershay/tufte-graph/raw/line/jquery.enumerable.js"></script>
9
+ <script type="text/javascript" src="http://github.com/xaviershay/tufte-graph/raw/line/jquery.tufte-graph.js"></script>
10
+ <link rel="stylesheet" href="http://github.com/xaviershay/tufte-graph/raw/line/tufte-graph.css" type="text/css" media="screen" charset="utf-8" />
11
+
12
+ <script>
13
+ var data = <%= data.to_json %>;
14
+
15
+ $(function () {
16
+ var hitTarget;
17
+
18
+ $('#build-time-graph').tufteGraph('line', {
19
+ colors: ['#333', '#0C0F66'],
20
+ data: data,
21
+ afterDraw: {
22
+ point: function(ctx, index, stackedIndex) {
23
+ if (!data[index][1].dots)
24
+ data[index][1].dots = [];
25
+
26
+ var coords = [ctx.scale.X(index + 0.5), ctx.scale.Y(data[index][0])]
27
+ data[index][1].dots.push(ctx.circle(coords[0], coords[1], 4).attr({
28
+ fill:['#333', '#0C0F66'][stackedIndex],
29
+ stroke: "#FFF"
30
+ }));
31
+ },
32
+ stack: function(ctx, index) {
33
+ (function(index) {
34
+ hitTarget = ctx.rect(ctx.scale.X(index), 0, ctx.scale.X(index + 1), ctx.axis.y.pixelLength).attr({
35
+ stroke: 'none',
36
+ fill: '#FFF',
37
+ opacity: 0
38
+ });
39
+ $(hitTarget.node).hover(function () {
40
+ // Highlight dots
41
+ $(data[index][1].dots).each(function() { this.attr({r: 5}); });
42
+
43
+ // Show label
44
+ var ref = data[index][1].ref;
45
+ $('#commits li:not(#' + ref + ')').animate({opacity: 0.3}, {duration: 500, queue: false});
46
+ $('#' + ref).animate({opacity: 1.0}, {duration: 500, queue: false});
47
+ }, function() {
48
+ // Unhighlight dots
49
+ $(data[index][1].dots).each(function() { this.attr({r: 4}); });
50
+ });
51
+ })(index);
52
+ },
53
+ graph: function(ctx) {
54
+ hitTarget.toFront();
55
+ }
56
+ }
57
+ });
58
+ });
59
+ </script>
60
+ <style>
61
+ body {
62
+ width: 500px;
63
+ margin: 0 auto;
64
+ font-family: Monofur, monospace;
65
+ text-align: center;
66
+ }
67
+ .ref { float: right }
68
+ .time { display: inline-block; }
69
+ ol { margin: 0;width: 500px;padding: 0; list-style: none }
70
+ ol li { text-align: left; opacity: 0.3; height: 1em; overflow: hidden;}
71
+ #commits { float: left; }
72
+ #build-time-graph { margin-top: -1.5em }
73
+ </style>
74
+ <title><%= title %> - BuildHawk</title>
75
+ </head>
76
+ <body>
77
+ <h1><%= title %> Build Time</h1>
78
+ <div id='build-time-graph' style=" width: 500px; height: 100px;"></div>
79
+ <div id='commits'>
80
+ <ol>
81
+ <% data.each do |time, data| %>
82
+ <li id='<%= data[:ref] %>'>
83
+ <span class='ref'><%= data[:ref] %></span>
84
+ <span class='time'><%= "%.1f" % time.to_f %></span>
85
+ <%= data[:subject] %>
86
+ </li>
87
+ <% end %>
88
+ </ol>
89
+ </div>
90
+ </body>
91
+ </html>
metadata ADDED
@@ -0,0 +1,93 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: buildhawk
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ version: "0.1"
9
+ platform: ruby
10
+ authors:
11
+ - Xavier Shay
12
+ autorequire:
13
+ bindir: bin
14
+ cert_chain: []
15
+
16
+ date: 2010-09-18 00:00:00 +01:00
17
+ default_executable:
18
+ dependencies:
19
+ - !ruby/object:Gem::Dependency
20
+ name: json
21
+ prerelease: false
22
+ requirement: &id001 !ruby/object:Gem::Requirement
23
+ none: false
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
29
+ version: "0"
30
+ type: :runtime
31
+ version_requirements: *id001
32
+ - !ruby/object:Gem::Dependency
33
+ name: erubis
34
+ prerelease: false
35
+ requirement: &id002 !ruby/object:Gem::Requirement
36
+ none: false
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ segments:
41
+ - 0
42
+ version: "0"
43
+ type: :runtime
44
+ version_requirements: *id002
45
+ description:
46
+ email:
47
+ - contact@rhnh.net
48
+ executables:
49
+ - buildhawk
50
+ extensions: []
51
+
52
+ extra_rdoc_files: []
53
+
54
+ files:
55
+ - bin/buildhawk
56
+ - lib/buildhawk.rb
57
+ - lib/template.erb
58
+ - README.rdoc
59
+ - HISTORY
60
+ has_rdoc: true
61
+ homepage: http://github.com/xaviershay/buildhawk
62
+ licenses: []
63
+
64
+ post_install_message:
65
+ rdoc_options: []
66
+
67
+ require_paths:
68
+ - lib
69
+ required_ruby_version: !ruby/object:Gem::Requirement
70
+ none: false
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ segments:
75
+ - 0
76
+ version: "0"
77
+ required_rubygems_version: !ruby/object:Gem::Requirement
78
+ none: false
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ segments:
83
+ - 0
84
+ version: "0"
85
+ requirements: []
86
+
87
+ rubyforge_project:
88
+ rubygems_version: 1.3.7
89
+ signing_key:
90
+ specification_version: 3
91
+ summary: Display historical stats about your build
92
+ test_files: []
93
+