mirror of
https://github.com/FoggedLens/iD.git
synced 2026-05-16 22:03:37 +02:00
Run all validators in the validations folder if not manually run
Remove ValidationIssueType and ValidationIssueSeverity objects
This commit is contained in:
+35
-44
@@ -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;
|
||||
|
||||
@@ -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],
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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,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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user