k_domain 0.0.1 → 0.0.14

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 (55) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +39 -1
  3. data/Gemfile +10 -0
  4. data/Guardfile +30 -0
  5. data/Rakefile +3 -4
  6. data/STORIES.md +63 -0
  7. data/USAGE.md +19 -0
  8. data/k_domain.gemspec +4 -0
  9. data/lib/k_domain/domain_model/load.rb +29 -0
  10. data/lib/k_domain/domain_model/transform.rb +110 -0
  11. data/lib/k_domain/domain_model/transform_steps/_.rb +10 -0
  12. data/lib/k_domain/domain_model/transform_steps/step.rb +142 -0
  13. data/lib/k_domain/domain_model/transform_steps/step1_attach_db_schema.rb +21 -0
  14. data/lib/k_domain/domain_model/transform_steps/step2_attach_models.rb +62 -0
  15. data/lib/k_domain/domain_model/transform_steps/step3_attach_columns.rb +137 -0
  16. data/lib/k_domain/domain_model/transform_steps/step4_attach_erd_files.rb +454 -0
  17. data/lib/k_domain/domain_model/transform_steps/step5_attach_dictionary.rb +58 -0
  18. data/lib/k_domain/domain_model/transform_steps/step8_locate_rails_models.rb +44 -0
  19. data/lib/k_domain/raw_db_schema/load.rb +29 -0
  20. data/lib/k_domain/raw_db_schema/transform.rb +82 -0
  21. data/lib/k_domain/schemas/_.rb +15 -0
  22. data/lib/k_domain/schemas/database/_.rb +7 -0
  23. data/lib/k_domain/schemas/database/foreign_key.rb +14 -0
  24. data/lib/k_domain/schemas/database/index.rb +14 -0
  25. data/lib/k_domain/schemas/database/schema.rb +31 -0
  26. data/lib/k_domain/schemas/database/table.rb +32 -0
  27. data/lib/k_domain/schemas/dictionary.rb +19 -0
  28. data/lib/k_domain/schemas/domain/_.rb +65 -0
  29. data/lib/k_domain/schemas/domain/domain.rb +11 -0
  30. data/lib/k_domain/schemas/domain/erd_file.rb +80 -0
  31. data/lib/k_domain/schemas/domain/models/column.rb +49 -0
  32. data/lib/k_domain/schemas/domain/models/model.rb +111 -0
  33. data/lib/k_domain/schemas/domain/old/belongs_to.rb +25 -0
  34. data/lib/k_domain/schemas/domain/old/column_old.rb +225 -0
  35. data/lib/k_domain/schemas/domain/old/domain_statistics.rb +29 -0
  36. data/lib/k_domain/schemas/domain/old/entity.rb +338 -0
  37. data/lib/k_domain/schemas/domain/old/entity_statistics.rb +22 -0
  38. data/lib/k_domain/schemas/domain/old/foreign_key.rb +17 -0
  39. data/lib/k_domain/schemas/domain/old/has_and_belongs_to_many.rb +20 -0
  40. data/lib/k_domain/schemas/domain/old/has_many.rb +27 -0
  41. data/lib/k_domain/schemas/domain/old/has_one.rb +41 -0
  42. data/lib/k_domain/schemas/domain/old/name_options.rb +10 -0
  43. data/lib/k_domain/schemas/domain/old/rails_controller.rb +10 -0
  44. data/lib/k_domain/schemas/domain/old/rails_model.rb +92 -0
  45. data/lib/k_domain/schemas/domain/old/related_entity.rb +36 -0
  46. data/lib/k_domain/schemas/domain/old/statistics.rb +21 -0
  47. data/lib/k_domain/schemas/domain/old/validate.rb +25 -0
  48. data/lib/k_domain/schemas/domain/old/validates.rb +50 -0
  49. data/lib/k_domain/schemas/domain_model.rb +14 -0
  50. data/lib/k_domain/schemas/investigate.rb +15 -0
  51. data/lib/k_domain/schemas/rails_resource.rb +16 -0
  52. data/lib/k_domain/version.rb +1 -1
  53. data/lib/k_domain.rb +22 -1
  54. data/templates/load_schema.rb +226 -0
  55. metadata +91 -2
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Annotates the original schema with methods that implement existing method calls
4
+ # that are already in the schema so that we can build a hash.
5
+ #
6
+ # Writes a new annotated schema.rb file with a public method called load that
7
+ # builds the hash
8
+
9
+ module KDomain
10
+ module RawDbSchema
11
+ class Load
12
+ include KLog::Logging
13
+
14
+ attr_reader :source_file
15
+ attr_reader :data
16
+
17
+ def initialize(source_file)
18
+ @source_file = source_file
19
+ end
20
+
21
+ def call
22
+ json = File.read(source_file)
23
+ data = KUtil.data.json_parse(json, as: :hash_symbolized)
24
+
25
+ @data = KDomain::Database::Schema.new(data)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Annotates the original schema with methods that implement existing method calls
4
+ # that are already in the schema so that we can build a hash.
5
+ #
6
+ # Writes a new annotated schema.rb file with a public method called load that
7
+ # builds the hash
8
+ module KDomain
9
+ module RawDbSchema
10
+ class Transform
11
+ include KLog::Logging
12
+
13
+ attr_reader :source_file
14
+ attr_reader :template_file
15
+ attr_reader :schema_loader
16
+
17
+ def initialize(source_file)
18
+ @source_file = source_file
19
+ @template_file = KDomain::Gem.resource('templates/load_schema.rb')
20
+ end
21
+
22
+ def call
23
+ # log.kv 'source_file', source_file
24
+ # log.kv 'template_file', template_file
25
+ # log.kv 'source_file?', File.exist?(source_file)
26
+ # log.kv 'template_file?', File.exist?(template_file)
27
+ log.error "Template not found: #{template_file}" unless File.exist?(template_file)
28
+
29
+ content = File.read(source_file)
30
+ content
31
+ .gsub!(/ActiveRecord::Schema.define/, 'load')
32
+
33
+ lines = content.lines.map { |line| " #{line}" }.join
34
+
35
+ @schema_loader = File
36
+ .read(template_file)
37
+ .gsub('{{source_file}}', source_file)
38
+ .gsub('{{rails_schema}}', lines)
39
+ end
40
+
41
+ # rename to target_ruby
42
+ # This is an internal ruby structure that is evaluated
43
+ # writing is only needed for debugging purposes
44
+ def write_schema_loader(target_file)
45
+ if schema_loader.nil?
46
+ puts '.call method has not been executed'
47
+ return
48
+ end
49
+
50
+ FileUtils.mkdir_p(File.dirname(target_file))
51
+ File.write(target_file, schema_loader)
52
+ end
53
+
54
+ def write_json(json_file)
55
+ if schema_loader.nil?
56
+ puts '.call method has not been executed'
57
+ return
58
+ end
59
+
60
+ FileUtils.mkdir_p(File.dirname(json_file))
61
+ File.write(json_file, JSON.pretty_generate(schema))
62
+ end
63
+
64
+ # rubocop:disable Security/Eval
65
+ def schema
66
+ if schema_loader.nil?
67
+ puts '.call method has not been executed'
68
+ return
69
+ end
70
+
71
+ eval(schema_loader)#, __FILE__, __LINE__)
72
+
73
+ loader = LoadSchema.new
74
+ loader.load_schema
75
+ return loader.schema
76
+ rescue => ex
77
+ log.exception(ex)
78
+ end
79
+ # rubocop:enable Security/Eval
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ # log.warn 'models->domain' if AppDebug.require?
4
+
5
+ module Types
6
+ include Dry.Types()
7
+ end
8
+
9
+ require_relative 'rails_resource'
10
+ require_relative 'investigate'
11
+ require_relative 'database/_'
12
+ require_relative 'dictionary'
13
+ require_relative 'domain/_'
14
+
15
+ require_relative './domain_model'
@@ -0,0 +1,7 @@
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'
@@ -0,0 +1,14 @@
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
@@ -0,0 +1,14 @@
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
@@ -0,0 +1,31 @@
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
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module KDomain
4
+ module Database
5
+ class Table < Dry::Struct
6
+ class RailsSchema < Dry::Struct
7
+ attribute :primary_key , Types::Nominal::Any.optional.default(nil)
8
+ attribute :id , Types::Nominal::Any.optional.default(nil)
9
+ attribute :force , Types::Nominal::Any.optional.default(nil)
10
+ end
11
+
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
30
+ end
31
+ end
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
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ # log.warn 'models->domain' if AppDebug.require?
4
+
5
+ require_relative './models/column'
6
+ require_relative './models/model'
7
+ require_relative './erd_file'
8
+ require_relative './domain'
9
+
10
+ module KDomain
11
+ module DomainModel
12
+ RUBY_TYPE = {
13
+ text: 'String',
14
+ string: 'String',
15
+ primary_key: 'Integer', # this could be GUID in future
16
+ foreign_key: 'Integer', # this could be GUID in future
17
+ integer: 'Integer',
18
+ bigint: 'Integer',
19
+ bigserial: 'Integer',
20
+ boolean: 'Boolean',
21
+ float: 'Float',
22
+ decimal: 'Decimal',
23
+ datetime: 'DateTime',
24
+ date: 'DateTime',
25
+ json: 'Hash',
26
+ jsonb: 'Hash',
27
+ hstore: 'Hash'
28
+ }.freeze
29
+
30
+ CSHARP_TYPE = {
31
+ string: 'string',
32
+ text: 'string', # NEED TO DEAL WITH THIS BETTER
33
+ integer: 'int',
34
+ bigint: 'int',
35
+ bigserial: 'long',
36
+ boolean: 'bool',
37
+ decimal: 'decimal',
38
+ float: 'double',
39
+ datetime: 'DateTime',
40
+ date: 'DateTime',
41
+ json: 'object',
42
+ jsonb: 'object',
43
+ hstore: 'object'
44
+ }.freeze
45
+
46
+ # this is used by the ruby migration files
47
+ DB_TYPE = {
48
+ boolean: 'boolean',
49
+ primary_key: 'integer',
50
+ foreign_key: 'integer',
51
+ integer: 'integer',
52
+ bigint: 'integer',
53
+ bigserial: 'bigserial',
54
+ decimal: 'decimal',
55
+ float: 'float',
56
+ datetime: 'datetime',
57
+ date: 'date',
58
+ text: 'text',
59
+ string: 'string',
60
+ json: 'json',
61
+ jsonb: 'jsonb',
62
+ hstore: 'hstore'
63
+ }.freeze
64
+ end
65
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Domain class holds a list of the entities
4
+ module KDomain
5
+ module DomainModel
6
+ class Domain < Dry::Struct
7
+ attribute :models , Types::Strict::Array.of(KDomain::DomainModel::Model)
8
+ attribute :erd_files , Types::Strict::Array.of(KDomain::DomainModel::ErdFile)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Domain class holds a list of the entities
4
+ module KDomain
5
+ module DomainModel
6
+ class ErdFile < Dry::Struct
7
+ attribute :name , Types::Strict::String
8
+ attribute :name_plural , Types::Strict::String
9
+ attribute :dsl_file , Types::Strict::String
10
+
11
+ attribute? :source , Dry::Struct.optional.default(nil) do
12
+ attribute :ruby , Types::Strict::String
13
+ attribute :public , Types::Strict::String.optional.default(nil)
14
+ attribute :private , Types::Strict::String.optional.default(nil)
15
+
16
+ attribute? :all_methods , Dry::Struct.optional.default(nil) do
17
+ attribute? :klass , Types::Strict::Array do
18
+ attribute :name , Types::Strict::String
19
+ attribute :scope , Types::Strict::String # .optional.default(nil)
20
+ attribute :class_method , Types::Strict::Bool
21
+ attribute :arguments , Types::Strict::String
22
+ end
23
+ attribute? :instance , Types::Strict::Array do
24
+ attribute :name , Types::Strict::String
25
+ attribute :scope , Types::Strict::String # .optional.default(nil)
26
+ attribute :class_method , Types::Strict::Bool
27
+ attribute :arguments , Types::Strict::String
28
+ end
29
+ attribute? :instance_public , Types::Strict::Array do
30
+ attribute :name , Types::Strict::String
31
+ attribute :scope , Types::Strict::String # .optional.default(nil)
32
+ attribute :class_method , Types::Strict::Bool
33
+ attribute :arguments , Types::Strict::String
34
+ end
35
+ attribute? :instance_private , Types::Strict::Array do
36
+ attribute :name , Types::Strict::String
37
+ attribute :scope , Types::Strict::String # .optional.default(nil)
38
+ attribute :class_method , Types::Strict::Bool
39
+ attribute :arguments , Types::Strict::String
40
+ end
41
+ end
42
+ end
43
+ attribute? :dsl , Dry::Struct.optional.default(nil) do
44
+ attribute :default_scope , Types::Strict::String.optional.default(nil)
45
+
46
+ attribute? :scopes , Types::Strict::Array do
47
+ attribute :name , Types::Strict::String
48
+ attribute :scope , Types::Strict::String # .optional.default(nil)
49
+ end
50
+ attribute? :belongs_to , Types::Strict::Array do
51
+ attribute :name , Types::Strict::String
52
+ attribute :options , Types::Strict::Hash.optional.default({}.freeze)
53
+ attribute :raw_options , Types::Strict::String
54
+ end
55
+ attribute? :has_one , Types::Strict::Array do
56
+ attribute :name , Types::Strict::String
57
+ attribute :options , Types::Strict::Hash.optional.default({}.freeze)
58
+ attribute :raw_options , Types::Strict::String
59
+ end
60
+ attribute? :has_many , Types::Strict::Array do
61
+ attribute :name , Types::Strict::String
62
+ attribute :options , Types::Strict::Hash.optional.default({}.freeze)
63
+ attribute :raw_options , Types::Strict::String
64
+ end
65
+ attribute? :has_and_belongs_to_many , Types::Strict::Array do
66
+ attribute :name , Types::Strict::String
67
+ attribute :options , Types::Strict::Hash.optional.default({}.freeze)
68
+ attribute :raw_options , Types::Strict::String
69
+ end
70
+ attribute? :validate_on , Types::Strict::Array do
71
+ attribute :line , Types::Strict::String
72
+ end
73
+ attribute? :validates_on , Types::Strict::Array do
74
+ attribute :name , Types::Strict::String
75
+ attribute :raw_options , Types::Strict::String
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module KDomain
4
+ module DomainModel
5
+ class Column < Dry::Struct
6
+ attribute :name , Types::Strict::String # "source_account_id"
7
+ attribute :name_plural , Types::Strict::String # "source_account_ids"
8
+ attribute :type , Types::Coercible::Symbol # "integer"
9
+ attribute :precision , Types::Strict::Integer.optional.default(nil) # null
10
+ attribute :scale , Types::Strict::Integer.optional.default(nil) # null
11
+ attribute :default , Types::Nominal::Any.optional.default(nil) # null
12
+ attribute :null , Types::Nominal::Any.optional.default(nil) # null
13
+ attribute :limit , Types::Strict::Integer.optional.default(nil) # null
14
+ attribute :array , Types::Strict::Bool.optional.default(nil) # null
15
+
16
+ # Calculated value
17
+ attribute :structure_type , Types::Coercible::Symbol #
18
+ attribute :foreign_key , Types::Strict::Bool.optional.default(nil) #
19
+ attribute :foreign_table , Types::Strict::String #
20
+ attribute :foreign_table_plural , Types::Strict::String #
21
+
22
+ # def data_column
23
+ # @columns_data ||= structure_type?(:data)
24
+ # end
25
+
26
+ # def structure_type?(*structure_types)
27
+ # structure_types.include?(column.structure_type)
28
+ # end
29
+
30
+ def db_type
31
+ return @db_type if defined? @db_type
32
+
33
+ @db_type = DB_TYPE[type] || '******'
34
+ end
35
+
36
+ def ruby_type
37
+ return @ruby_type if defined? @ruby_type
38
+
39
+ @ruby_type = RUBY_TYPE[type] || '******'
40
+ end
41
+
42
+ def csharp_type
43
+ return @csharp_type if defined? @csharp_type
44
+
45
+ @csharp_type = CSHARP_TYPE[type] || '******'
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,111 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Domain class holds a list of the entities
4
+ module KDomain
5
+ module DomainModel
6
+ class Model < Dry::Struct
7
+ class Pk < Dry::Struct
8
+ attribute :name , Types::Strict::String.optional.default(nil)
9
+ attribute :type , Types::Strict::String.optional.default(nil)
10
+ attribute :exist , Types::Strict::Bool
11
+ end
12
+
13
+ class ErdLocation < Dry::Struct
14
+ attribute :file , Types::Strict::String
15
+ attribute :exist , Types::Strict::Bool
16
+ attribute :state , Types::Strict::Array
17
+ end
18
+
19
+ attribute :name , Types::Strict::String
20
+ attribute :name_plural , Types::Strict::String
21
+ attribute :table_name , Types::Strict::String
22
+ # Model type - :entity, :basic_user, :admin_user, possibly: m2m, agg_root
23
+ attribute :type , Types::Strict::Symbol.optional.default(:entity)
24
+ attribute :pk , KDomain::DomainModel::Model::Pk
25
+ attribute :erd_location , KDomain::DomainModel::Model::ErdLocation
26
+ attribute :columns , Types::Strict::Array.of(KDomain::DomainModel::Column)
27
+
28
+ def ruby?
29
+ location.exist
30
+ end
31
+
32
+ def pk?
33
+ pk.exist
34
+ end
35
+
36
+ # If filled in, the model has a main field that is useful for rendering and may be used for unique constraint, may also be called display_name
37
+ def main_key
38
+ @main_key ||= MainKey.lookup(name, columns_data)
39
+ end
40
+
41
+ def traits
42
+ @traits ||= Traits.lookup(name)
43
+ end
44
+
45
+ # def where()
46
+ # end
47
+
48
+ # def columns_where()
49
+ # end
50
+
51
+ # Column filters
52
+
53
+ def columns_data
54
+ @columns_data ||= columns_for_structure_types(:data)
55
+ end
56
+
57
+ # def columns_data_optional
58
+ # @columns_data_optional ||= columns_for_structure_types(:data).select { |c| true }
59
+ # end
60
+
61
+ # def columns_data_required
62
+ # @columns_data_required ||= columns_for_structure_types(:data).select { |c| false }
63
+ # end
64
+
65
+ def columns_primary
66
+ @columns_primary ||= columns_for_structure_types(:primary_key)
67
+ end
68
+
69
+ def columns_foreign
70
+ @columns_foreign ||= columns_for_structure_types(:foreign_key)
71
+ end
72
+
73
+ def columns_timestamp
74
+ @columns_data_timestamp ||= columns_for_structure_types(:timestamp)
75
+ end
76
+
77
+ def columns_deleted_at
78
+ @columns_data_deleted_at ||= columns_for_structure_types(:deleted_at)
79
+ end
80
+
81
+ def columns_virtual
82
+ @columns_virtual ||= columns_for_structure_types(:timestamp, :deleted_at)
83
+ end
84
+
85
+ def columns_data_foreign
86
+ @columns_data_foreign ||= columns_for_structure_types(:data, :foreign_key)
87
+ end
88
+ alias rows_fields_and_fk columns_data_foreign
89
+
90
+ def columns_data_primary
91
+ @columns_data_primary ||= columns_for_structure_types(:data, :primary_key)
92
+ end
93
+ alias rows_fields_and_pk columns_data_primary
94
+
95
+ def columns_data_virtual
96
+ @columns_data_virtual ||= columns_for_structure_types(:data, :timestamp, :deleted_at)
97
+ end
98
+ alias rows_fields_and_virtual columns_data_virtual
99
+
100
+ def columns_data_foreign_virtual
101
+ @columns_data_foreign_virtual ||= columns_for_structure_types(:data, :foreign_key, :timestamp, :deleted_at)
102
+ end
103
+
104
+ private
105
+
106
+ def columns_for_structure_types(*structure_types)
107
+ columns.select { |column| structure_types.include?(column.structure_type) }
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module KDomain
4
+ module DomainModel
5
+ class BelongsTo
6
+ KEYS = %i[a_lambda polymorphic class_name foreign_key primary_key inverse_of with_deleted code_duplicate].freeze
7
+
8
+ attr_accessor :name
9
+
10
+ attr_accessor :model_name
11
+ attr_accessor :model_name_plural
12
+
13
+ attr_accessor :a_lambda
14
+ attr_accessor :polymorphic
15
+ attr_accessor :class_name
16
+ attr_accessor :foreign_key
17
+ attr_accessor :primary_key
18
+ attr_accessor :inverse_of
19
+ attr_accessor :with_deleted
20
+
21
+ attr_accessor :related_entity
22
+ attr_accessor :code_duplicate
23
+ end
24
+ end
25
+ end