| CARVIEW |
gitson: A document store library for Git + JSON.
A simple document store library for Git + JSON, based on Aeson. Uses command line git. Transactions use flock, so it's safe even across completely separate programs!
[Skip to Readme]
Downloads
- gitson-0.5.2.tar.gz [browse] (Cabal source package)
- Package description (revised from the package)
Note: This package has metadata revisions in the cabal description newer than included in the tarball. To unpack the package including the revisions, use 'cabal get'.
Maintainer's Corner
For package maintainers and hackage trustees
Candidates
- No Candidates
| Versions [RSS] | 0.1.0, 0.2.0, 0.2.1, 0.3.0, 0.4.0, 0.4.1, 0.5.0, 0.5.1, 0.5.2 |
|---|---|
| Dependencies | aeson, aeson-pretty (>=0.8.0), base (>=4.3.0.0 && <5), base-compat (>=0.8.0), bytestring, conduit-combinators, conduit-extra, directory, errors, filepath, flock, lifted-base, monad-control, process, transformers [details] |
| Tested with | ghc ==7.10.2 |
| License | LicenseRef-PublicDomain |
| Copyright | 2014-2015 Val Packett <val@packett.cool> |
| Author | Val Packett |
| Maintainer | val@packett.cool |
| Uploaded | by myfreeweb at 2016-07-21T19:02:28Z |
| Revised | Revision 1 made by myfreeweb at 2022-10-15T23:25:33Z |
| Category | Database, JSON, Git |
| Home page | https://codeberg.org/valpackett/gitson |
| Source repo | head: git clone https://codeberg.org/valpackett/gitson.git |
| Distributions | |
| Reverse Dependencies | 1 direct, 0 indirect [details] |
| Downloads | 7506 total (27 in the last 30 days) |
| Rating | (no votes yet) [estimated by Bayesian average] |
| Your Rating |
|
| Status | Docs available [build log] Last success reported on 2016-11-22 [all 1 reports] |
Readme for gitson-0.5.2
[back to package description]gitson

A simple document store library for Git + JSON, based on Aeson. Uses command line git, at least for now. No fancy indexes and stuff, but it does what I need right now. Transactions use flock, so it's safe even across completely separate programs!
Usage
{-# LANGUAGE TemplateHaskell #-}
import Gitson
import Gitson.Util (insideDirectory)
import Data.Aeson.TH
import Control.Monad.IO.Class (liftIO)
data Thing = Thing { val :: Int } deriving (Eq, Show)
$(deriveJSON defaultOptions ''Thing) -- there are non-Template ways of doing this, see aeson docs
main :: IO ()
main = do
-- Creating a new "database," basically mkdir + git init
createRepo "./content"
-- Writing data to a "database" happens in transactions
-- A transaction is committed (write files & git commit)
-- after the block is executed, just like in SQL databases
-- Also, transactions are thread-safe
transaction "./content" $ do
-- order: (collection) (key ) (data)
saveDocument "things" "first-thing" Thing {val = 1}
-- Collections are created automatically, like in MongoDB
liftIO $ putStrLn "Written first-thing"
-- You have to use liftIO to do IO actions inside of a transaction!
-- Because a transaction is a monad transformer, WriterT actually
-- Reading data
-- (These are normal IO actions, so if you want
-- to read inside of a transaction, liftIO.
-- Note: transaction already includes insideDirectory!
-- Warning: you can't read what you've written in the current transaction!!!
-- You can only read what's been written before the transaction began.)
insideDirectory "./content" $ do
colls <- listCollections
-- ["things"]
keys <- listDocumentKeys "things"
-- ["first-thing"]
first-thing <- readDocument "things" "first-thing" :: IO (Maybe Thing)
-- Just Thing {val = 1}
things <- readEntries "things" :: IO [Thing]
-- [Thing {val = 1}]
-- Note: insideDirectory is just a function that changes
-- the current directory, executes an action and changes it back.
-- You can use reading actions without it, like this:
keys <- listDocumentKeys "./content/things"
-- And now, some bells and whistles:
-- Numeric id support
transaction "./content" $ do
saveNextDocument "things" "hello-world" Thing {val = 1}
-- will save to things/000001-hello-world.json
insideDirectory "./content" $ do
thing <- readDocumentById "things" 1
same-thing <- readDocumentByName "things" "hello-world"
-- both will read from things/000001-hello-world.json
i <- documentIdFromName "things" "hello-world"
-- 1
n <- documentNameFromId "things" 1
-- "hello-world"
Development
Use stack to build.
Use ghci to run tests quickly with :test (see the .ghci file).
``bash $ stack build
$ stack test && rm tests.tix
$ stack bench
$ stack ghci --ghc-options="-fno-hpc" ``
Contributing
Please feel free to submit pull requests! Bugfixes and simple non-breaking improvements will be accepted without any questions :-)
By participating in this project you agree to follow the Contributor Code of Conduct.
License
This is free and unencumbered software released into the public domain.
For more information, please refer to the UNLICENSE file or unlicense.org.