Skip to content

Commit c409614

Browse files
Merge pull request #115 from valydia/bugfix_notempty
Bugfix notempty
2 parents 5b749b8 + 708c053 commit c409614

File tree

12 files changed

+104
-85
lines changed

12 files changed

+104
-85
lines changed

csv-validator-core/src/main/scala/uk/gov/nationalarchives/csv/validator/AllErrorsMetaDataValidator.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,9 @@ trait AllErrorsMetaDataValidator extends MetaDataValidator {
5555
def isOptionDirective: Boolean = columnDefinition.directives.contains(Optional())
5656

5757
if(row.cells(columnIndex).value.trim.isEmpty && isOptionDirective) true.successNel
58-
else columnDefinition.rules.map(_.evaluate(columnIndex, row, schema, mayBeLast)).map{ ruleResult:Rule#RuleValidation[Any] => {
58+
else columnDefinition.rules.map{rule =>
59+
rule.evaluate(columnIndex, row, schema, mayBeLast)
60+
}.map{ ruleResult:Rule#RuleValidation[Any] => {
5961
if(isWarningDirective) toWarnings(ruleResult, row.lineNumber, columnIndex) else toErrors(ruleResult, row.lineNumber, columnIndex)
6062
}}.sequence[MetaDataValidation, Any]
6163
}

csv-validator-core/src/main/scala/uk/gov/nationalarchives/csv/validator/schema/Rule.scala

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ package uk.gov.nationalarchives.csv.validator.schema
1111
import org.joda.time.DateTime
1212
import uk.gov.nationalarchives.csv.validator.metadata.Row
1313

14+
import scala.collection.mutable.MutableList
1415
import scala.util.Try
1516
import scala.util.parsing.input.Positional
1617
import scalaz._
@@ -22,10 +23,37 @@ abstract class Rule(name: String, val argProviders: ArgProvider*) extends Positi
2223

2324
var explicitColumn: Option[ColumnReference] = None
2425

26+
def findColumnReference(): Option[ColumnReference] = {
27+
if (explicitColumns.nonEmpty){
28+
val index = explicitColumnIndex
29+
val result = explicitColumns.get(index)
30+
if (index + 1 == explicitColumns.length)
31+
explicitColumnIndex = 0
32+
else
33+
explicitColumnIndex = index + 1
34+
result
35+
}
36+
else{
37+
explicitColumn = None
38+
None
39+
}
40+
}
41+
42+
43+
def findColumnRefence(rule: Rule): Option[ColumnReference] =
44+
rule.findColumnReference()
45+
46+
var explicitColumnIndex = 0
47+
48+
val explicitColumns: MutableList[ColumnReference] = MutableList()
49+
2550
def evaluate(columnIndex: Int, row: Row, schema: Schema, mayBeLast: Option[Boolean] = None): RuleValidation[Any] = {
26-
if (valid(cellValue(columnIndex, row, schema), schema.columnDefinitions(columnIndex), columnIndex, row, schema, mayBeLast)) true.successNel[String] else fail(columnIndex, row, schema)
51+
if (valid(cellValue(columnIndex, row, schema), schema.columnDefinitions(columnIndex), columnIndex, row, schema, mayBeLast))
52+
true.successNel[String]
53+
else fail(columnIndex, row, schema)
2754
}
2855

56+
2957
def valid(cellValue: String, columnDefinition: ColumnDefinition, columnIndex: Int,
3058
row: Row, schema: Schema, mayBeLast: Option[Boolean] = None): Boolean =
3159
evaluate(columnIndex, row, schema).isSuccess
@@ -36,15 +64,18 @@ abstract class Rule(name: String, val argProviders: ArgProvider*) extends Positi
3664
s"$toError fails for line: ${row.lineNumber}, column: ${columnDefinition.id}, ${toValueError(row,columnIndex)}".failureNel[Any]
3765
}
3866

39-
def cellValue(columnIndex: Int, row: Row, schema: Schema): String = explicitColumn match {
40-
case Some(columnRef) =>
41-
columnRef.referenceValueEx(columnIndex, row, schema)
42-
case None =>
43-
row.cells(columnIndex).value
67+
def cellValue(columnIndex: Int, row: Row, schema: Schema): String = {
68+
explicitColumn match {
69+
case Some(columnRef) =>
70+
columnRef.referenceValueEx(columnIndex, row, schema)
71+
case None =>
72+
row.cells(columnIndex).value
73+
}
4474
}
4575

4676
def explicitName: Option[String] = explicitColumn.map("$" + _.ref + "/")
4777

78+
4879
def ruleName: String = explicitName.getOrElse("") + name
4980

5081
def columnIdentifierToIndex(schema: Schema, id: ColumnIdentifier): Int = {
@@ -57,9 +88,15 @@ abstract class Rule(name: String, val argProviders: ArgProvider*) extends Positi
5788
}
5889
}
5990

60-
def toValueError(row: Row, columnIndex:Int ) = s"""value: ${'"'}${row.cells(columnIndex).value}${'"'}"""
6191

62-
def toError = s"""$ruleName""" + (if (argProviders.isEmpty) "" else "(" + argProviders.foldLeft("")((a, b) => (if (a.isEmpty) "" else a + ", ") + b.toError) + ")")
92+
93+
def toValueError(row: Row, columnIndex:Int ) =
94+
s"""value: ${'"'}${row.cells(columnIndex).value}${'"'}"""
95+
96+
97+
def toError =
98+
s"""$ruleName""" + (if (argProviders.isEmpty) "" else "(" + argProviders.foldLeft("")((a, b) => (if (a.isEmpty) "" else a + ", ") + b.toError) + ")")
99+
63100
}
64101

65102
abstract class PatternRule(name: String, pattern: String) extends Rule(name) {

csv-validator-core/src/main/scala/uk/gov/nationalarchives/csv/validator/schema/Schema.scala

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,8 @@ case class ColumnReference(ref: ColumnIdentifier) extends ArgProvider {
6363

6464
@throws[IndexOutOfBoundsException]
6565
def referenceValueEx(columnIndex: Int, row: Row, schema: Schema): String = {
66-
referenceValue(columnIndex, row, schema) match {
67-
case Some(rv) =>
68-
rv
69-
case None =>
70-
throw new ArrayIndexOutOfBoundsException(s"Could not access reference column $ref at [$columnIndex:${row.lineNumber}]")
66+
referenceValue(columnIndex, row, schema).getOrElse{
67+
throw new ArrayIndexOutOfBoundsException(s"Could not access reference column $ref at [$columnIndex:${row.lineNumber}]")
7168
}
7269
}
7370

csv-validator-core/src/main/scala/uk/gov/nationalarchives/csv/validator/schema/v1_0/Rule.scala

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ case class IfRule(condition: Rule, rules: List[Rule], elseRules: Option[List[Rul
6262
override def evaluate(columnIndex: Int, row: Row, schema: Schema, mayBeLast: Option[Boolean] = None): RuleValidation[Any] = {
6363

6464
def conditionValid: Boolean = {
65-
val (cellValue,idx) = condition.explicitColumn match {
65+
val (cellValue,idx) = findColumnRefence(condition) match {
6666
case Some(columnRef) =>
6767
(columnRef.referenceValueEx(columnIndex, row, schema), columnIdentifierToIndex(schema, columnRef.ref))
6868
case None =>
@@ -180,7 +180,6 @@ case class NotEmptyRule() extends Rule("notEmpty") {
180180
}
181181
}
182182

183-
//case class UriRule() extends PatternRule("uri", UriRegex)
184183
case class UriRule() extends Rule("uri") {
185184
override def valid(cellValue: String, columnDefinition: ColumnDefinition, columnIndex: Int, row: Row, schema: Schema, mayBeLast: Option[Boolean] = None): Boolean = {
186185
try {

csv-validator-core/src/main/scala/uk/gov/nationalarchives/csv/validator/schema/v1_0/SchemaParser.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@ trait SchemaParser extends BaseSchemaParser {
249249
positiveIntegerExpr ) ^^ {
250250
case explicitContext ~ rule =>
251251
rule.explicitColumn = explicitContext
252+
explicitContext.map(rule.explicitColumns += _)
252253
rule
253254
}
254255

@@ -457,6 +458,7 @@ trait SchemaParser extends BaseSchemaParser {
457458
lazy val externalSingleExpr: PackratParser[Rule] = "ExternalSingleExpr" ::= opt(explicitContextExpr) ~ (fileExistsExpr | checksumExpr | fileCountExpr) ^^ {
458459
case explicitContext ~ rule =>
459460
rule.explicitColumn = explicitContext
461+
explicitContext.map(rule.explicitColumns += _)
460462
rule
461463
}
462464

csv-validator-core/src/main/scala/uk/gov/nationalarchives/csv/validator/schema/v1_0/SchemaValidator.scala

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -219,19 +219,16 @@ class SchemaValidator {
219219

220220
protected def explicitColumnValid(columnDefinitions: List[ColumnDefinition]): Option[String] = {
221221

222-
def invalidColumnNames(rule: Rule) = explicitColumnCheck(rule) match {
223-
case Some(x) => x
224-
case None => List.empty[ColumnIdentifier]
225-
}
226-
227-
def checkAlternativeOption(rules: Option[List[Rule]]): Option[List[ColumnIdentifier]] = rules match {
228-
case Some(rulesList) => Some(rulesList.foldLeft(List.empty[ColumnIdentifier]) {
229-
case (list, rule: Rule) => list ++ invalidColumnNames(rule)
230-
})
222+
def invalidColumnNames(rule: Rule) = explicitColumnCheck(rule).getOrElse(List.empty[ColumnIdentifier])
231223

232-
case None => None
224+
def checkAlternativeOption(rules: Option[List[Rule]]): Option[List[ColumnIdentifier]] = {
225+
rules.map{ _.foldLeft(List.empty[ColumnIdentifier]) {
226+
case (list, rule: Rule) => list ++ invalidColumnNames(rule)
227+
}
228+
}
233229
}
234230

231+
235232
def explicitColumnCheck(rule: Rule): Option[List[ColumnIdentifier]] = rule match {
236233
case IfRule(c, t, f) =>
237234
val cond = explicitColumnCheck(c)

csv-validator-core/src/main/scala/uk/gov/nationalarchives/csv/validator/schema/v1_1/Rule.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ case class SwitchRule(elseRules: Option[List[Rule]], cases:(Rule, List[Rule])*)
3939

4040
override def evaluate(columnIndex: Int, row: Row, schema: Schema, mayBeLast: Option[Boolean] = None): RuleValidation[Any] = {
4141
def conditionValid(condition: Rule): Boolean = {
42-
val (cellValue,idx) = condition.explicitColumn match {
42+
val (cellValue,idx) = findColumnRefence(condition) match {
4343
case Some(columnRef) =>
4444
(columnRef.referenceValueEx(columnIndex, row, schema), columnIdentifierToIndex(schema, columnRef.ref))
4545
case None =>

csv-validator-core/src/main/scala/uk/gov/nationalarchives/csv/validator/schema/v1_1/SchemaParser.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,9 @@ trait SchemaParser extends SchemaParser1_0 {
5454
lowerCaseExpr ) ^^ {
5555
case explicitContext ~ rule =>
5656
rule.explicitColumn = explicitContext
57+
explicitContext.map(rule.explicitColumns += _)
5758
rule
59+
5860
}
5961

6062
/**
@@ -70,6 +72,7 @@ trait SchemaParser extends SchemaParser1_0 {
7072
override lazy val externalSingleExpr: PackratParser[Rule] = "ExternalSingleExpr" ::= opt(explicitContextExpr) ~ (fileExistsExpr | integrityCheckExpr | checksumExpr | fileCountExpr) ^^ {
7173
case explicitContext ~ rule =>
7274
rule.explicitColumn = explicitContext
75+
explicitContext.map(rule.explicitColumns += _)
7376
rule
7477
}
7578

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
c1,c2,c3,c4
2+
aaa,cell1-2,bbb,cell1-4
3+
cell2-1,,bbb,cell2-4
4+
cell3-1,,cell3-3,
5+
aaa,cell4-2,cell4-3,
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
version 1.0
2+
@totalColumns 4
3+
c1: if($c2/notEmpty, is("aaa"))
4+
c2:
5+
c3: if($c4/notEmpty, is("bbb"))
6+
c4:

0 commit comments

Comments
 (0)