Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion .scalafix.conf
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
rules = [
# Built-in syntactic rules
DisableSyntax
LeakingImplicitClassVal
NoValInForComprehension
RedundantSyntax
ProcedureSyntax
# Built-in semantic rules
ExplicitResultTypes
NoAutoTupling
OrganizeImports
RemoveUnused
]

DisableSyntax.noVars = true
Expand All @@ -19,4 +26,4 @@ DisableSyntax.noFinalize = true
DisableSyntax.noValPatterns = true
DisableSyntax.noUniversalEquality = false
OrganizeImports.targetDialect = Scala3
OrganizeImports.removeUnused = false
OrganizeImports.removeUnused = false
2 changes: 1 addition & 1 deletion build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ lazy val root = (project in file("."))
Compile / console / scalacOptions --= Seq("-Xfatal-warnings"),
Test / scalacOptions --= Seq("-Wnonunit-statement"),
mimaPreviousArtifacts := Set("info.fingo" %% "spata" % "3.2.0"),
semanticdbEnabled := false,
semanticdbEnabled := true,
autoAPIMappings := true
)

Expand Down
1 change: 1 addition & 0 deletions src/main/scala/info/fingo/spata/CSVConfig.scala
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ package info.fingo.spata

import cats.effect.Sync
import info.fingo.spata.util.Logger

import scala.annotation.targetName

/** CSV configuration used to create [[CSVParser]] or [[CSVRenderer]].
Expand Down
21 changes: 15 additions & 6 deletions src/main/scala/info/fingo/spata/CSVParser.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,24 @@
*/
package info.fingo.spata

import scala.util.Try
import cats.effect.{Async => CEAsync, Sync}
import fs2.{text, Pipe, Pull, Stream}
import info.fingo.spata.parser.{CharParser, FieldParser, RecordParser}
import info.fingo.spata.parser.RecordParser.RecordResult
import cats.effect.Async as CEAsync
import cats.effect.Sync
import fs2.Pipe
import fs2.Pull
import fs2.Stream
import fs2.text
import info.fingo.spata.CSVParser.Callback
import info.fingo.spata.error.{CSVException, ParsingErrorCode, StructureException}
import info.fingo.spata.error.CSVException
import info.fingo.spata.error.ParsingErrorCode
import info.fingo.spata.error.StructureException
import info.fingo.spata.parser.CharParser
import info.fingo.spata.parser.FieldParser
import info.fingo.spata.parser.RecordParser
import info.fingo.spata.parser.RecordParser.RecordResult
import info.fingo.spata.util.Logger

import scala.util.Try

/** A utility for parsing comma-separated values (CSV) sources.
* The source is assumed to be [[https://tools.ietf.org/html/rfc4180 RFC 4180]] conform,
* although some aspects of its format are configurable.
Expand Down
10 changes: 8 additions & 2 deletions src/main/scala/info/fingo/spata/CSVRenderer.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,14 @@
*/
package info.fingo.spata

import fs2.{text, Chunk, Pipe, Pull, RaiseThrowable, Stream}
import info.fingo.spata.error.{FieldInfo, HeaderError}
import fs2.Chunk
import fs2.Pipe
import fs2.Pull
import fs2.RaiseThrowable
import fs2.Stream
import fs2.text
import info.fingo.spata.error.FieldInfo
import info.fingo.spata.error.HeaderError

/** A utility for rendering data to CSV representation.
*
Expand Down
3 changes: 2 additions & 1 deletion src/main/scala/info/fingo/spata/Content.scala
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ package info.fingo.spata

import cats.effect.Sync
import fs2.Stream
import info.fingo.spata.error.{FieldInfo, StructureException}
import info.fingo.spata.error.FieldInfo
import info.fingo.spata.error.StructureException
import info.fingo.spata.parser.RecordParser.*
import info.fingo.spata.util.Logger

Expand Down
4 changes: 3 additions & 1 deletion src/main/scala/info/fingo/spata/Header.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
*/
package info.fingo.spata

import info.fingo.spata.error.{FieldInfo, ParsingErrorCode, StructureException}
import info.fingo.spata.error.FieldInfo
import info.fingo.spata.error.ParsingErrorCode
import info.fingo.spata.error.StructureException

/** CSV header with names of each field.
*
Expand Down
13 changes: 10 additions & 3 deletions src/main/scala/info/fingo/spata/Record.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,17 @@
*/
package info.fingo.spata

import java.util.NoSuchElementException
import info.fingo.spata.converter.{FromProduct, FromTuple, ToProduct, ToTuple}
import info.fingo.spata.converter.FromProduct
import info.fingo.spata.converter.FromTuple
import info.fingo.spata.converter.ToProduct
import info.fingo.spata.converter.ToTuple
import info.fingo.spata.error.*
import info.fingo.spata.text.{FormattedStringParser, ParseResult, StringParser, StringRenderer}
import info.fingo.spata.text.FormattedStringParser
import info.fingo.spata.text.ParseResult
import info.fingo.spata.text.StringParser
import info.fingo.spata.text.StringRenderer

import java.util.NoSuchElementException

/** CSV record representation.
* A record is basically a map from string to string.
Expand Down
4 changes: 3 additions & 1 deletion src/main/scala/info/fingo/spata/converter/FromProduct.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@
*/
package info.fingo.spata.converter

import info.fingo.spata.Header
import info.fingo.spata.Record
import info.fingo.spata.text.StringRenderer
import info.fingo.spata.{Header, Record}

import scala.deriving.Mirror

/** Converter from a tuple to a record.
Expand Down
7 changes: 5 additions & 2 deletions src/main/scala/info/fingo/spata/converter/ToProduct.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,15 @@
*/
package info.fingo.spata.converter

import scala.deriving.Mirror
import scala.compiletime.{constValue, erasedValue, summonInline}
import info.fingo.spata.Decoded
import info.fingo.spata.Record
import info.fingo.spata.text.StringParser

import scala.compiletime.constValue
import scala.compiletime.erasedValue
import scala.compiletime.summonInline
import scala.deriving.Mirror

/** Converter from a record to a tuple.
*
* This trait defines behavior to be implemented by concrete, given converters.
Expand Down
6 changes: 4 additions & 2 deletions src/main/scala/info/fingo/spata/error/CSVException.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@
*/
package info.fingo.spata.error

import java.util.NoSuchElementException
import ParsingErrorCode.ErrorCode
import info.fingo.spata.Position
import info.fingo.spata.text.StringParser

import java.util.NoSuchElementException

import ParsingErrorCode.ErrorCode

/** Base exception reported by CSV handling methods.
* May be thrown, raised through [[fs2.Stream#raiseError]] or returned as `Left`, depending on context.
*
Expand Down
25 changes: 18 additions & 7 deletions src/main/scala/info/fingo/spata/io/Reader.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,26 @@
*/
package info.fingo.spata.io

import java.io.InputStream
import java.nio.file.{Files, Path, StandardOpenOption}
import scala.io.{BufferedSource, Codec, Source}
import cats.effect.{Async, Sync}
import cats.effect.Async
import cats.effect.Sync
import cats.syntax.all.*
import fs2.io.file.{Files => FFiles, Flags, Path => FPath}
import fs2.{io, text, Pipe, Stream}
import info.fingo.spata.util.Logger
import fs2.Pipe
import fs2.RaiseThrowable
import fs2.Stream
import fs2.io
import fs2.io.file.Files as FFiles
import fs2.io.file.Flags
import fs2.io.file.Path as FPath
import fs2.text
import info.fingo.spata.util.Logger

import java.io.InputStream
import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.StandardOpenOption
import scala.io.BufferedSource
import scala.io.Codec
import scala.io.Source

/** Reader interface with reading operations from various sources.
* The I/O operations are wrapped in effect `F` (e.g. [[cats.effect.IO]]), allowing deferred computation.
Expand Down
22 changes: 16 additions & 6 deletions src/main/scala/info/fingo/spata/io/Writer.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,25 @@
*/
package info.fingo.spata.io

import java.io.OutputStream
import java.nio.file.{Files, Path, StandardOpenOption}
import scala.io.Codec
import cats.effect.{Async, Sync}
import cats.effect.Async
import cats.effect.Sync
import cats.syntax.all.*
import fs2.{io, text, Chunk, Pipe, Stream}
import fs2.io.file.{Files => FFiles, Flags, Path => FPath}
import fs2.Chunk
import fs2.Pipe
import fs2.Stream
import fs2.io
import fs2.io.file.Files as FFiles
import fs2.io.file.Flags
import fs2.io.file.Path as FPath
import fs2.text
import info.fingo.spata.util.Logger

import java.io.OutputStream
import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.StandardOpenOption
import scala.io.Codec

/** Writer interface with writing operations to various destinations.
* The I/O operations are wrapped in effect `F` (e.g. [[cats.effect.IO]]), allowing deferred computation.
*
Expand Down
5 changes: 4 additions & 1 deletion src/main/scala/info/fingo/spata/parser/CharParser.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@
*/
package info.fingo.spata.parser

import fs2.{Chunk, Pipe, Pull, Stream}
import fs2.Chunk
import fs2.Pipe
import fs2.Pull
import fs2.Stream
import info.fingo.spata.error.ParsingErrorCode.*

/* A finite-state transducer to converter plain source characters into context-dependent symbols,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@
*/
package info.fingo.spata.parser

import fs2.{Chunk, Pipe, Pull, Stream}
import fs2.Chunk
import fs2.Pipe
import fs2.Pull
import fs2.Stream

/* Trait for state carriers which shows if processing has been finished */
private[spata] trait State:
Expand Down
7 changes: 5 additions & 2 deletions src/main/scala/info/fingo/spata/parser/FieldParser.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,12 @@
*/
package info.fingo.spata.parser

import scala.annotation.tailrec
import fs2.{Chunk, Pipe}
import fs2.Chunk
import fs2.Pipe
import info.fingo.spata.error.ParsingErrorCode.*

import scala.annotation.tailrec

import FieldParser.*

/* Carrier for counters, partial field content and information about finished parsing. */
Expand Down
7 changes: 5 additions & 2 deletions src/main/scala/info/fingo/spata/parser/RecordParser.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,12 @@
*/
package info.fingo.spata.parser

import scala.collection.immutable.VectorBuilder
import fs2.Chunk
import fs2.Pipe

import scala.annotation.tailrec
import fs2.{Chunk, Pipe}
import scala.collection.immutable.VectorBuilder

import RecordParser.*
import FieldParser.*

Expand Down
15 changes: 10 additions & 5 deletions src/main/scala/info/fingo/spata/schema/CSVSchema.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,22 @@
*/
package info.fingo.spata.schema

import scala.annotation.unused
import scala.reflect.{classTag, ClassTag}
import cats.data.{NonEmptyList, Validated}
import cats.data.Validated.{Invalid, Valid}
import fs2.{Pipe, Stream}
import cats.data.NonEmptyList
import cats.data.Validated
import cats.data.Validated.Invalid
import cats.data.Validated.Valid
import fs2.Pipe
import fs2.Stream
import info.fingo.spata.Record
import info.fingo.spata.schema.error.TypeError
import info.fingo.spata.schema.validator.Validator
import info.fingo.spata.text.StringParser
import info.fingo.spata.util.Logger

import scala.annotation.unused
import scala.reflect.ClassTag
import scala.reflect.classTag

/** CSV schema definition and validation utility.
*
* Schema declares fields which are expected in CSV stream - their names and types.
Expand Down
7 changes: 4 additions & 3 deletions src/main/scala/info/fingo/spata/schema/TypedRecord.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@
*/
package info.fingo.spata.schema

import scala.deriving.Mirror
import scala.annotation.unused
import scala.compiletime.{constValue, erasedValue}
import info.fingo.spata.converter.ToProduct
import info.fingo.spata.schema.TypedRecord.*

import scala.annotation.unused
import scala.compiletime.constValue
import scala.deriving.Mirror

/** CSV record representation with type-safe access to its values.
* Typed records are created as result of schema validation.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@
*/
package info.fingo.spata.schema.error

import info.fingo.spata.error.{ContentError, DataError, HeaderError, IndexError}
import info.fingo.spata.error.ContentError
import info.fingo.spata.error.DataError
import info.fingo.spata.error.HeaderError
import info.fingo.spata.error.IndexError

/** Error for schema validation. */
sealed trait SchemaError:
Expand Down
10 changes: 6 additions & 4 deletions src/main/scala/info/fingo/spata/schema/validator/Validator.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@
*/
package info.fingo.spata.schema.validator

import scala.util.matching.Regex
import cats.data.Validated
import cats.data.Validated.{Invalid, Valid}
import cats.data.Validated.Invalid
import cats.data.Validated.Valid
import info.fingo.spata.schema.error.ValidationError
import info.fingo.spata.util.classLabel

import scala.util.matching.Regex

/** Validator for typed CVS field value.
*
* It is used as part of schema validation, after successful conversion of CSV string value to desired type.
Expand Down Expand Up @@ -47,7 +49,7 @@ trait Validator[A]:
* @param value the validated value
* @return error message parametrized with value
*/
def errorMessage(value: A) = s"Invalid value [$value] reported by $name"
def errorMessage(value: A): String = s"Invalid value [$value] reported by $name"

/* Main validation method, used by schema validation. Must not alter the value. */
final private[schema] def apply(value: A): Validated[ValidationError, A] =
Expand Down Expand Up @@ -244,4 +246,4 @@ object FiniteValidator:
*/
def apply(): Validator[Double] = new Validator[Double]:
def isValid(value: Double): Boolean = value.isFinite
override def errorMessage(value: Double) = s"Number [$value] is not finite"
override def errorMessage(value: Double): String = s"Number [$value] is not finite"
Loading
Loading