Run all validators in the validations folder if not manually run

Remove ValidationIssueType and ValidationIssueSeverity objects
This commit is contained in:
Quincy Morgan
2019-02-01 13:38:17 -05:00
parent 46f3cea33a
commit 973697b8ba
12 changed files with 69 additions and 100 deletions
+35 -44
View File
@@ -13,24 +13,6 @@ import { osmEntity } from '../osm';
import { utilRebind } from '../util/rebind';
import * as Validations from '../validations/index';
export var ValidationIssueType = {
deprecated_tag: 'deprecated_tag',
disconnected_way: 'disconnected_way',
many_deletions: 'many_deletions',
missing_tag: 'missing_tag',
old_multipolygon: 'old_multipolygon',
tag_suggests_area: 'tag_suggests_area',
maprules: 'maprules',
crossing_ways: 'crossing_ways',
almost_junction: 'almost_junction',
generic_name: 'generic_name'
};
export var ValidationIssueSeverity = {
warning: 'warning',
error: 'error',
};
export function coreValidator(context) {
var dispatch = d3_dispatch('reload'),
self = {},
@@ -40,12 +22,24 @@ export function coreValidator(context) {
var validations = _filter(Validations, _isFunction).reduce(function(obj, validation) {
var func = validation();
if (!func.type) {
throw new Error('Validation type not found: ' + validation);
console.log('Validation rule not found for: ' + validation);
}
obj[func.type] = func;
return obj;
}, {});
var entityValidationIds = [],
changesValidationIds = [];
for (var key in validations) {
var validation = validations[key];
if (validation.inputType && validation.inputType === 'changes') {
changesValidationIds.push(key);
} else {
entityValidationIds.push(key);
}
}
self.featureApplicabilityOptions = ['edited', 'all'];
var featureApplicability = context.storage('issue-features') || 'edited';
@@ -85,35 +79,35 @@ export function coreValidator(context) {
return issuesByEntityId[entityID];
};
var genericEntityValidations = [
ValidationIssueType.deprecated_tag,
ValidationIssueType.generic_name,
ValidationIssueType.maprules,
ValidationIssueType.old_multipolygon
];
function validateEntity(entity) {
var issues = [];
var ranValidations = new Set([]);
// runs validation and appends resulting issues, returning true if validation passed
function runValidation(type) {
var fn = validations[type];
var typeIssues = fn(entity, context);
issues = issues.concat(typeIssues);
ranValidations.add(type);
return typeIssues.length === 0;
}
// other validations require feature to be tagged
if (!runValidation(ValidationIssueType.missing_tag)) return issues;
if (!runValidation('missing_tag')) return issues;
if (entity.type === 'way') {
if (runValidation(ValidationIssueType.almost_junction)) {
// only check for disconnected highway if no almost junctions
runValidation(ValidationIssueType.disconnected_way);
// only check for disconnected way if no almost junctions
if (runValidation('almost_junction')) {
runValidation('disconnected_way');
} else {
ranValidations.add('disconnected_way');
}
runValidation(ValidationIssueType.crossing_ways);
runValidation(ValidationIssueType.tag_suggests_area);
runValidation('crossing_ways');
runValidation('tag_suggests_area');
}
genericEntityValidations.forEach(function(fn) {
runValidation(fn);
})
// run all validations not yet run manually
entityValidationIds.forEach(function(ruleId) {
if (!ranValidations.has(ruleId)) {
runValidation(ruleId);
}
});
return issues;
}
@@ -127,7 +121,10 @@ export function coreValidator(context) {
var entitiesToCheck = changes.created.concat(changes.modified);
var graph = history.graph();
issues = issues.concat(validations.many_deletions(changes, context));
issues = _flatten(_map(changesValidationIds, function(ruleId) {
var validation = validations[ruleId];
return validation(changes, context);
}));
entitiesToCheck = _uniq(_flattenDeep(_map(entitiesToCheck, function(entity) {
var entities = [entity];
@@ -187,14 +184,8 @@ export function validationIssue(attrs) {
return id;
};
if (!_isObject(attrs)) throw new Error('Input attrs is not an object');
if (!attrs.type || !ValidationIssueType.hasOwnProperty(attrs.type)) {
throw new Error('Invalid attrs.type: ' + attrs.type);
}
if (!attrs.severity || !ValidationIssueSeverity.hasOwnProperty(attrs.severity)) {
throw new Error('Invalid attrs.severity: ' + attrs.severity);
}
if (!attrs.message) throw new Error('attrs.message is empty');
if (!_isObject(attrs)) console.log('Input attrs is not an object');
if (!attrs.message) console.log('attrs.message is empty');
this.type = attrs.type;
this.severity = attrs.severity;
+3 -6
View File
@@ -4,10 +4,7 @@ import _reduce from 'lodash-es/reduce';
import _every from 'lodash-es/every';
import { areaKeys } from '../core/context';
import {
ValidationIssueType,
ValidationIssueSeverity,
validationIssue
} from '../core/validator';
@@ -221,10 +218,10 @@ export default {
findIssues: function (entity, graph, issues) {
if (this.geometryMatches(entity, graph) && this.matches(entity)) {
var severity = Object.keys(selector).indexOf('error') > -1
? ValidationIssueSeverity.error
: ValidationIssueSeverity.warning;
? 'error'
: 'warning';
issues.push(new validationIssue({
type: ValidationIssueType.maprules,
type: 'maprules',
severity: severity,
message: selector[severity],
entities: [entity],
+3 -5
View File
@@ -15,8 +15,6 @@ import {
} from '../actions';
import { t } from '../util/locale';
import {
ValidationIssueType,
ValidationIssueSeverity,
validationIssue,
validationIssueFix
} from '../core/validator';
@@ -146,8 +144,8 @@ export function validationAlmostJunction() {
}));
}
issues.push(new validationIssue({
type: ValidationIssueType.almost_junction,
severity: ValidationIssueSeverity.warning,
type: 'almost_junction',
severity: 'warning',
message: t('issues.almost_junction.message', {
feature: utilDisplayLabel(endHighway, context),
feature2: utilDisplayLabel(edgeHighway, context)
@@ -166,7 +164,7 @@ export function validationAlmostJunction() {
return issues;
};
validation.type = ValidationIssueType.almost_junction;
validation.type = 'almost_junction';
return validation;
}
+3 -5
View File
@@ -6,8 +6,6 @@ import { set as d3_set } from 'd3-collection';
import { utilDisplayLabel } from '../util';
import { t } from '../util/locale';
import {
ValidationIssueType,
ValidationIssueSeverity,
validationIssue,
validationIssueFix
} from '../core/validator';
@@ -345,8 +343,8 @@ export function validationCrossingWays() {
}
issues.push(new validationIssue({
type: ValidationIssueType.crossing_ways,
severity: ValidationIssueSeverity.warning,
type: 'crossing_ways',
severity: 'warning',
message: t('issues.crossing_ways.message', messageDict),
tooltip: t('issues.crossing_ways.'+crossingTypeID+'.tip'),
entities: entities,
@@ -360,7 +358,7 @@ export function validationCrossingWays() {
return issues;
};
validation.type = ValidationIssueType.crossing_ways;
validation.type = 'crossing_ways';
return validation;
}
+3 -5
View File
@@ -5,8 +5,6 @@ import {
utilTagText
} from '../util';
import {
ValidationIssueType,
ValidationIssueSeverity,
validationIssue,
validationIssueFix
} from '../core/validator';
@@ -26,8 +24,8 @@ export function validationDeprecatedTag() {
var tagsLabel = utilTagText({ tags: deprecatedTags.old });
var featureLabel = utilDisplayLabel(change, context);
issues.push(new validationIssue({
type: ValidationIssueType.deprecated_tags,
severity: ValidationIssueSeverity.warning,
type: 'deprecated_tags',
severity: 'warning',
message: t('issues.deprecated_tags.message', { feature: featureLabel, tags: tagsLabel }),
tooltip: t('issues.deprecated_tags.tip'),
entities: [change],
@@ -82,7 +80,7 @@ export function validationDeprecatedTag() {
return issues;
};
validation.type = ValidationIssueType.deprecated_tag;
validation.type = 'deprecated_tag';
return validation;
}
+3 -5
View File
@@ -3,8 +3,6 @@ import {
utilDisplayLabel
} from '../util';
import {
ValidationIssueType,
ValidationIssueSeverity,
validationIssue,
validationIssueFix
} from '../core/validator';
@@ -39,8 +37,8 @@ export function validationDisconnectedWay() {
var entityLabel = utilDisplayLabel(entity, context);
issues.push(new validationIssue({
type: ValidationIssueType.disconnected_way,
severity: ValidationIssueSeverity.warning,
type: 'disconnected_way',
severity: 'warning',
message: t('issues.disconnected_way.highway.message', { highway: entityLabel }),
tooltip: t('issues.disconnected_way.highway.tip'),
entities: [entity],
@@ -81,7 +79,7 @@ export function validationDisconnectedWay() {
return issues;
};
validation.type = ValidationIssueType.disconnected_way;
validation.type = 'disconnected_way';
return validation;
}
+3 -5
View File
@@ -4,8 +4,6 @@ import {
utilPreset
} from '../util';
import {
ValidationIssueType,
ValidationIssueSeverity,
validationIssue,
validationIssueFix
} from '../core/validator';
@@ -50,8 +48,8 @@ export function validationGenericName(context) {
if (generic) {
var preset = utilPreset(entity, context);
issues.push(new validationIssue({
type: ValidationIssueType.generic_name,
severity: ValidationIssueSeverity.warning,
type: 'generic_name',
severity: 'warning',
message: t('issues.generic_name.message', {feature: preset.name(), name: generic}),
tooltip: t('issues.generic_name.tip'),
entities: [entity],
@@ -75,7 +73,7 @@ export function validationGenericName(context) {
return issues;
};
validation.type = ValidationIssueType.generic_name;
validation.type = 'generic_name';
return validation;
}
+5 -6
View File
@@ -1,8 +1,6 @@
import { t } from '../util/locale';
import {
ValidationIssueType,
ValidationIssueSeverity,
validationIssue,
validationIssue
} from '../core/validator';
export function validationManyDeletions() {
@@ -21,8 +19,8 @@ export function validationManyDeletions() {
});
if (changes.deleted.length > threshold) {
issues.push(new validationIssue({
type: ValidationIssueType.many_deletions,
severity: ValidationIssueSeverity.warning,
type: 'many_deletions',
severity: 'warning',
message: t(
'issues.many_deletions.message',
{ n: changes.deleted.length, p: nodes, l: ways, a:areas, r: relations }
@@ -35,7 +33,8 @@ export function validationManyDeletions() {
return issues;
};
validation.type = ValidationIssueType.many_deletions;
validation.type = 'many_deletions';
validation.inputType = 'changes';
return validation;
}
+2 -4
View File
@@ -1,8 +1,6 @@
import { services } from '../services';
import {
ValidationIssueType
} from '../core/validator';
export function validationMaprules() {
var validation = function(entity, context) {
if (!services.maprules) return [];
@@ -19,7 +17,7 @@ export function validationMaprules() {
return issues;
};
validation.type = ValidationIssueType.maprules;
validation.type = 'maprules';
return validation;
}
+3 -5
View File
@@ -5,8 +5,6 @@ import {
utilDisplayLabel
} from '../util';
import {
ValidationIssueType,
ValidationIssueSeverity,
validationIssue,
validationIssueFix
} from '../core/validator';
@@ -32,8 +30,8 @@ export function validationMissingTag() {
!(hasDescriptiveTags(entity) || entity.hasParentRelations(graph))) {
var entityLabel = utilDisplayLabel(entity, context);
issues.push(new validationIssue({
type: ValidationIssueType.missing_tag,
severity: ValidationIssueSeverity.error,
type: 'missing_tag',
severity: 'error',
message: t('issues.untagged_feature.message', {feature: entityLabel}),
tooltip: t('issues.untagged_feature.tip'),
entities: [entity],
@@ -58,7 +56,7 @@ export function validationMissingTag() {
return issues;
};
validation.type = ValidationIssueType.missing_tag;
validation.type = 'missing_tag';
return validation;
}
+3 -5
View File
@@ -2,8 +2,6 @@ import { t } from '../util/locale';
import { osmIsSimpleMultipolygonOuterMember } from '../osm';
import { utilDisplayLabel } from '../util';
import {
ValidationIssueType,
ValidationIssueSeverity,
validationIssue,
validationIssueFix
} from '../core/validator';
@@ -20,8 +18,8 @@ export function validationOldMultipolygon() {
if (mistaggedMultipolygon) {
var multipolygonLabel = utilDisplayLabel(mistaggedMultipolygon, context);
issues.push(new validationIssue({
type: ValidationIssueType.old_multipolygon,
severity: ValidationIssueSeverity.warning,
type: 'old_multipolygon',
severity: 'warning',
message: t('issues.old_multipolygon.message', {multipolygon: multipolygonLabel}),
tooltip: t('issues.old_multipolygon.tip'),
entities: [entity, mistaggedMultipolygon],
@@ -48,7 +46,7 @@ export function validationOldMultipolygon() {
return issues;
};
validation.type = ValidationIssueType.old_multipolygon;
validation.type = 'old_multipolygon';
return validation;
}
+3 -5
View File
@@ -5,8 +5,6 @@ import {
utilTagText
} from '../util';
import {
ValidationIssueType,
ValidationIssueSeverity,
validationIssue,
validationIssueFix
} from '../core/validator';
@@ -48,8 +46,8 @@ export function validationTagSuggestsArea() {
if (suggestingTags) {
var tagText = utilTagText({ tags: suggestingTags });
issues.push(new validationIssue({
type: ValidationIssueType.tag_suggests_area,
severity: ValidationIssueSeverity.warning,
type: 'tag_suggests_area',
severity: 'warning',
message: t('issues.tag_suggests_area.message', { tag: tagText }),
tooltip: t('issues.tag_suggests_area.tip'),
entities: [entity],
@@ -75,7 +73,7 @@ export function validationTagSuggestsArea() {
return issues;
};
validation.type = ValidationIssueType.tag_suggests_area;
validation.type = 'tag_suggests_area';
return validation;
}