flakey_spec_catcher 0.3.0 → 0.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 27339d7daba0c74bb7d57aec6a18685f1aa6034f11158a99e055e971eaebebe4
4
- data.tar.gz: cc738a7d26cc97a63dec0becca3cc9a13244c4cae9906a5645174d8277357f84
3
+ metadata.gz: 71dd2fe6a58fc01c2647d06f6aa20f9c904f6ced4d1a54278d96344c40534713
4
+ data.tar.gz: cc060a637c1e14e04e7fd914b84c0b6c854912512a649fcf95696f57069444e1
5
5
  SHA512:
6
- metadata.gz: cad188a9621417d13d104d0b26fe379e875daa2c4c571e64d6429acb04bd20898e8e727724e2916506e33d6a5bca8f9ca27175f3b154eebb5e3c096c92aaa7ce
7
- data.tar.gz: 17dcab2f7900196b7bc388ab6e37e86fbbd394b4cffd5d8a29fa7f751b61b55ce58523f59420c3f5ac9c3c2c706a7ceed6fd003aebb17a320551c578233cabff
6
+ metadata.gz: 28114d12131611ae6405bd0c3d066b44c16c3efece45633e46b1c8f5a263eec7189c45b46efbf112897e5e7cbeecf110f493ee499c79d76647f64e2da4a99abe
7
+ data.tar.gz: be57cbc9ab2052f770507effd1b2e985124607bc5bfa11b0c659279726969aea9390df6b352501bdd31a1e179cb3c554fd448dc24c705f4974087772f502bd00
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ /coverage
2
+ /Gemfile.lock
3
+ /flakey_spec_catcher-*.gem
4
+ /pkg
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2019 Instructure, Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,156 @@
1
+ # Flakey Spec Catcher (FSC)
2
+
3
+ ### About:
4
+
5
+ This gem is intended to catch and prevent the merging of flakey ruby specs.
6
+ Currently, it will run the equivalent of a git diff between the current branch's
7
+ commit and origin/master to detect any changes to files that contain `_spec.rb`.
8
+ For these files, it will re-run either the changed tests or the whole spec
9
+ file's test suite a specified number of times.
10
+
11
+ Note that `flakey_spec_catcher` will only detect committed changes, so make sure
12
+ to add any changed spec files to the commit and amend it if you're testing
13
+ locally.
14
+
15
+ All that's required is to install the gem and then call its executable,
16
+ `flakey_spec_catcher`.
17
+
18
+ ### Install:
19
+
20
+ ```sh
21
+ gem install flakey_spec_catcher
22
+ ```
23
+
24
+ Or add it to your Gemfile
25
+
26
+ ```ruby
27
+ # Gemfile
28
+ gem 'flakey_spec_catcher'
29
+ ```
30
+
31
+ and install with Bundler:
32
+
33
+ ```sh
34
+ bundle install
35
+ ```
36
+
37
+ ### Configuration:
38
+
39
+ In some cases, certain environment variables can be configured:
40
+
41
+ - `FSC_REPEAT_FACTOR`: Number of times the examples in each file will be run.
42
+ Defaults to 20.
43
+
44
+ - `FSC_IGNORE_FILES`: Specify changed files that will be exempt from FSC
45
+ re-runs. Regex matching is allowed.
46
+
47
+ - `FSC_IGNORE_BRANCHES`: Ignore any committed changes related to the specified
48
+ branch(es).
49
+
50
+ - `FSC_SILENT_MODE`: If 'true', FSC will return back with a exit status 0
51
+ regardless of the result. If 'false', FSC will return a non-zero exit status
52
+ if flakey specs are detected.
53
+
54
+ - `FSC_RERUN_FILE_ONLY`: If 'true', FSC will re-run the whole spec file that
55
+ contains changes rather than only re-running each individual, changed example
56
+ or test.
57
+
58
+ - `FSC_USAGE_PATTERNS`: Specify RSpec re-run usage patterns for specific
59
+ directories or paths. For example, if you want FSC to re-run your changes in
60
+ 'spec/ui' with `bundle exec rspec` and want your 'spec/api' changes to be
61
+ re-run with `parallel_rspec`, you could specify the following value:
62
+ `FSC_USAGE_PATTERNS='{ spec/ui/** => bundle exec rspec }, { spec/api => parallel_rspec }'`
63
+
64
+ Any of these environment variables can be overriden in the commit message by adding the environment variable key and
65
+ usage/value according to the accepted values specified above.
66
+
67
+ Example:
68
+
69
+ ```
70
+ Commit Message
71
+
72
+ FSC_REPEAT_FACTOR='10'
73
+ FSC_USAGE_PATTERNS = '{ spec/ui => bundle exec rspec }, { spec/api => parallel_rspec }'
74
+ ...
75
+
76
+ ```
77
+
78
+ ### How FSC works:
79
+
80
+ 1. GitController runs a git diff and creates a ChangeSummary object to
81
+ represent the git diff for each changed spec file.
82
+ 2. A ChangeCapsule uses the ChangeSummary object to go through each changed
83
+ file and identify ChangeContext objects.
84
+ 3. After representing all changed code blocks as ChangeContext objects within
85
+ a ChangeCapsule (one per file), ChangeCapsules are stored in the
86
+ CapsuleManager.
87
+ 4. User Configurations are parsed using the UserConfig class and an instance
88
+ is stored as an attribute in the Runner class.
89
+ 5. UserConfig and CapsuleManager objects are used to initialize a RerunManager
90
+ object which creates a RerunCapsule object for each ChangeContext and pairs it
91
+ with an rspec usage based on user configurations.
92
+ 6. RerunManager flattens the number of re-runs based on user settings and
93
+ passes back the identified file/test changes to the Runner along with their
94
+ specified usages.
95
+ 7. Runner will re-run each of the changes at a file level or the specific
96
+ context-level of each test and will exit with a 0 if all changes passed all of
97
+ their re-runs or a non-zero exit status (passed from RSpec).
98
+
99
+ See class documentation for more details.
100
+
101
+ ### Release:
102
+
103
+ We release `flakey_spec_catcher` to [RubyGems.org].
104
+
105
+ To release a new gem version:
106
+
107
+ 1) Bump the gem version as appropriate in `lib/flakey_spec_catcher/version.rb`.
108
+ Follow [semantic versioning] principles. Commit, push to Gerrit, and merge.
109
+
110
+ 2) Pull master and install dependencies for good measure:
111
+
112
+ ```sh
113
+ git checkout master
114
+ git pull
115
+ bundle install
116
+ ```
117
+
118
+ 3) Now release the gem!
119
+
120
+ ```sh
121
+ bundle exec rake release
122
+ ```
123
+
124
+ This will build the gem, `git tag` HEAD with the current gem version, and push
125
+ the gem to [RubyGems.org].
126
+
127
+ To clean up after yourself:
128
+
129
+ ```sh
130
+ bundle exec rake clobber
131
+ ```
132
+
133
+ ### Testing FSC:
134
+
135
+ Since FSC relies on git commit history to correctly identify the specs that it
136
+ will re-run, we have several specs that will create a temporary commit with
137
+ staged changes, run the corresponding model specs to verify functionality, and
138
+ then remove the temporary commit and staged changes. Upon merging a commmit,
139
+ code health and code coverage are both assessed in SonarQube.
140
+
141
+ See: <https://sonarqube.core.inseng.net/dashboard?id=tab%3Aflakey_spec_catcher>
142
+
143
+ To test your FSC changes, we've setup some scripts that will build docker images
144
+ and run tests in the latest ruby versions.
145
+
146
+ ```sh
147
+ bash bin/build
148
+ bash bin/test
149
+ ```
150
+
151
+ ### License:
152
+
153
+ MIT. See LICENSE.txt for details.
154
+
155
+ [RubyGems.org]: https://rubygems.org/
156
+ [semantic versioning]: https://semver.org/
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+
5
+ CLOBBER.include(
6
+ 'coverage/',
7
+ 'pkg/',
8
+ 'flakey_spec_catcher-*.gem',
9
+ 'Gemfile.lock'
10
+ )
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ # rubocop:disable Layout/ExtraSpacing, Layout/SpaceAroundOperators
4
+ require './lib/flakey_spec_catcher/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = 'flakey_spec_catcher'
8
+ gem.version = FlakeySpecCatcher::VERSION
9
+ gem.license = 'MIT'
10
+ gem.authors = [
11
+ 'Brian Watson',
12
+ 'Mikey Hargiss',
13
+ 'Ben Nelson'
14
+ ]
15
+ gem.email = [
16
+ 'bwatson@instructure.com',
17
+ 'mhargiss@instructure.com',
18
+ 'bnelson@instructure.com'
19
+ ]
20
+ gem.summary = 'Run new or changed specs many times to prevent unreliable specs'
21
+
22
+ gem.files = `git ls-files -z`
23
+ .split("\x0")
24
+ .reject { |f| f.match(%r{^(test|spec|features|fixture_specs|bin)/}) }
25
+ .reject { |f| f.match(/^(Jenkinsfile|Dockerfile|.dockerignore|.rspec|.rubocop)/) }
26
+ gem.bindir = 'bin'
27
+ gem.executables = 'flakey_spec_catcher'
28
+ gem.require_paths = ['lib']
29
+
30
+ gem.metadata['allowed_push_host'] = 'https://rubygems.org'
31
+ gem.required_ruby_version = '>= 2.3'
32
+
33
+ gem.add_dependency 'rspec', '~> 3.8'
34
+ gem.add_development_dependency 'climate_control', '~> 0.2'
35
+ gem.add_development_dependency 'rake', '~> 12.3'
36
+ gem.add_development_dependency 'simplecov', '~> 0.17'
37
+ end
38
+ # rubocop:enable Layout/ExtraSpacing, Layout/SpaceAroundOperators
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module FlakeySpecCatcher
4
- VERSION = '0.3.0'
4
+ VERSION = '0.3.1'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flakey_spec_catcher
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Watson
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2019-10-10 00:00:00.000000000 Z
13
+ date: 2019-10-11 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rspec
@@ -78,7 +78,13 @@ executables:
78
78
  extensions: []
79
79
  extra_rdoc_files: []
80
80
  files:
81
+ - ".gitignore"
82
+ - Gemfile
83
+ - LICENSE.txt
84
+ - README.md
85
+ - Rakefile
81
86
  - bin/flakey_spec_catcher
87
+ - flakey_spec_catcher.gemspec
82
88
  - lib/flakey_spec_catcher.rb
83
89
  - lib/flakey_spec_catcher/capsule_manager.rb
84
90
  - lib/flakey_spec_catcher/change_capsule.rb