7
7
import os
8
8
import sys
9
9
from pathlib import Path
10
- from typing import Any , Dict , Tuple
10
+ from typing import Set , Tuple , Union
11
11
12
12
import anyio
13
13
import click
14
+ from connector_ops .utils import Connector , ConnectorLanguage , console , get_all_released_connectors
14
15
from pipelines import main_logger
15
16
from pipelines .builds import run_connector_build_pipeline
16
17
from pipelines .contexts import ConnectorContext , ContextState , PublishConnectorContext
19
20
from pipelines .pipelines .connectors import run_connectors_pipelines
20
21
from pipelines .publish import reorder_contexts , run_connector_publish_pipeline
21
22
from pipelines .tests import run_connector_test_pipeline
22
- from pipelines .utils import DaggerPipelineCommand , get_modified_connectors
23
- from connector_ops .utils import ConnectorLanguage , console , get_all_released_connectors
23
+ from pipelines .utils import DaggerPipelineCommand , get_connector_modified_files , get_modified_connectors_and_files
24
24
from rich .table import Table
25
25
from rich .text import Text
26
26
@@ -87,45 +87,26 @@ def connectors(
87
87
88
88
ctx .ensure_object (dict )
89
89
ctx .obj ["use_remote_secrets" ] = use_remote_secrets
90
- ctx .obj ["connector_names " ] = names
91
- ctx .obj ["connector_languages " ] = languages
92
- ctx .obj ["release_states " ] = release_stages
93
- ctx .obj ["modified " ] = modified
90
+ ctx .obj ["selected_connectors_names " ] = set ( names ) if names else set ()
91
+ ctx .obj ["selected_connectors_languages " ] = set ( languages ) if languages else set ()
92
+ ctx .obj ["selected_connectors_release_stages " ] = set ( release_stages ) if release_stages else set ()
93
+ ctx .obj ["select_modified_connectors " ] = modified
94
94
ctx .obj ["concurrency" ] = concurrency
95
95
ctx .obj ["execute_timeout" ] = execute_timeout
96
-
97
- all_connectors = get_all_released_connectors ()
98
-
99
- # We get the modified connectors and downstream connector deps, and files
100
- modified_connectors_and_files = get_modified_connectors (ctx .obj ["modified_files" ])
101
-
102
- # We select all connectors by default
103
- # and attach modified files to them
104
- selected_connectors_and_files = {connector : modified_connectors_and_files .get (connector , []) for connector in all_connectors }
105
-
106
- if modified :
107
- selected_connectors_and_files = modified_connectors_and_files
108
- if names :
109
- selected_connectors_and_files = {
110
- connector : selected_connectors_and_files [connector ]
111
- for connector in selected_connectors_and_files
112
- if connector .technical_name in names
113
- }
114
- if languages :
115
- selected_connectors_and_files = {
116
- connector : selected_connectors_and_files [connector ]
117
- for connector in selected_connectors_and_files
118
- if connector .language in languages
119
- }
120
- if release_stages :
121
- selected_connectors_and_files = {
122
- connector : selected_connectors_and_files [connector ]
123
- for connector in selected_connectors_and_files
124
- if connector .release_stage in release_stages
125
- }
126
-
127
- ctx .obj ["selected_connectors_and_files" ] = selected_connectors_and_files
128
- ctx .obj ["selected_connectors_names" ] = [c .technical_name for c in selected_connectors_and_files .keys ()]
96
+ ctx .obj ["all_connectors" ] = get_all_released_connectors ()
97
+ ctx .obj ["selected_connectors_by_names" ] = {Connector (technical_name = name ) for name in names }
98
+ ctx .obj ["selected_connectors_by_languages" ] = {connector for connector in ctx .obj ["all_connectors" ] if connector .language in languages }
99
+ ctx .obj ["selected_connectors_by_release_stages" ] = {
100
+ connector for connector in ctx .obj ["all_connectors" ] if connector .release_stage in release_stages
101
+ }
102
+ ctx .obj ["selected_connectors" ] = (
103
+ ctx .obj ["selected_connectors_by_names" ]
104
+ | ctx .obj ["selected_connectors_by_languages" ]
105
+ | ctx .obj ["selected_connectors_by_release_stages" ]
106
+ )
107
+ ctx .obj ["selected_connectors_and_files" ] = {
108
+ connector : get_connector_modified_files (connector , ctx .obj ["modified_files" ]) for connector in ctx .obj ["selected_connectors" ]
109
+ }
129
110
130
111
131
112
@connectors .command (cls = DaggerPipelineCommand , help = "Test all the selected connectors." )
@@ -142,7 +123,13 @@ def test(
142
123
main_logger .info ("Skipping connectors tests for draft pull request." )
143
124
sys .exit (0 )
144
125
145
- main_logger .info (f"Will run the test pipeline for the following connectors: { ', ' .join (ctx .obj ['selected_connectors_names' ])} " )
126
+ if ctx .obj ["select_modified_connectors" ]:
127
+ ctx .obj ["selected_connectors_and_files" ] = {
128
+ ** ctx .obj ["selected_connectors_and_files" ],
129
+ ** get_modified_connectors_and_files (ctx .obj ["modified_files" ]),
130
+ }
131
+ main_logger .info (ctx .obj )
132
+ log_selected_connectors (ctx .obj ["selected_connectors_and_files" ])
146
133
if ctx .obj ["selected_connectors_and_files" ]:
147
134
update_global_commit_status_check_for_tests (ctx .obj , "pending" )
148
135
else :
@@ -198,7 +185,14 @@ def send_commit_status_check() -> None:
198
185
@connectors .command (cls = DaggerPipelineCommand , help = "Build all images for the selected connectors." )
199
186
@click .pass_context
200
187
def build (ctx : click .Context ) -> bool :
201
- main_logger .info (f"Will build the following connectors: { ', ' .join (ctx .obj ['selected_connectors_names' ])} ." )
188
+ """Runs a build pipeline for the selected connectors."""
189
+ if ctx .obj ["select_modified_connectors" ]:
190
+ ctx .obj ["selected_connectors_and_files" ] = {
191
+ ** ctx .obj ["selected_connectors_and_files" ],
192
+ ** get_modified_connectors_and_files (ctx .obj ["modified_files" ]),
193
+ }
194
+
195
+ log_selected_connectors (ctx .obj ["selected_connectors_and_files" ])
202
196
connectors_contexts = [
203
197
ConnectorContext (
204
198
pipeline_name = f"Build connector { connector .technical_name } " ,
@@ -305,17 +299,19 @@ def publish(
305
299
ctx .obj ["spec_cache_bucket_name" ] = spec_cache_bucket_name
306
300
ctx .obj ["metadata_service_bucket_name" ] = metadata_service_bucket_name
307
301
ctx .obj ["metadata_service_gcs_credentials" ] = metadata_service_gcs_credentials
308
-
309
302
if ctx .obj ["is_local" ]:
310
303
click .confirm (
311
- "Publishing from a local environment is not recommend and requires to be logged in Airbyte's DockerHub registry, do you want to continue?" ,
304
+ "Publishing from a local environment is not recommended and requires to be logged in Airbyte's DockerHub registry, do you want to continue?" ,
312
305
abort = True ,
313
306
)
314
307
315
- selected_connectors_and_files = ctx .obj ["selected_connectors_and_files" ]
316
- selected_connectors_names = ctx .obj ["selected_connectors_names" ]
308
+ if ctx .obj ["select_modified_connectors" ]:
309
+ ctx .obj ["selected_connectors_and_files" ] = {
310
+ ** ctx .obj ["selected_connectors_and_files" ],
311
+ ** get_modified_connectors_and_files (ctx .obj ["modified_files" ], metadata_modification_only = True , dependency_scanning = False ),
312
+ }
317
313
318
- main_logger . info ( f"Will publish the following connectors: { ', ' . join ( selected_connectors_names ) } " )
314
+ log_selected_connectors ( ctx . obj [ "selected_connectors_and_files" ] )
319
315
publish_connector_contexts = reorder_contexts (
320
316
[
321
317
PublishConnectorContext (
@@ -342,7 +338,7 @@ def publish(
342
338
ci_gcs_credentials = ctx .obj ["ci_gcs_credentials" ],
343
339
pull_request = ctx .obj .get ("pull_request" ),
344
340
)
345
- for connector , modified_files in selected_connectors_and_files .items ()
341
+ for connector , modified_files in ctx . obj [ " selected_connectors_and_files" ] .items ()
346
342
]
347
343
)
348
344
@@ -394,23 +390,18 @@ def list(
394
390
return True
395
391
396
392
397
- @connectors .command (cls = DaggerPipelineCommand , help = "Autoformat connector code." )
393
+ @connectors .command (name = "format" , cls = DaggerPipelineCommand , help = "Autoformat connector code." )
398
394
@click .pass_context
399
- def format (ctx : click .Context ) -> bool :
400
- if ctx .obj ["modified" ]:
401
- # We only want to format the connector that with modified files on the current branch.
402
- connectors_and_files_to_format = [
403
- (connector , modified_files ) for connector , modified_files in ctx .obj ["selected_connectors_and_files" ].items () if modified_files
404
- ]
405
- else :
406
- # We explicitly want to format specific connectors
407
- connectors_and_files_to_format = [
408
- (connector , modified_files ) for connector , modified_files in ctx .obj ["selected_connectors_and_files" ].items ()
409
- ]
395
+ def format_code (ctx : click .Context ) -> bool :
396
+ if ctx .obj ["select_modified_connectors" ]:
397
+ ctx .obj ["selected_connectors_and_files" ] = {
398
+ ** ctx .obj ["selected_connectors_and_files" ],
399
+ ** get_modified_connectors_and_files (ctx .obj ["modified_files" ]),
400
+ }
410
401
411
- if connectors_and_files_to_format :
402
+ if ctx . obj [ "selected_connectors_and_files" ] :
412
403
main_logger .info (
413
- f"Will format the following connectors: { ', ' .join ([connector .technical_name for connector , _ in connectors_and_files_to_format ])} ."
404
+ f"Will format the following connectors: { ', ' .join ([connector .technical_name for connector , _ in ctx . obj [ 'selected_connectors_and_files' ]. keys () ])} ."
414
405
)
415
406
else :
416
407
main_logger .info ("No connectors to format." )
@@ -435,7 +426,7 @@ def format(ctx: click.Context) -> bool:
435
426
pull_request = ctx .obj .get ("pull_request" ),
436
427
should_save_report = False ,
437
428
)
438
- for connector , modified_files in connectors_and_files_to_format
429
+ for connector , modified_files in ctx . obj [ "selected_connectors_and_files" ]. items ()
439
430
]
440
431
441
432
anyio .run (
@@ -449,3 +440,11 @@ def format(ctx: click.Context) -> bool:
449
440
)
450
441
451
442
return True
443
+
444
+
445
+ def log_selected_connectors (selected_connectors_and_files : dict [Connector , Set [Union [str , Path ]]]) -> None :
446
+ if selected_connectors_and_files :
447
+ selected_connectors_names = [c .technical_name for c in selected_connectors_and_files .keys ()]
448
+ main_logger .info (f"Will run on the following connectors: { ', ' .join (selected_connectors_names )} ." )
449
+ else :
450
+ main_logger .info ("No connectors to run." )
0 commit comments