active_cucumber 1.0.0 → 1.1.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 +5 -5
- data/.github/workflows/ruby.yml +28 -0
- data/.rubocop.yml +12 -24
- data/.ruby-version +1 -0
- data/CHANGELOG.md +73 -0
- data/DEVELOPMENT.md +14 -0
- data/Gemfile +17 -2
- data/Gemfile.lock +132 -110
- data/LICENSE.txt +1 -1
- data/README.md +63 -76
- data/Rakefile +15 -18
- data/active_cucumber.gemspec +22 -27
- data/cucumber.yml +1 -0
- data/documentation/horizontal_diff.png +0 -0
- data/documentation/vertical_diff.png +0 -0
- data/dprint.json +11 -0
- data/features/active_cucumber/attributes_for.feature +2 -12
- data/features/active_cucumber/create_many.feature +7 -13
- data/features/active_cucumber/create_one.feature +5 -9
- data/features/active_cucumber/diff_all/arrays_of_objects.feature +2 -11
- data/features/active_cucumber/diff_all/context_values.feature +1 -10
- data/features/active_cucumber/diff_all/converting_data.feature +4 -13
- data/features/active_cucumber/diff_all/filtering_columns.feature +2 -11
- data/features/active_cucumber/diff_all/filtering_rows.feature +2 -13
- data/features/active_cucumber/diff_all/mismatching_data.feature +4 -14
- data/features/active_cucumber/diff_one.feature +8 -13
- data/features/step_definitions/steps.rb +16 -15
- data/features/support/director.rb +2 -0
- data/features/support/env.rb +23 -25
- data/features/support/episode.rb +2 -0
- data/features/support/episode_creator.rb +6 -6
- data/features/support/episode_cucumberator.rb +2 -2
- data/features/support/genre.rb +2 -0
- data/features/support/show.rb +2 -0
- data/features/support/show_creator.rb +5 -4
- data/features/support/show_cucumberator.rb +3 -3
- data/features/support/subscription.rb +2 -0
- data/features/support/subscription_creator.rb +6 -6
- data/features/support/subscription_cucumberator.rb +4 -4
- data/lib/active_cucumber/active_record_builder.rb +26 -18
- data/lib/active_cucumber/creator.rb +44 -25
- data/lib/active_cucumber/cucumberator.rb +17 -15
- data/lib/active_cucumber/cucumparer.rb +13 -12
- data/lib/active_cucumber.rb +97 -25
- metadata +26 -166
- data/.coveralls.yml +0 -1
- data/circle.yml +0 -16
- data/cucumber_lint.yml +0 -13
|
@@ -1,57 +1,78 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
require "factory_bot"
|
|
4
4
|
|
|
5
|
+
module ActiveCucumber
|
|
5
6
|
# Creates ActiveRecord entries with data from given Cucumber tables.
|
|
6
7
|
class Creator
|
|
8
|
+
include FactoryBot::Syntax::Methods
|
|
7
9
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
def initialize attributes, context
|
|
10
|
+
def initialize(attributes, context)
|
|
11
11
|
@attributes = attributes
|
|
12
12
|
context.each do |key, value|
|
|
13
13
|
instance_variable_set "@#{key}", value
|
|
14
14
|
end
|
|
15
15
|
end
|
|
16
16
|
|
|
17
|
-
# Returns the
|
|
18
|
-
|
|
17
|
+
# Returns the FactoryBot version of this Creator's attributes.
|
|
18
|
+
# rubocop:disable Metrics/MethodLength
|
|
19
|
+
def factorybot_attributes
|
|
19
20
|
symbolize_attributes!
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
# Capture original keys and values before any transformations
|
|
22
|
+
# to ensure each value_for_* method receives the original value
|
|
23
|
+
original_attributes = @attributes.dup
|
|
24
|
+
keys_to_process = original_attributes.keys
|
|
25
|
+
keys_to_process.each do |key|
|
|
26
|
+
method = method_name(key)
|
|
27
|
+
next unless respond_to?(method)
|
|
28
|
+
|
|
29
|
+
value = original_attributes[key]
|
|
30
|
+
result = send(method, value)
|
|
31
|
+
|
|
32
|
+
# Keep the transformed value if it's truthy or if the original was nil
|
|
33
|
+
# Check if key still exists (value_for_* method may have deleted it)
|
|
34
|
+
if result || value.nil?
|
|
35
|
+
@attributes[key] = result if @attributes.key?(key)
|
|
24
36
|
else
|
|
25
|
-
@attributes.delete
|
|
37
|
+
@attributes.delete(key)
|
|
26
38
|
end
|
|
27
39
|
end
|
|
40
|
+
@attributes
|
|
28
41
|
end
|
|
42
|
+
# rubocop:enable Metrics/MethodLength
|
|
29
43
|
|
|
44
|
+
private
|
|
30
45
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
def method_missing method_name, *arguments
|
|
46
|
+
def method_missing(method_name, *, &)
|
|
34
47
|
# This is necessary so that a Creator subclass can access
|
|
35
48
|
# methods of @attributes as if they were its own.
|
|
36
|
-
@attributes.
|
|
49
|
+
if @attributes.respond_to?(method_name, true)
|
|
50
|
+
@attributes.send(method_name, *, &)
|
|
51
|
+
else
|
|
52
|
+
super
|
|
53
|
+
end
|
|
37
54
|
end
|
|
38
55
|
|
|
39
|
-
|
|
40
56
|
# Returns the name of the value_for method for the given key
|
|
41
|
-
def method_name
|
|
57
|
+
def method_name(key)
|
|
42
58
|
"value_for_#{key}"
|
|
43
59
|
end
|
|
44
60
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
def normalized_key key
|
|
61
|
+
# Converts the key given in Cucumber format into FactoryBot format
|
|
62
|
+
def normalized_key(key)
|
|
48
63
|
key.downcase.parameterize.underscore.to_sym
|
|
49
64
|
end
|
|
50
65
|
|
|
51
|
-
def normalized_value
|
|
52
|
-
|
|
66
|
+
def normalized_value(value)
|
|
67
|
+
return nil if value.nil?
|
|
68
|
+
return nil if value.respond_to?(:blank?) && value.blank?
|
|
69
|
+
|
|
70
|
+
value
|
|
53
71
|
end
|
|
54
72
|
|
|
73
|
+
def respond_to_missing?(method_name, include_private = false)
|
|
74
|
+
@attributes.respond_to?(method_name, include_private) || super
|
|
75
|
+
end
|
|
55
76
|
|
|
56
77
|
# Makes the keys on @attributes be normalized symbols
|
|
57
78
|
def symbolize_attributes!
|
|
@@ -61,7 +82,5 @@ module ActiveCucumber
|
|
|
61
82
|
end
|
|
62
83
|
end
|
|
63
84
|
end
|
|
64
|
-
|
|
65
85
|
end
|
|
66
|
-
|
|
67
86
|
end
|
|
@@ -1,57 +1,59 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
module ActiveCucumber
|
|
3
4
|
# A decorator for ActiveRecord objects that adds methods to
|
|
4
5
|
# format record attributes as they are displayed in Cucumber tables.
|
|
5
6
|
#
|
|
6
7
|
# This class is used by default. You can subclass it to create
|
|
7
8
|
# custom Cucumberators for your ActiveRecord classes.
|
|
8
9
|
class Cucumberator
|
|
9
|
-
|
|
10
10
|
# object - the instance to decorate
|
|
11
|
-
def initialize
|
|
11
|
+
def initialize(object, context)
|
|
12
12
|
@object = object
|
|
13
13
|
context.each do |key, value|
|
|
14
14
|
instance_variable_set "@#{key}", value
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
-
|
|
19
18
|
# Returns the Cucumber value for the given attribute key.
|
|
20
19
|
#
|
|
21
20
|
# If a value_for_* method is not defined for the given key,
|
|
22
21
|
# returns the attribute value of the decorated object,
|
|
23
22
|
# converted to a String.
|
|
24
|
-
def value_for
|
|
23
|
+
def value_for(key)
|
|
25
24
|
method_name = value_method_name key
|
|
26
25
|
if respond_to? method_name
|
|
27
26
|
send(method_name).to_s
|
|
28
27
|
else
|
|
29
|
-
@object.send(normalized_key
|
|
28
|
+
@object.send(normalized_key(key)).to_s
|
|
30
29
|
end
|
|
31
30
|
end
|
|
32
31
|
|
|
32
|
+
private
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
def method_missing method_name
|
|
34
|
+
def method_missing(method_name, *, &)
|
|
37
35
|
# This is necessary so that a Cucumberator subclass can access
|
|
38
36
|
# attributes of @object as if they were its own.
|
|
39
|
-
@object.
|
|
37
|
+
if @object.respond_to?(method_name, true)
|
|
38
|
+
@object.send(method_name, *, &)
|
|
39
|
+
else
|
|
40
|
+
super
|
|
41
|
+
end
|
|
40
42
|
end
|
|
41
43
|
|
|
42
|
-
|
|
43
44
|
# Converts the key given in Cucumber format into the format used to
|
|
44
45
|
# access attributes on an ActiveRecord instance.
|
|
45
|
-
def normalized_key
|
|
46
|
+
def normalized_key(key)
|
|
46
47
|
key.to_s.downcase.parameterize.underscore
|
|
47
48
|
end
|
|
48
49
|
|
|
50
|
+
def respond_to_missing?(method_name, include_private = false)
|
|
51
|
+
@object.respond_to?(method_name, include_private) || super
|
|
52
|
+
end
|
|
49
53
|
|
|
50
54
|
# Returns the name of the value_of_* method for the given key
|
|
51
|
-
def value_method_name
|
|
55
|
+
def value_method_name(key)
|
|
52
56
|
"value_for_#{normalized_key key}"
|
|
53
57
|
end
|
|
54
|
-
|
|
55
58
|
end
|
|
56
|
-
|
|
57
59
|
end
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
module ActiveCucumber
|
|
4
|
+
# provides Mortadella instances of the given database content
|
|
3
5
|
class Cucumparer
|
|
4
|
-
|
|
5
|
-
def initialize database_content, cucumber_table, context
|
|
6
|
+
def initialize(database_content, cucumber_table, context)
|
|
6
7
|
@database_content = database_content
|
|
7
8
|
@cucumber_table = cucumber_table
|
|
8
9
|
@context = context
|
|
@@ -10,6 +11,8 @@ module ActiveCucumber
|
|
|
10
11
|
|
|
11
12
|
# Returns all entries in the database as a horizontal Mortadella table
|
|
12
13
|
def to_horizontal_table
|
|
14
|
+
raise ArgumentError, "No headers provided in Cucumber table" if @cucumber_table.headers.empty?
|
|
15
|
+
|
|
13
16
|
mortadella = Mortadella::Horizontal.new headers: @cucumber_table.headers
|
|
14
17
|
@database_content = @database_content.all if @database_content.respond_to? :all
|
|
15
18
|
@database_content.each do |record|
|
|
@@ -22,34 +25,32 @@ module ActiveCucumber
|
|
|
22
25
|
end
|
|
23
26
|
|
|
24
27
|
# Returns the given object as a vertical Mortadella table
|
|
25
|
-
def to_vertical_table
|
|
28
|
+
def to_vertical_table(object)
|
|
26
29
|
mortadella = Mortadella::Vertical.new
|
|
27
30
|
cucumberator = cucumberator_for object
|
|
28
|
-
@cucumber_table.rows_hash.
|
|
31
|
+
@cucumber_table.rows_hash.each_key do |key|
|
|
29
32
|
mortadella[key] = cucumberator.value_for key
|
|
30
33
|
end
|
|
31
34
|
mortadella.table
|
|
32
35
|
end
|
|
33
36
|
|
|
34
|
-
|
|
37
|
+
private
|
|
35
38
|
|
|
36
|
-
# Returns the Cucumberator subclass to be used by this Cucumparer instance
|
|
37
|
-
def cucumberator_class
|
|
39
|
+
# Returns the Cucumberator subclass to be used by this Cucumparer instance.
|
|
40
|
+
def cucumberator_class(object)
|
|
38
41
|
cucumberator_class_name(object).constantize
|
|
39
42
|
rescue NameError
|
|
40
43
|
Cucumberator
|
|
41
44
|
end
|
|
42
45
|
|
|
43
46
|
# Returns the name of the Cucumberator subclass to be used by this Cucumparer instance.
|
|
44
|
-
def cucumberator_class_name
|
|
47
|
+
def cucumberator_class_name(object)
|
|
45
48
|
"#{object.class.name}Cucumberator"
|
|
46
49
|
end
|
|
47
50
|
|
|
48
51
|
# Returns the Cucumberator object for the given ActiveRecord instance
|
|
49
|
-
def cucumberator_for
|
|
52
|
+
def cucumberator_for(object)
|
|
50
53
|
cucumberator_class(object).new object, @context
|
|
51
54
|
end
|
|
52
|
-
|
|
53
55
|
end
|
|
54
|
-
|
|
55
56
|
end
|
data/lib/active_cucumber.rb
CHANGED
|
@@ -1,61 +1,133 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
require
|
|
4
|
-
require
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "active_record"
|
|
4
|
+
require "active_cucumber/cucumparer"
|
|
5
|
+
require "active_cucumber/cucumberator"
|
|
6
|
+
require "active_cucumber/active_record_builder"
|
|
7
|
+
require "active_cucumber/creator"
|
|
5
8
|
|
|
6
9
|
# The main namespace for this gem
|
|
7
10
|
module ActiveCucumber
|
|
8
|
-
|
|
9
11
|
# Returns the attributes to create an instance of the given ActiveRecord class
|
|
10
|
-
# that matches the given vertical Cucumber table
|
|
11
|
-
|
|
12
|
+
# that matches the given vertical Cucumber table.
|
|
13
|
+
#
|
|
14
|
+
# @param activerecord_class [Class] the ActiveRecord class to create attributes for
|
|
15
|
+
# @param cucumber_table [Cucumber::MultilineArgument::DataTable] a vertical Cucumber table
|
|
16
|
+
# @param context [Hash] optional context values to inject into custom Creator classes
|
|
17
|
+
# @return [Hash] FactoryBot-compatible attributes hash
|
|
18
|
+
# @raise [TypeError] if activerecord_class is not an ActiveRecord class
|
|
19
|
+
def self.attributes_for(activerecord_class, cucumber_table, context: {})
|
|
20
|
+
validate_activerecord_class!(activerecord_class)
|
|
21
|
+
validate_context!(context)
|
|
12
22
|
builder = ActiveRecordBuilder.new activerecord_class, context
|
|
13
23
|
builder.attributes_for ActiveCucumber.vertical_table(cucumber_table)
|
|
14
24
|
end
|
|
15
25
|
|
|
16
|
-
|
|
17
26
|
# Creates entries of the given ActiveRecord class
|
|
18
|
-
# specified by the given horizontal Cucumber table
|
|
19
|
-
|
|
27
|
+
# specified by the given horizontal Cucumber table.
|
|
28
|
+
#
|
|
29
|
+
# @param activerecord_class [Class] the ActiveRecord class to create records for
|
|
30
|
+
# @param cucumber_table [Cucumber::MultilineArgument::DataTable] a horizontal Cucumber table
|
|
31
|
+
# @param context [Hash] optional context values to inject into custom Creator classes
|
|
32
|
+
# @return [Array<ActiveRecord::Base>] array of created records
|
|
33
|
+
# @raise [TypeError] if activerecord_class is not an ActiveRecord class
|
|
34
|
+
# @raise [ActiveRecord::RecordInvalid] if any record fails validation
|
|
35
|
+
def self.create_many(activerecord_class, cucumber_table, context: {})
|
|
36
|
+
validate_activerecord_class!(activerecord_class)
|
|
37
|
+
validate_context!(context)
|
|
20
38
|
builder = ActiveRecordBuilder.new activerecord_class, context
|
|
21
39
|
builder.create_many ActiveCucumber.horizontal_table(cucumber_table)
|
|
22
40
|
end
|
|
23
41
|
|
|
24
|
-
|
|
25
42
|
# Creates an entry of the given ActiveRecord class
|
|
26
|
-
# specified by the given vertical Cucumber table
|
|
27
|
-
|
|
43
|
+
# specified by the given vertical Cucumber table.
|
|
44
|
+
#
|
|
45
|
+
# @param activerecord_class [Class] the ActiveRecord class to create a record for
|
|
46
|
+
# @param cucumber_table [Cucumber::MultilineArgument::DataTable] a vertical Cucumber table
|
|
47
|
+
# @param context [Hash] optional context values to inject into custom Creator classes
|
|
48
|
+
# @return [ActiveRecord::Base] the created record
|
|
49
|
+
# @raise [TypeError] if activerecord_class is not an ActiveRecord class
|
|
50
|
+
# @raise [ActiveRecord::RecordInvalid] if the record fails validation
|
|
51
|
+
def self.create_one(activerecord_class, cucumber_table, context: {})
|
|
52
|
+
validate_activerecord_class!(activerecord_class)
|
|
53
|
+
validate_context!(context)
|
|
28
54
|
builder = ActiveRecordBuilder.new activerecord_class, context
|
|
29
55
|
builder.create_record ActiveCucumber.vertical_table(cucumber_table)
|
|
30
56
|
end
|
|
31
57
|
|
|
32
|
-
|
|
33
58
|
# Verifies that the database table for the given ActiveRecord class
|
|
34
59
|
# matches the given horizontal Cucumber table.
|
|
35
60
|
#
|
|
36
|
-
#
|
|
37
|
-
|
|
61
|
+
# @param clazz [Class] the ActiveRecord class to compare records from
|
|
62
|
+
# @param cucumber_table [Cucumber::MultilineArgument::DataTable] a horizontal Cucumber table
|
|
63
|
+
# @param context [Hash] optional context values to inject into custom Cucumberator classes
|
|
64
|
+
# @return [void]
|
|
65
|
+
# @raise [Cucumber::MultilineArgument::DataTable::Different] if tables don't match
|
|
66
|
+
# @note Records are sorted by creation date before comparison
|
|
67
|
+
def self.diff_all!(clazz, cucumber_table, context: {})
|
|
68
|
+
validate_activerecord_class_or_collection!(clazz)
|
|
69
|
+
validate_context!(context)
|
|
38
70
|
cucumparer = Cucumparer.new clazz, cucumber_table, context
|
|
39
71
|
cucumber_table.diff! cucumparer.to_horizontal_table
|
|
40
72
|
end
|
|
41
73
|
|
|
42
|
-
|
|
43
|
-
#
|
|
44
|
-
|
|
74
|
+
# Verifies that the given object matches the given vertical Cucumber table.
|
|
75
|
+
#
|
|
76
|
+
# @param object [ActiveRecord::Base] the ActiveRecord instance to compare
|
|
77
|
+
# @param cucumber_table [Cucumber::MultilineArgument::DataTable] a vertical Cucumber table
|
|
78
|
+
# @param context [Hash] optional context values to inject into custom Cucumberator classes
|
|
79
|
+
# @return [void]
|
|
80
|
+
# @raise [Cucumber::MultilineArgument::DataTable::Different] if tables don't match
|
|
81
|
+
def self.diff_one!(object, cucumber_table, context: {})
|
|
82
|
+
validate_activerecord_instance!(object)
|
|
83
|
+
validate_context!(context)
|
|
45
84
|
cucumparer = Cucumparer.new object.class, cucumber_table, context
|
|
46
85
|
cucumber_table.diff! cucumparer.to_vertical_table(object)
|
|
47
86
|
end
|
|
48
87
|
|
|
49
|
-
|
|
50
|
-
#
|
|
51
|
-
|
|
88
|
+
# Returns the given horizontal Cucumber table in standardized format.
|
|
89
|
+
#
|
|
90
|
+
# @param table [Cucumber::MultilineArgument::DataTable] a horizontal Cucumber table
|
|
91
|
+
# @return [Array<Hash>] array of hashes where keys are column headers and values are cell values
|
|
92
|
+
def self.horizontal_table(table)
|
|
52
93
|
table.hashes
|
|
53
94
|
end
|
|
54
95
|
|
|
55
|
-
|
|
56
|
-
#
|
|
57
|
-
|
|
96
|
+
# Returns the given vertical Cucumber table in standardized format.
|
|
97
|
+
#
|
|
98
|
+
# @param table [Cucumber::MultilineArgument::DataTable] a vertical Cucumber table
|
|
99
|
+
# @return [Hash] hash where keys are from first column and values are from second column
|
|
100
|
+
def self.vertical_table(table)
|
|
58
101
|
table.rows_hash
|
|
59
102
|
end
|
|
60
103
|
|
|
104
|
+
# @api private
|
|
105
|
+
def self.validate_activerecord_class!(klass)
|
|
106
|
+
return if klass.is_a?(Class) && klass < ActiveRecord::Base
|
|
107
|
+
|
|
108
|
+
raise TypeError, "Expected an ActiveRecord class, got #{klass.inspect}"
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# @api private
|
|
112
|
+
def self.validate_activerecord_class_or_collection!(value)
|
|
113
|
+
# Allow ActiveRecord class, array of instances, or ActiveRecord relation/association
|
|
114
|
+
return if value.is_a?(Class) && value < ActiveRecord::Base
|
|
115
|
+
return if value.is_a?(Array) || value.respond_to?(:all)
|
|
116
|
+
|
|
117
|
+
raise TypeError, "Expected an ActiveRecord class or collection, got #{value.class}"
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# @api private
|
|
121
|
+
def self.validate_activerecord_instance!(object)
|
|
122
|
+
return if object.is_a?(ActiveRecord::Base)
|
|
123
|
+
|
|
124
|
+
raise TypeError, "Expected an ActiveRecord instance, got #{object.class}"
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# @api private
|
|
128
|
+
def self.validate_context!(context)
|
|
129
|
+
return if context.is_a?(Hash)
|
|
130
|
+
|
|
131
|
+
raise TypeError, "Expected context to be a Hash, got #{context.class}"
|
|
132
|
+
end
|
|
61
133
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: active_cucumber
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.1.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Kevin Goslar
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: bin
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 2025-11-04 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
13
|
name: activerecord
|
|
@@ -16,196 +15,56 @@ dependencies:
|
|
|
16
15
|
requirements:
|
|
17
16
|
- - ">="
|
|
18
17
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: '0'
|
|
20
|
-
type: :
|
|
18
|
+
version: '6.0'
|
|
19
|
+
type: :runtime
|
|
21
20
|
prerelease: false
|
|
22
21
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
22
|
requirements:
|
|
24
23
|
- - ">="
|
|
25
24
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: '0'
|
|
27
|
-
- !ruby/object:Gem::Dependency
|
|
28
|
-
name: bundler
|
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
|
30
|
-
requirements:
|
|
31
|
-
- - ">="
|
|
32
|
-
- !ruby/object:Gem::Version
|
|
33
|
-
version: '0'
|
|
34
|
-
type: :development
|
|
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: coveralls
|
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
|
44
|
-
requirements:
|
|
45
|
-
- - ">="
|
|
46
|
-
- !ruby/object:Gem::Version
|
|
47
|
-
version: '0'
|
|
48
|
-
type: :development
|
|
49
|
-
prerelease: false
|
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
-
requirements:
|
|
52
|
-
- - ">="
|
|
53
|
-
- !ruby/object:Gem::Version
|
|
54
|
-
version: '0'
|
|
25
|
+
version: '6.0'
|
|
55
26
|
- !ruby/object:Gem::Dependency
|
|
56
27
|
name: cucumber
|
|
57
28
|
requirement: !ruby/object:Gem::Requirement
|
|
58
29
|
requirements:
|
|
59
30
|
- - ">="
|
|
60
31
|
- !ruby/object:Gem::Version
|
|
61
|
-
version: '0'
|
|
62
|
-
type: :
|
|
32
|
+
version: '7.0'
|
|
33
|
+
type: :runtime
|
|
63
34
|
prerelease: false
|
|
64
35
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
36
|
requirements:
|
|
66
37
|
- - ">="
|
|
67
38
|
- !ruby/object:Gem::Version
|
|
68
|
-
version: '0'
|
|
39
|
+
version: '7.0'
|
|
69
40
|
- !ruby/object:Gem::Dependency
|
|
70
|
-
name:
|
|
41
|
+
name: factory_bot
|
|
71
42
|
requirement: !ruby/object:Gem::Requirement
|
|
72
43
|
requirements:
|
|
73
44
|
- - ">="
|
|
74
45
|
- !ruby/object:Gem::Version
|
|
75
|
-
version: '0'
|
|
76
|
-
type: :
|
|
46
|
+
version: '5.0'
|
|
47
|
+
type: :runtime
|
|
77
48
|
prerelease: false
|
|
78
49
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
50
|
requirements:
|
|
80
51
|
- - ">="
|
|
81
52
|
- !ruby/object:Gem::Version
|
|
82
|
-
version: '0'
|
|
83
|
-
- !ruby/object:Gem::Dependency
|
|
84
|
-
name: factory_girl
|
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
|
86
|
-
requirements:
|
|
87
|
-
- - ">="
|
|
88
|
-
- !ruby/object:Gem::Version
|
|
89
|
-
version: '0'
|
|
90
|
-
type: :development
|
|
91
|
-
prerelease: false
|
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
-
requirements:
|
|
94
|
-
- - ">="
|
|
95
|
-
- !ruby/object:Gem::Version
|
|
96
|
-
version: '0'
|
|
97
|
-
- !ruby/object:Gem::Dependency
|
|
98
|
-
name: faker
|
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
|
100
|
-
requirements:
|
|
101
|
-
- - ">="
|
|
102
|
-
- !ruby/object:Gem::Version
|
|
103
|
-
version: '0'
|
|
104
|
-
type: :development
|
|
105
|
-
prerelease: false
|
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
-
requirements:
|
|
108
|
-
- - ">="
|
|
109
|
-
- !ruby/object:Gem::Version
|
|
110
|
-
version: '0'
|
|
111
|
-
- !ruby/object:Gem::Dependency
|
|
112
|
-
name: kappamaki
|
|
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'
|
|
53
|
+
version: '5.0'
|
|
125
54
|
- !ruby/object:Gem::Dependency
|
|
126
55
|
name: mortadella
|
|
127
56
|
requirement: !ruby/object:Gem::Requirement
|
|
128
57
|
requirements:
|
|
129
58
|
- - ">="
|
|
130
59
|
- !ruby/object:Gem::Version
|
|
131
|
-
version: '0'
|
|
132
|
-
type: :
|
|
60
|
+
version: '1.0'
|
|
61
|
+
type: :runtime
|
|
133
62
|
prerelease: false
|
|
134
63
|
version_requirements: !ruby/object:Gem::Requirement
|
|
135
64
|
requirements:
|
|
136
65
|
- - ">="
|
|
137
66
|
- !ruby/object:Gem::Version
|
|
138
|
-
version: '0'
|
|
139
|
-
- !ruby/object:Gem::Dependency
|
|
140
|
-
name: rake
|
|
141
|
-
requirement: !ruby/object:Gem::Requirement
|
|
142
|
-
requirements:
|
|
143
|
-
- - ">="
|
|
144
|
-
- !ruby/object:Gem::Version
|
|
145
|
-
version: '0'
|
|
146
|
-
type: :development
|
|
147
|
-
prerelease: false
|
|
148
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
149
|
-
requirements:
|
|
150
|
-
- - ">="
|
|
151
|
-
- !ruby/object:Gem::Version
|
|
152
|
-
version: '0'
|
|
153
|
-
- !ruby/object:Gem::Dependency
|
|
154
|
-
name: rubocop
|
|
155
|
-
requirement: !ruby/object:Gem::Requirement
|
|
156
|
-
requirements:
|
|
157
|
-
- - ">="
|
|
158
|
-
- !ruby/object:Gem::Version
|
|
159
|
-
version: '0'
|
|
160
|
-
type: :development
|
|
161
|
-
prerelease: false
|
|
162
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
163
|
-
requirements:
|
|
164
|
-
- - ">="
|
|
165
|
-
- !ruby/object:Gem::Version
|
|
166
|
-
version: '0'
|
|
167
|
-
- !ruby/object:Gem::Dependency
|
|
168
|
-
name: rspec
|
|
169
|
-
requirement: !ruby/object:Gem::Requirement
|
|
170
|
-
requirements:
|
|
171
|
-
- - ">="
|
|
172
|
-
- !ruby/object:Gem::Version
|
|
173
|
-
version: '0'
|
|
174
|
-
type: :development
|
|
175
|
-
prerelease: false
|
|
176
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
177
|
-
requirements:
|
|
178
|
-
- - ">="
|
|
179
|
-
- !ruby/object:Gem::Version
|
|
180
|
-
version: '0'
|
|
181
|
-
- !ruby/object:Gem::Dependency
|
|
182
|
-
name: rspec-collection_matchers
|
|
183
|
-
requirement: !ruby/object:Gem::Requirement
|
|
184
|
-
requirements:
|
|
185
|
-
- - ">="
|
|
186
|
-
- !ruby/object:Gem::Version
|
|
187
|
-
version: '0'
|
|
188
|
-
type: :development
|
|
189
|
-
prerelease: false
|
|
190
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
191
|
-
requirements:
|
|
192
|
-
- - ">="
|
|
193
|
-
- !ruby/object:Gem::Version
|
|
194
|
-
version: '0'
|
|
195
|
-
- !ruby/object:Gem::Dependency
|
|
196
|
-
name: sqlite3
|
|
197
|
-
requirement: !ruby/object:Gem::Requirement
|
|
198
|
-
requirements:
|
|
199
|
-
- - ">="
|
|
200
|
-
- !ruby/object:Gem::Version
|
|
201
|
-
version: '0'
|
|
202
|
-
type: :development
|
|
203
|
-
prerelease: false
|
|
204
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
205
|
-
requirements:
|
|
206
|
-
- - ">="
|
|
207
|
-
- !ruby/object:Gem::Version
|
|
208
|
-
version: '0'
|
|
67
|
+
version: '1.0'
|
|
209
68
|
description: Tools to compare ActiveRecord entries with Cucumber tables
|
|
210
69
|
email:
|
|
211
70
|
- kevin.goslar@gmail.com
|
|
@@ -213,19 +72,22 @@ executables: []
|
|
|
213
72
|
extensions: []
|
|
214
73
|
extra_rdoc_files: []
|
|
215
74
|
files:
|
|
216
|
-
- ".
|
|
75
|
+
- ".github/workflows/ruby.yml"
|
|
217
76
|
- ".gitignore"
|
|
218
77
|
- ".rubocop.yml"
|
|
78
|
+
- ".ruby-version"
|
|
79
|
+
- CHANGELOG.md
|
|
80
|
+
- DEVELOPMENT.md
|
|
219
81
|
- Gemfile
|
|
220
82
|
- Gemfile.lock
|
|
221
83
|
- LICENSE.txt
|
|
222
84
|
- README.md
|
|
223
85
|
- Rakefile
|
|
224
86
|
- active_cucumber.gemspec
|
|
225
|
-
-
|
|
226
|
-
- cucumber_lint.yml
|
|
87
|
+
- cucumber.yml
|
|
227
88
|
- documentation/horizontal_diff.png
|
|
228
89
|
- documentation/vertical_diff.png
|
|
90
|
+
- dprint.json
|
|
229
91
|
- features/active_cucumber/attributes_for.feature
|
|
230
92
|
- features/active_cucumber/create_many.feature
|
|
231
93
|
- features/active_cucumber/create_one.feature
|
|
@@ -254,11 +116,11 @@ files:
|
|
|
254
116
|
- lib/active_cucumber/creator.rb
|
|
255
117
|
- lib/active_cucumber/cucumberator.rb
|
|
256
118
|
- lib/active_cucumber/cucumparer.rb
|
|
257
|
-
homepage: https://github.com/
|
|
119
|
+
homepage: https://github.com/kevgo/active_cucumber
|
|
258
120
|
licenses:
|
|
259
121
|
- MIT
|
|
260
|
-
metadata:
|
|
261
|
-
|
|
122
|
+
metadata:
|
|
123
|
+
rubygems_mfa_required: 'true'
|
|
262
124
|
rdoc_options: []
|
|
263
125
|
require_paths:
|
|
264
126
|
- lib
|
|
@@ -266,16 +128,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
266
128
|
requirements:
|
|
267
129
|
- - ">="
|
|
268
130
|
- !ruby/object:Gem::Version
|
|
269
|
-
version: '
|
|
131
|
+
version: '3.2'
|
|
270
132
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
271
133
|
requirements:
|
|
272
134
|
- - ">="
|
|
273
135
|
- !ruby/object:Gem::Version
|
|
274
136
|
version: '0'
|
|
275
137
|
requirements: []
|
|
276
|
-
|
|
277
|
-
rubygems_version: 2.4.5.1
|
|
278
|
-
signing_key:
|
|
138
|
+
rubygems_version: 3.6.2
|
|
279
139
|
specification_version: 4
|
|
280
140
|
summary: ActiveRecord tools for Cucumber
|
|
281
141
|
test_files: []
|