git-age 0.1.3 → 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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data/Gemfile.lock +1 -1
- data/README.md +20 -0
- data/bin/git-age +20 -0
- data/lib/git/age/graph_cli.rb +4 -2
- data/lib/git/age/main.rb +40 -15
- data/lib/git/age/options.rb +4 -1
- data/lib/git/age/stats.rb +14 -2
- data/lib/git/age/version.rb +1 -1
- data.tar.gz.sig +0 -0
- metadata +6 -6
- metadata.gz.sig +0 -0
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 3ec06da504e9bb782269c3fdbad5e0eb887a935c06557f3ec0b0b2e104898e1e
         | 
| 4 | 
            +
              data.tar.gz: f606f81e71b79085eb7d6977236311e7f13b50b51118bb9d97dec35e75f15122
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: '09a406545ef14ce5a469b949648049cdade634333f2ca49868580dbd058e554dddf48031130800c90b27879f19fcdfb8681d93104d86a8ed9f605487ab6ecfbf'
         | 
| 7 | 
            +
              data.tar.gz: 6fdbc40ef845a5368420d6d4608268bc920f74a81c23a2ad0a25ac1acf59b88f7393f54d46d5adf8ded4dba7b23c62697c905a45ac6b055658437c8ca3699ee8
         | 
    
        checksums.yaml.gz.sig
    CHANGED
    
    | Binary file | 
    
        data/Gemfile.lock
    CHANGED
    
    
    
        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,25 @@ 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`).
         | 
| 43 63 |  | 
| 44 64 | 
             
            Example image:
         | 
| 45 65 |  | 
    
        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/lib/git/age/graph_cli.rb
    CHANGED
    
    | @@ -9,10 +9,12 @@ 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}  | 
| 15 | 
            -
                     | 
| 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 20 | 
             
                  end
         | 
    
        data/lib/git/age/main.rb
    CHANGED
    
    | @@ -9,9 +9,14 @@ module Git | |
| 9 9 | 
             
                  def initialize
         | 
| 10 10 | 
             
                    STDOUT.puts "Waiting, analysing your repository ..."
         | 
| 11 11 |  | 
| 12 | 
            -
                    @dates   = Hash.new | 
| 13 | 
            -
                    @files   =  | 
| 12 | 
            +
                    @dates   = Hash.new { |hash, key| hash[key] = { code: 0, test: 0 } }
         | 
| 13 | 
            +
                    @files   = fill_files
         | 
| 14 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
         | 
| 15 20 | 
             
                  end
         | 
| 16 21 |  | 
| 17 22 | 
             
                  def run
         | 
| @@ -22,10 +27,19 @@ module Git | |
| 22 27 | 
             
                    show_stats
         | 
| 23 28 | 
             
                  rescue => e
         | 
| 24 29 | 
             
                    STDERR.puts "Error: #{e}"
         | 
| 30 | 
            +
                    puts e.backtrace
         | 
| 25 31 | 
             
                  end
         | 
| 26 32 |  | 
| 27 33 | 
             
                  private
         | 
| 28 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 | 
            +
             | 
| 29 43 | 
             
                  def read_files
         | 
| 30 44 | 
             
                    cnt     = 0
         | 
| 31 45 | 
             
                    total   = @files.size
         | 
| @@ -44,12 +58,14 @@ module Git | |
| 44 58 | 
             
                          matches = line.match(/[\w^]+\s\([\w\s]+(?<date>\d{4}-\d{2})-\d{2}/)
         | 
| 45 59 | 
             
                          next unless matches
         | 
| 46 60 |  | 
| 47 | 
            -
                           | 
| 61 | 
            +
                          type = file_type(file)
         | 
| 62 | 
            +
                          mapfile << "#{file}[#{type}]: #{line}\n" if mapfile
         | 
| 48 63 |  | 
| 49 | 
            -
                          @dates[matches[:date]] += 1
         | 
| 64 | 
            +
                          @dates[matches[:date]][:test] += 1 if type == :t
         | 
| 65 | 
            +
                          @dates[matches[:date]][:code] += 1 if type == :c
         | 
| 50 66 | 
             
                        end
         | 
| 51 | 
            -
                      rescue =>  | 
| 52 | 
            -
                        print "Error on file: #{file}\r"
         | 
| 67 | 
            +
                      rescue => exc
         | 
| 68 | 
            +
                        print "Error on file: #{file}: #{exc}\r"
         | 
| 53 69 | 
             
                      end
         | 
| 54 70 | 
             
                    end
         | 
| 55 71 |  | 
| @@ -64,13 +80,17 @@ module Git | |
| 64 80 |  | 
| 65 81 | 
             
                  def create_csv
         | 
| 66 82 | 
             
                    output = Git::Age::Options.instance.output
         | 
| 67 | 
            -
                    STDOUT.puts "Creating CSV file #{output} ...".ljust(@winsize[1])
         | 
| 83 | 
            +
                    STDOUT.puts "Creating CSV file #{output} with #{@dates.size} lines ...".ljust(@winsize[1])
         | 
| 68 84 |  | 
| 69 85 | 
             
                    File.open(output, 'w') do |file|
         | 
| 70 | 
            -
                       | 
| 71 | 
            -
             | 
| 72 | 
            -
                       | 
| 73 | 
            -
             | 
| 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"
         | 
| 74 94 | 
             
                      end
         | 
| 75 95 | 
             
                    end
         | 
| 76 96 | 
             
                  rescue => e
         | 
| @@ -96,7 +116,7 @@ module Git | |
| 96 116 | 
             
                    processor.create(options.output)
         | 
| 97 117 | 
             
                  end
         | 
| 98 118 |  | 
| 99 | 
            -
                  def  | 
| 119 | 
            +
                  def fill_files
         | 
| 100 120 | 
             
                    branch = Git::Age::Options.instance.branch
         | 
| 101 121 | 
             
                    STDOUT.puts "Reading files info from #{branch} branch ..."
         | 
| 102 122 |  | 
| @@ -117,13 +137,18 @@ module Git | |
| 117 137 | 
             
                    stats  = Git::Age::Stats.new(self)
         | 
| 118 138 | 
             
                    first  = Date.parse(stats.first_commit)
         | 
| 119 139 | 
             
                    last   = Date.parse(stats.last_commit)
         | 
| 120 | 
            -
                    diff   = (last - first).to_i
         | 
| 140 | 
            +
                    diff   = (last - first).to_i + 1
         | 
| 121 141 | 
             
                    ustats = stats.unchanged_stats
         | 
| 122 142 |  | 
| 123 143 | 
             
                    puts "First commit in: #{first}"
         | 
| 124 144 | 
             
                    puts "Last  commit in: #{last}"
         | 
| 125 | 
            -
                    puts "Repository  | 
| 126 | 
            -
                    puts "Month with more lines unchanged: #{ustats[:bigger][:date]} (#{ustats[:bigger][:lines]} lines)"
         | 
| 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
         | 
| 127 152 | 
             
                  end
         | 
| 128 153 | 
             
                end
         | 
| 129 154 | 
             
              end
         | 
    
        data/lib/git/age/options.rb
    CHANGED
    
    | @@ -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
         | 
    
        data/lib/git/age/stats.rb
    CHANGED
    
    | @@ -14,8 +14,20 @@ module Git | |
| 14 14 | 
             
                  end
         | 
| 15 15 |  | 
| 16 16 | 
             
                  def unchanged_stats
         | 
| 17 | 
            -
                    max = @data.dates.max_by { |key, value| value }
         | 
| 18 | 
            -
                    { bigger: { date: max[0], lines: max[1] } }
         | 
| 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 }
         | 
| 19 31 | 
             
                  end
         | 
| 20 32 |  | 
| 21 33 | 
             
                  private
         | 
    
        data/lib/git/age/version.rb
    CHANGED
    
    
    
        data.tar.gz.sig
    CHANGED
    
    | Binary file | 
    
        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. | 
| 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- | 
| 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
         | 
| @@ -70,7 +70,7 @@ licenses: [] | |
| 70 70 | 
             
            metadata:
         | 
| 71 71 | 
             
              homepage_uri: https://github.com/taq/git-age
         | 
| 72 72 | 
             
              source_code_uri: https://github.com/taq/git-age
         | 
| 73 | 
            -
            post_install_message: | 
| 73 | 
            +
            post_install_message:
         | 
| 74 74 | 
             
            rdoc_options: []
         | 
| 75 75 | 
             
            require_paths:
         | 
| 76 76 | 
             
            - lib
         | 
| @@ -85,8 +85,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 85 85 | 
             
                - !ruby/object:Gem::Version
         | 
| 86 86 | 
             
                  version: '0'
         | 
| 87 87 | 
             
            requirements: []
         | 
| 88 | 
            -
            rubygems_version: 3.3. | 
| 89 | 
            -
            signing_key: | 
| 88 | 
            +
            rubygems_version: 3.3.3
         | 
| 89 | 
            +
            signing_key:
         | 
| 90 90 | 
             
            specification_version: 4
         | 
| 91 91 | 
             
            summary: Create a CSV file with line year and month from your Git repository
         | 
| 92 92 | 
             
            test_files: []
         | 
    
        metadata.gz.sig
    CHANGED
    
    | Binary file |