Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/spartanz/schemaz

A purely-functional library for defining type-safe schemas for algebraic data types, providing free generators, SQL queries, JSON codecs, binary codecs, and migration from this schema definition
https://github.com/spartanz/schemaz

Last synced: 2 months ago
JSON representation

A purely-functional library for defining type-safe schemas for algebraic data types, providing free generators, SQL queries, JSON codecs, binary codecs, and migration from this schema definition

Awesome Lists containing this project

README

        

# SchemaZ

[![Gitter](https://badges.gitter.im/spartanz/schemaz.svg)](https://gitter.im/spartanz/schemaz?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)

[![Build Status][build-image]][build-url] [![Coverage Status][coverage-image]][coverage-url]

[build-image]: http://img.shields.io/travis/spartanz/schemaz/prototyping.svg
[build-url]: https://travis-ci.org/spartanz/schemaz

[coverage-image]: https://img.shields.io/codecov/c/github/spartanz/schemaz/prototyping.svg
[coverage-url]: https://codecov.io/github/spartanz/schemaz?branch=prototyping

## Goal

A purely-functional library for defining type-safe schemas for algebraic data types, providing free generators, SQL queries, JSON codecs, binary codecs, and migration from this schema definition.

## Introduction & Highlights

SchemaZ defines a generic representation of algebraic data structures and combinators that turn such schema into a generic computation over arbitrary data. In other words, SchemaZ provides a way to express any computation that abstracts over the structure of data, such as:

* Codecs: given a serial format (binary, JSON, etc.) and the schema of a data structure (say, an ADT) we can derive a codec for that data structure and serial format.
* Data Generators: given any schema we can derive random data generators (eg. scalacheck's `Gen`) that produce data satisfying that schema.
* Schema/Data Migrations: since schemas are values, we can easily verify whether two versions of a schema are forward/backward compatible and provide a generic way to upgrade/downgrade data from one version of the schema to the other.
* Diffing/Patching: given a schema we can generically compute the difference between two pieces of data satisfying that schema. In the same spirit, we have generic way to apply patches to arbitrary data structures.
* Queries: knowing a schema, we can produce SQL queries to interact with a database that holds an instance of (the SQL version of) that schema.

## Competition

| | codecs | generators | migrations | diff/patch | queries |
---|---|---|---|---|---
xenomorph | βœ“ | βœ“ | ? | 𐄂 | 𐄂
shapeless * | βœ“ | βœ“ | 𐄂 | βœ“ | 𐄂


\*: shapeless provides only the way to abstract over the structure of data, but several libraries build upon shapeless to provide the feature listed in the table.

[Skeumorph](https://github.com/higherkindness/skeuomorph) is also a possible competitor, however it is focused on providing translation between different formats (Avro, Protobuf and Mu). This is achieved by using a central Schema Representation which can losslessly translate to each of the previously mentioned formats.

## Background

SchemaZ shares ideas with @nuttycom's [xenomorph](https://github.com/nuttycom/xenomorph) library. The talk below presents its design.

Describing Data...with free applicative functors (and more)β€”Kris Nuttycombe

An Haskell port of the ideas of xenomorph has also been implemented: [haskell-schema](https://github.com/alonsodomin/haskell-schema).