Metadata-Version: 2.1
Name: ERDot
Version: 2.0.2
Summary: UNKNOWN
Home-page: https://github.com/ehne/ERDot
Author: Darcy Lugt-Falk
Author-email: darcy@darcylf.me
License: UNKNOWN
Platform: UNKNOWN
Requires-Python: >=3
Description-Content-Type: text/markdown
Requires-Dist: Click

<p>
  <img alt="logo" src="https://github.com/ehne/ERDot/raw/master/logo.png" align="center"/>
</p>
<h1 align="center">
  Welcome to ERDot 👋
</h1>
<p>
  <a href="https://pypi.org/project/ERDot/">
    <img alt="PyPI" src="https://img.shields.io/pypi/v/ERDot?color=blue">
  </a>
  <a href="https://github.com/ehne/ERDot/blob/master/LICENSE">
    <img alt="License: MIT" src="https://img.shields.io/github/license/ehne/ERDot" />
  </a>
</p>

> Creates Entity Relationship Diagrams from JSON code.

## Installation
to install ERDot:

```pip install ERDot```

you may also need to [install graphvis](https://graphviz.org/download/) to be able to create images of the dot files generated. If you don't want to install graphviz, you can copy the contents of the generated dot file into an [online grapviz viewer](https://edotor.net).

## CLI Usage
```
Usage: erdot INPUTFILE [OPTIONS]

Options:
  INPUTFILE        TEXT  The input ERDJSON file (.erd.json)  [required]
  -o, --outputFile TEXT  The graphvis dot file to write to (.dot) [not required]
  --help                 Show this message and exit.
```

Note that after generating the .dot file, you will still need to output it to your desired format using graphviz. An example of how to do this:

```bash
erdot example.erd.json 

dot example.dot -Tpng -o imageFile.png
```

(You could also copy and paste the contents of the .dot file into an [online graphviz viewer](https://edotor.net))

## ERDJSON format:
```json
{
    "tables":{
        ...
    },
    "relations":[
        ...
    ],
    "rankAdjustments":"...",
    "label":"..."
}   
```

Every single one of these sections are required, however, if you dont need that specific feature (for example label or rankAdjustments), just leave the value blank

### table:
Each table inside of the table section of the ERDJSON document is formated like this:

```json
"TableName": {
      "*PrimaryKey": "Int(10)",
      "+ForeignKey": "Int(10)",
      "RandomData": "Char(70)"
    }
```

the general idea is that the key is the column name, and the value is the type.

you will also notice the `*` and `+` next to the column names, these indicate primary and foriegn keys respectively. You can combine two of these together into a primary foreign key, just by putting both a `*` and a `+` next to the name.

### relations:
each element in the relations array of the ERDJSON document is formatted like this:

```json
"TableOne:PrimaryKey 1--* TableTwo:ForeignKey"
```

There are three elements that make up the relation string, (1) the left hand side, (2) the cardinality indicator, and (3) the right hand side. 

#### Left and Right hand side:
The sides of the relation string consist of two elements, separated by a `:`. the text before the `:` indicates what table it is in, and the text after the `:` indicates what specific column it should use to link. (note how you dont include the `+` or `*` in the specific column text).

#### Cardinality indicator:
Each relationship must have two of these cardinalities in the indicator, separated by `--`:

```
Cardinality    Syntax
0 or 1         ?
exactly 1      1
0 or more      *
1 or more      +
```

So for example, the following defines a relationship between Person's PersonID primary key and BirthPlace's PersonID foreign key that reads "every person has exactly one birth place, linked together using PersonID":

```python
Person:PersonID *--1 BirthPlace:PersonID
```

### rankAdjustments
applies graphvis' rank adjustments to adjust where the tables appear in the final image. (note that it is only one string)

```js
{ rank=min; TableOne Tabletwo }; // sets TableOne and TableTwo to be in the minimum rank (left)
{ rank=same; TableThree TableFour }; // sets TableThree and TableFour to be in the same rank
{ rank=max; TableFive }; // sets TableFive to be in the maximum rank (right)
```

### Label
a string that sets what label will be drawn on top of the ERD, think of it like the title of the ERD.

## Example ERDJSON:
```json
{
    "tables":{
        "Person":{
            "*name":"char()",
            "height":"int()",
            "weight":"int()",
            "birthDate":"date()",
            "+birthPlaceID":"int()"
        },
        "BirthPlace":{
            "*id":"int()",
            "birthCity":"char()",
            "birthState":"char()",
            "birthCountry":"char()"
        }
    },
    "relations":[
        "Person:birthPlaceID *--1 BirthPlace:id"
    ],
    "rankAdjustments":"",
    "label":""
}
```

which then creates this image:

<img alt="logo" src="https://github.com/ehne/ERDot/raw/master/example/example.png" align="center"/>


## Author

👤 **Darcy Lugt-Falk**

* Website: [darcylf.me](https://darcylf.me)
* Github: [@ehne](https://github.com/ehne)

## Show your support

Give a ⭐️ if this project helped you!

***
_This README was generated with ❤️ by [readme-md-generator](https://github.com/kefranabg/readme-md-generator)_


