activerecord-dbt 0.1.0 → 0.2.0
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/README.md +74 -103
- data/lib/active_record/dbt/column/column.rb +3 -1
- data/lib/active_record/dbt/column/testable/accepted_values_testable.rb +3 -7
- data/lib/active_record/dbt/column/testable/not_null_testable.rb +2 -6
- data/lib/active_record/dbt/column/testable/relationships_testable.rb +4 -8
- data/lib/active_record/dbt/column/testable/unique_testable.rb +2 -6
- data/lib/active_record/dbt/config.rb +1 -0
- data/lib/active_record/dbt/configuration/dwh_platform.rb +39 -0
- data/lib/active_record/dbt/data_type/dwh_platform/apache_spark.rb +27 -0
- data/lib/active_record/dbt/data_type/dwh_platform/bigquery.rb +26 -0
- data/lib/active_record/dbt/data_type/dwh_platform/postgre_sql.rb +27 -0
- data/lib/active_record/dbt/data_type/dwh_platform/redshift.rb +27 -0
- data/lib/active_record/dbt/data_type/dwh_platform/snowflake.rb +27 -0
- data/lib/active_record/dbt/data_type/mapper.rb +36 -0
- data/lib/active_record/dbt/dbt_package/dbt_utils/table/testable/unique_combination_of_columns_testable.rb +18 -11
- data/lib/active_record/dbt/dbt_package/dbterd/column/testable/relationships_meta_relationship_type.rb +21 -17
- data/lib/active_record/dbt/model/staging/yml.rb +3 -3
- data/lib/active_record/dbt/required_methods.rb +17 -0
- data/lib/active_record/dbt/version.rb +1 -1
- data/lib/active_record/dbt.rb +0 -2
- data/lib/generators/active_record/dbt/initializer/templates/dbt.rb +1 -0
- metadata +10 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c7948bb8cc4c14d07c3fca2855b20957a2871c54dd67149fb178029fa93f6f09
|
|
4
|
+
data.tar.gz: c8146bfcd3ffa762f16889a79750807ab1e72986e49f34069ac043fe8c89d5f0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a2d3ce1aa15cafbd0bb6f282d5faa64f6319d669a38a8dde20b04af3cccf12a21e16fa22cf6f7b87b245dd094bad296de2dd22bd027db047b2ed845cc7de2b8a
|
|
7
|
+
data.tar.gz: 6097b5f0b25324679e012d4a16833afba17514f2ebb82eabe778ae510bc8f283c280dd3d6916b2a3220092c63c7827c56b4b0660f14caa6f1b210a496dff7cdc
|
data/README.md
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
# ActiveRecord::Dbt
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://badge.fury.io/rb/activerecord-dbt)
|
|
4
|
+
[](https://codeclimate.com/github/yamotech/activerecord-dbt/maintainability)
|
|
5
|
+
[](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,10 +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.
|
|
56
61
|
|
|
62
|
+
List of platforms that can currently be set with `dwh_platform`.
|
|
63
|
+
|
|
64
|
+
Data Warehouse Platform | Link
|
|
65
|
+
--------- | ---------
|
|
66
|
+
bigquery | [BigQuery enterprise data warehouse - Google Cloud](https://cloud.google.com/bigquery?hl=en)
|
|
67
|
+
postgres | [PostgreSQL: The world's most advanced open source database](https://www.postgresql.org/)
|
|
68
|
+
redshift | [Cloud Data Warehouse - Amazon Redshift - AWS](https://aws.amazon.com/redshift/)
|
|
69
|
+
snowflake | [The Snowflake AI Data Cloud - Mobilize Data, Apps, and AI](https://www.snowflake.com/en/)
|
|
70
|
+
spark | [Apache Spark™ - Unified Engine for large-scale data analytics](https://spark.apache.org/)
|
|
71
|
+
|
|
72
|
+
List of packages that can currently be set with `used_dbt_package_names`.
|
|
73
|
+
|
|
74
|
+
dbt Package Name | Link
|
|
75
|
+
--------- | ---------
|
|
76
|
+
dbt-labs/dbt-utils | [dbt-labs/dbt-utils: Utility functions for dbt projects.](https://github.com/dbt-labs/dbt-utils)
|
|
77
|
+
datnguye/dbterd | [datnguye/dbterd: Generate the ERD as a code from dbt artifacts](https://github.com/datnguye/dbterd)
|
|
78
|
+
|
|
57
79
|
Example:
|
|
58
80
|
|
|
59
81
|
Adjust the settings according to your environment.
|
|
@@ -294,25 +316,21 @@ sources:
|
|
|
294
316
|
columns:
|
|
295
317
|
- name: key
|
|
296
318
|
description: Key
|
|
297
|
-
|
|
298
|
-
column_type: string
|
|
319
|
+
data_type: string
|
|
299
320
|
tests:
|
|
300
321
|
- unique
|
|
301
322
|
- not_null
|
|
302
323
|
- name: value
|
|
303
324
|
description: Value
|
|
304
|
-
|
|
305
|
-
column_type: string
|
|
325
|
+
data_type: string
|
|
306
326
|
- name: created_at
|
|
307
327
|
description: Created At
|
|
308
|
-
|
|
309
|
-
column_type: datetime
|
|
328
|
+
data_type: datetime
|
|
310
329
|
tests:
|
|
311
330
|
- not_null
|
|
312
331
|
- name: updated_at
|
|
313
332
|
description: Updated At
|
|
314
|
-
|
|
315
|
-
column_type: datetime
|
|
333
|
+
data_type: datetime
|
|
316
334
|
tests:
|
|
317
335
|
- not_null
|
|
318
336
|
- name: companies
|
|
@@ -320,29 +338,24 @@ sources:
|
|
|
320
338
|
columns:
|
|
321
339
|
- name: id
|
|
322
340
|
description: id
|
|
323
|
-
|
|
324
|
-
column_type: integer
|
|
341
|
+
data_type: int64
|
|
325
342
|
tests:
|
|
326
343
|
- unique
|
|
327
344
|
- not_null
|
|
328
345
|
- name: name
|
|
329
346
|
description: Write a description of the 'companies.name' column.
|
|
330
|
-
|
|
331
|
-
column_type: string
|
|
347
|
+
data_type: string
|
|
332
348
|
tests:
|
|
333
349
|
- not_null
|
|
334
350
|
- name: establishment_date
|
|
335
351
|
description: Write a description of the 'companies.establishment_date' column.
|
|
336
|
-
|
|
337
|
-
column_type: string
|
|
352
|
+
data_type: string
|
|
338
353
|
- name: average_age
|
|
339
354
|
description: Write a description of the 'companies.average_age' column.
|
|
340
|
-
|
|
341
|
-
column_type: float
|
|
355
|
+
data_type: float64
|
|
342
356
|
- name: published
|
|
343
357
|
description: Write a description of the 'companies.published' column.
|
|
344
|
-
|
|
345
|
-
column_type: boolean
|
|
358
|
+
data_type: bool
|
|
346
359
|
tests:
|
|
347
360
|
- not_null
|
|
348
361
|
- accepted_values:
|
|
@@ -352,14 +365,12 @@ sources:
|
|
|
352
365
|
quote: false
|
|
353
366
|
- name: created_at
|
|
354
367
|
description: Created At
|
|
355
|
-
|
|
356
|
-
column_type: datetime
|
|
368
|
+
data_type: datetime
|
|
357
369
|
tests:
|
|
358
370
|
- not_null
|
|
359
371
|
- name: updated_at
|
|
360
372
|
description: Updated At
|
|
361
|
-
|
|
362
|
-
column_type: datetime
|
|
373
|
+
data_type: datetime
|
|
363
374
|
tests:
|
|
364
375
|
- not_null
|
|
365
376
|
- name: posts
|
|
@@ -367,15 +378,13 @@ sources:
|
|
|
367
378
|
columns:
|
|
368
379
|
- name: id
|
|
369
380
|
description: ID
|
|
370
|
-
|
|
371
|
-
column_type: integer
|
|
381
|
+
data_type: int64
|
|
372
382
|
tests:
|
|
373
383
|
- unique
|
|
374
384
|
- not_null
|
|
375
385
|
- name: user_id
|
|
376
386
|
description: User
|
|
377
|
-
|
|
378
|
-
column_type: integer
|
|
387
|
+
data_type: int64
|
|
379
388
|
tests:
|
|
380
389
|
- not_null
|
|
381
390
|
- relationships:
|
|
@@ -385,28 +394,23 @@ sources:
|
|
|
385
394
|
relationship_type: many-to-one
|
|
386
395
|
- name: title
|
|
387
396
|
description: Title
|
|
388
|
-
|
|
389
|
-
column_type: string
|
|
397
|
+
data_type: string
|
|
390
398
|
- name: content
|
|
391
399
|
description: Content
|
|
392
|
-
|
|
393
|
-
column_type: text
|
|
400
|
+
data_type: string
|
|
394
401
|
- name: created_at
|
|
395
402
|
description: Post Created At
|
|
396
|
-
|
|
397
|
-
column_type: datetime
|
|
403
|
+
data_type: datetime
|
|
398
404
|
tests:
|
|
399
405
|
- not_null
|
|
400
406
|
- name: updated_at
|
|
401
407
|
description: Post Updated At
|
|
402
|
-
|
|
403
|
-
column_type: datetime
|
|
408
|
+
data_type: datetime
|
|
404
409
|
tests:
|
|
405
410
|
- not_null
|
|
406
411
|
- name: status
|
|
407
412
|
description: Write a description of the 'posts.status' column.
|
|
408
|
-
|
|
409
|
-
column_type: integer
|
|
413
|
+
data_type: int64
|
|
410
414
|
tests:
|
|
411
415
|
- accepted_values:
|
|
412
416
|
values:
|
|
@@ -424,8 +428,7 @@ sources:
|
|
|
424
428
|
columns:
|
|
425
429
|
- name: post_id
|
|
426
430
|
description: post_id
|
|
427
|
-
|
|
428
|
-
column_type: integer
|
|
431
|
+
data_type: int64
|
|
429
432
|
tests:
|
|
430
433
|
- not_null
|
|
431
434
|
- relationships:
|
|
@@ -438,8 +441,7 @@ sources:
|
|
|
438
441
|
message: uninitialized constant PostsTag
|
|
439
442
|
- name: tag_id
|
|
440
443
|
description: tag_id
|
|
441
|
-
|
|
442
|
-
column_type: integer
|
|
444
|
+
data_type: int64
|
|
443
445
|
tests:
|
|
444
446
|
- not_null
|
|
445
447
|
- relationships:
|
|
@@ -455,15 +457,13 @@ sources:
|
|
|
455
457
|
columns:
|
|
456
458
|
- name: id
|
|
457
459
|
description: id
|
|
458
|
-
|
|
459
|
-
column_type: integer
|
|
460
|
+
data_type: int64
|
|
460
461
|
tests:
|
|
461
462
|
- unique
|
|
462
463
|
- not_null
|
|
463
464
|
- name: user_id
|
|
464
465
|
description: user_id
|
|
465
|
-
|
|
466
|
-
column_type: integer
|
|
466
|
+
data_type: int64
|
|
467
467
|
tests:
|
|
468
468
|
- unique
|
|
469
469
|
- not_null
|
|
@@ -474,26 +474,22 @@ sources:
|
|
|
474
474
|
relationship_type: one-to-one
|
|
475
475
|
- name: first_name
|
|
476
476
|
description: Write a description of the 'profiles.first_name' column.
|
|
477
|
-
|
|
478
|
-
column_type: string
|
|
477
|
+
data_type: string
|
|
479
478
|
tests:
|
|
480
479
|
- not_null
|
|
481
480
|
- name: last_name
|
|
482
481
|
description: Write a description of the 'profiles.last_name' column.
|
|
483
|
-
|
|
484
|
-
column_type: string
|
|
482
|
+
data_type: string
|
|
485
483
|
tests:
|
|
486
484
|
- not_null
|
|
487
485
|
- name: created_at
|
|
488
486
|
description: Created At
|
|
489
|
-
|
|
490
|
-
column_type: datetime
|
|
487
|
+
data_type: datetime
|
|
491
488
|
tests:
|
|
492
489
|
- not_null
|
|
493
490
|
- name: updated_at
|
|
494
491
|
description: Updated At
|
|
495
|
-
|
|
496
|
-
column_type: datetime
|
|
492
|
+
data_type: datetime
|
|
497
493
|
tests:
|
|
498
494
|
- not_null
|
|
499
495
|
- name: relationships
|
|
@@ -506,15 +502,13 @@ sources:
|
|
|
506
502
|
columns:
|
|
507
503
|
- name: id
|
|
508
504
|
description: id
|
|
509
|
-
|
|
510
|
-
column_type: integer
|
|
505
|
+
data_type: int64
|
|
511
506
|
tests:
|
|
512
507
|
- unique
|
|
513
508
|
- not_null
|
|
514
509
|
- name: follower_id
|
|
515
510
|
description: follower_id
|
|
516
|
-
|
|
517
|
-
column_type: integer
|
|
511
|
+
data_type: int64
|
|
518
512
|
tests:
|
|
519
513
|
- not_null
|
|
520
514
|
- relationships:
|
|
@@ -524,8 +518,7 @@ sources:
|
|
|
524
518
|
relationship_type: many-to-one
|
|
525
519
|
- name: followed_id
|
|
526
520
|
description: followed_id
|
|
527
|
-
|
|
528
|
-
column_type: integer
|
|
521
|
+
data_type: int64
|
|
529
522
|
tests:
|
|
530
523
|
- not_null
|
|
531
524
|
- relationships:
|
|
@@ -535,14 +528,12 @@ sources:
|
|
|
535
528
|
relationship_type: many-to-one
|
|
536
529
|
- name: created_at
|
|
537
530
|
description: Created At
|
|
538
|
-
|
|
539
|
-
column_type: datetime
|
|
531
|
+
data_type: datetime
|
|
540
532
|
tests:
|
|
541
533
|
- not_null
|
|
542
534
|
- name: updated_at
|
|
543
535
|
description: Updated At
|
|
544
|
-
|
|
545
|
-
column_type: datetime
|
|
536
|
+
data_type: datetime
|
|
546
537
|
tests:
|
|
547
538
|
- not_null
|
|
548
539
|
- name: schema_migrations
|
|
@@ -553,8 +544,7 @@ sources:
|
|
|
553
544
|
columns:
|
|
554
545
|
- name: version
|
|
555
546
|
description: The version number of the migration.
|
|
556
|
-
|
|
557
|
-
column_type: string
|
|
547
|
+
data_type: string
|
|
558
548
|
tests:
|
|
559
549
|
- unique
|
|
560
550
|
- not_null
|
|
@@ -563,28 +553,24 @@ sources:
|
|
|
563
553
|
columns:
|
|
564
554
|
- name: id
|
|
565
555
|
description: id
|
|
566
|
-
|
|
567
|
-
column_type: integer
|
|
556
|
+
data_type: int64
|
|
568
557
|
tests:
|
|
569
558
|
- unique
|
|
570
559
|
- not_null
|
|
571
560
|
- name: name
|
|
572
561
|
description: Write a description of the 'tags.name' column.
|
|
573
|
-
|
|
574
|
-
column_type: string
|
|
562
|
+
data_type: string
|
|
575
563
|
tests:
|
|
576
564
|
- unique
|
|
577
565
|
- not_null
|
|
578
566
|
- name: created_at
|
|
579
567
|
description: Created At
|
|
580
|
-
|
|
581
|
-
column_type: datetime
|
|
568
|
+
data_type: datetime
|
|
582
569
|
tests:
|
|
583
570
|
- not_null
|
|
584
571
|
- name: updated_at
|
|
585
572
|
description: Updated At
|
|
586
|
-
|
|
587
|
-
column_type: datetime
|
|
573
|
+
data_type: datetime
|
|
588
574
|
tests:
|
|
589
575
|
- not_null
|
|
590
576
|
- name: user_tags
|
|
@@ -597,15 +583,13 @@ sources:
|
|
|
597
583
|
columns:
|
|
598
584
|
- name: id
|
|
599
585
|
description: id
|
|
600
|
-
|
|
601
|
-
column_type: integer
|
|
586
|
+
data_type: int64
|
|
602
587
|
tests:
|
|
603
588
|
- unique
|
|
604
589
|
- not_null
|
|
605
590
|
- name: user_id
|
|
606
591
|
description: user_id
|
|
607
|
-
|
|
608
|
-
column_type: integer
|
|
592
|
+
data_type: int64
|
|
609
593
|
tests:
|
|
610
594
|
- not_null
|
|
611
595
|
- relationships:
|
|
@@ -615,8 +599,7 @@ sources:
|
|
|
615
599
|
relationship_type: many-to-one
|
|
616
600
|
- name: tag_id
|
|
617
601
|
description: tag_id
|
|
618
|
-
|
|
619
|
-
column_type: integer
|
|
602
|
+
data_type: int64
|
|
620
603
|
tests:
|
|
621
604
|
- not_null
|
|
622
605
|
- relationships:
|
|
@@ -626,14 +609,12 @@ sources:
|
|
|
626
609
|
relationship_type: many-to-one
|
|
627
610
|
- name: created_at
|
|
628
611
|
description: Created At
|
|
629
|
-
|
|
630
|
-
column_type: datetime
|
|
612
|
+
data_type: datetime
|
|
631
613
|
tests:
|
|
632
614
|
- not_null
|
|
633
615
|
- name: updated_at
|
|
634
616
|
description: Updated At
|
|
635
|
-
|
|
636
|
-
column_type: datetime
|
|
617
|
+
data_type: datetime
|
|
637
618
|
tests:
|
|
638
619
|
- not_null
|
|
639
620
|
- name: users
|
|
@@ -649,28 +630,24 @@ sources:
|
|
|
649
630
|
columns:
|
|
650
631
|
- name: id
|
|
651
632
|
description: ID
|
|
652
|
-
|
|
653
|
-
column_type: integer
|
|
633
|
+
data_type: int64
|
|
654
634
|
tests:
|
|
655
635
|
- unique
|
|
656
636
|
- not_null
|
|
657
637
|
- name: created_at
|
|
658
638
|
description: User Created At
|
|
659
|
-
|
|
660
|
-
column_type: datetime
|
|
639
|
+
data_type: datetime
|
|
661
640
|
tests:
|
|
662
641
|
- not_null:
|
|
663
642
|
where: id != 1
|
|
664
643
|
- name: updated_at
|
|
665
644
|
description: User Updated At
|
|
666
|
-
|
|
667
|
-
column_type: datetime
|
|
645
|
+
data_type: datetime
|
|
668
646
|
tests:
|
|
669
647
|
- not_null
|
|
670
648
|
- name: company_id
|
|
671
649
|
description: company_id
|
|
672
|
-
|
|
673
|
-
column_type: integer
|
|
650
|
+
data_type: int64
|
|
674
651
|
tests:
|
|
675
652
|
- relationships:
|
|
676
653
|
to: source('dummy', 'companies')
|
|
@@ -863,8 +840,7 @@ models:
|
|
|
863
840
|
columns:
|
|
864
841
|
- name: profile_id
|
|
865
842
|
description: profile_id
|
|
866
|
-
|
|
867
|
-
column_type: integer
|
|
843
|
+
data_type: int64
|
|
868
844
|
tests:
|
|
869
845
|
- unique
|
|
870
846
|
- not_null
|
|
@@ -875,8 +851,7 @@ models:
|
|
|
875
851
|
relationship_type: one-to-one
|
|
876
852
|
- name: user_id
|
|
877
853
|
description: user_id
|
|
878
|
-
|
|
879
|
-
column_type: integer
|
|
854
|
+
data_type: int64
|
|
880
855
|
tests:
|
|
881
856
|
- unique
|
|
882
857
|
- not_null
|
|
@@ -887,26 +862,22 @@ models:
|
|
|
887
862
|
relationship_type: one-to-one
|
|
888
863
|
- name: first_name
|
|
889
864
|
description: Write a description of the 'profiles.first_name' column.
|
|
890
|
-
|
|
891
|
-
column_type: string
|
|
865
|
+
data_type: string
|
|
892
866
|
tests:
|
|
893
867
|
- not_null
|
|
894
868
|
- name: last_name
|
|
895
869
|
description: Write a description of the 'profiles.last_name' column.
|
|
896
|
-
|
|
897
|
-
column_type: string
|
|
870
|
+
data_type: string
|
|
898
871
|
tests:
|
|
899
872
|
- not_null
|
|
900
873
|
- name: created_at
|
|
901
874
|
description: Created At
|
|
902
|
-
|
|
903
|
-
column_type: datetime
|
|
875
|
+
data_type: datetime
|
|
904
876
|
tests:
|
|
905
877
|
- not_null
|
|
906
878
|
- name: updated_at
|
|
907
879
|
description: Updated At
|
|
908
|
-
|
|
909
|
-
column_type: datetime
|
|
880
|
+
data_type: datetime
|
|
910
881
|
tests:
|
|
911
882
|
- not_null
|
|
912
883
|
|
|
@@ -4,6 +4,8 @@ module ActiveRecord
|
|
|
4
4
|
module Dbt
|
|
5
5
|
module Column
|
|
6
6
|
class Column
|
|
7
|
+
include ActiveRecord::Dbt::DataType::Mapper
|
|
8
|
+
|
|
7
9
|
attr_reader :table_name, :column, :column_test, :primary_keys
|
|
8
10
|
|
|
9
11
|
delegate :name, :comment, to: :column, prefix: true
|
|
@@ -21,7 +23,7 @@ module ActiveRecord
|
|
|
21
23
|
{
|
|
22
24
|
'name' => column_name,
|
|
23
25
|
'description' => description,
|
|
24
|
-
'
|
|
26
|
+
'data_type' => data_type,
|
|
25
27
|
**column_overrides.except(:tests),
|
|
26
28
|
'tests' => column_test.config
|
|
27
29
|
}.compact
|
|
@@ -5,17 +5,13 @@ module ActiveRecord
|
|
|
5
5
|
module Column
|
|
6
6
|
module Testable
|
|
7
7
|
module AcceptedValuesTestable
|
|
8
|
-
|
|
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,13 +5,9 @@ module ActiveRecord
|
|
|
5
5
|
module Column
|
|
6
6
|
module Testable
|
|
7
7
|
module NotNullTestable
|
|
8
|
-
|
|
8
|
+
extend ActiveRecord::Dbt::RequiredMethods
|
|
9
9
|
|
|
10
|
-
|
|
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
13
|
column.null == true ? nil : 'not_null'
|
|
@@ -5,19 +5,15 @@ module ActiveRecord
|
|
|
5
5
|
module Column
|
|
6
6
|
module Testable
|
|
7
7
|
module RelationshipsTestable
|
|
8
|
-
REQUIRED_RELATIONSHIPS_TESTABLE_METHODS = %i[@config foreign_keys column_name].freeze
|
|
9
|
-
|
|
10
8
|
include ActiveRecord::Dbt::DbtPackage::Dbterd::Column::Testable::RelationshipsMetaRelationshipType
|
|
11
9
|
|
|
10
|
+
extend ActiveRecord::Dbt::RequiredMethods
|
|
11
|
+
|
|
12
|
+
define_required_methods :@config, :foreign_keys, :column_name
|
|
13
|
+
|
|
12
14
|
delegate :source_name, :data_sync_delayed?, to: :@config
|
|
13
15
|
delegate :to_table, to: :foreign_key
|
|
14
16
|
|
|
15
|
-
REQUIRED_RELATIONSHIPS_TESTABLE_METHODS.each do |method_name|
|
|
16
|
-
define_method(method_name) do
|
|
17
|
-
raise NotImplementedError, "You must implement #{self.class}##{__method__}"
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
|
|
21
17
|
def relationships_test
|
|
22
18
|
return nil if foreign_key.blank?
|
|
23
19
|
|
|
@@ -5,13 +5,9 @@ module ActiveRecord
|
|
|
5
5
|
module Column
|
|
6
6
|
module Testable
|
|
7
7
|
module UniqueTestable
|
|
8
|
-
|
|
8
|
+
extend ActiveRecord::Dbt::RequiredMethods
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
define_method(method_name) do
|
|
12
|
-
raise NotImplementedError, "You must implement #{self.class}##{__method__}"
|
|
13
|
-
end
|
|
14
|
-
end
|
|
10
|
+
define_required_methods :table_name, :column_name, :primary_keys
|
|
15
11
|
|
|
16
12
|
def unique_test
|
|
17
13
|
unique? ? 'unique' : nil
|
|
@@ -8,6 +8,7 @@ module ActiveRecord
|
|
|
8
8
|
include Singleton
|
|
9
9
|
|
|
10
10
|
include ActiveRecord::Dbt::Configuration::DataSync
|
|
11
|
+
include ActiveRecord::Dbt::Configuration::DwhPlatform
|
|
11
12
|
include ActiveRecord::Dbt::Configuration::Logger
|
|
12
13
|
include ActiveRecord::Dbt::Configuration::Parser
|
|
13
14
|
include ActiveRecord::Dbt::Configuration::UsedDbtPackage
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module ActiveRecord
|
|
4
|
+
module Dbt
|
|
5
|
+
module Configuration
|
|
6
|
+
module DwhPlatform
|
|
7
|
+
extend ActiveRecord::Dbt::RequiredMethods
|
|
8
|
+
|
|
9
|
+
define_required_methods :source_config_path
|
|
10
|
+
|
|
11
|
+
def dwh_platform=(dwh_platform)
|
|
12
|
+
@dwh_platform = validate_dwh_platform(dwh_platform)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def dwh_platform
|
|
16
|
+
@dwh_platform || (raise DwhPlatformIsNullError, "'dwh_platform' is required in '#{source_config_path}'.")
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
def validate_dwh_platform(dwh_platform)
|
|
22
|
+
return dwh_platform if selectable_dwh_platforms.include?(dwh_platform)
|
|
23
|
+
|
|
24
|
+
raise DoesNotExistOnTheDwhPlatformError, [
|
|
25
|
+
"'#{dwh_platform}' does not exist on the DWH platform.",
|
|
26
|
+
"Please specify one of the following: #{selectable_dwh_platforms.join(', ')}."
|
|
27
|
+
].join(' ')
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def selectable_dwh_platforms
|
|
31
|
+
@selectable_dwh_platforms ||= ActiveRecord::Dbt::DataType::Mapper::RUBY_TO_DWH_PLATFORM_TYPE_MAP.keys
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
class DoesNotExistOnTheDwhPlatformError < StandardError; end
|
|
35
|
+
class DwhPlatformIsNullError < StandardError; end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module ActiveRecord
|
|
4
|
+
module Dbt
|
|
5
|
+
module DataType
|
|
6
|
+
module DwhPlatform
|
|
7
|
+
module ApacheSpark
|
|
8
|
+
# TODO: I have not tried it. I don't know if this is the correct data_type.
|
|
9
|
+
# [Data Types - Spark 3.5.1 Documentation](https://spark.apache.org/docs/latest/sql-ref-datatypes.html)
|
|
10
|
+
RUBY_TO_SPARK_TYPES = {
|
|
11
|
+
binary: 'binary',
|
|
12
|
+
boolean: 'boolean',
|
|
13
|
+
date: 'date',
|
|
14
|
+
datetime: 'timestamp',
|
|
15
|
+
decimal: 'decimal',
|
|
16
|
+
float: 'float',
|
|
17
|
+
integer: 'integer',
|
|
18
|
+
json: 'string',
|
|
19
|
+
string: 'string',
|
|
20
|
+
text: 'string',
|
|
21
|
+
time: 'string'
|
|
22
|
+
}.freeze
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module ActiveRecord
|
|
4
|
+
module Dbt
|
|
5
|
+
module DataType
|
|
6
|
+
module DwhPlatform
|
|
7
|
+
module Bigquery
|
|
8
|
+
# [Data types | BigQuery | Google Cloud](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#data_type_list)
|
|
9
|
+
RUBY_TO_BIGQUERY_TYPES = {
|
|
10
|
+
binary: 'bytes',
|
|
11
|
+
boolean: 'bool',
|
|
12
|
+
date: 'date',
|
|
13
|
+
datetime: 'datetime',
|
|
14
|
+
decimal: 'int64',
|
|
15
|
+
float: 'float64',
|
|
16
|
+
integer: 'int64',
|
|
17
|
+
json: 'json',
|
|
18
|
+
string: 'string',
|
|
19
|
+
text: 'string',
|
|
20
|
+
time: 'time'
|
|
21
|
+
}.freeze
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module ActiveRecord
|
|
4
|
+
module Dbt
|
|
5
|
+
module DataType
|
|
6
|
+
module DwhPlatform
|
|
7
|
+
module PostgreSql
|
|
8
|
+
# TODO: I have not tried it. I don't know if this is the correct data_type.
|
|
9
|
+
# [PostgreSQL: Documentation: 16: Chapter 8. Data Types](https://www.postgresql.org/docs/current/datatype.html)
|
|
10
|
+
RUBY_TO_POSTGRES_TYPES = {
|
|
11
|
+
binary: 'bytea',
|
|
12
|
+
boolean: 'boolean',
|
|
13
|
+
date: 'date',
|
|
14
|
+
datetime: 'timestamp',
|
|
15
|
+
decimal: 'bigint',
|
|
16
|
+
float: 'double precision',
|
|
17
|
+
integer: 'bigint',
|
|
18
|
+
json: 'json',
|
|
19
|
+
string: 'text',
|
|
20
|
+
text: 'text',
|
|
21
|
+
time: 'time'
|
|
22
|
+
}.freeze
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module ActiveRecord
|
|
4
|
+
module Dbt
|
|
5
|
+
module DataType
|
|
6
|
+
module DwhPlatform
|
|
7
|
+
module Redshift
|
|
8
|
+
# TODO: I have not tried it. I don't know if this is the correct data_type.
|
|
9
|
+
# [Data types - Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/c_Supported_data_types.html)
|
|
10
|
+
RUBY_TO_REDSHIFT_TYPES = {
|
|
11
|
+
binary: 'varbyte',
|
|
12
|
+
boolean: 'bool',
|
|
13
|
+
date: 'date',
|
|
14
|
+
datetime: 'timestamp',
|
|
15
|
+
decimal: 'decimal',
|
|
16
|
+
float: 'double precision',
|
|
17
|
+
integer: 'integer',
|
|
18
|
+
json: 'super',
|
|
19
|
+
string: 'varchar',
|
|
20
|
+
text: 'varchar',
|
|
21
|
+
time: 'time'
|
|
22
|
+
}.freeze
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module ActiveRecord
|
|
4
|
+
module Dbt
|
|
5
|
+
module DataType
|
|
6
|
+
module DwhPlatform
|
|
7
|
+
module Snowflake
|
|
8
|
+
# TODO: I have not tried it. I don't know if this is the correct data_type.
|
|
9
|
+
# [Summary of data types | Snowflake Documentation](https://docs.snowflake.com/en/sql-reference/intro-summary-data-types)
|
|
10
|
+
RUBY_TO_SNOWFLAKE_TYPES = {
|
|
11
|
+
binary: 'binary',
|
|
12
|
+
boolean: 'boolean',
|
|
13
|
+
date: 'date',
|
|
14
|
+
datetime: 'datetime',
|
|
15
|
+
decimal: 'decimal',
|
|
16
|
+
float: 'float',
|
|
17
|
+
integer: 'integer',
|
|
18
|
+
json: 'variant',
|
|
19
|
+
string: 'varchar',
|
|
20
|
+
text: 'varchar',
|
|
21
|
+
time: 'time'
|
|
22
|
+
}.freeze
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module ActiveRecord
|
|
4
|
+
module Dbt
|
|
5
|
+
module DataType
|
|
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
|
+
extend ActiveRecord::Dbt::RequiredMethods
|
|
14
|
+
|
|
15
|
+
# [Platform-specific data types | dbt Developer Hub](https://docs.getdbt.com/reference/resource-properties/data-types)
|
|
16
|
+
RUBY_TO_DWH_PLATFORM_TYPE_MAP = {
|
|
17
|
+
'bigquery' => RUBY_TO_BIGQUERY_TYPES,
|
|
18
|
+
'postgres' => RUBY_TO_POSTGRES_TYPES,
|
|
19
|
+
'redshift' => RUBY_TO_REDSHIFT_TYPES,
|
|
20
|
+
'snowflake' => RUBY_TO_SNOWFLAKE_TYPES,
|
|
21
|
+
'spark' => RUBY_TO_SPARK_TYPES
|
|
22
|
+
}.freeze
|
|
23
|
+
|
|
24
|
+
define_required_methods :column, :@config
|
|
25
|
+
|
|
26
|
+
delegate :dwh_platform, to: :@config
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
def data_type
|
|
31
|
+
RUBY_TO_DWH_PLATFORM_TYPE_MAP[dwh_platform].fetch(column.type, 'unknown')
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -7,32 +7,39 @@ module ActiveRecord
|
|
|
7
7
|
module Table
|
|
8
8
|
module Testable
|
|
9
9
|
module UniqueCombinationOfColumnsTestable
|
|
10
|
-
|
|
10
|
+
extend ActiveRecord::Dbt::RequiredMethods
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
define_required_methods :table_name, :@config
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
define_method(method_name) do
|
|
16
|
-
raise NotImplementedError, "You must implement #{self.class}##{__method__}"
|
|
17
|
-
end
|
|
18
|
-
end
|
|
14
|
+
delegate :used_dbt_utils?, to: :@config
|
|
19
15
|
|
|
20
16
|
def unique_combination_of_columns_test
|
|
21
17
|
return nil unless used_dbt_utils?
|
|
22
18
|
|
|
23
|
-
|
|
24
|
-
next if index
|
|
25
|
-
next if (unique_indexes = index.columns).size == 1
|
|
19
|
+
indexes.each_with_object([]) do |index, array|
|
|
20
|
+
next if unique_indexes?(index)
|
|
26
21
|
|
|
27
22
|
array.push(
|
|
28
23
|
{
|
|
29
24
|
'dbt_utils.unique_combination_of_columns' => {
|
|
30
|
-
'combination_of_columns' =>
|
|
25
|
+
'combination_of_columns' => index.columns
|
|
31
26
|
}
|
|
32
27
|
}
|
|
33
28
|
)
|
|
34
29
|
end.presence
|
|
35
30
|
end
|
|
31
|
+
|
|
32
|
+
private
|
|
33
|
+
|
|
34
|
+
def indexes
|
|
35
|
+
ActiveRecord::Base.connection.indexes(table_name)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def unique_indexes?(index)
|
|
39
|
+
return true if index.unique == false
|
|
40
|
+
|
|
41
|
+
index.columns.size == 1
|
|
42
|
+
end
|
|
36
43
|
end
|
|
37
44
|
end
|
|
38
45
|
end
|
|
@@ -7,33 +7,21 @@ module ActiveRecord
|
|
|
7
7
|
module Column
|
|
8
8
|
module Testable
|
|
9
9
|
module RelationshipsMetaRelationshipType
|
|
10
|
-
|
|
10
|
+
extend ActiveRecord::Dbt::RequiredMethods
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
define_required_methods :@config, :foreign_key
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
define_method(method_name) do
|
|
16
|
-
raise NotImplementedError, "You must implement #{self.class}##{__method__}"
|
|
17
|
-
end
|
|
18
|
-
end
|
|
14
|
+
delegate :used_dbterd?, :add_log, to: :@config
|
|
19
15
|
|
|
20
16
|
def relationships_meta_relationship_type
|
|
21
17
|
return nil unless used_dbterd?
|
|
22
|
-
return nil if
|
|
18
|
+
return nil if no_relationship?
|
|
23
19
|
|
|
24
20
|
{
|
|
25
21
|
'relationship_type' => relationship_type
|
|
26
22
|
}
|
|
27
23
|
rescue NotSpecifiedOrNotInvalidIdError, StandardError => e
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
{
|
|
31
|
-
'relationship_type' => 'many-to-one',
|
|
32
|
-
'active_record_dbt_error' => {
|
|
33
|
-
'class' => e.class.to_s,
|
|
34
|
-
'message' => e.message.to_s
|
|
35
|
-
}
|
|
36
|
-
}
|
|
24
|
+
relationships_meta_relationship_type_with_active_record_dbt_error(e)
|
|
37
25
|
end
|
|
38
26
|
|
|
39
27
|
private
|
|
@@ -128,6 +116,22 @@ module ActiveRecord
|
|
|
128
116
|
@to_model ||= foreign_key.to_table.classify.constantize
|
|
129
117
|
end
|
|
130
118
|
|
|
119
|
+
def no_relationship?
|
|
120
|
+
foreign_key.nil? || relationship_type.blank?
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def relationships_meta_relationship_type_with_active_record_dbt_error(error)
|
|
124
|
+
add_log(self.class, error)
|
|
125
|
+
|
|
126
|
+
{
|
|
127
|
+
'relationship_type' => 'many-to-one',
|
|
128
|
+
'active_record_dbt_error' => {
|
|
129
|
+
'class' => error.class.to_s,
|
|
130
|
+
'message' => error.message.to_s
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
end
|
|
134
|
+
|
|
131
135
|
class NotSpecifiedOrNotInvalidIdError < StandardError; end
|
|
132
136
|
end
|
|
133
137
|
end
|
|
@@ -43,19 +43,19 @@ module ActiveRecord
|
|
|
43
43
|
def sort_columns(columns)
|
|
44
44
|
columns.sort_by do |column|
|
|
45
45
|
[
|
|
46
|
-
SORT_COLUMN_TYPES.index(
|
|
46
|
+
SORT_COLUMN_TYPES.index(data_type(column)) || -1,
|
|
47
47
|
columns.index(column)
|
|
48
48
|
]
|
|
49
49
|
end
|
|
50
50
|
end
|
|
51
51
|
|
|
52
|
-
def
|
|
52
|
+
def data_type(column)
|
|
53
53
|
if id?(column['name'])
|
|
54
54
|
'ids'
|
|
55
55
|
elsif enum?(column['name'])
|
|
56
56
|
'enums'
|
|
57
57
|
else
|
|
58
|
-
column.
|
|
58
|
+
column.fetch('data_type', 'unknown').pluralize
|
|
59
59
|
end
|
|
60
60
|
end
|
|
61
61
|
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module ActiveRecord
|
|
4
|
+
module Dbt
|
|
5
|
+
module RequiredMethods
|
|
6
|
+
def define_required_methods(*methods)
|
|
7
|
+
methods.each do |method_name|
|
|
8
|
+
define_method(method_name) do
|
|
9
|
+
raise RequiredImplementationMissingError, "You must implement #{self.class}##{__method__}"
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
class RequiredImplementationMissingError < StandardError; end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
data/lib/active_record/dbt.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: activerecord-dbt
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- yamotech
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2024-
|
|
11
|
+
date: 2024-08-03 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activerecord
|
|
@@ -72,9 +72,16 @@ files:
|
|
|
72
72
|
- lib/active_record/dbt/column/testable/unique_testable.rb
|
|
73
73
|
- lib/active_record/dbt/config.rb
|
|
74
74
|
- lib/active_record/dbt/configuration/data_sync.rb
|
|
75
|
+
- lib/active_record/dbt/configuration/dwh_platform.rb
|
|
75
76
|
- lib/active_record/dbt/configuration/logger.rb
|
|
76
77
|
- lib/active_record/dbt/configuration/parser.rb
|
|
77
78
|
- lib/active_record/dbt/configuration/used_dbt_package.rb
|
|
79
|
+
- lib/active_record/dbt/data_type/dwh_platform/apache_spark.rb
|
|
80
|
+
- lib/active_record/dbt/data_type/dwh_platform/bigquery.rb
|
|
81
|
+
- lib/active_record/dbt/data_type/dwh_platform/postgre_sql.rb
|
|
82
|
+
- lib/active_record/dbt/data_type/dwh_platform/redshift.rb
|
|
83
|
+
- lib/active_record/dbt/data_type/dwh_platform/snowflake.rb
|
|
84
|
+
- lib/active_record/dbt/data_type/mapper.rb
|
|
78
85
|
- lib/active_record/dbt/dbt_package/dbt_utils/table/testable/unique_combination_of_columns_testable.rb
|
|
79
86
|
- lib/active_record/dbt/dbt_package/dbterd/column/testable/relationships_meta_relationship_type.rb
|
|
80
87
|
- lib/active_record/dbt/factory/columns_factory.rb
|
|
@@ -86,6 +93,7 @@ files:
|
|
|
86
93
|
- lib/active_record/dbt/model/staging/sql.rb
|
|
87
94
|
- lib/active_record/dbt/model/staging/yml.rb
|
|
88
95
|
- lib/active_record/dbt/railtie.rb
|
|
96
|
+
- lib/active_record/dbt/required_methods.rb
|
|
89
97
|
- lib/active_record/dbt/source/yml.rb
|
|
90
98
|
- lib/active_record/dbt/table/base.rb
|
|
91
99
|
- lib/active_record/dbt/table/test.rb
|