# dj-hubspot - Django + HubSpot Made Easy

[![CI tests](https://github.com/pfouque/dj-hubspot/actions/workflows/ci.yml/badge.svg)](https://github.com/pfouque/dj-hubspot/actions/workflows/ci.yml)
[![Package Downloads](https://img.shields.io/pypi/dm/dj-hubspot)](https://pypi.org/project/dj-hubspot/)
[![Documentation](https://img.shields.io/static/v1?label=Docs&message=READ&color=informational&style=plastic)](https://dj-hubspot.github.io/dj-hubspot/)
[![MIT License](https://img.shields.io/static/v1?label=License&message=MIT&color=informational&style=plastic)](https://github.com/sponsors/dj-hubspot)

HubSpot Models for Django.

## Introduction

dj-hubspot implements all of the HubSpot models, for Django. Set up your
webhook endpoint and start receiving model updates. You will then have
a copy of all the HubSpot models available in Django models, as soon as
they are updated!

## Features

-   TODO

## Requirements

-   Django >=3.2
-   Python >=3.8
-   PostgreSQL engine (recommended) >=9.6
-   MySQL engine: MariaDB >=10.2 or MySQL >=5.7
-   SQLite: Not recommended in production. Version >=3.26 required.

## Contribute

Django app template, using `poetry-python` as dependency manager.

This project is a template that can be cloned and re-used for
redistributable apps.

It includes the following:

* `poetry` for dependency management
* `isort`, `black`, `pyupgrade` and `flake8` linting
* `pre-commit` to run linting
* `mypy` for type checking
* `tox` and Github Actions for builds and CI

There are default config files for the linting and mypy.

### Principles

The motivation for this project is to provide a consistent set of
standards across all YunoJuno public Python/Django projects. The
principles we want to encourage are:

* Simple for developers to get up-and-running
* Consistent style (`black`, `isort`, `flake8`)
* Future-proof (`pyupgrade`)
* Full type hinting (`mypy`)

### Versioning

We currently support Python 3.7+, and Django 3.2+. We will aggressively
upgrade Django versions, and we won't introduce hacks to support
breaking changes - if Django 4 introduces something that 2.2 doesn't
support we'll drop it.

### Coding style

We use [pre-commit](https://pre-commit.com/) to run code quality tools.
[Install pre-commit](https://pre-commit.com/#install) however you like (e.g. `pip install pre-commit` with your system python) then set up pre-commit to run every time you commit with:

```bash
> pre-commit install
```

You can then run all tools:

```bash
> pre-commit run --all-files
```

For more info, see the docs, or the code quality chapters in *Boost Your Django DX*.

### Tests

##### Tests package

The package tests themselves are _outside_ of the main library code, in
a package that is itself a Django app (it contains `models`, `settings`,
and any other artifacts required to run the tests (e.g. `urls`).) Where
appropriate, this test app may be runnable as a Django project - so that
developers can spin up the test app and see what admin screens look
like, test migrations, etc.

##### Running tests

The tests themselves use `pytest` as the test runner. If you have
installed the `poetry` evironment, you can run them thus:

```
$ poetry run pytest
```

or

```
$ poetry shell
(djhubspot) $ pytest
```

The full suite is controlled by `tox`, which contains a set of
environments that will format, lint, and test against all
support Python + Django version combinations.

```
$ tox
...
______________________ summary __________________________
  fmt: commands succeeded
  lint: commands succeeded
  mypy: commands succeeded
  py37-django22: commands succeeded
  py37-django32: commands succeeded
  py37-djangomain: commands succeeded
  py38-django22: commands succeeded
  py38-django32: commands succeeded
  py38-djangomain: commands succeeded
  py39-django22: commands succeeded
  py39-django32: commands succeeded
  py39-djangomain: commands succeeded
```

##### CI

There is a `.github/workflows/tox.yml` file that can be used as a
baseline to run all of the tests on Github. This file runs the oldest
(2.2), newest (3.2), and head of the main Django branch.
