示例#1
0
def gather(
    *, schema: types.Schema, logical_name: str, schemas: types.Schemas
) -> types.ObjectArtifacts:
    """
    Collect artifacts from a specification for constructing an object reference.

    Get the prepared specification, reference logical name, back reference and foreign
    key column name from a raw object specification.

    Raise MalformedRelationshipError if neither $ref nor $allOf is found.
    Raise MalformedRelationshipError if uselist is defined but backref is not.
    Raise MalformedRelationshipError if multiple $ref, x-backref, x-secondary,
    x-foreign-key-column or x-uselist are found.

    Args:
        schema: The schema for the column.
        schemas: Used to resolve any $ref.
        logical_name: The logical name in the specification for the schema.

    Returns:
        The prepared specification, reference logical name, back reference and foreign
        key column.

    """
    intermediary_obj_artifacts = _handle_schema(
        logical_name=logical_name, schema=schema, schemas=schemas
    )

    # Check if uselist is defined and backref is not
    if (
        intermediary_obj_artifacts.uselist is not None
        and intermediary_obj_artifacts.backref is None
    ):
        raise exceptions.MalformedRelationshipError(
            "Relationships with x-uselist defined must also define x-backref."
        )

    # Construct back reference
    back_reference = None
    if intermediary_obj_artifacts.backref is not None:
        back_reference = types.BackReferenceArtifacts(
            property_name=intermediary_obj_artifacts.backref,
            uselist=intermediary_obj_artifacts.uselist,
        )

    return types.ObjectArtifacts(
        spec=intermediary_obj_artifacts.ref_schema,
        fk_column=intermediary_obj_artifacts.fk_column_name,
        relationship=types.RelationshipArtifacts(
            model_name=intermediary_obj_artifacts.ref_model_name,
            back_reference=back_reference,
            secondary=intermediary_obj_artifacts.secondary,
            kwargs=intermediary_obj_artifacts.kwargs,
        ),
        nullable=intermediary_obj_artifacts.nullable,
        description=intermediary_obj_artifacts.description,
    )
示例#2
0
def test_record():
    """
    GIVEN artifacts, schemas, whether the reference is from an array and the model name
    WHEN record is called with the arguments
    THEN the back reference schema is recorded on the references model.
    """
    artifacts = types.ObjectArtifacts(
        spec={},
        logical_name="logical name 1",
        fk_column="fk_column",
        relationship=types.RelationshipArtifacts(
            model_name="RefModel",
            back_reference=types.BackReferenceArtifacts(property_name="model"),
        ),
    )
    schemas = {"RefModel": {"type": "object", "properties": {}}}

    backref.record(artifacts=artifacts,
                   ref_from_array=False,
                   model_name="Model",
                   schemas=schemas)

    assert schemas == {
        "RefModel": {
            "allOf": [
                {
                    "type": "object",
                    "properties": {}
                },
                {
                    "type": "object",
                    "x-backrefs": {
                        "model": {
                            "type": "array",
                            "items": {
                                "type": "object",
                                "x-de-$ref": "Model"
                            },
                        }
                    },
                },
            ]
        }
    }
示例#3
0
    def test_valid(ref_from_array, uselist, secondary, expected_schema):
        """
        GIVEN whether referenced from array, uselist, secondary, model name
        WHEN _calculate_schema is called with the parameters
        THEN the given expected schema is returned.
        """
        artifacts = types.ObjectArtifacts(
            spec={},
            fk_column="fk_column",
            relationship=types.RelationshipArtifacts(
                model_name="RefModel",
                back_reference=types.BackReferenceArtifacts(
                    property_name="model", uselist=uselist
                ),
                secondary=secondary,
            ),
        )

        returned_schema = backref._calculate_schema(
            artifacts=artifacts, ref_from_array=ref_from_array, model_name="Model"
        )

        assert returned_schema == expected_schema
示例#4
0
    WHEN the name is retrieved from facades.sqlalchemy
    THEN the expected value is returned.
    """
    returned_value = getattr(facades.sqlalchemy, name)

    assert returned_value == expected_value


@pytest.mark.parametrize(
    "artifacts, exp_argument, exp_backref, exp_uselist, exp_secondary",
    [
        (types.RelationshipArtifacts("RefModel"), "RefModel", None, None,
         None),
        (
            types.RelationshipArtifacts(
                "RefModel", types.BackReferenceArtifacts("BackRefModel")),
            "RefModel",
            "BackRefModel",
            None,
            None,
        ),
        (
            types.RelationshipArtifacts(
                "RefModel", types.BackReferenceArtifacts("BackRefModel",
                                                         True)),
            "RefModel",
            "BackRefModel",
            True,
            None,
        ),
        (