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.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -1
- data/Gemfile +1 -1
- data/Rakefile +3 -1
- data/STORIES.md +35 -6
- data/k_domain.gemspec +1 -0
- data/lib/k_domain/domain_model/load.rb +8 -2
- data/lib/k_domain/domain_model/transform.rb +24 -49
- data/lib/k_domain/domain_model/transform_steps/_.rb +3 -3
- data/lib/k_domain/domain_model/transform_steps/step.rb +36 -11
- data/lib/k_domain/domain_model/transform_steps/step1_attach_db_schema.rb +1 -1
- data/lib/k_domain/domain_model/transform_steps/{step8_locate_rails_models.rb → step4_rails_resource_models.rb} +5 -3
- data/lib/k_domain/domain_model/transform_steps/step5_rails_models.rb +71 -0
- data/lib/k_domain/domain_model/transform_steps/{step5_attach_dictionary.rb → step6_attach_dictionary.rb} +9 -3
- data/lib/k_domain/rails_code_extractor/extract_model.rb +58 -0
- data/lib/k_domain/rails_code_extractor/shim_loader.rb +29 -0
- data/lib/k_domain/raw_db_schema/load.rb +8 -2
- data/lib/k_domain/raw_db_schema/transform.rb +5 -6
- data/lib/k_domain/schemas/_.rb +16 -0
- data/lib/k_domain/schemas/database/_.rb +0 -7
- data/lib/k_domain/schemas/database/index.rb +1 -1
- data/lib/k_domain/schemas/database/schema.rb +15 -2
- data/lib/k_domain/schemas/database/table.rb +19 -8
- data/lib/k_domain/schemas/dictionary.rb +19 -0
- data/lib/k_domain/schemas/domain/_.rb +0 -3
- data/lib/k_domain/schemas/domain/domain.rb +1 -2
- data/lib/k_domain/schemas/domain/erd_file.rb +2 -0
- data/lib/k_domain/schemas/domain_model.rb +15 -0
- data/lib/k_domain/schemas/{domain/investigate.rb → investigate.rb} +1 -1
- data/lib/k_domain/schemas/rails_resource.rb +16 -0
- data/lib/k_domain/schemas/rails_structure.rb +92 -0
- data/lib/k_domain/version.rb +1 -1
- data/lib/k_domain.rb +13 -3
- data/templates/active_record_shims.rb +368 -0
- data/templates/fake_module_shims.rb +42 -0
- data/{lib/k_domain/raw_db_schema/template.rb → templates/load_schema.rb} +4 -4
- metadata +16 -12
- data/lib/k_domain/domain_model/transform_steps/step4_attach_erd_files.rb +0 -454
- data/lib/k_domain/schemas/database/column.rb +0 -16
- data/lib/k_domain/schemas/database/database.rb +0 -11
- data/lib/k_domain/schemas/database/unique_key.rb +0 -14
- data/lib/k_domain/schemas/domain/dictionary.rb +0 -17
- data/lib/k_domain/schemas/domain/schema.rb +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: de5fc8f220781026dd327f40da53eb3a424ec23f38785be8fddc8f1856970dc1
|
4
|
+
data.tar.gz: 5573e60dc8665ab146e0edeb291ebcd3db6b792180e05e24721df9d519038f86
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4ecaa0fef7e6d622f18d2dfe53bdddf2c17fa91e1c2796ee7bdddf5044880f742003d8cb6f7bb4007eeab4bd2f0becba6f8f0fb329f58776f807cd200bd4ced9
|
7
|
+
data.tar.gz: 76af19179f670d7e4b18121f031b77e18c366259526530b6623f988c5b3e2985ca3a993441e6caacfb7cb71da6afb05c99803234aa85045facdb2c8f09b1194b
|
data/.rubocop.yml
CHANGED
@@ -8,7 +8,9 @@ AllCops:
|
|
8
8
|
- "_/**/*"
|
9
9
|
- "spec/sample_input/**/*"
|
10
10
|
- "spec/sample_output/**/*"
|
11
|
-
- "
|
11
|
+
- "templates/**/*"
|
12
|
+
- "lib/k_domain/schemas/domain/old/**/*"
|
13
|
+
- "spec/k_domain/ruby_loader/**/*"
|
12
14
|
|
13
15
|
Metrics/PerceivedComplexity:
|
14
16
|
Exclude:
|
data/Gemfile
CHANGED
@@ -28,8 +28,8 @@ end
|
|
28
28
|
if ENV['KLUE_LOCAL_GEMS']&.to_s&.downcase == 'true'
|
29
29
|
group :development, :test do
|
30
30
|
puts 'Using Local GEMs'
|
31
|
-
gem 'peeky' , path: '../peeky'
|
32
31
|
gem 'k_log' , path: '../k_log'
|
33
32
|
gem 'k_util' , path: '../k_util'
|
33
|
+
gem 'peeky' , path: '../peeky'
|
34
34
|
end
|
35
35
|
end
|
data/Rakefile
CHANGED
data/STORIES.md
CHANGED
@@ -16,25 +16,54 @@ As a Developer, I can customize domain configuration, so that I can have opinion
|
|
16
16
|
|
17
17
|
- Handle traits
|
18
18
|
|
19
|
+
### Tasks next on list
|
20
|
+
|
21
|
+
BUGs in domain_model load
|
22
|
+
|
23
|
+
- spec/k_domain/domain_model/load_spec.rb:135
|
24
|
+
- FIXED: module_name should be empty
|
25
|
+
- FIXED: name mismatch (attr_accessor, attr_reader, attr_writer) in behaviours vs in (attr_accessors, attr_readers, attr_writers) functions
|
26
|
+
- functions - (attr_accessors, attr_readers, attr_writers) are all empty
|
27
|
+
|
28
|
+
External ruby process - ShimLoading and ExtractModel
|
29
|
+
|
30
|
+
- You need a clear memory foot print for shim loading and model extraction, best to run these from inside a new ruby process
|
31
|
+
|
32
|
+
Log Warning to Investigate Issues
|
33
|
+
|
34
|
+
- FIXED: All the logged warnings in k_domain need to turn up in on the investigate issues register
|
35
|
+
- Investigate needs a debug flag that when turned on, will write the issues to the console
|
36
|
+
|
37
|
+
Print progress dot
|
38
|
+
|
39
|
+
- Make this configurable
|
40
|
+
- Decide what steps this should run for
|
41
|
+
- Show step label via configuration
|
42
|
+
|
43
|
+
## Stories and tasks
|
44
|
+
|
45
|
+
### Stories - completed
|
46
|
+
|
19
47
|
As a Developer, I can read native rails model data, so that I can leverage existing rails applications for ERD modeling
|
20
48
|
|
49
|
+
- Proof of concept
|
21
50
|
- Use Meta Programming and re-implement ActiveRecord::Base
|
22
51
|
|
23
|
-
### Tasks
|
52
|
+
### Tasks - completed
|
24
53
|
|
25
54
|
Refactor / Simply
|
26
55
|
|
27
|
-
- Replace complex objects
|
56
|
+
- Replace complex objects with structs for ancillary data structures such as investigate
|
57
|
+
|
58
|
+
Steps to support write methods on base class
|
59
|
+
|
60
|
+
- Simplify lib/k_domain/domain_model/transform.rb
|
28
61
|
|
29
62
|
User acceptance testing
|
30
63
|
|
31
64
|
- Provide sample printers for each data structure to visually check data is loading
|
32
65
|
- Point raw_db_schema loader towards a complex ERD and check how it performs
|
33
66
|
|
34
|
-
## Stories and tasks
|
35
|
-
|
36
|
-
### Tasks - completed
|
37
|
-
|
38
67
|
Setup RubyGems and RubyDoc
|
39
68
|
|
40
69
|
- Build and deploy gem to [rubygems.org](https://rubygems.org/gems/k_domain)
|
data/k_domain.gemspec
CHANGED
@@ -20,9 +20,15 @@ module KDomain
|
|
20
20
|
|
21
21
|
def call
|
22
22
|
json = File.read(source_file)
|
23
|
-
|
23
|
+
@raw_data = KUtil.data.json_parse(json, as: :hash_symbolized)
|
24
24
|
|
25
|
-
@data = KDomain::DomainModel
|
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,21 +13,22 @@ 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
|
-
valid &&=
|
26
|
-
valid &&=
|
27
|
-
valid &&=
|
28
|
-
valid &&=
|
29
|
-
valid &&=
|
30
|
-
valid &&=
|
26
|
+
valid &&= Step1AttachDbSchema.run(domain_data, db_schema: db_schema, step_file: step_file('1-attach-db-schema'))
|
27
|
+
valid &&= Step2AttachModels.run(domain_data, erd_path: erd_path, step_file: step_file('2-attach-model'))
|
28
|
+
valid &&= Step3AttachColumns.run(domain_data, step_file: step_file('3-attach-columns'))
|
29
|
+
valid &&= Step4RailsResourceModels.run(domain_data, erd_path: erd_path, step_file: step_file('4-rails-resource-models'))
|
30
|
+
valid &&= Step5RailsModels.run(domain_data, erd_path: erd_path, step_file: step_file('5-rails-models'))
|
31
|
+
valid &&= Step6AttachDictionary.run(domain_data, erd_path: erd_path, step_file: step_file('6-attach-dictionary'))
|
31
32
|
|
32
33
|
raise 'DomainModal transform failed' unless valid
|
33
34
|
|
@@ -35,62 +36,34 @@ module KDomain
|
|
35
36
|
|
36
37
|
nil
|
37
38
|
end
|
39
|
+
# rubocop:enable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
38
40
|
|
39
|
-
def
|
40
|
-
|
41
|
-
write(step: '1-attach-db-schema')
|
41
|
+
def step_file(step_name)
|
42
|
+
target_step_file % { step: step_name }
|
42
43
|
end
|
43
44
|
|
44
|
-
def
|
45
|
-
|
46
|
-
write(
|
47
|
-
end
|
48
|
-
|
49
|
-
def step3
|
50
|
-
Step3AttachColumns.run(domain_data)
|
51
|
-
write(step: '3-attach-columns')
|
52
|
-
end
|
53
|
-
|
54
|
-
def step4
|
55
|
-
Step4AttachErdFiles.run(domain_data, erd_path: erd_path)
|
56
|
-
write(step: '4-attach-erd-files')
|
57
|
-
end
|
58
|
-
|
59
|
-
def step5
|
60
|
-
Step5AttachDictionary.run(domain_data, erd_path: erd_path)
|
61
|
-
write(step: '5-attach-dictionary')
|
62
|
-
end
|
63
|
-
|
64
|
-
def step8
|
65
|
-
Step8LocateRailsModels.run(domain_data, erd_path: erd_path)
|
66
|
-
write(step: '8-rails-files-models')
|
67
|
-
end
|
68
|
-
|
69
|
-
def write(step: nil)
|
70
|
-
file = if step.nil?
|
71
|
-
target_file
|
72
|
-
else
|
73
|
-
format(target_step_file, step: step)
|
74
|
-
end
|
75
|
-
FileUtils.mkdir_p(File.dirname(file))
|
76
|
-
File.write(file, JSON.pretty_generate(domain_data))
|
45
|
+
def write
|
46
|
+
FileUtils.mkdir_p(File.dirname(target_file))
|
47
|
+
File.write(target_file, JSON.pretty_generate(domain_data))
|
77
48
|
end
|
78
49
|
|
50
|
+
# rubocop:disable Metrics/MethodLength
|
79
51
|
def domain_data
|
80
52
|
# The initial domain model structure is created here, but populated during the workflows.
|
81
53
|
@domain_data ||= {
|
82
54
|
domain: {
|
83
55
|
models: [],
|
84
|
-
erd_files: [],
|
85
|
-
dictionary: []
|
86
56
|
},
|
87
|
-
|
57
|
+
rails_resource: {
|
88
58
|
models: [],
|
89
|
-
controllers: []
|
59
|
+
controllers: []
|
90
60
|
},
|
91
|
-
|
61
|
+
rails_structure: {
|
92
62
|
models: [],
|
93
|
-
controllers: []
|
63
|
+
controllers: []
|
64
|
+
},
|
65
|
+
dictionary: {
|
66
|
+
items: []
|
94
67
|
},
|
95
68
|
database: {
|
96
69
|
tables: [],
|
@@ -103,6 +76,8 @@ module KDomain
|
|
103
76
|
}
|
104
77
|
}
|
105
78
|
end
|
79
|
+
|
80
|
+
# rubocop:enable Metrics/MethodLength
|
106
81
|
end
|
107
82
|
end
|
108
83
|
end
|
@@ -5,6 +5,6 @@ require_relative './step'
|
|
5
5
|
require_relative './step1_attach_db_schema'
|
6
6
|
require_relative './step2_attach_models'
|
7
7
|
require_relative './step3_attach_columns'
|
8
|
-
require_relative './
|
9
|
-
require_relative './
|
10
|
-
require_relative './
|
8
|
+
require_relative './step4_rails_resource_models'
|
9
|
+
require_relative './step5_rails_models'
|
10
|
+
require_relative './step6_attach_dictionary'
|
@@ -24,7 +24,8 @@ module KDomain
|
|
24
24
|
def self.run(domain_data, **opts)
|
25
25
|
step = new(domain_data, **opts)
|
26
26
|
step.call
|
27
|
-
step
|
27
|
+
step.write(opts[:step_file])
|
28
|
+
step.valid?
|
28
29
|
end
|
29
30
|
|
30
31
|
def guard(message)
|
@@ -32,6 +33,11 @@ module KDomain
|
|
32
33
|
@valid = false
|
33
34
|
end
|
34
35
|
|
36
|
+
def write(file)
|
37
|
+
FileUtils.mkdir_p(File.dirname(file))
|
38
|
+
File.write(file, JSON.pretty_generate(domain_data))
|
39
|
+
end
|
40
|
+
|
35
41
|
# Domain Model Accessor/Helpers
|
36
42
|
def domain
|
37
43
|
guard('domain is missing') if domain_data[:domain].nil?
|
@@ -43,23 +49,42 @@ module KDomain
|
|
43
49
|
domain[:models]
|
44
50
|
end
|
45
51
|
|
46
|
-
# Rails File Accessor/Helpers
|
47
|
-
def
|
48
|
-
guard('
|
52
|
+
# Rails Resource File Accessor/Helpers
|
53
|
+
def rails_resource
|
54
|
+
guard('rails_resource is missing') if domain_data[:rails_resource].nil?
|
55
|
+
|
56
|
+
domain_data[:rails_resource]
|
57
|
+
end
|
58
|
+
|
59
|
+
def rails_resource_models
|
60
|
+
rails_resource[:models]
|
61
|
+
end
|
62
|
+
|
63
|
+
def rails_resource_models=(value)
|
64
|
+
rails_resource[:models] = value
|
65
|
+
end
|
66
|
+
|
67
|
+
def rails_resource_controllers
|
68
|
+
rails_resource[:controllers]
|
69
|
+
end
|
70
|
+
|
71
|
+
# Rails Structure File Accessor/Helpers
|
72
|
+
def rails_structure
|
73
|
+
guard('rails_structure is missing') if domain_data[:rails_structure].nil?
|
49
74
|
|
50
|
-
domain_data[:
|
75
|
+
domain_data[:rails_structure]
|
51
76
|
end
|
52
77
|
|
53
|
-
def
|
54
|
-
|
78
|
+
def rails_structure_models
|
79
|
+
rails_structure[:models]
|
55
80
|
end
|
56
81
|
|
57
|
-
def
|
58
|
-
|
82
|
+
def rails_structure_models=(value)
|
83
|
+
rails_structure[:models] = value
|
59
84
|
end
|
60
85
|
|
61
|
-
def
|
62
|
-
|
86
|
+
def rails_structure_controllers
|
87
|
+
rails_structure[:controllers]
|
63
88
|
end
|
64
89
|
|
65
90
|
# Database Accessor/Helpers
|
@@ -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][:
|
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
|
@@ -1,18 +1,20 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# Locate rails model files
|
4
|
-
class
|
4
|
+
class Step4RailsResourceModels < KDomain::DomainModel::Step
|
5
5
|
attr_accessor :ruby_code
|
6
6
|
|
7
7
|
def call
|
8
8
|
raise 'ERD path not supplied' if opts[:erd_path].nil?
|
9
9
|
|
10
|
-
self.
|
10
|
+
self.rails_resource_models = domain_models.map do |model|
|
11
|
+
locate_rails_model(model[:name], model[:table_name])
|
12
|
+
end
|
11
13
|
end
|
12
14
|
|
13
15
|
private
|
14
16
|
|
15
|
-
def locate_rails_model(
|
17
|
+
def locate_rails_model(model_name, table_name)
|
16
18
|
file_normal = File.join(opts[:erd_path], "#{model_name}.rb")
|
17
19
|
file_custom = File.join(opts[:erd_path], "#{table_name}.rb")
|
18
20
|
file_exist = true
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Locate rails model files
|
4
|
+
class Step5RailsModels < KDomain::DomainModel::Step
|
5
|
+
def call
|
6
|
+
raise 'ERD path not supplied' unless opts[:erd_path]
|
7
|
+
|
8
|
+
self.rails_structure_models = rails_resource_models.map do |resource|
|
9
|
+
process_resource(OpenStruct.new(resource))
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def process_resource(resource)
|
16
|
+
@model = {
|
17
|
+
model_name: resource.model_name,
|
18
|
+
table_name: resource.table_name,
|
19
|
+
file: resource.file,
|
20
|
+
exist: resource.exist,
|
21
|
+
state: resource.state,
|
22
|
+
code: resource.exist ? File.read(resource.file) : '',
|
23
|
+
behaviours: {},
|
24
|
+
functions: {}
|
25
|
+
}
|
26
|
+
|
27
|
+
return @model unless resource.exist
|
28
|
+
|
29
|
+
@model[:behaviours] = extract_model_behavior(resource.file)
|
30
|
+
@model[:functions] = extract_model_functions(resource.file)
|
31
|
+
|
32
|
+
@model
|
33
|
+
end
|
34
|
+
|
35
|
+
def extract_model_behavior(file)
|
36
|
+
extractor.extract(file)
|
37
|
+
extractor.model
|
38
|
+
end
|
39
|
+
|
40
|
+
def extract_model_functions(file)
|
41
|
+
klass_name = File.basename(file, File.extname(file))
|
42
|
+
|
43
|
+
klass = case klass_name
|
44
|
+
when 'clearbit_quota'
|
45
|
+
ClearbitQuota
|
46
|
+
when 'account_history_data'
|
47
|
+
AccountHistoryData
|
48
|
+
else
|
49
|
+
Module.const_get(klass_name.classify)
|
50
|
+
end
|
51
|
+
|
52
|
+
class_info = Peeky.api.build_class_info(klass.new)
|
53
|
+
|
54
|
+
class_info.to_h
|
55
|
+
rescue StandardError => e
|
56
|
+
log.exception(e)
|
57
|
+
end
|
58
|
+
|
59
|
+
def extractor
|
60
|
+
@extractor ||= KDomain::RailsCodeExtractor::ExtractModel.new(shim_loader)
|
61
|
+
end
|
62
|
+
|
63
|
+
def shim_loader
|
64
|
+
return opts[:shim_loader] if !opts[:shim_loader].nil? && opts[:shim_loader].is_a?(KDomain::RailsCodeExtractor::ShimLoader)
|
65
|
+
|
66
|
+
shim_loader = KDomain::RailsCodeExtractor::ShimLoader.new
|
67
|
+
shim_loader.register(:fake_module , KDomain::Gem.resource('templates/fake_module_shims.rb'))
|
68
|
+
shim_loader.register(:active_record, KDomain::Gem.resource('templates/active_record_shims.rb'))
|
69
|
+
shim_loader
|
70
|
+
end
|
71
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# Attach data dictionary
|
4
|
-
class
|
4
|
+
class Step6AttachDictionary < KDomain::DomainModel::Step
|
5
5
|
attr_reader :dictionary
|
6
6
|
|
7
7
|
def call
|
@@ -13,7 +13,9 @@ class Step5AttachDictionary < KDomain::DomainModel::Step
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
-
|
16
|
+
domain_data[:dictionary] = {
|
17
|
+
items: dictionary.values
|
18
|
+
}
|
17
19
|
end
|
18
20
|
|
19
21
|
private
|
@@ -25,7 +27,11 @@ 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
|
-
|
30
|
+
investigate(step: :step5_attach_dictionary,
|
31
|
+
location: :process,
|
32
|
+
key: "#{model_name},#{column_name},#{column_type}",
|
33
|
+
message: "#{model_name} has a type mismatch for column name: #{column_name}")
|
34
|
+
|
29
35
|
entry[:types] << column_type
|
30
36
|
entry[:type_count] = entry[:type_count] + 1
|
31
37
|
end
|
@@ -0,0 +1,58 @@
|
|
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 :shims_loaded
|
10
|
+
attr_reader :models
|
11
|
+
attr_reader :model
|
12
|
+
|
13
|
+
def initialize(load_shim)
|
14
|
+
@load_shim = load_shim
|
15
|
+
@shims_loaded = false
|
16
|
+
@models = []
|
17
|
+
end
|
18
|
+
|
19
|
+
def extract(file)
|
20
|
+
load_shims unless shims_loaded
|
21
|
+
|
22
|
+
ActiveRecord.current_class = nil
|
23
|
+
|
24
|
+
load_retry(file, 10)
|
25
|
+
rescue StandardError => e
|
26
|
+
log.exception(e)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def load_shims
|
32
|
+
@load_shim.call
|
33
|
+
@shims_loaded = true
|
34
|
+
end
|
35
|
+
|
36
|
+
# rubocop:disable Security/Eval,Style/EvalWithLocation,Style/DocumentDynamicEvalDefinition,Metrics/AbcSize
|
37
|
+
def load_retry(file, times)
|
38
|
+
return if times.negative?
|
39
|
+
|
40
|
+
load(file)
|
41
|
+
|
42
|
+
@model = ActiveRecord.current_class
|
43
|
+
@models << @model
|
44
|
+
|
45
|
+
# get_method_info(File.base_name(file))
|
46
|
+
rescue StandardError => e
|
47
|
+
puts e.message
|
48
|
+
if e.is_a?(NameError)
|
49
|
+
log.kv('add module', e.name)
|
50
|
+
eval("module #{e.name}; end")
|
51
|
+
return load_retry(path, times - 1)
|
52
|
+
end
|
53
|
+
log.exception(e)
|
54
|
+
end
|
55
|
+
# rubocop:enable Security/Eval,Style/EvalWithLocation,Style/DocumentDynamicEvalDefinition,Metrics/AbcSize
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,29 @@
|
|
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 ShimLoader
|
12
|
+
include KLog::Logging
|
13
|
+
|
14
|
+
attr_reader :shim_files
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
@shim_files = []
|
18
|
+
end
|
19
|
+
|
20
|
+
def call
|
21
|
+
shim_files.select { |sf| sf[:exist] }.each { |sf| require sf[:file] }
|
22
|
+
end
|
23
|
+
|
24
|
+
def register(name, file)
|
25
|
+
@shim_files << { name: name, file: file, exist: File.exist?(file) }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -20,9 +20,15 @@ module KDomain
|
|
20
20
|
|
21
21
|
def call
|
22
22
|
json = File.read(source_file)
|
23
|
-
|
23
|
+
@raw_data = KUtil.data.json_parse(json, as: :hash_symbolized)
|
24
24
|
|
25
|
-
@data = KDomain::Database::Schema.new(
|
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
|
@@ -16,7 +16,7 @@ module KDomain
|
|
16
16
|
|
17
17
|
def initialize(source_file)
|
18
18
|
@source_file = source_file
|
19
|
-
@template_file = '
|
19
|
+
@template_file = KDomain::Gem.resource('templates/load_schema.rb')
|
20
20
|
end
|
21
21
|
|
22
22
|
def call
|
@@ -24,7 +24,6 @@ module KDomain
|
|
24
24
|
# log.kv 'template_file', template_file
|
25
25
|
# log.kv 'source_file?', File.exist?(source_file)
|
26
26
|
# log.kv 'template_file?', File.exist?(template_file)
|
27
|
-
|
28
27
|
log.error "Template not found: #{template_file}" unless File.exist?(template_file)
|
29
28
|
|
30
29
|
content = File.read(source_file)
|
@@ -69,13 +68,13 @@ module KDomain
|
|
69
68
|
return
|
70
69
|
end
|
71
70
|
|
72
|
-
eval(schema_loader)
|
71
|
+
eval(schema_loader) # , __FILE__, __LINE__)
|
73
72
|
|
74
73
|
loader = LoadSchema.new
|
75
74
|
loader.load_schema
|
76
|
-
|
77
|
-
rescue =>
|
78
|
-
log.exception(
|
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,16 @@
|
|
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 'rails_structure'
|
11
|
+
require_relative 'investigate'
|
12
|
+
require_relative 'database/_'
|
13
|
+
require_relative 'dictionary'
|
14
|
+
require_relative 'domain/_'
|
15
|
+
|
16
|
+
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'
|
@@ -8,7 +8,7 @@ module KDomain
|
|
8
8
|
attribute :using , Types::Nominal::String
|
9
9
|
attribute :order? , Types::Nominal::Hash
|
10
10
|
attribute :where? , Types::Nominal::Any.optional.default(nil)
|
11
|
-
attribute :unique?
|
11
|
+
attribute :unique? , Types::Nominal::Any.optional.default(nil)
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|