minitest-tagz 0.2.0 → 1.0.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 +4 -4
- data/README.md +5 -8
- data/lib/minitest/tagz/version.rb +1 -1
- data/lib/minitest/tagz.rb +139 -43
- data/minitest-tagz.gemspec +3 -0
- metadata +45 -6
- data/bin/console +0 -14
- data/bin/setup +0 -7
- data/lib/minitest/tagz/minitest_adapter.rb +0 -47
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8743f494fc917d96a638d22e0d98cfaa5e94a3ae
|
4
|
+
data.tar.gz: 1cdd782cfd5edc53da8e3a25c1817e6d05a6023f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 712ba39c5104fe7e02d80eb45026fc414a149853d3e86687a87a5670e301116b92e5e128aa1c24e993a458b9e383cfc8fb64085840ba06aaee176f78bde7ea66
|
7
|
+
data.tar.gz: 95a77a32b2cf90933512784b451e26471cf32b6e15071aec741bf5c23ed1cf1d8ac34f65194fb098056a89d8825f42963f82b3b7cc9758938e60112e52eae267
|
data/README.md
CHANGED
@@ -33,8 +33,11 @@ require 'minitest/tagz'
|
|
33
33
|
Minitest::Tagz.choose_tags(*ENV['TAGS'].split(',')) if ENV['TAGS']
|
34
34
|
```
|
35
35
|
|
36
|
-
|
37
|
-
|
36
|
+
Then, for example, you can run all tests with the `:fast` and `:login` tags:
|
37
|
+
|
38
|
+
```rb
|
39
|
+
bundle exec rake test TAGS=fast,login
|
40
|
+
```
|
38
41
|
|
39
42
|
## Usage
|
40
43
|
|
@@ -86,12 +89,6 @@ class MySpec < Minitest::Spec
|
|
86
89
|
end
|
87
90
|
```
|
88
91
|
|
89
|
-
## Development
|
90
|
-
|
91
|
-
After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
|
92
|
-
|
93
|
-
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
94
|
-
|
95
92
|
## Contributing
|
96
93
|
|
97
94
|
1. Fork it ( https://github.com/backupify/minitest-tagz/fork )
|
data/lib/minitest/tagz.rb
CHANGED
@@ -1,73 +1,169 @@
|
|
1
1
|
require 'minitest/tagz/version'
|
2
|
-
require '
|
2
|
+
require 'state_machine'
|
3
3
|
|
4
4
|
module Minitest
|
5
5
|
module Tagz
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
module MinitestRunnerStrategy
|
7
|
+
class << self
|
8
|
+
def serialize(owner, test_name)
|
9
|
+
"#{owner} >> #{test_name}"
|
10
|
+
end
|
11
|
+
|
12
|
+
def patch
|
13
|
+
::Minitest::Test.singleton_class.class_eval do
|
14
|
+
attr_reader :tag_map
|
15
|
+
|
16
|
+
old_runnable_methods = instance_method(:runnable_methods)
|
17
|
+
define_method :runnable_methods do
|
18
|
+
if Tagz.chosen_tags && Tagz.chosen_tags.any?
|
19
|
+
all_runnables = old_runnable_methods.bind(self).call
|
20
|
+
all_runnables.select do |r|
|
21
|
+
next false unless MinitestRunnerStrategy.tag_map[MinitestRunnerStrategy.serialize(self, r)]
|
22
|
+
(Tagz.chosen_tags - MinitestRunnerStrategy.tag_map[MinitestRunnerStrategy.serialize(self, r)]).empty?
|
23
|
+
end
|
24
|
+
else
|
25
|
+
old_runnable_methods.bind(self).call
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def tag_map
|
32
|
+
@tag_map ||= {}
|
33
|
+
end
|
10
34
|
end
|
35
|
+
end
|
11
36
|
|
12
|
-
|
13
|
-
|
14
|
-
|
37
|
+
MinitestRunnerStrategy.patch
|
38
|
+
RunnerStrategy = MinitestRunnerStrategy
|
39
|
+
|
40
|
+
module BaseMixin
|
41
|
+
def tag(*tags)
|
42
|
+
Tagz.declare_tag_assignment(self, tags)
|
15
43
|
end
|
44
|
+
end
|
16
45
|
|
17
|
-
|
18
|
-
def
|
19
|
-
|
20
|
-
|
21
|
-
tags["#{namespace}::#{obj}"] += @pending_tags
|
22
|
-
@pending_tags = nil
|
23
|
-
end
|
46
|
+
class TaggerFactory
|
47
|
+
def self.create_tagger(owner, pending_tags)
|
48
|
+
patchers = [MinitestPatcher]
|
49
|
+
Tagger.new(patchers, owner, pending_tags)
|
24
50
|
end
|
51
|
+
end
|
52
|
+
|
53
|
+
class Tagger
|
54
|
+
state_machine :state, initial: :awaiting_tag_declaration do
|
55
|
+
after_transition any => :awaiting_test_definition, do: :patch_test_definitions
|
56
|
+
after_transition any => :finished, do: :unpatch_test_definitions
|
25
57
|
|
26
|
-
|
27
|
-
|
28
|
-
# TODO
|
29
|
-
self.blanket_tags = @pending_tags
|
30
|
-
@pending_tags = nil
|
58
|
+
event :tags_declared do
|
59
|
+
transition :awaiting_tag_declaration => :awaiting_test_definition
|
31
60
|
end
|
32
|
-
end
|
33
61
|
|
34
|
-
|
35
|
-
|
36
|
-
tags["#{namespace}::#{obj}"] += @blanket_tags
|
62
|
+
event :initial_test_definition_encountered do
|
63
|
+
transition :awaiting_test_definition => :applying_tags
|
37
64
|
end
|
38
|
-
end
|
39
65
|
|
40
|
-
|
41
|
-
|
42
|
-
|
66
|
+
event :finished_applying_tags do
|
67
|
+
transition :applying_tags => :finished
|
68
|
+
end
|
43
69
|
end
|
44
70
|
|
45
|
-
|
46
|
-
|
71
|
+
attr_reader :patchers, :owner, :pending_tags
|
72
|
+
|
73
|
+
def initialize(patchers, owner, pending_tags)
|
74
|
+
@patchers = patchers
|
75
|
+
@owner = owner
|
76
|
+
@pending_tags = pending_tags
|
77
|
+
super()
|
47
78
|
end
|
48
79
|
|
49
|
-
|
80
|
+
def patch_test_definitions
|
81
|
+
@patchers.each {|p| p.patch(self)}
|
82
|
+
end
|
50
83
|
|
51
|
-
|
52
|
-
|
53
|
-
obj_tags = tags["#{namespace}::#{obj}"] || []
|
54
|
-
chosen_tags.all? { |tag| obj_tags.include?(tag) }
|
84
|
+
def unpatch_test_definitions
|
85
|
+
@patchers.each(&:unpatch)
|
55
86
|
end
|
56
87
|
|
57
|
-
def
|
58
|
-
|
88
|
+
def handle_initial_test_definition
|
89
|
+
is_initial = awaiting_test_definition?
|
90
|
+
initial_test_definition_encountered if is_initial
|
91
|
+
res = yield
|
92
|
+
finished_applying_tags if is_initial
|
93
|
+
res
|
59
94
|
end
|
95
|
+
end
|
96
|
+
|
97
|
+
module MinitestPatcher
|
98
|
+
::Minitest::Test.extend(Tagz::BaseMixin)
|
99
|
+
|
100
|
+
class << self
|
101
|
+
def patch(state_machine)
|
102
|
+
patch_minitest_test(state_machine)
|
103
|
+
patch_minitest_spec(state_machine)
|
104
|
+
end
|
105
|
+
|
106
|
+
def unpatch
|
107
|
+
unpatch_minitest_test
|
108
|
+
unpatch_minitest_spec
|
109
|
+
end
|
110
|
+
|
111
|
+
private
|
112
|
+
|
113
|
+
def patch_minitest_test(state_machine)
|
114
|
+
@old_method_added = old_method_added = Minitest::Test.method(:method_added)
|
115
|
+
Minitest::Test.class_eval do
|
116
|
+
define_singleton_method(:method_added) do |name|
|
117
|
+
if name[/^test_/]
|
118
|
+
state_machine.handle_initial_test_definition do
|
119
|
+
Tagz::RunnerStrategy.tag_map ||= {}
|
120
|
+
Tagz::RunnerStrategy.tag_map[Tagz::RunnerStrategy.serialize(self, name)] ||= []
|
121
|
+
Tagz::RunnerStrategy.tag_map[Tagz::RunnerStrategy.serialize(self, name)] += state_machine.pending_tags
|
122
|
+
old_method_added.call(name)
|
123
|
+
end
|
124
|
+
else
|
125
|
+
old_method_added.call(name)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
60
130
|
|
61
|
-
|
62
|
-
|
131
|
+
def unpatch_minitest_test
|
132
|
+
Minitest::Test.define_singleton_method(:method_added, @old_method_added)
|
133
|
+
end
|
134
|
+
|
135
|
+
def patch_minitest_spec(state_machine)
|
136
|
+
@old_describe = old_describe = Minitest::Spec.method(:describe)
|
137
|
+
Minitest::Spec.class_eval do
|
138
|
+
define_singleton_method(:describe) do |*args, &block|
|
139
|
+
state_machine.handle_initial_test_definition do
|
140
|
+
old_describe.unbind.bind(self).call(*args, &block)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def unpatch_minitest_spec
|
147
|
+
Minitest::Spec.define_singleton_method(:describe, @old_describe)
|
148
|
+
end
|
63
149
|
end
|
150
|
+
end
|
151
|
+
|
152
|
+
class << self
|
153
|
+
attr_accessor :chosen_tags
|
64
154
|
|
65
|
-
|
66
|
-
|
155
|
+
# Create a master TagSet that you wish to test. You only
|
156
|
+
# want to run tests with tags in this set
|
157
|
+
# @param [Enumerable<Symbol>] tags - a list of tags you want to test
|
158
|
+
def choose_tags(*tags)
|
159
|
+
@chosen_tags = tags
|
67
160
|
end
|
68
161
|
|
69
|
-
def
|
70
|
-
|
162
|
+
def declare_tag_assignment(owner, pending_tags)
|
163
|
+
tag_machine = TaggerFactory.create_tagger(owner, pending_tags)
|
164
|
+
tag_machine.tags_declared
|
165
|
+
# TODO add debugging tip about this
|
166
|
+
tag_machine
|
71
167
|
end
|
72
168
|
end
|
73
169
|
end
|
data/minitest-tagz.gemspec
CHANGED
@@ -20,9 +20,12 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.require_paths = ["lib"]
|
21
21
|
|
22
22
|
spec.add_dependency "minitest", "~> 5"
|
23
|
+
spec.add_dependency "shoulda-context"
|
24
|
+
spec.add_dependency 'state_machine'
|
23
25
|
|
24
26
|
spec.add_development_dependency "bundler"
|
25
27
|
spec.add_development_dependency "rake", "~> 10.0"
|
26
28
|
spec.add_development_dependency "guard"
|
27
29
|
spec.add_development_dependency "guard-minitest"
|
30
|
+
spec.add_development_dependency 'pry-byebug'
|
28
31
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: minitest-tagz
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Josh Bodah
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-12-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -24,6 +24,34 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '5'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: shoulda-context
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: state_machine
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
27
55
|
- !ruby/object:Gem::Dependency
|
28
56
|
name: bundler
|
29
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,6 +108,20 @@ dependencies:
|
|
80
108
|
- - ">="
|
81
109
|
- !ruby/object:Gem::Version
|
82
110
|
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: pry-byebug
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
83
125
|
description: allows you to tag different Minitest tests with tags that can be used
|
84
126
|
to filter tests
|
85
127
|
email:
|
@@ -96,10 +138,7 @@ files:
|
|
96
138
|
- LICENSE.txt
|
97
139
|
- README.md
|
98
140
|
- Rakefile
|
99
|
-
- bin/console
|
100
|
-
- bin/setup
|
101
141
|
- lib/minitest/tagz.rb
|
102
|
-
- lib/minitest/tagz/minitest_adapter.rb
|
103
142
|
- lib/minitest/tagz/version.rb
|
104
143
|
- minitest-tagz.gemspec
|
105
144
|
homepage: https://github.com/backupify/minitest-tagz
|
@@ -122,7 +161,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
122
161
|
version: '0'
|
123
162
|
requirements: []
|
124
163
|
rubyforge_project:
|
125
|
-
rubygems_version: 2.
|
164
|
+
rubygems_version: 2.4.8
|
126
165
|
signing_key:
|
127
166
|
specification_version: 4
|
128
167
|
summary: yet another tags implementation for Minitest
|
data/bin/console
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require "bundler/setup"
|
4
|
-
require "minitest/tagz"
|
5
|
-
|
6
|
-
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
-
# with your gem easier. You can also use a different console, if you like.
|
8
|
-
|
9
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require "pry"
|
11
|
-
# Pry.start
|
12
|
-
|
13
|
-
require "irb"
|
14
|
-
IRB.start
|
data/bin/setup
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
module Minitest
|
2
|
-
module Tagz
|
3
|
-
module MinitestAdapter
|
4
|
-
module Base
|
5
|
-
def tag(*tags)
|
6
|
-
Tagz.declare_tags(*tags)
|
7
|
-
end
|
8
|
-
|
9
|
-
def method_added(name)
|
10
|
-
return unless name[/^test_/]
|
11
|
-
Tagz.apply_tags(self, name)
|
12
|
-
end
|
13
|
-
|
14
|
-
def runnable_methods
|
15
|
-
Tagz.filter(self, super)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
module Spec
|
20
|
-
def describe(*args, &block)
|
21
|
-
Tagz.record_blanket_tags
|
22
|
-
super
|
23
|
-
apply_blanket_tags_recursively
|
24
|
-
Tagz.reset_blanket_tags
|
25
|
-
end
|
26
|
-
|
27
|
-
def apply_blanket_tags_recursively
|
28
|
-
test_methods_in_describe = instance_methods.select {|m| m[/^test/]}
|
29
|
-
test_methods_in_describe.each do |runnable|
|
30
|
-
Tagz.apply_blanket_tags(self, runnable)
|
31
|
-
end
|
32
|
-
|
33
|
-
children.each do |child|
|
34
|
-
child.apply_blanket_tags_recursively
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
if defined?(Minitest)
|
43
|
-
::Minitest::Test.singleton_class.prepend(Minitest::Tagz::MinitestAdapter::Base)
|
44
|
-
if defined?(Minitest::Spec)
|
45
|
-
::Minitest::Spec.singleton_class.prepend(Minitest::Tagz::MinitestAdapter::Spec)
|
46
|
-
end
|
47
|
-
end
|