Skip to content

Commit 3718eb6

Browse files
committed
Rename ImporterNode -> Importer, ResolverNode -> Resolver, Resolver -> ResolverStrategy.
Deprecation stubs are kept for backwards compatibility. PiperOrigin-RevId: 355237003
1 parent 74d7b28 commit 3718eb6

36 files changed

+572
-493
lines changed

RELEASE.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,15 @@
5656
`${HOME}/tfx/kubeflow` or `${HOME}/kubeflow` but those will not be used
5757
any more.
5858
* The `tfx.components.common_nodes.importer_node.ImporterNode` class has been
59-
moved to `tfx.dsl.components.common.importer_node.ImporterNode`, with its
59+
moved to `tfx.dsl.components.common.importer.Importer`, with its
60+
old module path kept as a deprecated alias, which will be removed in a
61+
future version.
62+
* The `tfx.components.common_nodes.resolver_node.ResolverNode` class has been
63+
moved to `tfx.dsl.components.common.resolver.Resolver`, with its
64+
old module path kept as a deprecated alias, which will be removed in a
65+
future version.
66+
* The `tfx.dsl.resolvers.BaseResolver` class has been
67+
moved to `tfx.dsl.components.common.resolver.ResolverStrategy`, with its
6068
old module path kept as a deprecated alias, which will be removed in a
6169
future version.
6270

tfx/components/common_nodes/importer_node.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,30 +12,30 @@
1212
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
15-
"""Deprecated location for the TFX ImporterNode.
15+
"""Deprecated location for the TFX Importer.
1616
17-
The new location is `tfx.dsl.components.common.importer_node.ImporterNode`.
17+
The new location is `tfx.dsl.components.common.importer.Importer`.
1818
"""
1919
from __future__ import absolute_import
2020
from __future__ import division
2121
from __future__ import print_function
2222

23-
from tfx.dsl.components.common import importer_node
23+
from tfx.dsl.components.common import importer
2424
from tfx.utils import deprecation_utils
2525

2626

2727
# Constant to access importer importing result from importer output dict.
28-
IMPORT_RESULT_KEY = importer_node.IMPORT_RESULT_KEY
28+
IMPORT_RESULT_KEY = importer.IMPORT_RESULT_KEY
2929
# Constant to access artifact uri from importer exec_properties dict.
30-
SOURCE_URI_KEY = importer_node.SOURCE_URI_KEY
30+
SOURCE_URI_KEY = importer.SOURCE_URI_KEY
3131
# Constant to access artifact properties from importer exec_properties dict.
32-
PROPERTIES_KEY = importer_node.PROPERTIES_KEY
32+
PROPERTIES_KEY = importer.PROPERTIES_KEY
3333
# Constant to access artifact properties from importer exec_properties dict.
34-
CUSTOM_PROPERTIES_KEY = importer_node.CUSTOM_PROPERTIES_KEY
34+
CUSTOM_PROPERTIES_KEY = importer.CUSTOM_PROPERTIES_KEY
3535
# Constant to access re-import option from importer exec_properties dict.
36-
REIMPORT_OPTION_KEY = importer_node.REIMPORT_OPTION_KEY
36+
REIMPORT_OPTION_KEY = importer.REIMPORT_OPTION_KEY
3737

3838
ImporterNode = deprecation_utils.deprecated_alias( # pylint: disable=invalid-name
3939
deprecated_name='tfx.components.common_nodes.importer_node.ImporterNode',
40-
name='tfx.dsl.components.common.importer_node.ImporterNode',
41-
func_or_class=importer_node.ImporterNode)
40+
name='tfx.dsl.components.common.importer.Importer',
41+
func_or_class=importer.Importer)

tfx/components/common_nodes/resolver_node.py

Lines changed: 60 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,26 +12,75 @@
1212
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
15-
"""Deprecated location for the TFX ResolverNode.
15+
"""Deprecated location for the TFX Resolver.
1616
17-
The new location is `tfx.dsl.components.common.resolver_node.ResolverNode`.
17+
The new location is `tfx.dsl.components.common.resolver.Resolver`.
1818
"""
1919
from __future__ import absolute_import
2020
from __future__ import division
2121
from __future__ import print_function
2222

23-
from tfx.dsl.components.common import resolver_node
23+
from typing import Dict, Text, Type
24+
25+
from tfx import types
26+
from tfx.dsl.components.common import resolver
2427
from tfx.utils import deprecation_utils
28+
from tfx.utils import json_utils
29+
30+
31+
def _make_deprecated_resolver_node_alias():
32+
"""Make ResolverNode alias class.
33+
34+
Make the deprecation shim for ResolverNode. Needed to conform to the
35+
convention expected by `tfx.utils.deprecation_utils` and to translate renamed
36+
constructor arguments.
37+
38+
Returns:
39+
Deprecated ResolverNode alias class.
40+
"""
41+
parent_deprecated_class = deprecation_utils.deprecated_alias( # pylint: disable=invalid-name
42+
deprecated_name='tfx.components.common_nodes.resolver_node.ResolverNode',
43+
name='tfx.dsl.components.common.resolver.ResolverNode',
44+
func_or_class=resolver.Resolver)
45+
46+
class _NewDeprecatedClass(parent_deprecated_class):
47+
"""Deprecated ResolverNode alias constructor.
48+
49+
This class location is DEPRECATED and is provided temporarily for
50+
compatibility. Please use `tfx.dsl.components.common.resolver.Resolver`
51+
instead.
52+
"""
53+
54+
def __init__(self,
55+
instance_name: Text,
56+
resolver_class: Type[resolver.ResolverStrategy],
57+
resolver_configs: Dict[Text, json_utils.JsonableType] = None,
58+
**kwargs: types.Channel):
59+
"""Forwarding shim for deprecated ResolverNode alias constructor.
60+
61+
Args:
62+
instance_name: the name of the Resolver instance.
63+
resolver_class: a ResolverStrategy subclass which contains the artifact
64+
resolution logic.
65+
resolver_configs: a dict of key to Jsonable type representing
66+
configuration that will be used to construct the resolver strategy.
67+
**kwargs: a key -> Channel dict, describing what are the Channels to be
68+
resolved. This is set by user through keyword args.
69+
"""
70+
super(ResolverNode, self).__init__(
71+
instance_name=instance_name,
72+
strategy_class=resolver_class,
73+
config=resolver_configs,
74+
**kwargs)
75+
76+
return _NewDeprecatedClass
2577

2678
# Constant to access resolver class from resolver exec_properties.
27-
RESOLVER_CLASS = resolver_node.RESOLVER_CLASS
79+
RESOLVER_CLASS = resolver.RESOLVER_STRATEGY_CLASS
2880
# Constant to access resolver config from resolver exec_properties.
29-
RESOLVER_CONFIGS = resolver_node.RESOLVER_CONFIGS
81+
RESOLVER_CONFIGS = resolver.RESOLVER_CONFIG
3082

31-
RESOLVER_CLASS_LIST = resolver_node.RESOLVER_CLASS_LIST
32-
RESOLVER_CONFIG_LIST = resolver_node.RESOLVER_CONFIG_LIST
83+
RESOLVER_CLASS_LIST = resolver.RESOLVER_STRATEGY_CLASS_LIST
84+
RESOLVER_CONFIG_LIST = resolver.RESOLVER_CONFIG_LIST
3385

34-
ResolverNode = deprecation_utils.deprecated_alias( # pylint: disable=invalid-name
35-
deprecated_name='tfx.components.common_nodes.resolver_node.ResolverNode',
36-
name='tfx.dsl.components.common.resolver_node.ResolverNode',
37-
func_or_class=resolver_node.ResolverNode)
86+
ResolverNode = _make_deprecated_resolver_node_alias()

tfx/dsl/compiler/compiler.py

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@
1818
from typing import cast, List, Mapping, Iterable
1919

2020
from tfx import types
21-
from tfx.components.common_nodes import importer_node
22-
from tfx.components.common_nodes import resolver_node as resolver_consts
2321
from tfx.dsl.compiler import compiler_utils
2422
from tfx.dsl.compiler import constants
2523
from tfx.dsl.components.base import base_component
2624
from tfx.dsl.components.base import base_driver
2725
from tfx.dsl.components.base import base_node
26+
from tfx.dsl.components.common import importer
27+
from tfx.dsl.components.common import resolver
2828
from tfx.orchestration import data_types
2929
from tfx.orchestration import data_types_utils
3030
from tfx.orchestration import pipeline
@@ -80,7 +80,7 @@ def _compile_importer_node_outputs(self, tfx_node: base_node.BaseNode,
8080

8181
# Attach additional properties for artifacts produced by importer nodes.
8282
for property_name, property_value in tfx_node.exec_properties[
83-
importer_node.PROPERTIES_KEY].items():
83+
importer.PROPERTIES_KEY].items():
8484
_check_property_value_type(property_name, property_value, artifact_type)
8585
value_field = output_spec.artifact_spec.additional_properties[
8686
property_name].field_value
@@ -92,7 +92,7 @@ def _compile_importer_node_outputs(self, tfx_node: base_node.BaseNode,
9292
tfx_node.id, property_name, type(property_value)))
9393

9494
for property_name, property_value in tfx_node.exec_properties[
95-
importer_node.CUSTOM_PROPERTIES_KEY].items():
95+
importer.CUSTOM_PROPERTIES_KEY].items():
9696
value_field = output_spec.artifact_spec.additional_custom_properties[
9797
property_name].field_value
9898
try:
@@ -229,8 +229,8 @@ def _compile_node(
229229
# Ignore following two properties for a importer node, because they are
230230
# already attached to the artifacts produced by the importer node.
231231
if compiler_utils.is_importer(tfx_node) and (
232-
key == importer_node.PROPERTIES_KEY or
233-
key == importer_node.CUSTOM_PROPERTIES_KEY):
232+
key == importer.PROPERTIES_KEY or
233+
key == importer.CUSTOM_PROPERTIES_KEY):
234234
continue
235235
parameter_value = node.parameters.parameters[key]
236236

@@ -474,15 +474,14 @@ def _iterate_resolver_cls_and_config(resolver_node: base_node.BaseNode):
474474
"""Iterates through resolver class and configs that are bind to the node."""
475475
assert compiler_utils.is_resolver(resolver_node)
476476
exec_properties = resolver_node.exec_properties
477-
if (resolver_consts.RESOLVER_CLASS in exec_properties
478-
and resolver_consts.RESOLVER_CONFIGS in exec_properties):
479-
yield (exec_properties[resolver_consts.RESOLVER_CLASS],
480-
exec_properties[resolver_consts.RESOLVER_CONFIGS])
481-
elif (resolver_consts.RESOLVER_CLASS_LIST in exec_properties
482-
and resolver_consts.RESOLVER_CONFIG_LIST in exec_properties):
483-
yield from zip(
484-
exec_properties[resolver_consts.RESOLVER_CLASS_LIST],
485-
exec_properties[resolver_consts.RESOLVER_CONFIG_LIST])
477+
if (resolver.RESOLVER_STRATEGY_CLASS in exec_properties and
478+
resolver.RESOLVER_CONFIG in exec_properties):
479+
yield (exec_properties[resolver.RESOLVER_STRATEGY_CLASS],
480+
exec_properties[resolver.RESOLVER_CONFIG])
481+
elif (resolver.RESOLVER_STRATEGY_CLASS_LIST in exec_properties and
482+
resolver.RESOLVER_CONFIG_LIST in exec_properties):
483+
yield from zip(exec_properties[resolver.RESOLVER_STRATEGY_CLASS_LIST],
484+
exec_properties[resolver.RESOLVER_CONFIG_LIST])
486485
else:
487486
raise ValueError(f"Invalid ResolverNode exec_properties: {exec_properties}")
488487

tfx/dsl/compiler/compiler_resolver_node_test.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
from tfx.dsl.components.base import base_component
2323
from tfx.dsl.components.base import base_executor
2424
from tfx.dsl.components.base import executor_spec
25-
from tfx.dsl.components.common import resolver_node
25+
from tfx.dsl.components.common import resolver
2626
from tfx.dsl.resolvers import base_resolver
2727
from tfx.orchestration import metadata
2828
from tfx.orchestration import pipeline
@@ -31,7 +31,7 @@
3131
from tfx.types.component_spec import ComponentSpec
3232

3333

34-
class ResolverNode(resolver_node.ResolverNode):
34+
class ResolverNode(resolver.Resolver):
3535

3636
def override_output_dict(self, **output_dict):
3737
self._output_dict.clear()
@@ -273,10 +273,10 @@ def test_multiple_downstream_nodes(self):
273273
def test_sequential_resolver_nodes(self):
274274
a = DummyComponents.A()
275275
r1 = ResolverNode('R1', DummyResolver,
276-
resolver_configs={'iam': 'r1'},
276+
config={'iam': 'r1'},
277277
x=a.outputs['x'])
278278
r2 = ResolverNode('R2', DummyResolver,
279-
resolver_configs={'iam': 'r2'},
279+
config={'iam': 'r2'},
280280
x=r1.outputs['x'])
281281
b = DummyComponents.B(x=r2.outputs['x'])
282282
pipeline_ir = self.compile_async_pipeline([a, r1, r2, b])
@@ -301,10 +301,10 @@ def test_sequential_resolver_nodes(self):
301301
def test_sequential_resolver_nodes_with_skip_connection(self):
302302
a = DummyComponents.A()
303303
r1 = ResolverNode('R1', DummyResolver,
304-
resolver_configs={'iam': 'r1'},
304+
config={'iam': 'r1'},
305305
x=a.outputs['x'])
306306
r2 = ResolverNode('R2', DummyResolver,
307-
resolver_configs={'iam': 'r2'},
307+
config={'iam': 'r2'},
308308
x=r1.outputs['x'],
309309
y=a.outputs['y'])
310310
b = DummyComponents.B(x=r1.outputs['x'],

tfx/dsl/compiler/compiler_test.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
from tfx.dsl.compiler.testdata import additional_properties_test_pipeline_async
2323
from tfx.dsl.compiler.testdata import iris_pipeline_async
2424
from tfx.dsl.compiler.testdata import iris_pipeline_sync
25-
from tfx.dsl.components.common import importer_node
25+
from tfx.dsl.components.common import importer
2626
from tfx.orchestration import pipeline
2727
from tfx.proto.orchestration import pipeline_pb2
2828
from tfx.utils import import_utils
@@ -78,9 +78,9 @@ def testCompileAdditionalPropertyTypeError(self):
7878
def testCompileImporterAdditionalPropertyTypeError(self):
7979
dsl_compiler = compiler.Compiler()
8080
test_pipeline = self._get_test_pipeline_definition(iris_pipeline_async)
81-
importer = next(
81+
impt = next(
8282
c for c in test_pipeline.components if compiler_utils.is_importer(c))
83-
importer.exec_properties[importer_node.PROPERTIES_KEY]["split_names"] = 2.1
83+
impt.exec_properties[importer.PROPERTIES_KEY]["split_names"] = 2.1
8484
with self.assertRaisesRegex(TypeError, "Expected STRING but given DOUBLE"):
8585
dsl_compiler.compile(test_pipeline)
8686

tfx/dsl/compiler/compiler_utils.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323

2424
from tfx import types
2525
from tfx.dsl.components.base import base_node
26-
from tfx.dsl.components.common import importer_node
27-
from tfx.dsl.components.common import resolver_node
26+
from tfx.dsl.components.common import importer
27+
from tfx.dsl.components.common import resolver
2828
from tfx.orchestration import pipeline
2929
from tfx.proto.orchestration import pipeline_pb2
3030

@@ -91,13 +91,13 @@ def resolve_execution_mode(tfx_pipeline: pipeline.Pipeline):
9191

9292

9393
def is_resolver(node: base_node.BaseNode) -> bool:
94-
"""Helper function to check if a TFX node is a ResolverNode."""
95-
return isinstance(node, resolver_node.ResolverNode)
94+
"""Helper function to check if a TFX node is a Resolver."""
95+
return isinstance(node, resolver.Resolver)
9696

9797

9898
def is_importer(node: base_node.BaseNode) -> bool:
99-
"""Helper function to check if a TFX node is an ImporterNode."""
100-
return isinstance(node, importer_node.ImporterNode)
99+
"""Helper function to check if a TFX node is an Importer."""
100+
return isinstance(node, importer.Importer)
101101

102102

103103
def ensure_topological_order(nodes: List[base_node.BaseNode]) -> bool:

tfx/dsl/compiler/compiler_utils_test.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323
from tfx.dsl.components.base import base_component
2424
from tfx.dsl.components.base import base_executor
2525
from tfx.dsl.components.base import executor_spec
26-
from tfx.dsl.components.common import importer_node
27-
from tfx.dsl.components.common import resolver_node
26+
from tfx.dsl.components.common import importer
27+
from tfx.dsl.components.common import resolver
2828
from tfx.dsl.experimental import latest_blessed_model_resolver
2929
from tfx.orchestration import pipeline
3030
from tfx.proto.orchestration import pipeline_pb2
@@ -64,29 +64,29 @@ def testSetRuntimeParameterPb(self):
6464
self.assertEqual(expected_pb, pb)
6565

6666
def testIsResolver(self):
67-
resolver = resolver_node.ResolverNode(
67+
resv = resolver.Resolver(
6868
instance_name="test_resolver_name",
69-
resolver_class=latest_blessed_model_resolver.LatestBlessedModelResolver)
70-
self.assertTrue(compiler_utils.is_resolver(resolver))
71-
resolver = legacy_resolver_node.ResolverNode(
69+
strategy_class=latest_blessed_model_resolver.LatestBlessedModelResolver)
70+
self.assertTrue(compiler_utils.is_resolver(resv))
71+
resv = legacy_resolver_node.ResolverNode(
7272
instance_name="test_resolver_name",
7373
resolver_class=latest_blessed_model_resolver.LatestBlessedModelResolver)
74-
self.assertTrue(compiler_utils.is_resolver(resolver))
74+
self.assertTrue(compiler_utils.is_resolver(resv))
7575

7676
example_gen = CsvExampleGen(input=external_input("data_path"))
7777
self.assertFalse(compiler_utils.is_resolver(example_gen))
7878

7979
def testIsImporter(self):
80-
importer = importer_node.ImporterNode(
80+
impt = importer.Importer(
8181
instance_name="import_schema",
8282
source_uri="uri/to/schema",
8383
artifact_type=standard_artifacts.Schema)
84-
self.assertTrue(compiler_utils.is_importer(importer))
85-
importer = legacy_importer_node.ImporterNode(
84+
self.assertTrue(compiler_utils.is_importer(impt))
85+
impt = legacy_importer_node.ImporterNode(
8686
instance_name="import_schema",
8787
source_uri="uri/to/schema",
8888
artifact_type=standard_artifacts.Schema)
89-
self.assertTrue(compiler_utils.is_importer(importer))
89+
self.assertTrue(compiler_utils.is_importer(impt))
9090

9191
example_gen = CsvExampleGen(input=external_input("data_path"))
9292
self.assertFalse(compiler_utils.is_importer(example_gen))

tfx/dsl/compiler/testdata/iris_pipeline_async_ir.pbtxt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,9 @@ nodes {
105105
pipeline_node {
106106
node_info {
107107
type {
108-
name: "tfx.dsl.components.common.importer_node.ImporterNode"
108+
name: "tfx.dsl.components.common.importer.Importer"
109109
}
110-
id: "ImporterNode.my_importer"
110+
id: "Importer.my_importer"
111111
}
112112
contexts {
113113
contexts {
@@ -126,7 +126,7 @@ nodes {
126126
}
127127
name {
128128
field_value {
129-
string_value: "iris.ImporterNode.my_importer"
129+
string_value: "iris.Importer.my_importer"
130130
}
131131
}
132132
}

0 commit comments

Comments
 (0)