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 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