data_taster 0.4.1 → 0.5.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.
data/lib/data_taster.rb CHANGED
@@ -5,13 +5,23 @@ require "logger"
5
5
  module DataTaster
6
6
  autoload :Collection, "data_taster/collection"
7
7
  autoload :Confection, "data_taster/confection"
8
+ autoload :DatabaseOutput, "data_taster/adapters/database_output"
8
9
  autoload :Detergent, "data_taster/detergent"
10
+ autoload :ExportContext, "data_taster/export_context"
11
+ autoload :FileOutput, "data_taster/adapters/file_output"
9
12
  autoload :Helper, "data_taster/helper"
10
- autoload :Sample, "data_taster/sample"
13
+ autoload :MysqlSource, "data_taster/adapters/mysql_source"
14
+ autoload :Output, "data_taster/adapters/output"
15
+ autoload :SanitizerExporter, "data_taster/sanitizer_exporter"
11
16
  autoload :Sanitizer, "data_taster/sanitizer"
17
+ autoload :SqlLiteral, "data_taster/sql_literal"
12
18
 
13
19
  SKIP_CODE = "skip_processing"
14
20
 
21
+ class << self
22
+ attr_accessor :config
23
+ end
24
+
15
25
  def self.logger=(logger)
16
26
  @logger = logger
17
27
  end
@@ -20,13 +30,18 @@ module DataTaster
20
30
  @logger ||= Logger.new($stdout)
21
31
  end
22
32
 
23
- def self.config(**args)
24
- @config ||= Config.new(
25
- args[:months],
26
- Array.wrap(args[:list] || Rails.root.glob("**/data_taster_export_tables.yml")),
27
- args[:source_client] || raise(ArgumentError, "DataTaster.config missing source_client"),
28
- args[:working_client] || raise(ArgumentError, "DataTaster.config missing working_client"),
29
- args[:include_insert] || false
33
+ def self.reset!
34
+ # TODO: Turn this into objects
35
+ self.config = nil
36
+ @confection = nil
37
+ end
38
+
39
+ def self.setup(source:, output:, months: nil, list: nil)
40
+ self.config = Config.new(
41
+ source,
42
+ output,
43
+ months,
44
+ Array.wrap(list || default_list)
30
45
  )
31
46
  end
32
47
 
@@ -35,25 +50,16 @@ module DataTaster
35
50
  end
36
51
 
37
52
  def self.sample!
38
- DataTaster
39
- .config
40
- .source_client
41
- .query("SHOW tables").collect { |t| t[t.keys.first] }
42
- .each do |table_name|
43
- DataTaster::Sample.new(table_name).serve!
44
- end
45
- end
46
-
47
- def self.safe_execute(sql, client = DataTaster.config.working_client)
48
- foreign_key_check = client.query("SELECT @@FOREIGN_KEY_CHECKS").first["@@FOREIGN_KEY_CHECKS"]
49
-
50
- begin
51
- client.query("SET FOREIGN_KEY_CHECKS=0")
52
- client.query(sql)
53
- ensure
54
- client.query("SET FOREIGN_KEY_CHECKS=#{foreign_key_check};")
53
+ config.output.sample!
54
+ end
55
+
56
+ def self.default_list
57
+ if defined?(Rails) && Rails.respond_to?(:root)
58
+ Rails.root.glob("**/data_taster_export_tables.yml")
59
+ else
60
+ []
55
61
  end
56
62
  end
57
63
 
58
- Config = Struct.new(:months, :list, :source_client, :working_client, :include_insert)
64
+ Config = Struct.new(:source, :output, :months, :list)
59
65
  end
data/sig/data_taster.rbs CHANGED
@@ -1,4 +1,69 @@
1
1
  module DataTaster
2
2
  VERSION: String
3
- # See the writing guide of rbs: https://github.com/ruby/rbs#guides
3
+ SKIP_CODE: String
4
+
5
+ type export_mode = :file | :database
6
+
7
+ def self.setup: (source: MysqlSource, output: Output, ?months: Integer?, ?list: Array[String]?) -> void
8
+ def self.config: () -> Config
9
+ def self.config=: (Config?) -> void
10
+ def self.sample!: () -> void
11
+ def self.reset!: () -> void
12
+ def self.confection: () -> Hash[String, untyped]
13
+ def self.logger: () -> ::Logger
14
+ def self.logger=: (::Logger) -> void
15
+ class MysqlSource
16
+ attr_reader source_client: untyped
17
+
18
+ def initialize: (source_client: untyped) -> void
19
+ def query: (String sql) -> untyped
20
+ def database: () -> String
21
+ def table_names: () -> Array[String]
22
+ end
23
+
24
+ class Output
25
+ def initialize: (**untyped) -> void
26
+ def sample!: () -> void
27
+ def export_mode: () -> export_mode
28
+ def target_database: () -> String
29
+ def qualified_table_name: (String table_name) -> String
30
+ def write_statement: (String sql) -> void
31
+ def write_raw: (String line) -> void
32
+ end
33
+
34
+ class DatabaseOutput < Output
35
+ attr_reader target_client: untyped
36
+
37
+ def import_table: (Collection collection, String table_name) -> void
38
+ end
39
+
40
+ class ExportContext
41
+ def self.quote_ident: (String | Symbol name) -> String
42
+ def initialize: (String table_name, Hash[String, untyped]? sanitize, ?insert_table_name: String?, ?column_types: Hash[String, String]) -> void
43
+ def insert_table_name: () -> String
44
+ def format_row_tuple: (Array[String | Symbol] columns, Hash[String, untyped] row, untyped client) -> String
45
+ end
46
+
47
+ class Sanitizer
48
+ BATCH_SIZE: Integer
49
+ def export_sanitized_rows: (Collection collection, insert_table_name: String) { (String header, String values) -> void } -> void
50
+ end
51
+
52
+ class FileOutput < Output
53
+ attr_reader path: String
54
+ attr_reader target_database: String
55
+ end
56
+
57
+ class Collection
58
+ def initialize: (String table_name) -> void
59
+ def assemble: () -> Hash[Symbol, untyped]
60
+ def export_select_sql: () -> String
61
+ end
62
+
63
+ Config = struct {
64
+ source: MysqlSource,
65
+ output: Output,
66
+ months: Integer?,
67
+ list: Array[String],
68
+ }
4
69
  end
metadata CHANGED
@@ -1,42 +1,34 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: data_taster
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jill Klang
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2025-02-27 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
- - !ruby/object:Gem::Dependency
13
- name: nokogiri
14
- requirement: !ruby/object:Gem::Requirement
15
- requirements:
16
- - - '='
17
- - !ruby/object:Gem::Version
18
- version: 1.17.2
19
- type: :runtime
20
- prerelease: false
21
- version_requirements: !ruby/object:Gem::Requirement
22
- requirements:
23
- - - '='
24
- - !ruby/object:Gem::Version
25
- version: 1.17.2
26
12
  - !ruby/object:Gem::Dependency
27
13
  name: rails
28
14
  requirement: !ruby/object:Gem::Requirement
29
15
  requirements:
30
16
  - - ">="
31
17
  - !ruby/object:Gem::Version
32
- version: '6.0'
18
+ version: '6.1'
19
+ - - "<"
20
+ - !ruby/object:Gem::Version
21
+ version: '8'
33
22
  type: :runtime
34
23
  prerelease: false
35
24
  version_requirements: !ruby/object:Gem::Requirement
36
25
  requirements:
37
26
  - - ">="
38
27
  - !ruby/object:Gem::Version
39
- version: '6.0'
28
+ version: '6.1'
29
+ - - "<"
30
+ - !ruby/object:Gem::Version
31
+ version: '8'
40
32
  - !ruby/object:Gem::Dependency
41
33
  name: license_finder
42
34
  requirement: !ruby/object:Gem::Requirement
@@ -79,6 +71,34 @@ dependencies:
79
71
  - - "~>"
80
72
  - !ruby/object:Gem::Version
81
73
  version: '2.1'
74
+ - !ruby/object:Gem::Dependency
75
+ name: combustion
76
+ requirement: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: '1.3'
81
+ type: :development
82
+ prerelease: false
83
+ version_requirements: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '1.3'
88
+ - !ruby/object:Gem::Dependency
89
+ name: mysql2
90
+ requirement: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - '='
93
+ - !ruby/object:Gem::Version
94
+ version: 0.5.5
95
+ type: :development
96
+ prerelease: false
97
+ version_requirements: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - '='
100
+ - !ruby/object:Gem::Version
101
+ version: 0.5.5
82
102
  - !ruby/object:Gem::Dependency
83
103
  name: parser
84
104
  requirement: !ruby/object:Gem::Requirement
@@ -105,14 +125,14 @@ dependencies:
105
125
  requirements:
106
126
  - - '='
107
127
  - !ruby/object:Gem::Version
108
- version: 2.2.2
128
+ version: 3.1.1
109
129
  type: :development
110
130
  prerelease: false
111
131
  version_requirements: !ruby/object:Gem::Requirement
112
132
  requirements:
113
133
  - - '='
114
134
  - !ruby/object:Gem::Version
115
- version: 2.2.2
135
+ version: 3.1.1
116
136
  - !ruby/object:Gem::Dependency
117
137
  name: rake
118
138
  requirement: !ruby/object:Gem::Requirement
@@ -175,14 +195,14 @@ dependencies:
175
195
  requirements:
176
196
  - - '='
177
197
  - !ruby/object:Gem::Version
178
- version: 0.9.34
198
+ version: 0.9.38
179
199
  type: :development
180
200
  prerelease: false
181
201
  version_requirements: !ruby/object:Gem::Requirement
182
202
  requirements:
183
203
  - - '='
184
204
  - !ruby/object:Gem::Version
185
- version: 0.9.34
205
+ version: 0.9.38
186
206
  description: Export, sanitize, and import data to help develop better apps.
187
207
  email:
188
208
  - jillian.emilie@gmail.com
@@ -196,24 +216,29 @@ files:
196
216
  - Gemfile.lock
197
217
  - LICENSE.txt
198
218
  - Rakefile
219
+ - config.ru
199
220
  - doc/dependency_decisions.yml
200
221
  - docs/CHANGELOG.md
201
222
  - docs/README.md
202
223
  - gemfiles/.bundle/config
203
- - gemfiles/rails_6_0.gemfile
204
- - gemfiles/rails_6_0.gemfile.lock
205
- - gemfiles/rails_6_1.gemfile
206
- - gemfiles/rails_6_1.gemfile.lock
207
- - gemfiles/rails_7_0.gemfile
208
- - gemfiles/rails_7_0.gemfile.lock
224
+ - gemfiles/rails_7_1.gemfile
225
+ - gemfiles/rails_7_1.gemfile.lock
226
+ - gemfiles/rails_7_2.gemfile
227
+ - gemfiles/rails_7_2.gemfile.lock
209
228
  - lib/data_taster.rb
229
+ - lib/data_taster/adapters/database_output.rb
230
+ - lib/data_taster/adapters/file_output.rb
231
+ - lib/data_taster/adapters/mysql_source.rb
232
+ - lib/data_taster/adapters/output.rb
210
233
  - lib/data_taster/collection.rb
211
234
  - lib/data_taster/confection.rb
212
235
  - lib/data_taster/detergent.rb
236
+ - lib/data_taster/export_context.rb
213
237
  - lib/data_taster/flavors.rb
214
238
  - lib/data_taster/helper.rb
215
- - lib/data_taster/sample.rb
216
239
  - lib/data_taster/sanitizer.rb
240
+ - lib/data_taster/sanitizer_exporter.rb
241
+ - lib/data_taster/sql_literal.rb
217
242
  - lib/data_taster/version.rb
218
243
  - mkdocs.yml
219
244
  - sig/data_taster.rbs
@@ -239,7 +264,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
239
264
  - !ruby/object:Gem::Version
240
265
  version: '0'
241
266
  requirements: []
242
- rubygems_version: 3.6.2
267
+ rubygems_version: 3.6.9
243
268
  specification_version: 4
244
269
  summary: Delicious and sanitized data samples for development and testing.
245
270
  test_files: []
@@ -1,12 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "activesupport", "< 7.2.0"
6
- gem "net-imap", "< 0.5.0"
7
- gem "rubocop-powerhome", path: "../../rubocop-powerhome", tag: "v0.5.2-rubocop-powerhome"
8
- gem "securerandom", "< 0.4.0"
9
- gem "zeitwerk", "< 2.7.0"
10
- gem "rails", "6.0.6.1"
11
-
12
- gemspec path: "../"
@@ -1,271 +0,0 @@
1
- PATH
2
- remote: ../../rubocop-powerhome
3
- specs:
4
- rubocop-powerhome (0.5.3)
5
- rubocop (= 1.66.1)
6
- rubocop-performance
7
- rubocop-rails
8
- rubocop-rake
9
- rubocop-rspec
10
-
11
- PATH
12
- remote: ..
13
- specs:
14
- data_taster (0.4.1)
15
- nokogiri (= 1.17.2)
16
- rails (>= 6.0)
17
-
18
- GEM
19
- remote: https://rubygems.org/
20
- specs:
21
- actioncable (6.0.6.1)
22
- actionpack (= 6.0.6.1)
23
- nio4r (~> 2.0)
24
- websocket-driver (>= 0.6.1)
25
- actionmailbox (6.0.6.1)
26
- actionpack (= 6.0.6.1)
27
- activejob (= 6.0.6.1)
28
- activerecord (= 6.0.6.1)
29
- activestorage (= 6.0.6.1)
30
- activesupport (= 6.0.6.1)
31
- mail (>= 2.7.1)
32
- actionmailer (6.0.6.1)
33
- actionpack (= 6.0.6.1)
34
- actionview (= 6.0.6.1)
35
- activejob (= 6.0.6.1)
36
- mail (~> 2.5, >= 2.5.4)
37
- rails-dom-testing (~> 2.0)
38
- actionpack (6.0.6.1)
39
- actionview (= 6.0.6.1)
40
- activesupport (= 6.0.6.1)
41
- rack (~> 2.0, >= 2.0.8)
42
- rack-test (>= 0.6.3)
43
- rails-dom-testing (~> 2.0)
44
- rails-html-sanitizer (~> 1.0, >= 1.2.0)
45
- actiontext (6.0.6.1)
46
- actionpack (= 6.0.6.1)
47
- activerecord (= 6.0.6.1)
48
- activestorage (= 6.0.6.1)
49
- activesupport (= 6.0.6.1)
50
- nokogiri (>= 1.8.5)
51
- actionview (6.0.6.1)
52
- activesupport (= 6.0.6.1)
53
- builder (~> 3.1)
54
- erubi (~> 1.4)
55
- rails-dom-testing (~> 2.0)
56
- rails-html-sanitizer (~> 1.1, >= 1.2.0)
57
- activejob (6.0.6.1)
58
- activesupport (= 6.0.6.1)
59
- globalid (>= 0.3.6)
60
- activemodel (6.0.6.1)
61
- activesupport (= 6.0.6.1)
62
- activerecord (6.0.6.1)
63
- activemodel (= 6.0.6.1)
64
- activesupport (= 6.0.6.1)
65
- activestorage (6.0.6.1)
66
- actionpack (= 6.0.6.1)
67
- activejob (= 6.0.6.1)
68
- activerecord (= 6.0.6.1)
69
- marcel (~> 1.0)
70
- activesupport (6.0.6.1)
71
- concurrent-ruby (~> 1.0, >= 1.0.2)
72
- i18n (>= 0.7, < 2)
73
- minitest (~> 5.1)
74
- tzinfo (~> 1.1)
75
- zeitwerk (~> 2.2, >= 2.2.2)
76
- appraisal (2.5.0)
77
- bundler
78
- rake
79
- thor (>= 0.14.0)
80
- ast (2.4.2)
81
- builder (3.3.0)
82
- concurrent-ruby (1.3.4)
83
- crass (1.0.6)
84
- csv (3.3.1)
85
- date (3.4.1)
86
- diff-lcs (1.5.1)
87
- docile (1.1.5)
88
- erubi (1.13.0)
89
- globalid (1.1.0)
90
- activesupport (>= 5.0)
91
- i18n (1.14.6)
92
- concurrent-ruby (~> 1.0)
93
- json (2.9.0)
94
- language_server-protocol (3.17.0.3)
95
- license_finder (7.2.1)
96
- bundler
97
- csv (~> 3.2)
98
- rubyzip (>= 1, < 3)
99
- thor (~> 1.2)
100
- tomlrb (>= 1.3, < 2.1)
101
- with_env (= 1.1.0)
102
- xml-simple (~> 1.1.9)
103
- loofah (2.23.1)
104
- crass (~> 1.0.2)
105
- nokogiri (>= 1.12.0)
106
- mail (2.8.1)
107
- mini_mime (>= 0.1.1)
108
- net-imap
109
- net-pop
110
- net-smtp
111
- marcel (1.0.4)
112
- method_source (1.1.0)
113
- mini_mime (1.1.5)
114
- mini_portile2 (2.8.8)
115
- minitest (5.25.4)
116
- net-imap (0.4.18)
117
- date
118
- net-protocol
119
- net-pop (0.1.2)
120
- net-protocol
121
- net-protocol (0.2.2)
122
- timeout
123
- net-smtp (0.5.0)
124
- net-protocol
125
- nio4r (2.7.4)
126
- nokogiri (1.17.2)
127
- mini_portile2 (~> 2.8.2)
128
- racc (~> 1.4)
129
- nokogiri (1.17.2-arm64-darwin)
130
- racc (~> 1.4)
131
- nokogiri (1.17.2-x86_64-linux)
132
- racc (~> 1.4)
133
- parallel (1.26.3)
134
- parser (3.3.6.0)
135
- ast (~> 2.4.1)
136
- racc
137
- power_assert (2.0.4)
138
- racc (1.8.1)
139
- rack (2.2.10)
140
- rack-test (2.1.0)
141
- rack (>= 1.3)
142
- rails (6.0.6.1)
143
- actioncable (= 6.0.6.1)
144
- actionmailbox (= 6.0.6.1)
145
- actionmailer (= 6.0.6.1)
146
- actionpack (= 6.0.6.1)
147
- actiontext (= 6.0.6.1)
148
- actionview (= 6.0.6.1)
149
- activejob (= 6.0.6.1)
150
- activemodel (= 6.0.6.1)
151
- activerecord (= 6.0.6.1)
152
- activestorage (= 6.0.6.1)
153
- activesupport (= 6.0.6.1)
154
- bundler (>= 1.3.0)
155
- railties (= 6.0.6.1)
156
- sprockets-rails (>= 2.0.0)
157
- rails-dom-testing (2.2.0)
158
- activesupport (>= 5.0.0)
159
- minitest
160
- nokogiri (>= 1.6)
161
- rails-html-sanitizer (1.6.2)
162
- loofah (~> 2.21)
163
- nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
164
- railties (6.0.6.1)
165
- actionpack (= 6.0.6.1)
166
- activesupport (= 6.0.6.1)
167
- method_source
168
- rake (>= 0.8.7)
169
- thor (>= 0.20.3, < 2.0)
170
- rainbow (2.2.2)
171
- rake
172
- rake (13.2.1)
173
- regexp_parser (2.9.3)
174
- rexml (3.4.0)
175
- rspec (3.13.0)
176
- rspec-core (~> 3.13.0)
177
- rspec-expectations (~> 3.13.0)
178
- rspec-mocks (~> 3.13.0)
179
- rspec-core (3.13.2)
180
- rspec-support (~> 3.13.0)
181
- rspec-expectations (3.13.3)
182
- diff-lcs (>= 1.2.0, < 2.0)
183
- rspec-support (~> 3.13.0)
184
- rspec-mocks (3.13.2)
185
- diff-lcs (>= 1.2.0, < 2.0)
186
- rspec-support (~> 3.13.0)
187
- rspec-support (3.13.2)
188
- rubocop (1.66.1)
189
- json (~> 2.3)
190
- language_server-protocol (>= 3.17.0)
191
- parallel (~> 1.10)
192
- parser (>= 3.3.0.2)
193
- rainbow (>= 2.2.2, < 4.0)
194
- regexp_parser (>= 2.4, < 3.0)
195
- rubocop-ast (>= 1.32.2, < 2.0)
196
- ruby-progressbar (~> 1.7)
197
- unicode-display_width (>= 2.4.0, < 3.0)
198
- rubocop-ast (1.37.0)
199
- parser (>= 3.3.1.0)
200
- rubocop-performance (1.23.0)
201
- rubocop (>= 1.48.1, < 2.0)
202
- rubocop-ast (>= 1.31.1, < 2.0)
203
- rubocop-rails (2.27.0)
204
- activesupport (>= 4.2.0)
205
- rack (>= 1.1)
206
- rubocop (>= 1.52.0, < 2.0)
207
- rubocop-ast (>= 1.31.1, < 2.0)
208
- rubocop-rake (0.6.0)
209
- rubocop (~> 1.0)
210
- rubocop-rspec (3.3.0)
211
- rubocop (~> 1.61)
212
- ruby-progressbar (1.13.0)
213
- rubyzip (2.3.2)
214
- securerandom (0.3.2)
215
- simplecov (0.15.1)
216
- docile (~> 1.1.0)
217
- json (>= 1.8, < 3)
218
- simplecov-html (~> 0.10.0)
219
- simplecov-html (0.10.2)
220
- sprockets (4.2.1)
221
- concurrent-ruby (~> 1.0)
222
- rack (>= 2.2.4, < 4)
223
- sprockets-rails (3.4.2)
224
- actionpack (>= 5.2)
225
- activesupport (>= 5.2)
226
- sprockets (>= 3.0.0)
227
- test-unit (3.1.5)
228
- power_assert
229
- thor (1.3.2)
230
- thread_safe (0.3.6)
231
- timeout (0.4.3)
232
- tomlrb (2.0.3)
233
- tzinfo (1.2.11)
234
- thread_safe (~> 0.1)
235
- unicode-display_width (2.6.0)
236
- websocket-driver (0.7.6)
237
- websocket-extensions (>= 0.1.0)
238
- websocket-extensions (0.1.5)
239
- with_env (1.1.0)
240
- xml-simple (1.1.9)
241
- rexml
242
- yard (0.9.34)
243
- zeitwerk (2.6.18)
244
-
245
- PLATFORMS
246
- arm64-darwin-22
247
- arm64-darwin-23
248
- ruby
249
- x86_64-linux
250
-
251
- DEPENDENCIES
252
- activesupport (< 7.2.0)
253
- appraisal (= 2.5.0)
254
- bundler (~> 2.1)
255
- data_taster!
256
- license_finder (~> 7.0)
257
- net-imap (< 0.5.0)
258
- parser (>= 2.5, != 2.5.1.1)
259
- rails (= 6.0.6.1)
260
- rainbow (= 2.2.2)
261
- rake (~> 13.0)
262
- rspec (~> 3.0)
263
- rubocop-powerhome!
264
- securerandom (< 0.4.0)
265
- simplecov (= 0.15.1)
266
- test-unit (= 3.1.5)
267
- yard (= 0.9.34)
268
- zeitwerk (< 2.7.0)
269
-
270
- BUNDLED WITH
271
- 2.5.23
@@ -1,12 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "activesupport", "< 7.2.0"
6
- gem "net-imap", "< 0.5.0"
7
- gem "rubocop-powerhome", path: "../../rubocop-powerhome", tag: "v0.5.2-rubocop-powerhome"
8
- gem "securerandom", "< 0.4.0"
9
- gem "zeitwerk", "< 2.7.0"
10
- gem "rails", "6.1.7.7"
11
-
12
- gemspec path: "../"