dumped_railers 0.4.1 → 0.6.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
  SHA256:
3
- metadata.gz: ad9f2b4ac74c2d926442a9292907bf0201cfe2dc01f48e6a1c115514360b730a
4
- data.tar.gz: 515e61e954e02489ae21218f121e593389d1f1602ad5c532fcc53e02ae112237
3
+ metadata.gz: c311dc2cc95619422567711140304a43f5e2851c1028a4c0f468b5f3ffdbe442
4
+ data.tar.gz: 1ea70f2788cfffda44f18433b36dd13302925f60c6894a3e628f264bc5d0161a
5
5
  SHA512:
6
- metadata.gz: 0fd8c272b5c0f630bc08ec446ada9d1bdb96eeeb353d3c1bd20df515e045a157508070eba600fbcf3e927c804a2fe4e1b18307210d19067f961eeeaa26729a83
7
- data.tar.gz: adf932812767e149015efafc1007ba069f88001304601538046146137abe4ab9aa3c686948140e122713237221f68b73f085367a06b49bfcbd162585aa0d880f
6
+ metadata.gz: cf2063fe3780b8a203d4131ed1a9d483c2497fe8ceacfa9e741358bcad6015857c404a8e4fd6ff105a63a71565cb596a447acbe6416c3dacf0def55d28b3e676
7
+ data.tar.gz: 0bf0d6f4ead5b7400d8dab700d3491804be5c526dbeab073569e241746029498b65bdd3c49a691ae2ad6d388d27221a507d75a3e069dc625d02d66dcf9bcbd23
@@ -0,0 +1,26 @@
1
+ name: ci
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+
7
+ jobs:
8
+ build:
9
+ runs-on: ubuntu-latest
10
+ strategy:
11
+ fail-fast: true
12
+ matrix:
13
+ ruby_version: ['3.3', '3.2']
14
+ rails_version: ['7.2', '7.1', '7.0', '6.1']
15
+ env:
16
+ BUNDLE_GEMFILE: gemfiles/Gemfile.rails_${{ matrix.rails_version }}
17
+
18
+ steps:
19
+ - uses: actions/checkout@v4
20
+ - name: Set up Ruby
21
+ uses: ruby/setup-ruby@v1
22
+ with:
23
+ ruby-version: ${{ matrix.ruby_version }}
24
+ bundler-cache: true
25
+ rubygems: 'latest'
26
+ - run: bundle exec rake spec
data/CHANGELOG.md CHANGED
@@ -54,3 +54,17 @@
54
54
  - Preprocessors now require arguments (`model`, `attributes`) in this order. Before version < 0.4, it was (`attributes`, `model`)
55
55
  - Attributes needs to be updated destructively within preprocessors. Return values are no longer required reflect the changes.
56
56
 
57
+ ## [0.4.1]
58
+ ### Fixed
59
+ - Run all the `before` callbacks before any of the record import starts, `after` callbacks after all the import.
60
+
61
+ ## [0.5.0]
62
+ ### Changed
63
+ - require std gems (e.g. ostruct, forwardable). Users of dumped_railers are no longer need to require them.
64
+ - Added CI support against Ruby 3.3, 3.2, together with Rails 7.x, while dropping Ruby < 3.2, Rails < 6.1
65
+
66
+ ## [0.6.0]
67
+ ### Added
68
+ - Add new options to explicitly allow specific classes for YAML import.
69
+ ### Changed
70
+ - Accept Date, Time, DateTIme together with the classes that are set as ActiveRecord.yaml_column_permitted_classes be default.
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  # DumpedRailers <img src='https://user-images.githubusercontent.com/23026542/101830310-aaf10000-3b77-11eb-9e0a-d14e45b27760.png' width=40>
2
- [![Build Status](https://travis-ci.com/fursich/dumped_railers.svg?branch=main)](https://travis-ci.com/fursich/dumped_railers) [![Gem Version](https://badge.fury.io/rb/dumped_railers.svg)](https://badge.fury.io/rb/dumped_railers)
2
+ [![Build Status](https://github.com/fursich/dumped_railers/actions/workflows/ci.yml/badge.svg)](https://github.com/fursich/dumped_railers/actions/workflows/ci.yml/badge.svg) [![Gem Version](https://badge.fury.io/rb/dumped_railers.svg)](https://badge.fury.io/rb/dumped_railers)
3
3
 
4
4
  Helping you take a snapshot of ActiveRecord models in Rails-compatible fixture format, and re-importing them wherever necessary without destroying current data you have.
5
5
 
@@ -175,6 +175,48 @@ DumpedRailers.import!(fixture_path, before_save: before_callback, after_save: [a
175
175
 
176
176
  `before_save` / `after_save` can accept both single and multiple (array) arguments.
177
177
 
178
+ ### Deserializing Custom Classes with YAML
179
+
180
+ * YAML (Psych) does not permit to load random class objects for [security reasons](https://discuss.rubyonrails.org/t/cve-2022-32224-possible-rce-escalation-bug-with-serialized-columns-in-active-record/81017).
181
+ * By default, DumpedRailers handles all the objects that Rails permitts (i.e. [ActiveRecord.yaml_column_permitted_classes](https://guides.rubyonrails.org/configuring.html#config-active-record-yaml-column-permitted-classes)), plus Time, Date, and DateTime.
182
+ * DumpedRailers raises `Psych::DisallowedClass` error when non-permitted classes are detected. If you want DumpedRailsers handle other classes, you could specify `yaml_column_permitted_classes` option with configurations or import method's arguments.
183
+ * *Please use this option with extra care* for security - again, it is recommended to use this for development purpose only.
184
+
185
+ ```ruby
186
+ DumpedRailers.configure do |config|
187
+ config.ignorable_columns += [:published_on] # :published_on will be ignored *on top of* default settings.
188
+ end
189
+ ```
190
+
191
+ #### Caveats
192
+ * If you wish to load Date, Time object, it would be easier to load it as a string. DumpedRailers will pass it to the specified ActiveRecord models and they typecast the raw string into the appropreate date/time object.
193
+
194
+ * below columns (published_date, published_time, first_drafted_at) all will be passed as a string (as the value is surrounded by the quotes). Strings will be interperted to apropreate column type with ActiveRecord.
195
+
196
+ ```ruby
197
+ _fixture:
198
+ model_class: Article
199
+ fixture_generated_by: DumpedRailers
200
+ __article_1:
201
+ title: Harry Potter
202
+ published_date: '2024-03-01'
203
+ published_time: '10:00:00'
204
+ first_drafted_at: '2024-02-01T10:10:10+09:00'
205
+ ```
206
+
207
+ * below fixture (without quotes) will be directly interperted to Date or Time via YAML module. It needs to have proper format that YAML can interpret.
208
+
209
+ ```ruby
210
+ _fixture:
211
+ model_class: Article
212
+ fixture_generated_by: DumpedRailers
213
+ __article_1:
214
+ title: Harry Potter
215
+ published_date: 2024-03-01
216
+ published_time: 2000-01-01 10:00:00
217
+ first_drafted_at: 2024-02-01T10:10:10+09:00
218
+ ```
219
+
178
220
  ### Configuration
179
221
 
180
222
  * All the settings can be configured by either configuration (global) or arguments (at runtime).
@@ -26,11 +26,11 @@ Gem::Specification.new do |spec|
26
26
  spec.require_paths = ['lib']
27
27
 
28
28
  spec.add_development_dependency 'bundler', '~> 2.0'
29
- spec.add_development_dependency 'rake', '~> 12.3.3'
30
- spec.add_development_dependency 'rspec', '~> 3.10'
29
+ spec.add_development_dependency 'rake'
30
+ spec.add_development_dependency 'rspec'
31
31
  spec.add_development_dependency 'sqlite3'
32
- spec.add_development_dependency 'activerecord', '>= 5.2'
33
- spec.add_development_dependency 'database_cleaner-active_record', '~> 1.8'
32
+ spec.add_development_dependency 'activerecord'
33
+ spec.add_development_dependency 'database_cleaner-active_record', '~> 2.0'
34
34
  spec.add_development_dependency 'pry'
35
35
  spec.add_development_dependency 'pry-byebug'
36
36
  spec.add_development_dependency 'pry-doc'
@@ -1,6 +1,7 @@
1
- source "https://rubygems.org"
1
+ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in dumped_railers.gemspec
4
- gem 'activerecord', '6.1.1'
4
+ gem 'activerecord', '6.1.7'
5
+ gem 'sqlite3', '~> 1.5'
5
6
 
6
7
  gemspec path: '../'
@@ -1,6 +1,7 @@
1
- source "https://rubygems.org"
1
+ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in dumped_railers.gemspec
4
- gem 'activerecord', '5.2.4.4'
4
+ gem 'activerecord', '7.0.8'
5
+ gem 'sqlite3', '~> 1.7'
5
6
 
6
7
  gemspec path: '../'
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in dumped_railers.gemspec
4
+ gem 'activerecord', '~> 7.1.0'
5
+ gem 'sqlite3', '~> 1.7'
6
+
7
+ gemspec path: '../'
@@ -1,6 +1,7 @@
1
- source "https://rubygems.org"
1
+ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in dumped_railers.gemspec
4
- gem 'activerecord', '6.0.3.4'
4
+ gem 'activerecord', '7.2.1'
5
+ gem 'sqlite3', '~> 1.7'
5
6
 
6
7
  gemspec path: '../'
@@ -1,9 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'forwardable'
4
+ require 'ostruct'
3
5
  module DumpedRailers
4
6
  module Configuration
5
7
  extend Forwardable
6
- def_delegators :@_config, :preprocessors, :ignorable_columns, :authorized_models
8
+ def_delegators :@_config, :preprocessors, :ignorable_columns, :authorized_models, :yaml_column_permitted_classes
7
9
 
8
10
  def configure
9
11
  yield config
@@ -15,10 +17,20 @@ module DumpedRailers
15
17
 
16
18
  IGNORABLE_COLUMNS = %w[id created_at updated_at]
17
19
  def configure_defaults!
20
+ default_yaml_column_permitted_classes =
21
+ # FIXME: this will be no longer needed when we drop support for older Rails versions
22
+ # https://discuss.rubyonrails.org/t/cve-2022-32224-possible-rce-escalation-bug-with-serialized-columns-in-active-record/81017
23
+ if ActiveRecord.respond_to?(:yaml_column_permitted_classes)
24
+ ActiveRecord.yaml_column_permitted_classes + [Date, Time, DateTime]
25
+ else
26
+ [Date, Time, DateTime]
27
+ end
28
+
18
29
  clear_configuration!(
19
30
  ignorable_columns: IGNORABLE_COLUMNS,
20
- preprocessors: [],
31
+ preprocessors: [],
21
32
  authorized_models: :any,
33
+ yaml_column_permitted_classes: default_yaml_column_permitted_classes,
22
34
  )
23
35
  end
24
36
 
@@ -5,7 +5,7 @@ require "yaml"
5
5
  module DumpedRailers
6
6
  module FileHelper
7
7
  class << self
8
- def read_fixtures(*paths)
8
+ def read_fixtures(*paths, yaml_column_permitted_classes: [])
9
9
  yaml_files = paths.flat_map { |path|
10
10
  if File.file?(path)
11
11
  path
@@ -18,7 +18,7 @@ module DumpedRailers
18
18
 
19
19
  yaml_files.map { |file|
20
20
  raw_data = ::File.read(file)
21
- YAML.load(raw_data)
21
+ YAML.safe_load(raw_data, permitted_classes: yaml_column_permitted_classes)
22
22
  }
23
23
  end
24
24
 
@@ -6,14 +6,14 @@ module DumpedRailers
6
6
  class Import
7
7
  attr_reader :fixture_set
8
8
 
9
- def initialize(*paths, authorized_models: [], before_save: [], after_save: [])
9
+ def initialize(*paths, authorized_models: [], before_save: [], after_save: [], yaml_column_permitted_classes: [])
10
10
  @before_save = before_save
11
11
  @after_save = after_save
12
12
 
13
13
  if (paths.first.is_a? Hash)
14
14
  @raw_fixtures = paths.first.values
15
15
  else
16
- @raw_fixtures = FileHelper.read_fixtures(*paths)
16
+ @raw_fixtures = FileHelper.read_fixtures(*paths, yaml_column_permitted_classes: yaml_column_permitted_classes)
17
17
  end
18
18
 
19
19
  @fixture_set = RecordBuilder::FixtureSet.new(@raw_fixtures, authorized_models: authorized_models)
@@ -1,3 +1,3 @@
1
1
  module DumpedRailers
2
- VERSION = '0.4.1'
2
+ VERSION = '0.6.0'
3
3
  end
@@ -24,13 +24,19 @@ module DumpedRailers
24
24
  fixtures
25
25
  end
26
26
 
27
- def import!(*paths, authorized_models: nil, before_save: nil, after_save: nil)
27
+ def import!(*paths, authorized_models: nil, before_save: nil, after_save: nil, yaml_column_permitted_classes: [])
28
28
  # make sure class-baseed caches starts with clean state
29
29
  DumpedRailers::RecordBuilder::FixtureRow::RecordStore.clear!
30
30
  DumpedRailers::RecordBuilder::DependencyTracker.clear!
31
31
 
32
32
  # override global config settings when options are specified
33
- runtime_options = { authorized_models: authorized_models.presence }.compact.reverse_merge(import_options)
33
+ runtime_options =
34
+ {
35
+ authorized_models: authorized_models.presence,
36
+ yaml_column_permitted_classes: yaml_column_permitted_classes.presence,
37
+ }
38
+ .compact
39
+ .reverse_merge(import_options)
34
40
 
35
41
  before_save = Array(before_save).compact
36
42
  after_save = Array(after_save).compact
@@ -40,6 +46,7 @@ module DumpedRailers
40
46
  authorized_models: runtime_options[:authorized_models],
41
47
  before_save: before_save,
42
48
  after_save: after_save,
49
+ yaml_column_permitted_classes: runtime_options[:yaml_column_permitted_classes]
43
50
  )
44
51
  fixture_handler.import_all!
45
52
  end
@@ -55,7 +62,7 @@ module DumpedRailers
55
62
  end
56
63
 
57
64
  def import_options
58
- options.slice(:authorized_models)
65
+ options.slice(:authorized_models, :yaml_column_permitted_classes)
59
66
  end
60
67
  end
61
68
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dumped_railers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Koji Onishi
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-01-25 00:00:00.000000000 Z
11
+ date: 2024-10-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -28,30 +28,30 @@ dependencies:
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 12.3.3
33
+ version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 12.3.3
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '3.10'
47
+ version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '3.10'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: sqlite3
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -72,28 +72,28 @@ dependencies:
72
72
  requirements:
73
73
  - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: '5.2'
75
+ version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: '5.2'
82
+ version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: database_cleaner-active_record
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '1.8'
89
+ version: '2.0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '1.8'
96
+ version: '2.0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: pry
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -145,9 +145,9 @@ executables: []
145
145
  extensions: []
146
146
  extra_rdoc_files: []
147
147
  files:
148
+ - ".github/workflows/ci.yml"
148
149
  - ".gitignore"
149
150
  - ".rspec"
150
- - ".travis.yml"
151
151
  - CHANGELOG.md
152
152
  - Gemfile
153
153
  - LICENSE.txt
@@ -156,9 +156,10 @@ files:
156
156
  - bin/console
157
157
  - bin/setup
158
158
  - dumped_railers.gemspec
159
- - gemfiles/Gemfile.rails_5.2
160
- - gemfiles/Gemfile.rails_6.0
161
159
  - gemfiles/Gemfile.rails_6.1
160
+ - gemfiles/Gemfile.rails_7.0
161
+ - gemfiles/Gemfile.rails_7.1
162
+ - gemfiles/Gemfile.rails_7.2
162
163
  - lib/dumped_railers.rb
163
164
  - lib/dumped_railers/configuration.rb
164
165
  - lib/dumped_railers/dump.rb
@@ -179,7 +180,7 @@ metadata:
179
180
  homepage_uri: https://github.com/fursich/dumped_railers
180
181
  source_code_uri: https://github.com/fursich/dumped_railers
181
182
  changelog_uri: https://github.com/fursich/dumped_railers/CHANGELOG.md
182
- post_install_message:
183
+ post_install_message:
183
184
  rdoc_options: []
184
185
  require_paths:
185
186
  - lib
@@ -194,8 +195,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
194
195
  - !ruby/object:Gem::Version
195
196
  version: '0'
196
197
  requirements: []
197
- rubygems_version: 3.1.4
198
- signing_key:
198
+ rubygems_version: 3.5.11
199
+ signing_key:
199
200
  specification_version: 4
200
201
  summary: A flexible fixture importer/exporter, that can transport ActiveRecord data
201
202
  in fixture format
data/.travis.yml DELETED
@@ -1,17 +0,0 @@
1
- ---
2
- language: ruby
3
- cache: bundler
4
- before_install: gem install bundler
5
- rvm:
6
- - 3.0.0
7
- - 2.7.2
8
- - 2.6.6
9
- - 2.5.8
10
- gemfile:
11
- - gemfiles/Gemfile.rails_6.1
12
- - gemfiles/Gemfile.rails_6.0
13
- - gemfiles/Gemfile.rails_5.2
14
- jobs:
15
- exclude:
16
- - rvm: 3.0.0
17
- gemfile: gemfiles/Gemfile.rails_5.2