stewfinder 0.0.1 → 0.0.2

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
  SHA1:
3
- metadata.gz: b7568eef5a5a01727b1d544b6d62ccc2ac54228c
4
- data.tar.gz: cdd6bb1ae7576d98a7d219e4c2ac2c3037685342
3
+ metadata.gz: 0a5e78e27f1e4a329755bceef065da6b53ff4665
4
+ data.tar.gz: 2011b0b615358b6c6d974f1d7715d943e55ec921
5
5
  SHA512:
6
- metadata.gz: 6f21aed6cd835cf1c35dd754188a44fbdefd87c7bb2e92807c693dbd132a0491c947c971c1c70a13b0999c09aadac9f21004b6eafb28848a09000a3abfe03521
7
- data.tar.gz: ad3360ad32eed9cec6301d8da37bffeeca2c1622b80d6b79a5822b076b7b70fba03d49b32466ecab86b67d186b147956568f12a8b85aa7ef83db93ff19c6a4a6
6
+ metadata.gz: 12467cbff214c1f0b0bde5f61a582e27f308c67324c436bf78306bae80e86333d7ff3c29141c3ca7bf21e36670366ba96d69fc420a02d4ad306d4494626b9673
7
+ data.tar.gz: b81f738cfacd95bb84d3d88faced22d2e64b9da67b4e2d4e9cf90303bf4bb50957588333baacc86649c369f78501ecbc357120b1a0ac5a085ffc26f07c3b719e
data/.rubocop.yml CHANGED
@@ -29,5 +29,8 @@ Style/NumericLiterals:
29
29
  Style/RaiseArgs:
30
30
  Enabled: false
31
31
 
32
+ Style/NegatedIf:
33
+ Enabled: false
34
+
32
35
  Style/SignalException:
33
36
  EnforcedStyle: only_raise
data/Gemfile CHANGED
@@ -4,5 +4,8 @@ source 'https://rubygems.org'
4
4
  gemspec
5
5
 
6
6
  group :development do
7
- gem 'rubocop'
7
+ # This provides some basic reporting on tests for CircleCI
8
+ gem 'minitest-ci', git: 'git@github.com:circleci/minitest-ci.git'
8
9
  end
10
+
11
+ gem 'simplecov', require: false, group: :test
data/README.md CHANGED
@@ -1,7 +1,9 @@
1
- # Stewfinder
1
+ # Stewfinder
2
2
 
3
3
  This gem provides command line utilities for working locally with [Ladle](https://github.com/appfolio/ladle) style stewards files.
4
4
 
5
+ [![Circle CI](https://circleci.com/gh/appfolio/stewfinder/tree/master.svg?style=svg)](https://circleci.com/gh/appfolio/stewfinder/tree/master)
6
+
5
7
  ## Installation
6
8
 
7
9
  Install via the command line:
data/Rakefile CHANGED
@@ -1 +1,8 @@
1
1
  require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new do |t|
5
+ sh 'rubocop'
6
+ t.libs << 'test'
7
+ t.pattern = 'test/*_test.rb'
8
+ end
data/exe/stewfinder CHANGED
@@ -1,6 +1,3 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'stewfinder'
3
-
4
- filename = ARGV[0] ? File.absolute_path(ARGV[0]) : Dir.pwd
5
-
6
- Stewfinder.new(filename).find
3
+ exit Stewfinder::Command.new.run
data/lib/stewfinder.rb CHANGED
@@ -1,62 +1,2 @@
1
+ require 'stewfinder/module'
1
2
  require 'stewfinder/version'
2
- require 'yaml'
3
-
4
- class Stewfinder
5
- def initialize(filename)
6
- @name = filename
7
- end
8
-
9
- def find
10
- stewards = get_stewards
11
-
12
- puts 'Stewards for this file:'
13
- if stewards.empty?
14
- puts 'None'
15
- else
16
- puts ' - ' + stewards.uniq.sort.join("\n - ")
17
- end
18
- end
19
-
20
- private
21
-
22
- def get_stewfiles
23
- stewfiles = []
24
- cur_path = Pathname(@name)
25
- while cur_path
26
- stewfiles << File.join(cur_path, 'stewards.yml') if File.exist?(File.join(cur_path, 'stewards.yml'))
27
- prev_path = cur_path
28
- cur_path = cur_path.split.first
29
- break if cur_path == prev_path
30
- end
31
- stewfiles
32
- end
33
-
34
- def get_stewards
35
- stewards = []
36
- stewfiles = get_stewfiles
37
- stewfiles.each do |file|
38
- steward_hash = YAML.load_file(file)
39
- next unless steward_hash
40
-
41
- steward_hash['stewards'].each do |s|
42
- case s
43
- when String
44
- stewards << s
45
- when Hash
46
- begin
47
- if [s['include']].flatten.any? { |i| File.fnmatch?(i.to_s, @name) } &&
48
- [s['exclude']].flatten.none? { |i| File.fnmatch?(i.to_s, @name) }
49
- stewards << s['github_username']
50
- end
51
- rescue
52
- puts "Invalid Format: #{s.inspect} in file #{file}"
53
- end
54
- else
55
- puts "Invalid Format: #{s.inspect} in file #{file}"
56
- end
57
- end
58
- end
59
-
60
- stewards
61
- end
62
- end
@@ -0,0 +1,49 @@
1
+ require 'docopt'
2
+ require_relative 'finder'
3
+ require_relative 'version'
4
+
5
+ module Stewfinder
6
+ # Provides the command line interface to Stewfinder
7
+ class Command
8
+ DOC = <<-DOC
9
+ stewfinder: A tool to help discover code stewards.
10
+
11
+ Usage:
12
+ stewfinder [options] [PATH]
13
+ stewfinder -h | --help
14
+ stewfinder --version
15
+
16
+ Options:
17
+ --sort Sort the output list.
18
+
19
+ When PATH isn't provided stewfinder will use the present working directory.
20
+ DOC
21
+ .freeze
22
+
23
+ def initialize
24
+ @exit_status = 0
25
+ end
26
+
27
+ def run
28
+ options = Docopt.docopt(DOC, argv: argv, version: VERSION)
29
+ finder = Finder.new(File.absolute_path(options['PATH'] || Dir.pwd))
30
+ finder.print_stewards(options['--sort'])
31
+ @exit_status
32
+ rescue Docopt::Exit => exc
33
+ exit_with_status(exc.message, exc.class.usage != '')
34
+ rescue StandardError => exc
35
+ exit_with_status(exc.message)
36
+ end
37
+
38
+ private
39
+
40
+ def argv
41
+ ARGV
42
+ end
43
+
44
+ def exit_with_status(message, condition = true)
45
+ puts message
46
+ @exit_status = condition ? 1 : @exit_status
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,71 @@
1
+ require 'yaml'
2
+
3
+ module Stewfinder
4
+ class Finder
5
+ def initialize(filename)
6
+ raise StandardError, "Invalid file #{filename}" unless File.exist?(filename)
7
+ @name = filename
8
+ end
9
+
10
+ def find
11
+ get_stewards.uniq
12
+ end
13
+
14
+ def print_stewards(sort)
15
+ stewards = find
16
+
17
+ str = "Stewards for #{@name}:\n"
18
+ if stewards.empty?
19
+ str += 'None'
20
+ else
21
+ stewards = stewards.sort! if sort
22
+ str += ' - ' + stewards.join("\n - ")
23
+ end
24
+
25
+ puts str
26
+ end
27
+
28
+ private
29
+
30
+ def get_stewfiles
31
+ stewfiles = []
32
+ cur_path = Pathname(@name)
33
+ prev_path = nil
34
+ while cur_path != prev_path
35
+ stewfiles << File.join(cur_path, 'stewards.yml') if File.exist?(File.join(cur_path, 'stewards.yml'))
36
+ prev_path = cur_path
37
+ cur_path = cur_path.split.first
38
+ end
39
+ stewfiles
40
+ end
41
+
42
+ def get_stewards
43
+ stewards = []
44
+ stewfiles = get_stewfiles
45
+ stewfiles.each do |file|
46
+ steward_hash = YAML.load_file(file)
47
+ next unless steward_hash
48
+
49
+ steward_hash['stewards'].each do |s|
50
+ case s
51
+ when String
52
+ stewards << s
53
+ when Hash
54
+ begin
55
+ if [s['include']].flatten.any? { |i| File.fnmatch?(i.to_s, @name) } &&
56
+ [s['exclude']].flatten.none? { |i| File.fnmatch?(i.to_s, @name) }
57
+ stewards << s['github_username']
58
+ end
59
+ rescue
60
+ puts "Invalid Format: #{s.inspect} in file #{file}"
61
+ end
62
+ else
63
+ puts "Invalid Format: #{s.inspect} in file #{file}"
64
+ end
65
+ end
66
+ end
67
+
68
+ stewards
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,2 @@
1
+ require_relative 'command'
2
+ require_relative 'finder'
@@ -1,3 +1,3 @@
1
- class Stewfinder
2
- VERSION = '0.0.1'
1
+ module Stewfinder
2
+ VERSION = '0.0.2'.freeze
3
3
  end
data/stewards.yml ADDED
@@ -0,0 +1,3 @@
1
+ stewards:
2
+ - XanderStrike
3
+ - bboe
data/stewfinder.gemspec CHANGED
@@ -19,6 +19,10 @@ Gem::Specification.new do |spec|
19
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
20
  spec.require_paths = ['lib']
21
21
 
22
+ spec.add_runtime_dependency 'docopt', '~> 0.5'
22
23
  spec.add_development_dependency 'bundler', '~> 1.7'
23
24
  spec.add_development_dependency 'rake', '~> 10.0'
25
+ spec.add_development_dependency 'minitest', '~> 5.8'
26
+ spec.add_development_dependency 'rubocop', '~> 0.38'
27
+ spec.add_development_dependency 'mocha', '~> 1.1'
24
28
  end
@@ -0,0 +1,59 @@
1
+ require 'test_helper'
2
+
3
+ module Stewfinder
4
+ class CommandTest < MiniTest::Test
5
+ def test_run
6
+ finder_mock = mock
7
+ Finder.expects(:new).with('/home/test').returns(finder_mock)
8
+ finder_mock.expects(:print_stewards).with(false)
9
+ cmd = Command.new
10
+ cmd.expects(:argv).returns(['/home/test'])
11
+
12
+ assert_equal 0, cmd.run
13
+ end
14
+
15
+ def test_run__sort
16
+ finder_mock = mock
17
+ Finder.expects(:new).with('/home/test').returns(finder_mock)
18
+ finder_mock.expects(:print_stewards).with(true)
19
+ cmd = Command.new
20
+ cmd.expects(:argv).returns(['/home/test', '--sort'])
21
+
22
+ assert_equal 0, cmd.run
23
+ end
24
+
25
+ def test_run__defaults_to_pwd
26
+ Dir.expects(:pwd).returns('/current/dir')
27
+ finder_mock = mock
28
+ Finder.expects(:new).with('/current/dir').returns(finder_mock)
29
+ finder_mock.expects(:print_stewards).with(false)
30
+ cmd = Command.new
31
+ cmd.expects(:argv).returns([])
32
+
33
+ assert_equal 0, cmd.run
34
+ end
35
+
36
+ def test_run__invalid_option
37
+ cmd = Command.new
38
+ cmd.expects(:argv).returns(['--bryce'])
39
+ STDOUT.expects(:puts).with("--bryce is not recognized\nUsage:\n stewfinder [options] [PATH]\n stewfinder -h | --help\n stewfinder --version")
40
+
41
+ assert_equal 1, cmd.run
42
+ end
43
+
44
+ def test_run__help
45
+ cmd = Command.new
46
+ cmd.expects(:argv).returns(['-h'])
47
+ STDOUT.expects(:puts).with(Command::DOC)
48
+
49
+ assert_equal 0, cmd.run
50
+ end
51
+
52
+ def test_run__raises
53
+ Docopt.expects(:docopt).raises(StandardError, 'error message')
54
+ STDOUT.expects(:puts).with('error message')
55
+
56
+ assert_equal 1, Command.new.run
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,117 @@
1
+ require 'test_helper'
2
+
3
+ module Stewfinder
4
+ class FinderTest < MiniTest::Test
5
+ def test_initialize__file_does_not_exist
6
+ File.expects(:exist?).returns(false)
7
+
8
+ assert_raises StandardError do
9
+ Finder.new('not a file lol')
10
+ end
11
+ end
12
+
13
+ def test_find
14
+ File.stubs(:exist?).returns(true)
15
+ YAML.stubs(:load_file).returns(loaded_stewfile)
16
+
17
+ finder = Finder.new('/home/test/git/stewfinder')
18
+
19
+ assert_equal %w(test2 test1), finder.find
20
+ end
21
+
22
+ def test_find__with_regex
23
+ File.stubs(:exist?).returns(true)
24
+ YAML.stubs(:load_file).returns(loaded_stewfile)
25
+
26
+ finder = Finder.new('/home/test/git/stewfinder/regex.rb')
27
+
28
+ assert_equal %w(test2 test1 test_regex1 test_regex2), finder.find
29
+ end
30
+
31
+ def test_find__handles_bad_syntax
32
+ File.stubs(:exist?).returns(true)
33
+ YAML.stubs(:load_file).returns('stewards' => ['test1', 1])
34
+ STDOUT.expects(:puts).with('Invalid Format: 1 in file /stewards.yml')
35
+
36
+ finder = Finder.new('/')
37
+
38
+ assert_equal %w(test1), finder.find
39
+ end
40
+
41
+ def test_find__does_not_load_nonexistant_files
42
+ File.stubs(:exist?).returns(false)
43
+ File.expects(:exist?)
44
+ .with(any_of('/home/test/stewards.yml', '/home/test/git/stewfinder/test/finder_test.rb'))
45
+ .returns(true).twice
46
+ YAML.expects(:load_file).returns('stewards' => ['test1'])
47
+
48
+ finder = Finder.new('/home/test/git/stewfinder/test/finder_test.rb')
49
+
50
+ assert_equal ['test1'], finder.find
51
+ end
52
+
53
+ def test_find__no_stewards
54
+ File.stubs(:exist?).returns(true)
55
+ YAML.stubs(:load_file).returns('stewards' => [])
56
+
57
+ finder = Finder.new('/home/test/git/stewfinder')
58
+
59
+ assert_equal [], finder.find
60
+ end
61
+
62
+ def test_find__fnmatch_raises_error
63
+ File.stubs(:exist?).returns(true)
64
+ YAML.stubs(:load_file).returns('stewards' => [{ 'github_username' => 'test_regex2', 'include' => '*regex*' }])
65
+ STDOUT.expects(:puts).with do |*args|
66
+ args.first.include?('Invalid Format')
67
+ end
68
+
69
+ File.expects(:fnmatch?).raises(StandardError)
70
+
71
+ finder = Finder.new('/')
72
+
73
+ finder.find
74
+ end
75
+
76
+ def test_print_stewards__unsorted
77
+ File.stubs(:exist?).returns(true)
78
+ YAML.stubs(:load_file).returns(loaded_stewfile)
79
+ STDOUT.expects(:puts).with("Stewards for /home/test/git/stewfinder:\n - test2\n - test1")
80
+
81
+ finder = Finder.new('/home/test/git/stewfinder')
82
+
83
+ finder.print_stewards(false)
84
+ end
85
+
86
+ def test_print_stewards__sorted
87
+ File.stubs(:exist?).returns(true)
88
+ YAML.stubs(:load_file).returns(loaded_stewfile)
89
+ STDOUT.expects(:puts).with("Stewards for /home/test/git/stewfinder:\n - test1\n - test2")
90
+
91
+ finder = Finder.new('/home/test/git/stewfinder')
92
+
93
+ finder.print_stewards(true)
94
+ end
95
+
96
+ def test_print_stewards__no_stewards
97
+ File.stubs(:exist?).returns(true)
98
+ YAML.stubs(:load_file).returns('stewards' => [])
99
+ STDOUT.expects(:puts).with("Stewards for /home/test/git/stewfinder:\nNone")
100
+
101
+ finder = Finder.new('/home/test/git/stewfinder')
102
+
103
+ finder.print_stewards(false)
104
+ end
105
+
106
+ private
107
+
108
+ def loaded_stewfile
109
+ { 'stewards' => [
110
+ 'test2',
111
+ 'test1',
112
+ { 'github_username' => 'test_regex1', 'include' => ['*regex*'] },
113
+ { 'github_username' => 'test_regex2', 'include' => '*regex*' }
114
+ ] }
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,15 @@
1
+ require 'simplecov'
2
+
3
+ # save to CircleCI's artifacts directory if we're on CircleCI
4
+ if ENV['CIRCLE_ARTIFACTS']
5
+ dir = File.join(ENV['CIRCLE_ARTIFACTS'], 'coverage')
6
+ SimpleCov.coverage_dir(dir)
7
+ end
8
+
9
+ SimpleCov.minimum_coverage(100)
10
+ SimpleCov.start
11
+
12
+ require 'stewfinder'
13
+ require 'minitest/autorun'
14
+ require 'mocha/mini_test'
15
+ require 'pathname'
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stewfinder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexander Standke
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-03-22 00:00:00.000000000 Z
11
+ date: 2016-03-28 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: docopt
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.5'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.5'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -38,6 +52,48 @@ dependencies:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
54
  version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '5.8'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '5.8'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.38'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.38'
83
+ - !ruby/object:Gem::Dependency
84
+ name: mocha
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.1'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.1'
41
97
  description: Finds stewards for a given file.
42
98
  email:
43
99
  - alexander.standke@appfolio.com
@@ -54,8 +110,15 @@ files:
54
110
  - Rakefile
55
111
  - exe/stewfinder
56
112
  - lib/stewfinder.rb
113
+ - lib/stewfinder/command.rb
114
+ - lib/stewfinder/finder.rb
115
+ - lib/stewfinder/module.rb
57
116
  - lib/stewfinder/version.rb
117
+ - stewards.yml
58
118
  - stewfinder.gemspec
119
+ - test/command_test.rb
120
+ - test/finder_test.rb
121
+ - test/test_helper.rb
59
122
  homepage: https://github.com/appfolio/stewfinder
60
123
  licenses:
61
124
  - MIT
@@ -80,5 +143,8 @@ rubygems_version: 2.4.3
80
143
  signing_key:
81
144
  specification_version: 4
82
145
  summary: Get it while it's hot!
83
- test_files: []
146
+ test_files:
147
+ - test/command_test.rb
148
+ - test/finder_test.rb
149
+ - test/test_helper.rb
84
150
  has_rdoc: