=============
DCIC Snovault
=============

|Build status|_

.. |Build status| image:: https://travis-ci.org/4dn-dcic/snovault.svg?branch=master
.. _Build status: https://travis-ci.org/4dn-dcic/snovault

Overview
========

DCIC Snovault is a JSON-LD Database Framework that serves as the backend for the 4DN Data portal and CGAP. Check out our full documentation `here
<https://snovault.readthedocs.io/en/latest/>`_.

.. note::

    This repository contains a core piece of functionality shared amongst several projects
    in the 4DN-DCIC. It is meant to be used internally by the DCIC team
    in support of `Fourfront <https://data.4dnucleome.org>`_\ ,
    the 4DN data portal, and at this point in time it is not expected to be useful
    in a standalone/plug-and-play way to others.

Installation in 4DN components
==============================

DCIC Snovault is pip installable as the ``dcicsnovault`` package with::

    $ pip install dcicsnovault``

However, at the present time, the functionality it provides might only be useful in conjunction
with other 4DN-DCIC components.

Installation for Development
============================

Currently these are for Mac OSX using homebrew. If using linux, install dependencies with a different package manager.

Step 0: Install Xcode
---------------------

Install Xcode (from App Store) and homebrew: http://brew.sh

Step 1: Verify Homebrew Itself
------------------------------

Verify that homebrew is working properly::

    $ brew doctor

Step 2: Install Homebrewed Dependencies
---------------------------------------

Install or update dependencies::

    $ brew install libevent libmagic libxml2 libxslt openssl postgresql graphviz python3
    $ brew install freetype libjpeg libtiff littlecms webp  # Required by Pillow
    $ brew cask install adoptopenjdk8
    $ brew install elasticsearch@5.6

NOTES:

* If installation of adtopopenjdk8 fails due to an ambiguity, it should work to do this instead::

    $ brew cask install homebrew/cask-versions/adoptopenjdk8

* If you try to invoke elasticsearch and it is not found,
  you may need to link the brew-installed elasticsearch::

    $ brew link --force elasticsearch@5.6

* If you need to update dependencies::

    $ brew update
    $ rm -rf encoded/eggs

* If you need to upgrade brew-installed packages that don't have pinned versions,
  you can use the following. However, take care because there is no command to directly
  undo this effect::

    $ brew update
    $ brew upgrade
    $ rm -rf encoded/eggs

Step 3: Running Poetry
----------------------

To locally install using versions of Python libraries that have worked before, use this::

    $ poetry install


Updating dependencies
=====================

To update the version dependencies, use::

    $ poetry update

This command also takes space-separated names of specific packages to update. For more information, do::

    $ poetry help update


Managing poetry.lock after update
---------------------------------

There may be situations where you do this with no intent to check in the resulting updates,
but once you have checked that the updates are sound, you may wish to check the resulting
``poetry.lock`` file.

Publishing
==========

Normally, a successful build on a tagged branch will cause publication automatically.
It should not be necessary for you to manually use::

    $ poetry publish

Also, you would need appropriate credentials on PyPi for such publication to succeed. As presently configured,
these credentials need to be in the environment variables ``PYPI_USER`` and ``PYPI_PASSWORD``.
If you attempt to do this manually, be sure the version is set properly!

Running tests
=============

To run specific tests locally::

    $ bin/test -k test_name

To run with a debugger::

    $ bin/test --pdb

Specific tests to run locally for schema changes::

    $ bin/test -k test_load_workbook

Run the Pyramid tests with::

    $ bin/test

