The GeoComm Unified Data Model¶
This package (gcudm) contains the GeoComm Unified Data Model implemented as a GeoAlchemy2 object-relational model.
Each version of the package represents the corresponding version of the data model.
If you want to get started using the library, check out the tutorial.
Tutorial¶
Installation¶
You can install the library using pip.
pip install gcudm
If you need a specific version of the data model, specify it when you install.
pip install gcudm==0.0.1
Build Your Database¶
gcudm is built on GeoAlchemy 2 (and SqlAlchey). We try not to come between you and the underlying platforms, so if you’re familiar with these frameworks everything should work as you expect.
One convenience that is provided is the gcudm.model.load()
function
which you can call to make sure that all the modules that define
object-relational mappings
are loaded. You should do this before you create your database tables from
the model to make sure that all the classes that implement the
declarative base
are loaded.
from gcudm.base import Base
import gcudm.model
from sqlalchemy import create_engine
# Load the entire model.
gcudm.model.load()
# The rest is standard SQLAlchemy...
# ...just create an engine.
engine = create_engine(
'postgresql://<user>:<password>@<host>/<your-database>',
echo=True)
# Now create the tables in your database.
Base.metadata.create_all(engine)
Data Model¶
Road Centerlines¶
-
class
gcudm.models.road_centerlines.
RoadCenterline
(**kwargs)[source]¶ Bases:
sqlalchemy.ext.declarative.api.Base
,gcudm.base.ModelMixin
Road centerlines are the principal polyline features that represent road segments traversable by most emergency vehicles.
Table Name: road_centerlines Geometry Type: Linestring -
addCodeL
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘ NENA: AddCode_L
-
addCodeR
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘ NENA: AddCode_R
-
addRngPreL
¶ -
This field needs a description.
Search Display ✘ ✔ Requested Required ✔ ✔ NENA: AdNumPre_L
-
addRngPreR
¶ -
This field needs a description.
Search Display ✘ ✔ Requested Required ✔ ✔ NENA: AdNumPre_R
-
countryL
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘ NENA: Country_L
-
countryR
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘ NENA: Country_R
-
effective
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔
-
esnL
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔ NENA: ESN_L
-
esnR
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔ NENA: ESN_R
-
expire
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔
-
fromAddL
¶ -
This field needs a description.
Search Display ✘ ✔ Requested Required ✔ ✔ NENA: FromAddr_L
-
fromAddR
¶ -
This field needs a description.
Search Display ✘ ✔ Requested Required ✔ ✔ NENA: FromAddr_R
-
gcUnqId
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
geometry
¶
-
classmethod
geometry_type
() → gcudm.geometry.GeometryTypes¶ Get the geometry type defined for the model class.
Returns: the geometry type
-
incMuniL
¶ Incorporated Municipality Left
This field needs a description.
Search Display ✘ ✔ Requested Required ✘ ✘ NENA: IncMuni_L
-
incMuniR
¶ Incorporated Municipality Right
This field needs a description.
Search Display ✘ ✔ Requested Required ✘ ✘ NENA: IncMuni_R
-
lgcyName
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘ NENA: LSt_Name
-
lgcyPrTySp
¶ Legacy Street Name Pre Type Separator
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
lgcyPrType
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘ NENA: LSt_PreDir
-
lgcyPreDir
¶ Legacy Street Name Pre Directional
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
lgcyPreMod
¶ Legacy Street Name Pre Modifier
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
lgcyPstDir
¶ Legacy Street Name Post Directional
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘ NENA: LStPosDir
-
lgcyPstMod
¶ Legacy Street Name Post Modifier
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
lgcyType
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘ NENA: LSt_Type
-
metadata
= MetaData(bind=None)¶
-
msagCommL
¶ -
This field needs a description.
Search Display ✘ ✔ Requested Required ✔ ✔ NENA: MSAGComm_L
-
msagCommR
¶ -
This field needs a description.
Search Display ✘ ✔ Requested Required ✔ ✔ NENA: MSAGComm_R
-
parityL
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘ NENA: Parity_L
-
parityR
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘ NENA: Parity_R
-
postDir
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘ NENA: St_PosDir
-
postMod
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘ NENA: St_PosMod
-
postType
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘ NENA: St_PosTyp
-
preDir
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘ NENA: St_PreDir
-
preMod
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘ NENA: St_PreMod
-
preType
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘ NENA: St_PreTyp
-
preTypeSep
¶ Street Name Pre Type Separator
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘ NENA: St_PreSep
-
rngType
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
srcFullNam
¶ here is an annotation!
-
srcLastEd
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
srcOfData
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
srcUnqId
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔ NENA: RCL_NGUID
-
stateL
¶ -
This field needs a description.
Search Display ✘ ✔ Requested Required ✘ ✘ NENA: State_L
-
stateR
¶ -
This field needs a description.
Search Display ✘ ✔ Requested Required ✘ ✘ NENA: State_R
-
strName
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔ NENA: StreetName
-
toAddL
¶ -
This field needs a description.
Search Display ✘ ✔ Requested Required ✔ ✔ NENA: ToAddr_L
-
toAddR
¶ -
This field needs a description.
Search Display ✘ ✔ Requested Required ✔ ✔ NENA: ToAddr_R
-
unincCommL
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘ NENA: UnincCom_L
-
unincCommR
¶ Unincorporated Community Right
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘ NENA: UnincCom_R
-
updateDate
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
uploadAuth
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
Emergency Service Boundaries (EMS)¶
Say something descriptive about the ‘esbems’ module.
-
class
gcudm.models.esbems.
EsbEms
(**kwargs)[source]¶ Bases:
sqlalchemy.ext.declarative.api.Base
,gcudm.base.ModelMixin
,gcudm.models.esbs.EsbMixin
This table needs a description.
Table Name: esbems Geometry Type: Polygon -
agencyID
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔ NENA: Agency_ID
-
country
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
county
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
displayName
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔ NENA: DisplayName
-
effective
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔
-
expire
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔
-
gcUnqId
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
geometry
¶
-
classmethod
geometry_type
() → gcudm.geometry.GeometryTypes¶ Get the geometry type defined for the model class.
Returns: the geometry type
-
metadata
= MetaData(bind=None)¶
-
routeURI
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔ NENA: ServiceURI
-
serviceNum
¶ -
This field needs a description.
Search Display ✘ ✔ Requested Required ✘ ✘ NENA: ServiceNum
-
serviceURN
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔ NENA: ServiceURI
-
srcLastEd
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
srcOfData
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
srcUnqId
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔ NENA: RCL_NGUID
-
state
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
updateDate
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
uploadAuth
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
vCardURI
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘ NENA: AVcard_URI
-
Emergency Service Boundaries (Fire)¶
Say something descriptive about the ‘esbfire’ module.
-
class
gcudm.models.esbfire.
EsbFire
(**kwargs)[source]¶ Bases:
sqlalchemy.ext.declarative.api.Base
,gcudm.base.ModelMixin
,gcudm.models.esbs.EsbMixin
This table needs a description.
Table Name: esbfire Geometry Type: Polygon -
agencyID
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔ NENA: Agency_ID
-
country
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
county
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
displayName
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔ NENA: DisplayName
-
effective
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔
-
expire
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔
-
gcUnqId
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
geometry
¶
-
classmethod
geometry_type
() → gcudm.geometry.GeometryTypes¶ Get the geometry type defined for the model class.
Returns: the geometry type
-
metadata
= MetaData(bind=None)¶
-
routeURI
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔ NENA: ServiceURI
-
serviceNum
¶ -
This field needs a description.
Search Display ✘ ✔ Requested Required ✘ ✘ NENA: ServiceNum
-
serviceURN
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔ NENA: ServiceURI
-
srcLastEd
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
srcOfData
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
srcUnqId
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔ NENA: RCL_NGUID
-
state
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
updateDate
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
uploadAuth
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
vCardURI
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘ NENA: AVcard_URI
-
Emergency Service Boundaries (Law)¶
Say something descriptive about the ‘esblaw’ module.
-
class
gcudm.models.esblaw.
EsbLaw
(**kwargs)[source]¶ Bases:
sqlalchemy.ext.declarative.api.Base
,gcudm.base.ModelMixin
,gcudm.models.esbs.EsbMixin
Emergency service boundaries for law enforcement define the areas to which law enforcement responds.
Table Name: esblaw Geometry Type: Polygon -
agencyID
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔ NENA: Agency_ID
-
country
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
county
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
displayName
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔ NENA: DisplayName
-
effective
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔
-
expire
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔
-
gcUnqId
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
geometry
¶
-
classmethod
geometry_type
() → gcudm.geometry.GeometryTypes¶ Get the geometry type defined for the model class.
Returns: the geometry type
-
metadata
= MetaData(bind=None)¶
-
routeURI
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔ NENA: ServiceURI
-
serviceNum
¶ -
This field needs a description.
Search Display ✘ ✔ Requested Required ✘ ✘ NENA: ServiceNum
-
serviceURN
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔ NENA: ServiceURI
-
srcLastEd
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
srcOfData
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
srcUnqId
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔ NENA: RCL_NGUID
-
state
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
updateDate
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
uploadAuth
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
vCardURI
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘ NENA: AVcard_URI
-
Emergency Service Boundaries (PSAP)¶
Say something descriptive about the ‘esbpsap’ module.
-
class
gcudm.models.esbpsap.
EsbPsap
(**kwargs)[source]¶ Bases:
sqlalchemy.ext.declarative.api.Base
,gcudm.base.ModelMixin
,gcudm.models.esbs.EsbMixin
This table needs a description.
Table Name: esbpsap Geometry Type: Polygon -
agencyID
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔ NENA: Agency_ID
-
country
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
county
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
displayName
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔ NENA: DisplayName
-
effective
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔
-
expire
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔
-
gcUnqId
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
geometry
¶
-
classmethod
geometry_type
() → gcudm.geometry.GeometryTypes¶ Get the geometry type defined for the model class.
Returns: the geometry type
-
metadata
= MetaData(bind=None)¶
-
routeURI
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔ NENA: ServiceURI
-
serviceNum
¶ -
This field needs a description.
Search Display ✘ ✔ Requested Required ✘ ✘ NENA: ServiceNum
-
serviceURN
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔ NENA: ServiceURI
-
srcLastEd
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
srcOfData
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
srcUnqId
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔ NENA: RCL_NGUID
-
state
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
updateDate
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
uploadAuth
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
vCardURI
¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘ NENA: AVcard_URI
-
API Documentation¶
gcudm¶
GeoComm Unified Data Model
gcudm.base¶
The GeoAlchemy declarative base for the data model is defined in this module along with some other helpful classes.
-
class
gcudm.base.
ModelMixin
[source]¶ Bases:
object
This mixin includes columns and methods common to objects within the data model.
-
effective
= Column(None, DateTime(), table=None)¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔
-
expire
= Column(None, DateTime(), table=None)¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔
-
gcUnqId
= Column(None, GUID(), table=None, primary_key=True, nullable=False)¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
classmethod
geometry_type
() → gcudm.geometry.GeometryTypes[source]¶ Get the geometry type defined for the model class.
Returns: the geometry type
-
srcLastEd
= Column(None, DateTime(), table=None)¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
srcOfData
= Column(None, String(), table=None)¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
srcUnqId
= Column(None, String(), table=None)¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✔ ✔ NENA: RCL_NGUID
-
updateDate
= Column(None, DateTime(), table=None)¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
uploadAuth
= Column(None, String(), table=None)¶ -
This field needs a description.
Search Display ✘ ✘ Requested Required ✘ ✘
-
gcudm.meta¶
This module contains metadata objects to help with inline documentation of the model.
-
gcudm.meta.
COLUMN_META_ATTR
= '__meta__'¶ the property that contains column metadata
-
class
gcudm.meta.
ColumnMeta
[source]¶ Bases:
tuple
Metadata for table columns.
Variables: - label (str) – a human-friendly label for the column
- description (str) – a human-friendly description of the column
- nena (str) – the name of the equivalent NENA field
- requirement (
Requirement
) – defines the source data contract - usage (
Usage
) – defines how the data in the column is expected to be used - guaranteed (bool) – Is the column guaranteed to contain a non-empty value?
- calculated (bool) – May the column’s value be generated or modified by a calculation?
-
calculated
¶
-
description
¶
-
get_enum
(enum_cls: Type[Union[gcudm.meta.Requirement, gcudm.meta.Usage]]) → gcudm.meta.Requirement[source]¶ Get the current value of an attribute defined by an enumeration.
Parameters: enum_cls – the enumeration class Returns: the value of the attribute
-
guaranteed
¶
-
label
¶
-
nena
¶
-
requirement
¶
-
usage
¶
-
class
gcudm.meta.
Requirement
[source]¶ Bases:
enum.IntFlag
This enumeration describes contracts with source data providers.
-
NONE
= 0¶ data for the column is neither requested nor required
-
REQUESTED
= 1¶ data for the column is requested
-
REQUIRED
= 3¶ data for the column is required
-
-
gcudm.meta.
TABLE_META_ATTR
= '__meta__'¶ the property that contains table metadata
-
class
gcudm.meta.
TableMeta
[source]¶ Bases:
tuple
Metadata for tables.
Variables: label (str) – a human-friendly label for the column -
label
¶
-
gcudm.model¶
This module contains general members to help you work with the model.
-
gcudm.model.
IS_MODEL_CLASS
= '__model_cls__'¶ signifies a model class
gcudm.types¶
This module contains custom GeoAlchemy/SQLAlchemy types.
-
class
gcudm.types.
GUID
(*args, **kwargs)[source]¶ Bases:
sqlalchemy.sql.type_api.TypeDecorator
This is a Platform-independent GUID type that uses PostgreSQL’s UUID type ( and otherwise uses CHAR(32), storing as stringified hex values.
-
impl
¶ alias of
sqlalchemy.sql.sqltypes.CHAR
-
load_dialect_impl
(dialect)[source]¶ Return a
TypeEngine
object corresponding to a dialect.This is an end-user override hook that can be used to provide differing types depending on the given dialect. It is used by the
TypeDecorator
implementation oftype_engine()
to help determine what type should ultimately be returned for a givenTypeDecorator
.By default returns
self.impl
.
-
process_bind_param
(value, dialect)[source]¶ Receive a bound parameter value to be converted.
Subclasses override this method to return the value that should be passed along to the underlying
TypeEngine
object, and from there to the DBAPIexecute()
method.The operation could be anything desired to perform custom behavior, such as transforming or serializing data. This could also be used as a hook for validating logic.
This operation should be designed with the reverse operation in mind, which would be the process_result_value method of this class.
Parameters: - value – Data to operate upon, of any type expected by
this method in the subclass. Can be
None
. - dialect – the
Dialect
in use.
- value – Data to operate upon, of any type expected by
this method in the subclass. Can be
-
process_result_value
(value, dialect)[source]¶ Receive a result-row column value to be converted.
Subclasses should implement this method to operate on data fetched from the database.
Subclasses override this method to return the value that should be passed back to the application, given a value that is already processed by the underlying
TypeEngine
object, originally from the DBAPI cursor methodfetchone()
or similar.The operation could be anything desired to perform custom behavior, such as transforming or serializing data. This could also be used as a hook for validating logic.
Parameters: - value – Data to operate upon, of any type expected by
this method in the subclass. Can be
None
. - dialect – the
Dialect
in use.
This operation should be designed to be reversible by the “process_bind_param” method of this class.
- value – Data to operate upon, of any type expected by
this method in the subclass. Can be
-
Python Module Dependencies¶
The requirements.txt
file contains this project’s module dependencies. You can install these dependencies
using pip
.
pip install -r requirements.txt
requirements.txt¶
GeoAlchemy2>=0.4.2,<1
parameterized>=0.6.1,<1
pip-check-reqs>=2.0.1,<3
psycopg2>=2.7.4,<3
psycopg2-binary>=2.7.4,<3
pylint>=1.8.4,<2
pytest>=3.4.0,<4
pytest-cov>=2.5.1,<3
pytest-pythonpath>=0.7.2,<1
setuptools>=38.4.0
Sphinx>=1.7.1,<2
sphinx-rtd-theme>=0.2.4,<1
SQLAlchemy>=1.2.6,<2
singleton-decorator>=1.0.0,<2
titlecase>=0.12.0,<1
tox>=3.0.0,<4
twine>=1.11.0,<2