k_domain 0.0.11 → 0.0.20

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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -1
  3. data/Gemfile +1 -1
  4. data/Rakefile +3 -1
  5. data/STORIES.md +35 -6
  6. data/k_domain.gemspec +1 -0
  7. data/lib/k_domain/domain_model/load.rb +8 -2
  8. data/lib/k_domain/domain_model/transform.rb +24 -49
  9. data/lib/k_domain/domain_model/transform_steps/_.rb +3 -3
  10. data/lib/k_domain/domain_model/transform_steps/step.rb +36 -11
  11. data/lib/k_domain/domain_model/transform_steps/step1_attach_db_schema.rb +1 -1
  12. data/lib/k_domain/domain_model/transform_steps/{step8_locate_rails_models.rb → step4_rails_resource_models.rb} +5 -3
  13. data/lib/k_domain/domain_model/transform_steps/step5_rails_models.rb +71 -0
  14. data/lib/k_domain/domain_model/transform_steps/{step5_attach_dictionary.rb → step6_attach_dictionary.rb} +9 -3
  15. data/lib/k_domain/rails_code_extractor/extract_model.rb +58 -0
  16. data/lib/k_domain/rails_code_extractor/shim_loader.rb +29 -0
  17. data/lib/k_domain/raw_db_schema/load.rb +8 -2
  18. data/lib/k_domain/raw_db_schema/transform.rb +5 -6
  19. data/lib/k_domain/schemas/_.rb +16 -0
  20. data/lib/k_domain/schemas/database/_.rb +0 -7
  21. data/lib/k_domain/schemas/database/index.rb +1 -1
  22. data/lib/k_domain/schemas/database/schema.rb +15 -2
  23. data/lib/k_domain/schemas/database/table.rb +19 -8
  24. data/lib/k_domain/schemas/dictionary.rb +19 -0
  25. data/lib/k_domain/schemas/domain/_.rb +0 -3
  26. data/lib/k_domain/schemas/domain/domain.rb +1 -2
  27. data/lib/k_domain/schemas/domain/erd_file.rb +2 -0
  28. data/lib/k_domain/schemas/domain_model.rb +15 -0
  29. data/lib/k_domain/schemas/{domain/investigate.rb → investigate.rb} +1 -1
  30. data/lib/k_domain/schemas/rails_resource.rb +16 -0
  31. data/lib/k_domain/schemas/rails_structure.rb +92 -0
  32. data/lib/k_domain/version.rb +1 -1
  33. data/lib/k_domain.rb +13 -3
  34. data/templates/active_record_shims.rb +368 -0
  35. data/templates/fake_module_shims.rb +42 -0
  36. data/{lib/k_domain/raw_db_schema/template.rb → templates/load_schema.rb} +4 -4
  37. metadata +16 -12
  38. data/lib/k_domain/domain_model/transform_steps/step4_attach_erd_files.rb +0 -454
  39. data/lib/k_domain/schemas/database/column.rb +0 -16
  40. data/lib/k_domain/schemas/database/database.rb +0 -11
  41. data/lib/k_domain/schemas/database/unique_key.rb +0 -14
  42. data/lib/k_domain/schemas/domain/dictionary.rb +0 -17
  43. data/lib/k_domain/schemas/domain/schema.rb +0 -13
@@ -3,10 +3,23 @@
3
3
  module KDomain
4
4
  module Database
5
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
+
6
19
  class Meta < Dry::Struct
7
20
  attribute :rails , Types::Strict::Integer
8
- attribute :database , KDomain::Database::Database
9
- attribute :unique_keys , Types::Strict::Array.of(KDomain::Database::UniqueKey)
21
+ attribute :db_info , KDomain::Database::Schema::DbInfo
22
+ attribute :unique_keys , Types::Strict::Array.of(KDomain::Database::Schema::UniqueKey)
10
23
  end
11
24
 
12
25
  attribute :tables , Types::Strict::Array.of(KDomain::Database::Table)
@@ -3,19 +3,30 @@
3
3
  module KDomain
4
4
  module Database
5
5
  class Table < Dry::Struct
6
- class Meta < Dry::Struct
6
+ class RailsSchema < Dry::Struct
7
7
  attribute :primary_key , Types::Nominal::Any.optional.default(nil)
8
8
  attribute :id , Types::Nominal::Any.optional.default(nil)
9
9
  attribute :force , Types::Nominal::Any.optional.default(nil)
10
10
  end
11
11
 
12
- attribute :name , Types::Strict::String
13
- attribute :primary_key , Types::Strict::String.optional.default(nil)
14
- attribute :primary_key_type , Types::Strict::String.optional.default(nil)
15
- attribute :id? , Types::Nominal::Any.optional.default(nil) # Types::Strict::String.optional.default(nil)
16
- attribute :columns , Types::Strict::Array.of(KDomain::Database::Column)
17
- attribute :indexes , Types::Strict::Array.of(KDomain::Database::Index)
18
- attribute :rails_schema , KDomain::Database::Table::Meta
12
+ class Column < Dry::Struct
13
+ attribute :name , Types::Strict::String
14
+ attribute :type , Types::Strict::String
15
+ attribute :precision? , Types::Strict::Integer.optional.default(nil)
16
+ attribute :scale? , Types::Strict::Integer.optional.default(nil)
17
+ attribute :default? , Types::Nominal::Any.optional.default(nil)
18
+ attribute :array? , Types::Strict::Bool.optional.default(nil)
19
+ attribute :null? , Types::Strict::Bool.optional.default(nil)
20
+ attribute :limit? , Types::Strict::Integer.optional.default(nil)
21
+ end
22
+
23
+ attribute :name , Types::Strict::String
24
+ attribute :primary_key , Types::Strict::String.optional.default(nil)
25
+ attribute :primary_key_type , Types::Strict::String.optional.default(nil)
26
+ attribute :id? , Types::Nominal::Any.optional.default(nil)
27
+ attribute :columns , Types::Strict::Array.of(KDomain::Database::Table::Column)
28
+ attribute :indexes , Types::Strict::Array.of(KDomain::Database::Index) # May want to have a Table::Index, but for now this is a shared scheam
29
+ attribute :rails_schema , KDomain::Database::Table::RailsSchema
19
30
  end
20
31
  end
21
32
  end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Domain class holds a dictionary entry
4
+ module KDomain
5
+ module Schemas
6
+ class Dictionary < Dry::Struct
7
+ attribute :items , Types::Strict::Array do
8
+ attribute :name , Types::Strict::String
9
+ attribute :type , Types::Strict::String
10
+ attribute :label , Types::Strict::String
11
+ attribute :segment , Types::Strict::String
12
+ attribute :models , Types::Strict::Array
13
+ attribute :model_count , Types::Strict::Integer
14
+ attribute :types , Types::Strict::Array
15
+ attribute :type_count , Types::Strict::Integer
16
+ end
17
+ end
18
+ end
19
+ end
@@ -2,13 +2,10 @@
2
2
 
3
3
  # log.warn 'models->domain' if AppDebug.require?
4
4
 
5
- require_relative './dictionary'
6
- require_relative './investigate'
7
5
  require_relative './models/column'
8
6
  require_relative './models/model'
9
7
  require_relative './erd_file'
10
8
  require_relative './domain'
11
- require_relative './schema'
12
9
 
13
10
  module KDomain
14
11
  module DomainModel
@@ -5,8 +5,7 @@ module KDomain
5
5
  module DomainModel
6
6
  class Domain < Dry::Struct
7
7
  attribute :models , Types::Strict::Array.of(KDomain::DomainModel::Model)
8
- attribute :erd_files , Types::Strict::Array.of(KDomain::DomainModel::ErdFile)
9
- attribute :dictionary , Types::Strict::Array.of(KDomain::DomainModel::Dictionary)
8
+ # attribute :erd_files , Types::Strict::Array.of(KDomain::DomainModel::ErdFile)
10
9
  end
11
10
  end
12
11
  end
@@ -3,6 +3,7 @@
3
3
  # Domain class holds a list of the entities
4
4
  module KDomain
5
5
  module DomainModel
6
+ # rubocop:disable Metrics/BlockLength
6
7
  class ErdFile < Dry::Struct
7
8
  attribute :name , Types::Strict::String
8
9
  attribute :name_plural , Types::Strict::String
@@ -76,5 +77,6 @@ module KDomain
76
77
  end
77
78
  end
78
79
  end
80
+ # rubocop:enable Metrics/BlockLength
79
81
  end
80
82
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ # DomainModel holds the entire domain model including database and ancillary information
4
+ module KDomain
5
+ module Schemas
6
+ class DomainModel < Dry::Struct
7
+ attribute :domain , KDomain::DomainModel::Domain
8
+ attribute :database , KDomain::Database::Schema
9
+ attribute :dictionary , KDomain::Schemas::Dictionary
10
+ attribute :rails_resource , KDomain::Schemas::RailsResource
11
+ attribute :rails_structure , KDomain::Schemas::RailsStructure
12
+ attribute :investigate , KDomain::Schemas::Investigate
13
+ end
14
+ end
15
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
  # Domain class holds a dictionary entry
4
4
  module KDomain
5
- module DomainModel
5
+ module Schemas
6
6
  class Investigate < Dry::Struct
7
7
  attribute :issues , Types::Strict::Array do
8
8
  attribute :step , Types::Strict::String
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Domain class holds a dictionary entry
4
+ module KDomain
5
+ module Schemas
6
+ class RailsResource < Dry::Struct
7
+ attribute :models , Types::Strict::Array do
8
+ attribute :model_name , Types::Strict::String
9
+ attribute :table_name , Types::Strict::String
10
+ attribute :file , Types::Strict::String
11
+ attribute :exist , Types::Strict::Bool
12
+ attribute :state , Types::Strict::String
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Domain class holds a dictionary entry
4
+ module KDomain
5
+ module Schemas
6
+ class RailsStructure < Dry::Struct
7
+ class DefaultScope < Dry::Struct
8
+ attribute :block? , Types::Strict::String
9
+ end
10
+
11
+ class BaseType < Dry::Struct
12
+ attribute :name? , Types::Strict::String
13
+ attribute :opts? , Types::Strict::Hash
14
+ attribute :block? , Types::Strict::String.optional.default(nil)
15
+ end
16
+
17
+ class Scope < KDomain::Schemas::RailsStructure::BaseType
18
+ end
19
+
20
+ class BelongsTo < KDomain::Schemas::RailsStructure::BaseType
21
+ end
22
+
23
+ class HasOne < KDomain::Schemas::RailsStructure::BaseType
24
+ end
25
+
26
+ class HasMany < KDomain::Schemas::RailsStructure::BaseType
27
+ end
28
+
29
+ class HasAndBelongsToMany < KDomain::Schemas::RailsStructure::BaseType
30
+ end
31
+
32
+ class Validate < Dry::Struct
33
+ attribute :names? , Types::Array.of(Types::Strict::String)
34
+ attribute :opts? , Types::Strict::Hash
35
+ attribute :block? , Types::Strict::String.optional.default(nil)
36
+ end
37
+
38
+ class Validates < KDomain::Schemas::RailsStructure::BaseType
39
+ end
40
+
41
+ class Behaviours < Dry::Struct
42
+ attribute :class_name? , Types::Strict::String
43
+ attribute :default_scope? , KDomain::Schemas::RailsStructure::DefaultScope
44
+ attribute :scopes? , Types::Strict::Array.of(KDomain::Schemas::RailsStructure::Scope)
45
+ attribute :belongs_to? , Types::Strict::Array.of(KDomain::Schemas::RailsStructure::BelongsTo)
46
+ attribute :has_one? , Types::Strict::Array.of(KDomain::Schemas::RailsStructure::HasOne)
47
+ attribute :has_many? , Types::Strict::Array.of(KDomain::Schemas::RailsStructure::HasMany)
48
+ attribute :has_and_belongs_to_many? , Types::Strict::Array.of(KDomain::Schemas::RailsStructure::HasAndBelongsToMany)
49
+ attribute :validate? , Types::Strict::Array.of(KDomain::Schemas::RailsStructure::Validate)
50
+ attribute :validates? , Types::Strict::Array.of(KDomain::Schemas::RailsStructure::Validates)
51
+ attribute :attr_accessor? , Types::Array.of(Types::Strict::String)
52
+ attribute :attr_reader? , Types::Array.of(Types::Strict::String)
53
+ attribute :attr_writer? , Types::Array.of(Types::Strict::String)
54
+ end
55
+
56
+ class Method < Dry::Struct
57
+ attribute :name , Types::Strict::String
58
+ end
59
+
60
+ class Functions < Dry::Struct
61
+ attribute :class_name? , Types::Strict::String
62
+ attribute :module_name? , Types::Strict::String
63
+ attribute :class_full_name? , Types::Strict::String
64
+ attribute :attr_accessor? , Types::Array.of(Types::Strict::String)
65
+ attribute :attr_reader? , Types::Array.of(Types::Strict::String)
66
+ attribute :attr_writer? , Types::Array.of(Types::Strict::String)
67
+ attribute :klass? , Types::Strict::Array.of(KDomain::Schemas::RailsStructure::Method)
68
+ attribute :instance_public? , Types::Strict::Array.of(KDomain::Schemas::RailsStructure::Method)
69
+ attribute :instance_private? , Types::Strict::Array.of(KDomain::Schemas::RailsStructure::Method)
70
+ end
71
+
72
+ class Model < Dry::Struct
73
+ attribute :model_name , Types::Strict::String
74
+ attribute :table_name , Types::Strict::String
75
+ attribute :file , Types::Strict::String
76
+ attribute :exist , Types::Strict::Bool
77
+ attribute :state , Types::Strict::String
78
+ attribute :code , Types::Strict::String
79
+ attribute :behaviours? , KDomain::Schemas::RailsStructure::Behaviours
80
+ attribute :functions? , KDomain::Schemas::RailsStructure::Functions
81
+ end
82
+
83
+ class Controller < Dry::Struct
84
+ end
85
+
86
+ attribute :models , Types::Strict::Array.of(KDomain::Schemas::RailsStructure::Model)
87
+ attribute :controllers , Types::Strict::Array.of(KDomain::Schemas::RailsStructure::Controller)
88
+ end
89
+ end
90
+ end
91
+
92
+ # attribute :domain , KDomain::DomainModel::Domain
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module KDomain
4
- VERSION = '0.0.11'
4
+ VERSION = '0.0.20'
5
5
  end
data/lib/k_domain.rb CHANGED
@@ -5,14 +5,14 @@ require 'dry-struct'
5
5
  require 'k_log'
6
6
  require 'peeky'
7
7
  require 'k_domain/version'
8
- require 'k_domain/schemas/database/_'
9
- require 'k_domain/schemas/domain/_'
10
-
8
+ require 'k_domain/schemas/_'
11
9
  require 'k_domain/raw_db_schema/transform'
12
10
  require 'k_domain/raw_db_schema/load'
13
11
  require 'k_domain/domain_model/transform'
14
12
  require 'k_domain/domain_model/transform_steps/_'
15
13
  require 'k_domain/domain_model/load'
14
+ require 'k_domain/rails_code_extractor/shim_loader'
15
+ require 'k_domain/rails_code_extractor/extract_model'
16
16
 
17
17
  # # This is useful if you want to initialize structures via Hash
18
18
  # class SymbolizeStruct < Dry::Struct
@@ -23,6 +23,16 @@ module KDomain
23
23
  # raise KDomain::Error, 'Sample message'
24
24
  class Error < StandardError; end
25
25
 
26
+ module Gem
27
+ def self.root
28
+ File.expand_path('..', File.dirname(__FILE__))
29
+ end
30
+
31
+ def self.resource(resource_path)
32
+ File.join(root, resource_path)
33
+ end
34
+ end
35
+
26
36
  # Your code goes here...
27
37
  end
28
38
 
@@ -0,0 +1,368 @@
1
+ module ActiveRecord
2
+ def self.current_class
3
+ @current_class ||= nil
4
+ end
5
+
6
+ def self.current_class=(value)
7
+ @current_class = value
8
+ end
9
+
10
+ class Base
11
+ def self.singleton_class
12
+ Class.new do
13
+ def send(*_p, **_o); end
14
+ end.new
15
+ end
16
+
17
+ def self.class_info
18
+ return ActiveRecord.current_class if ActiveRecord.current_class
19
+
20
+ ActiveRecord.current_class = {
21
+ class_name: name
22
+ }
23
+ end
24
+
25
+ def self.set(key, value)
26
+ class_info[key] = class_info[key] || {}
27
+ class_info[key] = value
28
+ end
29
+
30
+ def self.add(key, value)
31
+ class_info[key] = class_info[key] || []
32
+ if value.is_a?(Array)
33
+ class_info[key] = class_info[key] + value
34
+ else
35
+ class_info[key] << value
36
+ end
37
+ end
38
+
39
+ def self.custom_set(key, value = {})
40
+ class_info[:custom] = {} unless class_info[:custom]
41
+ class_info[:custom][key] = class_info[:custom][key] || {}
42
+ class_info[:custom][key] = value
43
+ end
44
+
45
+ def self.custom_add(key, value)
46
+ class_info[:custom] = {} unless class_info[:custom]
47
+ class_info[:custom][key] = class_info[:custom][key] || []
48
+ if value.is_a?(Array)
49
+ class_info[:custom][key] = class_info[:custom][key] + value
50
+ else
51
+ class_info[:custom][key] << value
52
+ end
53
+ end
54
+
55
+ # examples:
56
+ # enum status: { active: 0, archived: 1 }
57
+ # enum status: [:active, :archived]
58
+ # enum status: [:active, :archived], _suffix: true
59
+ # enum comments_status: [:active, :inactive], _prefix: :comments
60
+ def self.enum(**opts)
61
+ add(:enum, opts)
62
+ end
63
+
64
+ # def self.attr_accessor(*args)
65
+ # args.each do |arg|
66
+ # self.class_eval("def #{arg};@#{arg};end")
67
+ # self.class_eval("def #{arg}=(val);@#{arg}=val;end")
68
+ # end
69
+ # end
70
+ # def self.attr_reader(*args)
71
+ # args.each do |arg|
72
+ # self.class_eval("def #{arg};@#{arg};end")
73
+ # end
74
+ # end
75
+ # def self.attr_writer(*args)
76
+ # args.each do |arg|
77
+ # self.class_eval("def #{arg};@#{arg};end")
78
+ # self.class_eval("def #{arg}=(val);@#{arg}=val;end")
79
+ # end
80
+ # end
81
+
82
+ def self.attr_accessor(*names)
83
+ super(*names)
84
+ add(:attr_accessor, names)
85
+ end
86
+
87
+ def self.attr_reader(*names)
88
+ super(*names)
89
+ add(:attr_reader, names)
90
+ end
91
+
92
+ def self.attr_writer(*names)
93
+ super(*names)
94
+ add(:attr_writer, names)
95
+ end
96
+
97
+ def self.lambda_source(a_lambda, prefix = nil)
98
+ return nil unless a_lambda
99
+
100
+ puts 'NOT A LAMBDA' unless a_lambda.is_a?(Proc)
101
+
102
+ result = a_lambda&.source&.strip
103
+ result = result&.delete_prefix(prefix) if prefix
104
+ result&.strip
105
+ end
106
+
107
+ # examples
108
+ # default_scope where(:published => true) # NOT supported
109
+ # default_scope { where(:published_at => Time.now - 1.week) }
110
+ # default_scope -> { order(:external_updated_at) }
111
+ # default_scope -> { where(:published => true) }, all_queries: true
112
+ def self.default_scope(**opts, &block)
113
+ block_source = nil
114
+ block_source = lambda_source(block, 'default_scope') if block_given?
115
+
116
+ set(:default_scope, opts.merge(block: block_source))
117
+ end
118
+
119
+ # examples
120
+ # scope :red, where(:color => 'red') # NOT SUPPORTED
121
+ # scope :dry_clean_only, joins(:washing_instructions).where('washing_instructions.dry_clean_only = ?', true) # NOT SUPPORTED
122
+ #
123
+ def self.scope(name, on_the_lamb = nil, **opts)
124
+ lamb_source = lambda_source(on_the_lamb, "scope :#{name},")
125
+
126
+ add(:scopes, {
127
+ name: name,
128
+ opts: opts,
129
+ block: lamb_source
130
+ })
131
+ end
132
+
133
+ def self.belongs_to(name, on_the_lamb = nil, **opts)
134
+ lamb_source = lambda_source(on_the_lamb, "belongs_to :#{name},")
135
+
136
+ add(:belongs_to, {
137
+ name: name,
138
+ opts: opts,
139
+ block: lamb_source
140
+ })
141
+ end
142
+
143
+ def self.has_many(name, on_the_lamb = nil, **opts)
144
+ lamb_source = lambda_source(on_the_lamb, "has_many :#{name},")
145
+
146
+ add(:has_many, {
147
+ name: name,
148
+ opts: opts,
149
+ block: lamb_source
150
+ })
151
+ end
152
+
153
+ def self.has_one(name, on_the_lamb = nil, **opts)
154
+ lamb_source = lambda_source(on_the_lamb, "has_one :#{name},")
155
+
156
+ add(:has_one, {
157
+ name: name,
158
+ opts: opts,
159
+ block: lamb_source
160
+ })
161
+ end
162
+
163
+ def self.has_and_belongs_to_many(name, on_the_lamb = nil, **opts)
164
+ lamb_source = lambda_source(on_the_lamb, "has_and_belongs_to_many :#{name},")
165
+
166
+ add(:has_and_belongs_to_many, {
167
+ name: name,
168
+ opts: opts,
169
+ block: lamb_source
170
+ })
171
+ end
172
+
173
+ def self.validate(*names, **opts, &block)
174
+ block_source = nil
175
+ block_source = lambda_source(block, 'validate') if block_given?
176
+
177
+ add(:validate, {
178
+ names: names,
179
+ opts: opts,
180
+ block: block_source
181
+ })
182
+ end
183
+
184
+ def self.validates(name, **opts)
185
+ add(:validates, {
186
+ name: name,
187
+ opts: opts
188
+ })
189
+ end
190
+
191
+ def self.alias_attribute(left, right)
192
+ add(:alias_attribute, {
193
+ left: left,
194
+ right: right
195
+ })
196
+ end
197
+
198
+ def self.before_create(name)
199
+ add(:before_create, {
200
+ name: name
201
+ })
202
+ end
203
+
204
+ def self.before_save(name)
205
+ add(:before_save, {
206
+ name: name
207
+ })
208
+ end
209
+
210
+ def self.before_destroy(name)
211
+ add(:before_destroy, {
212
+ name: name
213
+ })
214
+ end
215
+
216
+ def self.before_validation(name = nil, &block)
217
+ block_source = nil
218
+ block_source = lambda_source(block, 'before_validation') if block_given?
219
+
220
+ add(:before_validation, {
221
+ name: name,
222
+ block: block_source
223
+ })
224
+ end
225
+
226
+ def self.after_create(name)
227
+ add(:after_create, {
228
+ name: name
229
+ })
230
+ end
231
+
232
+ def self.after_save(name)
233
+ add(:after_save, {
234
+ name: name
235
+ })
236
+ end
237
+
238
+ def self.after_destroy(name = nil, &block)
239
+ block_source = nil
240
+ block_source = lambda_source(block, 'after_destroy') if block_given?
241
+
242
+ add(:after_destroy, {
243
+ name: name,
244
+ block: block_source
245
+ })
246
+ end
247
+
248
+ def self.after_commit(name)
249
+ add(:after_commit, {
250
+ name: name
251
+ })
252
+ end
253
+
254
+ def self.accepts_nested_attributes_for(name, **opts)
255
+ add(:accepts_nested_attributes_for, {
256
+ name: name,
257
+ opts: opts
258
+ })
259
+ end
260
+
261
+ def self.has_secure_token(name)
262
+ add(:has_secure_token, {
263
+ name: name
264
+ })
265
+ end
266
+
267
+ # CAN THESE BE AUTOMATED LIKE INCLUDE MODULES
268
+ def self.establish_connection(connection)
269
+ class_info[:establish_connection] = connection
270
+ end
271
+
272
+ def self.store_accessor(*names)
273
+ class_info[:store_accessor] = *names
274
+ end
275
+
276
+ def self.table_name=(table_name)
277
+ class_info[:table_name] = table_name
278
+ end
279
+
280
+ def self.primary_key=(primary_key)
281
+ class_info[:primary_key] = primary_key
282
+ end
283
+
284
+ def self.require(require)
285
+ add(:require, require)
286
+ end
287
+
288
+ def self.devise(*names)
289
+ add(:devise, names)
290
+ end
291
+
292
+ def self.pg_search_scope(name, **opts)
293
+ custom_set(:pg_search_scope, {
294
+ name: name,
295
+ opts: opts
296
+ })
297
+ end
298
+
299
+ def self.acts_as_readable(**opts)
300
+ custom_set(:acts_as_readable, {
301
+ opts: opts
302
+ })
303
+ end
304
+
305
+ def self.acts_as_reader
306
+ custom_set(:acts_as_reader, {})
307
+ end
308
+
309
+ def self.acts_as_commentable
310
+ custom_set(:acts_as_commentable, {})
311
+ end
312
+
313
+ def self.acts_as_list(**opts)
314
+ custom_set(:acts_as_list, {
315
+ opts: opts
316
+ })
317
+ end
318
+
319
+ def self.has_paper_trail
320
+ custom_set(:has_paper_trail)
321
+ end
322
+
323
+ def self.validates_uniqueness_of(name, **opts)
324
+ custom_set(:validates_uniqueness_of, {
325
+ name: name,
326
+ opts: opts
327
+ })
328
+ end
329
+
330
+ def self.validates_presence_of(name, **opts)
331
+ custom_set(:validates_presence_of, {
332
+ name: name,
333
+ opts: opts
334
+ })
335
+ end
336
+
337
+ def self.validates_length_of(name, **opts)
338
+ custom_set(:validates_length_of, {
339
+ name: name,
340
+ opts: opts
341
+ })
342
+ end
343
+
344
+ def self.attr_encrypted(name, **opts)
345
+ custom_set(:attr_encrypted, {
346
+ name: name,
347
+ opts: opts
348
+ })
349
+ end
350
+
351
+ def self.validates_confirmation_of(name, **opts)
352
+ custom_set(:validates_confirmation_of, {
353
+ name: name,
354
+ opts: opts
355
+ })
356
+ end
357
+
358
+ def self.with_options(opts, &block)
359
+ block_source = nil
360
+ block_source = lambda_source(block) if block_given?
361
+
362
+ custom_add(:with_options, {
363
+ opts: opts,
364
+ block: block_source
365
+ })
366
+ end
367
+ end
368
+ end