/CountryRank

Using your preferences rank all countries based on existing rankings.

Primary LanguagePythonGNU General Public License v3.0GPL-3.0

CountryRank

Slides explaining roadmap.

Simple project that given your preferences for different country attributes returns a ranked list of countries.

The original design was:

  1. rankings submodule that imports and pre-processes data series.
  2. restrict list of countries being compared.
  3. join data series into DataFrame using countries as index.
  4. rank DataFrame using your preference weights.
  5. return ranked list of countries.

There was a original version, but it was lost due to accidentally killed container, all that remained is this screenshot.

List of my preferences and some links to data

Currently downloaded rankings

  1. Social mobility by WorldBank source, data
  2. IMF GDP per Capita source, data
  3. MIPEX Immigrant Integration ranking 2015 source, data
  4. Human development report source, data
  5. Freedom of the Internet report 2018 source, data
  6. Passport Index Data original source, source, data

Other rankings

We are aware of the following rankings, but they have not been integrated yet:

  1. Corruption Perception Index by Transparency International: source

CountryRank API

Features

  • FastAPI with Python 3.8
  • React 16 with Typescript, Redux, and react-router
  • Postgres
  • SqlAlchemy with Alembic for migrations
  • Pytest for backend tests
  • Jest for frontend tests
  • Perttier/Eslint (with Airbnb style guide)
  • Docker compose for easier development
  • Nginx as a reverse proxy to allow backend and frontend on the same port

Development

The only dependencies for this project should be docker and docker-compose.

Quick Start

Starting the project with hot-reloading enabled (the first time it will take a while):

docker-compose up -d

To run the alembic migrations (for the users table):

docker-compose run --rm backend alembic upgrade head

And navigate to http://localhost:8000

Note: If you see an Nginx error at first with a 502: Bad Gateway page, you may have to wait for webpack to build the development server (the nginx container builds much more quickly).

Auto-generated docs will be at http://localhost:8000/api/docs

Rebuilding containers:

docker-compose build

Restarting containers:

docker-compose restart

Bringing containers down:

docker-compose down

Frontend Development

Alternatively to running inside docker, it can sometimes be easier to use npm directly for quicker reloading. To run using npm:

cd frontend
npm install
npm start

This should redirect you to http://localhost:3000

Frontend Tests

cd frontend
npm install
npm test

Migrations

Migrations are run using alembic. To run all migrations:

docker-compose run --rm backend alembic upgrade head

To create a new migration:

alembic revision -m "create users table"

And fill in upgrade and downgrade methods. For more information see Alembic's official documentation.

Testing

There is a helper script for both frontend and backend tests:

./scripts/test.sh

Backend Tests

docker-compose run backend pytest

any arguments to pytest can also be passed after this command

Frontend Tests

docker-compose run frontend test

This is the same as running npm test from within the frontend directory

Logging

docker-compose logs

Or for a specific service:

docker-compose logs -f name_of_service # frontend|backend|db

Project Layout

backend
└── app
    ├── alembic
    │   └── versions # where migrations are located
    ├── api
    │   └── api_v1
    │       └── endpoints
    ├── core    # config
    ├── db      # db models
    ├── tests   # pytest
    └── main.py # entrypoint to backend

frontend
└── public
└── src
    ├── components
    │   └── Home.tsx
    ├── config
    │   └── index.tsx   # constants
    ├── __tests__
    │   └── test_home.tsx
    ├── index.tsx   # entrypoint
    └── App.tsx     # handles routing