gem_velocity 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|