stefon 0.0.2 → 0.0.3

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,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- OWNhNzAwM2UyYWVmNDA5NGE4MTEwZjAyMTYwODFmOGM1MWEwZjFlOQ==
5
- data.tar.gz: !binary |-
6
- NTJmYzhhZmE5NGQxYjllMmY0ZmQzM2U3OTMzOGM0ZTBjMGQ3MjlkNA==
2
+ SHA1:
3
+ metadata.gz: 99ed35b6e8b0b48f9ba4059038361a137926a1c3
4
+ data.tar.gz: 3bcab6111636a36d3fd7436cf4f777f4cfc63de7
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- NjZmNTgyNzY0ZGZjMjRlYmJiZTA5ODk1ODAxMTk4MTI3ZmVlMWY0N2I1OTAz
10
- M2Y2NDg1OTNjNDM3MTM2YjlkZDYzYTgzZWU5NzdmNmRiZjFhOTAxOWJjMjBl
11
- MDc0MGY3OTNjN2FmOWNhZWE3ZGM4MzgwZmZhMzM2OThjNTFhNWE=
12
- data.tar.gz: !binary |-
13
- NGE4MGQ4NWU1ODA2ZTQxOTExNzZhNjIxYTM0MTY3YTI2ODAyNGNiZjQwZDk2
14
- ZDY4OWNhYWNkNDJiZDY4NGQ2ZTNkYTBjMWQyNDY0MTc0MTcxZTYxYmExYmUy
15
- YTJmZjJlNGZkMzA3YTQ4NmMyMWUxOTE0ZTY3MjRlNTE1NzQxOTA=
6
+ metadata.gz: 40eca70e12bc892bbcee99cc785d0bb15171216902e3e5d5d62e3eb04f256a8e6eb96c628fd80a1f31dd2322f4bc4a4eb08491be834b85773b314bf05bd60cde
7
+ data.tar.gz: 43a61da24cd1a4c433eadf84d4a1e4d17fee58527b7a888e6d5cd735fa962164c01c31eea3e443c750f2b02eabda70b75e6edc1b8689f8ed3f1c62dac1affb28
data/README.md CHANGED
@@ -52,7 +52,7 @@ which is identical to `stefon -f`, to see something like:
52
52
 
53
53
 
54
54
  ## Todos / Comming improvements
55
- * give identity of predominant author of a file you have deleted
55
+ * use rugged instead of grit for ruby 2 support
56
56
  * use Github API to get a list of contributors for a project (and filter suggestions)
57
57
  * loading user preferences (list of users to exclude) - maybe with dotfiles instead of yml files
58
58
  * handle errors from surveryors
data/bin/stefon CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  # encoding: utf-8
3
3
 
4
- if RUBY_VERSION >= '1.9.2' && RUBY_VERSION < '2.0.0'
4
+ if RUBY_VERSION >= '1.9.2'
5
5
  $LOAD_PATH.unshift(File.dirname(File.realpath(__FILE__)) + '/../lib')
6
6
 
7
7
  # test for presence of sed dependency
@@ -23,12 +23,12 @@ if RUBY_VERSION >= '1.9.2' && RUBY_VERSION < '2.0.0'
23
23
  result = cli.run(opts)
24
24
  end
25
25
 
26
- puts "Finished in #{time} seconds"
27
- header = 'Stefon recommends that you ask for a code review from:'
26
+ puts "Stefon finished in #{time} seconds"
27
+ header = 'The hottest new people to ask for a code review from are:'
28
28
  puts header unless opts[:full_report]
29
29
  puts result
30
30
  exit(0)
31
31
  else
32
- puts 'Stefon supports only Ruby versions 1.9.X where X >= 2'
32
+ puts 'Stefon only supports Ruby versions 1.9.2 and above'
33
33
  exit(-1)
34
34
  end
@@ -13,6 +13,7 @@ module Stefon
13
13
 
14
14
  # This module holds custom behavior for dealing with the gem trollop
15
15
  module Options
16
+ # rubocop:disable MethodLength
16
17
  def self.get
17
18
  proc do
18
19
  version "stefon #{Stefon::VERSION} (c) 2014 Ilya Kavalerov"
@@ -20,18 +21,24 @@ module Stefon
20
21
  Stefon is a utilty that recommends who to ask for a code review.
21
22
  He lets you know whose code you are affecting the most.
22
23
 
24
+ Run Stefon before a commit, maybe as a pre-commit hook.
25
+
23
26
  Usage:
24
27
  stefon [options]
25
28
  where [options] are:
26
29
  EOS
27
-
28
- opt :limit, 'Limit the number of people that stephon suggests sending ' +
29
- 'a code review to',
30
- default: 4, short: '-l'
31
- opt :full_report, "Boolean for whether or not to include information " +
32
- "about how you affected someone's code",
33
- default: false, short: '-f'
30
+ opt :limit,
31
+ 'Limit the number of people that stephon suggests ' +
32
+ 'sending a code review to',
33
+ default: 4,
34
+ short: '-l'
35
+ opt :full_report,
36
+ 'Boolean for whether or not to include ' +
37
+ "information about how you affected someone's code",
38
+ default: false,
39
+ short: '-f'
34
40
  end
35
41
  end
42
+ # rubocop:enable MethodLength
36
43
  end
37
44
  end
@@ -18,7 +18,7 @@ module Stefon
18
18
  end
19
19
 
20
20
  def score_added_files
21
- if (num_added_files = @@grit.repo.status.added.count) > 0
21
+ if (num_added_files = @grit.repo.status.added.count) > 0
22
22
  @scores[GitUtil.top_commiter] += num_added_files
23
23
  end
24
24
  @scores
@@ -21,9 +21,8 @@ module Stefon
21
21
  def score_added_lines
22
22
  # give credit to the most frequent commiter in the file
23
23
  added_lines_by_file.each_pair do |filename, numlines|
24
- blame = @@grit.blame_for(filename)
25
- top_author = @@grit.file_valid_top_author(blame, filename)
26
- # multiplied by the number of lines that are added in the staged commit
24
+ blame = @grit.blame_for(filename)
25
+ top_author = @grit.file_valid_top_author(blame, filename)
27
26
  @scores[top_author] += numlines
28
27
  end
29
28
  @scores
@@ -11,17 +11,17 @@ module Stefon
11
11
 
12
12
  def call_verbose
13
13
  array_version = score_deleted_files.to_a.map do |pair|
14
- desc = "Deleted #{pair.last} #{pair.last == 1 ? 'file' : 'files' } " +
15
- "written by: #{pair.first}"
14
+ desc = "Deleted #{pair.last} #{pair.last == 1 ? 'file' : 'files' }" +
15
+ " written by: #{pair.first}"
16
16
  [pair.first, [desc]]
17
17
  end
18
18
  Surveyor::SurveyorStore[array_version]
19
19
  end
20
20
 
21
21
  def score_deleted_files
22
- @@grit.repo.status.deleted.keys.each do |filename|
23
- blame = @@grit.blame_for(filename)
24
- top_author = @@grit.file_valid_top_author(blame, filename)
22
+ @grit.repo.status.deleted.keys.each do |filename|
23
+ blame = @grit.blame_for(filename)
24
+ top_author = @grit.file_valid_top_author(blame, filename)
25
25
  @scores[top_author] += 1
26
26
  end
27
27
  @scores
@@ -2,6 +2,7 @@
2
2
 
3
3
  module Stefon
4
4
  module Surveyor
5
+ # This class gives points to authors of lines that the user deletes
5
6
  class DeletedLines < Surveyor::Base
6
7
  def call
7
8
  score_deleted_lines.weight_scores(@weight)
@@ -9,8 +10,8 @@ module Stefon
9
10
 
10
11
  def call_verbose
11
12
  array_version = score_deleted_lines.to_a.map do |pair|
12
- desc = "Deleted #{pair.last} #{pair.last == 1 ? 'line' : 'lines' } " +
13
- "written by: #{pair.first}"
13
+ desc = "Deleted #{pair.last} #{pair.last == 1 ? 'line' : 'lines' }" +
14
+ " written by: #{pair.first}"
14
15
  [pair.first, [desc]]
15
16
  end
16
17
  Surveyor::SurveyorStore[array_version]
@@ -18,9 +19,9 @@ module Stefon
18
19
 
19
20
  def score_deleted_lines
20
21
  deleted_lines_by_file.each_pair do |filename, lines|
21
- blame = @@grit.blame_for(filename)
22
+ blame = @grit.blame_for(filename)
22
23
  lines.each do |deleted_line|
23
- valid_author = @@grit.valid_line_author(blame, deleted_line)
24
+ valid_author = @grit.valid_line_author(blame, deleted_line)
24
25
  @scores[valid_author] += 1 if valid_author
25
26
  end
26
27
  end
@@ -8,7 +8,6 @@ module Stefon
8
8
  attr_reader :options, :team
9
9
  attr_accessor :errors
10
10
 
11
-
12
11
  def initialize(options)
13
12
  @options = options
14
13
  # currently unused
@@ -22,7 +22,7 @@ module Stefon
22
22
  # none for all looks at a diff, optionally matches lines starting
23
23
  # with mode char, cut off first char of each line
24
24
  %x(git diff HEAD~#{GritUtil.new.num_sui_commits} -U0 |
25
- #{mode ? "grep ^#{mode} | " : ""} sed 's/^.//'
25
+ #{mode ? "grep ^#{mode} | " : ''} sed 's/^.//'
26
26
  ).split("\n").map(&:strip)
27
27
  end
28
28
 
@@ -39,7 +39,9 @@ module Stefon
39
39
  git_diff_as_array.each_with_index do |e, i|
40
40
  line, lines_ahead = e, 1
41
41
  # if the line is a filename, we want it to point to its lines
42
- while (line[0..1] == filename_marker) && (i + lines_ahead < git_diff_as_array.length) do
42
+ while (line[0..1] == filename_marker) &&
43
+ (i + lines_ahead < git_diff_as_array.length)
44
+
43
45
  next_line = git_diff_as_array[i + lines_ahead]
44
46
  # next_lines should not be filenames
45
47
  break if next_line[0..1] == filename_marker
@@ -4,27 +4,35 @@ require 'grit'
4
4
 
5
5
  module Stefon
6
6
  module Surveyor
7
- # A class that abstracts dealing with the grit gem while respecting/knowing some
8
- # restrictions, namely excluding authors
7
+ # A class that abstracts dealing with the grit gem while
8
+ # respecting/knowing some restrictions, namely excluding authors
9
9
  class GritUtil
10
- attr_reader :repo, :num_sui_commits, :last_xenocommit
10
+ attr_reader :repo
11
+ # The number of commits by the user (sui ~ self / origin).
12
+ # This is important to take into account when the user makes multiple
13
+ # commits when working on someone else's project, to ensure that diffs
14
+ # do not include recent changes made by the user in her last few commits
15
+ attr_reader :num_sui_commits
16
+ # The last commit not made by the user (sui ~ self) but by another
17
+ # person (xeno ~ not self / not origin).
18
+ # This is important to take into account when the user makes multiple
19
+ # commits when working on someone else's project, to ensure that diffs
20
+ # do not include recent changes made by the user in her last few commits
21
+ attr_reader :last_xenocommit
11
22
 
12
23
  include Config::ExcludedAuthors
13
24
 
14
- # About the attribute names
15
- # num_sui_commits is important when a user makes multiple commits when
16
- # working on someone else's project, to ensure that diffs do not
17
- # include recent changes made by the user, the number of commits by the
18
- # user (sui ~ self / origin) should be taken into account when calling
19
- # a diff, so as to compare changes against the last commit not made by
20
- # the user (self), but by another person (xeno ~ not self / not origin)
25
+ # sets num_sui_commits and last_xenocommit attributes, if the current
26
+ # user is the only commiter in the repo, these are set to the most
27
+ # recent commit, since in this case, stefon would always recommend
28
+ # the current user anyway. In the future, an error may be raised here
21
29
  def initialize
22
30
  @repo = Grit::Repo.new('.')
23
31
  commits = @repo.commits(GitUtil::CURRENT_BRANCH)
24
- # If you are the only commiter _ever_, then num_sui_commits would be
25
- # irrelevant perhaps an error should be raised? Since in this case
26
- # only yourself would be recommended
27
- @num_sui_commits = commits.find_index { |c| c.author.name != @repo.config['user.name'] } || 0
32
+ @num_sui_commits = commits.find_index do |commit|
33
+ commit.author.name != @repo.config['user.name']
34
+ end
35
+ @num_sui_commits ||= 0
28
36
  @last_xeno_commit = commits[@num_sui_commits]
29
37
  end
30
38
 
@@ -33,7 +41,7 @@ module Stefon
33
41
  end
34
42
 
35
43
  def valid_line_author(blame, line)
36
- matched_line = blame.lines.detect { |l| l.line.strip == line }
44
+ matched_line = blame.lines.find { |l| l.line.strip == line }
37
45
  author = matched_line.commit.author.name if matched_line
38
46
  author if valid?(author)
39
47
  end
@@ -34,8 +34,10 @@ module Stefon
34
34
  attr_reader :weight
35
35
  attr_accessor :scores
36
36
 
37
+ class << self; attr_accessor :grit end
38
+
37
39
  def initialize(weight)
38
- @@grit ||= GritUtil.new
40
+ @grit ||= GritUtil.new
39
41
  @scores = SurveyorStore.new
40
42
  @weight = weight
41
43
  end
@@ -1,5 +1,6 @@
1
1
  # encoding: utf-8
2
2
 
3
+ # The outermost container for the gem, here with the version info
3
4
  module Stefon
4
- VERSION = '0.0.2'
5
+ VERSION = '0.0.3'
5
6
  end
@@ -21,7 +21,7 @@ describe Stefon::Config do
21
21
 
22
22
  context 'with github enabled' do
23
23
  describe 'merging configurations' do
24
- it 'ensures github user configuration takes prescedence over user yml config'
24
+ it 'ensures user github config takes prescedence over user yml config'
25
25
  end
26
26
  end
27
27
  end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
 
3
- $:.unshift(File.dirname(__FILE__) + '/../lib')
3
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../lib')
4
4
  require 'stefon'
5
5
  require 'pry'
6
6
 
@@ -3,13 +3,15 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe 'Editor' do
6
- let(:options) {{
7
- limit: 4,
8
- deleted_line: 2,
9
- deleted_file: 4,
10
- added_line: 1,
11
- added_file: 1
12
- }}
6
+ let(:options) do
7
+ {
8
+ limit: 4,
9
+ deleted_line: 2,
10
+ deleted_file: 4,
11
+ added_line: 1,
12
+ added_file: 1
13
+ }
14
+ end
13
15
 
14
16
  describe 'summarize results (integration)' do
15
17
  before(:each) do
@@ -45,8 +47,8 @@ describe 'Editor' do
45
47
  options[:full_report] = true
46
48
  editor = Stefon::Editor.new(options)
47
49
  results = editor.summarize_results
48
- results.any? { |line| line == 'Deleted 4 lines by Cy Twombly' }.should be_true
49
- results.any? { |line| line == 'Deleted 2 lines by Christian Boltanski' }.should be_true
50
+ results.should include('Deleted 4 lines by Cy Twombly')
51
+ results.should include('Deleted 2 lines by Christian Boltanski')
50
52
  results.each do |reported_result|
51
53
  unless reported_result =~ /The top commiter in this repo is/
52
54
  reported_result.should =~ /\d/
@@ -4,29 +4,30 @@ require 'spec_helper'
4
4
 
5
5
  describe Stefon::Surveyor::GitUtil do
6
6
  describe '#lines_by_file' do
7
- let(:git_diff_as_array) {[
8
- "-- a/bin/stefon",
9
- "-- a/lib/stefon/surveyor/deleted_lines.rb",
10
- "-- a/lib/stefon/surveyor/git_util.rb",
11
- "block.call(line, next_line)",
12
- "-- a/lib/stefon/surveyor/grit_util.rb",
13
- "repo.blame(filename, @last_xenocommit)",
14
- "-- a/spec/surveyor/git_util_spec.rb",
15
- "describe Stefon::Surveyor::GitUtil do",
16
- "describe '#lines_by_file' do",
17
- "it 'correctly yields lines belonging to files'",
18
- "end"
19
- ]}
20
- let(:right_structure) {{
21
- "lib/stefon/surveyor/git_util.rb" => ["block.call(line, next_line)"],
22
- "lib/stefon/surveyor/grit_util.rb" => ["repo.blame(filename, @last_xenocommit)"],
23
- "spec/surveyor/git_util_spec.rb" => [
24
- "describe Stefon::Surveyor::GitUtil do",
25
- "describe '#lines_by_file' do",
26
- "it 'correctly yields lines belonging to files'",
27
- "end"
7
+ let(:git_diff_as_array) do
8
+ [
9
+ '-- a/bin/stefon',
10
+ '-- a/lib/stefon/surveyor/deleted_lines.rb',
11
+ '-- a/lib/stefon/surveyor/git_util.rb',
12
+ 'block.call(line, next_line)',
13
+ '-- a/spec/surveyor/git_util_spec.rb',
14
+ 'describe Stefon::Surveyor::GitUtil do',
15
+ 'describe "#lines_by_file" do',
16
+ 'it "correctly yields lines belonging to files"',
17
+ 'end'
28
18
  ]
29
- }}
19
+ end
20
+ let(:right_structure) do
21
+ {
22
+ 'lib/stefon/surveyor/git_util.rb' => ['block.call(line, next_line)'],
23
+ 'spec/surveyor/git_util_spec.rb' => [
24
+ 'describe Stefon::Surveyor::GitUtil do',
25
+ 'describe "#lines_by_file" do',
26
+ 'it "correctly yields lines belonging to files"',
27
+ 'end'
28
+ ]
29
+ }
30
+ end
30
31
  let(:save_structure) { Hash.new([]) }
31
32
  let(:block) { ->(filename, line) { save_structure[filename] += [line] } }
32
33
 
@@ -5,26 +5,26 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
  require 'stefon/version'
6
6
 
7
7
  Gem::Specification.new do |spec|
8
- spec.name = "stefon"
8
+ spec.name = 'stefon'
9
9
  spec.version = Stefon::VERSION
10
10
  spec.platform = Gem::Platform::RUBY
11
- spec.authors = ["Ilya Kavalerov"]
12
- spec.email = ["ilya@artsymail.com"]
11
+ spec.authors = ['Ilya Kavalerov']
12
+ spec.email = ['ilya@artsymail.com']
13
13
  spec.description = <<-EOF
14
- A utility that recommends who to ask for a code review.
14
+ A pre-commit utility that recommends who to ask for a code review.
15
15
  Stefon tells you whose code you are affecting the most.
16
16
  EOF
17
17
  spec.summary = %q{A utility that recommends who to ask for a code review}
18
- spec.homepage = "https://github.com/ilyakava/stefon"
19
- spec.license = "MIT"
18
+ spec.homepage = 'https://github.com/ilyakava/stefon'
19
+ spec.license = 'MIT'
20
20
 
21
21
  spec.files = `git ls-files`.split($/)
22
22
  spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
23
23
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
24
- spec.require_paths = ["lib"]
24
+ spec.require_paths = ['lib']
25
25
 
26
- spec.add_runtime_dependency "grit", "2.5.0"
27
- spec.add_runtime_dependency "trollop", "~> 2.0"
28
- spec.add_development_dependency "bundler", "~> 1.3"
29
- spec.add_development_dependency "rake"
26
+ spec.add_runtime_dependency 'gitlab-grit', '1.0.0'
27
+ spec.add_runtime_dependency 'trollop', '~> 2.0'
28
+ spec.add_development_dependency 'bundler', '~> 1.3'
29
+ spec.add_development_dependency('rake', '~> 10.1')
30
30
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stefon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ilya Kavalerov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-27 00:00:00.000000000 Z
11
+ date: 2014-02-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: grit
14
+ name: gitlab-grit
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 2.5.0
19
+ version: 1.0.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
- version: 2.5.0
26
+ version: 1.0.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: trollop
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -56,18 +56,19 @@ dependencies:
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ! '>='
59
+ - - ~>
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: '10.1'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ! '>='
66
+ - - ~>
67
67
  - !ruby/object:Gem::Version
68
- version: '0'
69
- description: ! " A utility that recommends who to ask for a code review.\n Stefon
70
- tells you whose code you are affecting the most.\n"
68
+ version: '10.1'
69
+ description: |2
70
+ A pre-commit utility that recommends who to ask for a code review.
71
+ Stefon tells you whose code you are affecting the most.
71
72
  email:
72
73
  - ilya@artsymail.com
73
74
  executables:
@@ -111,17 +112,17 @@ require_paths:
111
112
  - lib
112
113
  required_ruby_version: !ruby/object:Gem::Requirement
113
114
  requirements:
114
- - - ! '>='
115
+ - - '>='
115
116
  - !ruby/object:Gem::Version
116
117
  version: '0'
117
118
  required_rubygems_version: !ruby/object:Gem::Requirement
118
119
  requirements:
119
- - - ! '>='
120
+ - - '>='
120
121
  - !ruby/object:Gem::Version
121
122
  version: '0'
122
123
  requirements: []
123
124
  rubyforge_project:
124
- rubygems_version: 2.1.5
125
+ rubygems_version: 2.2.1
125
126
  signing_key:
126
127
  specification_version: 4
127
128
  summary: A utility that recommends who to ask for a code review