git_fame 1.2.1 → 1.3.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: daa907cac405078c8f5abb7ed8fbfc88287a697c
4
- data.tar.gz: 47376faa0102f406245338f2b6bd06f39759db2d
3
+ metadata.gz: 04200942414c95c6ec6c73bd9c6274d974c4e4ab
4
+ data.tar.gz: 290528caaf2d7ea37a707177b1a4cfa54ffa3401
5
5
  SHA512:
6
- metadata.gz: be9bf2ff037c1d694a77b7f85cca6fac75f90d0e3020120283a03a0e0d39e987e20a7c545451f8b04a5ac9a86b8f00887fff9150b01ab816bd7d46eb0b530d5a
7
- data.tar.gz: 34aa7cf88a69a5547d5b790254f4567bc06b1071f066301285f19ec2353e4878de6bd708a9cc7281bd737341f99b6f1ad87f4207137a06a11ebf3ee6168abafe
6
+ metadata.gz: 0f9138e9bde7548b928b85adaaf6a45b2821e055c8f77058cdceb01065390abb3b661c2e9a2f7e6edd2add5f6dfe8a49ce18c6bff129cb54a26b51af9d67b7aa
7
+ data.tar.gz: 4d8c8f0d4545b5f189179f9fc30f05cfd3ef62f6e3f37405f2903ce4972fef5f0c0baf8154c0aa010175b0e81fb301db8312d4d971c278b8224d3f8834404750
data/README.md CHANGED
@@ -122,7 +122,7 @@ The list of authors may include what you perceive to be duplicate people. If a g
122
122
 
123
123
  ## Requirements
124
124
 
125
- *GitFame* is tested in *OS X 10.7.4* using Ruby *1.9.2*.
125
+ *GitFame* should work on all Unix based operating system with Git installed.
126
126
 
127
127
  ## License
128
128
 
@@ -28,7 +28,9 @@ Generates data like:
28
28
  gem.add_dependency("trollop")
29
29
  gem.add_dependency("hirb")
30
30
  gem.add_dependency("mimer_plus")
31
+ gem.add_dependency("string-scrub")
31
32
 
32
33
  gem.add_development_dependency("rspec")
34
+ gem.add_development_dependency("rake")
33
35
  gem.required_ruby_version = ">= 1.9.2"
34
36
  end
@@ -1,7 +1,9 @@
1
1
  module GitFame
2
2
  class Author
3
3
  include GitFame::Helper
4
- attr_accessor :name, :raw_files, :raw_commits, :raw_loc, :files_list, :file_type_counts
4
+ attr_accessor :name, :raw_files, :raw_commits,
5
+ :raw_loc, :files_list, :file_type_counts
6
+
5
7
  #
6
8
  # @args Hash
7
9
  #
@@ -36,6 +38,5 @@ module GitFame
36
38
  def method_missing(m, *args, &block)
37
39
  file_type_counts[m.to_s]
38
40
  end
39
-
40
41
  end
41
42
  end
@@ -1,3 +1,5 @@
1
+ require "string-scrub"
2
+
1
3
  module GitFame
2
4
  class Base
3
5
  include GitFame::Helper
@@ -6,7 +8,8 @@ module GitFame
6
8
  # @args[:repository] String Absolute path to git repository
7
9
  # @args[:sort] String What should #authors be sorted by?
8
10
  # @args[:bytype] Boolean Should counts be grouped by file extension?
9
- # @args[:exclude] String Comma-separated list of paths in the repo which should be excluded
11
+ # @args[:exclude] String Comma-separated list of paths in the repo
12
+ # which should be excluded
10
13
  #
11
14
  def initialize(args)
12
15
  @sort = "loc"
@@ -19,7 +22,7 @@ module GitFame
19
22
  args.keys.each do |name|
20
23
  instance_variable_set "@" + name.to_s, args[name]
21
24
  end
22
- convert_exclude_paths_to_array
25
+ @exclude = convert_exclude_paths_to_array
23
26
  end
24
27
 
25
28
  #
@@ -33,7 +36,10 @@ module GitFame
33
36
  puts "Total number of commits: #{number_with_delimiter(commits)}\n"
34
37
 
35
38
  fields = [:name, :loc, :commits, :files, :distribution]
36
- fields << populate.instance_variable_get("@file_extensions").uniq.sort if @bytype
39
+ if @bytype
40
+ fields << populate.instance_variable_get("@file_extensions").
41
+ uniq.sort
42
+ end
37
43
  table(authors, fields: fields.flatten)
38
44
  end
39
45
 
@@ -62,7 +68,8 @@ module GitFame
62
68
  # @return Fixnum Total number of lines
63
69
  #
64
70
  def loc
65
- populate.authors.inject(0){ |result, author| author.raw_loc + result }
71
+ populate.authors.
72
+ inject(0){ |result, author| author.raw_loc + result }
66
73
  end
67
74
 
68
75
  #
@@ -70,13 +77,17 @@ module GitFame
70
77
  #
71
78
  def authors
72
79
  authors = populate.instance_variable_get("@authors").values
73
- @sort ? authors.sort_by do |author|
74
- if @sort == "name"
75
- author.send(@sort)
76
- else
77
- -1 * author.send("raw_#{@sort}")
80
+ if @sort
81
+ authors.sort_by do |author|
82
+ if @sort == "name"
83
+ author.send(@sort)
84
+ else
85
+ -1 * author.send("raw_#{@sort}")
86
+ end
78
87
  end
79
- end : authors
88
+ else
89
+ authors
90
+ end
80
91
  end
81
92
 
82
93
  #
@@ -93,7 +104,7 @@ module GitFame
93
104
  #
94
105
  def execute(command)
95
106
  Dir.chdir(@repository) do
96
- return `#{command}`
107
+ return `#{command}`.scrub
97
108
  end
98
109
  end
99
110
 
@@ -122,27 +133,44 @@ module GitFame
122
133
  # @return GitFame
123
134
  #
124
135
  def populate
125
- @_pop ||= lambda {
136
+ @_populate ||= begin
126
137
  @files = execute("git ls-files").split("\n")
127
138
  @file_extensions = []
128
139
  remove_excluded_files
129
- progressbar = SilentProgressbar.new("Blame", @files.count, @progressbar)
140
+ progressbar = SilentProgressbar.new(
141
+ "Blame",
142
+ @files.count,
143
+ @progressbar
144
+ )
130
145
  blame_opts = @whitespace ? "-w" : ""
131
146
  @files.each do |file|
132
147
  progressbar.inc
133
148
  if @bytype
134
- file_extension = File.extname(file).sub(/\A\./,"")
149
+ file_extension = File.extname(file).gsub(/^\./, "")
135
150
  file_extension = "unknown" if file_extension.empty?
136
151
  end
137
- if type = Mimer.identify(File.join(@repository, file)) and not type.mime_type.match(/binary/)
138
- @file_extensions << file_extension # only count extensions that aren't binary!
139
- begin
140
- execute("git blame '#{file}' #{blame_opts} --line-porcelain").scan(/^author (.+)$/).each do |author|
141
- fetch(author.first).raw_loc += 1
142
- @file_authors[author.first][file] ||= 1
143
- fetch(author.first).file_type_counts[file_extension] += 1 if @bytype
144
- end
145
- rescue ArgumentError; end # Encoding error
152
+
153
+ unless type = Mimer.identify(File.join(@repository, file))
154
+ next
155
+ end
156
+
157
+ if type.binary?
158
+ next
159
+ end
160
+
161
+ # only count extensions that aren't binary
162
+ @file_extensions << file_extension
163
+
164
+ output = execute(
165
+ "git blame '#{file}' #{blame_opts} --line-porcelain"
166
+ )
167
+ output.scan(/^author (.+)$/).each do |author|
168
+ fetch(author.first).raw_loc += 1
169
+ @file_authors[author.first][file] ||= 1
170
+ if @bytype
171
+ fetch(author.first).
172
+ file_type_counts[file_extension] += 1
173
+ end
146
174
  end
147
175
  end
148
176
 
@@ -169,7 +197,7 @@ module GitFame
169
197
 
170
198
  progressbar.finish
171
199
 
172
- }.call
200
+ end
173
201
  return self
174
202
  end
175
203
 
@@ -177,7 +205,7 @@ module GitFame
177
205
  # Converts @exclude argument to an array and removes leading slash
178
206
  #
179
207
  def convert_exclude_paths_to_array
180
- @exclude = @exclude.split(",").map{|path| path.strip.sub(/\A\//, "") }
208
+ @exclude.split(",").map{|path| path.strip.sub(/\A\//, "") }
181
209
  end
182
210
 
183
211
  #
@@ -190,6 +218,5 @@ module GitFame
190
218
  path
191
219
  end.compact
192
220
  end
193
-
194
221
  end
195
222
  end
@@ -1,3 +1,3 @@
1
1
  module GitFame
2
- VERSION = "1.2.1"
2
+ VERSION = "1.3.0"
3
3
  end
@@ -60,23 +60,42 @@ describe GitFame::Base do
60
60
 
61
61
  describe "sort" do
62
62
  it "should be able to sort #authors by name" do
63
- authors = GitFame::Base.new({repository: @repository, sort: "name"}).authors
64
- authors.map(&:name).should eq(["7rans", "Linus Oleander", "Magnus Holm"])
63
+ authors = GitFame::Base.new({
64
+ repository: @repository,
65
+ sort: "name"
66
+ }).authors
67
+ authors.map(&:name).
68
+ should eq(["7rans", "Linus Oleander", "Magnus Holm"])
65
69
  end
66
70
 
67
71
  it "should be able to sort #authors by commits" do
68
- authors = GitFame::Base.new({repository: @repository, sort: "commits"}).authors
69
- authors.map(&:name).should eq(["Magnus Holm", "Linus Oleander", "7rans"])
72
+ authors = GitFame::Base.new({
73
+ repository: @repository,
74
+ sort: "commits"
75
+ }).authors
76
+ authors.map(&:name).
77
+ should eq(["Magnus Holm", "Linus Oleander", "7rans"])
70
78
  end
71
79
 
72
80
  it "should be able to sort #authors by files" do
73
- authors = GitFame::Base.new({repository: @repository, sort: "files"}).authors
74
- authors.map(&:name).should eq(["7rans", "Linus Oleander", "Magnus Holm"])
81
+ authors = GitFame::Base.new({
82
+ repository: @repository,
83
+ sort: "files"
84
+ }).authors
85
+ authors.map(&:name).
86
+ should eq(["7rans", "Linus Oleander", "Magnus Holm"])
75
87
  end
76
88
  end
77
89
 
78
90
  describe "#command_line_arguments" do
79
- let(:subject) { GitFame::Base.new({repository: @repository, exclude: "lib", bytype: true }) }
91
+ let(:subject) do
92
+ GitFame::Base.new({
93
+ repository: @repository,
94
+ exclude: "lib",
95
+ bytype: true
96
+ })
97
+ end
98
+
80
99
  it "should exclude the lib folder" do
81
100
  subject.file_list.include?("lib/gash.rb").should be_false
82
101
  end
@@ -105,7 +124,8 @@ describe GitFame::Base do
105
124
  end
106
125
 
107
126
  it "should know if a folder exists or not [absolute path]" do
108
- GitFame::Base.git_repository?("/f67c2bcbfcfa30fccb36f72dca22a817").should be_false
127
+ GitFame::Base.git_repository?("/f67c2bcbfcfa30fccb36f72dca22a817").
128
+ should be_false
109
129
  end
110
130
 
111
131
  it "should know if a folder is a git repository [relative path]" do
@@ -113,7 +133,8 @@ describe GitFame::Base do
113
133
  end
114
134
 
115
135
  it "should know if a folder exists or not [relative path]" do
116
- GitFame::Base.git_repository?("f67c2bcbfcfa30fccb36f72dca22a817").should be_false
136
+ GitFame::Base.git_repository?("f67c2bcbfcfa30fccb36f72dca22a817").
137
+ should be_false
117
138
  end
118
139
  end
119
140
  end
metadata CHANGED
@@ -1,83 +1,111 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: git_fame
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Linus Oleander
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-05 00:00:00.000000000 Z
11
+ date: 2015-04-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: progressbar
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: trollop
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: hirb
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: mimer_plus
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '>='
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: string-scrub
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: rspec
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - '>='
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
74
102
  - !ruby/object:Gem::Version
75
103
  version: '0'
76
104
  type: :development
77
105
  prerelease: false
78
106
  version_requirements: !ruby/object:Gem::Requirement
79
107
  requirements:
80
- - - '>='
108
+ - - ">="
81
109
  - !ruby/object:Gem::Version
82
110
  version: '0'
83
111
  description: Generates some awesome stats from git-blame
@@ -88,9 +116,9 @@ executables:
88
116
  extensions: []
89
117
  extra_rdoc_files: []
90
118
  files:
91
- - .gitignore
92
- - .gitmodules
93
- - .rspec
119
+ - ".gitignore"
120
+ - ".gitmodules"
121
+ - ".rspec"
94
122
  - Gemfile
95
123
  - LICENSE
96
124
  - README.md
@@ -114,17 +142,17 @@ require_paths:
114
142
  - lib
115
143
  required_ruby_version: !ruby/object:Gem::Requirement
116
144
  requirements:
117
- - - '>='
145
+ - - ">="
118
146
  - !ruby/object:Gem::Version
119
147
  version: 1.9.2
120
148
  required_rubygems_version: !ruby/object:Gem::Requirement
121
149
  requirements:
122
- - - '>='
150
+ - - ">="
123
151
  - !ruby/object:Gem::Version
124
152
  version: '0'
125
153
  requirements: []
126
154
  rubyforge_project:
127
- rubygems_version: 2.1.8
155
+ rubygems_version: 2.4.5
128
156
  signing_key:
129
157
  specification_version: 4
130
158
  summary: 'Generates some awesome stats from git-blame A Ruby wrapper for git-blame.