spectrerun 0.0.1

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.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/bin/spectrerun +13 -0
  3. data/lib/spectrerun.rb +64 -0
  4. metadata +47 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: bac19ae8ed6bddb8bce72634038b454b1c6ac27a
4
+ data.tar.gz: 3b80cf1f45df7aee7ab11244add86d2a29f22e0a
5
+ SHA512:
6
+ metadata.gz: 96c8450c1f388550c9839423abd097e24b99372d8dfaaf9a3b3efd76cdbcdd9db936c877207e4373f35d675df6380261b9e495d7e784f4f2d7d8f367f5241748
7
+ data.tar.gz: ae16924e856ccc36c9522255fe28d78842c2ee9316875d2f28eb550ddc175e9409455d14bbbffd0ecfca1cc1d8f3c2e86ad26caab0ee4a48dc2084eca32f7eae
data/bin/spectrerun ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'spectrerun'
4
+
5
+ if $stdin.tty?
6
+ changed_files = `git diff --name-only`.split("\n").map(&:chomp)
7
+ else
8
+ changed_files = $stdin.readlines.map(&:chomp)
9
+ end
10
+
11
+ files_to_check = find_specs_to_run(changed_files)
12
+
13
+ puts files_to_check
data/lib/spectrerun.rb ADDED
@@ -0,0 +1,64 @@
1
+ require 'pathname'
2
+
3
+ def ruby_files
4
+ @file_names ||= Dir.glob('**/*.rb')
5
+ end
6
+
7
+ def declared_constants(file_name)
8
+ [
9
+ file_name,
10
+
11
+ File
12
+ .readlines(file_name)
13
+ .select { |line| line.start_with? 'class' }
14
+ .map(&:chomp)
15
+ .map { |declaration| declaration.split[1] }
16
+ ]
17
+ end
18
+
19
+ def constants_used_in_file(file_name)
20
+ [
21
+ file_name,
22
+
23
+ File
24
+ .readlines(file_name)
25
+ .map { |line| line.match(/.*\W([A-Z]\w+)/) }
26
+ .compact
27
+ .map { |match| match[1] }
28
+ ]
29
+ end
30
+
31
+ def files_impacted(constants_used_in_files, constant)
32
+ constants_used_in_files.select do |_, constants|
33
+ constants.include? constant
34
+ end
35
+ end
36
+
37
+ def spec_path(file_name)
38
+ return file_name if file_name.end_with? '_spec.rb'
39
+
40
+ file_name
41
+ .gsub('app', 'spec')
42
+ .gsub('.rb', '_spec.rb')
43
+ end
44
+
45
+ def find_specs_to_run(changed_files)
46
+ constants_in_files = Hash[
47
+ ruby_files.map { |filename| declared_constants(filename) }
48
+ ]
49
+
50
+ constants_used_in_files = Hash[
51
+ ruby_files.map { |file_name| constants_used_in_file(file_name) }
52
+ ]
53
+
54
+ constants_impacted = changed_files
55
+ .flat_map { |file_name| constants_in_files[file_name] }
56
+ .map { |constant| constant.split('::').last }
57
+
58
+ files_to_check = constants_impacted
59
+ .flat_map { |constant| files_impacted(constants_used_in_files, constant) }
60
+ .flat_map(&:keys)
61
+ .map { |file_name| spec_path(file_name) }
62
+ .uniq
63
+ .select { |file_name| File.exist? file_name }
64
+ end
metadata ADDED
@@ -0,0 +1,47 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: spectrerun
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Nick Johnstone
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-12-03 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Given a list of files that have change, find all the specs that should
14
+ be run
15
+ email: ncwjohnstone@gmail.com
16
+ executables:
17
+ - spectrerun
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - bin/spectrerun
22
+ - lib/spectrerun.rb
23
+ homepage: https://github.com/Widdershin/spectrerun
24
+ licenses:
25
+ - MIT
26
+ metadata: {}
27
+ post_install_message:
28
+ rdoc_options: []
29
+ require_paths:
30
+ - lib
31
+ required_ruby_version: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ required_rubygems_version: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ requirements: []
42
+ rubyforge_project:
43
+ rubygems_version: 2.2.5
44
+ signing_key:
45
+ specification_version: 4
46
+ summary: Find all the specs you need to run
47
+ test_files: []