Chris Hill-Scott 0f68d25265 Replace custom pip freeze script with pip-tools
In the past we've avoided using out-of-the-box solutions for Python
dependency resolution because a) they haven't been very mature and b)
we've had lots of issues with version conflicts. See [[1]], [[2]] for
details. Instead, we've been using a custom Python script that
under-the-hood runs `pip freeze` and saves the output to
`requirements.txt`.

This script works well for us, but it doesn't integrate well with other
tools. On the other hand [`pip-tools`](https://github.com/jazzband/pip-tools)
as of 2020 seems to be well-supported by its maintainers and other
tools; for instance, GitHub's automated update service
[Dependabot](https://dependabot.com) supports `requirements.in` files.

This commit replaces our `freeze-requirements` make command with
`pip-compile`.

The Digital Marketplace team have made this change and seem happy with
the results.
2021-01-08 17:02:39 +00:00

notifications-admin

GOV.UK Notify admin application - https://www.notifications.service.gov.uk/

Features of this application

  • Register and manage users
  • Create and manage services
  • Send batch emails and SMS by uploading a CSV
  • Show history of notifications

First-time setup

1. Install Homebrew

Install Homebrew, a package manager for OSX:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

2. Make sure you're using correct language versions

Languages needed

  • Python 3.6.x
  • Node 10.15.3 or greater
  • npm 6.4.1 or greater

Need to install node? Run:

brew install node

2.1. pyenv For Python version management

pyenv is a program to manage and swap between different versions of Python. To install:

brew install pyenv

And then follow the further installation instructions in https://github.com/pyenv/pyenv#installation to configure it.

2.2. n For Node version management

NPM is Node's package management tool. n is a tool for managing different versions of Node. The following installs n and uses the long term support (LTS) version of Node.

npm install -g n
n lts

3. Install NPM dependencies

npm install
npm rebuild node-sass

4. Install and use virtualenvwrapper (optional)

We suggest using a virtualenv to separate the python dependencies for this project from python dependencies for other projects.

Install virtualenvwrapper:

pip install virtualenvwrapper

Then follow the virtualenvwrapper installation instructions docs to configure virtualenvwrapper for your terminal.

Set up your virtualenv:

mkvirtualenv notifications-admin

If you need to specify a certain version of python you can do this using -p, for example:

mkvirtualenv -p ~/.pyenv/versions/3.6.3/bin/python notifications-admin

Activate your virtualenv:

workon notifications-admin

5. Install Python dependencies

Install dependencies and build the frontend assets:

./scripts/bootstrap.sh

Note: You may need versions of both Python 3 and Python 2 accessible to build the python dependencies. pyenv is great for that, and making both Python versions accessible can be done like so:

pyenv global 3.6.3 2.7.15

6. Create a local environment.sh file

In the root directory of the application, run:

echo "
export NOTIFY_ENVIRONMENT='development'
export FLASK_APP=application.py
export FLASK_DEBUG=1
export WERKZEUG_DEBUG_PIN=off
"> environment.sh

7. AWS credentials

Your aws credentials should be stored in a folder located at ~/.aws. Follow Amazon's instructions for storing them correctly

8. Running the application

In the root directory of the application, run:

./scripts/run_app.sh

Then visit localhost:6012

Updating application dependencies

requirements.txt file is generated from the requirements-app.txt in order to pin versions of all nested dependencies. If requirements-app.txt has been changed (or we want to update the unpinned nested dependencies) requirements.txt should be regenerated with

make freeze-requirements

requirements.txt should be committed alongside requirements-app.txt changes.

Automatically rebuild the frontend assets

If you want the front end assets to re-compile on changes, leave this running in a separate terminal from the app

    npm run watch

Working with static assets

When running locally static assets are served by Flask at http://localhost:6012/static/…

When running on preview, staging and production theres a bit more to it:

notify-static-after

Description
The UI of Notify.gov
Readme 527 MiB
Languages
Python 69.3%
HTML 16.6%
JavaScript 11.1%
SCSS 0.9%
Nunjucks 0.7%
Other 1.4%