# Local Machine Development Setup
## Cloning the project
$ git clone git@github.com:SFDO-Tooling/Metecho
$ cd Metecho
## Making A Virtual Env
Metecho development requires Python v3.10. If `which python3.10` returns a
non-empty path, it's already installed and you can continue to the next step. If
it returns nothing, then install Python v3.10 using `brew install python`, or
from [Python.org](https://www.python.org/downloads/).
Assuming you're in the repo root, do the following to create a virtualenv (once
you have
[virtualenvwrapper](https://virtualenvwrapper.readthedocs.io/en/latest/)
installed locally):
mkvirtualenv metecho --python=$(which python3.10)
setvirtualenvproject
Install Python requirements:
pip install -r requirements/dev.txt
pip install -r requirements/prod.txt
Create an `.env` file with the required environment variables:
cp env.example .env
Edit this file to change `DJANGO_SECRET_KEY` and `DJANGO_HASHID_SALT` to any two
different arbitrary string values.
Next, run the following commands to generate a database encryption key:
python
>>> from cryptography.fernet import Fernet
>>> Fernet.generate_key()
This will output a bytestring, e.g. `b'mystring='`. Copy only the contents of
`'...'`, and add it to your `.env` file as `DB_ENCRYPTION_KEY`, e.g.
`DB_ENCRYPTION_KEY="mystring="`.
To exit the Python shell, press `Ctrl-Z` and then `Enter` on Windows, or
`Ctrl-D` on OS X or Linux. Alternatively, you could also type the Python command
`exit()` and press `Enter`.
Finally, set the following environment variables:
SFDX_HUB_KEY=...
SFDX_CLIENT_ID=...
SFDX_CLIENT_SECRET=...
GITHUB_HOOK_SECRET=...
GITHUB_CLIENT_ID=...
GITHUB_CLIENT_SECRET=...
GITHUB_APP_ID=...
GITHUB_APP_KEY=...
Note that none of the values should be quoted, and the variables prefixed with
`DOCKER_` can be removed.
**All of the remaining steps assume that you have the virtualenv activated.**
(`workon metecho`)
## Installing JavaScript Requirements()
The project uses [nvm](https://github.com/nvm-sh/nvm) to install a specific
version of [Node.js](http://nodejs.org). Assuming you have `nvm` already
installed and configured, run `nvm install` to install and activate the Node
version specified in `.nvmrc`. Then use [yarn](https://yarnpkg.com/) to install
dependencies:
nvm use
yarn
**All of the remaining steps assume that you have the nvm activated.**
(`nvm use`)
## Setting Up The Database
Assuming you have [Postgres](https://www.postgresql.org/download/) installed and
running locally:
createdb metecho
Then run the initial migrations:
python manage.py migrate
If your database has outdated sample data for development, remove it with:
python manage.py truncate_data
To populate the database with sample data for development, run:
python manage.py populate_data
## Running The Server
The local development server requires [Redis](https://redis.io/) to manage
background worker tasks. If you can successfully run `redis-cli ping` and see
output `PONG`, then you have Redis installed and running. Otherwise, run
`brew install redis` (followed by `brew services start redis`) or refer to the
[Redis Quick Start](https://redis.io/topics/quickstart).
To run the local development server:
yarn serve
This starts a process running Django, a process running Node, and an `rq` worker
process. The running server will be available at .
Recent versions of macOS have added security to restrict multithreading by
default. If running on macOS High Sierra or later, you might need to set
`OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES` via an additional environment
variable.
## Development Tasks
- `yarn serve`: starts development server (with watcher) at
(assets are served from `dist/` dir)
- `yarn test`: run all tests
- `yarn test:py`: run Python tests
- `yarn test:js`: run JS tests
- `yarn test:js:watch`: run JS tests with a watcher for development
- `yarn lint`: formats and lints all files
- `yarn lint:js`: formats, lints, and type-checks `.js` files
- `yarn lint:sass`: formats and lints `.scss` files
- `yarn lint:py`: formats and lints `.py` files
- `yarn prettier:js`: formats `.js` files
- `yarn lint:other`: formats `.json`, `.md`, and `.yml` files
- `yarn tsc`: runs JS type-checking
- `yarn build`: builds development (unminified) static assets into `dist/` dir
- `yarn prod`: builds production (minified) static assets into `dist/prod/` dir
- `yarn storybook`: build storybook and run dev server