From 973697b8ba4c53a9201f2c2d0b50ff04b006e65d Mon Sep 17 00:00:00 2001 From: Quincy Morgan Date: Fri, 1 Feb 2019 13:38:17 -0500 Subject: [PATCH] Run all validators in the validations folder if not manually run Remove ValidationIssueType and ValidationIssueSeverity objects --- modules/core/validator.js | 79 +++++++++++------------- modules/services/maprules.js | 9 +-- modules/validations/almost_junction.js | 8 +-- modules/validations/crossing_ways.js | 8 +-- modules/validations/deprecated_tag.js | 8 +-- modules/validations/disconnected_way.js | 8 +-- modules/validations/generic_name.js | 8 +-- modules/validations/many_deletions.js | 11 ++-- modules/validations/maprules.js | 6 +- modules/validations/missing_tag.js | 8 +-- modules/validations/old_multipolygon.js | 8 +-- modules/validations/tag_suggests_area.js | 8 +-- 12 files changed, 69 insertions(+), 100 deletions(-) diff --git a/modules/core/validator.js b/modules/core/validator.js index 7cb6b5a58..b1bc9611b 100644 --- a/modules/core/validator.js +++ b/modules/core/validator.js @@ -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; diff --git a/modules/services/maprules.js b/modules/services/maprules.js index 8a6cc7e03..dd8bb0961 100644 --- a/modules/services/maprules.js +++ b/modules/services/maprules.js @@ -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], diff --git a/modules/validations/almost_junction.js b/modules/validations/almost_junction.js index 1f6cb7aed..178e0ea56 100644 --- a/modules/validations/almost_junction.js +++ b/modules/validations/almost_junction.js @@ -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; } diff --git a/modules/validations/crossing_ways.js b/modules/validations/crossing_ways.js index b258df00a..60680e8cb 100644 --- a/modules/validations/crossing_ways.js +++ b/modules/validations/crossing_ways.js @@ -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; } diff --git a/modules/validations/deprecated_tag.js b/modules/validations/deprecated_tag.js index 9affc6db5..d9fa39cf1 100644 --- a/modules/validations/deprecated_tag.js +++ b/modules/validations/deprecated_tag.js @@ -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; } diff --git a/modules/validations/disconnected_way.js b/modules/validations/disconnected_way.js index ef68af26c..b68e169b8 100644 --- a/modules/validations/disconnected_way.js +++ b/modules/validations/disconnected_way.js @@ -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; } diff --git a/modules/validations/generic_name.js b/modules/validations/generic_name.js index 365c8f60e..a69b810f9 100644 --- a/modules/validations/generic_name.js +++ b/modules/validations/generic_name.js @@ -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; } diff --git a/modules/validations/many_deletions.js b/modules/validations/many_deletions.js index fe32c1c95..cf68530f1 100644 --- a/modules/validations/many_deletions.js +++ b/modules/validations/many_deletions.js @@ -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; } diff --git a/modules/validations/maprules.js b/modules/validations/maprules.js index b5320a38a..900d56b61 100644 --- a/modules/validations/maprules.js +++ b/modules/validations/maprules.js @@ -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; } diff --git a/modules/validations/missing_tag.js b/modules/validations/missing_tag.js index c9cd830a2..022dc3b92 100644 --- a/modules/validations/missing_tag.js +++ b/modules/validations/missing_tag.js @@ -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; } diff --git a/modules/validations/old_multipolygon.js b/modules/validations/old_multipolygon.js index 5dea893f9..510afa6f3 100644 --- a/modules/validations/old_multipolygon.js +++ b/modules/validations/old_multipolygon.js @@ -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; } diff --git a/modules/validations/tag_suggests_area.js b/modules/validations/tag_suggests_area.js index c7b6be389..916af06b9 100644 --- a/modules/validations/tag_suggests_area.js +++ b/modules/validations/tag_suggests_area.js @@ -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; }