ramper 0.0.1 → 0.0.3

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.
@@ -0,0 +1 @@
1
+ *.gem
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
@@ -0,0 +1,57 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ ramper (0.0.2)
5
+ code_statistics (= 0.2.13)
6
+ courgette (= 0.3.0)
7
+ flay (= 2.6.1)
8
+ flog (= 4.3.2)
9
+
10
+ GEM
11
+ remote: https://rubygems.org/
12
+ specs:
13
+ ast (2.0.0)
14
+ code_statistics (0.2.13)
15
+ commander (4.3.4)
16
+ highline (~> 1.7.2)
17
+ courgette (0.3.0)
18
+ commander
19
+ graph
20
+ parser
21
+ diff-lcs (1.2.5)
22
+ flay (2.6.1)
23
+ ruby_parser (~> 3.0)
24
+ sexp_processor (~> 4.0)
25
+ flog (4.3.2)
26
+ ruby_parser (~> 3.1, > 3.1.0)
27
+ sexp_processor (~> 4.4)
28
+ graph (2.8.0)
29
+ highline (1.7.2)
30
+ parser (2.2.2.6)
31
+ ast (>= 1.1, < 3.0)
32
+ rspec (3.3.0)
33
+ rspec-core (~> 3.3.0)
34
+ rspec-expectations (~> 3.3.0)
35
+ rspec-mocks (~> 3.3.0)
36
+ rspec-core (3.3.1)
37
+ rspec-support (~> 3.3.0)
38
+ rspec-expectations (3.3.0)
39
+ diff-lcs (>= 1.2.0, < 2.0)
40
+ rspec-support (~> 3.3.0)
41
+ rspec-mocks (3.3.1)
42
+ diff-lcs (>= 1.2.0, < 2.0)
43
+ rspec-support (~> 3.3.0)
44
+ rspec-support (3.3.0)
45
+ ruby_parser (3.7.0)
46
+ sexp_processor (~> 4.1)
47
+ sexp_processor (4.6.0)
48
+
49
+ PLATFORMS
50
+ ruby
51
+
52
+ DEPENDENCIES
53
+ ramper!
54
+ rspec (= 3.3.0)
55
+
56
+ BUNDLED WITH
57
+ 1.10.5
@@ -0,0 +1,29 @@
1
+ ramper
2
+ ======
3
+
4
+ A ruby gem To help Developers to Ramp Up Faster.
5
+
6
+ ```
7
+ gem install ramper
8
+ ```
9
+
10
+ https://rubygems.org/gems/ramper
11
+
12
+ ```
13
+ ######### USAGE ########
14
+ # ramper [a] Gives authorship summary. To figure out who to talk to.
15
+ # ramper [fmc1] [n] Files with most changes
16
+ # ramper [fmc2] [n] Returns top n files with most commit
17
+ # ramper [child] [n] Displays classes that depend on the most other classes.
18
+ # ramper [parent] [n] Displays classes that are depended on by the most other classes.
19
+ # ramper [fmr] [n] Returns the top n recently changed files
20
+ # ramper [flog] [f] Runs the flog metric on a file/dir. Higher numbers = more complex or painful code.
21
+ # ramper [flay] [f] Runs the flay tool on a file/dir. Reports similar blocks of code.
22
+ # ramper [s] Executes rake stats
23
+ # ramper [m] [f] [flags] Computes metrics for a given file based on the flags given. Defaults to computing everything
24
+ # find . -name *.rb -type f | ramper [b] [flags] Batch file metrics for input stream.
25
+ # [flags] -f: flog stats, -a: top author and number of authors, -c: number of commits and first/last commit, -l: lines of code
26
+ # ramper [help] this message
27
+ # ramper [tips] Gives some tips on how to ramp up faster
28
+ ########################
29
+ ```
data/bin/ramper CHANGED
@@ -1,45 +1,90 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'ramper'
3
3
 
4
- usage =
5
- "######### USAGE ########
4
+ USAGE = <<END
5
+ ######### USAGE ########
6
+ # ramper [a] #{Ramper.author_summary_help}
6
7
  # ramper [fmc1] [n] #{Ramper.files_with_most_changes_help}
7
8
  # ramper [fmc2] [n] #{Ramper.files_with_most_commit_help}
9
+ # ramper [child] [n] #{Ramper.dependency_in_help}
10
+ # ramper [parent] [n] #{Ramper.dependency_out_help}
11
+ # ramper [fmr] [n] #{Ramper.files_most_recent_help}
12
+ # ramper [flog] [f] #{Ramper.flog_help}
13
+ # ramper [flay] [f] #{Ramper.flay_help}
8
14
  # ramper [s] #{Ramper.stats_help}
15
+ # ramper [m] [f] [flags] #{Ramper.file_metrics_help}
16
+ # find . -name *.rb -type f | ramper [b] [flags] #{Ramper.batch_metrics_help}
17
+ # [flags] -f: flog stats, -a: top author and number of authors, -c: number of commits and first/last commit, -l: lines of code
9
18
  # ramper [help] this message
10
- ########################"
19
+ # ramper [tips] #{Ramper.tips_help}
20
+ ########################
21
+ END
11
22
 
12
- if ARGV.length == 0
13
- puts usage
14
- exit
15
- end
16
23
 
17
24
  def get_n
18
- n = 10
19
- if ARGV.length == 2
20
- if ARGV[1].to_i > 0
21
- n = ARGV[1].to_i
25
+ arg_to_number(1, 10)
26
+ end
27
+
28
+ def maybe_n
29
+ arg_to_number(1, false)
30
+ end
31
+
32
+ def arg_to_number(index, default)
33
+ n = default
34
+ if ARGV.length == index + 1
35
+ if ARGV[index].to_i > 0
36
+ n = ARGV[index].to_i
22
37
  else
23
- puts usage
38
+ puts USAGE
24
39
  exit
25
- end
40
+ end
26
41
  end
27
-
28
42
  n
29
43
  end
30
44
 
31
- case ARGV[0]
32
- when 'fmc1'
33
- Ramper.files_with_most_changes get_n
34
-
35
- when 'fmc2'
36
- Ramper.files_with_most_commit get_n
37
-
38
- when 's'
39
- Ramper.stats
45
+ def get_filename
46
+ ARGV.length >= 2 ? ARGV[1] : './'
47
+ end
40
48
 
41
- else
42
- puts usage
43
- exit
49
+ def get_flags
50
+ ARGV.drop(2)
51
+ end
44
52
 
53
+ def compute_metrics
54
+ if ARGV.length == 0
55
+ return USAGE
56
+ end
57
+ case ARGV[0]
58
+ when 'fmc1'
59
+ puts Ramper.files_with_most_changes(get_n)
60
+ when 'fmc2'
61
+ Ramper.files_with_most_commit(get_n)
62
+ when 'fmr'
63
+ Ramper.files_most_recent(get_n)
64
+ when 'child'
65
+ Ramper.dependency_in(maybe_n)
66
+ when 'parent'
67
+ Ramper.dependency_out(maybe_n)
68
+ when 's'
69
+ Ramper.stats
70
+ when 'a'
71
+ Ramper.author_summary
72
+ when 'flog'
73
+ Ramper.flog(get_filename)
74
+ when 'flay'
75
+ Ramper.flay(get_filename)
76
+ when 'm'
77
+ Ramper.file_metrics(get_filename, get_flags)
78
+ when 'b'
79
+ Ramper.batch_metrics(get_flags)
80
+ # TODO: remove this and use parameters
81
+ when 'test'
82
+ Ramper.batch_from_most_list([], Ramper.method(:files_most_recent), 10)
83
+ when 'tips'
84
+ Ramper.tips
85
+ else
86
+ USAGE
87
+ end
45
88
  end
89
+
90
+ puts compute_metrics
@@ -0,0 +1,29 @@
1
+ require 'courgette/directory_analyser'
2
+
3
+ class DependencyAnalyzer
4
+ def initialize
5
+ @graph = Courgette::DirectoryAnalyser.new.tap { |da| da.analyse('**/*.rb') }.graph
6
+ @stats = @graph.nodes.map { |node| { :in => @graph.dependency_count(node), :out => @graph.depender_count(node), :name => node.join("::") } }
7
+ end
8
+
9
+ def get_in_stats(n)
10
+ get_stats(maybe_take(@stats.sort { |a, b| b[:in] <=> a[:in] }, n), :in)
11
+ end
12
+
13
+ def get_out_stats(n)
14
+ get_stats(maybe_take(@stats.sort { |a, b| b[:out] <=> a[:out] }, n), :out)
15
+ end
16
+
17
+ def get_stats(stat_array, stat_index)
18
+ stat_array.map { |x| "#{x[stat_index]} #{x[:name]}" }.join("\n")
19
+ end
20
+
21
+ private
22
+ def maybe_take(array, n)
23
+ if n
24
+ array.take(n)
25
+ else
26
+ array
27
+ end
28
+ end
29
+ end
@@ -1,38 +1,154 @@
1
+ require 'dependency_analyzer'
2
+ require 'ramper_file_metrics'
3
+
1
4
  class Ramper
5
+ VERSION = "0.0.3"
6
+
2
7
  def self.version
3
- puts "0.0.1v"
4
- end
5
-
6
- def self.execute(command)
7
- puts "#{command}"
8
- puts `#{command}`
8
+ puts VERSION
9
9
  end
10
10
 
11
11
  def self.files_with_most_changes_help
12
12
  "Files with most changes"
13
13
  end
14
+
14
15
  def self.files_with_most_changes(n)
15
- n = n+1 # TODO Hack, Below returns n+1 lines
16
16
  # http://stackoverflow.com/questions/7686582/finding-most-changed-files-in-git
17
- execute("git log --pretty=format: --name-only | sort | uniq -c | sort -rg | head -#{n}")
17
+ `git log --pretty=format: --name-only | sed '/^$/d' | sort | uniq -c | sort -rg | head -#{n}`
18
18
  end
19
19
 
20
20
  def self.files_with_most_commit_help
21
21
  "Returns top n files with most commit"
22
22
  end
23
+
23
24
  def self.files_with_most_commit(n)
24
25
  # http://stackoverflow.com/questions/5669621/git-find-out-which-files-have-had-the-most-commits
25
- puts `git rev-list --objects --all | awk '$2' | sort -k2 | uniq -cf1 | sort -rn |
26
+ `git rev-list --objects --all | awk '$2' | sort -k2 | uniq -cf1 | sort -rn |
26
27
  while read frequency sample path
27
- do
28
+ do
28
29
  [ "blob" == "$(git cat-file -t $sample)" ] && echo -e "$frequency\t$path";
29
- done | head -n #{n}`
30
+ done | head -#{n}`.gsub(/^-e /, '') #there's a bug with bash adds -e to each line
31
+ end
32
+
33
+ def self.files_most_recent_help
34
+ "Returns the top n recently changed files"
35
+ end
36
+
37
+ def self.files_most_recent(n)
38
+ require 'time'
39
+ # http://serverfault.com/questions/401437/how-to-retrieve-the-last-modification-date-of-all-files-in-a-git-repository
40
+ `git ls-tree -r --name-only HEAD | while read filename; do
41
+ echo "$(git log -1 --format="%at" -- $filename) $filename"
42
+ done | sort -rg | head -#{n}`.gsub(/^(\d+) /) { |_| "#{Time.at($1.to_i).iso8601} " }
30
43
  end
31
44
 
32
45
  def self.stats_help
33
46
  "Executes rake stats"
34
47
  end
48
+
35
49
  def self.stats
36
- execute "rake stats"
50
+ require 'rake'
51
+ require 'code_statistics'
52
+
53
+ Rake::Task[:stats].execute
54
+ end
55
+
56
+ def self.author_summary_help
57
+ "Gives authorship summary. To figure out who to talk to."
58
+ end
59
+
60
+ def self.author_summary
61
+ # http://stackoverflow.com/questions/1265040/how-to-count-total-lines-changed-by-a-specific-author-in-a-git-repository
62
+ `git shortlog -sne --no-merges`
63
+ end
64
+
65
+ def self.flog_help
66
+ "Runs the flog metric on a file/dir. Higher numbers = more complex or painful code."
67
+ end
68
+
69
+ def self.flog(file)
70
+ `flog #{file}`
71
+ end
72
+
73
+ def self.flay_help
74
+ "Runs the flay tool on a file/dir. Reports similar blocks of code."
75
+ end
76
+
77
+ def self.flay(file)
78
+ `flay #{file}`
79
+ end
80
+
81
+ def self.dependency_in_help
82
+ "Displays classes that depend on the most other classes."
83
+ end
84
+
85
+ def self.dependency_in(n)
86
+ DependencyAnalyzer.new.get_in_stats n
87
+ end
88
+
89
+ def self.dependency_out_help
90
+ "Displays classes that are depended on by the most other classes."
91
+ end
92
+
93
+ def self.dependency_out(n)
94
+ DependencyAnalyzer.new.get_out_stats n
95
+ end
96
+
97
+ def self.file_metrics_help
98
+ "Computes metrics for a given file based on the flags given. Defaults to computing everything"
99
+ end
100
+
101
+ def self.file_metrics(file, options)
102
+ file_metric_calc = RamperFileMetrics.new(options)
103
+ puts file_metric_calc.process_file_format
104
+ puts file_metric_calc.process_file(file)
105
+ end
106
+
107
+ def self.batch_metrics_help
108
+ "Batch file metrics for input stream."
109
+ end
110
+
111
+ def self.batch_metrics(options)
112
+ file_metric_calc = RamperFileMetrics.new(options)
113
+ puts file_metric_calc.process_file_format
114
+ while (line=STDIN.gets)
115
+ puts file_metric_calc.process_file(line.chomp)
116
+ end
117
+ exit
118
+ end
119
+
120
+ def self.batch_from_most_list(options, most_function, most_param)
121
+ file_metric_calc = RamperFileMetrics.new(options)
122
+ puts file_metric_calc.process_file_format
123
+ pull_files_from_stats_list(most_function.call(most_param)).each do |line|
124
+ puts file_metric_calc.process_file(line)
125
+ end
126
+ exit
127
+ end
128
+
129
+ private
130
+
131
+ def self.pull_files_from_stats_list(list)
132
+ list.split("\n").map { |l| /\s(\S*?)$/.match(l) { |_| $1 } }
133
+ end
134
+
135
+ def self.tips_help
136
+ "Gives some tips on how to ramp up faster"
137
+ end
138
+
139
+ def self.tips
140
+ '######### Tips ########
141
+ # Talk to developer to understand overall architecture, block diagram, dependencies.
142
+ # Use pen and paper (or IDE) and draw UML diagrams like Class Diagram, Sequence Diagrams to understand structure.
143
+ # Follow Top Down Approach. Start from Top View. Then drill down to Mid View and then Low level view features.
144
+ # Build code, Run tests, Run Interface, Change something and see tests fail.
145
+ # Run code in a debugger to see the stack trace/code flow.
146
+ # Use "git grep" to search about git code base. More "git help grep".
147
+ # Jumping around definition and references in an IDE helps a lot.
148
+ # Write a glossary. It can cover class names, function names, datatype names, common prefixes
149
+ # and file names conventions. This can be contributed back to the project as documentation.
150
+ # Read the test suite. This will give you a better idea of what the library does.
151
+ # Use "git blame" to see when things have been changed.
152
+ ########################'
37
153
  end
38
154
  end
@@ -0,0 +1,103 @@
1
+ require 'flog_cli'
2
+
3
+ class RamperFileMetrics
4
+
5
+ def initialize(flags)
6
+ if flags.empty?
7
+ selected = Array.new(CSV_COLS.count, true)
8
+ else
9
+ selected = Array.new(CSV_COLS.count, false)
10
+ selected[0] = true
11
+ #TODO: use command line parser
12
+ #TODO: change array to hash
13
+ flags.each do |f|
14
+ case f
15
+ when '-a'
16
+ selected[3] = true
17
+ when '-c'
18
+ selected[2] = true
19
+ when '-f'
20
+ selected[4] = true
21
+ when '-l'
22
+ selected[1] = true
23
+ end
24
+ end
25
+ end
26
+
27
+ @csv_header = CSV_COLS.select.with_index { |_, ind| selected[ind] }
28
+ @selected_metrics = METRICS.select.with_index { |_, ind| selected[ind] }
29
+ end
30
+
31
+ def process_file_format
32
+ @csv_header.flatten.join(', ')
33
+ end
34
+
35
+ def process_file(file)
36
+ @selected_metrics.map.with_index do |m, ind|
37
+ begin
38
+ m.call(file)
39
+ rescue => e
40
+ Array.new(@csv_header[ind].count, "Error #{e.message}".gsub(",", ";"))
41
+ end
42
+ end.flatten.join(', ')
43
+ end
44
+
45
+ private
46
+
47
+ def self.start_end_dates_commits(file)
48
+ dates = `git log -- #{file} | grep 'Date: '`.split("\n")
49
+ start_date = DateTime.parse(dates.last.strip.gsub(/Date: /, ''))
50
+ end_date = DateTime.parse(dates.first.strip.gsub(/Date: /, ''))
51
+ num_commits = dates.count
52
+
53
+ [start_date, end_date, num_commits]
54
+ end
55
+
56
+ def self.lines_of_code(file)
57
+ `wc -l #{file}`.split(" ").first.strip
58
+ end
59
+
60
+ def self.get_git_author_stats(file)
61
+ `git log --pretty=short --no-merges -- #{file} | git shortlog -sne`.split("\n")
62
+ end
63
+
64
+ def self.author_stats(file)
65
+ authors = get_git_author_stats(file)
66
+ author_table = authors.map { |line| /\s+(\d+)\t(.*) <(.*)>/.match(line) { |_| { :count => $1.to_i, :name => $2, :email => $3 } } }
67
+ unique_email_table = combine_authors(author_table, :email)
68
+ unique_table = combine_authors(unique_email_table, :name)
69
+ num_authors = unique_table.count
70
+ top_author = unique_table.max { |a, b| a[:count] <=> b[:count] }
71
+ top_author = "#{top_author[:name]} <#{top_author[:email]}>"
72
+
73
+ [top_author, num_authors]
74
+ end
75
+
76
+ def self.combine_authors(original_table, combine_key)
77
+ other_key = combine_key == :name ? :email : :name
78
+ result_map = Hash.new { |h, k| h[k]=[] }
79
+ original_table.each { |row| result_map[row[combine_key]].push(row.reject { |k, _| k==combine_key }) }
80
+ result_map.map { |key, val| { :count => val.inject(0) { |tot_count, x| tot_count + x[:count] },
81
+ combine_key => key,
82
+ other_key => val.max { |a, b| a[:count] <=> b[:count] }[other_key] } }
83
+ end
84
+
85
+ def self.flog_file(file)
86
+ if /.*\.rb/.match(file)
87
+ flogger = FlogCLI.new
88
+ flogger.flog(file)
89
+ flog_tot = flogger.total_score.round(2)
90
+ flog_avg = flogger.average.round(2)
91
+
92
+ [flog_tot, flog_avg]
93
+ else
94
+ Array.new(2, "N/A")
95
+ end
96
+ end
97
+
98
+ # self.method blows up unless it is after the functions are defined
99
+ CSV_COLS = ['File', 'LOC', ['First edit', 'Most recent edit', '# of commits'],
100
+ ['Top author', '# of authors'], ['Flog score', 'Flog/method average']]
101
+ METRICS = [Proc.new { |x| x }, self.method(:lines_of_code), self.method(:start_end_dates_commits),
102
+ self.method(:author_stats), self.method(:flog_file)]
103
+ end
@@ -0,0 +1,24 @@
1
+ $:.unshift File.expand_path('../lib', __FILE__)
2
+ require 'ramper'
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = 'ramper'
6
+ s.version = Ramper::VERSION
7
+ s.date = '2015-07-20'
8
+ s.summary = "ramper!"
9
+ s.description = "Ramp Up!"
10
+ s.authors = ["Ankush Raina"]
11
+ s.email = 'araina@groupon.com'
12
+ s.files = `git ls-files -z`.split("\x0")
13
+ s.require_paths = ["lib"]
14
+ s.homepage = 'http://rubygems.org/gems/ramper'
15
+ s.license = 'Groupon Inc'
16
+ s.executables << 'ramper'
17
+
18
+ s.add_runtime_dependency "flog", ["4.3.2"]
19
+ s.add_runtime_dependency "flay", ["2.6.1"]
20
+ s.add_runtime_dependency "courgette", ["0.3.0"]
21
+ s.add_runtime_dependency "code_statistics", ["0.2.13"]
22
+
23
+ s.add_development_dependency "rspec", ["3.3.0"]
24
+ end
@@ -0,0 +1,56 @@
1
+ require 'rspec'
2
+ require 'ramper_file_metrics'
3
+
4
+ describe 'RamperFileMetrics' do
5
+
6
+ context '.combine_authors' do
7
+ it 'should return the same table if it has no dupes in the given field: email' do
8
+ orig = [{ :count => 2, :name => 'name', :email => 'email1' },
9
+ { :count => 2, :name => 'name', :email => 'email2' },
10
+ { :count => 2, :name => 'name', :email => 'email3' }]
11
+ RamperFileMetrics.combine_authors(orig, :email).should == orig
12
+ end
13
+ it 'should return the same table if it has no dupes in the given field: name' do
14
+ orig = [{ :count => 2, :name => 'name1', :email => 'email' },
15
+ { :count => 2, :name => 'name2', :email => 'email' },
16
+ { :count => 2, :name => 'name3', :email => 'email' }]
17
+ RamperFileMetrics.combine_authors(orig, :name).should == orig
18
+ end
19
+
20
+ it 'should combine elements if it has dupes in the given field: email' do
21
+ orig = [{ :count => 1, :name => 'name1', :email => 'email' },
22
+ { :count => 2, :name => 'name2', :email => 'email' },
23
+ { :count => 3, :name => 'name3', :email => 'email' }]
24
+ new = [{ :count => 6, :name => 'name3', :email => 'email' }]
25
+ RamperFileMetrics.combine_authors(orig, :email).should == new
26
+ end
27
+
28
+ it 'should combine elements if it has dupes in the given field: name' do
29
+ orig = [{ :count => 1, :name => 'name', :email => 'email1' },
30
+ { :count => 2, :name => 'name', :email => 'email2' },
31
+ { :count => 3, :name => 'name', :email => 'email3' }]
32
+ new = [{ :count => 6, :name => 'name', :email => 'email3' }]
33
+ RamperFileMetrics.combine_authors(orig, :name).should == new
34
+ end
35
+ end
36
+
37
+ context '.author_stats' do
38
+
39
+ it 'should have resolved duplicates in either field' do
40
+ RamperFileMetrics.stub(:get_git_author_stats).and_return([" 8 j1 <j>",
41
+ " 5 a <a1>",
42
+ " 3 a <a2>",
43
+ " 1 j2 <j>"])
44
+ RamperFileMetrics.author_stats('').should == ["j1 <j>", 2]
45
+ end
46
+
47
+ it 'should have combined by email first' do
48
+ RamperFileMetrics.stub(:get_git_author_stats).and_return([" 8 j1 <j>",
49
+ " 5 a1 <a1>",
50
+ " 3 a2 <a2>",
51
+ " 4 a1 <a2>",
52
+ " 1 j2 <j>"])
53
+ RamperFileMetrics.author_stats('').should == ["a1 <a2>", 2]
54
+ end
55
+ end
56
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ramper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,8 +9,88 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-07-19 00:00:00.000000000 Z
13
- dependencies: []
12
+ date: 2015-07-20 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: flog
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - '='
20
+ - !ruby/object:Gem::Version
21
+ version: 4.3.2
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - '='
28
+ - !ruby/object:Gem::Version
29
+ version: 4.3.2
30
+ - !ruby/object:Gem::Dependency
31
+ name: flay
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - '='
36
+ - !ruby/object:Gem::Version
37
+ version: 2.6.1
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - '='
44
+ - !ruby/object:Gem::Version
45
+ version: 2.6.1
46
+ - !ruby/object:Gem::Dependency
47
+ name: courgette
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - '='
52
+ - !ruby/object:Gem::Version
53
+ version: 0.3.0
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 0.3.0
62
+ - !ruby/object:Gem::Dependency
63
+ name: code_statistics
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - '='
68
+ - !ruby/object:Gem::Version
69
+ version: 0.2.13
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - '='
76
+ - !ruby/object:Gem::Version
77
+ version: 0.2.13
78
+ - !ruby/object:Gem::Dependency
79
+ name: rspec
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - '='
84
+ - !ruby/object:Gem::Version
85
+ version: 3.3.0
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - '='
92
+ - !ruby/object:Gem::Version
93
+ version: 3.3.0
14
94
  description: Ramp Up!
15
95
  email: araina@groupon.com
16
96
  executables:
@@ -18,8 +98,16 @@ executables:
18
98
  extensions: []
19
99
  extra_rdoc_files: []
20
100
  files:
21
- - lib/ramper.rb
101
+ - .gitignore
102
+ - Gemfile
103
+ - Gemfile.lock
104
+ - README.md
22
105
  - bin/ramper
106
+ - lib/dependency_analyzer.rb
107
+ - lib/ramper.rb
108
+ - lib/ramper_file_metrics.rb
109
+ - ramper.gemspec
110
+ - spec/ramper_file_metrics_spec.rb
23
111
  homepage: http://rubygems.org/gems/ramper
24
112
  licenses:
25
113
  - Groupon Inc