minitest-tagz 0.2.0 → 1.0.0

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: ebe2a552b70a6c9636949552b092405b0ff8606b
4
- data.tar.gz: 41d024c65a904fd822f0e4d15afd7864eb1c9bfd
3
+ metadata.gz: 8743f494fc917d96a638d22e0d98cfaa5e94a3ae
4
+ data.tar.gz: 1cdd782cfd5edc53da8e3a25c1817e6d05a6023f
5
5
  SHA512:
6
- metadata.gz: 520e49ba6db312c4e5617390aa49ba1ee22103518c1523d2f742815eba564d596fe7c664f78ee908131b406752cbe36ba5036027b6b752b8ba2325064ca6f919
7
- data.tar.gz: eb2615c95ca8472a814146de35fb8c18d8d0360145c08a844b3d396de6235c17359de0c420968a071e9c72f221b225105119fce69d693e8dda35c92aff8b6910
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
- This wil let you do this like: `bundle exec rake test TAGS=fast,login` to run all
37
- tests with the fast and login tags.
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 )
@@ -1,5 +1,5 @@
1
1
  module Minitest
2
2
  module Tagz
3
- VERSION = "0.2.0"
3
+ VERSION = "1.0.0"
4
4
  end
5
5
  end
data/lib/minitest/tagz.rb CHANGED
@@ -1,73 +1,169 @@
1
1
  require 'minitest/tagz/version'
2
- require 'minitest/tagz/minitest_adapter'
2
+ require 'state_machine'
3
3
 
4
4
  module Minitest
5
5
  module Tagz
6
- class << self
7
- # Pick the tags you want to test
8
- def choose_tags(*tags)
9
- @chosen_tags = tags.map(&:to_sym).compact.to_set
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
- # Create a tag on a test
13
- def declare_tags(*pending_tags)
14
- @pending_tags = pending_tags
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
- # Record the given tags with the object
18
- def apply_tags(namespace, obj)
19
- if @pending_tags
20
- # TODO
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
- def record_blanket_tags
27
- if @pending_tags
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
- def apply_blanket_tags(namespace, obj)
35
- unless blanket_tags.empty?
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
- # Select all the testables with matching tags
41
- def filter(namespace, enum)
42
- enum.select {|obj| has_matching_tags?(namespace, obj)}
66
+ event :finished_applying_tags do
67
+ transition :applying_tags => :finished
68
+ end
43
69
  end
44
70
 
45
- def reset_blanket_tags
46
- @blanket_tags = []
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
- private
80
+ def patch_test_definitions
81
+ @patchers.each {|p| p.patch(self)}
82
+ end
50
83
 
51
- # Check if object has matching tags
52
- def has_matching_tags?(namespace, obj)
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 chosen_tags
58
- @chosen_tags ||= Set.new
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
- def tags
62
- @tags ||= Hash.new([])
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
- def blanket_tags
66
- @blanket_tags ||= reset_blanket_tags
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 blanket_tags=(arg)
70
- @blanket_tags = arg
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
@@ -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.2.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-08-24 00:00:00.000000000 Z
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.2.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,7 +0,0 @@
1
- #!/bin/bash
2
- set -euo pipefail
3
- IFS=$'\n\t'
4
-
5
- bundle install
6
-
7
- # Do any other automated setup that you need to do here
@@ -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