activerecord-dbt 0.1.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +192 -106
  3. data/lib/active_record/dbt/column/column.rb +4 -13
  4. data/lib/active_record/dbt/column/testable/accepted_values_testable.rb +3 -7
  5. data/lib/active_record/dbt/column/testable/not_null_testable.rb +9 -7
  6. data/lib/active_record/dbt/column/testable/relationships_testable.rb +4 -8
  7. data/lib/active_record/dbt/column/testable/unique_testable.rb +2 -6
  8. data/lib/active_record/dbt/config.rb +3 -30
  9. data/lib/active_record/dbt/configuration/dwh_platform.rb +39 -0
  10. data/lib/active_record/dbt/configuration/i18n_configuration.rb +14 -0
  11. data/lib/active_record/dbt/configuration/source.rb +40 -0
  12. data/lib/active_record/dbt/data_type/mapper.rb +103 -0
  13. data/lib/active_record/dbt/dbt_package/dbt_utils/table/testable/unique_combination_of_columns_testable.rb +18 -11
  14. data/lib/active_record/dbt/dbt_package/dbterd/column/testable/relationships_meta_relationship_type.rb +22 -19
  15. data/lib/active_record/dbt/factory/model/staging_factory.rb +3 -3
  16. data/lib/active_record/dbt/factory/source_factory.rb +1 -2
  17. data/lib/active_record/dbt/i18n_wrapper/translate.rb +34 -0
  18. data/lib/active_record/dbt/model/staging/yml.rb +10 -6
  19. data/lib/active_record/dbt/required_methods.rb +17 -0
  20. data/lib/active_record/dbt/seed/enum/base.rb +48 -0
  21. data/lib/active_record/dbt/seed/enum/csv.rb +85 -0
  22. data/lib/active_record/dbt/seed/enum/yml.rb +128 -0
  23. data/lib/active_record/dbt/source/yml.rb +6 -2
  24. data/lib/active_record/dbt/table/yml.rb +1 -4
  25. data/lib/active_record/dbt/version.rb +1 -1
  26. data/lib/active_record/dbt.rb +0 -2
  27. data/lib/generators/active_record/dbt/config/templates/source_config.yml.tt +3 -0
  28. data/lib/generators/active_record/dbt/enum/USAGE +9 -0
  29. data/lib/generators/active_record/dbt/enum/enum_generator.rb +31 -0
  30. data/lib/generators/active_record/dbt/initializer/templates/dbt.rb +1 -0
  31. data/lib/generators/active_record/dbt/staging_model/staging_model_generator.rb +2 -2
  32. metadata +13 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 897ffab9f05715634ea7eb0ef68be9c70e8d305458657696fe544255f17293c9
4
- data.tar.gz: f82f9f7b02c592572077f3ba41bf0920ae0abb831de065b707d107124080353d
3
+ metadata.gz: affd8c9f9864d11cbaf5c35a759ea603c72784b9eae777987debad89fd8cd509
4
+ data.tar.gz: 6b8ca507c1e413143f3d0a7330451767190b3acb731e70c8b2beb87bff9df64b
5
5
  SHA512:
6
- metadata.gz: cd87b1c4a5ba3e97aad5320f58eb9151e14ff8752b93519b0b14314b9ba872b48afee79e93e09de813898ccf83dc3d41a0d64d07277c1e8cf7413dabd93a7fd2
7
- data.tar.gz: 829ff19c802bc18c7e721ede97beff805e26e9642382153a64ececb21e7f5b6512cab9f226e1ef3c7ca51399a9ec4604cf7b3b1a1f61e237e74a99327b12429e
6
+ metadata.gz: 2798392f8cdcb454a64957a005d7d16e3eeec7e1648234ba5c598cbacb6b683198493337619c9e0a9f17f67a231f6a3fc6f34658651671de3776c7caf28093c9
7
+ data.tar.gz: d417dfdd69d8a0c41baee03a41a0880ecba05abbbb61c86b80ed1ef48021bcdda16a4e2b43dd414a29d7f56ad9cf92a0e3afe0a693b5ae4aa3a38e0bbeb9f03d
data/README.md CHANGED
@@ -1,6 +1,10 @@
1
1
  # ActiveRecord::Dbt
2
2
 
3
- `ActiveRecord::Dbt` generates dbt files from the information of the database connected via ActiveRecord.
3
+ [![Gem Version](https://badge.fury.io/rb/activerecord-dbt.svg)](https://badge.fury.io/rb/activerecord-dbt)
4
+ [![Maintainability](https://api.codeclimate.com/v1/badges/ef9a0a71c73dae7b8156/maintainability)](https://codeclimate.com/github/yamotech/activerecord-dbt/maintainability)
5
+ [![Ruby CI](https://github.com/yamotech/activerecord-dbt/actions/workflows/ruby-ci.yml/badge.svg)](https://github.com/yamotech/activerecord-dbt/actions/workflows/ruby-ci.yml)
6
+
7
+ `ActiveRecord::Dbt` generates [dbt](https://www.getdbt.com/) files from the information of the database connected via ActiveRecord.
4
8
 
5
9
  Currently, it can generate `yaml` files for `sources` and `models` files for `staging`.
6
10
 
@@ -50,9 +54,28 @@ Configuration | Description
50
54
  --------- | ---------
51
55
  config_directory_path | The path to the directory where files generated by `bin/rails generate active_record:dbt:*` are stored. The default is `lib/dbt`.
52
56
  export_directory_path | The path to the directory where configuration files are stored. The default is `doc/dbt`.
57
+ dwh_platform | Specify the data warehouse platform to which dbt connects. The default is `bigquery`.
53
58
  data_sync_delayed | Indicates whether there is a data delay. If set to `true`, `severity: warn` is applied to the `relationships` test. The default is `false`.
54
59
  logger | The destination for log output. The default is `Logger.new('./log/active_record_dbt.log')`.
55
60
  used_dbt_package_names | An array of `dbt` package names to use.
61
+ locale | I18n locale. The default is `I18n.locale`.
62
+
63
+ List of platforms that can currently be set with `dwh_platform`.
64
+
65
+ Data Warehouse Platform | Link
66
+ --------- | ---------
67
+ bigquery | [BigQuery enterprise data warehouse - Google Cloud](https://cloud.google.com/bigquery?hl=en)
68
+ postgres | [PostgreSQL: The world's most advanced open source database](https://www.postgresql.org/)
69
+ redshift | [Cloud Data Warehouse - Amazon Redshift - AWS](https://aws.amazon.com/redshift/)
70
+ snowflake | [The Snowflake AI Data Cloud - Mobilize Data, Apps, and AI](https://www.snowflake.com/en/)
71
+ spark | [Apache Spark™ - Unified Engine for large-scale data analytics](https://spark.apache.org/)
72
+
73
+ List of packages that can currently be set with `used_dbt_package_names`.
74
+
75
+ dbt Package Name | Link
76
+ --------- | ---------
77
+ dbt-labs/dbt-utils | [dbt-labs/dbt-utils: Utility functions for dbt projects.](https://github.com/dbt-labs/dbt-utils)
78
+ datnguye/dbterd | [datnguye/dbterd: Generate the ERD as a code from dbt artifacts](https://github.com/datnguye/dbterd)
56
79
 
57
80
  Example:
58
81
 
@@ -143,10 +166,10 @@ table_overrides:
143
166
 
144
167
  ##### defaults
145
168
 
146
- Set default values for the `name` and `description` of `tables`.
169
+ Set the default value for the `description`(`logical_name`, `description`) of `tables`.
147
170
 
148
- In `logical_name` and `description` of `table_descriptions`, you can refer to the table name with `{{ table_name }}`.
149
- In the `description` of `columns`, you can refer to the table name with `{{ table_name }}` and the column name with `{{ column_name }}`.
171
+ In the `logical_name` and `description` of `table_descriptions`, you can refer to the table name with `{{ table_name }}`.
172
+ In the `description` of `table_descriptions.columns`, you can refer to the table name with `{{ table_name }}` and the column name with `{{ column_name }}`.
150
173
 
151
174
  Example:
152
175
 
@@ -294,25 +317,21 @@ sources:
294
317
  columns:
295
318
  - name: key
296
319
  description: Key
297
- meta:
298
- column_type: string
320
+ data_type: string
299
321
  tests:
300
322
  - unique
301
323
  - not_null
302
324
  - name: value
303
325
  description: Value
304
- meta:
305
- column_type: string
326
+ data_type: string
306
327
  - name: created_at
307
328
  description: Created At
308
- meta:
309
- column_type: datetime
329
+ data_type: datetime
310
330
  tests:
311
331
  - not_null
312
332
  - name: updated_at
313
333
  description: Updated At
314
- meta:
315
- column_type: datetime
334
+ data_type: datetime
316
335
  tests:
317
336
  - not_null
318
337
  - name: companies
@@ -320,29 +339,24 @@ sources:
320
339
  columns:
321
340
  - name: id
322
341
  description: id
323
- meta:
324
- column_type: integer
342
+ data_type: int64
325
343
  tests:
326
344
  - unique
327
345
  - not_null
328
346
  - name: name
329
347
  description: Write a description of the 'companies.name' column.
330
- meta:
331
- column_type: string
348
+ data_type: string
332
349
  tests:
333
350
  - not_null
334
351
  - name: establishment_date
335
352
  description: Write a description of the 'companies.establishment_date' column.
336
- meta:
337
- column_type: string
353
+ data_type: string
338
354
  - name: average_age
339
355
  description: Write a description of the 'companies.average_age' column.
340
- meta:
341
- column_type: float
356
+ data_type: float64
342
357
  - name: published
343
358
  description: Write a description of the 'companies.published' column.
344
- meta:
345
- column_type: boolean
359
+ data_type: bool
346
360
  tests:
347
361
  - not_null
348
362
  - accepted_values:
@@ -352,14 +366,12 @@ sources:
352
366
  quote: false
353
367
  - name: created_at
354
368
  description: Created At
355
- meta:
356
- column_type: datetime
369
+ data_type: datetime
357
370
  tests:
358
371
  - not_null
359
372
  - name: updated_at
360
373
  description: Updated At
361
- meta:
362
- column_type: datetime
374
+ data_type: datetime
363
375
  tests:
364
376
  - not_null
365
377
  - name: posts
@@ -367,15 +379,13 @@ sources:
367
379
  columns:
368
380
  - name: id
369
381
  description: ID
370
- meta:
371
- column_type: integer
382
+ data_type: int64
372
383
  tests:
373
384
  - unique
374
385
  - not_null
375
386
  - name: user_id
376
387
  description: User
377
- meta:
378
- column_type: integer
388
+ data_type: int64
379
389
  tests:
380
390
  - not_null
381
391
  - relationships:
@@ -385,28 +395,23 @@ sources:
385
395
  relationship_type: many-to-one
386
396
  - name: title
387
397
  description: Title
388
- meta:
389
- column_type: string
398
+ data_type: string
390
399
  - name: content
391
400
  description: Content
392
- meta:
393
- column_type: text
401
+ data_type: string
394
402
  - name: created_at
395
403
  description: Post Created At
396
- meta:
397
- column_type: datetime
404
+ data_type: datetime
398
405
  tests:
399
406
  - not_null
400
407
  - name: updated_at
401
408
  description: Post Updated At
402
- meta:
403
- column_type: datetime
409
+ data_type: datetime
404
410
  tests:
405
411
  - not_null
406
412
  - name: status
407
413
  description: Write a description of the 'posts.status' column.
408
- meta:
409
- column_type: integer
414
+ data_type: int64
410
415
  tests:
411
416
  - accepted_values:
412
417
  values:
@@ -424,8 +429,7 @@ sources:
424
429
  columns:
425
430
  - name: post_id
426
431
  description: post_id
427
- meta:
428
- column_type: integer
432
+ data_type: int64
429
433
  tests:
430
434
  - not_null
431
435
  - relationships:
@@ -438,8 +442,7 @@ sources:
438
442
  message: uninitialized constant PostsTag
439
443
  - name: tag_id
440
444
  description: tag_id
441
- meta:
442
- column_type: integer
445
+ data_type: int64
443
446
  tests:
444
447
  - not_null
445
448
  - relationships:
@@ -455,15 +458,13 @@ sources:
455
458
  columns:
456
459
  - name: id
457
460
  description: id
458
- meta:
459
- column_type: integer
461
+ data_type: int64
460
462
  tests:
461
463
  - unique
462
464
  - not_null
463
465
  - name: user_id
464
466
  description: user_id
465
- meta:
466
- column_type: integer
467
+ data_type: int64
467
468
  tests:
468
469
  - unique
469
470
  - not_null
@@ -474,26 +475,22 @@ sources:
474
475
  relationship_type: one-to-one
475
476
  - name: first_name
476
477
  description: Write a description of the 'profiles.first_name' column.
477
- meta:
478
- column_type: string
478
+ data_type: string
479
479
  tests:
480
480
  - not_null
481
481
  - name: last_name
482
482
  description: Write a description of the 'profiles.last_name' column.
483
- meta:
484
- column_type: string
483
+ data_type: string
485
484
  tests:
486
485
  - not_null
487
486
  - name: created_at
488
487
  description: Created At
489
- meta:
490
- column_type: datetime
488
+ data_type: datetime
491
489
  tests:
492
490
  - not_null
493
491
  - name: updated_at
494
492
  description: Updated At
495
- meta:
496
- column_type: datetime
493
+ data_type: datetime
497
494
  tests:
498
495
  - not_null
499
496
  - name: relationships
@@ -506,15 +503,13 @@ sources:
506
503
  columns:
507
504
  - name: id
508
505
  description: id
509
- meta:
510
- column_type: integer
506
+ data_type: int64
511
507
  tests:
512
508
  - unique
513
509
  - not_null
514
510
  - name: follower_id
515
511
  description: follower_id
516
- meta:
517
- column_type: integer
512
+ data_type: int64
518
513
  tests:
519
514
  - not_null
520
515
  - relationships:
@@ -524,8 +519,7 @@ sources:
524
519
  relationship_type: many-to-one
525
520
  - name: followed_id
526
521
  description: followed_id
527
- meta:
528
- column_type: integer
522
+ data_type: int64
529
523
  tests:
530
524
  - not_null
531
525
  - relationships:
@@ -535,14 +529,12 @@ sources:
535
529
  relationship_type: many-to-one
536
530
  - name: created_at
537
531
  description: Created At
538
- meta:
539
- column_type: datetime
532
+ data_type: datetime
540
533
  tests:
541
534
  - not_null
542
535
  - name: updated_at
543
536
  description: Updated At
544
- meta:
545
- column_type: datetime
537
+ data_type: datetime
546
538
  tests:
547
539
  - not_null
548
540
  - name: schema_migrations
@@ -553,8 +545,7 @@ sources:
553
545
  columns:
554
546
  - name: version
555
547
  description: The version number of the migration.
556
- meta:
557
- column_type: string
548
+ data_type: string
558
549
  tests:
559
550
  - unique
560
551
  - not_null
@@ -563,28 +554,24 @@ sources:
563
554
  columns:
564
555
  - name: id
565
556
  description: id
566
- meta:
567
- column_type: integer
557
+ data_type: int64
568
558
  tests:
569
559
  - unique
570
560
  - not_null
571
561
  - name: name
572
562
  description: Write a description of the 'tags.name' column.
573
- meta:
574
- column_type: string
563
+ data_type: string
575
564
  tests:
576
565
  - unique
577
566
  - not_null
578
567
  - name: created_at
579
568
  description: Created At
580
- meta:
581
- column_type: datetime
569
+ data_type: datetime
582
570
  tests:
583
571
  - not_null
584
572
  - name: updated_at
585
573
  description: Updated At
586
- meta:
587
- column_type: datetime
574
+ data_type: datetime
588
575
  tests:
589
576
  - not_null
590
577
  - name: user_tags
@@ -597,15 +584,13 @@ sources:
597
584
  columns:
598
585
  - name: id
599
586
  description: id
600
- meta:
601
- column_type: integer
587
+ data_type: int64
602
588
  tests:
603
589
  - unique
604
590
  - not_null
605
591
  - name: user_id
606
592
  description: user_id
607
- meta:
608
- column_type: integer
593
+ data_type: int64
609
594
  tests:
610
595
  - not_null
611
596
  - relationships:
@@ -615,8 +600,7 @@ sources:
615
600
  relationship_type: many-to-one
616
601
  - name: tag_id
617
602
  description: tag_id
618
- meta:
619
- column_type: integer
603
+ data_type: int64
620
604
  tests:
621
605
  - not_null
622
606
  - relationships:
@@ -626,14 +610,12 @@ sources:
626
610
  relationship_type: many-to-one
627
611
  - name: created_at
628
612
  description: Created At
629
- meta:
630
- column_type: datetime
613
+ data_type: datetime
631
614
  tests:
632
615
  - not_null
633
616
  - name: updated_at
634
617
  description: Updated At
635
- meta:
636
- column_type: datetime
618
+ data_type: datetime
637
619
  tests:
638
620
  - not_null
639
621
  - name: users
@@ -649,28 +631,24 @@ sources:
649
631
  columns:
650
632
  - name: id
651
633
  description: ID
652
- meta:
653
- column_type: integer
634
+ data_type: int64
654
635
  tests:
655
636
  - unique
656
637
  - not_null
657
638
  - name: created_at
658
639
  description: User Created At
659
- meta:
660
- column_type: datetime
640
+ data_type: datetime
661
641
  tests:
662
642
  - not_null:
663
643
  where: id != 1
664
644
  - name: updated_at
665
645
  description: User Updated At
666
- meta:
667
- column_type: datetime
646
+ data_type: datetime
668
647
  tests:
669
648
  - not_null
670
649
  - name: company_id
671
650
  description: company_id
672
- meta:
673
- column_type: integer
651
+ data_type: int64
674
652
  tests:
675
653
  - relationships:
676
654
  to: source('dummy', 'companies')
@@ -854,6 +832,10 @@ from final
854
832
 
855
833
  Example:
856
834
 
835
+ > [!NOTE]
836
+ >
837
+ > The output will be as shown below. It is recommended to indent the YAML file with a tool of your choice.
838
+
857
839
  ```yaml
858
840
  ---
859
841
  version: 2
@@ -863,8 +845,7 @@ models:
863
845
  columns:
864
846
  - name: profile_id
865
847
  description: profile_id
866
- meta:
867
- column_type: integer
848
+ data_type: int64
868
849
  tests:
869
850
  - unique
870
851
  - not_null
@@ -875,8 +856,7 @@ models:
875
856
  relationship_type: one-to-one
876
857
  - name: user_id
877
858
  description: user_id
878
- meta:
879
- column_type: integer
859
+ data_type: int64
880
860
  tests:
881
861
  - unique
882
862
  - not_null
@@ -887,31 +867,137 @@ models:
887
867
  relationship_type: one-to-one
888
868
  - name: first_name
889
869
  description: Write a description of the 'profiles.first_name' column.
890
- meta:
891
- column_type: string
870
+ data_type: string
892
871
  tests:
893
872
  - not_null
894
873
  - name: last_name
895
874
  description: Write a description of the 'profiles.last_name' column.
896
- meta:
897
- column_type: string
875
+ data_type: string
898
876
  tests:
899
877
  - not_null
900
878
  - name: created_at
901
879
  description: Created At
902
- meta:
903
- column_type: datetime
880
+ data_type: datetime
904
881
  tests:
905
882
  - not_null
906
883
  - name: updated_at
907
884
  description: Updated At
908
- meta:
909
- column_type: datetime
885
+ data_type: datetime
910
886
  tests:
911
887
  - not_null
912
888
 
913
889
  ```
914
890
 
891
+ ### Generated dbt Seed Files
892
+
893
+ #### dbt Seed Configuration
894
+
895
+ In the `#{config_directory_path}/source_config.yml` file, describe the properties you want to set for the seed enum.
896
+ You can configure `defaults` in this file.
897
+
898
+ ##### defaults
899
+
900
+ Set the default value for the `description` of the `seeds` enum.
901
+
902
+ In the `description` of `seed_descriptions.enum`, you can refer to the source name with `{{ source_name }}`, the translated table name with `{{ translated_table_name }}`, and the translated column name with `{{ translated_attribute_name }}`.
903
+
904
+ Example:
905
+
906
+ ```yml
907
+ defaults:
908
+ seed_descriptions:
909
+ enum:
910
+ description: "{{ source_name }} {{ translated_table_name }} {{ translated_attribute_name }} enum"
911
+
912
+ ```
913
+
914
+ If nothing is set, it defaults to the following:
915
+
916
+ ```yml
917
+ defaults:
918
+ seed_descriptions:
919
+ enum:
920
+ description: "{{ source_name }} {{ translated_table_name }} {{ translated_attribute_name }} enum"
921
+
922
+ ```
923
+
924
+ #### Generate dbt Seed Enum Files
925
+
926
+ Generate seed enum files for dbt:
927
+
928
+ ```bash
929
+ $ bin/rails generate active_record:dbt:enum TABLE_NAME ENUM_COLUMN_NAME
930
+ ```
931
+
932
+ Generate seed enum files for dbt from the specified `TABLE_NAME` and `ENUM_COLUMN_NAME`.
933
+
934
+ File | Description
935
+ --------- | ---------
936
+ `#{export_directory_path}/seed_#{source_name}__#{table_name_singularize}_enum_#{enum_pluralized}.csv` | Seed enum file for dbt.
937
+ `#{export_directory_path}/seed_#{source_name}__#{table_name_singularize}_enum_#{enum_pluralized}.yml` | Seed enum documentation file for dbt.
938
+
939
+ Example:
940
+
941
+ ```bash
942
+ $ bin/rails generate active_record:dbt:enum posts status
943
+ ```
944
+
945
+ ##### Generate `#{export_directory_path}/seed_#{source_name}__#{table_name_singularize}_enum_#{enum_pluralized}.csv`
946
+
947
+ Example:
948
+
949
+ ```csv
950
+ status_before_type_of_cast,status_key,status_en,status_ja
951
+ 0,draft,Draft,下書き
952
+ 1,published,Published,公開
953
+ 2,deleted,Deleted,削除
954
+
955
+ ```
956
+
957
+ ##### Generate `#{export_directory_path}/seed_#{source_name}__#{table_name_singularize}_enum_#{enum_pluralized}.yml`
958
+
959
+ Example:
960
+
961
+ > [!NOTE]
962
+ >
963
+ > The output will be as shown below. It is recommended to indent the YAML file with a tool of your choice.
964
+
965
+ ```yaml
966
+ ---
967
+ version: 2
968
+ seeds:
969
+ - name: seed_dummy__post_enum_statuses
970
+ description: dummy Post Status enum
971
+ config:
972
+ column_types:
973
+ status_before_type_of_cast: int64
974
+ status_key: string
975
+ status_en: string
976
+ status_ja: string
977
+ columns:
978
+ - name: status_before_type_of_cast
979
+ description: Status
980
+ tests:
981
+ - unique
982
+ - not_null
983
+ - name: status_key
984
+ description: Status(key)
985
+ tests:
986
+ - unique
987
+ - not_null
988
+ - name: status_en
989
+ description: Status(en)
990
+ tests:
991
+ - unique
992
+ - not_null
993
+ - name: status_ja
994
+ description: Status(ja)
995
+ tests:
996
+ - unique
997
+ - not_null
998
+
999
+ ```
1000
+
915
1001
  ## Contributing
916
1002
 
917
1003
  Contribution directions go here.
@@ -4,6 +4,9 @@ module ActiveRecord
4
4
  module Dbt
5
5
  module Column
6
6
  class Column
7
+ include ActiveRecord::Dbt::DataType::Mapper
8
+ include ActiveRecord::Dbt::I18nWrapper::Translate
9
+
7
10
  attr_reader :table_name, :column, :column_test, :primary_keys
8
11
 
9
12
  delegate :name, :comment, to: :column, prefix: true
@@ -21,7 +24,7 @@ module ActiveRecord
21
24
  {
22
25
  'name' => column_name,
23
26
  'description' => description,
24
- 'meta' => { 'column_type' => column.type.to_s },
27
+ 'data_type' => data_type(column.type),
25
28
  **column_overrides.except(:tests),
26
29
  'tests' => column_test.config
27
30
  }.compact
@@ -43,18 +46,6 @@ module ActiveRecord
43
46
  source_config.dig(:table_descriptions, table_name, :columns, column_name)
44
47
  end
45
48
 
46
- def translated_attribute_name
47
- translated_column_name || translated_default_column_name
48
- end
49
-
50
- def translated_column_name
51
- I18n.t("activerecord.attributes.#{table_name.singularize}.#{column_name}", default: nil)
52
- end
53
-
54
- def translated_default_column_name
55
- I18n.t("attributes.#{column_name}", default: nil)
56
- end
57
-
58
49
  def key_column_name
59
50
  column_name if primary_key? || foreign_key?
60
51
  end
@@ -5,17 +5,13 @@ module ActiveRecord
5
5
  module Column
6
6
  module Testable
7
7
  module AcceptedValuesTestable
8
- REQUIRED_ACCEPTED_VALUES_TESTABLE_METHODS = %i[@config column table_name column_name].freeze
8
+ extend ActiveRecord::Dbt::RequiredMethods
9
+
10
+ define_required_methods :@config, :column, :table_name, :column_name
9
11
 
10
12
  delegate :type, to: :column, prefix: true
11
13
  delegate :add_log, to: :@config
12
14
 
13
- REQUIRED_ACCEPTED_VALUES_TESTABLE_METHODS.each do |method_name|
14
- define_method(method_name) do
15
- raise NotImplementedError, "You must implement #{self.class}##{__method__}"
16
- end
17
- end
18
-
19
15
  def accepted_values_test
20
16
  return nil unless column_type == :boolean || enum_values.present?
21
17
 
@@ -5,16 +5,18 @@ module ActiveRecord
5
5
  module Column
6
6
  module Testable
7
7
  module NotNullTestable
8
- REQUIRED_NOT_NULL_TESTABLE_METHODS = %i[column].freeze
8
+ extend ActiveRecord::Dbt::RequiredMethods
9
9
 
10
- REQUIRED_NOT_NULL_TESTABLE_METHODS.each do |method_name|
11
- define_method(method_name) do
12
- raise NotImplementedError, "You must implement #{self.class}##{__method__}"
13
- end
14
- end
10
+ define_required_methods :column
15
11
 
16
12
  def not_null_test
17
- column.null == true ? nil : 'not_null'
13
+ null? ? nil : 'not_null'
14
+ end
15
+
16
+ private
17
+
18
+ def null?
19
+ column.null == true
18
20
  end
19
21
  end
20
22
  end