git-commits-analyzer 1.0.1 → 1.1.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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/git-commits-analyzer.rb +78 -6
  3. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 32b24ca5fb34f38bbbe7457470d6e0a1095170d2
4
- data.tar.gz: 3d70d001c83a376a0ab7bbddbfc2caf93e5f3d2b
3
+ metadata.gz: b3d25118787113278e054fb55fde763528447016
4
+ data.tar.gz: c318ffc90587c4409fbbc0adcf04877dda5beabf
5
5
  SHA512:
6
- metadata.gz: 510ec2f13df1fbf487830fb44df3f1762b38140caabe477a63661ba71451224de0f6c33c3d7b20be6c2c35921299e7a2fab789ea790b049abd488152d53cdc18
7
- data.tar.gz: b0b954e67fb375a60695a1240fc409002931531182ffa5707e95a54beb7cc7faeedb90a5f6a66b7114ede58fae23268fd72d6c233026d77f62b6df6dd982d8a9
6
+ metadata.gz: 547d7c8c36f0a7edc6ce5cd9acd85616e5024b51626506302294ee4d3c53e68aa9cad248fd2cdbe37854484d1e52c5409ed731bf7aaa2e690c9c2b3cc4a9b472
7
+ data.tar.gz: 1ed0646e196acf3bf0a52e21ab2cc947b79f4fd0e9e90fa3e9b52ea029e1e474563a37cf1de1167c94b7092ea8daf1d581d0ba5e2f1f6008df61a446b0340e9b
@@ -29,6 +29,9 @@ class GitCommitsAnalyzer
29
29
  # Public: Returns the tally of commits broken down by weekday and hour.
30
30
  attr_reader :commit_weekdays_hours
31
31
 
32
+ # Public: Returns the lines added/changed by month.
33
+ attr_reader :lines_by_month
34
+
32
35
  # Public: Initialize new GitParser object.
33
36
  #
34
37
  # logger - A logger object to display git errors/warnings.
@@ -51,6 +54,37 @@ class GitCommitsAnalyzer
51
54
  @commit_weekdays_hours[weekday][hour] = 0
52
55
  end
53
56
  end
57
+ @lines_by_month = {}
58
+ end
59
+
60
+ # Public: Determine if the file is a common library that shouldn't get
61
+ # counted towards contributions.
62
+ #
63
+ # filename - The name of the file to analyze.
64
+ #
65
+ # Returns a boolean indicating if the file is a common library.
66
+ #
67
+ def self.is_library(filename:)
68
+ case filename
69
+ when /jquery-ui-\d+\.\d+\.\d+\.custom(?:\.min)?\.js$/
70
+ return true
71
+ when /jquery-\d+\.\d+\.\d+(?:\.min)?\.js$/
72
+ return true
73
+ when /jquery\.datepick(?:\.min)?\.js$/
74
+ return true
75
+ when /chart\.min\.js$/
76
+ return true
77
+ when /jquery\.js$/
78
+ return true
79
+ when /jquery-loader\.js$/
80
+ return true
81
+ when /qunit\.js$/
82
+ return true
83
+ when /d3\.v3(?:\.min)?\.js$/
84
+ return true
85
+ else
86
+ return false
87
+ end
54
88
  end
55
89
 
56
90
  # Public: Determine the type of a file at the given revision of a repo.
@@ -158,12 +192,17 @@ class GitCommitsAnalyzer
158
192
  commit_weekday = commit_datetime.strftime('%a')
159
193
  @commit_weekdays_hours[commit_weekday][commit_hour] += 1
160
194
 
195
+ # Note: months are zero-padded to allow easy sorting, even if it's more
196
+ # work for formatting later on.
197
+ commit_month = commit.date.strftime("%Y-%m")
198
+
161
199
  # Parse diff and analyze patches to detect language.
162
200
  diff = git_repo.show(commit.sha)
163
201
  diff.encode!('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '')
164
202
 
165
203
  file_properties = git_repo.ls_tree(['-r', commit.sha])
166
204
 
205
+ languages_in_commit = {}
167
206
  patches = GitDiffParser.parse(diff)
168
207
  patches.each do |patch|
169
208
  # Skip submodules.
@@ -173,30 +212,45 @@ class GitCommitsAnalyzer
173
212
  next if file_properties['blob'].has_key?(patch.file) &&
174
213
  (file_properties['blob'][patch.file][:mode] == '120000')
175
214
 
215
+ # Skip libraries.
216
+ next if self.class.is_library(filename: patch.file)
217
+
176
218
  body = patch.instance_variable_get :@body
177
219
  language = self.class.determine_language(filename: patch.file, sha: commit.sha, git_repo: git_repo)
178
220
  next if language.nil?
179
221
  @lines_by_language[language] ||=
180
222
  {
181
223
  'added' => 0,
182
- 'deleted' => 0
224
+ 'deleted' => 0,
225
+ 'commits' => 0,
226
+ }
227
+ languages_in_commit[language] = true
228
+
229
+ @lines_by_month[commit_month] ||=
230
+ {
231
+ 'added' => 0,
232
+ 'deleted' => 0,
183
233
  }
184
234
 
185
235
  body.split(/\n/).each do |content|
186
236
  if (/^[+-]/.match(content) && !/^[+-]\s+$/.match(content))
187
237
  if (/^\+/.match(content))
188
238
  @lines_by_language[language]['added'] += 1
239
+ @lines_by_month[commit_month]['added'] += 1
189
240
  elsif (/^\-/.match(content))
190
241
  @lines_by_language[language]['deleted'] += 1
242
+ @lines_by_month[commit_month]['deleted'] += 1
191
243
  end
192
244
  end
193
245
  end
194
246
  end
195
247
 
248
+ languages_in_commit.keys.each do |language|
249
+ @lines_by_language[language]['commits'] += 1
250
+ end
251
+
196
252
  # Add to stats for monthly commit count.
197
- # Note: months are zero-padded to allow easy sorting, even if it's more
198
- # work for formatting later on.
199
- @commits_by_month[commit.date.strftime("%Y-%m")] += 1
253
+ @commits_by_month[commit_month] += 1
200
254
 
201
255
  # Add to stats for total commits count.
202
256
  @commits_total += 1
@@ -228,12 +282,29 @@ class GitCommitsAnalyzer
228
282
  #
229
283
  def to_json(pretty: true)
230
284
  formatted_commits_by_month = []
285
+ formatted_lines_by_month = []
231
286
  month_names = Date::ABBR_MONTHNAMES
232
287
  self.get_month_scale.each do |frame|
233
288
  display_key = month_names[frame[1]] + '-' + frame[0].to_s
234
289
  data_key = sprintf('%s-%02d', frame[0], frame[1])
290
+
235
291
  count = @commits_by_month[data_key]
236
- formatted_commits_by_month << { month: display_key, commits: count.to_i }
292
+ formatted_commits_by_month << {
293
+ month: display_key,
294
+ commits: count.to_i,
295
+ }
296
+
297
+ month_added_lines = 0
298
+ month_deleted_lines = 0
299
+ if @lines_by_month.key?(data_key)
300
+ month_added_lines = @lines_by_month[data_key]['added'].to_i
301
+ month_deleted_lines = @lines_by_month[data_key]['deleted'].to_i
302
+ end
303
+ formatted_lines_by_month << {
304
+ month: display_key,
305
+ added: month_added_lines,
306
+ deleted: month_deleted_lines,
307
+ }
237
308
  end
238
309
 
239
310
  data =
@@ -243,7 +314,8 @@ class GitCommitsAnalyzer
243
314
  commits_by_hour: @commit_hours,
244
315
  commits_by_day: @commit_days,
245
316
  commit_by_weekday_hour: @commit_weekdays_hours,
246
- lines_by_language: @lines_by_language
317
+ lines_by_language: @lines_by_language,
318
+ lines_by_month: formatted_lines_by_month,
247
319
  }
248
320
 
249
321
  if pretty
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: git-commits-analyzer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Guillaume Aubert
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-20 00:00:00.000000000 Z
11
+ date: 2016-04-16 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Parse git repos and collect commit statistics/data for a given author.
14
14
  email: aubertg@cpan.org
@@ -22,7 +22,7 @@ files:
22
22
  - lib/git-commits-analyzer/utils.rb
23
23
  homepage: http://rubygems.org/gems/
24
24
  licenses:
25
- - GPLv3
25
+ - MIT
26
26
  metadata: {}
27
27
  post_install_message:
28
28
  rdoc_options: []