k_domain 0.0.14 → 0.0.23

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/.builders/config/_.rb +3 -0
  3. data/.builders/setup.rb +30 -0
  4. data/.gitignore +1 -0
  5. data/.rubocop.yml +4 -3
  6. data/Gemfile +1 -1
  7. data/Guardfile +1 -0
  8. data/README.md +15 -0
  9. data/STORIES.md +35 -6
  10. data/k_domain.gemspec +1 -1
  11. data/lib/k_domain/domain_model/load.rb +8 -2
  12. data/lib/k_domain/domain_model/transform.rb +34 -51
  13. data/lib/k_domain/domain_model/transform_steps/_.rb +8 -6
  14. data/lib/k_domain/domain_model/transform_steps/step.rb +47 -2
  15. data/lib/k_domain/domain_model/transform_steps/{step1_attach_db_schema.rb → step1_db_schema.rb} +2 -1
  16. data/lib/k_domain/domain_model/transform_steps/{step5_attach_dictionary.rb → step20_dictionary.rb} +7 -3
  17. data/lib/k_domain/domain_model/transform_steps/step2_domain_models.rb +123 -0
  18. data/lib/k_domain/domain_model/transform_steps/{step8_locate_rails_models.rb → step4_rails_resource_models.rb} +4 -4
  19. data/lib/k_domain/domain_model/transform_steps/step5_rails_resource_routes.rb +36 -0
  20. data/lib/k_domain/domain_model/transform_steps/step6_rails_structure_models.rb +90 -0
  21. data/lib/k_domain/domain_model/transform_steps/step7_rails_structure_controllers.rb +109 -0
  22. data/lib/k_domain/domain_model/transform_steps/{step3_attach_columns.rb → step8_domain_columns.rb} +40 -73
  23. data/lib/k_domain/rails_code_extractor/_.rb +5 -0
  24. data/lib/k_domain/rails_code_extractor/extract_controller.rb +59 -0
  25. data/lib/k_domain/rails_code_extractor/extract_model.rb +69 -0
  26. data/lib/k_domain/rails_code_extractor/shim_loader.rb +30 -0
  27. data/lib/k_domain/raw_db_schema/load.rb +8 -2
  28. data/lib/k_domain/raw_db_schema/transform.rb +9 -8
  29. data/lib/k_domain/schemas/_.rb +3 -2
  30. data/lib/k_domain/schemas/database.rb +86 -0
  31. data/lib/k_domain/schemas/domain/erd_file.rb +2 -0
  32. data/lib/k_domain/schemas/domain.rb +154 -0
  33. data/lib/k_domain/schemas/domain_model.rb +6 -5
  34. data/lib/k_domain/schemas/rails_resource.rb +43 -6
  35. data/lib/k_domain/schemas/rails_structure.rb +172 -0
  36. data/lib/k_domain/version.rb +1 -1
  37. data/lib/k_domain.rb +2 -0
  38. data/templates/custom/action_controller.rb +36 -0
  39. data/templates/custom/controller_interceptors.rb +78 -0
  40. data/templates/custom/model_interceptors.rb +71 -0
  41. data/templates/load_schema.rb +7 -0
  42. data/templates/old_printspeek_schema copy.rb +231 -0
  43. data/templates/old_printspeek_schema.rb +233 -0
  44. data/templates/rails/action_controller.rb +301 -0
  45. data/templates/rails/active_record.rb +348 -0
  46. data/templates/ruby_code_extractor/attach_class_info.rb +13 -0
  47. data/templates/ruby_code_extractor/behaviour_accessors.rb +39 -0
  48. data/templates/simple/controller_interceptors.rb +2 -0
  49. metadata +30 -17
  50. data/lib/k_domain/domain_model/transform_steps/step2_attach_models.rb +0 -62
  51. data/lib/k_domain/domain_model/transform_steps/step4_attach_erd_files.rb +0 -454
  52. data/lib/k_domain/schemas/database/_.rb +0 -7
  53. data/lib/k_domain/schemas/database/foreign_key.rb +0 -14
  54. data/lib/k_domain/schemas/database/index.rb +0 -14
  55. data/lib/k_domain/schemas/database/schema.rb +0 -31
  56. data/lib/k_domain/schemas/database/table.rb +0 -32
  57. data/lib/k_domain/schemas/domain/domain.rb +0 -11
  58. data/lib/k_domain/schemas/domain/models/column.rb +0 -49
  59. data/lib/k_domain/schemas/domain/models/model.rb +0 -111
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: k_domain
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.14
4
+ version: 0.0.23
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Cruwys
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-10-02 00:00:00.000000000 Z
11
+ date: 2021-12-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -74,6 +74,8 @@ executables: []
74
74
  extensions: []
75
75
  extra_rdoc_files: []
76
76
  files:
77
+ - ".builders/config/_.rb"
78
+ - ".builders/setup.rb"
77
79
  - ".github/workflows/main.yml"
78
80
  - ".gitignore"
79
81
  - ".rspec"
@@ -99,26 +101,26 @@ files:
99
101
  - lib/k_domain/domain_model/transform.rb
100
102
  - lib/k_domain/domain_model/transform_steps/_.rb
101
103
  - lib/k_domain/domain_model/transform_steps/step.rb
102
- - lib/k_domain/domain_model/transform_steps/step1_attach_db_schema.rb
103
- - lib/k_domain/domain_model/transform_steps/step2_attach_models.rb
104
- - lib/k_domain/domain_model/transform_steps/step3_attach_columns.rb
105
- - lib/k_domain/domain_model/transform_steps/step4_attach_erd_files.rb
106
- - lib/k_domain/domain_model/transform_steps/step5_attach_dictionary.rb
107
- - lib/k_domain/domain_model/transform_steps/step8_locate_rails_models.rb
104
+ - lib/k_domain/domain_model/transform_steps/step1_db_schema.rb
105
+ - lib/k_domain/domain_model/transform_steps/step20_dictionary.rb
106
+ - lib/k_domain/domain_model/transform_steps/step2_domain_models.rb
107
+ - lib/k_domain/domain_model/transform_steps/step4_rails_resource_models.rb
108
+ - lib/k_domain/domain_model/transform_steps/step5_rails_resource_routes.rb
109
+ - lib/k_domain/domain_model/transform_steps/step6_rails_structure_models.rb
110
+ - lib/k_domain/domain_model/transform_steps/step7_rails_structure_controllers.rb
111
+ - lib/k_domain/domain_model/transform_steps/step8_domain_columns.rb
112
+ - lib/k_domain/rails_code_extractor/_.rb
113
+ - lib/k_domain/rails_code_extractor/extract_controller.rb
114
+ - lib/k_domain/rails_code_extractor/extract_model.rb
115
+ - lib/k_domain/rails_code_extractor/shim_loader.rb
108
116
  - lib/k_domain/raw_db_schema/load.rb
109
117
  - lib/k_domain/raw_db_schema/transform.rb
110
118
  - lib/k_domain/schemas/_.rb
111
- - lib/k_domain/schemas/database/_.rb
112
- - lib/k_domain/schemas/database/foreign_key.rb
113
- - lib/k_domain/schemas/database/index.rb
114
- - lib/k_domain/schemas/database/schema.rb
115
- - lib/k_domain/schemas/database/table.rb
119
+ - lib/k_domain/schemas/database.rb
116
120
  - lib/k_domain/schemas/dictionary.rb
121
+ - lib/k_domain/schemas/domain.rb
117
122
  - lib/k_domain/schemas/domain/_.rb
118
- - lib/k_domain/schemas/domain/domain.rb
119
123
  - lib/k_domain/schemas/domain/erd_file.rb
120
- - lib/k_domain/schemas/domain/models/column.rb
121
- - lib/k_domain/schemas/domain/models/model.rb
122
124
  - lib/k_domain/schemas/domain/old/belongs_to.rb
123
125
  - lib/k_domain/schemas/domain/old/column_old.rb
124
126
  - lib/k_domain/schemas/domain/old/domain_statistics.rb
@@ -138,8 +140,19 @@ files:
138
140
  - lib/k_domain/schemas/domain_model.rb
139
141
  - lib/k_domain/schemas/investigate.rb
140
142
  - lib/k_domain/schemas/rails_resource.rb
143
+ - lib/k_domain/schemas/rails_structure.rb
141
144
  - lib/k_domain/version.rb
145
+ - templates/custom/action_controller.rb
146
+ - templates/custom/controller_interceptors.rb
147
+ - templates/custom/model_interceptors.rb
142
148
  - templates/load_schema.rb
149
+ - templates/old_printspeek_schema copy.rb
150
+ - templates/old_printspeek_schema.rb
151
+ - templates/rails/action_controller.rb
152
+ - templates/rails/active_record.rb
153
+ - templates/ruby_code_extractor/attach_class_info.rb
154
+ - templates/ruby_code_extractor/behaviour_accessors.rb
155
+ - templates/simple/controller_interceptors.rb
143
156
  homepage: http://appydave.com/gems/k-domain
144
157
  licenses:
145
158
  - MIT
@@ -162,7 +175,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
162
175
  - !ruby/object:Gem::Version
163
176
  version: '0'
164
177
  requirements: []
165
- rubygems_version: 3.2.7
178
+ rubygems_version: 3.2.33
166
179
  signing_key:
167
180
  specification_version: 4
168
181
  summary: K Domain builds complex domain schemas by combining the database schema with
@@ -1,62 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Loop through the db_schema tables and build up a
4
- # basic model for each table
5
- class Step2AttachModels < KDomain::DomainModel::Step
6
- # Map database schema to domain model
7
- def call
8
- raise 'ERD path not supplied' if opts[:erd_path].nil?
9
-
10
- # Schema is re-shaped into a format designed for domain modeling
11
- domain[:models] = database_tables.map { |table| model(table) }
12
- end
13
-
14
- def model(table)
15
- table_name = table[:name].to_s
16
- model_name = table_name.singularize
17
-
18
- {
19
- name: model_name,
20
- name_plural: table_name, # need to check if this is correct as I know it is wrong for account_history_datum
21
- table_name: table_name,
22
- pk: primary_key(table),
23
- erd_location: location(table_name, model_name),
24
- statistics: {}, # Load in future step
25
- columns: [] # Load in future step
26
- }
27
- end
28
-
29
- def primary_key(table)
30
- {
31
- name: table[:primary_key],
32
- type: table[:primary_key_type],
33
- exist: !table[:primary_key].nil?
34
- }
35
- end
36
-
37
- # Location of source code
38
- def location(table_name, model_name)
39
- file_normal = File.join(opts[:erd_path], "#{model_name}.rb")
40
- file_custom = File.join(opts[:erd_path], "#{table_name}.rb")
41
- file_exist = true
42
- state = []
43
-
44
- if File.exist?(file_normal)
45
- file = file_normal
46
- state.push(:has_ruby_model)
47
- elsif File.exist?(file_custom)
48
- file = file_custom
49
- state.push(:has_ruby_model)
50
- state.push(:nonconventional_name)
51
- else
52
- file = ''
53
- file_exist = false
54
- end
55
-
56
- {
57
- file: file,
58
- exist: file_exist,
59
- state: state # display_state: state.join(' ')
60
- }
61
- end
62
- end
@@ -1,454 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Attach source code found in rails model definitions to models
4
- class Step4AttachErdFiles < KDomain::DomainModel::Step
5
- attr_accessor :ruby_code
6
-
7
- # NOTE: This code could be rewritten using monkey patched modules and peak
8
- def call
9
- domain[:erd_files] = domain_models.map { |model| load_dsl(model) }
10
- end
11
-
12
- private
13
-
14
- def reset_dsl
15
- @ruby_code = nil
16
- @dsl = nil
17
- end
18
-
19
- def dsl
20
- @dsl ||= {
21
- name: '',
22
- name_plural: ''
23
- }
24
- end
25
-
26
- def load_dsl(model)
27
- reset_dsl
28
-
29
- dsl[:name] = model[:name]
30
- dsl[:name_plural] = model[:name_plural]
31
- dsl[:dsl_file] = model[:erd_location][:exist] ? model[:erd_location][:file] : ''
32
-
33
- return dsl unless File.exist?(dsl[:dsl_file])
34
-
35
- @ruby_code = File.read(dsl[:dsl_file])
36
-
37
- dsl[:source] = read_dsl_source
38
- dsl[:dsl] = build_dsl
39
- dsl[:todo] = todo
40
-
41
- dsl
42
- end
43
-
44
- def read_dsl_source
45
- regex_split_private_public = /(?<public>.+?)(?=\bprivate\b)(?<private>.*)/m
46
-
47
- split_code = regex_split_private_public.match(ruby_code)
48
-
49
- public_code = nil
50
- private_code = nil
51
-
52
- if split_code
53
- public_code = split_code[:public]
54
- private_code = split_code[:private]
55
- end
56
-
57
- {
58
- ruby: ruby_code,
59
- public: public_code,
60
- private: private_code,
61
- all_methods: grab_methods(public_code, private_code)
62
- }
63
- end
64
-
65
- def build_dsl
66
- return if ruby_code.nil?
67
-
68
- # need to support options as hash instead of options as string in the future
69
- {
70
- default_scope: grab_default_scope,
71
- scopes: grab_scopes,
72
- belongs_to: grab_belongs_to,
73
- has_one: grab_has_one,
74
- has_many: grab_has_many,
75
- has_and_belongs_to_many: grab_has_and_belongs_to_many,
76
- validate_on: grab_validate,
77
- validates_on: grab_validates
78
- }
79
-
80
- # ^(?<spaces>\s*)(?<event_type>before_create|before_save|before_destroy|after_create|after_save|after_destroy) (:(?<name>\w*)[, ]?(?<scope>.*)|(?<scope>\{.*?\}.*$))
81
- end
82
-
83
- def grab_default_scope
84
- regex = /default_scope \{(?<scope>.*?)\}/m
85
-
86
- m = regex.match(ruby_code)
87
-
88
- return "{ #{m[:scope].strip.gsub('\n', '')} }" if m
89
-
90
- nil
91
- end
92
-
93
- def grab_scopes
94
- entries = []
95
- # Start from beginning of line and capture
96
- # - number of spaces scope
97
- # - name of scope
98
- # - value of scope to end of line
99
- regex = /^(?<spaces>\s*)scope :(?<name>\w*)[, ]?(?<scope>.*)/
100
-
101
- # rubocop:disable Metrics/BlockLength
102
- ruby_code.scan(regex) do
103
- m = $LAST_MATCH_INFO
104
- spaces = m[:spaces] # .delete("\n")
105
- last_lf = spaces.rindex("\n")
106
- spaces = last_lf ? spaces[spaces.rindex("\n") + 1..-1] : spaces
107
- name = m[:name]
108
- scope = m[:scope].strip
109
-
110
- # Found a valid one liner
111
- if scope.ends_with?('}') && (scope.scan(/{/).count == scope.scan(/}/).count)
112
- scope = escape_single_quote(scope)
113
- entries << { name: name, scope: scope }
114
- else
115
- # Have a multiline scope, lets see if it is cleanly formatted
116
-
117
- start_anchor = "#{spaces}scope :#{name}"
118
- end_anchor = "#{spaces}}"
119
-
120
- # log.kv 'spaces', spaces.length
121
- # log.kv 'name', name
122
- # log.kv 'start_anchor', start_anchor
123
- # log.kv 'end_anchor', end_anchor
124
-
125
- start_index = ruby_code.index(/#{start_anchor}/)
126
-
127
- if start_index.nil?
128
- log.error("[#{@current_entity[:name]}] could not find [start] anchor index for [#{name}]")
129
- else
130
- ruby_section = ruby_code[start_index..-1]
131
- end_index = ruby_section.index(/^#{end_anchor}/) # Add ^ start of line
132
- if end_index.nil?
133
- log.error("[#{@current_entity[:name]}] could not find [end] anchor index for [#{name}]")
134
- else
135
- scope = ruby_section[start_anchor.length + 1..end_index].strip
136
- scope = escape_single_quote("#{scope}#{end_anchor}")
137
- entries << { name: name, scope: scope }
138
- end
139
- end
140
- end
141
- end
142
- entries
143
- rescue StandardError => e
144
- # bin ding.pry
145
- puts e.message
146
- end
147
- # rubocop:enable Metrics/BlockLength
148
-
149
- def grab_belongs_to
150
- entries = []
151
-
152
- # Start from beginning of line and capture
153
- # - number of spaces before belongs_to
154
- # - name of the belongs_to
155
- # - value of belongs_to to end of line
156
- regex = /^(?<spaces>\s*)belongs_to :(?<name>\w*)[, ]?(?<options>.*)/
157
-
158
- ruby_code.scan(regex) do
159
- m = $LAST_MATCH_INFO
160
-
161
- # spaces = m[:spaces] # .delete("\n")
162
- # last_lf = spaces.rindex("\n")
163
- # spaces = last_lf ? spaces[spaces.rindex("\n") + 1..-1] : spaces
164
- name = m[:name]
165
-
166
- options = m[:options]
167
- .gsub(':polymorphic => ', 'polymorphic: ')
168
- .gsub(':class_name => ', 'class_name: ')
169
- .gsub(':foreign_key => ', 'foreign_key: ')
170
- .strip
171
-
172
- options = clean_lambda(options)
173
-
174
- entries << { name: name, options: extract_options(options), raw_options: options }
175
- end
176
- entries
177
- rescue StandardError => e
178
- # bin ding.pry
179
- puts e.message
180
- end
181
-
182
- def grab_has_one
183
- entries = []
184
-
185
- # Start from beginning of line and capture
186
- # - number of spaces before has_one
187
- # - name of the has_one
188
- # - value of has_one to end of line
189
- regex = /^(?<spaces>\s*)has_one :(?<name>\w*)[, ]?(?<options>.*)/
190
-
191
- ruby_code.scan(regex) do
192
- m = $LAST_MATCH_INFO
193
-
194
- # spaces = m[:spaces] # .delete("\n")
195
- # last_lf = spaces.rindex("\n")
196
- # spaces = last_lf ? spaces[spaces.rindex("\n") + 1..-1] : spaces
197
- name = m[:name]
198
- options = m[:options]
199
- .strip
200
- # .gsub(':polymorphic => ', 'polymorphic: ')
201
- # .gsub(':class_name => ', 'class_name: ')
202
- # .gsub(':foreign_key => ', 'foreign_key: ')
203
-
204
- options = clean_lambda(options)
205
-
206
- entries << { name: name, options: extract_options(options), raw_options: options }
207
- end
208
- entries
209
- rescue StandardError => e
210
- # bin ding.pry
211
- puts e.message
212
- end
213
-
214
- def grab_has_many
215
- entries = []
216
- # Start from beginning of line and capture
217
- # - number of spaces before has_many
218
- # - name of the has_many
219
- # - value of has_many to end of line
220
- regex = /^(?<spaces>\s*)has_many :(?<name>\w*)[, ]?(?<options>.*)/
221
-
222
- ruby_code.scan(regex) do
223
- m = $LAST_MATCH_INFO
224
-
225
- # spaces = m[:spaces] # .delete("\n")
226
- # last_lf = spaces.rindex("\n")
227
- # spaces = last_lf ? spaces[spaces.rindex("\n") + 1..-1] : spaces
228
- name = m[:name]
229
- options = m[:options]
230
- .gsub(':dependent => ', 'dependent: ')
231
- .gsub(':class_name => ', 'class_name: ')
232
- .gsub(':foreign_key => ', 'foreign_key: ')
233
- .gsub(':primary_key => ', 'primary_key: ')
234
- .strip
235
-
236
- options = clean_lambda(options)
237
-
238
- entries << { name: name, options: extract_options(options), raw_options: options }
239
- end
240
- entries
241
- rescue StandardError => e
242
- # bin ding.pry
243
- puts e.message
244
- end
245
-
246
- def grab_has_and_belongs_to_many
247
- entries = []
248
- # Start from beginning of line and capture
249
- # - number of spaces before has_and_belongs_to_many
250
- # - name of the has_and_belongs_to_many
251
- # - value of has_and_belongs_to_many to end of line
252
- regex = /^(?<spaces>\s*)has_and_belongs_to_many :(?<name>\w*)[, ]?(?<options>.*)/
253
-
254
- ruby_code.scan(regex) do
255
- m = $LAST_MATCH_INFO
256
-
257
- # spaces = m[:spaces] # .delete("\n")
258
- # last_lf = spaces.rindex("\n")
259
- # spaces = last_lf ? spaces[spaces.rindex("\n") + 1..-1] : spaces
260
- name = m[:name]
261
- options = m[:options]
262
- .gsub(':dependent => ', 'dependent: ')
263
- .gsub(':class_name => ', 'class_name: ')
264
- .gsub(':foreign_key => ', 'foreign_key: ')
265
- .gsub(':primary_key => ', 'primary_key: ')
266
- .strip
267
-
268
- options = clean_lambda(options)
269
-
270
- entries << { name: name, options: {}, raw_options: options }
271
- end
272
- entries
273
- rescue StandardError => e
274
- # bin ding.pry
275
- puts e.message
276
- end
277
-
278
- def grab_validates
279
- entries = []
280
- # Start from beginning of line and capture
281
- # - number of spaces before validates
282
- # - name of the validates
283
- # - value of validates to end of line
284
- regex = /^(?<spaces>\s*)validates :(?<name>\w*)[, ]?(?<options>.*)/
285
-
286
- ruby_code.scan(regex) do
287
- m = $LAST_MATCH_INFO
288
-
289
- # spaces = m[:spaces] # .delete("\n")
290
- # last_lf = spaces.rindex("\n")
291
- # spaces = last_lf ? spaces[spaces.rindex("\n") + 1..-1] : spaces
292
- name = m[:name]
293
-
294
- options = m[:options].strip
295
-
296
- options = clean_lambda(options)
297
-
298
- entries << { name: name, raw_options: options }
299
- end
300
- entries
301
- rescue StandardError => e
302
- # bin ding.pry
303
- puts e.message
304
- end
305
-
306
- def grab_validate
307
- entries = []
308
- # Start from beginning of line and capture
309
- # - number of spaces before validate
310
- # - list of methods to call until to end of line
311
- # regex = /^(?<spaces>\s*)validate :(?<name>\w*)[, ]?(?<options>.*)/
312
- regex = /^(?<spaces>\s*)validate (?<line>:.*)/
313
- # puts @current_entity[:name]
314
-
315
- ruby_code.scan(regex) do
316
- m = $LAST_MATCH_INFO
317
-
318
- # spaces = m[:spaces] # .delete("\n")
319
- # last_lf = spaces.rindex("\n")
320
- # spaces = last_lf ? spaces[spaces.rindex("\n") + 1..-1] : spaces
321
- line = m[:line]
322
-
323
- entries << { line: line }
324
- # puts @current_entity[:validate]
325
- end
326
- entries
327
- rescue StandardError => e
328
- # bin ding.pry
329
- puts e.message
330
- end
331
-
332
- def grab_methods(public_code = ruby_code, private_code = nil)
333
- # public_code = ruby_code_public.nil? ? ruby_code : ruby_code_public
334
- # private_code = ruby_code_private
335
-
336
- regex = /def (?<method>.*)/
337
-
338
- # log.info(@current_entity[:name])
339
-
340
- public_methods = parse_methods(:public, public_code&.scan(regex)&.flatten || [])
341
- private_methods = parse_methods(:private, private_code&.scan(regex)&.flatten || [])
342
- methods = (public_methods + private_methods)
343
-
344
- class_methods = methods.select { |method| method[:class_method] == true }
345
-
346
- all_instance = methods.select { |method| method[:class_method] == false }
347
- instance_public = all_instance.select { |method| method[:scope] == :public }
348
- instance_private = all_instance.select { |method| method[:scope] == :private }
349
-
350
- {
351
- klass: class_methods,
352
- instance: all_instance,
353
- instance_public: instance_public,
354
- instance_private: instance_private
355
- }
356
- end
357
-
358
- def parse_methods(scope, methods)
359
- methods.map do |value|
360
- class_method = value.starts_with?('self.')
361
- name = class_method ? value[5..-1] : value
362
- arguments = nil
363
- arguments_index = name.index('(')
364
-
365
- if arguments_index
366
- arguments = name[arguments_index..-1]
367
- name = name[0..arguments_index - 1]
368
- end
369
-
370
- arguments = escape_single_quote(arguments)
371
-
372
- {
373
- name: name,
374
- scope: scope,
375
- class_method: class_method,
376
- arguments: arguments&.strip.to_s
377
- }
378
- end
379
- end
380
-
381
- def todo
382
- {
383
- after_destroy: [], # to do
384
- before_save: [], # to do
385
- after_save: [], # to do
386
- before_create: [], # to do
387
- after_create: [], # to do
388
- enum: [], # to do
389
- attr_encrypted: [], # to do
390
- validates_uniqueness_of: [], # to do
391
- validates_confirmation_of: [], # to do
392
- attr_accessor: [], # to do
393
- attr_reader: [], # to do
394
- attr_writer: [] # to do
395
- }
396
- end
397
-
398
- def escape_single_quote(value)
399
- return nil if value.nil?
400
-
401
- value.gsub("'", "\\\\'")
402
- end
403
-
404
- # rubocop:disable Style/EvalWithLocation, Security/Eval, Style/DocumentDynamicEvalDefinition
405
- def extract_options(options)
406
- eval("{ #{options} }")
407
- rescue StandardError => e
408
- investigate(
409
- step: :step4_attach_erd_files_models,
410
- location: :extract_options,
411
- key: nil,
412
- message: e.message
413
- )
414
- {}
415
- rescue SyntaxError => e
416
- # may be the issue is from a comment at the off the line
417
- comment_index = options.rindex('#') - 1
418
-
419
- if comment_index.positive?
420
- options_minus_comment = options[0..comment_index].squish
421
- return extract_options(options_minus_comment)
422
- end
423
-
424
- investigate(
425
- step: :step4_attach_erd_files_models,
426
- location: :extract_options,
427
- key: nil,
428
- message: e.message
429
- )
430
- {}
431
- end
432
- # rubocop:enable Style/EvalWithLocation, Security/Eval, Style/DocumentDynamicEvalDefinition
433
-
434
- def clean_lambda(options)
435
- if /^->/.match?(options)
436
- index = options.index(/}\s*,/)
437
- if index.nil?
438
- if options.count('{') == options.count('}')
439
- index = options.rindex(/}/)
440
- options = "a_lambda: '#{escape_single_quote(options[0..index])}'"
441
- else
442
- log.error(options)
443
- options = "a_lambda: '#{escape_single_quote(options)}'"
444
- end
445
- else
446
- options = "a_lambda: '#{escape_single_quote(options[0..index])}', #{options[index + 2..-1]}"
447
- end
448
- end
449
- options
450
- rescue StandardError => e
451
- # bin ding.pry
452
- puts e.message
453
- end
454
- end
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # The require order is important due to dependencies
4
- require_relative './index'
5
- require_relative './table'
6
- require_relative './foreign_key'
7
- require_relative './schema'
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module KDomain
4
- module Database
5
- class ForeignKey < Dry::Struct
6
- attribute :left , Types::Strict::String
7
- attribute :right , Types::Strict::String
8
- attribute :name? , Types::Strict::String.optional.default(nil)
9
- attribute :on_update? , Types::Strict::String.optional.default(nil)
10
- attribute :on_delete? , Types::Strict::String.optional.default(nil)
11
- attribute :column? , Types::Strict::String.optional.default(nil)
12
- end
13
- end
14
- end
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module KDomain
4
- module Database
5
- class Index < Dry::Struct
6
- attribute :name , Types::Strict::String
7
- attribute :fields , Types::Nominal::Any.optional.default('xxxxx1')
8
- attribute :using , Types::Nominal::String
9
- attribute :order? , Types::Nominal::Hash
10
- attribute :where? , Types::Nominal::Any.optional.default(nil)
11
- attribute :unique? , Types::Nominal::Any.optional.default(nil)
12
- end
13
- end
14
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module KDomain
4
- module Database
5
- class Schema < Dry::Struct
6
- class DbInfo < Dry::Struct
7
- attribute :type , Types::Strict::String
8
- attribute :version , Types::Nominal::Any.optional.default(nil)
9
- attribute :extensions , Types::Strict::Array
10
- end
11
-
12
- class UniqueKey < Dry::Struct
13
- attribute :type , Types::Strict::String
14
- attribute :category , Types::Strict::String.optional
15
- attribute :key , Types::Strict::String
16
- attribute :keys , Types::Strict::Array
17
- end
18
-
19
- class Meta < Dry::Struct
20
- attribute :rails , Types::Strict::Integer
21
- attribute :db_info , KDomain::Database::Schema::DbInfo
22
- attribute :unique_keys , Types::Strict::Array.of(KDomain::Database::Schema::UniqueKey)
23
- end
24
-
25
- attribute :tables , Types::Strict::Array.of(KDomain::Database::Table)
26
- attribute :foreign_keys? , Types::Strict::Array.of(KDomain::Database::ForeignKey)
27
- attribute :indexes? , Types::Strict::Array.of(KDomain::Database::Index)
28
- attribute :meta , KDomain::Database::Schema::Meta
29
- end
30
- end
31
- end