code_owners 1.0.6 → 1.0.9

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
- SHA256:
3
- metadata.gz: b742a1fbaa41ae70ad7acc4f258ce685517c74d91855fe554ce29fbb02ca9d99
4
- data.tar.gz: 9535aa63120da63e000b8fee5500d696e9d0ee097a12a9bfb052aab5f6b2fb00
2
+ SHA1:
3
+ metadata.gz: add8d9474667ea07ea6ad3e207e9a0e085109ac9
4
+ data.tar.gz: 86f55b021ef6314614ac2e5f2a59dfec43adbcd1
5
5
  SHA512:
6
- metadata.gz: f2bed6c4f9a8991d6319b31b9d41e6fddc63bdb9cb584a6629106f90514944384f9d67a18134a0afd3c68ff13fb46c8c994af08ad8a1cfebec040d360343ca4f
7
- data.tar.gz: bad817126846774d0e62706229351b2abd189bfeb570d16d994d2e01cdc7998bee78dab90979f41fcb3546824f744714a644c28fcc09fe0e8bfb78a2ba29d2b0
6
+ metadata.gz: 6bc09a62ef1d0b86e7a9be070b27c5ed0e21be5b797f29b2597b3c06ffecc8210fd50906319f67028bc8e8a4df3aa2b575ab5ae49a083f2af029f43182d9d074
7
+ data.tar.gz: 62e13f5c44667eff192eabb510dca677a2088e58ce123e3dbaf4ccd16c8ebf9eb1dffa8125d5524161de36df730b9eea83093776ea6a55fb40c72df6f741eec3
data/Gemfile.lock CHANGED
@@ -1,14 +1,14 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- code_owners (1.0.6)
4
+ code_owners (1.0.9)
5
5
  rake
6
6
 
7
7
  GEM
8
8
  remote: http://rubygems.org/
9
9
  specs:
10
10
  diff-lcs (1.3)
11
- rake (12.3.3)
11
+ rake (13.0.6)
12
12
  rspec (3.8.0)
13
13
  rspec-core (~> 3.8.0)
14
14
  rspec-expectations (~> 3.8.0)
@@ -31,4 +31,4 @@ DEPENDENCIES
31
31
  rspec
32
32
 
33
33
  BUNDLED WITH
34
- 1.17.2
34
+ 1.17.3
data/README.md CHANGED
@@ -5,6 +5,12 @@ Install
5
5
 
6
6
  gem install code_owners
7
7
 
8
+ Requirements
9
+ ============
10
+
11
+ * Ruby
12
+ * Git
13
+
8
14
  Usage
9
15
  =====
10
16
 
@@ -24,12 +30,12 @@ Development
24
30
 
25
31
  Maybe put it in a cleanliness test, like:
26
32
 
27
- ```
28
- it "does not introduce new unowned files" do
29
- unowned_files = CodeOwners.ownerships.select { |f| f[:owner] == "UNOWNED" }
30
- # this number should only decrease, never increase!
31
- assert_equal 12345, unowned_files.count, "Claim ownership of your new files in .github/CODEOWNERS to fix this test!"
32
- end
33
+ ```ruby
34
+ it "does not introduce new unowned files" do
35
+ unowned_files = CodeOwners.ownerships.select { |f| f[:owner] == CodeOwners::NO_OWNER }
36
+ # this number should only decrease, never increase!
37
+ assert_equal 12345, unowned_files.count, "Claim ownership of your new files in .github/CODEOWNERS to fix this test!"
38
+ end
33
39
  ```
34
40
 
35
41
  Author
data/bin/code_owners CHANGED
@@ -1,10 +1,45 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ unless system('git --version > /dev/null')
4
+ STDERR.puts 'Git does not appear to be installed.'
5
+ exit 2
6
+ end
7
+
8
+ unless system('git rev-parse --is-inside-work-tree > /dev/null')
9
+ STDERR.puts 'The current working directory must be a Git repo.'
10
+ exit 3
11
+ end
12
+
3
13
  $LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
4
14
  require 'code_owners'
15
+ require 'code_owners/version'
16
+ require 'optparse'
17
+
18
+ options = {}
19
+ OptionParser.new do |opts|
20
+ opts.banner = "usage: code_owners [options]"
21
+ opts.on('-u', '--unowned', TrueClass, 'Display unowned files only') do |u|
22
+ options[:unowned] = u
23
+ end
24
+ opts.on('-e', '--error-unowned', TrueClass, 'Exit with error status if any files are unowned') do |e|
25
+ options[:error_unowned] = e
26
+ end
27
+ opts.on('-v', '--version', TrueClass, 'Display the version of the gem') do |_|
28
+ puts "Version: #{CodeOwners::VERSION}"
29
+ exit 0
30
+ end
31
+ end.parse!
5
32
 
33
+ unowned_error = false
6
34
  CodeOwners.ownerships.each do |ownership_status|
7
35
  owner_info = ownership_status[:owner].dup
36
+ if owner_info != CodeOwners::NO_OWNER
37
+ next if options[:unowned]
38
+ else
39
+ unowned_error ||= options[:error_unowned]
40
+ end
8
41
  owner_info += " per line #{ownership_status[:line]}, #{ownership_status[:pattern]}" if owner_info != "UNOWNED"
9
42
  puts "#{ownership_status[:file].ljust(100,' ')} #{owner_info}"
10
43
  end
44
+
45
+ exit(unowned_error && 1 || 0)
data/code_owners.gemspec CHANGED
@@ -8,10 +8,10 @@ Gem::Specification.new name, CodeOwners::VERSION do |s|
8
8
  s.description = "utility gem for .github/CODEOWNERS introspection"
9
9
  s.authors = "Jonathan Cheatham"
10
10
  s.email = "coaxis@gmail.com"
11
- s.homepage = "http://github.com/jcheatham/#{s.name}"
11
+ s.homepage = "https://github.com/jcheatham/#{s.name}"
12
12
  s.licenses = "MIT"
13
13
 
14
- s.files = `git ls-files`.split("\n")
14
+ s.files = `git -c "core.quotepath=off" ls-files`.split("\n")
15
15
  s.bindir = 'bin'
16
16
  s.test_files = `git ls-files -- test/*`.split("\n")
17
17
  s.require_paths = ["lib"]
@@ -1,3 +1,3 @@
1
1
  module CodeOwners
2
- VERSION = "1.0.6"
2
+ VERSION = "1.0.9"
3
3
  end
data/lib/code_owners.rb CHANGED
@@ -2,7 +2,9 @@ require "code_owners/version"
2
2
  require "tempfile"
3
3
 
4
4
  module CodeOwners
5
+ NO_OWNER = 'UNOWNED'
5
6
  class << self
7
+
6
8
  # github's CODEOWNERS rules (https://help.github.com/articles/about-codeowners/) are allegedly based on the gitignore format.
7
9
  # but you can't tell ls-files to ignore tracked files via an arbitrary pattern file
8
10
  # so we need to jump through some hacky git-fu hoops
@@ -17,11 +19,15 @@ module CodeOwners
17
19
  puts message
18
20
  end
19
21
 
22
+ def file_ownerships
23
+ Hash[ ownerships.map { |o| [o[:file], o] } ]
24
+ end
25
+
20
26
  def ownerships
21
27
  patterns = pattern_owners
22
28
  git_owner_info(patterns.map { |p| p[0] }).map do |line, pattern, file|
23
29
  if line.empty?
24
- { file: file, owner: "UNOWNED", line: nil, pattern: nil }
30
+ { file: file, owner: NO_OWNER, line: nil, pattern: nil }
25
31
  else
26
32
  {
27
33
  file: file,
@@ -75,7 +81,7 @@ module CodeOwners
75
81
  Tempfile.open('codeowner_patterns') do |file|
76
82
  file.write(patterns.join("\n"))
77
83
  file.rewind
78
- `cd #{current_repo_path} && git ls-files | xargs -- git -c \"core.excludesfile=#{file.path}\" check-ignore --no-index -v -n`
84
+ `cd #{current_repo_path} && git -c \"core.quotepath=off\" ls-files -z | xargs -0 -- git -c \"core.quotepath=off\" -c \"core.excludesfile=#{file.path}\" check-ignore --no-index -v -n`
79
85
  end
80
86
  end
81
87
 
@@ -2,6 +2,23 @@ require 'code_owners'
2
2
  require 'tmpdir'
3
3
 
4
4
  RSpec.describe CodeOwners do |rspec|
5
+ describe ".file_ownerships" do
6
+ it "returns a hash of ownerships keyed by file path" do
7
+ expect(CodeOwners).to receive(:ownerships).and_return(
8
+ [
9
+ { file: "pat2file", owner: "own2", line: "2", pattern: "pat2*" },
10
+ { file: "unowned/file", owner: "UNOWNED", line: nil, pattern: nil }
11
+ ]
12
+ )
13
+ expect(CodeOwners.file_ownerships).to eq(
14
+ {
15
+ "pat2file" => { file: "pat2file", owner: "own2", line: "2", pattern: "pat2*" },
16
+ "unowned/file" => { file: "unowned/file", owner: "UNOWNED", line: nil, pattern: nil }
17
+ }
18
+ )
19
+ end
20
+ end
21
+
5
22
  describe ".ownerships" do
6
23
  it "assigns owners to things" do
7
24
  expect(CodeOwners).to receive(:pattern_owners).and_return([["pat1", "own1"], ["pat2*", "own2"], ["pat3", "own3"]])
@@ -29,7 +46,7 @@ RSpec.describe CodeOwners do |rspec|
29
46
  lib/* @jcheatham
30
47
  some/path/** @someoneelse
31
48
  other/path/* @someoneelse @anotherperson
32
- invalid/codeowners/line
49
+ invalid/code owners/line
33
50
  @AnotherInvalidLine
34
51
  #comment-line (empty line next)
35
52
 
@@ -60,7 +77,7 @@ CODEOWNERS
60
77
 
61
78
  it "prints validation errors and skips lines that aren't the expected format" do
62
79
  expect(CodeOwners).to receive(:current_repo_path).and_return(@d)
63
- expect(CodeOwners).to receive(:log).with("Parse error line 4: \"invalid/codeowners/line \"")
80
+ expect(CodeOwners).to receive(:log).with("Parse error line 4: \"invalid/code owners/line\"")
64
81
  expect(CodeOwners).to receive(:log).with("Parse error line 5: \" @AnotherInvalidLine\"")
65
82
  pattern_owners = CodeOwners.pattern_owners
66
83
  expect(pattern_owners).not_to include(["", "@AnotherInvalidLine"])
@@ -86,5 +103,24 @@ CODEOWNERS
86
103
  expect(raw_ownership.size).to be >= 1
87
104
  expect(raw_ownership).to match(/^(?:.*:\d*:.*\t.*\n)+$/)
88
105
  end
106
+
107
+ context "when path includes a space" do
108
+ it "returns the path in single line" do
109
+ raw_ownership = CodeOwners.raw_git_owner_info(["/spec/files/*"])
110
+ expect(raw_ownership).to match(/.+:\d+:.+\tspec\/files\/file name\.txt\n/)
111
+ end
112
+ end
113
+ end
114
+
115
+ describe "code_owners" do
116
+ VERSION_REGEX = /Version: \d+\.\d+\.\d+(-[a-z0-9]+)?/i
117
+
118
+ it "prints a version number with the short option" do
119
+ expect(`bin#{File::SEPARATOR}code_owners -v`).to match VERSION_REGEX
120
+ end
121
+
122
+ it "prints a version number with the short option" do
123
+ expect(`bin#{File::SEPARATOR}code_owners --version`).to match VERSION_REGEX
124
+ end
89
125
  end
90
126
  end
@@ -0,0 +1 @@
1
+ This file's name includes a space.
@@ -0,0 +1 @@
1
+ ☃☃☃☃☃☃☃☃☃
metadata CHANGED
@@ -1,11 +1,11 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: code_owners
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.6
4
+ version: 1.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Cheatham
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
  date: 2018-03-29 00:00:00.000000000 Z
@@ -57,11 +57,13 @@ files:
57
57
  - lib/code_owners.rb
58
58
  - lib/code_owners/version.rb
59
59
  - spec/code_owners_spec.rb
60
- homepage: http://github.com/jcheatham/code_owners
60
+ - spec/files/file name.txt
61
+ - spec/files/☃.txt
62
+ homepage: https://github.com/jcheatham/code_owners
61
63
  licenses:
62
64
  - MIT
63
65
  metadata: {}
64
- post_install_message:
66
+ post_install_message:
65
67
  rdoc_options: []
66
68
  require_paths:
67
69
  - lib
@@ -76,8 +78,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
76
78
  - !ruby/object:Gem::Version
77
79
  version: '0'
78
80
  requirements: []
79
- rubygems_version: 3.0.1
80
- signing_key:
81
+ rubyforge_project:
82
+ rubygems_version: 2.6.14.4
83
+ signing_key:
81
84
  specification_version: 4
82
85
  summary: ".github/CODEOWNERS introspection utility gem"
83
86
  test_files: []