Skip to content

Commit cc0bbd2

Browse files
[Backport 1.6.latest] Fix #6497: Support global flags passed in after subcommands (#8732)
Co-authored-by: Kshitij Aranke <[email protected]>
1 parent de6b75b commit cc0bbd2

File tree

3 files changed

+84
-47
lines changed

3 files changed

+84
-47
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
kind: Fixes
2+
body: Support global flags passed in after subcommands
3+
time: 2023-09-19T14:05:14.600303+01:00
4+
custom:
5+
Author: aranke
6+
Issue: "6497"

core/dbt/cli/main.py

+62-44
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import functools
12
from copy import copy
23
from dataclasses import dataclass
34
from typing import Callable, List, Optional, Union
@@ -118,6 +119,44 @@ def invoke(self, args: List[str], **kwargs) -> dbtRunnerResult:
118119
)
119120

120121

122+
# approach from https://github.com/pallets/click/issues/108#issuecomment-280489786
123+
def global_flags(func):
124+
@p.cache_selected_only
125+
@p.debug
126+
@p.deprecated_print
127+
@p.enable_legacy_logger
128+
@p.fail_fast
129+
@p.log_cache_events
130+
@p.log_file_max_bytes
131+
@p.log_format_file
132+
@p.log_level
133+
@p.log_level_file
134+
@p.log_path
135+
@p.macro_debugging
136+
@p.partial_parse
137+
@p.partial_parse_file_path
138+
@p.partial_parse_file_diff
139+
@p.populate_cache
140+
@p.print
141+
@p.printer_width
142+
@p.quiet
143+
@p.record_timing_info
144+
@p.send_anonymous_usage_stats
145+
@p.single_threaded
146+
@p.static_parser
147+
@p.use_colors
148+
@p.use_colors_file
149+
@p.use_experimental_parser
150+
@p.version
151+
@p.version_check
152+
@p.write_json
153+
@functools.wraps(func)
154+
def wrapper(*args, **kwargs):
155+
return func(*args, **kwargs)
156+
157+
return wrapper
158+
159+
121160
# dbt
122161
@click.group(
123162
context_settings={"help_option_names": ["-h", "--help"]},
@@ -126,38 +165,10 @@ def invoke(self, args: List[str], **kwargs) -> dbtRunnerResult:
126165
epilog="Specify one of these sub-commands and you can find more help from there.",
127166
)
128167
@click.pass_context
129-
@p.cache_selected_only
130-
@p.debug
131-
@p.deprecated_print
132-
@p.enable_legacy_logger
133-
@p.fail_fast
134-
@p.log_cache_events
135-
@p.log_file_max_bytes
136-
@p.log_format
137-
@p.log_format_file
138-
@p.log_level
139-
@p.log_level_file
140-
@p.log_path
141-
@p.macro_debugging
142-
@p.partial_parse
143-
@p.partial_parse_file_path
144-
@p.partial_parse_file_diff
145-
@p.populate_cache
146-
@p.print
147-
@p.printer_width
148-
@p.quiet
149-
@p.record_timing_info
150-
@p.send_anonymous_usage_stats
151-
@p.single_threaded
152-
@p.static_parser
153-
@p.use_colors
154-
@p.use_colors_file
155-
@p.use_experimental_parser
156-
@p.version
157-
@p.version_check
168+
@global_flags
158169
@p.warn_error
159170
@p.warn_error_options
160-
@p.write_json
171+
@p.log_format
161172
def cli(ctx, **kwargs):
162173
"""An ELT tool for managing your SQL transformations and data models.
163174
For more documentation on these commands, visit: docs.getdbt.com
@@ -167,10 +178,10 @@ def cli(ctx, **kwargs):
167178
# dbt build
168179
@cli.command("build")
169180
@click.pass_context
181+
@global_flags
170182
@p.defer
171183
@p.deprecated_defer
172184
@p.exclude
173-
@p.fail_fast
174185
@p.favor_state
175186
@p.deprecated_favor_state
176187
@p.full_refresh
@@ -190,7 +201,6 @@ def cli(ctx, **kwargs):
190201
@p.target_path
191202
@p.threads
192203
@p.vars
193-
@p.version_check
194204
@requires.postflight
195205
@requires.preflight
196206
@requires.profile
@@ -213,6 +223,7 @@ def build(ctx, **kwargs):
213223
# dbt clean
214224
@cli.command("clean")
215225
@click.pass_context
226+
@global_flags
216227
@p.profile
217228
@p.profiles_dir
218229
@p.project_dir
@@ -235,13 +246,15 @@ def clean(ctx, **kwargs):
235246
# dbt docs
236247
@cli.group()
237248
@click.pass_context
249+
@global_flags
238250
def docs(ctx, **kwargs):
239251
"""Generate or serve the documentation website for your project"""
240252

241253

242254
# dbt docs generate
243255
@docs.command("generate")
244256
@click.pass_context
257+
@global_flags
245258
@p.compile_docs
246259
@p.defer
247260
@p.deprecated_defer
@@ -261,7 +274,6 @@ def docs(ctx, **kwargs):
261274
@p.target_path
262275
@p.threads
263276
@p.vars
264-
@p.version_check
265277
@requires.postflight
266278
@requires.preflight
267279
@requires.profile
@@ -284,6 +296,7 @@ def docs_generate(ctx, **kwargs):
284296
# dbt docs serve
285297
@docs.command("serve")
286298
@click.pass_context
299+
@global_flags
287300
@p.browser
288301
@p.port
289302
@p.profile
@@ -312,6 +325,7 @@ def docs_serve(ctx, **kwargs):
312325
# dbt compile
313326
@cli.command("compile")
314327
@click.pass_context
328+
@global_flags
315329
@p.defer
316330
@p.deprecated_defer
317331
@p.exclude
@@ -335,7 +349,6 @@ def docs_serve(ctx, **kwargs):
335349
@p.target_path
336350
@p.threads
337351
@p.vars
338-
@p.version_check
339352
@requires.postflight
340353
@requires.preflight
341354
@requires.profile
@@ -359,6 +372,7 @@ def compile(ctx, **kwargs):
359372
# dbt show
360373
@cli.command("show")
361374
@click.pass_context
375+
@global_flags
362376
@p.defer
363377
@p.deprecated_defer
364378
@p.exclude
@@ -382,7 +396,6 @@ def compile(ctx, **kwargs):
382396
@p.target_path
383397
@p.threads
384398
@p.vars
385-
@p.version_check
386399
@requires.postflight
387400
@requires.preflight
388401
@requires.profile
@@ -406,14 +419,14 @@ def show(ctx, **kwargs):
406419
# dbt debug
407420
@cli.command("debug")
408421
@click.pass_context
422+
@global_flags
409423
@p.debug_connection
410424
@p.config_dir
411425
@p.profile
412426
@p.profiles_dir_exists_false
413427
@p.project_dir
414428
@p.target
415429
@p.vars
416-
@p.version_check
417430
@requires.postflight
418431
@requires.preflight
419432
def debug(ctx, **kwargs):
@@ -432,6 +445,7 @@ def debug(ctx, **kwargs):
432445
# dbt deps
433446
@cli.command("deps")
434447
@click.pass_context
448+
@global_flags
435449
@p.profile
436450
@p.profiles_dir_exists_false
437451
@p.project_dir
@@ -452,6 +466,7 @@ def deps(ctx, **kwargs):
452466
# dbt init
453467
@cli.command("init")
454468
@click.pass_context
469+
@global_flags
455470
# for backwards compatibility, accept 'project_name' as an optional positional argument
456471
@click.argument("project_name", required=False)
457472
@p.profile
@@ -474,6 +489,7 @@ def init(ctx, **kwargs):
474489
# dbt list
475490
@cli.command("list")
476491
@click.pass_context
492+
@global_flags
477493
@p.exclude
478494
@p.indirect_selection
479495
@p.models
@@ -519,14 +535,14 @@ def list(ctx, **kwargs):
519535
# dbt parse
520536
@cli.command("parse")
521537
@click.pass_context
538+
@global_flags
522539
@p.profile
523540
@p.profiles_dir
524541
@p.project_dir
525542
@p.target
526543
@p.target_path
527544
@p.threads
528545
@p.vars
529-
@p.version_check
530546
@requires.postflight
531547
@requires.preflight
532548
@requires.profile
@@ -543,12 +559,12 @@ def parse(ctx, **kwargs):
543559
# dbt run
544560
@cli.command("run")
545561
@click.pass_context
562+
@global_flags
546563
@p.defer
547564
@p.deprecated_defer
548565
@p.favor_state
549566
@p.deprecated_favor_state
550567
@p.exclude
551-
@p.fail_fast
552568
@p.full_refresh
553569
@p.profile
554570
@p.profiles_dir
@@ -562,7 +578,6 @@ def parse(ctx, **kwargs):
562578
@p.target_path
563579
@p.threads
564580
@p.vars
565-
@p.version_check
566581
@requires.postflight
567582
@requires.preflight
568583
@requires.profile
@@ -585,14 +600,14 @@ def run(ctx, **kwargs):
585600
# dbt retry
586601
@cli.command("retry")
587602
@click.pass_context
603+
@global_flags
588604
@p.project_dir
589605
@p.profiles_dir
590606
@p.vars
591607
@p.profile
592608
@p.target
593609
@p.state
594610
@p.threads
595-
@p.fail_fast
596611
@requires.postflight
597612
@requires.preflight
598613
@requires.profile
@@ -615,6 +630,7 @@ def retry(ctx, **kwargs):
615630
# dbt clone
616631
@cli.command("clone")
617632
@click.pass_context
633+
@global_flags
618634
@p.defer_state
619635
@p.exclude
620636
@p.full_refresh
@@ -629,7 +645,6 @@ def retry(ctx, **kwargs):
629645
@p.target_path
630646
@p.threads
631647
@p.vars
632-
@p.version_check
633648
@requires.preflight
634649
@requires.profile
635650
@requires.project
@@ -652,6 +667,7 @@ def clone(ctx, **kwargs):
652667
# dbt run operation
653668
@cli.command("run-operation")
654669
@click.pass_context
670+
@global_flags
655671
@click.argument("macro")
656672
@p.args
657673
@p.profile
@@ -683,6 +699,7 @@ def run_operation(ctx, **kwargs):
683699
# dbt seed
684700
@cli.command("seed")
685701
@click.pass_context
702+
@global_flags
686703
@p.exclude
687704
@p.full_refresh
688705
@p.profile
@@ -698,7 +715,6 @@ def run_operation(ctx, **kwargs):
698715
@p.target_path
699716
@p.threads
700717
@p.vars
701-
@p.version_check
702718
@requires.postflight
703719
@requires.preflight
704720
@requires.profile
@@ -720,6 +736,7 @@ def seed(ctx, **kwargs):
720736
# dbt snapshot
721737
@cli.command("snapshot")
722738
@click.pass_context
739+
@global_flags
723740
@p.defer
724741
@p.deprecated_defer
725742
@p.exclude
@@ -759,13 +776,15 @@ def snapshot(ctx, **kwargs):
759776
# dbt source
760777
@cli.group()
761778
@click.pass_context
779+
@global_flags
762780
def source(ctx, **kwargs):
763781
"""Manage your project's sources"""
764782

765783

766784
# dbt source freshness
767785
@source.command("freshness")
768786
@click.pass_context
787+
@global_flags
769788
@p.exclude
770789
@p.output_path # TODO: Is this ok to re-use? We have three different output params, how much can we consolidate?
771790
@p.profile
@@ -808,10 +827,10 @@ def freshness(ctx, **kwargs):
808827
# dbt test
809828
@cli.command("test")
810829
@click.pass_context
830+
@global_flags
811831
@p.defer
812832
@p.deprecated_defer
813833
@p.exclude
814-
@p.fail_fast
815834
@p.favor_state
816835
@p.deprecated_favor_state
817836
@p.indirect_selection
@@ -828,7 +847,6 @@ def freshness(ctx, **kwargs):
828847
@p.target_path
829848
@p.threads
830849
@p.vars
831-
@p.version_check
832850
@requires.postflight
833851
@requires.preflight
834852
@requires.profile

0 commit comments

Comments
 (0)