test_extensions 0.1.1 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Readme +9 -6
- data/lib/test_extensions.rb +10 -5
- data/lib/test_extensions/fresh_test_environment_creator.rb +204 -0
- data/lib/test_extensions/register_additional_observers.rb +76 -0
- data/lib/test_extensions/remove_constants_when_test_suite_finished.rb +70 -0
- data/lib/test_extensions/runnable.rb +41 -0
- metadata +8 -4
data/Readme
CHANGED
@@ -1,9 +1,8 @@
|
|
1
|
-
=
|
1
|
+
= Test Extensions
|
2
2
|
|
3
|
-
[<b>Home page</b>:]
|
3
|
+
[<b>Home page</b>:] http://test-extensions.rubyforge.org/
|
4
4
|
[<b>Project site</b>:] http://rubyforge.org/projects/test-extensions
|
5
5
|
[<b>Gem install</b>:] <tt>gem install test_extensions</tt>
|
6
|
-
[<b>Wiki</b>:] http://wiki.qualitysmith.com/
|
7
6
|
[<b>Author</b>:] Tyler Rick, and others
|
8
7
|
[<b>Copyright</b>:] 2007 QualitySmith, Inc.
|
9
8
|
[<b>License</b>:] {GNU General Public License}[http://www.gnu.org/copyleft/gpl.html]
|
@@ -28,7 +27,7 @@ After:
|
|
28
27
|
|
29
28
|
link:include/assert_equal_with_difference_highlighting-there_he_is.png
|
30
29
|
|
31
|
-
See http://
|
30
|
+
See http://quality-ext.rubyforge.org/classes/Test/Unit/Assertions.html#M000082 for full details.
|
32
31
|
|
33
32
|
=== Useful assertion methods
|
34
33
|
|
@@ -38,7 +37,7 @@ See http://qualitysmithext.rubyforge.org/classes/Test/Unit/Assertions.html#M0000
|
|
38
37
|
assert_match Regexp.loose_join('key phrase 1', 'key phrase 2'), "Some really long string that you want to make sure contains both key phrase 1 and key phrase 2, in that order, but you don't care too much about the stuff in between, and you don't really want to hand-craft the regular expression or worry about escaping things like '.'s and '*'s yourself."
|
39
38
|
* <b><tt>assert_changed</tt></b>: assert that a variable changed state during the course of the block (not really useful)
|
40
39
|
|
41
|
-
See the individual method documentation for each method for details. These methods are currently part of http://
|
40
|
+
See the individual method documentation for each method for details. These methods are currently part of http://quality-ext.rubyforge.org.
|
42
41
|
|
43
42
|
Rails-specific:
|
44
43
|
* assert_user_error
|
@@ -48,6 +47,10 @@ Rails-specific:
|
|
48
47
|
* <b><tt>capture_output</tt></b> -- captures the standard output/error from the method under test (rather than letting it print to the screen) so that you can make assertions about it.
|
49
48
|
* <b><tt>simulate_input</tt></b> -- if your application is expecting some kind of user input on stdin, this method can be used to simulate the input, so that your test is completely automated and self-contained.
|
50
49
|
|
50
|
+
=== FreshTestCaseCreator
|
51
|
+
|
52
|
+
...
|
53
|
+
|
51
54
|
== Installation
|
52
55
|
|
53
56
|
sudo gem install test_extensions --include-dependencies
|
@@ -65,7 +68,7 @@ Then just throw this in your <tt>test_helper.rb</tt>:
|
|
65
68
|
Gems:
|
66
69
|
* colored
|
67
70
|
* facets
|
68
|
-
*
|
71
|
+
* quality_extensions
|
69
72
|
|
70
73
|
== Problems, questions, comments, or contributions?
|
71
74
|
|
data/lib/test_extensions.rb
CHANGED
@@ -1,13 +1,18 @@
|
|
1
1
|
require 'test/unit'
|
2
|
+
|
2
3
|
require 'rubygems'
|
3
4
|
|
4
5
|
gem 'facets'
|
5
6
|
require 'facets/core/kernel/require_local'
|
7
|
+
|
6
8
|
require_local 'test_extensions/test_colorizer'
|
9
|
+
require_local 'test_extensions/runnable'
|
10
|
+
require_local 'test_extensions/remove_constants_when_test_suite_finished'
|
11
|
+
require_local 'test_extensions/fresh_test_environment_creator'
|
7
12
|
|
8
|
-
gem '
|
9
|
-
require '
|
10
|
-
require '
|
11
|
-
require '
|
13
|
+
gem 'quality_extensions'
|
14
|
+
require 'quality_extensions/regexp/join'
|
15
|
+
require 'quality_extensions/kernel/capture_output.rb'
|
16
|
+
require 'quality_extensions/kernel/simulate_input.rb'
|
12
17
|
|
13
|
-
require '
|
18
|
+
require 'quality_extensions/test/all'
|
@@ -0,0 +1,204 @@
|
|
1
|
+
#--
|
2
|
+
# Author:: Tyler Rick
|
3
|
+
# Copyright:: Copyright (c) 2007 QualitySmith, Inc.
|
4
|
+
# License:: GPL
|
5
|
+
# Developer notes::
|
6
|
+
# Changes::
|
7
|
+
#++
|
8
|
+
|
9
|
+
require 'test/unit'
|
10
|
+
require 'test/unit/ui/console/testrunner'
|
11
|
+
require 'rubygems'
|
12
|
+
require 'facets/core/kernel/require_local'
|
13
|
+
require 'facets/core/kernel/load_local'
|
14
|
+
require 'facets/core/kernel/with'
|
15
|
+
require 'quality_extensions/module/remove_const'
|
16
|
+
require 'quality_extensions/module/create'
|
17
|
+
require 'quality_extensions/object/ignore_access'
|
18
|
+
|
19
|
+
# useful if you want to try multiple different configurations of the same class
|
20
|
+
# and make sure that they all are compatabible in some way (document in your common tests)
|
21
|
+
# creates a clean slate by removing constants...
|
22
|
+
# Lets you cleanly *document* both all the *commonalities* and all the *differences* between two different behaviors (caused by two different configurations)
|
23
|
+
#
|
24
|
+
# Example:
|
25
|
+
# # Common setup
|
26
|
+
# test_environment_creator = FreshTestEnvironmentCreator.new(:classes_to_remove => [MyModel]) do
|
27
|
+
# def setup
|
28
|
+
# @object = ClassWithSomeConfiguration.new
|
29
|
+
# end
|
30
|
+
# def test_common_stuff
|
31
|
+
# # These tests should hold true whether we're acting acts_one_way *or* acts_another_way
|
32
|
+
# ...
|
33
|
+
# end
|
34
|
+
# end
|
35
|
+
#
|
36
|
+
# # The setup for TestWhenActingOneWay
|
37
|
+
# class MyModel < ActiveRecord::Base
|
38
|
+
# acts_one_way
|
39
|
+
# end
|
40
|
+
# # The TestWhenActingOneWay TestCase itself
|
41
|
+
# test_environment_creator.create(:TestWhenActingOneWay) do
|
42
|
+
# def test_1
|
43
|
+
# ...
|
44
|
+
# end
|
45
|
+
# end.run!
|
46
|
+
#
|
47
|
+
# # The setup for TestWhenActingAnotherWay
|
48
|
+
# class MyModel < ActiveRecord::Base
|
49
|
+
# acts_another_way
|
50
|
+
# end
|
51
|
+
# # The TestWhenActingAnotherWay TestCase itself
|
52
|
+
# test_environment_creator.create(:TestWhenActingAnotherWay) do
|
53
|
+
# def test_1
|
54
|
+
# ...
|
55
|
+
# end
|
56
|
+
# end.run!
|
57
|
+
#
|
58
|
+
class FreshTestEnvironmentCreator
|
59
|
+
def initialize(options = {}, &common_tests)
|
60
|
+
@classes_to_remove = options[:classes_to_remove] || []
|
61
|
+
@common_tests = Module.create(:CommonTests, &common_tests) if block_given?
|
62
|
+
end
|
63
|
+
def create(test_case_name, &contents_of_class)
|
64
|
+
returning test_case_class = Class.create(test_case_name, :superclass => Test::Unit::TestCase, &contents_of_class) do
|
65
|
+
test_case_class.send :include, @common_tests if @common_tests
|
66
|
+
test_case_class.ignore_access.class_variable_set(:@@classes_to_remove, @classes_to_remove)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
class Test::Unit::TestCase
|
72
|
+
def self.run!
|
73
|
+
Test::Unit::UI::Console::TestRunner.run(self)
|
74
|
+
|
75
|
+
self.ignore_access.class_variable_get(:@@classes_to_remove).each do |class_to_reload|
|
76
|
+
class_to_reload.remove_const! rescue nil
|
77
|
+
end if self.ignore_access.class_variables.include?('@@classes_to_remove')
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
|
84
|
+
# _____ _
|
85
|
+
# |_ _|__ ___| |_
|
86
|
+
# | |/ _ \/ __| __|
|
87
|
+
# | | __/\__ \ |_
|
88
|
+
# |_|\___||___/\__|
|
89
|
+
#
|
90
|
+
=begin test
|
91
|
+
require 'test/unit'
|
92
|
+
require 'facets/core/integer/multiple'
|
93
|
+
|
94
|
+
#---------------------------------------------------------------------------------------------------------------------------------
|
95
|
+
# You don't need FreshTestEnvironmentCreator if all you want is some tests / setup common to multiple test cases...
|
96
|
+
# It provides that as a feature, but that's easy to do by simply creating a module containing your common test code...
|
97
|
+
|
98
|
+
module CommonTestsAndSetup
|
99
|
+
def setup
|
100
|
+
puts 'Common setup'
|
101
|
+
end
|
102
|
+
def test_common_1
|
103
|
+
puts 'test_common_1'
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
class Test1 < Test::Unit::TestCase
|
108
|
+
include CommonTestsAndSetup
|
109
|
+
def setup
|
110
|
+
super
|
111
|
+
puts 'Special setup for Test1'
|
112
|
+
end
|
113
|
+
def test_1
|
114
|
+
puts 'test_1'
|
115
|
+
end
|
116
|
+
end
|
117
|
+
Test1.run!
|
118
|
+
|
119
|
+
class Test2 < Test::Unit::TestCase
|
120
|
+
include CommonTestsAndSetup
|
121
|
+
def test_1
|
122
|
+
puts 'test_2'
|
123
|
+
end
|
124
|
+
end
|
125
|
+
Test2.run!
|
126
|
+
|
127
|
+
puts '---------------------------------------------------------------------------------------------------------------------------------'
|
128
|
+
#---------------------------------------------------------------------------------------------------------------------------------
|
129
|
+
# Beginning of actual tests for FreshTestEnvironmentCreator.
|
130
|
+
|
131
|
+
class BaseClass
|
132
|
+
def abstract?; true; end
|
133
|
+
def do_the_stuff_we_always_do; "We did the stuff that we're always supposed to do."; end
|
134
|
+
def gather_user_input; "Some really unintuitive default user interface for gather input from the user."; end
|
135
|
+
def do_computations; "Computing... " + (1..10).to_a.join(',') + ',done'; end
|
136
|
+
def behave!
|
137
|
+
gather_user_input +
|
138
|
+
do_the_stuff_we_always_do +
|
139
|
+
do_computations
|
140
|
+
end
|
141
|
+
|
142
|
+
# Configuration macros, which do any number of unknown things to the class which might be hard to undo if you wanted to create
|
143
|
+
# that class again with the same name but with a different configuration... In other words, lets assume that these macros
|
144
|
+
# do all kind of nasty things to the class, which would necessitate us doing a remove_const and redefining the class again
|
145
|
+
# from scratch if we wanted to be guaranteed of having a clean slate...
|
146
|
+
def self.behave_efficiently
|
147
|
+
define_method :do_computations do
|
148
|
+
"Computing... " + (1..10).select(&:even?).join(',') + ',done'
|
149
|
+
end
|
150
|
+
end
|
151
|
+
def self.behave_intelligently
|
152
|
+
define_method :gather_user_input do
|
153
|
+
"Read your mind and intelligently predict what you're trying to accomplish."
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
test_environment_creator = FreshTestEnvironmentCreator.new(:classes_to_remove => [ClassWithSomeConfiguration]) do
|
159
|
+
def setup
|
160
|
+
@object = ClassWithSomeConfiguration.new
|
161
|
+
end
|
162
|
+
def test_common_stuff
|
163
|
+
puts 'Testing common stuff'
|
164
|
+
assert_match Regexp.union("We did the stuff"), @object.behave!
|
165
|
+
assert_match /We did the stuff that we're always supposed to do./, @object.behave!
|
166
|
+
#' (To fix syntax highlighting in vim)
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
#---------------------------------------------------------------------------------------------------------------------------------
|
171
|
+
|
172
|
+
class ClassWithSomeConfiguration < BaseClass
|
173
|
+
behave_efficiently
|
174
|
+
end
|
175
|
+
|
176
|
+
test_environment_creator.create(:TestOfEfficiency) do
|
177
|
+
def test_1
|
178
|
+
puts "Testing behave_efficiently"
|
179
|
+
assert_match Regexp.union("unintuitive default user interface"), @object.behave!
|
180
|
+
assert_match Regexp.union("2,4,6,8,10,done"), @object.behave!
|
181
|
+
end
|
182
|
+
end.run!
|
183
|
+
|
184
|
+
#---------------------------------------------------------------------------------------------------------------------------------
|
185
|
+
|
186
|
+
class ClassWithSomeConfiguration < BaseClass
|
187
|
+
behave_intelligently
|
188
|
+
end
|
189
|
+
|
190
|
+
test_environment_creator.create(:TestOfIntelligence) do
|
191
|
+
def setup
|
192
|
+
puts "(A bit of setup specific to this test case...)"
|
193
|
+
super
|
194
|
+
end
|
195
|
+
def test_1
|
196
|
+
puts "Testing behave_intelligently"
|
197
|
+
assert_match Regexp.union("intelligently predict"), @object.behave!
|
198
|
+
assert_match Regexp.union("1,2,3,4,5,6,7,8,9,10,done"), @object.behave!
|
199
|
+
end
|
200
|
+
end.run!
|
201
|
+
|
202
|
+
|
203
|
+
=end
|
204
|
+
|
@@ -0,0 +1,76 @@
|
|
1
|
+
#--
|
2
|
+
# Author:: Tyler Rick
|
3
|
+
# Copyright:: Copyright (c) 2007 QualitySmith, Inc.
|
4
|
+
# License:: GPL
|
5
|
+
# Developer notes::
|
6
|
+
# Changes::
|
7
|
+
#++
|
8
|
+
|
9
|
+
require 'test/unit/ui/console/testrunner'
|
10
|
+
|
11
|
+
require 'rubygems'
|
12
|
+
require 'quality_extensions/module/alias_method_chain'
|
13
|
+
|
14
|
+
class Test::Unit::UI::TestRunnerMediator
|
15
|
+
# Test::Unit uses listeners to notify the UI of test progress, failures, etc. That's great, if you're writing a new UI.
|
16
|
+
# But unfortunately, it doesn't provide an easy way (that I could find) to add your *own* listeners (for things *other* than the UI).
|
17
|
+
# The only place that I see add_listener used anywhere in Test::Unit is in the UI classes (ui/*/testrunner.rb).
|
18
|
+
#
|
19
|
+
# So how does one hook into Test::Unit to register/add a listener for things *without* writing a new UI? (Let's assume we're
|
20
|
+
# perfectly happy with the Test::Unit::UI::Console UI...)
|
21
|
+
#
|
22
|
+
# They've provided some nice "events" ("channels"?) -- like TestCase::STARTED, TestCase::FINISHED, TestResult::FAULT -- but
|
23
|
+
# how do I register with Test::Unit that *I* want to be notified of those events too?
|
24
|
+
#
|
25
|
+
# Also, add_listener is an instance method -- how do you get inside of TestCase/TestRunnerMediator so that you *have* an instance?
|
26
|
+
#
|
27
|
+
# I wanted to add my *own* listener callback. So that's why I wrote this monkey patch... (If there's an easier way, let me know...)
|
28
|
+
#
|
29
|
+
# * Test::Unit::TestCase::FINISHED -- Seems to be called not when the entire TestCase has finished running (as the name would suggest) but after every test *method* in the TestCase...?
|
30
|
+
# * Test::Unit::UI::TestRunnerMediator::FINISHED -- When all the tests for a whole suite have finished
|
31
|
+
|
32
|
+
def self.register_additional_observers(&block)
|
33
|
+
@@additional_observers_procs ||= []
|
34
|
+
@@additional_observers_procs.push block
|
35
|
+
end
|
36
|
+
def run_suite_with_additional_observers
|
37
|
+
@@additional_observers_procs.each do |proc|
|
38
|
+
proc.call(self)
|
39
|
+
end if defined?(@@additional_observers_procs)
|
40
|
+
run_suite_without_additional_observers
|
41
|
+
end
|
42
|
+
alias_method_chain :run_suite, :additional_observers
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
# _____ _
|
47
|
+
# |_ _|__ ___| |_
|
48
|
+
# | |/ _ \/ __| __|
|
49
|
+
# | | __/\__ \ |_
|
50
|
+
# |_|\___||___/\__|
|
51
|
+
#
|
52
|
+
=begin test
|
53
|
+
require 'test/unit'
|
54
|
+
require 'rubygems'
|
55
|
+
require 'facets/core/kernel/require_local'
|
56
|
+
require_local 'runnable'
|
57
|
+
|
58
|
+
Test::Unit::UI::TestRunnerMediator.register_additional_observers do |mediator|
|
59
|
+
mediator.add_listener(Test::Unit::TestCase::FINISHED) do |*args|
|
60
|
+
puts "FINISHED!"
|
61
|
+
p args
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
class Test1 < Test::Unit::TestCase
|
67
|
+
def test_1
|
68
|
+
end
|
69
|
+
def test_2
|
70
|
+
end
|
71
|
+
end
|
72
|
+
Test1.run!
|
73
|
+
|
74
|
+
=end
|
75
|
+
|
76
|
+
|
@@ -0,0 +1,70 @@
|
|
1
|
+
#--
|
2
|
+
# Author:: Tyler Rick
|
3
|
+
# Copyright:: Copyright (c) 2007 QualitySmith, Inc.
|
4
|
+
# License:: GPL
|
5
|
+
# Developer notes::
|
6
|
+
# Changes::
|
7
|
+
#++
|
8
|
+
|
9
|
+
require 'test/unit'
|
10
|
+
require 'test/unit/ui/console/testrunner'
|
11
|
+
|
12
|
+
require 'rubygems'
|
13
|
+
require 'facets/core/kernel/require_local'
|
14
|
+
require 'quality_extensions/module/remove_const'
|
15
|
+
require 'quality_extensions/object/ignore_access'
|
16
|
+
require 'quality_extensions/module/alias_method_chain'
|
17
|
+
|
18
|
+
require_local 'runnable'
|
19
|
+
|
20
|
+
class Test::Unit::TestCase
|
21
|
+
|
22
|
+
def self.run_with_remove_constants_when_test_suite_finished!
|
23
|
+
run_without_remove_constants_when_test_suite_finished!
|
24
|
+
|
25
|
+
self.ignore_access.class_variable_get(:@@classes_to_remove).each do |class_to_reload|
|
26
|
+
#puts "removing #{class_to_reload}"
|
27
|
+
class_to_reload.remove_const! rescue nil
|
28
|
+
end if self.ignore_access.class_variables.include?('@@classes_to_remove')
|
29
|
+
end
|
30
|
+
|
31
|
+
class << self
|
32
|
+
alias_method_chain :run!, :remove_constants_when_test_suite_finished
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
|
38
|
+
# _____ _
|
39
|
+
# |_ _|__ ___| |_
|
40
|
+
# | |/ _ \/ __| __|
|
41
|
+
# | | __/\__ \ |_
|
42
|
+
# |_|\___||___/\__|
|
43
|
+
#
|
44
|
+
=begin test
|
45
|
+
require 'test/unit'
|
46
|
+
|
47
|
+
class Foo
|
48
|
+
def method1; end
|
49
|
+
end
|
50
|
+
|
51
|
+
class Test1 < Test::Unit::TestCase
|
52
|
+
def test_1
|
53
|
+
assert_nothing_raised { Foo.new.method1 }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
Test1.ignore_access.class_variable_set(:@@classes_to_remove, [Foo])
|
57
|
+
Test1.run!
|
58
|
+
|
59
|
+
class Foo
|
60
|
+
end
|
61
|
+
|
62
|
+
class Test2 < Test::Unit::TestCase
|
63
|
+
def test_1
|
64
|
+
assert_raise(NoMethodError) { Foo.new.method1 }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
Test2.run!
|
68
|
+
|
69
|
+
=end
|
70
|
+
|
@@ -0,0 +1,41 @@
|
|
1
|
+
#--
|
2
|
+
# Author:: Tyler Rick
|
3
|
+
# Copyright:: Copyright (c) 2007 QualitySmith, Inc.
|
4
|
+
# License:: GPL
|
5
|
+
# Developer notes::
|
6
|
+
# Changes::
|
7
|
+
#++
|
8
|
+
|
9
|
+
require 'test/unit'
|
10
|
+
require 'test/unit/ui/console/testrunner'
|
11
|
+
|
12
|
+
require 'rubygems'
|
13
|
+
require 'quality_extensions/module/remove_const'
|
14
|
+
require 'quality_extensions/module/create'
|
15
|
+
require 'quality_extensions/object/ignore_access'
|
16
|
+
|
17
|
+
class Test::Unit::TestCase
|
18
|
+
# Just a (much conciser) wrapper for Test::Unit::UI::Console::TestRunner.run(NameOfTestCase)
|
19
|
+
def self.run!
|
20
|
+
Test::Unit::UI::Console::TestRunner.run(self)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
# _____ _
|
26
|
+
# |_ _|__ ___| |_
|
27
|
+
# | |/ _ \/ __| __|
|
28
|
+
# | | __/\__ \ |_
|
29
|
+
# |_|\___||___/\__|
|
30
|
+
#
|
31
|
+
=begin test
|
32
|
+
require 'test/unit'
|
33
|
+
|
34
|
+
class Test1 < Test::Unit::TestCase
|
35
|
+
def test_1
|
36
|
+
end
|
37
|
+
end
|
38
|
+
Test1.run!
|
39
|
+
|
40
|
+
=end
|
41
|
+
|
metadata
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.
|
2
|
+
rubygems_version: 0.9.4
|
3
3
|
specification_version: 1
|
4
4
|
name: test_extensions
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.1.
|
7
|
-
date: 2007-
|
6
|
+
version: 0.1.3
|
7
|
+
date: 2007-10-09 00:00:00 -07:00
|
8
8
|
summary: A collection of user-contributed enhancements and new methods for Test::Unit
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -31,6 +31,10 @@ authors:
|
|
31
31
|
files:
|
32
32
|
- lib/test_extensions.rb
|
33
33
|
- lib/test_extensions/test_colorizer.rb
|
34
|
+
- lib/test_extensions/remove_constants_when_test_suite_finished.rb
|
35
|
+
- lib/test_extensions/register_additional_observers.rb
|
36
|
+
- lib/test_extensions/fresh_test_environment_creator.rb
|
37
|
+
- lib/test_extensions/runnable.rb
|
34
38
|
- Readme
|
35
39
|
test_files: []
|
36
40
|
|
@@ -68,7 +72,7 @@ dependencies:
|
|
68
72
|
version: 0.0.0
|
69
73
|
version:
|
70
74
|
- !ruby/object:Gem::Dependency
|
71
|
-
name:
|
75
|
+
name: quality_extensions
|
72
76
|
version_requirement:
|
73
77
|
version_requirements: !ruby/object:Gem::Version::Requirement
|
74
78
|
requirements:
|