gem_velocity 0.0.10 → 0.0.11

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 CHANGED
@@ -1,16 +1,5 @@
1
- Add a Version?
2
-
3
- currently, the versions in the base class are single versions, but they are essentially used for representing a specific line
4
-
5
- in default_line_datas.
6
- (and then used for titles, abd bs).
7
-
8
- if rubygems 606 isn't solved, why not just put a total on there and let the inconsistnecies just be with some notice?
9
-
10
1
  rename time_format_str_small alias
11
2
 
12
- swap out gruff_builder to some other composing object of a builder, that can mash up the various velocitators?
13
-
14
3
  consolidate velocitator fixtrues or at least repeatable generators in specs.
15
4
 
16
5
  cassandra says to have an option to have the multiplexer start them from the same data (to see curve/adoption rate). I see it.
@@ -25,4 +14,4 @@ speed the fuck out of it:
25
14
  Wrote graph to /Users/shair/projects/gem_velocities2/gem_velocity_web/public/images/AggregatedVelocitator-rails-3.2.x.png
26
15
  2013-10-27 17:46:53 -0700
27
16
 
28
- add total that is displayed on rubygems (vs total that it gets back and calculates per day).
17
+ use the perftool stuff.
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ BENCH_DIR = File.expand_path(File.dirname(__FILE__))
4
+ project = File.expand_path(File.join(BENCH_DIR, ".."))
5
+ Dir.chdir project
6
+ $:.unshift(project)
7
+ $:.unshift("lib")
8
+
9
+ require File.join(project,"lib", "gem_velocity")
10
+
11
+ require 'benchmark'
12
+ require 'perftools'
13
+
14
+ class PerfToolHelper
15
+ class << self
16
+
17
+ def clean_slate
18
+ FileUtils.rm_rf(tmp_dir)
19
+ FileUtils.mkdir_p(tmp_dir)
20
+ end
21
+
22
+ def tmp_dir
23
+ "#{BENCH_DIR}/tmp"
24
+ end
25
+
26
+ attr_reader :paths
27
+ def gather_data(path, &block)
28
+ @paths ||= []
29
+ @paths << path
30
+ PerfTools::CpuProfiler.start(path)
31
+ block.call
32
+ PerfTools::CpuProfiler.stop
33
+ end
34
+ end
35
+ end
36
+
37
+ puts 'cleaning previous perftool'
38
+ PerfToolHelper.clean_slate
39
+
40
+ Benchmark.bm do |b|
41
+ PerfToolHelper.gather_data("#{PerfToolHelper.tmp_dir}/2.3.x") do
42
+ b.report("aggregated") { BaseVelocitator.create(:gem_name => "rails", :version => "2.3.x").graph }
43
+ end
44
+ end
45
+
46
+ Benchmark.bm do |b|
47
+ PerfToolHelper.gather_data("#{PerfToolHelper.tmp_dir}/0.0.x") do
48
+ b.report("single") { BaseVelocitator.create(:gem_name => "haml-i18n-extractor", :version => "0.0.5").graph }
49
+ end
50
+ end
51
+
52
+ puts 'multi'
53
+ puts Benchmark.measure {
54
+ one = BaseVelocitator.create(:gem_name => "haml-i18n-extractor", :version => "0.0.16" )
55
+ two = BaseVelocitator.create(:gem_name => "haml-i18n-extractor", :version => "0.0.17" )
56
+ PerfToolHelper.gather_data("#{PerfToolHelper.tmp_dir}/0.0.16-0.0.17") do
57
+ Multiplexer.new([one,two]).graph
58
+ end
59
+ }
60
+
61
+ puts "Creating images for perftools..."
62
+ PerfToolHelper.paths.each do |perftool_data_path|
63
+ system("pprof.rb --gif #{perftool_data_path} > #{perftool_data_path}.gif")
64
+ end
data/bin/gem_velocity ADDED
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "gem_velocity"
4
+
5
+ option_parser = Trollop::Parser.new do
6
+ version "Current version: #{GemVelocity::VERSION}"
7
+ opt :gem_name, "gem name", :short => 'g', :type => String
8
+ opt :version_str, "version_str", :short => 'n', :type => String
9
+ # TODO start,end,max,min.
10
+ # TODO handle commas and change to multiplexer ?
11
+ banner <<-EOB
12
+
13
+ Run like:
14
+
15
+ gem_velocity -g <gem_name> -n <version_number>
16
+ # example
17
+ # gem_velocity -g haml-i18n-extractor -n 0.0.5
18
+ EOB
19
+ end
20
+
21
+ opts = Trollop::with_standard_exception_handling option_parser do
22
+ raise Trollop::HelpNeeded if ARGV.empty?
23
+ option_parser.parse ARGV
24
+ end
25
+
26
+ opts[:version] = opts.delete(:version_str)
27
+
28
+ velocitator = BaseVelocitator.create(opts)
29
+ file = velocitator.graph
30
+
data/gem_velocity.gemspec CHANGED
@@ -21,6 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.add_dependency "gruff"
22
22
  spec.add_dependency "activesupport"
23
23
  spec.add_dependency "gems"
24
+ spec.add_dependency "trollop", "1.16.2"
24
25
 
25
26
  spec.add_development_dependency "bundler", "~> 1.3"
26
27
  spec.add_development_dependency "rake"
@@ -31,5 +32,6 @@ Gem::Specification.new do |spec|
31
32
  spec.add_development_dependency "timecop"
32
33
  spec.add_development_dependency "sourcify"
33
34
  spec.add_development_dependency "ParseTree"
35
+ spec.add_development_dependency "perftools.rb"
34
36
 
35
37
  end
@@ -2,12 +2,47 @@ require 'gems'
2
2
 
3
3
  class GemData
4
4
 
5
+ require 'thread'
6
+
7
+ include Helpers
5
8
  attr_reader :gem_name
6
9
 
7
10
  def initialize(gem_name)
8
11
  @gem_name = gem_name
9
12
  end
10
13
 
14
+ def parallel_fetch_for(versions)
15
+ @mutex1 = Mutex.new
16
+ @cached_downloads_metatada ||= {}
17
+ smallest_version = versions.map{|v| ComparableVersion.new(v)}.sort.first.str
18
+ start_t = time_built(smallest_version)
19
+ end_t = Time.now
20
+ puts "fetching #{versions.size} download data requests"
21
+ threads = []
22
+
23
+ # TODO limit threads.
24
+ versions.map do |v|
25
+ threads << Thread.new {
26
+ fetch_downloads_metadata(v,start_t,end_t,@cached_downloads_metatada)
27
+ }
28
+ end
29
+ threads.map(&:join)
30
+ end
31
+
32
+ def fetch_downloads_metadata(version, start_time, end_time, cache_hash)
33
+ key = key_for(version, start_time, end_time)
34
+ data_received = Gems.downloads(gem_name, version, start_time, end_time)
35
+ @mutex1.synchronize do
36
+ # shared hash
37
+ cache_hash[key] ||= data_received
38
+ end
39
+ end
40
+
41
+ def prefetched_downloads_metadata(version, start_time, end_time)
42
+ key = key_for(version, start_time, end_time)
43
+ @cached_downloads_metatada[key]
44
+ end
45
+
11
46
  def versions
12
47
  versions_metadata.map{|v| v["number"]}
13
48
  end
@@ -18,8 +53,11 @@ class GemData
18
53
  h
19
54
  end
20
55
 
56
+ def time_built(v)
57
+ versions_built_at[v]
58
+ end
59
+
21
60
  def versions_metadata
22
- # cache api call.
23
61
  @versions_metadata ||= Gems.versions(gem_name)
24
62
  # it should be a hash
25
63
  if @versions_metadata.is_a?(String)
@@ -30,6 +68,10 @@ class GemData
30
68
  @versions_metadata
31
69
  end
32
70
 
71
+ def key_for(v,s,e)
72
+ "#{v}-#{time_format_str_small(s)}-#{time_format_str_small(e)}"
73
+ end
74
+
33
75
  def total_for_version(version)
34
76
  @total_for_version ||= {}
35
77
  key = "#{version}"
@@ -37,13 +79,5 @@ class GemData
37
79
  @total_for_version[key] ||= Gems.total_downloads(gem_name, version)
38
80
  end
39
81
 
40
- def downloads_metadata(version, start_time, end_time)
41
- # cache api call.
42
- @downloads_metadata ||= {}
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
46
- end
47
-
48
82
 
49
83
  end
@@ -37,3 +37,25 @@ module Helpers
37
37
  end
38
38
 
39
39
  end
40
+
41
+ # http://stackoverflow.com/questions/2051229/how-to-compare-versions-in-ruby
42
+ class ComparableVersion < Array
43
+ def initialize s
44
+ @str = s
45
+ super(s.split('.').map { |e| e.to_i })
46
+ end
47
+ def str
48
+ @str
49
+ end
50
+ def < x
51
+ (self <=> x) < 0
52
+ end
53
+ def > x
54
+ (self <=> x) > 0
55
+ end
56
+ def == x
57
+ (self <=> x) == 0
58
+ end
59
+ end
60
+
61
+
@@ -13,14 +13,13 @@ class AggregatedVelocitator < BaseVelocitator
13
13
  @gem_name = gem_name
14
14
  @version = top_level_ver #with a wildcard/x
15
15
  @versions = @aggregated_versions = gem_data.versions.select{|v| v.match(/^#{Regexp.escape(remove_trailing_x(top_level_ver))}/) }
16
- super(gem_name, @aggregated_versions)
17
-
18
16
  raise NoSuchVersion, "no versions found for #{@version}!" if @aggregated_versions.empty?
17
+ after_init
19
18
  end
20
19
 
21
20
  def default_start
22
- earliest_start = @aggregated_versions.map{|v| Date.parse(time_built(v)) }.compact.min
23
- time_format_str(earliest_start)
21
+ smallest_version = @aggregated_versions.map{|v| ComparableVersion.new(v)}.sort.first.str
22
+ built_at(smallest_version)
24
23
  end
25
24
 
26
25
  def default_max_value
@@ -81,11 +81,12 @@ class BaseVelocitator
81
81
 
82
82
  private
83
83
 
84
- def initialize(gem_name, versions)
85
- @gem_name = gem_name || raise(ArgumentError, 'need a name')
86
- @versions = versions || raise(ArgumentError, 'required versions')
84
+ def after_init
85
+ raise ArgumentError, "Need to pass a gem name!" if (gem_name.nil? || gem_name.empty?)
86
+ raise ArgumentError, "Need to pass versions!" if versions.compact.empty?
87
87
  validate_correct_gem
88
88
  validate_correct_versions
89
+ gem_data.parallel_fetch_for(versions)
89
90
  end
90
91
 
91
92
  def validate_correct_versions
@@ -137,19 +138,20 @@ class BaseVelocitator
137
138
  end
138
139
 
139
140
  # returns # "2013-10-10" => 45
140
- def accumulated_downloads_per_day(version)
141
- # downloads_metadata comes back ordered by date
141
+ def downloads_per_day(version)
142
+ @downloads_per_day ||= Hash.new
143
+ return @downloads_per_day[version] if @downloads_per_day[version]
142
144
  ret = Hash.new(0)
143
- gem_data.downloads_metadata(version, default_start, default_end).each_cons(2) do |p,n|
145
+ from_api = gem_data.prefetched_downloads_metadata(version, default_start, default_end)
146
+ from_api.each_cons(2) do |p,n|
144
147
  #day,total pairs
145
148
  curr_total = n.last
146
149
  day = n.first
147
150
  previous_day = p.first
148
151
  ret[day] = curr_total + ret[previous_day]
149
152
  end
150
- ret
153
+ @downloads_per_day[version] = ret
151
154
  end
152
- alias :downloads_per_day :accumulated_downloads_per_day
153
155
 
154
156
  def gem_data
155
157
  # need this memoized so the gem_data memoization works for the same instance
@@ -22,9 +22,9 @@ class Factory
22
22
 
23
23
  def velocitator
24
24
  if @type == :aggregated
25
- AggregatedVelocitator.new(@gem_name, @version)
25
+ @velocitator ||= AggregatedVelocitator.new(@gem_name, @version)
26
26
  elsif @type == :single
27
- SingleVelocitator.new(@gem_name, @version)
27
+ @velocitator ||= SingleVelocitator.new(@gem_name, @version)
28
28
  else
29
29
  raise 'no velocitor found to generate!'
30
30
  end
@@ -6,7 +6,9 @@ class Multiplexer < BaseVelocitator
6
6
  def initialize(velocitators)
7
7
  @velocitators = velocitators
8
8
  # TODO what if there are multiple gem_names being multiplexed?
9
- super(velocitators.first.gem_name, velocitators.map(&:versions).flatten)
9
+ @gem_name = velocitators.first.gem_name
10
+ @versions = velocitators.map(&:versions).flatten
11
+ after_init
10
12
  end
11
13
 
12
14
  def version
@@ -5,8 +5,10 @@ class SingleVelocitator < BaseVelocitator
5
5
  attr_reader :version
6
6
 
7
7
  def initialize(gem_name, version)
8
+ @gem_name = gem_name
8
9
  @version = version
9
- super(gem_name, [version])
10
+ @versions = [version]
11
+ after_init
10
12
  end
11
13
 
12
14
  def default_start
@@ -18,7 +20,7 @@ class SingleVelocitator < BaseVelocitator
18
20
  end
19
21
 
20
22
  def default_max_value
21
- accumulated_downloads_per_day(@version).map {|day,total| total}.max
23
+ downloads_per_day(@version).map {|day,total| total}.max
22
24
  end
23
25
 
24
26
  def line_data(start_t = nil, end_t = nil)
@@ -1,3 +1,3 @@
1
1
  module GemVelocity
2
- VERSION = "0.0.10"
2
+ VERSION = "0.0.11"
3
3
  end
data/lib/gem_velocity.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require "trollop"
1
2
  require "gem_velocity/version"
2
3
  require "gem_velocity/helpers"
3
4
  require "gem_velocity/gem_data"
@@ -17,3 +18,7 @@ require 'date'
17
18
 
18
19
  module GemVelocity
19
20
  end
21
+
22
+ # this should be used for short-lived scripts.
23
+ # can be configurable if need be.
24
+ GC.disable
@@ -11,7 +11,8 @@ describe GemData do
11
11
 
12
12
  it "can show download information" do
13
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)
14
+ gem_data.parallel_fetch_for(["0.0.17"])
15
+ result = gem_data.prefetched_downloads_metadata("0.0.17", gem_data.versions_built_at["0.0.17"],Time.now).to_a
15
16
  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]]
16
17
  end
17
18
 
@@ -15,7 +15,7 @@ describe "a Velocitator rendering graphs" do
15
15
  # should this be the specific date range values?? aggregated since when? not aggregated?
16
16
  velocitator.graph_options[:line_datas].should == [[303, 303, 303, 304, 304]]
17
17
 
18
- velocitator.graph_options[:title].should == "haml-i18n-extractor-0.0.17\n(downloads: 377)"
18
+ velocitator.graph_options[:title].should == "haml-i18n-extractor-0.0.17\n(downloads: 386)"
19
19
  velocitator.graph_options[:labels].should == ({1=>"2013-09-13", (velocitator.line_data.size-2) =>"2013-09-17"})
20
20
  velocitator.graph_options[:max_value].should == 306 # the max in the range (time.now)
21
21
  velocitator.graph_options[:min_value].should == 0
@@ -60,7 +60,7 @@ describe SingleVelocitator do
60
60
 
61
61
  it "holds the totals of the gem" do
62
62
  velocitator = SingleVelocitator.new("haml-i18n-extractor", "0.0.17")
63
- velocitator.totals_map_by_version["0.0.17"][:version_downloads].should eq 377
63
+ velocitator.totals_map_by_version["0.0.17"][:version_downloads].should eq 386
64
64
  #binding.pry
65
65
  end
66
66
 
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: 11
4
+ hash: 9
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 10
10
- version: 0.0.10
9
+ - 11
10
+ version: 0.0.11
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-28 00:00:00 Z
18
+ date: 2013-10-30 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: gruff
@@ -60,9 +60,25 @@ dependencies:
60
60
  type: :runtime
61
61
  version_requirements: *id003
62
62
  - !ruby/object:Gem::Dependency
63
- name: bundler
63
+ name: trollop
64
64
  prerelease: false
65
65
  requirement: &id004 !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - "="
69
+ - !ruby/object:Gem::Version
70
+ hash: 83
71
+ segments:
72
+ - 1
73
+ - 16
74
+ - 2
75
+ version: 1.16.2
76
+ type: :runtime
77
+ version_requirements: *id004
78
+ - !ruby/object:Gem::Dependency
79
+ name: bundler
80
+ prerelease: false
81
+ requirement: &id005 !ruby/object:Gem::Requirement
66
82
  none: false
67
83
  requirements:
68
84
  - - ~>
@@ -73,11 +89,11 @@ dependencies:
73
89
  - 3
74
90
  version: "1.3"
75
91
  type: :development
76
- version_requirements: *id004
92
+ version_requirements: *id005
77
93
  - !ruby/object:Gem::Dependency
78
94
  name: rake
79
95
  prerelease: false
80
- requirement: &id005 !ruby/object:Gem::Requirement
96
+ requirement: &id006 !ruby/object:Gem::Requirement
81
97
  none: false
82
98
  requirements:
83
99
  - - ">="
@@ -87,11 +103,11 @@ dependencies:
87
103
  - 0
88
104
  version: "0"
89
105
  type: :development
90
- version_requirements: *id005
106
+ version_requirements: *id006
91
107
  - !ruby/object:Gem::Dependency
92
108
  name: rspec
93
109
  prerelease: false
94
- requirement: &id006 !ruby/object:Gem::Requirement
110
+ requirement: &id007 !ruby/object:Gem::Requirement
95
111
  none: false
96
112
  requirements:
97
113
  - - ">="
@@ -101,11 +117,11 @@ dependencies:
101
117
  - 0
102
118
  version: "0"
103
119
  type: :development
104
- version_requirements: *id006
120
+ version_requirements: *id007
105
121
  - !ruby/object:Gem::Dependency
106
122
  name: pry
107
123
  prerelease: false
108
- requirement: &id007 !ruby/object:Gem::Requirement
124
+ requirement: &id008 !ruby/object:Gem::Requirement
109
125
  none: false
110
126
  requirements:
111
127
  - - ">="
@@ -115,11 +131,11 @@ dependencies:
115
131
  - 0
116
132
  version: "0"
117
133
  type: :development
118
- version_requirements: *id007
134
+ version_requirements: *id008
119
135
  - !ruby/object:Gem::Dependency
120
136
  name: vcr
121
137
  prerelease: false
122
- requirement: &id008 !ruby/object:Gem::Requirement
138
+ requirement: &id009 !ruby/object:Gem::Requirement
123
139
  none: false
124
140
  requirements:
125
141
  - - ">="
@@ -129,11 +145,11 @@ dependencies:
129
145
  - 0
130
146
  version: "0"
131
147
  type: :development
132
- version_requirements: *id008
148
+ version_requirements: *id009
133
149
  - !ruby/object:Gem::Dependency
134
150
  name: webmock
135
151
  prerelease: false
136
- requirement: &id009 !ruby/object:Gem::Requirement
152
+ requirement: &id010 !ruby/object:Gem::Requirement
137
153
  none: false
138
154
  requirements:
139
155
  - - "="
@@ -144,11 +160,11 @@ dependencies:
144
160
  - 13
145
161
  version: "1.13"
146
162
  type: :development
147
- version_requirements: *id009
163
+ version_requirements: *id010
148
164
  - !ruby/object:Gem::Dependency
149
165
  name: timecop
150
166
  prerelease: false
151
- requirement: &id010 !ruby/object:Gem::Requirement
167
+ requirement: &id011 !ruby/object:Gem::Requirement
152
168
  none: false
153
169
  requirements:
154
170
  - - ">="
@@ -158,11 +174,11 @@ dependencies:
158
174
  - 0
159
175
  version: "0"
160
176
  type: :development
161
- version_requirements: *id010
177
+ version_requirements: *id011
162
178
  - !ruby/object:Gem::Dependency
163
179
  name: sourcify
164
180
  prerelease: false
165
- requirement: &id011 !ruby/object:Gem::Requirement
181
+ requirement: &id012 !ruby/object:Gem::Requirement
166
182
  none: false
167
183
  requirements:
168
184
  - - ">="
@@ -172,11 +188,11 @@ dependencies:
172
188
  - 0
173
189
  version: "0"
174
190
  type: :development
175
- version_requirements: *id011
191
+ version_requirements: *id012
176
192
  - !ruby/object:Gem::Dependency
177
193
  name: ParseTree
178
194
  prerelease: false
179
- requirement: &id012 !ruby/object:Gem::Requirement
195
+ requirement: &id013 !ruby/object:Gem::Requirement
180
196
  none: false
181
197
  requirements:
182
198
  - - ">="
@@ -186,12 +202,26 @@ dependencies:
186
202
  - 0
187
203
  version: "0"
188
204
  type: :development
189
- version_requirements: *id012
205
+ version_requirements: *id013
206
+ - !ruby/object:Gem::Dependency
207
+ name: perftools.rb
208
+ prerelease: false
209
+ requirement: &id014 !ruby/object:Gem::Requirement
210
+ none: false
211
+ requirements:
212
+ - - ">="
213
+ - !ruby/object:Gem::Version
214
+ hash: 3
215
+ segments:
216
+ - 0
217
+ version: "0"
218
+ type: :development
219
+ version_requirements: *id014
190
220
  description: generate gem velocity images
191
221
  email:
192
222
  - srosenfeld@engineyard.com
193
- executables: []
194
-
223
+ executables:
224
+ - gem_velocity
195
225
  extensions: []
196
226
 
197
227
  extra_rdoc_files: []
@@ -203,6 +233,8 @@ files:
203
233
  - README.md
204
234
  - Rakefile
205
235
  - TODO
236
+ - benchmark/bench.rb
237
+ - bin/gem_velocity
206
238
  - examples/README.md
207
239
  - examples/generate_images.rb
208
240
  - examples/public/images/AggregatedVelocitator-haml-i18n-extractor-0.4.x.png