예제 #1
0
    def eval(self, dataset: Dataset, library: MessageLibrary):
        metadata = dataset.metadata
        reference_value = self._extract_value(self._reference_name, metadata)
        if reference_value is None:
            return Issue(
                ISSUE_TYPE_ERROR,
                "Requested field not contained in metadata: " +
                self._reference_name)

        compare_value = self._extract_value(self._compare_name, metadata)
        if compare_value is None:
            return Issue(
                ISSUE_TYPE_ERROR,
                "Requested field not contained in metadata: " +
                self._compare_name)

        if self._operator(reference_value, compare_value):
            return None
        else:
            message_dict = GapAwareDict({
                "reference": self._reference_name,
                "ref_val": reference_value,
                "compare": self._compare_name,
                "comp_val": compare_value
            })
            if self._error is not None:
                error_message = library.resolve_error(self._error,
                                                      message_dict)
                return Issue(ISSUE_TYPE_ERROR, error_message)
            if self._warning is not None:
                warning_message = library.resolve_warning(
                    self._warning, message_dict)
                return Issue(ISSUE_TYPE_WARNING, warning_message)
예제 #2
0
    def eval(self,
             unit: str,
             values: List[str],
             library: MessageLibrary,
             missing_value: float = None) -> Optional[List[Issue]]:
        issues = []

        if unit not in self._units:
            message_dict = GapAwareDict({
                "field_name": self._name,
                "unit": self._units,
                "bad_unit": unit
            })
            error_message = library.resolve_error(self._unit_error,
                                                  message_dict)
            issues.append(Issue(ISSUE_TYPE_ERROR, error_message))

        index = 0
        for value in values:
            index += 1
            message_dict = GapAwareDict({
                "field_name": self._name,
                "line": index
            })
            if not self._time_string_pattern.match(value):
                error_message = library.resolve_error("@invalid_time_record",
                                                      message_dict)
                issues.append(Issue(ISSUE_TYPE_ERROR, error_message))
                continue

            tokens = value.split(":")
            hour = int(tokens[0])
            minute = int(tokens[1])
            second = int(tokens[2])

            if hour not in self._hour_range \
                    or minute not in self._min_sec_range \
                    or second not in self._min_sec_range:
                error_message = library.resolve_error("@invalid_time_value",
                                                      message_dict)
                issues.append(Issue(ISSUE_TYPE_ERROR, error_message))
                continue

        if len(issues) > 0:
            return issues

        return None
    def eval(self, dataset: Dataset, library: MessageLibrary):
        if not self._name in dataset.metadata:
            return None

        value = dataset.metadata[self._name]
        if len(value) > 0:
            return None
        else:
            message_dict = GapAwareDict({"reference": self._name})
            warning_message = library.resolve_warning(self._warning,
                                                      message_dict)
            return Issue(ISSUE_TYPE_WARNING, warning_message)
예제 #4
0
    def test_to_ref(self):
        dsvr = DatasetValidationResult(
            status="ERROR",
            issues=[
                Issue(type="ERROR", description="Yo, not like that my son")
            ])
        sf = SubmissionFile(index=11,
                            submission_id="yeswecan",
                            filename="is_a_secret",
                            filetype="a cool one",
                            status=QC_STATUS_SUBMITTED,
                            result=dsvr)

        sfr = sf.to_ref()
        self.assertEqual(11, sfr.index)
        self.assertEqual("yeswecan", sfr.submission_id)
        self.assertEqual("is_a_secret", sfr.filename)
        self.assertEqual("a cool one", sfr.filetype)
        self.assertEqual(QC_STATUS_SUBMITTED, sfr.status)
예제 #5
0
    def test_to_submission(self):
        files = [
            SubmissionFile(submission_id="submitme",
                           index=0,
                           filename="Hans",
                           filetype="black",
                           status=QC_STATUS_SUBMITTED,
                           result=DatasetValidationResult(status="OK",
                                                          issues=[])),
            SubmissionFile(submission_id="submitme",
                           index=1,
                           filename="Helga",
                           filetype="green",
                           status=QC_STATUS_VALIDATED,
                           result=DatasetValidationResult(
                               status="WARNING",
                               issues=[
                                   Issue(type="WARNING",
                                         description="This might be wrong")
                               ]))
        ]
        db_subm = DbSubmission(status="Hellyeah",
                               user_id='Tom',
                               submission_id="submitme",
                               files=files,
                               qc_status="OK",
                               path="/root/hell/yeah",
                               date=datetime(2001, 2, 3, 4, 5, 6),
                               store_sub_path='Tom_Helge')

        subm = db_subm.to_submission()

        self.assertEqual(datetime(2001, 2, 3, 4, 5, 6), subm.date)
        self.assertEqual(2, len(subm.file_refs))
        self.assertEqual("Hans", subm.file_refs[0].filename)
        self.assertEqual(0, subm.file_refs[0].index)
예제 #6
0
    def eval(self,
             unit: str,
             values: List[str],
             library: MessageLibrary,
             missing_value: float = None) -> Optional[List[Issue]]:
        empty = ""
        issues = []

        index = 1
        for value in values:
            if value is empty:
                message_dict = GapAwareDict({
                    "field_name": self._name,
                    "line": index
                })
                error_message = library.resolve_error(self._error,
                                                      message_dict)
                issues.append(Issue(ISSUE_TYPE_ERROR, error_message))
            index += 1

        if len(issues) > 0:
            return issues

        return None
예제 #7
0
    def test_to_dict(self):
        files = [
            SubmissionFile(submission_id="submitme",
                           index=0,
                           filename="Hans",
                           filetype="DOC",
                           status=QC_STATUS_SUBMITTED,
                           result=DatasetValidationResult(status="OK",
                                                          issues=[])),
            SubmissionFile(submission_id="submitme",
                           index=1,
                           filename="Helga",
                           filetype="MEAS",
                           status=QC_STATUS_VALIDATED,
                           result=DatasetValidationResult(
                               status="WARNING",
                               issues=[
                                   Issue(type="WARNING",
                                         description="This might be wrong")
                               ]))
        ]
        subm = DbSubmission(
            status="Hellyeah",
            user_id='Tom',
            submission_id="submitme",
            path="/the/archive/root/",
            files=files,
            qc_status="warning",
            date=datetime(2001, 2, 3, 4, 5, 6),
            publication_date=datetime(2002, 2, 3, 4, 5, 6),
            allow_publication=True,
            store_sub_path='Tom_Helge',
        )

        self.assertEqual(
            {
                'date':
                datetime(2001, 2, 3, 4, 5, 6),
                'file_refs': [],
                'files': [{
                    'filename': 'Hans',
                    'filetype': 'DOC',
                    'index': 0,
                    'result': {
                        'issues': [],
                        'status': 'OK'
                    },
                    'status': QC_STATUS_SUBMITTED,
                    'submission_id': 'submitme'
                }, {
                    'filename': 'Helga',
                    'filetype': 'MEAS',
                    'index': 1,
                    'result': {
                        'issues': [{
                            'description': 'This might be wrong',
                            'type': 'WARNING'
                        }],
                        'status':
                        'WARNING'
                    },
                    'status': QC_STATUS_VALIDATED,
                    'submission_id': 'submitme'
                }],
                'id':
                None,
                'path':
                '/the/archive/root/',
                'publication_date':
                datetime(2002, 2, 3, 4, 5, 6),
                'allow_publication':
                True,
                'qc_status':
                'warning',
                'status':
                'Hellyeah',
                'submission_id':
                'submitme',
                'store_sub_path':
                'Tom_Helge',
                'user_id':
                'Tom'
            }, subm.to_dict())
예제 #8
0
    def eval(self,
             unit: str,
             values: List[float],
             library: MessageLibrary,
             missing_value: float = None) -> Optional[List[Issue]]:
        issues = []

        if unit not in self._units:
            message_dict = GapAwareDict({
                "field_name": self._name,
                "unit": self._units,
                "bad_unit": unit
            })
            error_message = library.resolve_error(self._unit_error,
                                                  message_dict)
            issues.append(Issue(ISSUE_TYPE_ERROR, error_message))

        line = 1
        message_dict = GapAwareDict({
            "field_name": self._name,
            "line": line,
            "value": 0,
            "lower_bound": self._lower_bound,
            "upper_bound": self._upper_bound
        })

        for value in values:
            out_of_bounds = False
            if not (type(value) is float or type(value) is int):
                message_dict["line"] = line
                message_dict["value"] = value
                error_message = library.resolve_error(
                    "@field_number_not_a_number", message_dict)
                issues.append(Issue(ISSUE_TYPE_ERROR, error_message))
                line += 1
                continue

            if missing_value is not None and value == missing_value:
                line += 1
                continue

            if not math.isnan(self._lower_bound):
                if value < self._lower_bound:
                    out_of_bounds = True

            if not math.isnan(self._upper_bound):
                if value > self._upper_bound:
                    out_of_bounds = True

            if out_of_bounds:
                message_dict["line"] = line
                message_dict["value"] = value
                error_message = library.resolve_error(self._value_error,
                                                      message_dict)
                issues.append(Issue(ISSUE_TYPE_ERROR, error_message))

            line += 1

        if len(issues) > 0:
            return issues

        return None
 def create_error_message(self, library):
     message_dict = GapAwareDict({"reference": self._name})
     error_message = library.resolve_error(self._error, message_dict)
     return Issue(ISSUE_TYPE_ERROR, error_message)
예제 #10
0
 def _append_warning_issue(self, message, index, issues, library):
     error_message = self._assemble_error_message(index, library, message)
     issues.append(Issue(ISSUE_TYPE_WARNING, error_message))
예제 #11
0
 def _append_error_issue(self, message, index, issues, library):
     error_message = self._assemble_error_message(index, library, message)
     issues.append(Issue(ISSUE_TYPE_ERROR, error_message))