コード例 #1
0
def test_uses_first_schema_that_returns_true_for_condition_that_uses_data():
    class BaseMetadataSchema(Schema):
        metadata = fields.Method("get_metadata")

    class Schema1(BaseMetadataSchema):
        def get_metadata(self, data):
            return {"field1": data["metadata"]["field1"]}

    class Schema2(BaseMetadataSchema):
        def get_metadata(self, data):
            return {"field2": data["metadata"]["field2"]}

    class Schema3(BaseMetadataSchema):
        def get_metadata(self, data):
            return {"field3": data["metadata"]["field3"]}

    data = {
        "field1": "value1",
        "field2": "value2",
        "field3": "value3",
        "types": [2, 3]
    }
    serializer = ConditionalMultiSchemaJSONSerializer([
        (lambda data: 1 in data["metadata"]["types"], Schema1),
        (lambda data: 2 in data["metadata"]["types"], Schema2),
        (lambda data: 3 in data["metadata"]["types"], Schema3),
    ])
    serialized = json.loads(
        serializer.serialize(
            PersistentIdentifier(pid_type="recid", pid_value="1"),
            InspireRecord(data)))

    assert serialized["metadata"] == {"field2": "value2"}
コード例 #2
0
def test_returns_arxiv_eprints_from_the_resolved_record(
        mock_get_linked_records_in_field):
    mock_get_linked_records_in_field.return_value = [
        InspireRecord({
            "control_number":
            123,
            "arxiv_eprints": [{
                "value": "1606.09129",
                "categories": "hep"
            }],
        })
    ]

    hep_schema = load_schema("hep")
    subschema = hep_schema["properties"]["references"]
    schema = ReferenceItemSchemaV1()
    dump = {"record": {"$ref": "http://localhost:5000/api/literature/123"}}
    assert validate([dump], subschema) is None

    expected = {
        "control_number": 123,
        "arxiv_eprint": [{
            "value": "1606.09129"
        }]
    }
    result = schema.dumps(dump).data
    assert expected == json.loads(result)
コード例 #3
0
ファイル: receivers.py プロジェクト: inspirehep/inspirehep
def index_after_commit(sender, changes):
    """Index a record in ES after it was committed to the DB.

    This cannot happen in an ``after_record_commit`` receiver from Invenio-Records
    because, despite the name, at that point we are not yet sure whether the record
    has been really committed to the DB.
    """
    for model_instance, change in changes:
        if isinstance(model_instance, RecordMetadata):
            if change in ("insert", "update", "delete"):
                LOGGER.debug(
                    "Record commited, indexing.",
                    change=change,
                    uuid=str(model_instance.id),
                )
                force_delete = "delete" == change
                InspireRecord(
                    model_instance.json,
                    model=model_instance).index(force_delete=force_delete)
                if "new_record" in model_instance.json:
                    redirect_references_to_merged_record.delay(
                        str(model_instance.id))
                if (PidStoreBase.get_pid_type_from_schema(
                        model_instance.json["$schema"]) == "lit"
                        and "documents" in model_instance.json and
                        current_app.config["FEATURE_FLAG_ENABLE_FULLTEXT"]):
                    index_fulltext.delay(str(model_instance.id),
                                         model_instance.version_id)
コード例 #4
0
def index_after_commit(sender, changes):
    """Index a record in ES after it was committed to the DB.

    This cannot happen in an ``after_record_commit`` receiver from Invenio-Records
    because, despite the name, at that point we are not yet sure whether the record
    has been really committed to the DB.
    """
    for model_instance, change in changes:
        if isinstance(model_instance, RecordMetadata):
            if change in ("insert", "update", "delete"):
                LOGGER.debug(
                    f"Record commited, indexing.",
                    change=change,
                    uuid=str(model_instance.id),
                )
                force_delete = "delete" == change
                InspireRecord(
                    model_instance.json,
                    model=model_instance).index(force_delete=force_delete)
                if (change != "delete" and current_app.
                        config["FEATURE_FLAG_ENABLE_AUTHOR_DISAMBIGUATION"]):
                    disambiguate_authors.delay(str(model_instance.id))
                if "new_record" in model_instance.json:
                    redirect_references_to_merged_record.delay(
                        str(model_instance.id))
コード例 #5
0
def test_returns_no_misc_if_titles_persent_in_the_resolved_record(
    mock_get_linked_records_in_field,
):
    mock_get_linked_records_in_field.return_value = [
        InspireRecord(
            {
                "control_number": 123,
                "titles": [
                    {
                        "source": "arXiv",
                        "title": "Theoretical limit of residual amplitude modulation in electro-optic modulators",  # noqa
                    },
                    {
                        "source": "arXiv",
                        "title": "Fundamental level of residual amplitude modulation in phase modulation processes",  # noqa
                    },
                ],
            }
        )
    ]

    hep_schema = load_schema("hep")
    subschema = hep_schema["properties"]["references"]
    schema = ReferenceItemSchemaV1()
    dump = {
        "record": {"$ref": "http://localhost:5000/api/literature/123"},
        "reference": {"label": "123", "misc": ["A misc"]},
    }
    assert validate([dump], subschema) is None

    result = schema.dumps(dump).data
    assert "misc" not in orjson.loads(result)
コード例 #6
0
ファイル: test_api_base.py プロジェクト: tsgit/inspirehep
def test_get_linked_records_in_field_empty(inspire_app):
    expected_result_len = 0
    expected_result = []
    record = InspireRecord({})
    result = record.get_linked_records_from_field("references.record")
    result = list(result)

    assert expected_result_len == len(result)
    assert expected_result == result
コード例 #7
0
ファイル: test_api_base.py プロジェクト: michamos/inspirehep
def test_get_linked_records_in_field_empty(base_app, db, es,
                                           create_record_factory):
    expected_result_len = 0
    expected_result = []
    record = InspireRecord({})
    result = record.get_linked_records_from_field("references.record")
    result = list(result)

    assert expected_result_len == len(result)
    assert expected_result == result
コード例 #8
0
    def create_from_kwargs(cls,
                           index_name="",
                           disable_persistent_identifier=False,
                           **kwargs):
        instance = cls()

        updated_kwargs = copy.deepcopy(kwargs)
        if not kwargs.pop("id", None):
            updated_kwargs["id"] = uuid.uuid4()

        json_ = copy.deepcopy(cls.JSON_SKELETON)
        json_.update(kwargs.pop("json", {}))

        if kwargs.get("pid_type", "lit") == "lit" and "titles" not in json_:
            json_.update({"titles": [{"title": generate_random_string(60)}]})
        if "control_number" not in json_:
            json_["control_number"] = get_next_free_recid()
        else:
            reserve_recid(json_["control_number"])

        updated_kwargs["json"] = json_

        instance.record_metadata = super(
            TestRecordMetadata, cls).create_from_kwargs(updated_kwargs)

        if index_name:
            instance.es_index_result = es.index(
                index=index_name,
                body=instance.record_metadata.json,
                params={})
            instance.es_refresh_result = es.indices.refresh(index_name)
        if not disable_persistent_identifier:
            instance.persistent_identifier = (
                TestPersistentIdentifier.create_from_kwargs(
                    object_uuid=instance.record_metadata.id,
                    pid_value=instance.record_metadata.json.get(
                        "control_number"),
                    **kwargs).persistent_identifier)

        instance.inspire_record = InspireRecord(instance.record_metadata.json,
                                                model=RecordMetadata)

        return instance
コード例 #9
0
def test_returns_dois_from_the_resolved_record(mock_get_linked_records_in_field):
    mock_get_linked_records_in_field.return_value = [
        InspireRecord(
            {"control_number": 123, "dois": [{"value": "10.1103/PhysRevD.94.054021"}]}
        )
    ]

    hep_schema = load_schema("hep")
    subschema = hep_schema["properties"]["references"]
    schema = ReferenceItemSchemaV1()
    dump = {"record": {"$ref": "http://localhost:5000/api/literature/123"}}
    assert validate([dump], subschema) is None

    expected = {
        "control_number": 123,
        "dois": [{"value": "10.1103/PhysRevD.94.054021"}],
    }
    result = schema.dumps(dump).data
    assert expected == orjson.loads(result)
コード例 #10
0
def index_after_commit(sender, changes):
    """Index a record in ES after it was committed to the DB.

    This cannot happen in an ``after_record_commit`` receiver from Invenio-Records
    because, despite the name, at that point we are not yet sure whether the record
    has been really committed to the DB.
    """
    for model_instance, change in changes:
        if isinstance(model_instance, RecordMetadata):
            if change in ("insert", "update", "delete"):
                LOGGER.debug(
                    f"Record commited, indexing.",
                    change=change,
                    uuid=str(model_instance.id),
                )
                force_delete = "delete" == change
                InspireRecord(
                    model_instance.json,
                    model=model_instance).index(force_delete=force_delete)
コード例 #11
0
def test_first_conditionless_schema_if_others_do_not_return_true():
    class BaseMetadataSchema(Schema):
        metadata = fields.Method("get_metadata")

    class Schema1(BaseMetadataSchema):
        def get_metadata(self, data):
            return {"field1": data["metadata"]["field1"]}

    class Schema2(BaseMetadataSchema):
        def get_metadata(self, data):
            return {"field2": data["metadata"]["field2"]}

    data = {"field1": "value1", "field2": "value2"}
    serializer = ConditionalMultiSchemaJSONSerializer([(lambda _: False,
                                                        Schema1),
                                                       (None, Schema2)])
    serialized = json.loads(
        serializer.serialize(
            PersistentIdentifier(pid_type="recid", pid_value="1"),
            InspireRecord(data)))

    assert serialized["metadata"] == {"field2": "value2"}
コード例 #12
0
ファイル: test_api_base.py プロジェクト: tsgit/inspirehep
def test_record_throws_exception_when_serializer_is_not_set(inspire_app):
    record_metadata = create_record_factory("lit")
    record = InspireRecord(record_metadata.json)
    with pytest.raises(MissingSerializerError):
        record.get_enhanced_es_data()