k_domain 0.0.5 → 0.0.16

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 (65) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +11 -1
  3. data/Gemfile +10 -0
  4. data/Rakefile +3 -1
  5. data/STORIES.md +15 -0
  6. data/k_domain.gemspec +2 -0
  7. data/lib/k_domain/domain_model/load.rb +8 -2
  8. data/lib/k_domain/domain_model/transform.rb +30 -3
  9. data/lib/k_domain/domain_model/transform_steps/_.rb +2 -0
  10. data/lib/k_domain/domain_model/transform_steps/step.rb +38 -0
  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/step4_attach_erd_files.rb +5 -2
  13. data/lib/k_domain/domain_model/transform_steps/step5_attach_dictionary.rb +5 -2
  14. data/lib/k_domain/domain_model/transform_steps/step8_rails_resource_models.rb +44 -0
  15. data/lib/k_domain/domain_model/transform_steps/step9_rails_structure_models.rb +33 -0
  16. data/lib/k_domain/rails_code_extractor/extract_model.rb +21 -0
  17. data/lib/k_domain/rails_code_extractor/load_shim.rb +32 -0
  18. data/lib/k_domain/raw_db_schema/load.rb +8 -2
  19. data/lib/k_domain/raw_db_schema/transform.rb +4 -5
  20. data/lib/k_domain/schemas/_.rb +15 -0
  21. data/lib/k_domain/{raw_db_schema/dtos → schemas/database}/_.rb +0 -7
  22. data/lib/k_domain/{raw_db_schema/dtos → schemas/database}/foreign_key.rb +1 -1
  23. data/lib/k_domain/{raw_db_schema/dtos → schemas/database}/index.rb +1 -1
  24. data/lib/k_domain/schemas/database/schema.rb +31 -0
  25. data/lib/k_domain/schemas/database/table.rb +32 -0
  26. data/lib/k_domain/schemas/dictionary.rb +19 -0
  27. data/lib/k_domain/{domain_model/dtos → schemas/domain}/_.rb +1 -24
  28. data/lib/k_domain/{domain_model/dtos → schemas/domain}/domain.rb +1 -1
  29. data/lib/k_domain/schemas/domain/erd_file.rb +82 -0
  30. data/lib/k_domain/{domain_model/dtos → schemas/domain}/models/column.rb +0 -0
  31. data/lib/k_domain/{domain_model/dtos → schemas/domain}/models/model.rb +0 -0
  32. data/lib/k_domain/{domain_model/dtos → schemas/domain/old}/belongs_to.rb +0 -0
  33. data/lib/k_domain/{domain_model/dtos → schemas/domain/old}/column_old.rb +0 -0
  34. data/lib/k_domain/{domain_model/dtos → schemas/domain/old}/domain_statistics.rb +0 -0
  35. data/lib/k_domain/{domain_model/dtos → schemas/domain/old}/entity.rb +0 -0
  36. data/lib/k_domain/{domain_model/dtos → schemas/domain/old}/entity_statistics.rb +0 -0
  37. data/lib/k_domain/{domain_model/dtos → schemas/domain/old}/foreign_key.rb +0 -0
  38. data/lib/k_domain/{domain_model/dtos → schemas/domain/old}/has_and_belongs_to_many.rb +0 -0
  39. data/lib/k_domain/{domain_model/dtos → schemas/domain/old}/has_many.rb +0 -0
  40. data/lib/k_domain/{domain_model/dtos → schemas/domain/old}/has_one.rb +0 -0
  41. data/lib/k_domain/{domain_model/dtos → schemas/domain/old}/name_options.rb +0 -0
  42. data/lib/k_domain/{domain_model/dtos → schemas/domain/old}/rails_controller.rb +0 -0
  43. data/lib/k_domain/{domain_model/dtos → schemas/domain/old}/rails_model.rb +0 -0
  44. data/lib/k_domain/{domain_model/dtos → schemas/domain/old}/related_entity.rb +0 -0
  45. data/lib/k_domain/{domain_model/dtos → schemas/domain/old}/statistics.rb +0 -0
  46. data/lib/k_domain/{domain_model/dtos → schemas/domain/old}/validate.rb +0 -0
  47. data/lib/k_domain/{domain_model/dtos → schemas/domain/old}/validates.rb +0 -0
  48. data/lib/k_domain/schemas/domain_model.rb +14 -0
  49. data/lib/k_domain/schemas/investigate.rb +15 -0
  50. data/lib/k_domain/schemas/rails_resource.rb +16 -0
  51. data/lib/k_domain/version.rb +1 -1
  52. data/lib/k_domain.rb +14 -2
  53. data/templates/active_record_shims.rb +355 -0
  54. data/templates/fake_module_shims.rb +42 -0
  55. data/{lib/k_domain/raw_db_schema/template.rb → templates/load_schema.rb} +4 -4
  56. metadata +54 -35
  57. data/lib/k_domain/domain_model/dtos/dictionary/dictionary.rb +0 -17
  58. data/lib/k_domain/domain_model/dtos/investigate/investigate.rb +0 -10
  59. data/lib/k_domain/domain_model/dtos/investigate/issue.rb +0 -13
  60. data/lib/k_domain/domain_model/dtos/schema.rb +0 -12
  61. data/lib/k_domain/raw_db_schema/dtos/column.rb +0 -16
  62. data/lib/k_domain/raw_db_schema/dtos/database.rb +0 -11
  63. data/lib/k_domain/raw_db_schema/dtos/schema.rb +0 -18
  64. data/lib/k_domain/raw_db_schema/dtos/table.rb +0 -21
  65. data/lib/k_domain/raw_db_schema/dtos/unique_key.rb +0 -14
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 92aebc822bef5bff0524221c4ca53f3bccdf4f3b4a134c2bcdd207f7c58e5609
4
- data.tar.gz: db850d6a8d98ee6a5fd77f1cfe5a9e87d5da262ebec598c84f8ca70b3fb5a1cb
3
+ metadata.gz: 98e1d3eb1435f17ad91084519399234f0adc41e399d1350071147f0e58f694c6
4
+ data.tar.gz: 2797a698e87169816a6b612239b1c22b8d2fd0db2fd6df2fc8e078fbf8828e69
5
5
  SHA512:
6
- metadata.gz: d31d1bd2e461d1a86b938eb043c9dda1c5f553e3a8a1ddd759e0ff24b349da2100f934feb0ac8b001da137086862145aa575be1a2b32a6070f1f82b5ff63a837
7
- data.tar.gz: acd57f1f859401f1d0ff8f39fc7cc3eb69ee128a0c91b94f5ce92bb275ff82924663ce00beb58a25c19752934e2ccc70f1cf04a83e1b8de429e70bd403fb48eb
6
+ metadata.gz: 1e6cd0d3fa8354f83b5910dc961212acd0ae149b0b90c31338bf992b4f64500ae4fb05f63c605bf439d818bed8f6f4806939994c0cf8ee6fbd0c0a51d232b02f
7
+ data.tar.gz: 28d42c273b6fdae5db9b32e4cfcd4c1826e42f929efbc9713941b16bc4240cff22eed7e3260aec195beff43ae3ec20bf136bb6526988eccbd5f475c18ec2566a
data/.rubocop.yml CHANGED
@@ -8,12 +8,15 @@ AllCops:
8
8
  - "_/**/*"
9
9
  - "spec/sample_input/**/*"
10
10
  - "spec/sample_output/**/*"
11
- - "lib/k_domain/raw_db_schema/template.rb"
11
+ - "templates/**/*"
12
+ - "lib/k_domain/schemas/domain/old/**/*"
13
+ - "spec/k_domain/ruby_loader/**/*"
12
14
 
13
15
  Metrics/PerceivedComplexity:
14
16
  Exclude:
15
17
  - "lib/k_domain/domain_model/transform_steps/*.rb"
16
18
  - "lib/k_domain/domain_model/dtos/entity.rb"
19
+ - "lib/k_domain/domain_model/dtos/old/entity.rb"
17
20
 
18
21
  Metrics/AbcSize:
19
22
  Exclude:
@@ -21,16 +24,21 @@ Metrics/AbcSize:
21
24
  - "lib/k_domain/domain_model/dtos/rails_model.rb"
22
25
  - "lib/k_domain/domain_model/dtos/entity.rb"
23
26
  - "lib/k_domain/domain_model/dtos/column_old.rb"
27
+ - "lib/k_domain/domain_model/dtos/old/column_old.rb"
28
+ - "lib/k_domain/domain_model/dtos/old/rails_model.rb"
29
+ - "lib/k_domain/domain_model/dtos/old/entity.rb"
24
30
 
25
31
  Metrics/CyclomaticComplexity:
26
32
  Exclude:
27
33
  - "lib/k_domain/domain_model/transform_steps/*.rb"
28
34
  - "lib/k_domain/domain_model/dtos/entity.rb"
35
+ - "lib/k_domain/domain_model/dtos/old/entity.rb"
29
36
 
30
37
  Metrics/BlockLength:
31
38
  Exclude:
32
39
  - "**/spec/**/*"
33
40
  - "*.gemspec"
41
+ - 'lib/k_domain/domain_model/dtos/erd_file.rb'
34
42
  IgnoredMethods:
35
43
  - configure
36
44
  - context
@@ -56,6 +64,8 @@ Metrics/MethodLength:
56
64
  Exclude:
57
65
  - "lib/k_domain/domain_model/transform_steps/*.rb"
58
66
  - "lib/k_domain/domain_model/dtos/rails_model.rb"
67
+ - "lib/k_domain/domain_model/dtos/old/entity.rb"
68
+ - "lib/k_domain/domain_model/dtos/old/rails_model.rb"
59
69
 
60
70
  Layout/LineLength:
61
71
  Max: 200
data/Gemfile CHANGED
@@ -23,3 +23,13 @@ group :development, :test do
23
23
  gem 'rubocop-rake', require: false
24
24
  gem 'rubocop-rspec', require: false
25
25
  end
26
+
27
+ # If local dependency
28
+ if ENV['KLUE_LOCAL_GEMS']&.to_s&.downcase == 'true'
29
+ group :development, :test do
30
+ puts 'Using Local GEMs'
31
+ gem 'k_log' , path: '../k_log'
32
+ gem 'k_util' , path: '../k_util'
33
+ gem 'peeky' , path: '../peeky'
34
+ end
35
+ end
data/Rakefile CHANGED
@@ -26,7 +26,9 @@ task :publish do
26
26
  system 'gem build'
27
27
  system "gem push #{GEM_NAME}-#{KDomain::VERSION}.gem"
28
28
  end
29
-
29
+ task :build do
30
+ system 'gem build'
31
+ end
30
32
  desc 'Remove old *.gem files'
31
33
  task :clean do
32
34
  system 'rm *.gem'
data/STORIES.md CHANGED
@@ -16,6 +16,21 @@ As a Developer, I can customize domain configuration, so that I can have opinion
16
16
 
17
17
  - Handle traits
18
18
 
19
+ As a Developer, I can read native rails model data, so that I can leverage existing rails applications for ERD modeling
20
+
21
+ - Use Meta Programming and re-implement ActiveRecord::Base
22
+
23
+ ### Tasks next on list
24
+
25
+ Refactor / Simply
26
+
27
+ - Replace complex objects an with structs for ancillary data structures such as investigate
28
+
29
+ User acceptance testing
30
+
31
+ - Provide sample printers for each data structure to visually check data is loading
32
+ - Point raw_db_schema loader towards a complex ERD and check how it performs
33
+
19
34
  ## Stories and tasks
20
35
 
21
36
  ### Tasks - completed
data/k_domain.gemspec CHANGED
@@ -33,6 +33,7 @@ Gem::Specification.new do |spec|
33
33
  f.match(%r{^(test|spec|features)/})
34
34
  end
35
35
  end
36
+
36
37
  spec.bindir = 'exe'
37
38
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
38
39
  spec.require_paths = ['lib']
@@ -41,4 +42,5 @@ Gem::Specification.new do |spec|
41
42
  spec.add_dependency 'activesupport' , '~> 6'
42
43
  spec.add_dependency 'dry-struct', '~> 1'
43
44
  spec.add_dependency 'k_log' , '~> 0.0.0'
45
+ spec.add_dependency 'peeky' , '~> 0.0.0'
44
46
  end
@@ -20,9 +20,15 @@ module KDomain
20
20
 
21
21
  def call
22
22
  json = File.read(source_file)
23
- data = KUtil.data.json_parse(json, as: :hash_symbolized)
23
+ @raw_data = KUtil.data.json_parse(json, as: :hash_symbolized)
24
24
 
25
- @data = KDomain::DomainModel::Schema.new(data)
25
+ @data = KDomain::Schemas::DomainModel.new(@raw_data)
26
+ end
27
+
28
+ def to_h
29
+ return nil unless defined? @raw_data
30
+
31
+ @raw_data
26
32
  end
27
33
  end
28
34
  end
@@ -13,13 +13,14 @@ module KDomain
13
13
  attr_reader :target_file
14
14
  attr_reader :erd_path
15
15
 
16
- def initialize(db_schema, target_file, target_step_file, erd_path)
16
+ def initialize(db_schema: , target_file: , target_step_file: , erd_path:)
17
17
  @db_schema = db_schema
18
18
  @target_step_file = target_step_file
19
19
  @target_file = target_file
20
20
  @erd_path = erd_path
21
21
  end
22
22
 
23
+ # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
23
24
  def call
24
25
  valid = true
25
26
  valid &&= step1
@@ -27,6 +28,8 @@ module KDomain
27
28
  valid &&= step3
28
29
  valid &&= step4
29
30
  valid &&= step5
31
+ valid &&= step8
32
+ valid &&= step9
30
33
 
31
34
  raise 'DomainModal transform failed' unless valid
32
35
 
@@ -34,6 +37,7 @@ module KDomain
34
37
 
35
38
  nil
36
39
  end
40
+ # rubocop:enable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
37
41
 
38
42
  def step1
39
43
  Step1AttachDbSchema.run(domain_data, db_schema: db_schema)
@@ -60,6 +64,16 @@ module KDomain
60
64
  write(step: '5-attach-dictionary')
61
65
  end
62
66
 
67
+ def step8
68
+ Step8RailsResourceModels.run(domain_data, erd_path: erd_path)
69
+ write(step: '8-rails-resource-models')
70
+ end
71
+
72
+ def step9
73
+ Step9RailsStructureModels.run(domain_data, erd_path: erd_path)
74
+ write(step: '8-rails-structure-models')
75
+ end
76
+
63
77
  def write(step: nil)
64
78
  file = if step.nil?
65
79
  target_file
@@ -70,13 +84,24 @@ module KDomain
70
84
  File.write(file, JSON.pretty_generate(domain_data))
71
85
  end
72
86
 
87
+ # rubocop:disable Metrics/MethodLength
73
88
  def domain_data
74
89
  # The initial domain model structure is created here, but populated during the workflows.
75
90
  @domain_data ||= {
76
91
  domain: {
77
92
  models: [],
78
- erd_files: [],
79
- dictionary: []
93
+ erd_files: []
94
+ },
95
+ rails_resource: {
96
+ models: [],
97
+ controllers: []
98
+ },
99
+ rails_structure: {
100
+ models: [],
101
+ controllers: []
102
+ },
103
+ dictionary: {
104
+ items: []
80
105
  },
81
106
  database: {
82
107
  tables: [],
@@ -89,6 +114,8 @@ module KDomain
89
114
  }
90
115
  }
91
116
  end
117
+
118
+ # rubocop:enable Metrics/MethodLength
92
119
  end
93
120
  end
94
121
  end
@@ -7,3 +7,5 @@ require_relative './step2_attach_models'
7
7
  require_relative './step3_attach_columns'
8
8
  require_relative './step4_attach_erd_files'
9
9
  require_relative './step5_attach_dictionary'
10
+ require_relative './step8_rails_resource_models'
11
+ require_relative './step9_rails_structure_models'
@@ -43,6 +43,44 @@ module KDomain
43
43
  domain[:models]
44
44
  end
45
45
 
46
+ # Rails Resource File Accessor/Helpers
47
+ def rails_resource
48
+ guard('rails_resource is missing') if domain_data[:rails_resource].nil?
49
+
50
+ domain_data[:rails_resource]
51
+ end
52
+
53
+ def rails_resource_models
54
+ rails_resource[:models]
55
+ end
56
+
57
+ def rails_resource_models=(value)
58
+ rails_resource[:models] = value
59
+ end
60
+
61
+ def rails_resource_controllers
62
+ rails_resource[:controllers]
63
+ end
64
+
65
+ # Rails Structure File Accessor/Helpers
66
+ def rails_structure
67
+ guard('rails_structure is missing') if domain_data[:rails_structure].nil?
68
+
69
+ domain_data[:rails_structure]
70
+ end
71
+
72
+ def rails_structure_models
73
+ rails_structure[:models]
74
+ end
75
+
76
+ def rails_structure_models=(value)
77
+ rails_structure[:models] = value
78
+ end
79
+
80
+ def rails_structure_controllers
81
+ rails_structure[:controllers]
82
+ end
83
+
46
84
  # Database Accessor/Helpers
47
85
  def database=(value)
48
86
  domain_data[:database] = value
@@ -13,7 +13,7 @@ module KDomain
13
13
  guard('indexes are missing') if database[:indexes].nil?
14
14
  guard('foreign keys are missing') if database[:foreign_keys].nil?
15
15
  guard('rails version is missing') if database[:meta][:rails].nil?
16
- guard('postgres extensions are missing') if database[:meta][:database][:extensions].nil?
16
+ guard('postgres extensions are missing') if database[:meta][:db_info][:extensions].nil?
17
17
  guard('unique keys are missing') if database[:meta][:unique_keys].nil?
18
18
  end
19
19
  end
@@ -24,6 +24,9 @@ class Step4AttachErdFiles < KDomain::DomainModel::Step
24
24
  end
25
25
 
26
26
  def load_dsl(model)
27
+ # this should be a configuration
28
+ # print '.'
29
+
27
30
  reset_dsl
28
31
 
29
32
  dsl[:name] = model[:name]
@@ -58,7 +61,7 @@ class Step4AttachErdFiles < KDomain::DomainModel::Step
58
61
  ruby: ruby_code,
59
62
  public: public_code,
60
63
  private: private_code,
61
- methods: grab_methods(public_code, private_code)
64
+ all_methods: grab_methods(public_code, private_code)
62
65
  }
63
66
  end
64
67
 
@@ -348,7 +351,7 @@ class Step4AttachErdFiles < KDomain::DomainModel::Step
348
351
  instance_private = all_instance.select { |method| method[:scope] == :private }
349
352
 
350
353
  {
351
- class: class_methods,
354
+ klass: class_methods,
352
355
  instance: all_instance,
353
356
  instance_public: instance_public,
354
357
  instance_private: instance_private
@@ -13,7 +13,9 @@ class Step5AttachDictionary < KDomain::DomainModel::Step
13
13
  end
14
14
  end
15
15
 
16
- domain[:dictionary] = dictionary.values
16
+ domain_data[:dictionary] = {
17
+ items: dictionary.values
18
+ }
17
19
  end
18
20
 
19
21
  private
@@ -25,7 +27,8 @@ class Step5AttachDictionary < KDomain::DomainModel::Step
25
27
  entry[:model_count] = entry[:model_count] + 1
26
28
 
27
29
  unless entry[:types].include?(column_type)
28
- log.warn("#{model_name} has a type mismatch for column name: #{column_name}")
30
+ # ADD to investigate
31
+ # log.warn("#{model_name} has a type mismatch for column name: #{column_name}")
29
32
  entry[:types] << column_type
30
33
  entry[:type_count] = entry[:type_count] + 1
31
34
  end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Locate rails model files
4
+ class Step8RailsResourceModels < KDomain::DomainModel::Step
5
+ attr_accessor :ruby_code
6
+
7
+ def call
8
+ raise 'ERD path not supplied' if opts[:erd_path].nil?
9
+
10
+ self.rails_resource_models = domain_models.map do |model|
11
+ locate_rails_model(model[:name], model[:table_name])
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def locate_rails_model(model_name, table_name)
18
+ file_normal = File.join(opts[:erd_path], "#{model_name}.rb")
19
+ file_custom = File.join(opts[:erd_path], "#{table_name}.rb")
20
+ file_exist = true
21
+ state = []
22
+
23
+ if File.exist?(file_normal)
24
+ file = file_normal
25
+ state.push(:has_ruby_model)
26
+ elsif File.exist?(file_custom)
27
+ file = file_custom
28
+ state.push(:has_ruby_model)
29
+ state.push(:non_conventional_name)
30
+ else
31
+ file = ''
32
+ file_exist = false
33
+ state.push(:model_not_found)
34
+ end
35
+
36
+ {
37
+ model_name: model_name,
38
+ table_name: table_name,
39
+ file: file,
40
+ exist: file_exist,
41
+ state: state.join(', ')
42
+ }
43
+ end
44
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Locate rails model files
4
+ class Step9RailsStructureModels < KDomain::DomainModel::Step
5
+ attr_accessor :ruby_code
6
+
7
+ def call
8
+ raise 'ERD path not supplied' if opts[:erd_path].nil?
9
+
10
+ self.rails_structure_models = rails_resource_models.map do |resource|
11
+ process_resource(OpenStruct.new(resource))
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def process_resource(resource)
18
+ erd_path = opts[:erd_path]
19
+ puts erd_path
20
+ @model = {
21
+ model_name: resource.model_name,
22
+ table_name: resource.table_name,
23
+ file: resource.file,
24
+ exist: resource.exist,
25
+ state: resource.state,
26
+ code: resource.exist ? File.read(resource.file) : '',
27
+ behaviours: {},
28
+ functions: {}
29
+ }
30
+
31
+ @model
32
+ end
33
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Takes a Rails Model and extracts DSL behaviours and custom functions (instance, class and private methods)
4
+ module KDomain
5
+ module RailsCodeExtractor
6
+ class ExtractModel
7
+ include KLog::Logging
8
+
9
+ attr_reader :source_file
10
+ attr_reader :data
11
+
12
+ def initialize(source_file)
13
+ @source_file = source_file
14
+ end
15
+
16
+ def call
17
+ log.kv 'source_file', source_file
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Code extraction requires shims to be loaded before extraction
4
+ #
5
+ # This shims server two purposes
6
+ #
7
+ # 1. Inject data capture methods calls that intercept DSL macros so that data can be extracted
8
+ # 2. Inject fake module/classes that would otherwise break code loading with various exceptions
9
+ module KDomain
10
+ module RailsCodeExtractor
11
+ class LoadShim
12
+ include KLog::Logging
13
+
14
+ attr_reader :shim_files
15
+
16
+ attr_reader :dsl_shim_file
17
+ attr_reader :fake_module_file
18
+
19
+ def initialize
20
+ @shim_files = []
21
+ end
22
+
23
+ def call
24
+ log.kv 'preload', preload
25
+ end
26
+
27
+ def register(name, file)
28
+ @shim_files << { name: name, file: file, exist: File.exist?(file) }
29
+ end
30
+ end
31
+ end
32
+ end
@@ -20,9 +20,15 @@ module KDomain
20
20
 
21
21
  def call
22
22
  json = File.read(source_file)
23
- data = KUtil.data.json_parse(json, as: :hash_symbolized)
23
+ @raw_data = KUtil.data.json_parse(json, as: :hash_symbolized)
24
24
 
25
- @data = KDomain::RawDbSchema::Schema.new(data)
25
+ @data = KDomain::Database::Schema.new(@raw_data)
26
+ end
27
+
28
+ def to_h
29
+ return nil unless defined? @raw_data
30
+
31
+ @raw_data
26
32
  end
27
33
  end
28
34
  end
@@ -14,10 +14,9 @@ module KDomain
14
14
  attr_reader :template_file
15
15
  attr_reader :schema_loader
16
16
 
17
- # , target_file)
18
17
  def initialize(source_file)
19
18
  @source_file = source_file
20
- @template_file = 'lib/k_domain/raw_db_schema/template.rb'
19
+ @template_file = KDomain::Gem.resource('templates/load_schema.rb')
21
20
  end
22
21
 
23
22
  def call
@@ -25,7 +24,6 @@ module KDomain
25
24
  # log.kv 'template_file', template_file
26
25
  # log.kv 'source_file?', File.exist?(source_file)
27
26
  # log.kv 'template_file?', File.exist?(template_file)
28
-
29
27
  log.error "Template not found: #{template_file}" unless File.exist?(template_file)
30
28
 
31
29
  content = File.read(source_file)
@@ -70,12 +68,13 @@ module KDomain
70
68
  return
71
69
  end
72
70
 
73
- # load target_file
74
- eval schema_loader
71
+ eval(schema_loader) # , __FILE__, __LINE__)
75
72
 
76
73
  loader = LoadSchema.new
77
74
  loader.load_schema
78
75
  loader.schema
76
+ rescue StandardError => e
77
+ log.exception(e)
79
78
  end
80
79
  # rubocop:enable Security/Eval
81
80
  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'
@@ -1,14 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Types
4
- include Dry.Types()
5
- end
6
-
7
3
  # The require order is important due to dependencies
8
- require_relative './column'
9
- require_relative './database'
10
4
  require_relative './index'
11
5
  require_relative './table'
12
6
  require_relative './foreign_key'
13
- require_relative './unique_key'
14
7
  require_relative './schema'
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module KDomain
4
- module RawDbSchema
4
+ module Database
5
5
  class ForeignKey < Dry::Struct
6
6
  attribute :left , Types::Strict::String
7
7
  attribute :right , Types::Strict::String
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module KDomain
4
- module RawDbSchema
4
+ module Database
5
5
  class Index < Dry::Struct
6
6
  attribute :name , Types::Strict::String
7
7
  attribute :fields , Types::Nominal::Any.optional.default('xxxxx1')
@@ -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