gem_velocity 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/TODO +11 -0
- data/lib/gem_velocity/velocitators/all.rb +3 -0
- data/lib/gem_velocity/velocitators/base_velocitator.rb +113 -0
- data/lib/gem_velocity/velocitators/multiple_velocitator.rb +39 -0
- data/lib/gem_velocity/velocitators/single_velocitator.rb +34 -0
- data/lib/gem_velocity/version.rb +1 -1
- data/lib/gem_velocity.rb +1 -1
- data/spec/gruff_builder_spec.rb +1 -1
- data/spec/velocitator_spec.rb +104 -109
- metadata +8 -5
- data/lib/gem_velocity/velocitator.rb +0 -154
data/TODO
CHANGED
@@ -16,3 +16,14 @@ I want to be able to have a line be one version, or a few versions in one, mix t
|
|
16
16
|
line_datas needs to be abstracted away. actually the versions concepts should be eliminated??
|
17
17
|
so I need to have something abstract a version but it could be a few of them...
|
18
18
|
move all the logic of changing version -> line_data into something and have that able to handle 1 or n.
|
19
|
+
|
20
|
+
the only thing that it implmeents is .graph() which returns the line_data result/info whatever.
|
21
|
+
then there's something in the middle that takes that and calls out to gruff builder.
|
22
|
+
|
23
|
+
|
24
|
+
all derived classes need to pass back to base class, so we can pass on to builder:
|
25
|
+
|
26
|
+
line_data => title,version(s)
|
27
|
+
n times whatever.
|
28
|
+
|
29
|
+
Add a Version?
|
@@ -0,0 +1,113 @@
|
|
1
|
+
begin
|
2
|
+
require 'active_support/all'
|
3
|
+
rescue
|
4
|
+
'you need activesupport. please install'
|
5
|
+
end
|
6
|
+
|
7
|
+
class BaseVelocitator
|
8
|
+
|
9
|
+
include ::Helpers
|
10
|
+
|
11
|
+
attr_accessor :gem_name, :versions
|
12
|
+
|
13
|
+
def graph(root_arg = nil, range = nil, min = nil, max = nil)
|
14
|
+
set_overwritable_attrs(root_arg,range,min,max)
|
15
|
+
gruff_builder.write
|
16
|
+
end
|
17
|
+
|
18
|
+
# modifiers on the end result image being rendered.
|
19
|
+
attr_reader :date_range, :max_value, :min_value, :root
|
20
|
+
def date_range=(args); @date_range = args && args.map{|t| time_format_str(t) } ;end
|
21
|
+
def max_value=(max); @max_value = max ;end
|
22
|
+
def min_value=(min); @min_value = min ;end
|
23
|
+
def root=(path); @root = path ;end
|
24
|
+
|
25
|
+
def effective_date_range
|
26
|
+
@date_range || [ default_start, default_end ]
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def initialize(gem_name, versions)
|
32
|
+
@gem_name = gem_name || raise(ArgumentError, 'need a name')
|
33
|
+
@versions = versions || raise(ArgumentError, 'required versions')
|
34
|
+
validate_correct_gem
|
35
|
+
validate_correct_versions
|
36
|
+
end
|
37
|
+
|
38
|
+
def validate_correct_versions
|
39
|
+
versions.each do |v|
|
40
|
+
gem_data.versions.include?(v) || raise(NoSuchVersion,"version not found for #{versions}.")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def validate_correct_gem
|
45
|
+
# this will bomb out if bad version is passed.
|
46
|
+
gem_data.versions_metadata
|
47
|
+
end
|
48
|
+
|
49
|
+
# if it's nil, the defaults will be used
|
50
|
+
# basically these are the graph boundries
|
51
|
+
def set_overwritable_attrs(root_arg,range,min,max)
|
52
|
+
self.date_range = range
|
53
|
+
self.root = root_arg
|
54
|
+
self.max_value = max
|
55
|
+
self.min_value = min
|
56
|
+
end
|
57
|
+
|
58
|
+
def default_end
|
59
|
+
default_end = time_format_str(Time.now)
|
60
|
+
end
|
61
|
+
|
62
|
+
def default_min_value
|
63
|
+
0
|
64
|
+
end
|
65
|
+
|
66
|
+
def default_line_datas
|
67
|
+
# refactor me?
|
68
|
+
versions.map do |v|
|
69
|
+
specific_days_in_range.map do |day_in_range|
|
70
|
+
day_in_range = time_format_str_small(day_in_range) #conform to rubygems api format
|
71
|
+
if gem_data.downloads_day(v).map {|day,total| day}.include?(day_in_range)
|
72
|
+
# get the total for that day
|
73
|
+
total = Hash[gem_data.downloads_day(v)][day_in_range]
|
74
|
+
else
|
75
|
+
0
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# a little sugar
|
82
|
+
def effective_start_time; effective_date_range.first ;end
|
83
|
+
def effective_end_time; effective_date_range.last ;end
|
84
|
+
|
85
|
+
# helper method to convert [start,end] into a
|
86
|
+
# start..end range of day instances
|
87
|
+
def specific_days_in_range
|
88
|
+
all_days = []
|
89
|
+
s = Date.parse(effective_start_time)
|
90
|
+
e = Date.parse(effective_end_time)
|
91
|
+
i = s
|
92
|
+
while (i <= e )
|
93
|
+
all_days << i
|
94
|
+
i += 1.day
|
95
|
+
end
|
96
|
+
all_days
|
97
|
+
end
|
98
|
+
|
99
|
+
def gem_data
|
100
|
+
# need this memoized so the gem_data memoization works for the same instance
|
101
|
+
@gem_data ||= GemData.new(@gem_name)
|
102
|
+
end
|
103
|
+
|
104
|
+
def gruff_builder
|
105
|
+
GruffBuilder.new(@root || Dir.pwd,nil,versions,gem_name,graph_options)
|
106
|
+
end
|
107
|
+
|
108
|
+
# it's just shorter syntax
|
109
|
+
def time_built(version)
|
110
|
+
gem_data.versions_built_at[version]
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
class MultipleVelocitator < BaseVelocitator
|
2
|
+
|
3
|
+
def initialize(gem_name, versions)
|
4
|
+
super(gem_name, versions)
|
5
|
+
end
|
6
|
+
|
7
|
+
def default_start
|
8
|
+
earliest_start = versions.map{|v| Date.parse(time_built(v)) }.min
|
9
|
+
default_start = time_format_str(earliest_start)
|
10
|
+
end
|
11
|
+
|
12
|
+
def default_max_value
|
13
|
+
totals = []
|
14
|
+
versions.each {|v|
|
15
|
+
totals << gem_data.downloads_day(v).map {|day,total| total}
|
16
|
+
}
|
17
|
+
totals.flatten.compact.max
|
18
|
+
end
|
19
|
+
|
20
|
+
def graph_options
|
21
|
+
opts = {
|
22
|
+
:title => title,
|
23
|
+
:labels => ({1 => time_format_str_small(effective_start_time), (line_datas.first.size-2) => time_format_str_small(effective_end_time) }),
|
24
|
+
:max_value => max_value || default_max_value,
|
25
|
+
:min_value => min_value || default_min_value,
|
26
|
+
:line_datas => line_datas
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
def line_datas
|
31
|
+
default_line_datas
|
32
|
+
end
|
33
|
+
|
34
|
+
def title
|
35
|
+
"MutlipleVelocitator:#{gem_name}"
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
class SingleVelocitator < BaseVelocitator
|
2
|
+
|
3
|
+
def initialize(gem_name, version)
|
4
|
+
@version = version
|
5
|
+
super(gem_name, [version])
|
6
|
+
end
|
7
|
+
|
8
|
+
def default_start
|
9
|
+
time_format_str(Date.parse(time_built(@version)))
|
10
|
+
end
|
11
|
+
|
12
|
+
def default_max_value
|
13
|
+
gem_data.downloads_day(@version).map {|day,total| total}.max
|
14
|
+
end
|
15
|
+
|
16
|
+
def graph_options
|
17
|
+
opts = {
|
18
|
+
:title => title,
|
19
|
+
:labels => ({1 => time_format_str_small(effective_start_time), (line_datas.first.size-2) => time_format_str_small(effective_end_time) }),
|
20
|
+
:max_value => max_value || default_max_value,
|
21
|
+
:min_value => min_value || default_min_value,
|
22
|
+
:line_datas => line_datas
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
def line_datas
|
27
|
+
default_line_datas
|
28
|
+
end
|
29
|
+
|
30
|
+
def title
|
31
|
+
"SingleVelocitator:#{gem_name}"
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
data/lib/gem_velocity/version.rb
CHANGED
data/lib/gem_velocity.rb
CHANGED
@@ -2,7 +2,7 @@ require "gem_velocity/version"
|
|
2
2
|
require "gem_velocity/helpers"
|
3
3
|
require "gem_velocity/gem_data"
|
4
4
|
require "gem_velocity/gruff_builder"
|
5
|
-
require "gem_velocity/
|
5
|
+
require "gem_velocity/velocitators/all"
|
6
6
|
require "gem_velocity/errors"
|
7
7
|
|
8
8
|
require 'active_support/all'
|
data/spec/gruff_builder_spec.rb
CHANGED
@@ -30,7 +30,7 @@ describe GruffBuilder do
|
|
30
30
|
|
31
31
|
it "can not write a file if there is no line data" do
|
32
32
|
builder = GruffBuilder.new(@tmp_dir,nil,["0.0.17"],"foo-baz", {})
|
33
|
-
lambda { builder.write }.should raise_error
|
33
|
+
lambda { builder.write }.should raise_error NoData
|
34
34
|
end
|
35
35
|
|
36
36
|
it "can write out a file" do
|
data/spec/velocitator_spec.rb
CHANGED
@@ -1,124 +1,119 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe
|
3
|
+
describe SingleVelocitator do
|
4
4
|
|
5
5
|
it 'raises if you dont pass name and version(s)' do
|
6
|
-
lambda {
|
6
|
+
lambda { SingleVelocitator.new(nil,nil) }.should raise_error ArgumentError
|
7
7
|
end
|
8
8
|
|
9
9
|
it 'raises if the gem is not found' do
|
10
|
-
lambda {
|
10
|
+
lambda { SingleVelocitator.new("NOSICHGEMPlZ123","0.1") }.should raise_error NoSuchGem
|
11
11
|
end
|
12
12
|
|
13
13
|
it 'raises if the version is not found' do
|
14
|
-
|
15
|
-
lambda { Velocitator.new("haml-i18n-extractor","100.999.42.666.pre") }.should raise_error NoSuchVersion
|
16
|
-
end
|
17
|
-
|
18
|
-
describe "a specific version" do
|
19
|
-
|
20
|
-
it "sets a specific date range according to the gem's info" do
|
21
|
-
velocitator = Velocitator.new("haml-i18n-extractor", "0.0.17")
|
22
|
-
velocitator.effective_date_range.should eq ["2013-06-16T00:00:00Z", "2013-09-20T00:00:00Z"]
|
23
|
-
end
|
24
|
-
|
25
|
-
it "can override the default time ranges if its in the range" do
|
26
|
-
velocitator = Velocitator.new("haml-i18n-extractor", "0.0.17")
|
27
|
-
velocitator.date_range = [1.day.ago, Time.now]
|
28
|
-
velocitator.effective_date_range.should eq ["2013-09-19T00:00:00Z", "2013-09-20T00:00:00Z"]
|
29
|
-
velocitator.line_datas.size.should eq (velocitator.versions.size)
|
30
|
-
end
|
31
|
-
|
32
|
-
it "can set a max and min" do
|
33
|
-
velocitator = Velocitator.new("haml-i18n-extractor", "0.0.17")
|
34
|
-
lambda {
|
35
|
-
velocitator.max_value = 500
|
36
|
-
velocitator.min_value = 10
|
37
|
-
}.should_not raise_error
|
38
|
-
end
|
39
|
-
|
40
|
-
it "can render a graph" do
|
41
|
-
velocitator = Velocitator.new("haml-i18n-extractor", "0.0.17")
|
42
|
-
velocitator.date_range = [1.day.ago, Time.now]
|
43
|
-
velocitator.root = SpecHelper.tmpdir
|
44
|
-
builder = velocitator.gruff_builder
|
45
|
-
|
46
|
-
# FIXME
|
47
|
-
# also, pending on issue relating to
|
48
|
-
# https://github.com/shaiguitar/rubygems.org/compare/api_not_returning_all_results_over_90_days?expand=1
|
49
|
-
builder.line_datas.should == [[343, 344]]
|
50
|
-
builder.title.should == "haml-i18n-extractor-0.0.17"
|
51
|
-
builder.labels.should == ({1=>"2013-09-19", (builder.line_datas.first.size-2) =>"2013-09-20"})
|
52
|
-
builder.max_value.should == 344
|
53
|
-
builder.min_value.should == 0
|
54
|
-
|
55
|
-
file = builder.write
|
56
|
-
File.exist?(file).should be_true
|
57
|
-
#`open #{file} -a preview.app`
|
58
|
-
#Kernel.sleep(10)
|
59
|
-
end
|
60
|
-
|
61
|
-
it "has a shortcut graph method #1" do
|
62
|
-
velocitator = Velocitator.new("haml-i18n-extractor", "0.0.17")
|
63
|
-
file = velocitator.graph(SpecHelper.tmpdir,[1.day.ago, Time.now])
|
64
|
-
File.exist?(file).should be_true
|
65
|
-
end
|
66
|
-
|
67
|
-
it "has a shortcut graph method #2" do
|
68
|
-
velocitator = Velocitator.new("haml-i18n-extractor", "0.0.17")
|
69
|
-
file = velocitator.graph
|
70
|
-
File.exist?(file).should be_true
|
71
|
-
end
|
72
|
-
|
73
|
-
it "has a shortcut graph metho #3" do
|
74
|
-
velocitator = Velocitator.new("haml-i18n-extractor", "0.0.17")
|
75
|
-
file = velocitator.graph(nil,nil,0,1000)
|
76
|
-
File.exist?(file).should be_true
|
77
|
-
end
|
78
|
-
|
79
|
-
end
|
80
|
-
|
81
|
-
describe "Multiple versions" do
|
82
|
-
before do
|
83
|
-
@some_versions = ["0.0.17", "0.0.5","0.0.10"]
|
84
|
-
end
|
85
|
-
|
86
|
-
it "can initialize multiple versions" do
|
87
|
-
velocitator = Velocitator.new("haml-i18n-extractor", @some_versions)
|
88
|
-
velocitator.versions.should == @some_versions
|
89
|
-
end
|
90
|
-
|
91
|
-
it "sets the earliest start range from to all of the versions info" do
|
92
|
-
# some_versions.map{|v| GemData.new("haml-i18n-extractor").versions_built_at[v]}
|
93
|
-
# => ["2013-06-16T00:00:00Z", "2013-03-22T00:00:00Z", "2013-05-06T00:00:00Z"]
|
94
|
-
velocitator = Velocitator.new("haml-i18n-extractor", @some_versions)
|
95
|
-
velocitator.effective_date_range.should eq ["2013-03-22T00:00:00Z", "2013-09-20T00:00:00Z"]
|
96
|
-
end
|
97
|
-
|
98
|
-
it "sets the max value to the max of all of versions" do
|
99
|
-
velocitator = Velocitator.new("haml-i18n-extractor", @some_versions)
|
100
|
-
velocitator.default_max_value.should eq 344
|
101
|
-
end
|
102
|
-
|
103
|
-
it "sets the max value to the max of all of versions" do
|
104
|
-
velocitator = Velocitator.new("haml-i18n-extractor", @some_versions)
|
105
|
-
velocitator.default_max_value.should eq 344
|
106
|
-
end
|
107
|
-
|
108
|
-
it "should set the line data to an array of versions.size with equal length which should be the max value of any one of them" do
|
109
|
-
velocitator = Velocitator.new("haml-i18n-extractor", @some_versions)
|
110
|
-
velocitator.line_datas.size.should == @some_versions.size
|
111
|
-
# all of them should be the same size, padded with 0's if there is no download info
|
112
|
-
velocitator.line_datas.map{|d| d.size }.uniq.size.should == 1
|
113
|
-
end
|
114
|
-
|
115
|
-
it "has a shortcut graph method" do
|
116
|
-
velocitator = Velocitator.new("haml-i18n-extractor", @some_versions)
|
117
|
-
file = velocitator.graph
|
118
|
-
File.exist?(file).should be_true
|
119
|
-
end
|
14
|
+
lambda { SingleVelocitator.new("haml-i18n-extractor","100.999.42.666.pre") }.should raise_error NoSuchVersion
|
120
15
|
end
|
121
16
|
|
17
|
+
it "sets a specific date range according to the gem's info" do
|
18
|
+
velocitator = SingleVelocitator.new("haml-i18n-extractor", "0.0.17")
|
19
|
+
velocitator.effective_date_range.should eq ["2013-06-16T00:00:00Z", "2013-09-20T00:00:00Z"]
|
20
|
+
end
|
21
|
+
|
22
|
+
it "can override the default time ranges if its in the range" do
|
23
|
+
velocitator = SingleVelocitator.new("haml-i18n-extractor", "0.0.17")
|
24
|
+
velocitator.date_range = [1.day.ago, Time.now]
|
25
|
+
velocitator.effective_date_range.should eq ["2013-09-19T00:00:00Z", "2013-09-20T00:00:00Z"]
|
26
|
+
end
|
27
|
+
|
28
|
+
it "can override a max and min" do
|
29
|
+
velocitator = SingleVelocitator.new("haml-i18n-extractor", "0.0.17")
|
30
|
+
lambda {
|
31
|
+
velocitator.max_value = 500
|
32
|
+
velocitator.min_value = 10
|
33
|
+
}.should_not raise_error
|
34
|
+
end
|
35
|
+
|
36
|
+
it "has line datas" do
|
37
|
+
velocitator = SingleVelocitator.new("haml-i18n-extractor", "0.0.17")
|
38
|
+
velocitator.line_datas.size.should eq (velocitator.versions.size)
|
39
|
+
end
|
122
40
|
|
41
|
+
it "can render a graph" do
|
42
|
+
velocitator = SingleVelocitator.new("haml-i18n-extractor", "0.0.17")
|
43
|
+
velocitator.date_range = [1.day.ago, Time.now]
|
44
|
+
velocitator.root = SpecHelper.tmpdir
|
45
|
+
# FIX spec don't call out to gruff_builder, check the specific attrs in graph_options or such.
|
46
|
+
builder = velocitator.gruff_builder
|
47
|
+
# https://github.com/shaiguitar/rubygems.org/compare/api_not_returning_all_results_over_90_days?expand=1
|
48
|
+
builder.line_datas.should == [[343, 344]]
|
49
|
+
builder.title.should == "haml-i18n-extractor-0.0.17"
|
50
|
+
builder.labels.should == ({1=>"2013-09-19", (builder.line_datas.first.size-2) =>"2013-09-20"})
|
51
|
+
builder.max_value.should == 344
|
52
|
+
builder.min_value.should == 0
|
53
|
+
|
54
|
+
file = builder.write
|
55
|
+
File.exist?(file).should be_true
|
56
|
+
#`open #{file} -a preview.app`
|
57
|
+
#Kernel.sleep(10)
|
58
|
+
end
|
59
|
+
|
60
|
+
it "has a shortcut graph method #1" do
|
61
|
+
velocitator = SingleVelocitator.new("haml-i18n-extractor", "0.0.17")
|
62
|
+
file = velocitator.graph(SpecHelper.tmpdir,[1.day.ago, Time.now])
|
63
|
+
File.exist?(file).should be_true
|
64
|
+
end
|
65
|
+
|
66
|
+
it "has a shortcut graph method #2" do
|
67
|
+
velocitator = SingleVelocitator.new("haml-i18n-extractor", "0.0.17")
|
68
|
+
file = velocitator.graph
|
69
|
+
File.exist?(file).should be_true
|
70
|
+
end
|
71
|
+
|
72
|
+
it "has a shortcut graph metho #3" do
|
73
|
+
velocitator = SingleVelocitator.new("haml-i18n-extractor", "0.0.17")
|
74
|
+
file = velocitator.graph(nil,nil,0,1000)
|
75
|
+
File.exist?(file).should be_true
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe MultipleVelocitator do
|
80
|
+
before do
|
81
|
+
@some_versions = ["0.0.17", "0.0.5","0.0.10"]
|
82
|
+
end
|
83
|
+
|
84
|
+
it "can initialize multiple versions" do
|
85
|
+
velocitator = MultipleVelocitator.new("haml-i18n-extractor", @some_versions)
|
86
|
+
velocitator.versions.should == @some_versions
|
87
|
+
end
|
88
|
+
|
89
|
+
it "sets the earliest start range from to all of the versions info" do
|
90
|
+
# some_versions.map{|v| GemData.new("haml-i18n-extractor").versions_built_at[v]}
|
91
|
+
# => ["2013-06-16T00:00:00Z", "2013-03-22T00:00:00Z", "2013-05-06T00:00:00Z"]
|
92
|
+
velocitator = MultipleVelocitator.new("haml-i18n-extractor", @some_versions)
|
93
|
+
velocitator.effective_date_range.should eq ["2013-03-22T00:00:00Z", "2013-09-20T00:00:00Z"]
|
94
|
+
end
|
95
|
+
|
96
|
+
it "sets the max value to the max of all of versions" do
|
97
|
+
velocitator = MultipleVelocitator.new("haml-i18n-extractor", @some_versions)
|
98
|
+
velocitator.default_max_value.should eq 344
|
99
|
+
end
|
100
|
+
|
101
|
+
it "sets the max value to the max of all of versions" do
|
102
|
+
velocitator = MultipleVelocitator.new("haml-i18n-extractor", @some_versions)
|
103
|
+
velocitator.default_max_value.should eq 344
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should set the line data to an array of versions.size with equal length which should be the max value of any one of them" do
|
107
|
+
velocitator = MultipleVelocitator.new("haml-i18n-extractor", @some_versions)
|
108
|
+
velocitator.line_datas.size.should == @some_versions.size
|
109
|
+
# all of them should be the same size, padded with 0's if there is no download info
|
110
|
+
velocitator.line_datas.map{|d| d.size }.uniq.size.should == 1
|
111
|
+
end
|
112
|
+
|
113
|
+
it "has a shortcut graph method" do
|
114
|
+
velocitator = MultipleVelocitator.new("haml-i18n-extractor", @some_versions)
|
115
|
+
file = velocitator.graph
|
116
|
+
File.exist?(file).should be_true
|
117
|
+
end
|
123
118
|
end
|
124
119
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gem_velocity
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 21
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 5
|
10
|
+
version: 0.0.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Shai Rosenfeld
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2013-10-
|
18
|
+
date: 2013-10-12 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: gruff
|
@@ -211,7 +211,10 @@ files:
|
|
211
211
|
- lib/gem_velocity/gem_data.rb
|
212
212
|
- lib/gem_velocity/gruff_builder.rb
|
213
213
|
- lib/gem_velocity/helpers.rb
|
214
|
-
- lib/gem_velocity/
|
214
|
+
- lib/gem_velocity/velocitators/all.rb
|
215
|
+
- lib/gem_velocity/velocitators/base_velocitator.rb
|
216
|
+
- lib/gem_velocity/velocitators/multiple_velocitator.rb
|
217
|
+
- lib/gem_velocity/velocitators/single_velocitator.rb
|
215
218
|
- lib/gem_velocity/version.rb
|
216
219
|
- spec/gem_data_spec.rb
|
217
220
|
- spec/gruff_builder_spec.rb
|
@@ -1,154 +0,0 @@
|
|
1
|
-
begin
|
2
|
-
require 'active_support/all'
|
3
|
-
rescue
|
4
|
-
'you need activesupport. please install'
|
5
|
-
end
|
6
|
-
|
7
|
-
class Velocitator
|
8
|
-
|
9
|
-
include ::Helpers
|
10
|
-
|
11
|
-
attr_accessor :gem_name, :versions
|
12
|
-
|
13
|
-
# modifiers on the end result image being rendered.
|
14
|
-
attr_accessor :date_range, :max_value, :min_value, :root
|
15
|
-
|
16
|
-
def initialize(gem_name, versions)
|
17
|
-
@gem_name = gem_name || raise(ArgumentError, 'need a name')
|
18
|
-
@versions = if versions.is_a?(String)
|
19
|
-
[versions]
|
20
|
-
else
|
21
|
-
versions
|
22
|
-
end || raise(ArgumentError, 'required versions')
|
23
|
-
validate_correct_gem
|
24
|
-
validate_correct_versions
|
25
|
-
end
|
26
|
-
|
27
|
-
def date_range=(args)
|
28
|
-
return nil if args.nil?
|
29
|
-
unless args.is_a?(Array) && args.size == 2
|
30
|
-
raise(ArgumentError, "must pass a range with time objects like [start,end]")
|
31
|
-
end
|
32
|
-
@date_range = args.map{|t| time_format_str(t) }
|
33
|
-
end
|
34
|
-
|
35
|
-
def effective_date_range
|
36
|
-
# we allow overwriting by passing a date range.
|
37
|
-
if @date_range.is_a?(Array) && @date_range.compact.size==2
|
38
|
-
@date_range
|
39
|
-
else
|
40
|
-
default_date_range
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def title
|
45
|
-
"#{gem_name}-#{versions.join("-")}"
|
46
|
-
end
|
47
|
-
|
48
|
-
def line_datas
|
49
|
-
versions.map do |v|
|
50
|
-
specific_days_in_range.map do |day_in_range|
|
51
|
-
day_in_range = time_format_str_small(day_in_range) #conform to rubygems api format
|
52
|
-
if gem_data.downloads_day(v).map {|day,total| day}.include?(day_in_range)
|
53
|
-
total = Hash[gem_data.downloads_day(v)][day_in_range]
|
54
|
-
else
|
55
|
-
0
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
# after you set all the attributes you want.
|
62
|
-
# you can set (or there will be fallback defaults)
|
63
|
-
# max, min
|
64
|
-
# date_range (leave nil for default values in either start or end)
|
65
|
-
def gruff_builder
|
66
|
-
opts = {
|
67
|
-
:title => title,
|
68
|
-
# just the first and last dates. give a small offset so it fits into the pciture.
|
69
|
-
# line_datas.first.size -2 should be the max of any one of the line-datas, all should be same size.
|
70
|
-
:labels => ({1 => time_format_str_small(effective_start_time), (line_datas.first.size-2) => time_format_str_small(effective_end_time) }),
|
71
|
-
:max_value => max_value || default_max_value,
|
72
|
-
:min_value => min_value || default_min_value,
|
73
|
-
:line_datas => line_datas
|
74
|
-
}
|
75
|
-
builder = GruffBuilder.new(@root || Dir.pwd,nil,versions,gem_name,opts)
|
76
|
-
builder
|
77
|
-
end
|
78
|
-
|
79
|
-
def graph(root_arg = nil, range = nil, min = nil, max = nil)
|
80
|
-
# if nil, defaults will be used
|
81
|
-
self.date_range = range
|
82
|
-
self.root = root_arg
|
83
|
-
self.max_value = max
|
84
|
-
self.min_value = min
|
85
|
-
gruff_builder.write
|
86
|
-
end
|
87
|
-
|
88
|
-
def specific_days_in_range
|
89
|
-
all_days = []
|
90
|
-
s = Date.parse(effective_start_time)
|
91
|
-
e = Date.parse(effective_end_time)
|
92
|
-
i = s
|
93
|
-
while (i <= e )
|
94
|
-
all_days << i
|
95
|
-
i += 1.day
|
96
|
-
end
|
97
|
-
all_days
|
98
|
-
end
|
99
|
-
|
100
|
-
def default_min_value
|
101
|
-
0
|
102
|
-
end
|
103
|
-
|
104
|
-
def default_max_value
|
105
|
-
totals = []
|
106
|
-
versions.each {|v|
|
107
|
-
totals << gem_data.downloads_day(v).map {|day,total| total}
|
108
|
-
}
|
109
|
-
totals.flatten.compact.max
|
110
|
-
end
|
111
|
-
|
112
|
-
private
|
113
|
-
|
114
|
-
def effective_start_time
|
115
|
-
effective_date_range.first
|
116
|
-
end
|
117
|
-
|
118
|
-
def effective_end_time
|
119
|
-
effective_date_range.last
|
120
|
-
end
|
121
|
-
|
122
|
-
def default_date_range
|
123
|
-
range = default_start, default_end
|
124
|
-
end
|
125
|
-
|
126
|
-
def default_start
|
127
|
-
earliest_start = versions.map{|v| Date.parse(time_built(v)) }.min
|
128
|
-
default_start = time_format_str(earliest_start)
|
129
|
-
end
|
130
|
-
|
131
|
-
def default_end
|
132
|
-
default_end = time_format_str(Time.now)
|
133
|
-
end
|
134
|
-
|
135
|
-
def time_built(version)
|
136
|
-
gem_data.versions_built_at[version]
|
137
|
-
end
|
138
|
-
|
139
|
-
def gem_data
|
140
|
-
@gem_data ||= GemData.new(@gem_name)
|
141
|
-
end
|
142
|
-
|
143
|
-
def validate_correct_versions
|
144
|
-
versions.each do |v|
|
145
|
-
gem_data.versions.include?(v) || raise(NoSuchVersion,"version not found for #{versions}.")
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
|
-
def validate_correct_gem
|
150
|
-
# this will bomb out if bad version is passed.
|
151
|
-
gem_data.versions_metadata
|
152
|
-
end
|
153
|
-
|
154
|
-
end
|