gem_velocity 0.0.10 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
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