activerecord-dbt 0.2.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +213 -72
- data/lib/active_record/dbt/column/{test.rb → data_test.rb} +16 -16
- data/lib/active_record/dbt/column/{testable/accepted_values_testable.rb → data_testable/accepted_values_data_testable.rb} +2 -2
- data/lib/active_record/dbt/column/{testable/not_null_testable.rb → data_testable/not_null_data_testable.rb} +9 -3
- data/lib/active_record/dbt/column/{testable/relationships_testable.rb → data_testable/relationships_data_testable.rb} +3 -3
- data/lib/active_record/dbt/column/{testable/unique_testable.rb → data_testable/unique_data_testable.rb} +2 -2
- data/lib/active_record/dbt/column/{column.rb → yml.rb} +9 -20
- data/lib/active_record/dbt/config.rb +2 -30
- data/lib/active_record/dbt/configuration/i18n_configuration.rb +14 -0
- data/lib/active_record/dbt/configuration/source.rb +40 -0
- data/lib/active_record/dbt/data_type/mapper.rb +81 -14
- data/lib/active_record/dbt/dbt_package/dbt_utils/table/{testable/unique_combination_of_columns_testable.rb → data_testable/unique_combination_of_columns_data_testable.rb} +2 -2
- data/lib/active_record/dbt/dbt_package/dbterd/column/{testable → data_testable}/relationships_meta_relationship_type.rb +4 -5
- data/lib/active_record/dbt/factory/columns/yml_factory.rb +33 -0
- data/lib/active_record/dbt/factory/model/staging/yml_factory.rb +24 -0
- data/lib/active_record/dbt/factory/source/yml_factory.rb +17 -0
- data/lib/active_record/dbt/factory/table/yml_factory.rb +18 -0
- data/lib/active_record/dbt/factory/tables/yml_factory.rb +17 -0
- data/lib/active_record/dbt/i18n_wrapper/translate.rb +34 -0
- data/lib/active_record/dbt/model/staging/base.rb +1 -1
- data/lib/active_record/dbt/model/staging/yml.rb +10 -6
- data/lib/active_record/dbt/seed/enum/base.rb +48 -0
- data/lib/active_record/dbt/seed/enum/csv.rb +85 -0
- data/lib/active_record/dbt/seed/enum/yml.rb +128 -0
- data/lib/active_record/dbt/source/yml.rb +13 -5
- data/lib/active_record/dbt/table/{test.rb → data_test.rb} +3 -3
- data/lib/active_record/dbt/table/yml.rb +7 -10
- data/lib/active_record/dbt/version.rb +1 -1
- data/lib/generators/active_record/dbt/config/templates/source_config.yml.tt +5 -2
- data/lib/generators/active_record/dbt/enum/USAGE +9 -0
- data/lib/generators/active_record/dbt/enum/enum_generator.rb +31 -0
- data/lib/generators/active_record/dbt/initializer/templates/dbt.rb +9 -7
- data/lib/generators/active_record/dbt/source/USAGE +1 -1
- data/lib/generators/active_record/dbt/source/source_generator.rb +3 -4
- data/lib/generators/active_record/dbt/staging_model/USAGE +2 -2
- data/lib/generators/active_record/dbt/staging_model/staging_model_generator.rb +2 -2
- metadata +24 -21
- data/lib/active_record/dbt/data_type/dwh_platform/apache_spark.rb +0 -27
- data/lib/active_record/dbt/data_type/dwh_platform/bigquery.rb +0 -26
- data/lib/active_record/dbt/data_type/dwh_platform/postgre_sql.rb +0 -27
- data/lib/active_record/dbt/data_type/dwh_platform/redshift.rb +0 -27
- data/lib/active_record/dbt/data_type/dwh_platform/snowflake.rb +0 -27
- data/lib/active_record/dbt/factory/columns_factory.rb +0 -31
- data/lib/active_record/dbt/factory/model/staging_factory.rb +0 -22
- data/lib/active_record/dbt/factory/source_factory.rb +0 -16
- data/lib/active_record/dbt/factory/table_factory.rb +0 -16
- data/lib/active_record/dbt/factory/tables_factory.rb +0 -15
@@ -3,11 +3,11 @@
|
|
3
3
|
module ActiveRecord
|
4
4
|
module Dbt
|
5
5
|
module Column
|
6
|
-
class
|
7
|
-
include ActiveRecord::Dbt::Column::
|
8
|
-
include ActiveRecord::Dbt::Column::
|
9
|
-
include ActiveRecord::Dbt::Column::
|
10
|
-
include ActiveRecord::Dbt::Column::
|
6
|
+
class DataTest
|
7
|
+
include ActiveRecord::Dbt::Column::DataTestable::AcceptedValuesDataTestable
|
8
|
+
include ActiveRecord::Dbt::Column::DataTestable::NotNullDataTestable
|
9
|
+
include ActiveRecord::Dbt::Column::DataTestable::RelationshipsDataTestable
|
10
|
+
include ActiveRecord::Dbt::Column::DataTestable::UniqueDataTestable
|
11
11
|
|
12
12
|
attr_reader :table_name, :column, :primary_keys, :foreign_keys
|
13
13
|
|
@@ -22,15 +22,15 @@ module ActiveRecord
|
|
22
22
|
@config = ActiveRecord::Dbt::Config.instance
|
23
23
|
end
|
24
24
|
|
25
|
-
def
|
26
|
-
(
|
27
|
-
|
25
|
+
def properties
|
26
|
+
(data_tests.keys | data_tests_overrides_hash.keys).map do |key|
|
27
|
+
data_tests_overrides_hash[key] || data_tests[key]
|
28
28
|
end.presence
|
29
29
|
end
|
30
30
|
|
31
31
|
private
|
32
32
|
|
33
|
-
def
|
33
|
+
def data_tests
|
34
34
|
{
|
35
35
|
'unique_test' => unique_test,
|
36
36
|
'not_null_test' => not_null_test,
|
@@ -39,10 +39,10 @@ module ActiveRecord
|
|
39
39
|
}.compact
|
40
40
|
end
|
41
41
|
|
42
|
-
def
|
43
|
-
@
|
44
|
-
|
45
|
-
"#{extract_key(
|
42
|
+
def data_tests_overrides_hash
|
43
|
+
@data_tests_overrides_hash ||=
|
44
|
+
data_tests_overrides.index_by do |data_tests_override|
|
45
|
+
"#{extract_key(data_tests_override)}_test"
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
@@ -50,9 +50,9 @@ module ActiveRecord
|
|
50
50
|
item.is_a?(Hash) ? item.keys.first : item
|
51
51
|
end
|
52
52
|
|
53
|
-
def
|
54
|
-
@
|
55
|
-
source_config.dig(:table_overrides, table_name, :columns, column_name, :
|
53
|
+
def data_tests_overrides
|
54
|
+
@data_tests_overrides ||=
|
55
|
+
source_config.dig(:table_overrides, table_name, :columns, column_name, :data_tests) ||
|
56
56
|
[]
|
57
57
|
end
|
58
58
|
end
|
@@ -3,8 +3,8 @@
|
|
3
3
|
module ActiveRecord
|
4
4
|
module Dbt
|
5
5
|
module Column
|
6
|
-
module
|
7
|
-
module
|
6
|
+
module DataTestable
|
7
|
+
module AcceptedValuesDataTestable
|
8
8
|
extend ActiveRecord::Dbt::RequiredMethods
|
9
9
|
|
10
10
|
define_required_methods :@config, :column, :table_name, :column_name
|
@@ -3,14 +3,20 @@
|
|
3
3
|
module ActiveRecord
|
4
4
|
module Dbt
|
5
5
|
module Column
|
6
|
-
module
|
7
|
-
module
|
6
|
+
module DataTestable
|
7
|
+
module NotNullDataTestable
|
8
8
|
extend ActiveRecord::Dbt::RequiredMethods
|
9
9
|
|
10
10
|
define_required_methods :column
|
11
11
|
|
12
12
|
def not_null_test
|
13
|
-
|
13
|
+
null? ? nil : 'not_null'
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def null?
|
19
|
+
column.null == true
|
14
20
|
end
|
15
21
|
end
|
16
22
|
end
|
@@ -3,9 +3,9 @@
|
|
3
3
|
module ActiveRecord
|
4
4
|
module Dbt
|
5
5
|
module Column
|
6
|
-
module
|
7
|
-
module
|
8
|
-
include ActiveRecord::Dbt::DbtPackage::Dbterd::Column::
|
6
|
+
module DataTestable
|
7
|
+
module RelationshipsDataTestable
|
8
|
+
include ActiveRecord::Dbt::DbtPackage::Dbterd::Column::DataTestable::RelationshipsMetaRelationshipType
|
9
9
|
|
10
10
|
extend ActiveRecord::Dbt::RequiredMethods
|
11
11
|
|
@@ -3,29 +3,30 @@
|
|
3
3
|
module ActiveRecord
|
4
4
|
module Dbt
|
5
5
|
module Column
|
6
|
-
class
|
6
|
+
class Yml
|
7
7
|
include ActiveRecord::Dbt::DataType::Mapper
|
8
|
+
include ActiveRecord::Dbt::I18nWrapper::Translate
|
8
9
|
|
9
|
-
attr_reader :table_name, :column, :
|
10
|
+
attr_reader :table_name, :column, :column_data_test, :primary_keys
|
10
11
|
|
11
12
|
delegate :name, :comment, to: :column, prefix: true
|
12
13
|
delegate :source_config, to: :@config
|
13
14
|
|
14
|
-
def initialize(table_name, column,
|
15
|
+
def initialize(table_name, column, column_data_test, primary_keys: [])
|
15
16
|
@table_name = table_name
|
16
17
|
@column = column
|
17
|
-
@
|
18
|
+
@column_data_test = column_data_test
|
18
19
|
@primary_keys = primary_keys
|
19
20
|
@config = ActiveRecord::Dbt::Config.instance
|
20
21
|
end
|
21
22
|
|
22
|
-
def
|
23
|
+
def properties
|
23
24
|
{
|
24
25
|
'name' => column_name,
|
25
26
|
'description' => description,
|
26
|
-
'data_type' => data_type,
|
27
|
-
**column_overrides.except(:
|
28
|
-
'
|
27
|
+
'data_type' => data_type(column.type),
|
28
|
+
**column_overrides.except(:data_tests),
|
29
|
+
'data_tests' => column_data_test.properties
|
29
30
|
}.compact
|
30
31
|
end
|
31
32
|
|
@@ -45,18 +46,6 @@ module ActiveRecord
|
|
45
46
|
source_config.dig(:table_descriptions, table_name, :columns, column_name)
|
46
47
|
end
|
47
48
|
|
48
|
-
def translated_attribute_name
|
49
|
-
translated_column_name || translated_default_column_name
|
50
|
-
end
|
51
|
-
|
52
|
-
def translated_column_name
|
53
|
-
I18n.t("activerecord.attributes.#{table_name.singularize}.#{column_name}", default: nil)
|
54
|
-
end
|
55
|
-
|
56
|
-
def translated_default_column_name
|
57
|
-
I18n.t("attributes.#{column_name}", default: nil)
|
58
|
-
end
|
59
|
-
|
60
49
|
def key_column_name
|
61
50
|
column_name if primary_key? || foreign_key?
|
62
51
|
end
|
@@ -9,38 +9,10 @@ module ActiveRecord
|
|
9
9
|
|
10
10
|
include ActiveRecord::Dbt::Configuration::DataSync
|
11
11
|
include ActiveRecord::Dbt::Configuration::DwhPlatform
|
12
|
+
include ActiveRecord::Dbt::Configuration::I18nConfiguration
|
12
13
|
include ActiveRecord::Dbt::Configuration::Logger
|
13
|
-
include ActiveRecord::Dbt::Configuration::
|
14
|
+
include ActiveRecord::Dbt::Configuration::Source
|
14
15
|
include ActiveRecord::Dbt::Configuration::UsedDbtPackage
|
15
|
-
|
16
|
-
DEFAULT_CONFIG_DIRECTORY_PATH = 'lib/dbt'
|
17
|
-
DEFAULT_EXPORT_DIRECTORY_PATH = 'doc/dbt'
|
18
|
-
|
19
|
-
attr_writer :config_directory_path, :export_directory_path
|
20
|
-
|
21
|
-
def source_config_path
|
22
|
-
@source_config_path ||= "#{config_directory_path}/source_config.yml"
|
23
|
-
end
|
24
|
-
|
25
|
-
def source_config
|
26
|
-
@source_config ||= parse_yaml(source_config_path)
|
27
|
-
end
|
28
|
-
|
29
|
-
def source_name
|
30
|
-
@source_name ||= source_config.dig(:sources, :name).tap do |source_name|
|
31
|
-
raise SourceNameIsNullError, "'sources.name' is required in '#{source_config_path}'." if source_name.nil?
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def config_directory_path
|
36
|
-
@config_directory_path ||= DEFAULT_CONFIG_DIRECTORY_PATH
|
37
|
-
end
|
38
|
-
|
39
|
-
def export_directory_path
|
40
|
-
@export_directory_path ||= DEFAULT_EXPORT_DIRECTORY_PATH
|
41
|
-
end
|
42
|
-
|
43
|
-
class SourceNameIsNullError < StandardError; end
|
44
16
|
end
|
45
17
|
end
|
46
18
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
module Dbt
|
5
|
+
module Configuration
|
6
|
+
module I18nConfiguration
|
7
|
+
def locale=(locale = I18n.locale)
|
8
|
+
I18n.load_path += Rails.root.glob('config/locales/**/*.{rb,yml}')
|
9
|
+
I18n.locale = locale
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
module Dbt
|
5
|
+
module Configuration
|
6
|
+
module Source
|
7
|
+
include ActiveRecord::Dbt::Configuration::Parser
|
8
|
+
|
9
|
+
DEFAULT_CONFIG_DIRECTORY_PATH = 'lib/dbt'
|
10
|
+
DEFAULT_EXPORT_DIRECTORY_PATH = 'doc/dbt'
|
11
|
+
|
12
|
+
attr_writer :config_directory_path, :export_directory_path
|
13
|
+
|
14
|
+
def config_directory_path
|
15
|
+
@config_directory_path ||= DEFAULT_CONFIG_DIRECTORY_PATH
|
16
|
+
end
|
17
|
+
|
18
|
+
def export_directory_path
|
19
|
+
@export_directory_path ||= DEFAULT_EXPORT_DIRECTORY_PATH
|
20
|
+
end
|
21
|
+
|
22
|
+
def source_config_path
|
23
|
+
@source_config_path ||= "#{config_directory_path}/source_config.yml"
|
24
|
+
end
|
25
|
+
|
26
|
+
def source_config
|
27
|
+
@source_config ||= parse_yaml(source_config_path)
|
28
|
+
end
|
29
|
+
|
30
|
+
def source_name
|
31
|
+
@source_name ||= source_config.dig(:sources, :name).tap do |source_name|
|
32
|
+
raise SourceNameIsNullError, "'sources.name' is required in '#{source_config_path}'." if source_name.nil?
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class SourceNameIsNullError < StandardError; end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -4,31 +4,98 @@ module ActiveRecord
|
|
4
4
|
module Dbt
|
5
5
|
module DataType
|
6
6
|
module Mapper
|
7
|
-
include ActiveRecord::Dbt::DataType::DwhPlatform::ApacheSpark
|
8
|
-
include ActiveRecord::Dbt::DataType::DwhPlatform::Bigquery
|
9
|
-
include ActiveRecord::Dbt::DataType::DwhPlatform::PostgreSql
|
10
|
-
include ActiveRecord::Dbt::DataType::DwhPlatform::Redshift
|
11
|
-
include ActiveRecord::Dbt::DataType::DwhPlatform::Snowflake
|
12
|
-
|
13
7
|
extend ActiveRecord::Dbt::RequiredMethods
|
14
8
|
|
15
9
|
# [Platform-specific data types | dbt Developer Hub](https://docs.getdbt.com/reference/resource-properties/data-types)
|
16
10
|
RUBY_TO_DWH_PLATFORM_TYPE_MAP = {
|
17
|
-
|
18
|
-
'
|
19
|
-
|
20
|
-
|
21
|
-
|
11
|
+
# [Data types | BigQuery | Google Cloud](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#data_type_list)
|
12
|
+
'bigquery' => {
|
13
|
+
binary: 'bytes',
|
14
|
+
boolean: 'bool',
|
15
|
+
date: 'date',
|
16
|
+
datetime: 'datetime',
|
17
|
+
decimal: 'int64',
|
18
|
+
float: 'float64',
|
19
|
+
integer: 'int64',
|
20
|
+
json: 'json',
|
21
|
+
string: 'string',
|
22
|
+
text: 'string',
|
23
|
+
time: 'time'
|
24
|
+
},
|
25
|
+
|
26
|
+
# TODO: I have not tried it. I don't know if this is the correct data_type.
|
27
|
+
# [PostgreSQL: Documentation: 16: Chapter 8. Data Types](https://www.postgresql.org/docs/current/datatype.html)
|
28
|
+
'postgres' => {
|
29
|
+
binary: 'bytea',
|
30
|
+
boolean: 'boolean',
|
31
|
+
date: 'date',
|
32
|
+
datetime: 'timestamp',
|
33
|
+
decimal: 'bigint',
|
34
|
+
float: 'double precision',
|
35
|
+
integer: 'bigint',
|
36
|
+
json: 'json',
|
37
|
+
string: 'text',
|
38
|
+
text: 'text',
|
39
|
+
time: 'time'
|
40
|
+
},
|
41
|
+
|
42
|
+
# TODO: I have not tried it. I don't know if this is the correct data_type.
|
43
|
+
# [Data types - Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/c_Supported_data_types.html)
|
44
|
+
'redshift' => {
|
45
|
+
binary: 'varbyte',
|
46
|
+
boolean: 'bool',
|
47
|
+
date: 'date',
|
48
|
+
datetime: 'timestamp',
|
49
|
+
decimal: 'decimal',
|
50
|
+
float: 'double precision',
|
51
|
+
integer: 'integer',
|
52
|
+
json: 'super',
|
53
|
+
string: 'varchar',
|
54
|
+
text: 'varchar',
|
55
|
+
time: 'time'
|
56
|
+
},
|
57
|
+
|
58
|
+
# TODO: I have not tried it. I don't know if this is the correct data_type.
|
59
|
+
# [Summary of data types | Snowflake Documentation](https://docs.snowflake.com/en/sql-reference/intro-summary-data-types)
|
60
|
+
'snowflake' => {
|
61
|
+
binary: 'binary',
|
62
|
+
boolean: 'boolean',
|
63
|
+
date: 'date',
|
64
|
+
datetime: 'datetime',
|
65
|
+
decimal: 'decimal',
|
66
|
+
float: 'float',
|
67
|
+
integer: 'integer',
|
68
|
+
json: 'variant',
|
69
|
+
string: 'varchar',
|
70
|
+
text: 'varchar',
|
71
|
+
time: 'time'
|
72
|
+
},
|
73
|
+
|
74
|
+
# TODO: I have not tried it. I don't know if this is the correct data_type.
|
75
|
+
# [Data Types - Spark 3.5.1 Documentation](https://spark.apache.org/docs/latest/sql-ref-datatypes.html)
|
76
|
+
'spark' => {
|
77
|
+
binary: 'binary',
|
78
|
+
boolean: 'boolean',
|
79
|
+
date: 'date',
|
80
|
+
datetime: 'timestamp',
|
81
|
+
decimal: 'decimal',
|
82
|
+
float: 'float',
|
83
|
+
integer: 'integer',
|
84
|
+
json: 'string',
|
85
|
+
string: 'string',
|
86
|
+
text: 'string',
|
87
|
+
time: 'string'
|
88
|
+
}
|
22
89
|
}.freeze
|
23
90
|
|
24
|
-
define_required_methods
|
91
|
+
define_required_methods :@config
|
25
92
|
|
26
93
|
delegate :dwh_platform, to: :@config
|
27
94
|
|
28
95
|
private
|
29
96
|
|
30
|
-
def data_type
|
31
|
-
RUBY_TO_DWH_PLATFORM_TYPE_MAP[dwh_platform].fetch(
|
97
|
+
def data_type(type)
|
98
|
+
RUBY_TO_DWH_PLATFORM_TYPE_MAP[dwh_platform].fetch(type, 'unknown')
|
32
99
|
end
|
33
100
|
end
|
34
101
|
end
|
@@ -5,8 +5,8 @@ module ActiveRecord
|
|
5
5
|
module DbtPackage
|
6
6
|
module DbtUtils
|
7
7
|
module Table
|
8
|
-
module
|
9
|
-
module
|
8
|
+
module DataTestable
|
9
|
+
module UniqueCombinationOfColumnsDataTestable
|
10
10
|
extend ActiveRecord::Dbt::RequiredMethods
|
11
11
|
|
12
12
|
define_required_methods :table_name, :@config
|
@@ -5,7 +5,7 @@ module ActiveRecord
|
|
5
5
|
module DbtPackage
|
6
6
|
module Dbterd
|
7
7
|
module Column
|
8
|
-
module
|
8
|
+
module DataTestable
|
9
9
|
module RelationshipsMetaRelationshipType
|
10
10
|
extend ActiveRecord::Dbt::RequiredMethods
|
11
11
|
|
@@ -14,13 +14,12 @@ module ActiveRecord
|
|
14
14
|
delegate :used_dbterd?, :add_log, to: :@config
|
15
15
|
|
16
16
|
def relationships_meta_relationship_type
|
17
|
-
return nil
|
18
|
-
return nil if no_relationship?
|
17
|
+
return nil if !used_dbterd? || no_relationship?
|
19
18
|
|
20
19
|
{
|
21
20
|
'relationship_type' => relationship_type
|
22
21
|
}
|
23
|
-
rescue NotSpecifiedOrNotInvalidIdError,
|
22
|
+
rescue NotSpecifiedOrNotInvalidIdError, NameError => e
|
24
23
|
relationships_meta_relationship_type_with_active_record_dbt_error(e)
|
25
24
|
end
|
26
25
|
|
@@ -90,7 +89,7 @@ module ActiveRecord
|
|
90
89
|
end
|
91
90
|
|
92
91
|
def association_klass(association)
|
93
|
-
association.
|
92
|
+
association.class_name.constantize
|
94
93
|
rescue NoMethodError
|
95
94
|
association.options.fetch(:through).to_s.classify.constantize
|
96
95
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
module Dbt
|
5
|
+
module Factory
|
6
|
+
module Columns
|
7
|
+
module YmlFactory
|
8
|
+
def self.build(
|
9
|
+
table_name,
|
10
|
+
primary_keys: ActiveRecord::Base.connection.primary_keys(table_name),
|
11
|
+
foreign_keys: ActiveRecord::Base.connection.foreign_keys(table_name)
|
12
|
+
)
|
13
|
+
ActiveRecord::Base.connection.columns(table_name).map do |column|
|
14
|
+
column_data_test = ActiveRecord::Dbt::Column::DataTest.new(
|
15
|
+
table_name,
|
16
|
+
column,
|
17
|
+
primary_keys: primary_keys,
|
18
|
+
foreign_keys: foreign_keys
|
19
|
+
)
|
20
|
+
|
21
|
+
ActiveRecord::Dbt::Column::Yml.new(
|
22
|
+
table_name,
|
23
|
+
column,
|
24
|
+
column_data_test,
|
25
|
+
primary_keys: primary_keys
|
26
|
+
)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
module Dbt
|
5
|
+
module Factory
|
6
|
+
module Model
|
7
|
+
module Staging
|
8
|
+
module YmlFactory
|
9
|
+
def self.build(table_name)
|
10
|
+
table_factory = ActiveRecord::Dbt::Factory::Table::YmlFactory.build(table_name)
|
11
|
+
yml = ActiveRecord::Dbt::Model::Staging::Yml.new(table_factory)
|
12
|
+
struct = Struct.new(:export_path, :dump, keyword_init: true)
|
13
|
+
|
14
|
+
struct.new(
|
15
|
+
export_path: yml.export_path,
|
16
|
+
dump: yml.dump
|
17
|
+
)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
module Dbt
|
5
|
+
module Factory
|
6
|
+
module Source
|
7
|
+
module YmlFactory
|
8
|
+
def self.build
|
9
|
+
tables_factory = ActiveRecord::Dbt::Factory::Tables::YmlFactory.build
|
10
|
+
|
11
|
+
ActiveRecord::Dbt::Source::Yml.new(tables_factory)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
module Dbt
|
5
|
+
module Factory
|
6
|
+
module Table
|
7
|
+
module YmlFactory
|
8
|
+
def self.build(table_name)
|
9
|
+
table_data_test = ActiveRecord::Dbt::Table::DataTest.new(table_name)
|
10
|
+
columns = ActiveRecord::Dbt::Factory::Columns::YmlFactory.build(table_name)
|
11
|
+
|
12
|
+
ActiveRecord::Dbt::Table::Yml.new(table_name, table_data_test, columns)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
module Dbt
|
5
|
+
module Factory
|
6
|
+
module Tables
|
7
|
+
module YmlFactory
|
8
|
+
def self.build
|
9
|
+
ActiveRecord::Base.connection.tables.sort.map do |table_name|
|
10
|
+
ActiveRecord::Dbt::Factory::Table::YmlFactory.build(table_name)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
module Dbt
|
5
|
+
module I18nWrapper
|
6
|
+
module Translate
|
7
|
+
extend ActiveRecord::Dbt::RequiredMethods
|
8
|
+
|
9
|
+
define_required_methods :table_name
|
10
|
+
|
11
|
+
delegate :singularize, to: :table_name, prefix: true
|
12
|
+
|
13
|
+
def translated_table_name
|
14
|
+
I18n.t("activerecord.models.#{table_name_singularize}", default: nil)
|
15
|
+
end
|
16
|
+
|
17
|
+
def translated_attribute_name
|
18
|
+
@translated_attribute_name ||=
|
19
|
+
translated_column_name || translated_default_column_name
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def translated_column_name
|
25
|
+
I18n.t("activerecord.attributes.#{table_name_singularize}.#{column_name}", default: nil)
|
26
|
+
end
|
27
|
+
|
28
|
+
def translated_default_column_name
|
29
|
+
I18n.t("attributes.#{column_name}", default: nil)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -21,23 +21,27 @@ module ActiveRecord
|
|
21
21
|
"#{basename}.yml"
|
22
22
|
end
|
23
23
|
|
24
|
-
def
|
24
|
+
def dump
|
25
|
+
YAML.dump(properties.deep_stringify_keys)
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def properties
|
25
31
|
{
|
26
32
|
'version' => 2,
|
27
33
|
'models' => [
|
28
34
|
{
|
29
35
|
'name' => model_name,
|
30
|
-
**table.
|
36
|
+
**table.properties.except('name', 'columns'),
|
31
37
|
'columns' => override_columns
|
32
38
|
}
|
33
39
|
]
|
34
40
|
}
|
35
41
|
end
|
36
42
|
|
37
|
-
private
|
38
|
-
|
39
43
|
def columns
|
40
|
-
@columns ||= sort_columns(table.
|
44
|
+
@columns ||= sort_columns(table.properties['columns'])
|
41
45
|
end
|
42
46
|
|
43
47
|
def sort_columns(columns)
|
@@ -75,7 +79,7 @@ module ActiveRecord
|
|
75
79
|
end
|
76
80
|
|
77
81
|
def add_relationship_test(column)
|
78
|
-
column['
|
82
|
+
column['data_tests'].push(relationships_test(column['name']))
|
79
83
|
end
|
80
84
|
|
81
85
|
def rename_primary_id_in_column(column)
|