コード例 #1
0
def test_enum_to_execution():
    @op(
        config_schema={
            "my_enum":
            Field(Enum.from_python_enum(TestEnum),
                  is_required=False,
                  default_value="ONE")
        })
    def my_op(context):
        return context.op_config["my_enum"]

    @graph
    def my_graph():
        my_op()

    my_job = my_graph.to_job()
    result = my_job.execute_in_process()
    assert result.success
    assert result.output_for_node("my_op") == TestEnum.ONE

    result = my_graph.execute_in_process(
        run_config={"ops": {
            "my_op": {
                "config": {
                    "my_enum": "TWO"
                }
            }
        }})
    assert result.success
    assert result.output_for_node("my_op") == TestEnum.TWO
コード例 #2
0
def test_receive_processed_config_values():
    class TestEnum(enum.Enum):
        FOO = 1
        BAR = 2

    enum_conf_schema = {
        "foo":
        Field(Enum.from_python_enum(TestEnum),
              is_required=False,
              default_value="BAR")
    }

    @config_mapping(config_schema=enum_conf_schema)
    def processed_config_mapping(outer_config):
        return {"ops": {"my_op": {"config": {"foo": outer_config["foo"]}}}}

    processed_result = my_graph.to_job(
        config=processed_config_mapping).execute_in_process()
    assert processed_result.success
    assert processed_result.output_for_node("my_op") == TestEnum.BAR

    @config_mapping(config_schema=enum_conf_schema,
                    receive_processed_config_values=False)
    def unprocessed_config_mapping(outer_config):
        return {"ops": {"my_op": {"config": {"foo": outer_config["foo"]}}}}

    unprocessed_result = my_graph.to_job(
        config=unprocessed_config_mapping).execute_in_process()
    assert unprocessed_result.success
    assert unprocessed_result.output_for_node("my_op") == "BAR"
コード例 #3
0
def test_native_enum_dagster_enum_from_classmethod_default_value():
    dagster_enum = Enum.from_python_enum(NativeEnum)
    called = {}

    @solid(config=Field(dagster_enum, is_required=False, default_value='BAR'))
    def enum_name_as_str(context):
        assert context.solid_config == NativeEnum.BAR
        called['str'] = True

    @solid(config=Field(dagster_enum,
                        is_required=False,
                        default_value=NativeEnum.BAR))
    def enum_direct(context):
        assert context.solid_config == NativeEnum.BAR
        called['enum'] = True

    @pipeline
    def test():
        enum_direct()
        enum_name_as_str()

    result = execute_pipeline(test)
    assert result.success
    assert called['str']
    assert called['enum']
コード例 #4
0
def test_native_enum_not_allowed_as_default_value():
    dagster_enum = Enum.from_python_enum(NativeEnum)

    with pytest.raises(DagsterInvalidDefinitionError) as exc_info:

        @solid(config_schema=Field(dagster_enum, is_required=False, default_value=NativeEnum.BAR))
        def _enum_direct(_):
            pass

    assert str(exc_info.value) == (
        "You have passed into a python enum value as the default value into "
        "of a config enum type NativeEnum. You must pass in the underlying string "
        "represention as the default value. One of ['FOO', 'BAR']."
    )
コード例 #5
0
def test_list_enum_with_bad_default_value():
    dagster_enum = Enum.from_python_enum(NativeEnum)

    with pytest.raises(DagsterInvalidConfigError) as exc_info:

        @solid(config=Field([dagster_enum], is_required=False, default_value=[NativeEnum.BAR]))
        def _bad_enum_list(_):
            pass

    # This error message is bad
    # https://github.com/dagster-io/dagster/issues/2339
    assert 'Invalid default_value for Field.' in str(exc_info.value)
    assert 'Error 1: Value at path root[0] for enum type NativeEnum must be a string' in str(
        exc_info.value
    )
コード例 #6
0
ファイル: test_config_enums.py プロジェクト: nikie/dagster
def test_native_enum_dagster_enum_from_classmethod():
    dagster_enum = Enum.from_python_enum(NativeEnum)
    called = {}

    @solid(config=dagster_enum)
    def dagster_enum_me(context):
        assert context.solid_config == NativeEnum.BAR
        called['yup'] = True

    pipeline_def = PipelineDefinition(
        name='native_enum_dagster_pipeline', solid_defs=[dagster_enum_me]
    )

    result = execute_pipeline(pipeline_def, {'solids': {'dagster_enum_me': {'config': 'BAR'}}})
    assert result.success
    assert called['yup']
コード例 #7
0
def test_native_enum_dagster_enum_from_classmethod():
    dagster_enum = Enum.from_python_enum(NativeEnum)
    called = {}

    @solid(config_schema=dagster_enum)
    def dagster_enum_me(context):
        assert context.solid_config == NativeEnum.BAR
        called["yup"] = True

    pipeline_def = PipelineDefinition(
        name="native_enum_dagster_pipeline", solid_defs=[dagster_enum_me]
    )

    result = execute_pipeline(pipeline_def, {"solids": {"dagster_enum_me": {"config": "BAR"}}})
    assert result.success
    assert called["yup"]
コード例 #8
0
def test_dict_enum_with_default():
    dagster_enum = Enum.from_python_enum(NativeEnum)

    called = {}

    @solid(config_schema={"enum": Field(dagster_enum, is_required=False, default_value="BAR")})
    def enum_dict(context):
        assert context.solid_config["enum"] == NativeEnum.BAR
        called["yup"] = True

    @pipeline
    def enum_dict_pipeline():
        enum_dict()

    result = execute_pipeline(enum_dict_pipeline)

    assert result.success
    assert called["yup"]
コード例 #9
0
def test_list_enum_with_default_value():
    dagster_enum = Enum.from_python_enum(NativeEnum)

    called = {}

    @solid(config_schema=Field([dagster_enum], is_required=False, default_value=["BAR"]))
    def enum_list(context):
        assert context.solid_config == [NativeEnum.BAR]
        called["yup"] = True

    @pipeline
    def enum_list_pipeline():
        enum_list()

    result = execute_pipeline(enum_list_pipeline)

    assert result.success
    assert called["yup"]
コード例 #10
0
def test_native_enum_classmethod_creates_all_values():
    dagster_enum = Enum.from_python_enum(NativeEnum)
    for enum_value in NativeEnum:
        assert enum_value is dagster_enum.to_python_value(enum_value.name)
コード例 #11
0
def test_enum_config_mapping():
    @op(
        config_schema={
            "my_enum":
            Field(Enum.from_python_enum(TestEnum),
                  is_required=False,
                  default_value="ONE")
        })
    def my_op(context):
        return context.op_config["my_enum"]

    @graph
    def my_graph():
        my_op()

    def _use_defaults_mapping(_):
        return {}

    use_defaults = my_graph.to_job(config=ConfigMapping(
        config_fn=_use_defaults_mapping))
    result = use_defaults.execute_in_process()
    assert result.success
    assert result.output_for_node("my_op") == TestEnum.ONE

    def _override_defaults_mapping(_):
        return {"ops": {"my_op": {"config": {"my_enum": "TWO"}}}}

    override_defaults = my_graph.to_job(config=ConfigMapping(
        config_fn=_override_defaults_mapping))
    result = override_defaults.execute_in_process()
    assert result.success
    assert result.output_for_node("my_op") == TestEnum.TWO

    def _ingest_config_mapping(x):
        return {"ops": {"my_op": {"config": {"my_enum": x["my_field"]}}}}

    default_config_mapping = ConfigMapping(
        config_fn=_ingest_config_mapping,
        config_schema=Shape({
            "my_field":
            Field(Enum.from_python_enum(TestEnum),
                  is_required=False,
                  default_value="TWO")
        }),
        receive_processed_config_values=False,
    )
    ingest_mapping = my_graph.to_job(config=default_config_mapping)
    result = ingest_mapping.execute_in_process()
    assert result.success
    assert result.output_for_node("my_op") == TestEnum.TWO

    no_default_config_mapping = ConfigMapping(
        config_fn=_ingest_config_mapping,
        config_schema=Shape({
            "my_field":
            Field(Enum.from_python_enum(TestEnum), is_required=True)
        }),
        receive_processed_config_values=False,
    )
    ingest_mapping_no_default = my_graph.to_job(
        config=no_default_config_mapping)
    result = ingest_mapping_no_default.execute_in_process(
        run_config={"my_field": "TWO"})
    assert result.success
    assert result.output_for_node("my_op") == TestEnum.TWO

    def _ingest_post_processed_config(x):
        assert x["my_field"] == TestEnum.TWO
        return {"ops": {"my_op": {"config": {"my_enum": "TWO"}}}}

    config_mapping_with_preprocessing = ConfigMapping(
        config_fn=_ingest_post_processed_config,
        config_schema=Shape({
            "my_field":
            Field(Enum.from_python_enum(TestEnum), is_required=True)
        }),
    )
    ingest_preprocessing = my_graph.to_job(
        config=config_mapping_with_preprocessing)
    result = ingest_preprocessing.execute_in_process(
        run_config={"my_field": "TWO"})
    assert result.success
    assert result.output_for_node("my_op") == TestEnum.TWO