git-age 0.1.2 → 0.1.4

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
  SHA256:
3
- metadata.gz: 9ca88ce726a22c3d328f0b6835f6a8d8bb4fe536f94758ac379affd74e60186c
4
- data.tar.gz: 967fdf60b74d412fc14018a53b90f448a616866a8d1bcbbe38a63d5864cb8fd2
3
+ metadata.gz: 3ec06da504e9bb782269c3fdbad5e0eb887a935c06557f3ec0b0b2e104898e1e
4
+ data.tar.gz: f606f81e71b79085eb7d6977236311e7f13b50b51118bb9d97dec35e75f15122
5
5
  SHA512:
6
- metadata.gz: a681fea9df900e90e6a24412fee946c04345871834a93d055837c3f8077521b9c9539c51255673892d4c1f9cb47c9da383c7a3e25a6a80b43aec5a9950dc0d25
7
- data.tar.gz: 888a69bac791c31113da473ce63ea3377ca139fc4db8961466f24094b04c7134562373439f548ad172f28dafec688ad00bb15754316d6c76dd6f616087917ad1
6
+ metadata.gz: '09a406545ef14ce5a469b949648049cdade634333f2ca49868580dbd058e554dddf48031130800c90b27879f19fcdfb8681d93104d86a8ed9f605487ab6ecfbf'
7
+ data.tar.gz: 6fdbc40ef845a5368420d6d4608268bc920f74a81c23a2ad0a25ac1acf59b88f7393f54d46d5adf8ded4dba7b23c62697c905a45ac6b055658437c8ca3699ee8
checksums.yaml.gz.sig CHANGED
Binary file
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- git-age (0.1.0)
4
+ git-age (0.1.4)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -29,6 +29,10 @@ Usage: git-age [options]
29
29
  -t, --title=TITLE Graphic title
30
30
  -x, --xtitle=TITLE X axis title
31
31
  -y, --ytitle=TITLE Y axis title
32
+ -c, --code=PATTERN Code dir pattern
33
+ -e, --test=PATTERN Test dir pattern
34
+ -y, --type=TYPE Graph type, default to bar
35
+ -v, --version Show version
32
36
  ```
33
37
 
34
38
  Example:
@@ -37,9 +41,29 @@ Example:
37
41
  $ git-age -o /tmp/data.csv -t 'Test project' -x 'Dates here' -y 'Lines here' -i /tmp/data.png
38
42
  ```
39
43
 
44
+ Sending a dir pattern as your test dir, creating a test column to compare:
45
+
46
+ ```
47
+ $ git-age -o /tmp/data.csv -t 'Test project' -x 'Dates here' -y 'Lines here' -i /tmp/data.png -e test
48
+ ```
49
+
50
+ If you're sending a test dir, it can be unfair if you don't also send a dir
51
+ pattern to your code dir, because all other files (configurations, temporary
52
+ files) will count as code and your code to test ratio will implode. So, sending
53
+ a code dir pattern:
54
+
55
+ ```
56
+ $ git-age -o /tmp/data.csv -t 'Test project' -x 'Dates here' -y 'Lines here' -i /tmp/data.png -e test -c app
57
+ ```
58
+
40
59
  Supported image processors:
41
60
 
42
61
  - [graph-cli](https://github.com/mcastorina/graph-cli)
62
+ Supports bar graphs (`-y bar`, default) and line graphs (`-y line`).
63
+
64
+ Example image:
65
+
66
+ ![graph-cli graph](https://github.com/taq/git-age/blob/master/graph-cli.png?raw=true)
43
67
 
44
68
  Default options are:
45
69
 
data/bin/git-age CHANGED
@@ -48,6 +48,26 @@ opts.on('-y', '--ytitle=TITLE', 'Y axis title') do |title|
48
48
  options.ytitle = title
49
49
  end
50
50
 
51
+ opts.on('-e', '--test=PATTERN', 'Test dir pattern') do |pattern|
52
+ STDOUT.puts "Using test dir pattern #{pattern}"
53
+ options.test = pattern
54
+ end
55
+
56
+ opts.on('-c', '--code=PATTERN', 'Code dir pattern') do |pattern|
57
+ STDOUT.puts "Using code dir pattern #{pattern}"
58
+ options.code = pattern
59
+ end
60
+
61
+ opts.on('-y', '--type=TYPE', 'Graph type, defaults to bar') do |type|
62
+ STDOUT.puts "Using graph type #{type}"
63
+ options.type = type
64
+ end
65
+
66
+ opts.on('-v', '--version', 'Show version') do
67
+ STDOUT.puts "Version #{Git::Age::VERSION}"
68
+ return
69
+ end
70
+
51
71
  opts.parse!
52
72
 
53
73
  Git::Age::Main.new.run
data/graph-cli.png ADDED
Binary file
@@ -9,13 +9,14 @@ module Git
9
9
 
10
10
  def self.create(input)
11
11
  options = Git::Age::Options.instance
12
+ legend = options.test ? 'code' : ''
13
+ type = options.type == 'bar' ? '--bar' : ''
12
14
  STDOUT.puts "Creating image #{options.image} ..."
13
15
 
14
- cmd = "graph #{input} --bar -o #{options.image} --title '#{options.title}' --xlabel='#{options.xtitle}' --ylabel='#{options.ytitle}' --xtick-fontsize 5 --time-format-output '%Y-%m-%d' --legend=''"
15
- rst = IO.popen(cmd) do |io|
16
+ cmd = "graph #{input} #{type} -o #{options.image} --title '#{options.title}' --xlabel='#{options.xtitle}' --ylabel='#{options.ytitle}' --xtick-fontsize 5 --time-format-output '%Y-%m-%d' --legend='#{legend}' 2> /dev/null"
17
+ IO.popen(cmd) do |io|
16
18
  io.read
17
19
  end
18
- STDOUT.puts rst
19
20
  end
20
21
  end
21
22
  end
data/lib/git/age/main.rb CHANGED
@@ -1,14 +1,22 @@
1
+ require 'date'
1
2
  require 'io/console'
2
3
 
3
4
  module Git
4
5
  module Age
5
6
  class Main
7
+ attr_reader :dates, :files
8
+
6
9
  def initialize
7
10
  STDOUT.puts "Waiting, analysing your repository ..."
8
11
 
9
- @dates = Hash.new(0)
10
- @files = files
12
+ @dates = Hash.new { |hash, key| hash[key] = { code: 0, test: 0 } }
13
+ @files = fill_files
11
14
  @winsize = IO.console.winsize
15
+ @test = Git::Age::Options.instance.test
16
+ @code = Git::Age::Options.instance.code
17
+
18
+ @test_regexp = @test ? %r{^#{@test}} : nil
19
+ @code_regexp = @code ? %r{^#{@code}} : nil
12
20
  end
13
21
 
14
22
  def run
@@ -16,18 +24,27 @@ module Git
16
24
  sort_dates
17
25
  create_csv
18
26
  create_image
27
+ show_stats
19
28
  rescue => e
20
29
  STDERR.puts "Error: #{e}"
30
+ puts e.backtrace
21
31
  end
22
32
 
23
33
  private
24
34
 
35
+ def file_type(file)
36
+ return :t if @test_regexp && file.match(@test_regexp)
37
+
38
+ return :c unless @code_regexp
39
+
40
+ @code_regexp && file.match(@code_regexp) ? :c : :u
41
+ end
42
+
25
43
  def read_files
26
44
  cnt = 0
27
45
  total = @files.size
28
46
  mapfile = Git::Age::Options.instance.map ? File.open("/tmp/git-age.map", 'w') : nil
29
47
 
30
-
31
48
  @files.each do |file|
32
49
  cnt += 1
33
50
  next unless text?(file)
@@ -41,12 +58,14 @@ module Git
41
58
  matches = line.match(/[\w^]+\s\([\w\s]+(?<date>\d{4}-\d{2})-\d{2}/)
42
59
  next unless matches
43
60
 
44
- mapfile << "#{file}: #{line}\n" if mapfile
61
+ type = file_type(file)
62
+ mapfile << "#{file}[#{type}]: #{line}\n" if mapfile
45
63
 
46
- @dates[matches[:date]] += 1
64
+ @dates[matches[:date]][:test] += 1 if type == :t
65
+ @dates[matches[:date]][:code] += 1 if type == :c
47
66
  end
48
- rescue => blame
49
- print "Error on file: #{file}\r"
67
+ rescue => exc
68
+ print "Error on file: #{file}: #{exc}\r"
50
69
  end
51
70
  end
52
71
 
@@ -61,13 +80,17 @@ module Git
61
80
 
62
81
  def create_csv
63
82
  output = Git::Age::Options.instance.output
64
- STDOUT.puts "Creating CSV file #{output} ...".ljust(@winsize[1])
83
+ STDOUT.puts "Creating CSV file #{output} with #{@dates.size} lines ...".ljust(@winsize[1])
65
84
 
66
85
  File.open(output, 'w') do |file|
67
- file << "\"date\",\"lines\"\n"
68
-
69
- @dates.each do |key, value|
70
- file << "\"#{key}\",#{value}\n"
86
+ header = "\"date\",\"code\""
87
+ header << ",\"test\"" if @test
88
+ file << "#{header}\n"
89
+
90
+ @dates.each do |key, data|
91
+ line = "\"#{key}\",#{data[:code]}"
92
+ line << ",#{data[:test]}" if @test
93
+ file << "#{line}\n"
71
94
  end
72
95
  end
73
96
  rescue => e
@@ -93,7 +116,7 @@ module Git
93
116
  processor.create(options.output)
94
117
  end
95
118
 
96
- def files
119
+ def fill_files
97
120
  branch = Git::Age::Options.instance.branch
98
121
  STDOUT.puts "Reading files info from #{branch} branch ..."
99
122
 
@@ -109,6 +132,24 @@ module Git
109
132
  io.read
110
133
  end.match?(/\Atext/)
111
134
  end
135
+
136
+ def show_stats
137
+ stats = Git::Age::Stats.new(self)
138
+ first = Date.parse(stats.first_commit)
139
+ last = Date.parse(stats.last_commit)
140
+ diff = (last - first).to_i + 1
141
+ ustats = stats.unchanged_stats
142
+
143
+ puts "First commit in: #{first}"
144
+ puts "Last commit in: #{last}"
145
+ puts "Repository has #{diff} days with commits"
146
+ puts "Month with more code lines unchanged: #{ustats[:bigger][:date]} (#{ustats[:bigger][:lines]} lines)"
147
+
148
+ if @test_regexp && @code_regexp
149
+ ratio = stats.code_to_test_ratio
150
+ puts "Code to test ratio: 1:#{ratio[:ratio]} (#{ratio[:code]}/#{ratio[:test]})"
151
+ end
152
+ end
112
153
  end
113
154
  end
114
155
  end
@@ -4,7 +4,7 @@ module Git
4
4
  module Age
5
5
  class Options
6
6
  include Singleton
7
- attr_accessor :branch, :output, :title, :processor, :image, :xtitle, :ytitle, :map
7
+ attr_accessor :branch, :output, :title, :processor, :image, :xtitle, :ytitle, :map, :test, :code, :type
8
8
 
9
9
  def initialize
10
10
  @branch = 'master'
@@ -14,6 +14,9 @@ module Git
14
14
  @image = 'git-age.png'
15
15
  @xtitle = 'Dates'
16
16
  @ytitle = 'Lines'
17
+ @test = nil
18
+ @code = nil
19
+ @type = 'bar'
17
20
  @map = false
18
21
  end
19
22
  end
@@ -0,0 +1,44 @@
1
+ module Git
2
+ module Age
3
+ class Stats
4
+ def initialize(data)
5
+ @data = data
6
+ end
7
+
8
+ def first_commit
9
+ commit_date('--reverse')
10
+ end
11
+
12
+ def last_commit
13
+ commit_date
14
+ end
15
+
16
+ def unchanged_stats
17
+ max = @data.dates.max_by { |key, value| value[:code] }
18
+ { bigger: { date: max[0], lines: max[1][:code] } }
19
+ end
20
+
21
+ def code_to_test_ratio
22
+ stats = @data.dates.reduce({code: 0, test: 0}) do |memo, data|
23
+ memo[:code] += data[1][:code]
24
+ memo[:test] += data[1][:test]
25
+ memo
26
+ end
27
+
28
+ { code: stats[:code], test: stats[:test], ratio: (stats[:test].to_f / stats[:code].to_f).round(2) }
29
+ rescue
30
+ { code: 0, test: 0, ratio: 0.0 }
31
+ end
32
+
33
+ private
34
+
35
+ def commit_date(order = nil)
36
+ cmd = "git log #{order} --pretty=format:%ad --date=short | head -n1"
37
+
38
+ IO.popen(cmd) do |io|
39
+ io.read.chomp.strip
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -1,5 +1,5 @@
1
1
  module Git
2
2
  module Age
3
- VERSION = "0.1.2"
3
+ VERSION = "0.1.4"
4
4
  end
5
5
  end
data/lib/git/age.rb CHANGED
@@ -1,3 +1,4 @@
1
1
  require_relative 'age/main'
2
2
  require_relative 'age/options'
3
+ require_relative 'age/stats'
3
4
  require_relative 'age/graph_cli'
data.tar.gz.sig CHANGED
@@ -1,4 +1,2 @@
1
- ����G�aX)�_�L�Gڣb�qx�|�y��gK��,K��v�LJ.��D9�|c� V9��u�/��RY���w�e2���?̓o��5�,����e-U����*�MVXe��y�z�yr!��������}��Bc��Ao��# IpٽcZ$K�X��=����T��O]�e(�O��
2
- }j��7���V]p�*��Pr�$�Y茱�;���=^4~$#}b<L����
3
- v��wG��Y^�CT<_�v�(q����8w9p�ٞ�����1�A�IFF#j�7Qh����(�Ll�&�k��
4
- ��Im�J��E;s��4%/4������敃�M�˘ ]��O��+y�b�[p��`�
1
+ M��Ŏ���;u��r���ࡅ��Tߞ>��$J^���D��!�d?���z"V@@Pd�����z
2
+ ���wڢ�5�"��KONOA1�Q �(,�C ��OF�ߴ�����3i���_������y[ԈrP��1`tH� �M#g�|�'8���+�I���!a��,�Wg�Z����F�'���3���\c�n$��
metadata CHANGED
@@ -1,11 +1,11 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: git-age
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eustaquio Rangel
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain:
11
11
  - |
@@ -36,7 +36,7 @@ cert_chain:
36
36
  7NRJmY9c84Zb3sCf0DV6UH+d2id9Dndp9ewchgDOSwGznt+oJmjDFZ9gYd8IP2Ol
37
37
  1eLrW8x4LHV+EVEIaiVTvmKt
38
38
  -----END CERTIFICATE-----
39
- date: 2022-08-25 00:00:00.000000000 Z
39
+ date: 2022-12-22 00:00:00.000000000 Z
40
40
  dependencies: []
41
41
  description: Check all the repository files lines dates and group it by year and month,
42
42
  allowing check how old code is still in use
@@ -58,17 +58,19 @@ files:
58
58
  - bin/setup
59
59
  - gem-public_cert.pem
60
60
  - git-age.gemspec
61
+ - graph-cli.png
61
62
  - lib/git/age.rb
62
63
  - lib/git/age/graph_cli.rb
63
64
  - lib/git/age/main.rb
64
65
  - lib/git/age/options.rb
66
+ - lib/git/age/stats.rb
65
67
  - lib/git/age/version.rb
66
68
  homepage: https://github.com/taq/git-age
67
69
  licenses: []
68
70
  metadata:
69
71
  homepage_uri: https://github.com/taq/git-age
70
72
  source_code_uri: https://github.com/taq/git-age
71
- post_install_message:
73
+ post_install_message:
72
74
  rdoc_options: []
73
75
  require_paths:
74
76
  - lib
@@ -83,8 +85,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
83
85
  - !ruby/object:Gem::Version
84
86
  version: '0'
85
87
  requirements: []
86
- rubygems_version: 3.3.7
87
- signing_key:
88
+ rubygems_version: 3.3.3
89
+ signing_key:
88
90
  specification_version: 4
89
91
  summary: Create a CSV file with line year and month from your Git repository
90
92
  test_files: []
metadata.gz.sig CHANGED
Binary file