How do commits to open source projects on GitHub distribute in time and geography?
GeoGitHub application visualizes the geographical commits distribution of a chosen repository.
This is a rather simple app, however, I've built it on top of the react+redux stack for the following reasons:
- It allows to build things relatively fast
- It adds a convenient structure to the application
- Redux allows you to reason about data flow in a clear way
Nevertheless, I've challenged myself not to use third party libraries a lot, so things like data fetching logic and animations are implemented primarily by myself on pure js and native browser APIs.
Application roughly consists of following parts:
- React. Responsible for UI components.
- Redux. Responsible for handling events and providing state store for components.
- Fetch class. Does all the low-level job for talking with APIs, keep track of rate-limits and other HTTP issues.
- GithubDataprovider. Uses Fetch instances for retrieving data from GitHub and Mapbox and builds an initial dataset.
- GeoEventsTimeline. Converts initial dataset into the array, where each element has all necessary data to be plotted on the map and the timeline.
- Mapbox react component. Takes an instance of GeoEventsTimeline with commits data, builds a model for canvas and animates it. Here I've used 3 helper libs from the d3 world:
- d3-timer – a convenient abstraction above
requestAnimationFrame
- d3-ease – set of ease functions to make animation more natural
- d3-scale – simple way to map numbers into beautiful colour range
- d3-timer – a convenient abstraction above
This app uses two external APIs:
- GitHub provides all data about commits and committers
- Mapbox is used for geocoding (converts location names into geo coordinates) Mapbox is used for its awesome looking maps and rate-limits for geocoding. It's much more generous compared to GoogleMaps API.
First of all,
npm install
This application talks with GitHub and Mapbox APIs so you need to generate access tokens for this services.
See How to get access tokens section below.
The following command starts dev server:
GITHUB_TOKEN=<github_access_token> MAPBOX_TOKEN=<mapbox_access_token> npm run start:dev
Now you cat open application on localhost:8000
If you want just to build a project, run:
GITHUB_TOKEN=<github_access_token> MAPBOX_TOKEN=<mapbox_access_token> npm run build:dev
To build production version of Geo GitHub application just run
GITHUB_TOKEN=<github_access_token> MAPBOX_TOKEN=<mapbox_access_token> npm run build
A simple way to serve content of the ./dist
directory over HTTP on a local machine is:
cd ./dist
python -m SimpleHTTPServer
As far as this application talks with GitHub and Mapbox APIs, first you need to generate access tokens for this services.
To generate GitHub access token make sure you signed into GitHub account and go to /settings/tokens. Click "Generate new token". There is no need to check any permission checkboxes.
To get mapbox access token, sign up for this service and create net token here: /studio/account/tokens/
- This app tested only on MacOS, mainly in Chrome 61 and Firefox 56.
- It has a critical issue with data fetching in Safari.
- Don't resize viewport after the app is launched.
- Sometimes GitHub responds with abuse protection 403 errors. The application can handle it, but it slows down fetch process. Be patient!
Look at kubernetes/kubernetes
, moby/moby
and golang/go
repos – they are nice.
Interesting fact: ruby/ruby
created mostly by Japan.