k_domain 0.0.20 → 0.0.23
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/.builders/config/_.rb +3 -0
- data/.builders/setup.rb +30 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +1 -2
- data/Guardfile +1 -0
- data/README.md +15 -0
- data/lib/k_domain/domain_model/transform.rb +23 -13
- data/lib/k_domain/domain_model/transform_steps/_.rb +7 -5
- data/lib/k_domain/domain_model/transform_steps/step.rb +20 -0
- data/lib/k_domain/domain_model/transform_steps/{step1_attach_db_schema.rb → step1_db_schema.rb} +2 -1
- data/lib/k_domain/domain_model/transform_steps/{step6_attach_dictionary.rb → step20_dictionary.rb} +6 -6
- data/lib/k_domain/domain_model/transform_steps/step2_domain_models.rb +123 -0
- data/lib/k_domain/domain_model/transform_steps/step4_rails_resource_models.rb +3 -3
- data/lib/k_domain/domain_model/transform_steps/step5_rails_resource_routes.rb +36 -0
- data/lib/k_domain/domain_model/transform_steps/step6_rails_structure_models.rb +90 -0
- data/lib/k_domain/domain_model/transform_steps/step7_rails_structure_controllers.rb +109 -0
- data/lib/k_domain/domain_model/transform_steps/{step3_attach_columns.rb → step8_domain_columns.rb} +40 -73
- data/lib/k_domain/rails_code_extractor/_.rb +5 -0
- data/lib/k_domain/rails_code_extractor/extract_controller.rb +59 -0
- data/lib/k_domain/rails_code_extractor/extract_model.rb +19 -8
- data/lib/k_domain/rails_code_extractor/shim_loader.rb +1 -0
- data/lib/k_domain/raw_db_schema/load.rb +1 -1
- data/lib/k_domain/raw_db_schema/transform.rb +2 -1
- data/lib/k_domain/schemas/_.rb +2 -2
- data/lib/k_domain/schemas/database.rb +86 -0
- data/lib/k_domain/schemas/domain.rb +154 -0
- data/lib/k_domain/schemas/domain_model.rb +2 -2
- data/lib/k_domain/schemas/rails_resource.rb +43 -6
- data/lib/k_domain/schemas/rails_structure.rb +94 -14
- data/lib/k_domain/version.rb +1 -1
- data/lib/k_domain.rb +1 -2
- data/templates/custom/action_controller.rb +36 -0
- data/templates/custom/controller_interceptors.rb +78 -0
- data/templates/custom/model_interceptors.rb +71 -0
- data/templates/load_schema.rb +7 -0
- data/templates/old_printspeek_schema copy.rb +231 -0
- data/templates/old_printspeek_schema.rb +233 -0
- data/templates/rails/action_controller.rb +301 -0
- data/templates/{active_record_shims.rb → rails/active_record.rb} +21 -41
- data/templates/ruby_code_extractor/attach_class_info.rb +13 -0
- data/templates/ruby_code_extractor/behaviour_accessors.rb +39 -0
- data/templates/simple/controller_interceptors.rb +2 -0
- metadata +26 -18
- data/lib/k_domain/domain_model/transform_steps/step2_attach_models.rb +0 -62
- data/lib/k_domain/domain_model/transform_steps/step5_rails_models.rb +0 -71
- data/lib/k_domain/schemas/database/_.rb +0 -7
- data/lib/k_domain/schemas/database/foreign_key.rb +0 -14
- data/lib/k_domain/schemas/database/index.rb +0 -14
- data/lib/k_domain/schemas/database/schema.rb +0 -31
- data/lib/k_domain/schemas/database/table.rb +0 -32
- data/lib/k_domain/schemas/domain/domain.rb +0 -11
- data/lib/k_domain/schemas/domain/models/column.rb +0 -49
- data/lib/k_domain/schemas/domain/models/model.rb +0 -111
- data/templates/fake_module_shims.rb +0 -42
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cbbddfe9857696b7a3a02fc370c51205d584fd08aaad5f8b8605dccebab02bc1
|
4
|
+
data.tar.gz: c37fee293561e73b3ed4b4e31f9def8c13848217ee9c4d14efdcfc67a46d42ea
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 12d58c761198fe6fa8336871ab5a3475c0a1caf358c09af2005e8bab3192c82b864663b867b3f2a39d8ba7c20e58258a8981ddd6339dbdb4edec73e37bca4652
|
7
|
+
data.tar.gz: 0bfd25819a3425f2932ba751d9e4413b41ae2c617416751855ced16a7fc74f68eff64d87a92138c73b85b0df175f38b8b299f5912f67f8a78970926ff83a4df8
|
data/.builders/setup.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'config/_'
|
2
|
+
require_relative "../lib/k_domain"
|
3
|
+
|
4
|
+
db_schema_ruby_file = '/Users/davidcruwys/dev/printspeak/printspeak-master/db/schema.rb'
|
5
|
+
|
6
|
+
# /Users/davidcruwys/dev/printspeak/printspeak/.builders/config/raw/schema_printspeak.rb
|
7
|
+
output_folder = File.expand_path('../.output')
|
8
|
+
db_schema_json_file = File.join(output_folder, 'db_schema.json')
|
9
|
+
schema_loader_file = File.join(output_folder, 'schema_printspeak.rb')
|
10
|
+
|
11
|
+
transformer = KDomain::RawDbSchema::Transform.new(db_schema_ruby_file)
|
12
|
+
transformer.template_file = '/Users/davidcruwys/dev/kgems/k_domain/templates/old_printspeek_schema.rb'
|
13
|
+
puts db_schema_ruby_file
|
14
|
+
puts transformer.template_file
|
15
|
+
transformer.call
|
16
|
+
transformer.write_json(db_schema_json_file)
|
17
|
+
transformer.write_schema_loader(schema_loader_file)
|
18
|
+
# transformer.schema
|
19
|
+
|
20
|
+
|
21
|
+
# transform = KDomain::DomainModel::Transform.new(
|
22
|
+
# db_schema: db_schema,
|
23
|
+
# target_file: target_file,
|
24
|
+
# target_step_file: target_step_file,
|
25
|
+
# model_path: model_path,
|
26
|
+
# controller_path: controller_path,
|
27
|
+
# route_path: route_path
|
28
|
+
# )
|
29
|
+
|
30
|
+
puts 'done'
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
data/Guardfile
CHANGED
@@ -19,6 +19,7 @@ group :green_pass_then_cop, halt_on_fail: true do
|
|
19
19
|
# Ruby files
|
20
20
|
ruby = dsl.ruby
|
21
21
|
dsl.watch_spec_files_for(ruby.lib_files)
|
22
|
+
watch(%r{^lib/k_domain/domain_model/transform_steps/(.+).rb}) { 'spec/k_domain/domain_model/transform_spec.rb' }
|
22
23
|
watch(%r{^lib/k_domain/**/(.+)\.rb$}) { |m| "spec/unit/#{m[1]}_spec.rb" }
|
23
24
|
watch(%r{^lib/k_domain/commands/(.+)\.rb$}) { |m| "spec/unit/commands/#{m[1]}_spec.rb" }
|
24
25
|
end
|
data/README.md
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
# JSON Schema
|
2
|
+
|
3
|
+
The following schemas were created using the following processes.
|
4
|
+
|
5
|
+
```
|
6
|
+
quicktype -o json-schema/database.json -t database -l schema spec/sample_output/printspeak/schema.json
|
7
|
+
quicktype -o json-schema/database.rb -t database -l ruby json-schema/database-altered.json
|
8
|
+
spec/sample_output/printspeak/schema.json
|
9
|
+
json-schema/database-altered.json
|
10
|
+
```
|
11
|
+
|
12
|
+
remove statistics
|
13
|
+
remove (or move rails structure)
|
14
|
+
drop erd_location
|
15
|
+
|
1
16
|
# K Domain
|
2
17
|
|
3
18
|
> K Domain builds complex domain schemas by combining the database schema with a rich entity relationship DSLs
|
@@ -11,24 +11,34 @@ module KDomain
|
|
11
11
|
attr_reader :db_schema
|
12
12
|
attr_reader :target_step_file
|
13
13
|
attr_reader :target_file
|
14
|
-
attr_reader :
|
14
|
+
attr_reader :model_path
|
15
|
+
attr_reader :controller_path
|
16
|
+
attr_reader :route_path
|
17
|
+
attr_reader :shim_loader
|
15
18
|
|
16
|
-
|
19
|
+
# rubocop:disable Metrics/ParameterLists
|
20
|
+
def initialize(db_schema: , target_file: , target_step_file: , model_path:, route_path:, controller_path:, shim_loader: nil)
|
17
21
|
@db_schema = db_schema
|
18
22
|
@target_step_file = target_step_file
|
19
23
|
@target_file = target_file
|
20
|
-
@
|
24
|
+
@model_path = model_path
|
25
|
+
@controller_path = controller_path
|
26
|
+
@route_path = route_path
|
27
|
+
@shim_loader = shim_loader
|
21
28
|
end
|
29
|
+
# rubocop:enable Metrics/ParameterLists
|
22
30
|
|
23
31
|
# rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
24
32
|
def call
|
25
33
|
valid = true
|
26
|
-
valid &&=
|
27
|
-
valid &&=
|
28
|
-
valid &&=
|
29
|
-
valid &&=
|
30
|
-
valid &&=
|
31
|
-
valid &&=
|
34
|
+
valid &&= Step1DbSchema.run(domain_data, db_schema: db_schema, step_file: step_file('01-db-schema'))
|
35
|
+
valid &&= Step2DomainModels.run(domain_data, model_path: model_path, step_file: step_file('02-domain-model'))
|
36
|
+
valid &&= Step4RailsResourceModels.run(domain_data, model_path: model_path, step_file: step_file('04-rails-resource-models'))
|
37
|
+
valid &&= Step5RailsResourceRoutes.run(domain_data, route_path: route_path, controller_path: controller_path, step_file: step_file('05-rails-resource-routes'))
|
38
|
+
valid &&= Step6RailsStructureModels.run(domain_data, model_path: model_path, step_file: step_file('06-rails-structure-models'), shim_loader: shim_loader)
|
39
|
+
valid &&= Step7RailsStructureControllers.run(domain_data, controller_path: controller_path, step_file: step_file('07-rails-structure-controllers'), shim_loader: shim_loader)
|
40
|
+
valid &&= Step8DomainColumns.run(domain_data, step_file: step_file('08-domain-columns'))
|
41
|
+
valid &&= Step20Dictionary.run(domain_data, step_file: step_file('20-dictionary'))
|
32
42
|
|
33
43
|
raise 'DomainModal transform failed' unless valid
|
34
44
|
|
@@ -39,7 +49,7 @@ module KDomain
|
|
39
49
|
# rubocop:enable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
40
50
|
|
41
51
|
def step_file(step_name)
|
42
|
-
target_step_file
|
52
|
+
format(target_step_file, step: step_name)
|
43
53
|
end
|
44
54
|
|
45
55
|
def write
|
@@ -52,11 +62,11 @@ module KDomain
|
|
52
62
|
# The initial domain model structure is created here, but populated during the workflows.
|
53
63
|
@domain_data ||= {
|
54
64
|
domain: {
|
55
|
-
models: []
|
65
|
+
models: []
|
56
66
|
},
|
57
67
|
rails_resource: {
|
58
68
|
models: [],
|
59
|
-
|
69
|
+
routes: []
|
60
70
|
},
|
61
71
|
rails_structure: {
|
62
72
|
models: [],
|
@@ -69,6 +79,7 @@ module KDomain
|
|
69
79
|
tables: [],
|
70
80
|
indexes: [],
|
71
81
|
foreign_keys: [],
|
82
|
+
views: [],
|
72
83
|
meta: {}
|
73
84
|
},
|
74
85
|
investigate: {
|
@@ -76,7 +87,6 @@ module KDomain
|
|
76
87
|
}
|
77
88
|
}
|
78
89
|
end
|
79
|
-
|
80
90
|
# rubocop:enable Metrics/MethodLength
|
81
91
|
end
|
82
92
|
end
|
@@ -2,9 +2,11 @@
|
|
2
2
|
|
3
3
|
# The require order is important due to dependencies
|
4
4
|
require_relative './step'
|
5
|
-
require_relative './
|
6
|
-
require_relative './
|
7
|
-
require_relative './step3_attach_columns'
|
5
|
+
require_relative './step1_db_schema'
|
6
|
+
require_relative './step2_domain_models'
|
8
7
|
require_relative './step4_rails_resource_models'
|
9
|
-
require_relative './
|
10
|
-
require_relative './
|
8
|
+
require_relative './step5_rails_resource_routes'
|
9
|
+
require_relative './step6_rails_structure_models'
|
10
|
+
require_relative './step7_rails_structure_controllers'
|
11
|
+
require_relative './step8_domain_columns'
|
12
|
+
require_relative './step20_dictionary'
|
@@ -33,6 +33,10 @@ module KDomain
|
|
33
33
|
@valid = false
|
34
34
|
end
|
35
35
|
|
36
|
+
def warning(message)
|
37
|
+
log.warn message
|
38
|
+
end
|
39
|
+
|
36
40
|
def write(file)
|
37
41
|
FileUtils.mkdir_p(File.dirname(file))
|
38
42
|
File.write(file, JSON.pretty_generate(domain_data))
|
@@ -64,6 +68,14 @@ module KDomain
|
|
64
68
|
rails_resource[:models] = value
|
65
69
|
end
|
66
70
|
|
71
|
+
def rails_resource_routes
|
72
|
+
rails_resource[:routes]
|
73
|
+
end
|
74
|
+
|
75
|
+
def rails_resource_routes=(value)
|
76
|
+
rails_resource[:routes] = value
|
77
|
+
end
|
78
|
+
|
67
79
|
def rails_resource_controllers
|
68
80
|
rails_resource[:controllers]
|
69
81
|
end
|
@@ -79,6 +91,10 @@ module KDomain
|
|
79
91
|
rails_structure[:models]
|
80
92
|
end
|
81
93
|
|
94
|
+
def find_rails_structure_models(model_name)
|
95
|
+
rails_structure_models.find { |model| model[:model_name] == model_name }
|
96
|
+
end
|
97
|
+
|
82
98
|
def rails_structure_models=(value)
|
83
99
|
rails_structure[:models] = value
|
84
100
|
end
|
@@ -87,6 +103,10 @@ module KDomain
|
|
87
103
|
rails_structure[:controllers]
|
88
104
|
end
|
89
105
|
|
106
|
+
def rails_structure_controllers=(value)
|
107
|
+
rails_structure[:controllers] = value
|
108
|
+
end
|
109
|
+
|
90
110
|
# Database Accessor/Helpers
|
91
111
|
def database=(value)
|
92
112
|
domain_data[:database] = value
|
data/lib/k_domain/domain_model/transform_steps/{step1_attach_db_schema.rb → step1_db_schema.rb}
RENAMED
@@ -2,12 +2,13 @@
|
|
2
2
|
|
3
3
|
module KDomain
|
4
4
|
module DomainModel
|
5
|
-
class
|
5
|
+
class Step1DbSchema < KDomain::DomainModel::Step
|
6
6
|
# Map database schema to domain model
|
7
7
|
def call
|
8
8
|
raise 'Schema not supplied' if opts[:db_schema].nil?
|
9
9
|
|
10
10
|
self.database = opts[:db_schema].clone
|
11
|
+
database[:tables] = database[:tables] # .slice(156, 1)
|
11
12
|
|
12
13
|
guard('tables are missing') if database[:tables].nil?
|
13
14
|
guard('indexes are missing') if database[:indexes].nil?
|
data/lib/k_domain/domain_model/transform_steps/{step6_attach_dictionary.rb → step20_dictionary.rb}
RENAMED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
#
|
4
|
-
class
|
3
|
+
# data dictionary
|
4
|
+
class Step20Dictionary < KDomain::DomainModel::Step
|
5
5
|
attr_reader :dictionary
|
6
6
|
|
7
7
|
def call
|
@@ -27,10 +27,10 @@ class Step6AttachDictionary < KDomain::DomainModel::Step
|
|
27
27
|
entry[:model_count] = entry[:model_count] + 1
|
28
28
|
|
29
29
|
unless entry[:types].include?(column_type)
|
30
|
-
investigate(step: :
|
31
|
-
|
32
|
-
|
33
|
-
|
30
|
+
investigate(step: :step5_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
34
|
|
35
35
|
entry[:types] << column_type
|
36
36
|
entry[:type_count] = entry[:type_count] + 1
|
@@ -0,0 +1,123 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Schema is re-shaped into a format designed for domain modeling
|
4
|
+
class Step2DomainModels < KDomain::DomainModel::Step
|
5
|
+
# Map database schema to domain model
|
6
|
+
def call
|
7
|
+
raise 'Rails model path not supplied' if opts[:model_path].nil?
|
8
|
+
|
9
|
+
domain[:models] = database_tables.map { |table| model(table) }
|
10
|
+
end
|
11
|
+
|
12
|
+
def model(table)
|
13
|
+
table_name = table[:name].to_s
|
14
|
+
model_name = table_name.singularize
|
15
|
+
|
16
|
+
model = {
|
17
|
+
name: model_name,
|
18
|
+
name_plural: table_name, # need to check if this is correct as I know it is wrong for account_history_datum
|
19
|
+
table_name: table_name,
|
20
|
+
pk: primary_key(table),
|
21
|
+
file: nil
|
22
|
+
}
|
23
|
+
|
24
|
+
attach_columns(model)
|
25
|
+
end
|
26
|
+
|
27
|
+
def primary_key(table)
|
28
|
+
{
|
29
|
+
name: table[:primary_key],
|
30
|
+
type: table[:primary_key_type],
|
31
|
+
exist: !table[:primary_key].nil?
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
def attach_columns(model)
|
36
|
+
table = find_table_for_model(model)
|
37
|
+
columns = columns(table[:columns])
|
38
|
+
columns = insert_primary_key(model, columns)
|
39
|
+
model[:columns] = columns
|
40
|
+
model
|
41
|
+
end
|
42
|
+
|
43
|
+
def columns(db_columns)
|
44
|
+
db_columns.map do |db_column|
|
45
|
+
column_data(db_column[:name]).merge(
|
46
|
+
type: check_type(db_column[:type]),
|
47
|
+
precision: db_column[:precision],
|
48
|
+
scale: db_column[:scale],
|
49
|
+
default: db_column[:default],
|
50
|
+
null: db_column[:null],
|
51
|
+
limit: db_column[:limit],
|
52
|
+
array: db_column[:array]
|
53
|
+
)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def insert_primary_key(model, columns)
|
58
|
+
return columns unless model[:pk][:exist]
|
59
|
+
|
60
|
+
column = column_data('id').merge(
|
61
|
+
type: check_type(model[:pk][:type])
|
62
|
+
)
|
63
|
+
|
64
|
+
columns.unshift(column)
|
65
|
+
columns
|
66
|
+
end
|
67
|
+
|
68
|
+
def check_type(type)
|
69
|
+
type = type.to_sym if type.is_a?(String)
|
70
|
+
|
71
|
+
return type if %i[string integer bigint bigserial boolean float decimal datetime date hstore text jsonb].include?(type)
|
72
|
+
|
73
|
+
if type.nil?
|
74
|
+
guard('nil type detected for db_column[:type]')
|
75
|
+
|
76
|
+
return :string
|
77
|
+
end
|
78
|
+
|
79
|
+
guard("new type detected for db_column[:type] - #{type}")
|
80
|
+
|
81
|
+
camel.parse(type.to_s).downcase
|
82
|
+
end
|
83
|
+
|
84
|
+
def column_data(name)
|
85
|
+
{
|
86
|
+
name: name,
|
87
|
+
name_plural: name.pluralize,
|
88
|
+
type: nil,
|
89
|
+
precision: nil,
|
90
|
+
scale: nil,
|
91
|
+
default: nil,
|
92
|
+
null: nil,
|
93
|
+
limit: nil,
|
94
|
+
array: nil
|
95
|
+
}
|
96
|
+
end
|
97
|
+
|
98
|
+
# # Location of source code
|
99
|
+
# def location(table_name, model_name)
|
100
|
+
# file_normal = File.join(opts[:model_path], "#{model_name}.rb")
|
101
|
+
# file_custom = File.join(opts[:model_path], "#{table_name}.rb")
|
102
|
+
# file_exist = true
|
103
|
+
# state = []
|
104
|
+
|
105
|
+
# if File.exist?(file_normal)
|
106
|
+
# file = file_normal
|
107
|
+
# state.push(:has_ruby_model)
|
108
|
+
# elsif File.exist?(file_custom)
|
109
|
+
# file = file_custom
|
110
|
+
# state.push(:has_ruby_model)
|
111
|
+
# state.push(:nonconventional_name)
|
112
|
+
# else
|
113
|
+
# file = ''
|
114
|
+
# file_exist = false
|
115
|
+
# end
|
116
|
+
|
117
|
+
# {
|
118
|
+
# file: file,
|
119
|
+
# exist: file_exist,
|
120
|
+
# state: state
|
121
|
+
# }
|
122
|
+
# end
|
123
|
+
end
|
@@ -5,7 +5,7 @@ class Step4RailsResourceModels < KDomain::DomainModel::Step
|
|
5
5
|
attr_accessor :ruby_code
|
6
6
|
|
7
7
|
def call
|
8
|
-
raise '
|
8
|
+
raise 'Model path not supplied' if opts[:model_path].nil?
|
9
9
|
|
10
10
|
self.rails_resource_models = domain_models.map do |model|
|
11
11
|
locate_rails_model(model[:name], model[:table_name])
|
@@ -15,8 +15,8 @@ class Step4RailsResourceModels < KDomain::DomainModel::Step
|
|
15
15
|
private
|
16
16
|
|
17
17
|
def locate_rails_model(model_name, table_name)
|
18
|
-
file_normal = File.join(opts[:
|
19
|
-
file_custom = File.join(opts[:
|
18
|
+
file_normal = File.join(opts[:model_path], "#{model_name}.rb")
|
19
|
+
file_custom = File.join(opts[:model_path], "#{table_name}.rb")
|
20
20
|
file_exist = true
|
21
21
|
state = []
|
22
22
|
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Locate rails model files
|
4
|
+
class Step5RailsResourceRoutes < KDomain::DomainModel::Step
|
5
|
+
def call
|
6
|
+
return warning('Routes .json file not supplied') if opts[:route_path].nil?
|
7
|
+
return warning('Routes .json file not found') unless File.exist?(opts[:route_path])
|
8
|
+
|
9
|
+
warning('Controller path not supplied. Routes will be loaded but not paired with a controller') if opts[:controller_path].nil?
|
10
|
+
|
11
|
+
self.rails_resource_routes = load_routes(opts[:route_path], opts[:controller_path])
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def load_routes(route_path, controller_path)
|
17
|
+
json = File.read(route_path)
|
18
|
+
root = JSON.parse(json, symbolize_names: true)
|
19
|
+
routes = root[:routes]
|
20
|
+
|
21
|
+
routes.map { |route| map_route(route, controller_path) }
|
22
|
+
end
|
23
|
+
|
24
|
+
def map_route(route, controller_path)
|
25
|
+
return route.merge({ file: '', exist: false }) if controller_path.nil?
|
26
|
+
|
27
|
+
controller_file = File.join(controller_path, route[:controller_file])
|
28
|
+
|
29
|
+
route.merge(
|
30
|
+
{
|
31
|
+
file: controller_file,
|
32
|
+
exist: File.exist?(controller_file)
|
33
|
+
}
|
34
|
+
)
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Locate rails model files
|
4
|
+
class Step6RailsStructureModels < KDomain::DomainModel::Step
|
5
|
+
def call
|
6
|
+
raise 'Rails model path not supplied' unless opts[:model_path]
|
7
|
+
|
8
|
+
# THIS IS NOT WORKING YET
|
9
|
+
self.rails_structure_models = rails_resource_models.map do |resource|
|
10
|
+
process_resource(OpenStruct.new(resource))
|
11
|
+
end
|
12
|
+
|
13
|
+
attach_behavior_and_functions
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def process_resource(resource)
|
19
|
+
{
|
20
|
+
model_name: resource.model_name,
|
21
|
+
table_name: resource.table_name,
|
22
|
+
file: resource.file,
|
23
|
+
exist: resource.exist,
|
24
|
+
state: resource.state,
|
25
|
+
code: resource.exist ? File.read(resource.file) : '',
|
26
|
+
behaviours: {},
|
27
|
+
functions: {}
|
28
|
+
}
|
29
|
+
|
30
|
+
# return @model unless resource.exist
|
31
|
+
|
32
|
+
# @model[:behaviours] = extract_behavior(resource.file)
|
33
|
+
# @model[:functions] = extract_functions(resource.file)
|
34
|
+
|
35
|
+
# @model
|
36
|
+
end
|
37
|
+
|
38
|
+
def attach_behavior_and_functions
|
39
|
+
rails_structure_models.select { |model| model[:exist] }.each do |model|
|
40
|
+
model[:behaviours] = extract_behavior(model[:file])
|
41
|
+
klass_name = model[:behaviours][:class_name]
|
42
|
+
model[:functions] = extract_functions(klass_name)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def extract_behavior(file)
|
47
|
+
extractor.extract(file)
|
48
|
+
extractor.model
|
49
|
+
end
|
50
|
+
|
51
|
+
def extract_functions(klass_name)
|
52
|
+
klass = klass_type(klass_name)
|
53
|
+
|
54
|
+
return {} if klass.nil?
|
55
|
+
|
56
|
+
Peeky.api.build_class_info(klass.new).to_h
|
57
|
+
rescue StandardError => e
|
58
|
+
log.exception(e)
|
59
|
+
end
|
60
|
+
|
61
|
+
def klass_type(klass_name)
|
62
|
+
Module.const_get(klass_name.classify)
|
63
|
+
rescue NameError
|
64
|
+
puts ''
|
65
|
+
puts klass_name
|
66
|
+
puts klass_name.classify
|
67
|
+
puts klass_name.pluralize
|
68
|
+
puts 'Trying the pluralized version: '
|
69
|
+
Module.const_get(klass_name.pluralize)
|
70
|
+
end
|
71
|
+
|
72
|
+
def extractor
|
73
|
+
@extractor ||= KDomain::RailsCodeExtractor::ExtractModel.new(shim_loader)
|
74
|
+
end
|
75
|
+
|
76
|
+
def shim_loader
|
77
|
+
return opts[:shim_loader] if !opts[:shim_loader].nil? && opts[:shim_loader].is_a?(KDomain::RailsCodeExtractor::ShimLoader)
|
78
|
+
|
79
|
+
shim_loader = KDomain::RailsCodeExtractor::ShimLoader.new
|
80
|
+
# Shims to attach generic class_info writers
|
81
|
+
shim_loader.register(:attach_class_info , KDomain::Gem.resource('templates/ruby_code_extractor/attach_class_info.rb'))
|
82
|
+
shim_loader.register(:behaviour_accessors , KDomain::Gem.resource('templates/ruby_code_extractor/behaviour_accessors.rb'))
|
83
|
+
|
84
|
+
# Shims to support standard active_record DSL methods
|
85
|
+
shim_loader.register(:active_record , KDomain::Gem.resource('templates/rails/active_record.rb'))
|
86
|
+
|
87
|
+
# Shims to support application specific [module, class, method] implementations for suppression and exception avoidance
|
88
|
+
shim_loader
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Locate rails controller files
|
4
|
+
class Step7RailsStructureControllers < KDomain::DomainModel::Step
|
5
|
+
attr_accessor :controllers
|
6
|
+
|
7
|
+
def call
|
8
|
+
raise 'Rails controller path not supplied' unless opts[:controller_path]
|
9
|
+
|
10
|
+
@controllers = {}
|
11
|
+
|
12
|
+
rails_resource_routes.map do |route|
|
13
|
+
process_route(OpenStruct.new(route))
|
14
|
+
end
|
15
|
+
|
16
|
+
self.rails_structure_controllers = controllers.keys.map { |key| controllers[key] }
|
17
|
+
|
18
|
+
attach_behavior_and_functions
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def process_route(route)
|
24
|
+
if new_controller?(route)
|
25
|
+
new_controller(route)
|
26
|
+
else
|
27
|
+
controller = @controllers[route[:controller_file]]
|
28
|
+
controller[:actions] << new_action(route)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def new_controller?(route)
|
33
|
+
!controllers.key?(route[:controller_file])
|
34
|
+
end
|
35
|
+
|
36
|
+
def new_controller(route)
|
37
|
+
controllers[route[:controller_file]] = {
|
38
|
+
name: route[:controller_name],
|
39
|
+
path: route[:controller_path],
|
40
|
+
namespace: route[:controller_namespace],
|
41
|
+
file: route[:controller_file],
|
42
|
+
exist: route[:controller_exist],
|
43
|
+
full_file: route[:file],
|
44
|
+
behaviours: {},
|
45
|
+
functions: {},
|
46
|
+
actions: [new_action(route)]
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
def new_action(route)
|
51
|
+
{
|
52
|
+
route_name: route[:name],
|
53
|
+
action: route[:action],
|
54
|
+
uri_path: route[:uri_path],
|
55
|
+
mime_match: route[:mime_match],
|
56
|
+
verbs: route[:verbs]
|
57
|
+
}
|
58
|
+
end
|
59
|
+
|
60
|
+
def attach_behavior_and_functions
|
61
|
+
rails_structure_controllers.select { |controller| controller[:exist] }.each do |controller|
|
62
|
+
unless File.exist?(controller[:full_file])
|
63
|
+
log.error 'Controller apparently exists but no file found, this means that you need re-run rake routes'
|
64
|
+
puts controller[:full_file]
|
65
|
+
next
|
66
|
+
end
|
67
|
+
controller[:behaviours] = extract_behavior(controller[:full_file])
|
68
|
+
klass_name = controller[:behaviours][:class_name]
|
69
|
+
controller[:functions] = extract_functions(klass_name)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def extract_behavior(file)
|
74
|
+
# puts file
|
75
|
+
extractor.extract(file)
|
76
|
+
extractor.controller
|
77
|
+
end
|
78
|
+
|
79
|
+
def extractor
|
80
|
+
@extractor ||= KDomain::RailsCodeExtractor::ExtractController.new(shim_loader)
|
81
|
+
end
|
82
|
+
|
83
|
+
def shim_loader
|
84
|
+
return opts[:shim_loader] if !opts[:shim_loader].nil? && opts[:shim_loader].is_a?(KDomain::RailsCodeExtractor::ShimLoader)
|
85
|
+
|
86
|
+
shim_loader = KDomain::RailsCodeExtractor::ShimLoader.new
|
87
|
+
# Shims to attach generic class_info writers
|
88
|
+
shim_loader.register(:attach_class_info , KDomain::Gem.resource('templates/ruby_code_extractor/attach_class_info.rb'))
|
89
|
+
shim_loader.register(:behaviour_accessors , KDomain::Gem.resource('templates/ruby_code_extractor/behaviour_accessors.rb'))
|
90
|
+
|
91
|
+
# Shims to support stand rails controller DSL methods
|
92
|
+
shim_loader.register(:action_controller , KDomain::Gem.resource('templates/rails/action_controller.rb'))
|
93
|
+
|
94
|
+
# Shims to support application specific [module, class, method] implementations for suppression and exception avoidance
|
95
|
+
# shim_loader.register(:app_action_controller , KDomain::Gem.resource('templates/advanced/action_controller.rb'))
|
96
|
+
# shim_loader.register(:app_controller_interceptors , KDomain::Gem.resource('templates/advanced/controller_interceptors.rb'))
|
97
|
+
shim_loader
|
98
|
+
end
|
99
|
+
|
100
|
+
def extract_functions(klass_name)
|
101
|
+
klass = Module.const_get(klass_name.classify)
|
102
|
+
|
103
|
+
class_info = Peeky.api.build_class_info(klass.new)
|
104
|
+
|
105
|
+
class_info.to_h
|
106
|
+
rescue StandardError => e
|
107
|
+
log.exception(e)
|
108
|
+
end
|
109
|
+
end
|