stewfinder 0.0.1 → 0.0.2

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
  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: