From e29d388b68dde3db05a83a4275921728d0a162d1 Mon Sep 17 00:00:00 2001 From: Tomasz Gieniusz Date: Tue, 9 Oct 2012 09:39:39 +0200 Subject: [PATCH] refactor --- lib/git_stats.rb | 12 ++++--- lib/git_stats/cli.rb | 1 - lib/git_stats/generator.rb | 10 ++---- lib/git_stats/git_data/git_data.rb | 36 +++----------------- lib/git_stats/template/assets.rb | 5 --- lib/git_stats/{template => view}/template.rb | 6 ++-- lib/git_stats/view/view.rb | 13 +++++++ lib/git_stats/view/view_data.rb | 33 ++++++++++++++++++ templates/index.haml | 6 ++-- 9 files changed, 65 insertions(+), 57 deletions(-) delete mode 100644 lib/git_stats/template/assets.rb rename lib/git_stats/{template => view}/template.rb (65%) create mode 100644 lib/git_stats/view/view.rb create mode 100644 lib/git_stats/view/view_data.rb diff --git a/lib/git_stats.rb b/lib/git_stats.rb index 165663c0a..93260f1ee 100644 --- a/lib/git_stats.rb +++ b/lib/git_stats.rb @@ -1,7 +1,11 @@ +module GitStats +end + require 'active_support/all' require 'action_pack' require 'action_view' -require 'git_stats/generator' - -module GitStats -end +require 'pathname' +require 'tilt' +require 'lazy_high_charts' +require 'launchy' +Dir['lib/**/*.rb'].each { |r| require File.expand_path(r) } \ No newline at end of file diff --git a/lib/git_stats/cli.rb b/lib/git_stats/cli.rb index dabe22b07..182fe07f4 100644 --- a/lib/git_stats/cli.rb +++ b/lib/git_stats/cli.rb @@ -1,5 +1,4 @@ require "git_stats" -require "launchy" class GitStats::CLI diff --git a/lib/git_stats/generator.rb b/lib/git_stats/generator.rb index 74a709957..f79474897 100644 --- a/lib/git_stats/generator.rb +++ b/lib/git_stats/generator.rb @@ -1,7 +1,3 @@ -require 'git_stats/git_data/git_data' -require 'git_stats/template/assets' -require 'git_stats/template/template' - class GitStats::Generator def initialize(repo_path, out_path) @repo_path, @out_path = repo_path, out_path @@ -9,9 +5,7 @@ class GitStats::Generator def generate data = GitStats::GitData.new(@repo_path) - data.gather_all_data - GitStats::Assets.prepare(@out_path) - output = GitStats::Template.new('index').render(data) - File.open("#@out_path/index.html", 'w') { |f| f.write output } + view_data = GitStats::ViewData.new(data) + GitStats::View.render_all(view_data, @out_path) end end diff --git a/lib/git_stats/git_data/git_data.rb b/lib/git_stats/git_data/git_data.rb index 5b241c710..b764a8c57 100644 --- a/lib/git_stats/git_data/git_data.rb +++ b/lib/git_stats/git_data/git_data.rb @@ -1,27 +1,19 @@ -require 'pathname' -require 'git_stats/git_data/git_activity' -require 'git_stats/git_data/git_author' -require 'git_stats/git_data/git_commit' -require 'lazy_high_charts' - class GitStats::GitData - include ActionView::Helpers::TagHelper - include LazyHighCharts::LayoutHelper - attr_reader :total_authors attr_reader :total_commits def initialize(repo_path) @repo_path = repo_path + gather_all end - def gather_all_data + def gather_all @total_authors = run('git shortlog -s HEAD | wc -l') - gather_commit_data + gather_commits end - def gather_commit_data + def gather_commits run('git rev-list --pretty=format:"%h|%at|%ai|%aN|%aE" HEAD | grep -v commit').split(/\r?\n/).each do |commit| hash, stamp, date, author_name, author_email = commit.split('|') @@ -39,26 +31,6 @@ class GitStats::GitData author.activity.by_wday[date.wday] += 1 author.activity.by_wday_hour[date.wday][date.hour] += 1 end - - @h = LazyHighCharts::HighChart.new('graph') do |f| - f.chart(type: "column") - f.title(text: "Commits") - f.xAxis(categories: Date::ABBR_DAYNAMES) - f.yAxis(min: 0, title: {text: 'Commits'}) - f.legend( - layout: 'vertical', - backgroundColor: '#FFFFFF', - align: 'left', - verticalAlign: 'top', - x: 100, - y: 70, - floating: true, - shadow: true - ) - authors.each do |email, author| - f.series(:name => email, :data => author.activity.by_wday.inject([]) { |acc, (k, v)| acc[k] = v; acc }) - end - end end def authors diff --git a/lib/git_stats/template/assets.rb b/lib/git_stats/template/assets.rb deleted file mode 100644 index 907aa1356..000000000 --- a/lib/git_stats/template/assets.rb +++ /dev/null @@ -1,5 +0,0 @@ -class GitStats::Assets - def self.prepare(out_path) - FileUtils.cp_r('templates/assets', out_path) - end -end \ No newline at end of file diff --git a/lib/git_stats/template/template.rb b/lib/git_stats/view/template.rb similarity index 65% rename from lib/git_stats/template/template.rb rename to lib/git_stats/view/template.rb index 8ecd1b9c1..3c6c9592a 100644 --- a/lib/git_stats/template/template.rb +++ b/lib/git_stats/view/template.rb @@ -1,9 +1,7 @@ -require 'tilt' - class GitStats::Template - def initialize(name) + def initialize(name, layout) @name = name - @layout = Tilt.new("templates/layout.haml") + @layout = layout @template = Tilt.new("templates/#@name.haml") end diff --git a/lib/git_stats/view/view.rb b/lib/git_stats/view/view.rb new file mode 100644 index 000000000..34896003f --- /dev/null +++ b/lib/git_stats/view/view.rb @@ -0,0 +1,13 @@ +class GitStats::View + def self.render_all(data, out_path) + prepare_assets(out_path) + + layout = Tilt.new("templates/layout.haml") + output = GitStats::Template.new('index', layout).render(data) + File.open("#{out_path}/index.html", 'w') { |f| f.write output } + end + + def self.prepare_assets(out_path) + FileUtils.cp_r('templates/assets', out_path) + end +end \ No newline at end of file diff --git a/lib/git_stats/view/view_data.rb b/lib/git_stats/view/view_data.rb new file mode 100644 index 000000000..8cedf3940 --- /dev/null +++ b/lib/git_stats/view/view_data.rb @@ -0,0 +1,33 @@ +class GitStats::ViewData + include ActionView::Helpers::TagHelper + include LazyHighCharts::LayoutHelper + + attr_accessor :git_data + + def initialize(git_data) + self.git_data = git_data + generate_charts + end + + def generate_charts + @h = LazyHighCharts::HighChart.new('graph') do |f| + f.chart(type: "column") + f.title(text: "Commits") + f.xAxis(categories: Date::ABBR_DAYNAMES) + f.yAxis(min: 0, title: {text: 'Commits'}) + f.legend( + layout: 'vertical', + backgroundColor: '#FFFFFF', + align: 'left', + verticalAlign: 'top', + x: 100, + y: 70, + floating: true, + shadow: true + ) + git_data.authors.each do |email, author| + f.series(:name => email, :data => author.activity.by_wday.inject([]) { |acc, (k, v)| acc[k] = v; acc }) + end + end + end +end \ No newline at end of file diff --git a/templates/index.haml b/templates/index.haml index b005755ca..7bd5a8358 100644 --- a/templates/index.haml +++ b/templates/index.haml @@ -1,5 +1,5 @@ -%p= total_authors -%p= project_version -%p= project_name +%p= git_data.total_authors +%p= git_data.project_version +%p= git_data.project_name = high_chart("my_id", @h) \ No newline at end of file