fixture_record 0.1.1.pre.rc → 1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +91 -11
- data/lib/fixture_record/association_traversal.rb +21 -2
- data/lib/fixture_record/belongs_to_updation.rb +1 -1
- data/lib/fixture_record/cache.rb +3 -3
- data/lib/fixture_record/data.rb +6 -2
- data/lib/fixture_record/filterable_attributes.rb +1 -1
- data/lib/fixture_record/naming.rb +8 -1
- data/lib/fixture_record/sanitizable.rb +17 -17
- data/lib/fixture_record/sanitizers/simple_timestamp.rb +1 -2
- data/lib/fixture_record/version.rb +1 -1
- data/lib/fixture_record.rb +28 -2
- data/lib/generators/fixture_record/install/install_generator.rb +0 -4
- data/lib/generators/fixture_record/install/templates/initializer.rb +19 -5
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 725ff327350c904ec886ba1833e976a798e47d564aac8539dec6f2614d86f298
|
4
|
+
data.tar.gz: d820511bb21ee20a76c5e12109030e56bde60e3eab69c100248285d59dbb9047
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 14a8530fe32a301bdc5bc4182da67fd8751823d0d43f3d9cd708e23a4c2d99c9b292f77c47043d1ddb79b4eb75f0326382f59425b37d3986e5143328a8ebd046
|
7
|
+
data.tar.gz: 90bf683053f43a2e0f7f73acb7b6a260ac2ae6748fbffb197fefc7c6fb5cdf1c7d0e6822baa558cdba82f4fbc7a7ab587882d841566a5833d5bcfb10fe379c80
|
data/README.md
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
# FixtureRecord
|
2
|
-
When it comes to testing, ActiveRecrod::Fixtures provide a huge performance benefit over FactoryBot but at the expense of setting up the necessary test data. For complex associations and relationships, a large amount of time might be spent simply trying to setup the data. FixtureRecord provides a `
|
2
|
+
When it comes to testing, ActiveRecrod::Fixtures provide a huge performance benefit over FactoryBot but at the expense of setting up the necessary test data. For complex associations and relationships, a large amount of time might be spent simply trying to setup the data. FixtureRecord provides a `to_fixture_record` method that accepts a chain of associations as an argument that allows you to quickly turn a large collection of existing records into test fixtures.
|
3
3
|
|
4
4
|
## Usage
|
5
|
-
`
|
5
|
+
`to_fixture_record` is a method that will turn the record into a test fixture. By default, the name of the fixture record will be `param_key` of the record's class and the record's id joined with `_`.
|
6
6
|
|
7
7
|
```ruby
|
8
8
|
user = User.find(1)
|
9
|
-
user.
|
9
|
+
user.to_fixture_record
|
10
10
|
|
11
11
|
# creates test/fixtures/users.yml if it does not exists
|
12
12
|
```
|
@@ -41,7 +41,7 @@ Let's say an edge case bug has been found with a particular post and it's relate
|
|
41
41
|
|
42
42
|
```ruby
|
43
43
|
edge_case_post = Post.find ...
|
44
|
-
edge_case_post.
|
44
|
+
edge_case_post.to_fixture_record(:author, comments: :user)
|
45
45
|
```
|
46
46
|
This would create a test fixture for the post, its author, all the comments on the post and their respective users. This will also change the `belongs_to` relationships in the yaml files to reflect their respective fixture counterparts. For example, if `Post#12` author is `User#49`,
|
47
47
|
and the post has `Comment#27` the fixture records might look like:
|
@@ -63,7 +63,7 @@ comment_27:
|
|
63
63
|
commentable: post_12 (Post)
|
64
64
|
```
|
65
65
|
|
66
|
-
Note that these changes to the `belongs_to` associations is only applicable to records that are part of the associations that are being passed into `
|
66
|
+
Note that these changes to the `belongs_to` associations is only applicable to records that are part of the associations that are being passed into `to_fixture_record`. So taking the same example as above, `edge_case_post.to_fixture_record` would yield the following:
|
67
67
|
```yaml
|
68
68
|
post_12:
|
69
69
|
author_id: 49
|
@@ -71,8 +71,8 @@ post_12:
|
|
71
71
|
|
72
72
|
Currently, `FixtureRecord` will also not attempt to already existing fixtures to newly created data.
|
73
73
|
```ruby
|
74
|
-
User.find(49).
|
75
|
-
Post.find(12).
|
74
|
+
User.find(49).to_fixture_record
|
75
|
+
Post.find(12).to_fixture_record
|
76
76
|
```
|
77
77
|
The above would yield fixtures that are not associated to one another.
|
78
78
|
```yaml
|
@@ -97,19 +97,19 @@ end
|
|
97
97
|
```
|
98
98
|
Because of through association infilling the following 3 lines will produce identical results:
|
99
99
|
```ruby
|
100
|
-
user.
|
100
|
+
user.to_fixture_record(posts: [comments: :users])
|
101
101
|
|
102
|
-
user.
|
102
|
+
user.to_fixture_record(:posts, :post_comments, :commenting_users)
|
103
103
|
|
104
104
|
user.to_test_fixutre(:commenting_users)
|
105
105
|
```
|
106
106
|
The reason the third example will infill the other associations is because those associations are required to create a clear path between the originating record and the final records. Without those intermediary associations, the `:commenting_users` would be orphaned from the `user` record.
|
107
107
|
|
108
108
|
### FixtureRecord::Naming
|
109
|
-
There might be instances where a record was used for a particular test fixture and you want to use this same record again for a different test case but want to keep the data isolated. `FixtureRecord::Naming` (automatically included with FixtureRecord) provides`fixture_record_prefix` and `fixture_record_suffix`. These values are propagated to the associated records when calling `
|
109
|
+
There might be instances where a record was used for a particular test fixture and you want to use this same record again for a different test case but want to keep the data isolated. `FixtureRecord::Naming` (automatically included with FixtureRecord) provides`fixture_record_prefix` and `fixture_record_suffix`. These values are propagated to the associated records when calling `to_fixture_record`.
|
110
110
|
```ruby
|
111
111
|
user.test_fixture_prefix = :foo
|
112
|
-
user.
|
112
|
+
user.to_fixture_record(:posts)
|
113
113
|
|
114
114
|
# users.yml
|
115
115
|
|
@@ -124,6 +124,86 @@ foo_post_49:
|
|
124
124
|
...
|
125
125
|
```
|
126
126
|
|
127
|
+
## Data Sanitizing and Obfuscation
|
128
|
+
`FixtureRecord` supports mutating data before writing the data. By default, `FixtureRecord` has a built in sanitizer that is used for `created_at` and `updated_at` fields. The reason for the `simple_timestamp` is that Rails will turn a timestamp into a complex object when calling `to_yaml`.
|
129
|
+
```ruby
|
130
|
+
user.attributes.to_yaml
|
131
|
+
# =>
|
132
|
+
id: ...
|
133
|
+
created_at: !ruby/object:ActiveSupport::TimeWithZone
|
134
|
+
utc: 2024-03-17 23:11:31.329037000 Z
|
135
|
+
zone: &1 !ruby/object:ActiveSupport::TimeZone
|
136
|
+
name: Etc/UTC
|
137
|
+
time: 2024-03-17 23:11:31.329037000 Z
|
138
|
+
updated_at: !ruby/object:ActiveSupport::TimeWithZone
|
139
|
+
utc: 2024-03-17 23:11:31.329037000 Z
|
140
|
+
zone: *1
|
141
|
+
time: 2024-03-17 23:11:31.329037000 Z
|
142
|
+
```
|
143
|
+
This type of timestamp structure isn't needed and can simply clutter up a fixture file. So instead, `FixtureRecord` comes with a sanitizer to clean this up.
|
144
|
+
```ruby
|
145
|
+
# lib/fixture_record/sanitizers/simple_timestamp
|
146
|
+
module FixtureRecord
|
147
|
+
module Sanitizers
|
148
|
+
class SimpleTimestamp < FixtureRecord::Sanitizer
|
149
|
+
def cast(value)
|
150
|
+
value.to_s
|
151
|
+
end
|
152
|
+
end
|
153
|
+
FixtureRecord.registry.register_sanitizer(FixtureRecord::Sanitizers::SimpleTimestamp, as: :simple_timestamp)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
# fixture_record/initializer.rb (created using the install script)
|
158
|
+
FixtureRecord.configure do |config|
|
159
|
+
...
|
160
|
+
|
161
|
+
config.sanitize_column_regex /created_at$|updated_at$/, with: :simple_timestamp
|
162
|
+
|
163
|
+
...
|
164
|
+
end
|
165
|
+
```
|
166
|
+
|
167
|
+
In this case, any column the regex pattern of 'created_at' or 'updated_at' will have its value passed to the registered sanitizer class.
|
168
|
+
|
169
|
+
### Creating a Custom Sanitizer
|
170
|
+
Step one, create the custom class. Inheriting from `FixtureRecord::Sanitizer` is not a requirement currently, but there might be some nice-to-have features as part of that class in the future. At minimum, your custom class needs to have at minimum a `#cast` instance method that will receive the value that is to be sanitized and returns the newly converted value. Currently, `#cast` will be called whether the value is `nil` or not, so be sure your method can handle the `nil` scenario.
|
171
|
+
```ruby
|
172
|
+
class MyReverseSanitizer < FixtureRecord::Sanitizer
|
173
|
+
def cast(value)
|
174
|
+
value&.reverse
|
175
|
+
end
|
176
|
+
end
|
177
|
+
```
|
178
|
+
|
179
|
+
### Registering the Sanitizer
|
180
|
+
In your custom class, or in the initializer, register the new sanitizer.
|
181
|
+
```ruby
|
182
|
+
class MyReverseSanitizer < FixtureRecord::Sanitizer
|
183
|
+
...
|
184
|
+
end
|
185
|
+
|
186
|
+
FixtureRecord.registry.register_sanitizer MyReverseSanitizer, :reverse
|
187
|
+
```
|
188
|
+
### Assiging the Sanitizer to a Pattern
|
189
|
+
In the fixture record initializer, use `#sanitize_column_regex` to assign the registered sanitizer to a regex pattern. In the following example code, any column that matches `email` would be sent through the reverse sanitizer, this would include `email`, `user_email`, `primary_email`, etc.
|
190
|
+
```ruby
|
191
|
+
# fixture_record/initializer.rb
|
192
|
+
FixtureRecord.configure do |config|
|
193
|
+
...
|
194
|
+
|
195
|
+
config.sanitize_column_regex /email/, with: :reverse
|
196
|
+
|
197
|
+
...
|
198
|
+
end
|
199
|
+
```
|
200
|
+
|
201
|
+
The pattern that is used for comparison is inclusive of the class name as well. So if you need a sanitizer to be scoped to a specific class you can use the class name in the regex pattern. Taking the example above:
|
202
|
+
```ruby
|
203
|
+
config.sanitize_column_regex /User.email/, with: :reverse
|
204
|
+
```
|
205
|
+
Now columns on other classes that include `email` in their name won't be passed to the sanitizer. Also keep in mind the mechanism being used here is basic regex pattern matching, so `User.primary_email` wouldn't match in this case and would not be sent to the sanitizer.
|
206
|
+
|
127
207
|
## Installation
|
128
208
|
`FixtureRecord` is only needed as a development dependency.
|
129
209
|
```ruby
|
@@ -2,7 +2,10 @@ module FixtureRecord
|
|
2
2
|
module AssociationTraversal
|
3
3
|
class UnrecognizedAssociationError < StandardError; end
|
4
4
|
|
5
|
+
attr_accessor :_traversed_fixture_record_associations
|
6
|
+
|
5
7
|
def traverse_fixture_record_associations(*associations)
|
8
|
+
self._traversed_fixture_record_associations = []
|
6
9
|
associations.each do |association|
|
7
10
|
Builder.new(self, association).build
|
8
11
|
end
|
@@ -36,18 +39,34 @@ module FixtureRecord
|
|
36
39
|
def build
|
37
40
|
raise UnrecognizedAssociationError.new(
|
38
41
|
"#{@symbol} is not a recognized association or method on #{@source_record.class}. Is it misspelled?"
|
39
|
-
) unless
|
42
|
+
) unless klass_association.present?
|
43
|
+
|
44
|
+
if through_assoc_option && @source_record._traversed_fixture_record_associations.exclude?(through_assoc_option)
|
45
|
+
infill_through
|
46
|
+
end
|
40
47
|
|
48
|
+
@source_record._traversed_fixture_record_associations << @symbol
|
41
49
|
built_records = Array.wrap(@source_record.send(@symbol)).compact_blank
|
42
50
|
return unless built_records.present?
|
43
51
|
|
44
52
|
built_records.each do |record|
|
45
53
|
record.fixture_record_prefix = @source_record.fixture_record_prefix
|
46
54
|
record.fixture_record_suffix = @source_record.fixture_record_suffix
|
47
|
-
record.
|
55
|
+
record.to_fixture_record(*@next_associations)
|
48
56
|
end
|
49
57
|
end
|
50
58
|
|
59
|
+
def infill_through
|
60
|
+
SymbolBuilder.new(@source_record, through_assoc_option).build
|
61
|
+
end
|
62
|
+
|
63
|
+
def through_assoc_option
|
64
|
+
klass_association.options[:through]
|
65
|
+
end
|
66
|
+
|
67
|
+
def klass_association
|
68
|
+
@source_record.class.reflect_on_association(@symbol)
|
69
|
+
end
|
51
70
|
end
|
52
71
|
|
53
72
|
class HashBuilder
|
@@ -2,7 +2,7 @@ module FixtureRecord
|
|
2
2
|
module BelongsToUpdation
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
|
-
def
|
5
|
+
def update_belongs_to_fixture_record_associations
|
6
6
|
self.class.reflect_on_all_associations(:belongs_to).each do |assoc|
|
7
7
|
klass_name = assoc.options[:polymorphic] ? send(assoc.foreign_type) : assoc.class_name
|
8
8
|
next unless klass_name.nil? || FixtureRecord.cache.contains_class?(klass_name)
|
data/lib/fixture_record/cache.rb
CHANGED
@@ -24,9 +24,9 @@ module FixtureRecord
|
|
24
24
|
|
25
25
|
def prepare!
|
26
26
|
self.values
|
27
|
-
.each(&:
|
28
|
-
.each(&:
|
29
|
-
.each(&:
|
27
|
+
.each(&:filter_attributes_for_fxiture_record)
|
28
|
+
.each(&:sanitize_attributes_for_fxiture_record)
|
29
|
+
.each(&:update_belongs_to_fixture_record_associations)
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
data/lib/fixture_record/data.rb
CHANGED
@@ -14,14 +14,18 @@ class FixtureRecord::Data < Hash
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def write!
|
17
|
-
FileUtils.mkdir_p(
|
17
|
+
FileUtils.mkdir_p(FixtureRecord.base_path)
|
18
18
|
self.each do |klass, data|
|
19
19
|
File.open(fixture_path_for(klass), 'w') { |f| f.write data.to_yaml }
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
23
|
def fixture_path_for(klass)
|
24
|
-
|
24
|
+
if FixtureRecord.base_path.is_a?(String)
|
25
|
+
[FixtureRecord.base_path, klass.table_name + '.yml'].join('/')
|
26
|
+
else
|
27
|
+
FixtureRecord.base_path.join(klass.table_name + '.yml')
|
28
|
+
end
|
25
29
|
end
|
26
30
|
|
27
31
|
def merge_record(record)
|
@@ -3,8 +3,15 @@ module FixtureRecord
|
|
3
3
|
attr_accessor :fixture_record_prefix
|
4
4
|
attr_accessor :fixture_record_suffix
|
5
5
|
|
6
|
+
class Base
|
7
|
+
def call(record)
|
8
|
+
|
9
|
+
[record.fixture_record_prefix, record.class.model_name.param_key, record.id || 'new', record.fixture_record_suffix].compact_blank.join('_')
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
6
13
|
def test_fixture_name
|
7
|
-
|
14
|
+
FixtureRecord.name_handler.call(self)
|
8
15
|
end
|
9
16
|
end
|
10
17
|
end
|
@@ -1,10 +1,7 @@
|
|
1
1
|
module FixtureRecord::Sanitizable
|
2
2
|
extend ActiveSupport::Concern
|
3
3
|
|
4
|
-
|
5
|
-
end
|
6
|
-
|
7
|
-
def sanitize_attributes_for_test_fixture
|
4
|
+
def sanitize_attributes_for_fxiture_record
|
8
5
|
_fixture_record_attributes.each do |attr, value|
|
9
6
|
registry_key = [self.class.name, attr.to_s].join('.')
|
10
7
|
_fixture_record_attributes[attr] = sanitize_value_for_test_fixture(registry_key, value)
|
@@ -24,24 +21,27 @@ module FixtureRecord::Sanitizable
|
|
24
21
|
end
|
25
22
|
|
26
23
|
class Registry
|
27
|
-
@_fixture_record_sanitizer_pattern_registry =
|
24
|
+
@_fixture_record_sanitizer_pattern_registry = []
|
28
25
|
@_fixture_record_sanitizer_name_registry = {}
|
29
26
|
|
30
|
-
def self.
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
27
|
+
def self.[](...)
|
28
|
+
@_fixture_record_sanitizer_name_registry.send(:[], ...)
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.deregister(klass_or_symbol)
|
32
|
+
@_fixture_record_sanitizer_pattern_registry.delete_if { |pattern, with| with == klass_or_symbol }
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.sanitize_pattern(pattern, with:)
|
36
|
+
@_fixture_record_sanitizer_pattern_registry << [pattern, with]
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.register_sanitizer(klass, as: nil)
|
40
|
+
@_fixture_record_sanitizer_name_registry[as.to_sym] = klass.new
|
37
41
|
end
|
38
42
|
|
39
43
|
def self.fetch(to_be_matched)
|
40
|
-
|
41
|
-
@_fixture_record_sanitizer_name_registry[to_be_matched]
|
42
|
-
else
|
43
|
-
@_fixture_record_sanitizer_pattern_registry.select { |pattern, value| to_be_matched.match(pattern) }.values
|
44
|
-
end
|
44
|
+
@_fixture_record_sanitizer_pattern_registry.select { |pattern, value| to_be_matched.match(pattern) }.map(&:last)
|
45
45
|
end
|
46
46
|
end
|
47
47
|
end
|
@@ -5,7 +5,6 @@ module FixtureRecord
|
|
5
5
|
value.to_s
|
6
6
|
end
|
7
7
|
end
|
8
|
-
FixtureRecord.registry.register_sanitizer(FixtureRecord::Sanitizers::SimpleTimestamp,
|
8
|
+
FixtureRecord.registry.register_sanitizer(FixtureRecord::Sanitizers::SimpleTimestamp, as: :simple_timestamp)
|
9
9
|
end
|
10
10
|
end
|
11
|
-
|
data/lib/fixture_record.rb
CHANGED
@@ -10,7 +10,13 @@ require "fixture_record/sanitizable"
|
|
10
10
|
|
11
11
|
module FixtureRecord
|
12
12
|
extend ActiveSupport::Concern
|
13
|
-
mattr_accessor :_locked_by,
|
13
|
+
mattr_accessor :_locked_by,
|
14
|
+
:cache,
|
15
|
+
:data
|
16
|
+
|
17
|
+
mattr_accessor :name_handler, default: FixtureRecord::Naming::Base.new
|
18
|
+
mattr_accessor :sanitizers, default: []
|
19
|
+
mattr_accessor :base_path, default: -> { Rails.root.join('test/fixtures') }
|
14
20
|
|
15
21
|
included do
|
16
22
|
attr_accessor :_fixture_record_attributes
|
@@ -24,7 +30,7 @@ module FixtureRecord
|
|
24
30
|
|
25
31
|
Sanitizer = FixtureRecord::Sanitizable::Base
|
26
32
|
|
27
|
-
def
|
33
|
+
def to_fixture_record(*associations)
|
28
34
|
FixtureRecord.lock!(self)
|
29
35
|
FixtureRecord.cache[self.test_fixture_name] ||= self
|
30
36
|
traverse_fixture_record_associations(*associations)
|
@@ -33,7 +39,27 @@ module FixtureRecord
|
|
33
39
|
FixtureRecord.release!(self)
|
34
40
|
end
|
35
41
|
|
42
|
+
|
36
43
|
class << self
|
44
|
+
def configure
|
45
|
+
yield self
|
46
|
+
end
|
47
|
+
|
48
|
+
def base_path
|
49
|
+
@@base_path.is_a?(String) ? @@base_path : @@base_path.call
|
50
|
+
end
|
51
|
+
|
52
|
+
def name_handler=(proc_or_klass)
|
53
|
+
@@name_handler = proc_or_klass.is_a?(Class) ? proc_or_klass.new : proc_or_klass
|
54
|
+
end
|
55
|
+
|
56
|
+
def sanitize_column_regex(col_regex, with:)
|
57
|
+
registry_name_or_klass = with
|
58
|
+
klass = registry_name_or_klass.is_a?(Symbol) ? FixtureRecord.registry[registry_name_or_klass] : registry_name_or_klass
|
59
|
+
klass_instance = klass.is_a?(Class) ? klass.new : klass
|
60
|
+
FixtureRecord.registry.sanitize_pattern col_regex, with: klass_instance
|
61
|
+
end
|
62
|
+
|
37
63
|
def lock!(owner)
|
38
64
|
return if locked?
|
39
65
|
|
@@ -4,10 +4,6 @@ module FixtureRecord::Generators
|
|
4
4
|
class InstallGenerator < ::Rails::Generators::Base
|
5
5
|
source_root File.expand_path("templates", __dir__)
|
6
6
|
|
7
|
-
def create_fixture_record_schema
|
8
|
-
# TODO - implement the generator
|
9
|
-
end
|
10
|
-
|
11
7
|
def create_initializer
|
12
8
|
template "initializer.rb", Rails.root.join("config/initializers/fixture_record.rb")
|
13
9
|
end
|
@@ -1,9 +1,23 @@
|
|
1
|
-
# FixtureRecord is currently only intended to be loaded in a development environment.
|
2
|
-
# Change this conditional at your own risk if you want it to load in production.
|
3
|
-
|
4
1
|
if Rails.env.development?
|
5
|
-
|
6
|
-
|
2
|
+
FixtureRecord.configure do |config|
|
3
|
+
# To customize how fixtures are named, provide a class the responds to #call or a Proc.
|
4
|
+
# The name handler object will receive the record and should return a String
|
5
|
+
# config.name_handler = FixtureRecord::Naming::Base
|
6
|
+
|
7
|
+
# base_path represents the base folder that FixureRecord will search for existing yml files
|
8
|
+
# to merge new fixture data with and it serves as the path for where FixtureRecord will output the
|
9
|
+
# new yml files as needed. To override, provide a String, Pathname object, or Proc/ambda to be evaluated at runtime
|
10
|
+
# config.base_path = -> { Rails.root.join('test/fixtures') }
|
11
|
+
|
12
|
+
# Create and register custom sanitizers to format, sanitiize, obfuscate, etc. the data before it is
|
13
|
+
# turned into a test fixture. Regex patterns are used to determine if a column should be passed to a
|
14
|
+
# sanitizer. The regex pattern that is tested is Classname.column_name - so if a sanitizer needs to be
|
15
|
+
# scoped to a specific class only, simply add the classname to the pattern, for example /User.phone_number/
|
16
|
+
# would sanitize the phone_number field for a User but not the phone_number field for a Customer.
|
17
|
+
# If there are other timestamp columns being used throughout your application, you can added them to this list.
|
18
|
+
config.sanitize_column_regex /created_at$|updated_at$/, with: :simple_timestamp
|
19
|
+
|
20
|
+
# Inject FixtureRecord concern into ActiveRecord
|
7
21
|
ActiveRecord::Base.include(FixtureRecord)
|
8
22
|
end
|
9
23
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fixture_record
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: '1.0'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brad Schrag
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-04-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|