gem_velocity 0.0.6 → 0.0.7

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/README.md CHANGED
@@ -4,6 +4,14 @@ A way to see gem velocity. Right now it's just aggregated totals.
4
4
 
5
5
  So, not a number of downloads each day, but rather just the general timeline of total downloads.
6
6
 
7
+ ## Note
8
+
9
+ The data is currently somewhat incorrect, due to inconstancies outlined in:
10
+
11
+ [https://gist.github.com/shaiguitar/d2af997b7f58e24fd305](https://gist.github.com/shaiguitar/d2af997b7f58e24fd305)
12
+
13
+ I'm investigating though with the help of the rubygems team as per [this](https://github.com/rubygems/rubygems.org/pull/606) and will hopefully have some progress soon.
14
+
7
15
  ## Requirements
8
16
 
9
17
  It draws graphs. So...you'll need imagemagick/rmagick. I'm sure you'll survive. Any problems with installation let me know and I'll try to help out.
@@ -15,7 +23,7 @@ Here's one: [celluloid](https://gist.github.com/shaiguitar/7e6d95971c5254fa3665)
15
23
  Here's some more:
16
24
 
17
25
  <pre>
18
- velocitator = Velocitator.new("rails", ["4.0.0","3.2.14","2.3.5"])
26
+ velocitator = MultipleVelocitator.new("rails", ["4.0.0","3.2.14","2.3.5"])
19
27
  file = velocitator.graph("/tmp")
20
28
  </pre>
21
29
 
@@ -26,7 +34,7 @@ Produces:
26
34
  Notice the date range:
27
35
 
28
36
  <pre>
29
- velocitator = Velocitator.new("rails", ["4.0.0","3.2.14","0.9.1"])
37
+ velocitator = MultipleVelocitator.new("rails", ["4.0.0","3.2.14","0.9.1"])
30
38
  file = velocitator.graph("/tmp", [3.months.ago, Time.now])
31
39
  </pre>
32
40
 
data/TODO CHANGED
@@ -1,29 +1,14 @@
1
- move VCR to an :around spec
2
- change readme.md to have one example with different options to populate
3
- Add an aggregate method to add #graph for a point version? (e.g, 0.n.x graph for all n versions. maybe just major, maybe minor, whatever).
4
-
5
- web ui/embeddable links with those images.
1
+ Web ui/embeddable links with those images.
6
2
  can't remove images
7
3
  have uniq name: hash the date_range,max,min,name,versions. (and time?)
8
4
  shard the directories of where the image goes so it doesn't bomb out?
9
5
 
10
- SingleVersionsVelocitator takes versions
11
- SingleVersionsVelocitator has a shortcut for displaying all versions in a major?
12
- MajorVersionsVelocitator takes one major version
13
- AllVersionsVelocitator takes no version, dispalys all stats
14
-
15
- I want to be able to have a line be one version, or a few versions in one, mix those/not, then decide to display them in the end
16
- line_datas needs to be abstracted away. actually the versions concepts should be eliminated??
17
- so I need to have something abstract a version but it could be a few of them...
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
-
6
+ Add a Version?
23
7
 
24
- all derived classes need to pass back to base class, so we can pass on to builder:
8
+ currently, the versions in the base class are single versions, but they are essentially used for representing a specific line
9
+ in default_line_datas.
10
+ (and then used for titles, abd bs).
25
11
 
26
- line_data => title,version(s)
27
- n times whatever.
12
+ if rubygems 606 isn't solved, why not just put a total on there and let the inconsistnecies just be with some notice?
28
13
 
29
- Add a Version?
14
+ rename time_format_str_small alias
@@ -1,8 +1,11 @@
1
1
  require 'gems'
2
2
 
3
3
  class GemData
4
- def initialize(name)
5
- @name = name
4
+
5
+ attr_reader :gem_name
6
+
7
+ def initialize(gem_name)
8
+ @gem_name = gem_name
6
9
  end
7
10
 
8
11
  def versions
@@ -15,28 +18,9 @@ class GemData
15
18
  h
16
19
  end
17
20
 
18
- # todo rename method? aggregated downloads per day
19
- def downloads_day(version, start_time = nil, end_time = Time.now)
20
- start_time = start_time || versions_built_at[version]
21
- total_so_far = 0
22
- found_first_download = false
23
- ret = downloads_metadata(version, start_time, end_time).map do |day,downloads_that_day|
24
- if found_first_download
25
- total_so_far += downloads_that_day
26
- [day, total_so_far]
27
- else
28
- if !downloads_that_day.zero?
29
- found_first_download = true
30
- total_so_far += downloads_that_day
31
- nil
32
- end
33
- end
34
- end.compact
35
- end
36
-
37
21
  def versions_metadata
38
22
  # cache api call.
39
- @versions_metadata ||= Gems.versions(@name)
23
+ @versions_metadata ||= Gems.versions(gem_name)
40
24
  # it should be a hash
41
25
  if @versions_metadata.is_a?(String)
42
26
  if @versions_metadata.match(/This rubygem could not be found/)
@@ -46,13 +30,19 @@ class GemData
46
30
  @versions_metadata
47
31
  end
48
32
 
49
- private
33
+ def total_for_version(version)
34
+ @total_for_version ||= {}
35
+ key = "#{version}"
36
+ return @total_for_version[key] if @total_for_version[key]
37
+ @total_for_version[key] ||= Gems.total_downloads(gem_name, version)
38
+ end
50
39
 
51
40
  def downloads_metadata(version, start_time, end_time)
52
41
  # cache api call.
53
42
  @downloads_metadata ||= {}
54
- return @downloads_metadata[version] if @downloads_metadata[version]
55
- @downloads_metadata[version] ||= Gems.downloads(@name, version, start_time, end_time).to_a
43
+ key = "#{version}-#{start_time}-#{end_time}"
44
+ return @downloads_metadata[key] if @downloads_metadata[key]
45
+ @downloads_metadata[key] ||= Gems.downloads(gem_name, version, start_time, end_time).to_a
56
46
  end
57
47
 
58
48
 
@@ -11,7 +11,7 @@ class GruffBuilder
11
11
  MAX_VALUE = 300
12
12
 
13
13
  attr_accessor :root, :relative_path, :versions, :gem_name
14
- attr_accessor :title, :labels, :line_datas, :min_value, :max_value
14
+ attr_accessor :title, :labels, :line_datas, :min_value, :max_value, :hide_legend
15
15
 
16
16
  def initialize(root, relative_path, versions, gem_name, gruff_options = {})
17
17
  @root = root || raise(ArgumentError,"you must set a root. default is root/public/images")
@@ -23,6 +23,7 @@ class GruffBuilder
23
23
  @line_datas = gruff_options[:line_datas]
24
24
  @min_value = gruff_options[:min_value] || MIN_VALUE
25
25
  @max_value = gruff_options[:max_value] || MAX_VALUE
26
+ @hide_legend = gruff_options[:hide_legend] || false
26
27
  end
27
28
 
28
29
  def relative_filename
@@ -47,6 +48,7 @@ class GruffBuilder
47
48
  end
48
49
  gruff.minimum_value = @min_value
49
50
  gruff.maximum_value = @max_value
51
+ gruff.hide_legend = @hide_legend
50
52
  gruff.write(absolute_filename)
51
53
  absolute_filename
52
54
  end
@@ -0,0 +1,48 @@
1
+ class AggregatedVelocitator < BaseVelocitator
2
+
3
+ attr_reader :aggregated_versions
4
+ def initialize(gem_name, top_level_ver)
5
+ @gem_name = gem_name
6
+ @top_level_ver = top_level_ver
7
+ @aggregated_versions = gem_data.versions.select{|v| v.match(/^#{Regexp.escape(top_level_ver)}/) }
8
+ super(gem_name, @aggregated_versions)
9
+ end
10
+
11
+ def default_start
12
+ base_earliest_time_for(@aggregated_versions)
13
+ end
14
+
15
+ def default_max_value
16
+ base_max_for(@aggregated_versions) * @aggregated_versions.size
17
+ end
18
+
19
+ def graph_options
20
+ opts = {
21
+ :title => title,
22
+ :labels => ({1 => time_format_str_small(effective_start_time), (line_datas.first.size-2) => time_format_str_small(effective_end_time) }),
23
+ :max_value => effective_max_value,
24
+ :min_value => effective_min_value,
25
+ :line_datas => line_datas,
26
+ :hide_legend => true
27
+ }
28
+ end
29
+
30
+ def line_datas
31
+ ret = Hash.new(0)
32
+ @aggregated_versions.each do |v|
33
+ effective_days_in_range.each do |d|
34
+ ret[d] += downloads_per_day(v)[d] || 0
35
+ end
36
+ end
37
+ [effective_days_in_range.map{|d| ret[d] }]
38
+ end
39
+
40
+ def title
41
+ "#{@gem_name}: #{@top_level_ver}X"
42
+ end
43
+
44
+ def totals
45
+ super.map {|x| x[:version_downloads]}.sum
46
+ end
47
+
48
+ end
@@ -1,3 +1,4 @@
1
1
  require "gem_velocity/velocitators/base_velocitator"
2
2
  require "gem_velocity/velocitators/single_velocitator"
3
3
  require "gem_velocity/velocitators/multiple_velocitator"
4
+ require "gem_velocity/velocitators/aggregated_velocitator"
@@ -15,15 +15,30 @@ class BaseVelocitator
15
15
  gruff_builder.write
16
16
  end
17
17
 
18
- # modifiers on the end result image being rendered.
18
+ # modifiers on the end result image being rendered. Essentially these are the boundries
19
+ # of the graph
19
20
  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
21
+ def date_range=(args); @passed_date_range = args && args.map{|t| time_format_str(t) } ;end
22
+ def max_value=(max); @passed_max_value = max ;end
23
+ def min_value=(min); @passed_min_value = min ;end
23
24
  def root=(path); @root = path ;end
24
25
 
25
26
  def effective_date_range
26
- @date_range || [ default_start, default_end ]
27
+ @passed_date_range || default_date_range
28
+ end
29
+
30
+ def effective_max_value
31
+ @passed_max_value || default_max_value
32
+ end
33
+
34
+ def effective_min_value
35
+ @passed_min_value || default_min_value
36
+ end
37
+
38
+ def totals
39
+ versions.map do |v|
40
+ gem_data.total_for_version(v)
41
+ end
27
42
  end
28
43
 
29
44
  private
@@ -46,8 +61,6 @@ class BaseVelocitator
46
61
  gem_data.versions_metadata
47
62
  end
48
63
 
49
- # if it's nil, the defaults will be used
50
- # basically these are the graph boundries
51
64
  def set_overwritable_attrs(root_arg,range,min,max)
52
65
  self.date_range = range
53
66
  self.root = root_arg
@@ -59,32 +72,60 @@ class BaseVelocitator
59
72
  default_end = time_format_str(Time.now)
60
73
  end
61
74
 
75
+ def default_date_range
76
+ [ default_start, default_end ]
77
+ end
78
+
62
79
  def default_min_value
63
80
  0
64
81
  end
65
82
 
66
83
  def default_line_datas
67
- # refactor me?
68
84
  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
85
+ effective_days_in_range.map do |d|
86
+ downloads_per_day(v)[d] || 0
77
87
  end
78
88
  end
79
89
  end
80
90
 
91
+ def base_earliest_time_for(verzionz)
92
+ earliest_start = verzionz.map{|v| Date.parse(time_built(v)) }.min
93
+ default_start = time_format_str(earliest_start)
94
+ end
95
+
96
+ def base_max_for(verzionz)
97
+ totals = []
98
+ verzionz.each {|v|
99
+ totals << downloads_per_day(v).map {|day,total| total}
100
+ }
101
+ totals.flatten.compact.max
102
+ end
103
+
104
+ def downloads_per_day(version)
105
+ # returns # "2013-10-10" => 45
106
+ accumulated_downloads_per_day(version)
107
+ end
108
+
109
+ def accumulated_downloads_per_day(version)
110
+ # downloads_metadata comes back ordered by date
111
+ ret = Hash.new(0)
112
+ gem_data.downloads_metadata(version, default_start, default_end).each_cons(2) do |p,n|
113
+ #day,total pairs
114
+ curr_total = n.last
115
+ day = n.first
116
+ previous_day = p.first
117
+ ret[day] = curr_total + ret[previous_day]
118
+ end
119
+ ret
120
+ end
121
+
81
122
  # a little sugar
82
123
  def effective_start_time; effective_date_range.first ;end
83
124
  def effective_end_time; effective_date_range.last ;end
84
125
 
85
126
  # helper method to convert [start,end] into a
86
- # start..end range of day instances
87
- def specific_days_in_range
127
+ # start..end range of days like "2013-10-10"
128
+ def effective_days_in_range
88
129
  all_days = []
89
130
  s = Date.parse(effective_start_time)
90
131
  e = Date.parse(effective_end_time)
@@ -93,7 +134,7 @@ class BaseVelocitator
93
134
  all_days << i
94
135
  i += 1.day
95
136
  end
96
- all_days
137
+ all_days.map{|d| time_format_str_small(d)}
97
138
  end
98
139
 
99
140
  def gem_data
@@ -5,24 +5,19 @@ class MultipleVelocitator < BaseVelocitator
5
5
  end
6
6
 
7
7
  def default_start
8
- earliest_start = versions.map{|v| Date.parse(time_built(v)) }.min
9
- default_start = time_format_str(earliest_start)
8
+ base_earliest_time_for(versions)
10
9
  end
11
10
 
12
11
  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
12
+ base_max_for(versions)
18
13
  end
19
14
 
20
15
  def graph_options
21
16
  opts = {
22
17
  :title => title,
23
18
  :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,
19
+ :max_value => effective_max_value,
20
+ :min_value => effective_min_value,
26
21
  :line_datas => line_datas
27
22
  }
28
23
  end
@@ -32,7 +27,7 @@ class MultipleVelocitator < BaseVelocitator
32
27
  end
33
28
 
34
29
  def title
35
- "MutlipleVelocitator:#{gem_name}"
30
+ "#{gem_name}"
36
31
  end
37
32
 
38
33
 
@@ -1,25 +1,33 @@
1
1
  class SingleVelocitator < BaseVelocitator
2
2
 
3
+ attr_reader :version
4
+
3
5
  def initialize(gem_name, version)
4
6
  @version = version
5
7
  super(gem_name, [version])
6
8
  end
7
9
 
8
10
  def default_start
9
- time_format_str(Date.parse(time_built(@version)))
11
+ time_format_str(Date.parse(time_built))
12
+ end
13
+
14
+ def time_built
15
+ super(@version)
10
16
  end
11
17
 
12
18
  def default_max_value
13
- gem_data.downloads_day(@version).map {|day,total| total}.max
19
+ accumulated_downloads_per_day(@version).map {|day,total| total}.max
14
20
  end
15
21
 
16
22
  def graph_options
17
23
  opts = {
18
24
  :title => title,
25
+ # todo change the -2 to -4? so if ifits in? if it's abvoe 4 fcors
19
26
  :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
27
+ :max_value => effective_max_value,
28
+ :min_value => effective_min_value,
29
+ :line_datas => line_datas,
30
+ :hide_legend => true
23
31
  }
24
32
  end
25
33
 
@@ -28,7 +36,11 @@ class SingleVelocitator < BaseVelocitator
28
36
  end
29
37
 
30
38
  def title
31
- "SingleVelocitator:#{gem_name}"
39
+ "#{gem_name}-#{version}"
40
+ end
41
+
42
+ def totals
43
+ super.first
32
44
  end
33
45
 
34
46
  end
@@ -1,3 +1,3 @@
1
1
  module GemVelocity
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.7"
3
3
  end
@@ -10,8 +10,9 @@ describe GemData do
10
10
  end
11
11
 
12
12
  it "can show download information" do
13
- result = GemData.new("haml-i18n-extractor").downloads_day("0.0.17")
14
- result.should == [["2013-06-17", 54], ["2013-06-18", 57], ["2013-06-19", 58], ["2013-06-20", 62], ["2013-06-21", 63], ["2013-06-22", 68], ["2013-06-23", 70], ["2013-06-24", 73], ["2013-06-25", 82], ["2013-06-26", 243], ["2013-06-27", 246], ["2013-06-28", 248], ["2013-06-29", 248], ["2013-06-30", 248], ["2013-07-01", 248], ["2013-07-02", 255], ["2013-07-03", 258], ["2013-07-04", 260], ["2013-07-05", 260], ["2013-07-06", 263], ["2013-07-07", 263], ["2013-07-08", 265], ["2013-07-09", 266], ["2013-07-10", 268], ["2013-07-11", 271], ["2013-07-12", 273], ["2013-07-13", 274], ["2013-07-14", 274], ["2013-07-15", 276], ["2013-07-16", 278], ["2013-07-17", 284], ["2013-07-18", 284], ["2013-07-19", 287], ["2013-07-20", 288], ["2013-07-21", 288], ["2013-07-22", 290], ["2013-07-23", 291], ["2013-07-24", 297], ["2013-07-25", 297], ["2013-07-26", 297], ["2013-07-27", 297], ["2013-07-28", 297], ["2013-07-29", 298], ["2013-07-30", 300], ["2013-07-31", 302], ["2013-08-01", 302], ["2013-08-02", 302], ["2013-08-03", 302], ["2013-08-04", 302], ["2013-08-05", 304], ["2013-08-06", 304], ["2013-08-07", 304], ["2013-08-08", 307], ["2013-08-09", 307], ["2013-08-10", 307], ["2013-08-11", 307], ["2013-08-12", 308], ["2013-08-13", 310], ["2013-08-14", 311], ["2013-08-15", 313], ["2013-08-16", 313], ["2013-08-17", 314], ["2013-08-18", 314], ["2013-08-19", 314], ["2013-08-20", 314], ["2013-08-21", 315], ["2013-08-22", 317], ["2013-08-23", 321], ["2013-08-24", 321], ["2013-08-25", 322], ["2013-08-26", 322], ["2013-08-27", 324], ["2013-08-28", 324], ["2013-08-29", 326], ["2013-08-30", 326], ["2013-08-31", 326], ["2013-09-01", 328], ["2013-09-02", 330], ["2013-09-03", 331], ["2013-09-04", 331], ["2013-09-05", 333], ["2013-09-06", 335], ["2013-09-07", 335], ["2013-09-08", 335], ["2013-09-09", 336], ["2013-09-10", 336], ["2013-09-11", 336], ["2013-09-12", 341], ["2013-09-13", 341], ["2013-09-14", 341], ["2013-09-15", 341], ["2013-09-16", 342], ["2013-09-17", 342], ["2013-09-18", 342], ["2013-09-19", 343], ["2013-09-20", 344]]
13
+ gem_data = GemData.new("haml-i18n-extractor")
14
+ result = gem_data.downloads_metadata("0.0.17", gem_data.versions_built_at["0.0.17"],Time.now)
15
+ result.should == [["2013-06-16", 38], ["2013-06-17", 16], ["2013-06-18", 3], ["2013-06-19", 1], ["2013-06-20", 4], ["2013-06-21", 1], ["2013-06-22", 5], ["2013-06-23", 2], ["2013-06-24", 3], ["2013-06-25", 9], ["2013-06-26", 161], ["2013-06-27", 3], ["2013-06-28", 2], ["2013-06-29", 0], ["2013-06-30", 0], ["2013-07-01", 0], ["2013-07-02", 7], ["2013-07-03", 3], ["2013-07-04", 2], ["2013-07-05", 0], ["2013-07-06", 3], ["2013-07-07", 0], ["2013-07-08", 2], ["2013-07-09", 1], ["2013-07-10", 2], ["2013-07-11", 3], ["2013-07-12", 2], ["2013-07-13", 1], ["2013-07-14", 0], ["2013-07-15", 2], ["2013-07-16", 2], ["2013-07-17", 6], ["2013-07-18", 0], ["2013-07-19", 3], ["2013-07-20", 1], ["2013-07-21", 0], ["2013-07-22", 2], ["2013-07-23", 1], ["2013-07-24", 6], ["2013-07-25", 0], ["2013-07-26", 0], ["2013-07-27", 0], ["2013-07-28", 0], ["2013-07-29", 1], ["2013-07-30", 2], ["2013-07-31", 2], ["2013-08-01", 0], ["2013-08-02", 0], ["2013-08-03", 0], ["2013-08-04", 0], ["2013-08-05", 2], ["2013-08-06", 0], ["2013-08-07", 0], ["2013-08-08", 3], ["2013-08-09", 0], ["2013-08-10", 0], ["2013-08-11", 0], ["2013-08-12", 1], ["2013-08-13", 2], ["2013-08-14", 1], ["2013-08-15", 2], ["2013-08-16", 0], ["2013-08-17", 1], ["2013-08-18", 0], ["2013-08-19", 0], ["2013-08-20", 0], ["2013-08-21", 1], ["2013-08-22", 2], ["2013-08-23", 4], ["2013-08-24", 0], ["2013-08-25", 1], ["2013-08-26", 0], ["2013-08-27", 2], ["2013-08-28", 0], ["2013-08-29", 2], ["2013-08-30", 0], ["2013-08-31", 0], ["2013-09-01", 2], ["2013-09-02", 2], ["2013-09-03", 1], ["2013-09-04", 0], ["2013-09-05", 2], ["2013-09-06", 2], ["2013-09-07", 0], ["2013-09-08", 0], ["2013-09-09", 1], ["2013-09-10", 0], ["2013-09-11", 0], ["2013-09-12", 5], ["2013-09-13", 0], ["2013-09-14", 0], ["2013-09-15", 0], ["2013-09-16", 1], ["2013-09-17", 0], ["2013-09-18", 0], ["2013-09-19", 1], ["2013-09-20", 1]]
15
16
  end
16
17
 
17
18
 
@@ -48,6 +48,7 @@ describe GruffBuilder do
48
48
  :line_datas => [1,2,3,10,8,12],
49
49
  :min_value => 0,
50
50
  :max_value => 20,
51
+ :hide_legend => true
51
52
  }
52
53
  builder = GruffBuilder.new(@tmp_dir,nil,["0.0.17"],"foo-baz", gruff_options)
53
54
  builder.write
@@ -5,16 +5,55 @@ describe 'with no time stubbing', :do_not_use_time_cop do
5
5
  # hax slow internet connections make this slow.
6
6
  if ENV['VELOCITATOR_REAL_LONG']
7
7
  it "has a shortcut graph method #1" do
8
- velocitator = Velocitator.new("rails", ["4.0.0","3.2.14","2.3.5"])
8
+ velocitator = SingleVelocitator.new("rails", "2.3.5")
9
+ # WTF all is shit
10
+ # https://rubygems.org/gems/rails/versions/2.3.5
11
+ # should be close to 1m!!
12
+ #
13
+ # gb = velocitator.send(:gruff_builder)
14
+ # gb.line_datas.first.index{|z| z.nonzero?}
15
+ # => 1199
16
+ # gb.line_datas.first.size #[1199]
17
+ # => 1417
18
+ # 1417 - 1199
19
+ # => 218
20
+ #
21
+ # velocitator.send(:gem_data).send(:downloads_metadata, velocitator.versions.first,velocitator.effective_date_range.first, velocitator.effective_date_range.last).size
22
+ # => 1417
23
+ # velocitator.send(:gem_data).downloads_day(velocitator.versions.first,velocitator.effective_date_range.first, velocitator.effective_date_range.last).size
24
+ # => 218
25
+ # x = Gems.downloads(velocitator.gem_name, velocitator.versions.first, velocitator.effective_date_range.first, velocitator.effective_date_range.last)
26
+ # x.to_a.index{|z| z.last.nonzero?}
27
+ # => 1198
28
+ velocitator = SingleVelocitator.new("rails", "2.3.5")
29
+ #x.to_a.index{|z| z.last.nonzero?}
30
+ #binding.pry
9
31
  file = velocitator.graph("/tmp")
10
- File.exist?(file).should be_true
32
+ raise 'wtf'
11
33
  end
12
34
 
13
35
  it "has a shortcut graph method #2" do
14
- velocitator = Velocitator.new("rails", ["4.0.0","3.2.14","0.9.1"])
36
+ velocitator = MultipleVelocitator.new("rails", ["4.0.0","3.2.14","0.9.1"])
15
37
  file = velocitator.graph("/tmp", [3.months.ago, Time.now])
16
38
  File.exist?(file).should be_true
17
39
  end
40
+
41
+ it "has a shortcut graph method #3" do
42
+ velocitator = AggregatedVelocitator.new("rails", "4")
43
+ puts velocitator.versions
44
+ puts velocitator.totals.inspect
45
+ file = velocitator.graph("/tmp")
46
+ File.exist?(file).should be_true
47
+ end
48
+
49
+ it "has a shortcut graph method #4" do
50
+ velocitator = AggregatedVelocitator.new("haml-i18n-extractor", "0") # all of it
51
+ puts velocitator.aggregated_versions
52
+ puts velocitator.versions
53
+ file = velocitator.graph("/tmp")
54
+ puts file.inspect
55
+ File.exist?(file).should be_true
56
+ end
18
57
  end
19
58
 
20
59
  end
@@ -19,6 +19,17 @@ end
19
19
 
20
20
  RSpec.configure do |c|
21
21
  c.treat_symbols_as_metadata_keys_with_true_values = true
22
+
23
+ c.around(:each) do |example|
24
+ example_hashified = example.metadata[:description_args].first.unpack("s").first
25
+ puts "\nRunning example: #{example.metadata[:description_args]}\n"
26
+ orig_time = Time.now
27
+ VCR.use_cassette("rspec-example-#{(example_hashified)}") do
28
+ example.run
29
+ end
30
+ puts "finished in ~#{Time.now.to_i - orig_time.to_i}s"
31
+ end
32
+
22
33
  c.around(:each) do |example|
23
34
  #freeze time unless explicitly said not to!
24
35
  unless example.metadata[:do_not_use_time_cop]
@@ -31,14 +42,6 @@ RSpec.configure do |c|
31
42
  end
32
43
  end
33
44
 
34
- c.around(:each) do |example|
35
- example_hashified = example.metadata[:description_args].first.unpack("s").first
36
- puts "\nRunning example: #{example.metadata[:description_args]}\n"
37
- VCR.use_cassette("rspec-example-#{(example_hashified)}") do
38
- example.run
39
- end
40
- end
41
-
42
45
  c.after(:suite) do
43
46
  FileUtils.rm_rf(SpecHelper.tmpdir)
44
47
  end
@@ -1,7 +1,51 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe SingleVelocitator do
3
+ # https://github.com/shaiguitar/rubygems.org/compare/api_not_returning_all_results_over_90_days?expand=1
4
+
5
+ describe "a Velocitator rendering graphs" do
6
+
7
+ # testing single_velocitator is enough to test base
8
+ it "can render a graph" do
9
+ velocitator = SingleVelocitator.new("haml-i18n-extractor", "0.0.17")
10
+ velocitator.date_range = [ 7.days.ago, 3.days.ago ]
11
+ velocitator.root = SpecHelper.tmpdir
12
+
13
+ # Plausible to change this?
14
+ # the values for the two days mentioned in the date range.
15
+ # should this be the specific date range values?? aggregated since when? not aggregated?
16
+ velocitator.graph_options[:line_datas].should == [[303, 303, 303, 304, 304]]
17
+
18
+ velocitator.graph_options[:title].should == "haml-i18n-extractor-0.0.17"
19
+ velocitator.graph_options[:labels].should == ({1=>"2013-09-13", (velocitator.line_datas.first.size-2) =>"2013-09-17"})
20
+ velocitator.graph_options[:max_value].should == 306 # the max in the range (time.now)
21
+ velocitator.graph_options[:min_value].should == 0
22
+
23
+ file = velocitator.graph
24
+ File.exist?(file).should be_true
25
+ #`open #{file} -a preview.app`
26
+ #Kernel.sleep(10)
27
+ end
4
28
 
29
+ it "has a shortcut graph method #1" do
30
+ velocitator = SingleVelocitator.new("haml-i18n-extractor", "0.0.17")
31
+ file = velocitator.graph(SpecHelper.tmpdir,[1.day.ago, Time.now])
32
+ File.exist?(file).should be_true
33
+ end
34
+
35
+ it "has a shortcut graph method #2" do
36
+ velocitator = SingleVelocitator.new("haml-i18n-extractor", "0.0.17")
37
+ file = velocitator.graph
38
+ File.exist?(file).should be_true
39
+ end
40
+
41
+ it "has a shortcut graph metho #3" do
42
+ velocitator = SingleVelocitator.new("haml-i18n-extractor", "0.0.17")
43
+ file = velocitator.graph(nil,nil,0,1000)
44
+ File.exist?(file).should be_true
45
+ end
46
+ end
47
+
48
+ describe SingleVelocitator do
5
49
  it 'raises if you dont pass name and version(s)' do
6
50
  lambda { SingleVelocitator.new(nil,nil) }.should raise_error ArgumentError
7
51
  end
@@ -14,6 +58,12 @@ describe SingleVelocitator do
14
58
  lambda { SingleVelocitator.new("haml-i18n-extractor","100.999.42.666.pre") }.should raise_error NoSuchVersion
15
59
  end
16
60
 
61
+ it "holds the totals of the gem" do
62
+ velocitator = SingleVelocitator.new("haml-i18n-extractor", "0.0.17")
63
+ velocitator.totals.should == {:total_downloads=>5355, :version_downloads=>377}
64
+ #binding.pry
65
+ end
66
+
17
67
  it "sets a specific date range according to the gem's info" do
18
68
  velocitator = SingleVelocitator.new("haml-i18n-extractor", "0.0.17")
19
69
  velocitator.effective_date_range.should eq ["2013-06-16T00:00:00Z", "2013-09-20T00:00:00Z"]
@@ -38,46 +88,11 @@ describe SingleVelocitator do
38
88
  velocitator.line_datas.size.should eq (velocitator.versions.size)
39
89
  end
40
90
 
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
91
  end
78
92
 
93
+
79
94
  describe MultipleVelocitator do
80
- before do
95
+ before do
81
96
  @some_versions = ["0.0.17", "0.0.5","0.0.10"]
82
97
  end
83
98
 
@@ -86,6 +101,11 @@ describe MultipleVelocitator do
86
101
  velocitator.versions.should == @some_versions
87
102
  end
88
103
 
104
+ it "holds the totals of the gem" do
105
+ velocitator = MultipleVelocitator.new("haml-i18n-extractor", ["0.0.17"])
106
+ velocitator.totals.should eq [{:total_downloads=>5355, :version_downloads=>377}]
107
+ end
108
+
89
109
  it "sets the earliest start range from to all of the versions info" do
90
110
  # some_versions.map{|v| GemData.new("haml-i18n-extractor").versions_built_at[v]}
91
111
  # => ["2013-06-16T00:00:00Z", "2013-03-22T00:00:00Z", "2013-05-06T00:00:00Z"]
@@ -117,3 +137,53 @@ describe MultipleVelocitator do
117
137
  end
118
138
  end
119
139
 
140
+ describe AggregatedVelocitator do
141
+ before do
142
+ @gem_name = "haml-i18n-extractor"
143
+ @major_version = "0"
144
+ @minor_version = "0.4"
145
+ end
146
+
147
+ it "can initialize and find out about all versions in a major" do
148
+ velocitator = AggregatedVelocitator.new(@gem_name, @major_version)
149
+ velocitator.aggregated_versions.should == ["0.5.9", "0.5.8", "0.5.6", "0.5.5", "0.5.4", "0.5.3", "0.5.2", "0.5.1", "0.5.0", "0.4.3", "0.4.2", "0.4.1", "0.4.0", "0.3.5", "0.3.4", "0.3.2", "0.3.0", "0.2.1", "0.2.0", "0.1.0", "0.0.21", "0.0.20", "0.0.19", "0.0.18", "0.0.17", "0.0.16", "0.0.15", "0.0.12", "0.0.10", "0.0.9", "0.0.5"]
150
+ end
151
+
152
+ it "can initialize and find out about all versions in specific a minor" do
153
+ velocitator = AggregatedVelocitator.new(@gem_name, @minor_version)
154
+ velocitator.aggregated_versions.should == ["0.4.3", "0.4.2", "0.4.1", "0.4.0"]
155
+ end
156
+
157
+ it "sends the first and last version passed as versions though" do
158
+ velocitator = AggregatedVelocitator.new(@gem_name, @minor_version)
159
+ velocitator.versions = ["0.4.3","0.4.0"]
160
+ end
161
+
162
+ it "sends only one graph that is the total of those versions" do
163
+ velocitator = AggregatedVelocitator.new(@gem_name, @minor_version)
164
+ velocitator.line_datas.first.size == 1 # [[1,2,3]] but not [[1,2,3][1,4,8]]
165
+ end
166
+
167
+ it "sets the max to the multiple of one of its members max * the amount of versions" do
168
+ velocitator = AggregatedVelocitator.new(@gem_name, @minor_version)
169
+ velocitator.default_max_value.should eq 356
170
+ end
171
+
172
+ it "sends only one graph and can draw a graph of it" do
173
+ velocitator = AggregatedVelocitator.new(@gem_name, @minor_version)
174
+ file = velocitator.graph
175
+ end
176
+
177
+ it "hides the legend caption" do
178
+ velocitator = AggregatedVelocitator.new(@gem_name, "0.0.17")
179
+ velocitator.graph_options[:hide_legend].should == true
180
+ end
181
+
182
+ it "should accumlate the same data as a single_velocitator" do
183
+ a_velocitator = AggregatedVelocitator.new(@gem_name, "0.0.17")
184
+ s_velocitator = SingleVelocitator.new(@gem_name, "0.0.17")
185
+ a_velocitator.versions.should == s_velocitator.versions
186
+ a_velocitator.graph_options[:line_datas].should == s_velocitator.graph_options[:line_datas]
187
+ end
188
+
189
+ end
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: 19
4
+ hash: 17
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 6
10
- version: 0.0.6
9
+ - 7
10
+ version: 0.0.7
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-12 00:00:00 Z
18
+ date: 2013-10-19 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: gruff
@@ -211,6 +211,7 @@ 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/velocitators/aggregated_velocitator.rb
214
215
  - lib/gem_velocity/velocitators/all.rb
215
216
  - lib/gem_velocity/velocitators/base_velocitator.rb
216
217
  - lib/gem_velocity/velocitators/multiple_velocitator.rb