standup-summary 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 979f57f03c84372b58b54b504b364c89c414b4aef490e7449ffb02c82ae7e872
4
- data.tar.gz: aaf11a27ac9c84248b5f623b76aa1795463c7a50f65a2c3b5102f4ecbea55a03
3
+ metadata.gz: b970945c066ebf3e312ecb17bccda2d95021fd787c97754da829eba147640384
4
+ data.tar.gz: 459471c518743990bdf22aff76a2faf724774e2200bf976833c5e88883088d42
5
5
  SHA512:
6
- metadata.gz: 2c79d766c27a65802f3a6dd7d4eb8e06c8c13b971b5b7b561fbcfa4ca87b91bf8550edba96a0f27164152eb61a35de591cd99def23dda6d073c8febadd0a266a
7
- data.tar.gz: 6baf28b73b40018c85c4ae55e070df84dfba46b4b37db2724ad69860fa34a7155ee64aaad95667ac14f40cbb7dc8b5d3a348ff5947c519027cd27984777de785
6
+ metadata.gz: a4f52b705ecb0114b463e67cda70cea672a7e228195e96f47d26ff59afeded2d1ff72ff166c529f7baa45c3fc327663e3a36d2608d0ceb3689f3ee938cbbfc54
7
+ data.tar.gz: 2fc970d195220c923f57a5f41a4694d757fbdb69f34bbafdeb2519a746d1de0cc0873acb723c99666b6835b596dd220378e9caa5db02694a1e98c33b0a661479
data/.byebug_history ADDED
@@ -0,0 +1,11 @@
1
+ exit
2
+ n
3
+ c
4
+ exit
5
+ args
6
+ format
7
+ exit
8
+ e
9
+ n
10
+ c
11
+ path
data/Gemfile.lock ADDED
@@ -0,0 +1,35 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ standup-summary (0.2.0)
5
+ activesupport
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ activesupport (5.2.2)
11
+ concurrent-ruby (~> 1.0, >= 1.0.2)
12
+ i18n (>= 0.7, < 2)
13
+ minitest (~> 5.1)
14
+ tzinfo (~> 1.1)
15
+ byebug (10.0.2)
16
+ concurrent-ruby (1.1.3)
17
+ i18n (1.1.1)
18
+ concurrent-ruby (~> 1.0)
19
+ minitest (5.11.3)
20
+ rake (10.5.0)
21
+ thread_safe (0.3.6)
22
+ tzinfo (1.2.5)
23
+ thread_safe (~> 0.1)
24
+
25
+ PLATFORMS
26
+ ruby
27
+
28
+ DEPENDENCIES
29
+ bundler (~> 1.16)
30
+ byebug (~> 10.0)
31
+ rake (~> 10.0)
32
+ standup-summary!
33
+
34
+ BUNDLED WITH
35
+ 1.17.1
data/README.md CHANGED
@@ -1,35 +1,38 @@
1
- # StandupSummary
1
+ # standup-summary
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/standup_summary`. To experiment with that code, run `bin/console` for an interactive prompt.
4
-
5
- TODO: Delete this and the text above, and describe your gem
3
+ You know the awesome [git-standup](https://github.com/kamranahmedse/git-standup) right? That is heart of this gem.
4
+ Standup-Summary pulls all your nested git-standups from directory of choice (eg. work in my case) and shows you number of your commits in given time span and percentage of commits per directory.
6
5
 
7
6
  ## Installation
8
7
 
9
- Add this line to your application's Gemfile:
10
-
11
- ```ruby
12
- gem 'standup-summary'
13
- ```
14
-
15
- And then execute:
16
-
17
- $ bundle
18
-
19
- Or install it yourself as:
8
+ Just install gem to your global ruby version.
20
9
 
21
10
  $ gem install standup-summary
22
11
 
23
12
  ## Usage
24
-
25
- TODO: Write usage instructions here
13
+ Use `standup` in your command line with these options:
14
+
15
+ | Option | Description |
16
+ |-------------|:------------------------------------------------------------------:|
17
+ | -p, --path | Sets path to execute git-standup from, relative to your $HOME path |
18
+ | -t, --today | Use commits from today |
19
+ | -w, --week | Use commits from this week |
20
+ | -m, --month | Use commits from this month |
21
+ | -f, --diff | Analyze diffs instead of commits |
22
+ | -r, --recursive | When using -f go through folders recursively, use -l option to set limit|
23
+ | -l, --limit LIMIT| Set limit for options -r -f, defaults to 3|
26
24
 
27
25
  ## Development
28
26
 
29
- After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
27
+ After checking out the repo, run `bin/setup` to install dependencies.
30
28
 
31
29
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
30
 
31
+ ## Todo
32
+
33
+ - add option to analyze diffs
34
+ - support for ruby controll
35
+
33
36
  ## Contributing
34
37
 
35
38
  Bug reports and pull requests are welcome on GitHub at https://github.com/podruh/standup_summary. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
data/bin/standup CHANGED
File without changes
@@ -0,0 +1,114 @@
1
+ require 'find'
2
+
3
+ module StandupSummary
4
+ class DiffAnalyzer
5
+ STATS = %i[changed insertions deletions]
6
+ TEST = /\s?((?<changed>\d+) files changed)?,?\s((?<insertions>\d+) insertions\(\+\))?,?\s?((?<deletions>\d+) deletions\(\-\))?/
7
+
8
+ def initialize(path, options)
9
+ @path = path
10
+ @limit = options[:limit]
11
+ @use_recursive = options[:recursive]
12
+ @options = options
13
+ @results = { directories: [], changed: 0, insertions: 0, deletions: 0, length: 0 }
14
+ @author_name = `git config user.name`.gsub("\n", '')
15
+ end
16
+
17
+ def run!
18
+ if @use_recursive
19
+ run_recursive
20
+ else
21
+ run_shallow
22
+ end
23
+ print_results
24
+ end
25
+
26
+ def run_recursive
27
+ Find.find(@path) do |path|
28
+ Find.prune if level(path) >= @limit
29
+ Find.prune and next if File.basename(path)[0] == ?.
30
+ next unless File.directory? path
31
+ next unless File.directory? path + '/.git'
32
+ analyze_dir(path)
33
+ end
34
+ end
35
+
36
+ def run_shallow
37
+ Dir.foreach(@path) do |path|
38
+ next if File.basename(path)[0] == ?.
39
+ path = @path + '/' + path
40
+ next unless File.directory?(path)
41
+ next unless File.directory? path + '/.git'
42
+ analyze_dir(path)
43
+ end
44
+ end
45
+
46
+ def cmd
47
+ @cmd ||= if @options[:days].present?
48
+ "git log --shortstat --format= --committer=\"#{@author_name}\" --since=\"#{@options[:days]} days ago\""
49
+ else
50
+ "git log --shortstat --format= --committer=\"#{@author_name}\" --after=\"#{@options[:from]} 00:00\" --before=\"#{@options[:to]} 23:59\""
51
+ end
52
+ end
53
+
54
+ def analyze_dir(path)
55
+ project = path.gsub(@path, '')
56
+ project = project[1..-1] if project[0] == '/'
57
+ result = { path: project }
58
+ STATS.each { |s| result[s] = 0 }
59
+ Dir.chdir(path) do
60
+ out = `#{cmd}`
61
+ return if out.blank?
62
+ out.split("\n").each do |line|
63
+ regex = TEST.match line
64
+ STATS.each do |stat|
65
+ val = regex[stat].nil? ? 0 : regex[stat].to_i
66
+ result[stat] += val
67
+ @results[stat] += val
68
+ end
69
+ end
70
+ end
71
+ @results[:length] = project.length if @results[:length] < project.length
72
+ @results[:directories] << result
73
+ end
74
+
75
+ def level(sub_dir)
76
+ path = sub_dir.gsub @path, ''
77
+ path = path[1..-1] if path[0] == '/'
78
+ path.split('/').count
79
+ end
80
+
81
+ def print_header
82
+ puts "Standup Summary in #{@path}"
83
+ puts
84
+ header = 'Projects'.center(@results[:length] + 1) + ' '
85
+ STATS.each do |s|
86
+ length = @results[s].to_s.length + 10
87
+ header += "|#{s.to_s.capitalize.center(length)}"
88
+ end
89
+ del = ''
90
+ header.length.times { del += '-' }
91
+ puts '+' + del + '+'
92
+ puts '|' + header + '|'
93
+ puts '|' + del + '|'
94
+ '+' + del + '+'
95
+ end
96
+
97
+ def print_results
98
+ footer = print_header
99
+ format = "| %-#{@results[:length]}s "
100
+ STATS.each { |s| format += "|%#{@results[s].to_s.length + 1}d / %-6s" }
101
+ format += '|'
102
+ @results[:directories].each do |result|
103
+ args = [result[:path]]
104
+ STATS.each do |s|
105
+ args << result[s]
106
+ args << "#{(result[s] / @results[s].to_f * 100).round(1)}%"
107
+ end
108
+
109
+ puts sprintf(format, *args)
110
+ end
111
+ puts footer
112
+ end
113
+ end
114
+ end
@@ -1,3 +1,3 @@
1
1
  module StandupSummary
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -1,4 +1,5 @@
1
1
  require "standup-summary/version"
2
+ require "standup-summary/diff_analyzer"
2
3
  require 'optparse'
3
4
  require 'date'
4
5
  require 'active_support'
@@ -10,26 +11,56 @@ module StandupSummary
10
11
 
11
12
  def initialize
12
13
  @path = "#{ENV['HOME']}/"
13
- @time_span = :today
14
14
  @date = Date.current
15
- @args = "-A \"#{@date} 00:00\" -B \"#{@date} 23:59\""
15
+ @options = { path: "#{ENV['HOME']}/",
16
+ recursive: false,
17
+ limit: 3,
18
+ mode: :commits,
19
+ days: nil,
20
+ from: @date,
21
+ to: @date }
16
22
  parser = OptionParser.new do |opts|
17
23
  opts.banner = "Usage: standup / standup_summary [options]"
18
24
 
19
25
  opts.on('-p PATH', '--path PATH', String, "Where to scan stand-up (relative to your home directory)") do |path|
20
- @path += path
26
+ @options[:path] += path
27
+ end
28
+
29
+ opts.on('-d DAYS', '--days days', Integer, "Specify the number of days back to include, same as 'git standup -d', ignores any other time param") do |days|
30
+ @options[:days] = days
21
31
  end
22
32
 
23
33
  opts.on('-t', '--today', "Displays today standup") do
24
- @args = "-A \"#{@date} 00:00\" -B \"#{@date} 23:59\""
34
+ @options[:from] = @date
35
+ @options[:to] = @date
25
36
  end
26
37
 
27
38
  opts.on('-w', '--week', "Displays standup for this week") do
28
- @args = "-A \"#{@date.beginning_of_week} 00:00\" -B \"#{@date.beginning_of_week + 4} 23:59\""
39
+ @options[:from] = @date.beginning_of_week
40
+ @options[:to] = @date.beginning_of_week + 4
29
41
  end
30
42
 
31
43
  opts.on('-m', '--month', "Displays standup for this month") do
32
- @args = "-A \"#{@date.beginning_of_month} 00:00\" -B \"#{@date.end_of_month} 23:59\""
44
+ @options[:from] = @date.beginning_of_month
45
+ @options[:to] = @date.end_of_month
46
+
47
+ end
48
+
49
+ opts.on('-f', '--diff', "Analyze diffs instead of commits") do
50
+ @options[:mode] = :diffs
51
+ end
52
+
53
+ opts.on('-r', '--recursive', "When using -f go through folders recursively, use -l option to set limit") do
54
+ @options[:recursive] = true
55
+ end
56
+
57
+ opts.on('-v', '--version', "Print out version") do
58
+ puts "\nStandupSummary by David Podroužek \nversion: #{StandupSummary::VERSION}"
59
+ exit 0
60
+ end
61
+
62
+ opts.on('-l LIMIT', '--limit LIMIT', Integer, "Set limit for options -r -f defaults to 3") do |limit = 3|
63
+ @options[:limit] = limit
33
64
  end
34
65
 
35
66
  opts.on('-h', '--help', 'Displays Help') do
@@ -40,17 +71,33 @@ module StandupSummary
40
71
  parser.parse!
41
72
  end
42
73
 
74
+ # TODO:
75
+ # Use this example:
76
+ # $ git diff HEAD 'HEAD@{3 weeks ago}' --shortstat -b -w
77
+ # to go through each directory and analyze output "202 files changed, 401 insertions(+), 2959 deletions(-)"
78
+ # Preferably use threads to increase performance
79
+ # add option for shallow loop or deep with limit, default could be 10
43
80
  def run
44
- puts "Entering #{@path} ..."
81
+ if @options[:mode] == :diffs
82
+ DiffAnalyzer.new(@options[:path], @options).run!
83
+ return
84
+ end
85
+
86
+ if @options[:days].present?
87
+ @args = "-d #{@options[:days]}"
88
+ else
89
+ @args = "-A \"#{@options[:from]} 00:00\" -B \"#{@options[:to]} 23:59\""
90
+ end
91
+ puts "Entering #{@options[:path]} ..."
45
92
 
46
- Dir.chdir(@path) do
93
+ Dir.chdir(@options[:path]) do
47
94
  cmd = "git standup -s #{@args}"
48
95
  puts "Running #{cmd}"
49
96
  puts
50
97
  out = `#{cmd}`
51
98
  # out.split(/\/home\/.*$/)
52
- total_count = `#{cmd} | grep -v #{@path}* -c`
53
- projects = `#{cmd} | grep #{@path}* --color=never`
99
+ total_count = `#{cmd} | grep -v #{@options[:path]}* -c`
100
+ projects = `#{cmd} | grep #{@options[:path]}* --color=never`
54
101
  projects = projects.split("\n")
55
102
  project_hash = {}
56
103
  commits_per_project = out.split(/\/home\/.*$/)
@@ -65,8 +112,8 @@ module StandupSummary
65
112
  puts "Total projects: #{projects.size}, total commits: #{total_count}"
66
113
  project_hash.each do |project, hash|
67
114
  project = +project
68
- project.slice!("#{@path}/")
69
- puts "#{project} commits: #{hash[:count]}/#{hash[:percentage].floor(2)}%"
115
+ project.slice!("#{@options[:path]}/")
116
+ puts "#{project}: #{hash[:count]} / #{hash[:percentage].floor(2)}%"
70
117
  end
71
118
  end
72
119
  end
@@ -24,5 +24,6 @@ Gem::Specification.new do |spec|
24
24
 
25
25
  spec.add_development_dependency 'bundler', '~> 1.16'
26
26
  spec.add_development_dependency 'rake', '~> 10.0'
27
+ spec.add_development_dependency 'byebug', '~> 10.0'
27
28
  spec.add_dependency 'activesupport'
28
29
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: standup-summary
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Podroužek
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-17 00:00:00.000000000 Z
11
+ date: 2018-12-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: byebug
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: activesupport
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -60,10 +74,12 @@ executables:
60
74
  extensions: []
61
75
  extra_rdoc_files: []
62
76
  files:
77
+ - ".byebug_history"
63
78
  - ".gitignore"
64
79
  - ".ruby-version"
65
80
  - CODE_OF_CONDUCT.md
66
81
  - Gemfile
82
+ - Gemfile.lock
67
83
  - LICENSE.txt
68
84
  - README.md
69
85
  - Rakefile
@@ -71,6 +87,7 @@ files:
71
87
  - bin/setup
72
88
  - bin/standup
73
89
  - lib/standup-summary.rb
90
+ - lib/standup-summary/diff_analyzer.rb
74
91
  - lib/standup-summary/version.rb
75
92
  - lib/standup_summary.rb
76
93
  - standup-summary.gemspec