grspec 0.2.0 → 0.4.0

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
  SHA256:
3
- metadata.gz: 4abdcf7f8708b6c96caa5d31a34921ae17a9477eca30a5b690eaf7bcc5a83d60
4
- data.tar.gz: c413562adce5015317e3baf2cbce2b54a2b9a4d03ff31f5e59865ed33f56d219
3
+ metadata.gz: cc337747d9c3b2075d13056a58f61dc3c8bcf14b82aa6ebd37479c0c8f5de31e
4
+ data.tar.gz: 1a52c3b2e2697eb8e930d418e6360f5aeb640527befa8ebd42eef3b72da18828
5
5
  SHA512:
6
- metadata.gz: 230116a9de943ff6081a22cdd188e6cf3b1b897f1a460a4e673785c22c46a1b4f4b041bde0aeb3a7880aa55fcb3df25e3e9da258b2d44fec4ae4d7f0326b7d01
7
- data.tar.gz: 2ac42186c768e92bfb4334068968b248197dabc7ee864e2f395ed57780feb44cf0cd11818dd4f8f5853fe7f4fe7411a5d67805748cab721e6bdfb1ed8d3612d7
6
+ metadata.gz: ef68c66b44a274b4435d119f1e4e75c77f36bc3e19f519a0268043565267c08296f77450675350754c1f906469dc3ddb258d4bd7413e263357877e8e5fe3ca67
7
+ data.tar.gz: b2cd5ee27d70a7d3b255d78f915cae0a7f5620b22a5e81b3d615bda6046fe1ed8e6879b8dd276a1b8479021a1dfd8ea693d8628fc29167fda8dc09dc6cece131
data/bin/grspec CHANGED
@@ -1,35 +1,12 @@
1
1
  #!/usr/bin/env ruby
2
- require 'active_support/core_ext/array/access'
2
+ require_relative '../lib/arg_parser'
3
+ require_relative '../lib/grspec'
3
4
 
4
- require 'find_changed_files'
5
- require 'find_matching_specs'
6
- require 'spec_runner'
5
+ options = ArgParser.parse(ARGV)
6
+ base_ref, diff_ref = ARGV[0..1]
7
7
 
8
- def display_listing(header, listing)
9
- puts
10
- puts header
11
- puts listing
12
- end
13
-
14
- git_diff_args = ARGV.first(2)
15
-
16
- changed_files = FindChangedFiles.new(
17
- base_ref: git_diff_args.first,
18
- diff_ref: git_diff_args.second
19
- ).call
20
-
21
- if changed_files.any?
22
- display_listing('Changed files:', changed_files)
23
-
24
- matching_specs = FindMatchingSpecs.new(changed_files).call
25
-
26
- if matching_specs.any?
27
- display_listing('Matching specs:', matching_specs)
28
-
29
- SpecRunner.run(matching_specs)
30
- else
31
- puts "No matching specs found"
32
- end
33
- else
34
- puts "No changed files found"
35
- end
8
+ Grspec.new(
9
+ base_ref: base_ref,
10
+ diff_ref: diff_ref,
11
+ options: options
12
+ ).run
data/lib/arg_parser.rb ADDED
@@ -0,0 +1,29 @@
1
+ require 'ostruct'
2
+ require 'optparse'
3
+
4
+ class ArgParser
5
+ def self.parse(options)
6
+ args = OpenStruct.new
7
+
8
+ opt_parser = OptionParser.new do |opts|
9
+ opts.banner = "Usage: grspec [git ref] [git ref] [options]"
10
+
11
+ opts.on("-rSPEC_REGEX", "--regex=SPEC_REGEX", Regexp, "Regex to filter specs") do |regex|
12
+ args.spec_regex = regex
13
+ end
14
+
15
+ opts.on("-d", "--dry", "Performs a dry run for a listing that would be passed through to RSpec") do
16
+ args.dry_run = true
17
+ end
18
+
19
+ opts.on("-h", "--help", "Prints this help") do
20
+ puts opts
21
+ exit
22
+ end
23
+ end
24
+
25
+ opt_parser.parse!(options)
26
+
27
+ args
28
+ end
29
+ end
@@ -1,4 +1,6 @@
1
1
  class FindChangedFiles::BetweenRefs < FindChangedFiles
2
+ require 'English'
3
+
2
4
  attr_reader :base_ref, :diff_ref
3
5
 
4
6
  GIT_MERGE_BASE_COMMAND = 'git merge-base'.freeze
@@ -17,7 +19,7 @@ class FindChangedFiles::BetweenRefs < FindChangedFiles
17
19
  def merge_base_ref
18
20
  merge_base = `#{GIT_MERGE_BASE_COMMAND} #{base_ref} #{diff_ref} #{REDIRECT_STDERR_TO_STDOUT}`
19
21
 
20
- raise ArgumentError.new("Bad git diff arguments; #{base_ref} #{diff_ref}") unless $?.success?
22
+ raise ArgumentError.new("Bad git diff arguments; #{base_ref} #{diff_ref}") unless $CHILD_STATUS.success?
21
23
 
22
24
  merge_base.strip
23
25
  end
@@ -26,7 +28,7 @@ class FindChangedFiles::BetweenRefs < FindChangedFiles
26
28
  @differed_files ||= begin
27
29
  diff_output = `#{GIT_DIFF_COMMAND} #{from_ref} #{to_ref} #{GIT_DIFF_OPTIONS} #{REDIRECT_STDERR_TO_STDOUT}`
28
30
 
29
- raise ArgumentError.new("Bad git diff arguments; #{base_ref} #{diff_ref}") unless $?.success?
31
+ raise ArgumentError.new("Bad git diff arguments; #{base_ref} #{diff_ref}") unless $CHILD_STATUS.success?
30
32
 
31
33
  diff_output.split("\n")
32
34
  end
File without changes
File without changes
@@ -1,6 +1,4 @@
1
1
  class FindChangedFiles
2
- require 'active_support/core_ext/object/blank'
3
-
4
2
  require_relative 'find_changed_files/simple_diff'
5
3
  require_relative 'find_changed_files/since_ref'
6
4
  require_relative 'find_changed_files/between_refs'
@@ -37,14 +35,14 @@ class FindChangedFiles
37
35
  private
38
36
 
39
37
  def simple_diff?
40
- base_ref.blank? && diff_ref.blank?
38
+ !base_ref && !diff_ref
41
39
  end
42
40
 
43
41
  def since_ref?
44
- base_ref.present? && diff_ref.blank?
42
+ base_ref && !diff_ref
45
43
  end
46
44
 
47
45
  def between_refs?
48
- base_ref.present? && diff_ref.present?
46
+ base_ref && diff_ref
49
47
  end
50
48
  end
@@ -11,9 +11,9 @@ class FindMatchingSpecs
11
11
 
12
12
  def call
13
13
  ruby_files = files.select { |filename| ruby_file?(filename) }
14
- spec_files = ruby_files.map { |filename| specs_for(filename) }.flatten
14
+ spec_files = ruby_files.map { |filename| specs_for(filename) }
15
15
 
16
- spec_files.compact.uniq
16
+ spec_files.uniq
17
17
  end
18
18
 
19
19
  private
@@ -31,14 +31,16 @@ class FindMatchingSpecs
31
31
  end
32
32
 
33
33
  def specs_for(filename)
34
- return [filename] if spec_file?(filename)
34
+ return [filename, filename] if spec_file?(filename)
35
35
 
36
- spec_file_listing.select do |spec_file|
36
+ spec_match = spec_file_listing.detect do |spec_file|
37
37
  file_for_spec = spec_file.gsub(/\/?spec\//, '/')
38
38
  file_for_spec.sub!(SPEC_PREFIX_AND_EXTENSION, RUBY_FILE_EXTENSION)
39
39
  file_for_spec.sub!(/^\//, '')
40
40
 
41
41
  file_for_spec == filename
42
42
  end
43
+
44
+ [filename, spec_match]
43
45
  end
44
- end
46
+ end
data/lib/grspec.rb ADDED
@@ -0,0 +1,107 @@
1
+ require_relative '../lib/find_changed_files'
2
+ require_relative '../lib/find_matching_specs'
3
+ require_relative '../lib/spec_runner'
4
+
5
+ class Grspec
6
+ attr_reader :base_ref, :diff_ref, :options
7
+
8
+ def initialize(base_ref:, diff_ref:, options: OpenStruct.new)
9
+ @base_ref = base_ref
10
+ @diff_ref = diff_ref
11
+ @options = options
12
+ end
13
+
14
+ def run
15
+ if changed_files.empty?
16
+ display("No changed files found")
17
+ return
18
+ end
19
+
20
+ display_listing('Changed files:', changed_files)
21
+
22
+ display_listing(
23
+ 'Files without specs:',
24
+ mismatching_files.map(&:first)
25
+ ) if mismatching_files.any?
26
+
27
+ if spec_matchings.any?
28
+ display_listing(
29
+ 'Matching specs:',
30
+ spec_matchings.map { |matching_spec| matching_spec.join(' -> ') }
31
+ )
32
+
33
+ if non_existent_specs.any?
34
+ display_listing(
35
+ 'Removed specs:',
36
+ non_existent_specs
37
+ )
38
+ end
39
+
40
+ if specs_to_run.any?
41
+ if dry_run?
42
+ puts specs_to_run
43
+ else
44
+ SpecRunner.run(specs_to_run)
45
+ end
46
+ end
47
+ else
48
+ display("No matching specs found")
49
+ end
50
+ end
51
+
52
+ private
53
+
54
+ def dry_run?
55
+ options.dry_run
56
+ end
57
+
58
+ def changed_files
59
+ @changed_files ||= FindChangedFiles.new(
60
+ base_ref: base_ref,
61
+ diff_ref: diff_ref
62
+ ).call
63
+ end
64
+
65
+ def file_spec_pairs
66
+ @file_spec_pairs ||= FindMatchingSpecs.new(changed_files).call
67
+ end
68
+
69
+ def mismatching_files
70
+ @mismatching_files ||= file_spec_pairs.select { |_, spec| spec.nil? }
71
+ end
72
+
73
+ def spec_matchings
74
+ @spec_matchings ||= file_spec_pairs - mismatching_files
75
+ end
76
+
77
+ def matching_specs
78
+ @matching_specs ||= spec_matchings.map { |match| match[1] }.uniq
79
+ end
80
+
81
+ def non_existent_specs
82
+ @non_existent_specs ||= matching_specs.reject { |spec_file| File.file?(spec_file) }
83
+ end
84
+
85
+ def specs_to_run
86
+ @specs_to_run ||= matching_specs - non_existent_specs
87
+ end
88
+
89
+ def display_output?
90
+ !dry_run?
91
+ end
92
+
93
+ def display(string)
94
+ return unless display_output?
95
+
96
+ puts
97
+ puts string
98
+ end
99
+
100
+ def display_listing(header, listing)
101
+ return unless display_output?
102
+
103
+ puts
104
+ puts header
105
+ puts listing
106
+ end
107
+ end
data/lib/spec_runner.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  class SpecRunner
2
2
  RSPEC_COMMAND = 'rspec'.freeze
3
3
 
4
- def self.run(matching_specs)
5
- exec "#{RSPEC_COMMAND} #{matching_specs.join(' ')}" if matching_specs.any?
4
+ def self.run(specs)
5
+ system "#{RSPEC_COMMAND} #{specs.join(' ')}" if specs.any?
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,18 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grspec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jordane Lew
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-02-11 00:00:00.000000000 Z
11
+ date: 2018-02-21 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: GRSpec is a tiny gem that can quickly and easily run specs for files
14
- that git has detected changes for, allowing for quick and easy regression checking
15
- without full-on test runs before committing and overloading build nodes.
13
+ description: GRSpec is a tool for quickly and easily running specs for files that
14
+ git has detected changes for, allowing for efficient regression checks.
16
15
  email: jordane.lew@gmail.com
17
16
  executables:
18
17
  - grspec
@@ -20,11 +19,13 @@ extensions: []
20
19
  extra_rdoc_files: []
21
20
  files:
22
21
  - bin/grspec
22
+ - lib/arg_parser.rb
23
23
  - lib/find_changed_files.rb
24
24
  - lib/find_changed_files/between_refs.rb
25
25
  - lib/find_changed_files/simple_diff.rb
26
26
  - lib/find_changed_files/since_ref.rb
27
27
  - lib/find_matching_specs.rb
28
+ - lib/grspec.rb
28
29
  - lib/spec_runner.rb
29
30
  homepage: https://rubygems.org/gems/grspec
30
31
  licenses:
@@ -48,9 +49,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
48
49
  - !ruby/object:Gem::Version
49
50
  version: '0'
50
51
  requirements: []
51
- rubyforge_project:
52
- rubygems_version: 2.7.3
52
+ rubygems_version: 3.0.3
53
53
  signing_key:
54
54
  specification_version: 4
55
- summary: A simple spec runner for differed files
55
+ summary: A simple spec runner for diff'd files
56
56
  test_files: []