{"id":19493585,"url":"https://github.com/datapane/be-hiring-challenge","last_synced_at":"2025-09-11T02:37:49.182Z","repository":{"id":44642644,"uuid":"227795328","full_name":"datapane/be-hiring-challenge","owner":"datapane","description":"Hiring Challenge for Backend Developers","archived":false,"fork":false,"pushed_at":"2022-02-06T10:06:44.000Z","size":10,"stargazers_count":6,"open_issues_count":0,"forks_count":17,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-07-21T13:42:49.843Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/datapane.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-12-13T08:45:31.000Z","updated_at":"2024-07-15T05:20:55.000Z","dependencies_parsed_at":"2022-08-26T09:21:21.206Z","dependency_job_id":null,"html_url":"https://github.com/datapane/be-hiring-challenge","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/datapane/be-hiring-challenge","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datapane%2Fbe-hiring-challenge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datapane%2Fbe-hiring-challenge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datapane%2Fbe-hiring-challenge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datapane%2Fbe-hiring-challenge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/datapane","download_url":"https://codeload.github.com/datapane/be-hiring-challenge/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datapane%2Fbe-hiring-challenge/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":274568473,"owners_count":25309281,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-11T02:00:13.660Z","response_time":74,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-10T21:26:39.549Z","updated_at":"2025-09-11T02:37:49.164Z","avatar_url":"https://github.com/datapane.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Backend API Hiring Challenge\n\n# Introduction\n\nDatapane is an API-driven product that provides client libraries / commandline applications that talk to an API server to handle and process datasets.\n\nThis challenge involves building a small API server and corresponding command-line client, both in Python, that allow uploading and processing CSV files, such as those included in the repo.\n\n\n# Task\n\nFor this task we'll be building a very simple Python 3-based REST API server and command-line client. \n\nYou may use any Python libraries and technologies of your choice, for instance Django, Flask, FastAPI, etc, to build the API server (internally we use Django/DRF so recommend that).\n\n## API Server\n\nThe API server should have a single root endpoint, `/dataset/`, that allows list and CRUD operations over a dataset object via the following API / HTTP verbs:\n\n - `GET /datasets/` - list the uploaded datasets\n - `POST /datasets/` - creates a dataset. This endpoint takes a CSV file as input, and stores it somewhere/how on the server as a pandas dataframe. A reference to this created object is returned by the endpoint, for instance an `id` or `url`.\n - `GET /datasets/\u003cid\u003e/` - return the file name, and size of the dataset object\n - `DELETE /datasets/\u003cid\u003e/` - delete the dataset object\n - `GET /datasets/\u003cid\u003e/excel/` - export the dataset as an excel file\n - `GET /datasets/\u003cid\u003e/stats/` - return the the stats generated by running `df.describe()` on the pandas dataframe as a json object\n - `GET /datasets/\u003cid\u003e/plot/` - generate and return a PDF containing a list of histograms of all the numerical columns in the dataset\n\n## Client Library\n\nThe client app should be a fully standalone command-line python application, that is easily installable and runnable. The app should provide command-line arguments that correspond and support each of the API actions above - how you structure the command line arguments and what you call them is left up to yourselves.\n\n## Technologies\n\n- A Python 3 framework that supports generating JSON APIs (we highly recommend Django and DRF as we use these ourselves)\n- Build systems, tools, and scripts of your choice, e.g. poetry, setup.py, docker, etc.\n- Any libraries you may find useful to help your task, we prioritise using existing libraries to accomplish tasks rather than building in-house\n\n## Requirements\n\n- Multi-user support and log-in is NOT required for this project\n- Instructions should be provided on how to build / bundle / start the system\n- You should aim to use the latest Python language features, ecosystem, tooling, and libraries where possible\n\n### Optional Requirements\n\n- As CSVs can be untrusted, you should consider running the CSV importing within a container / sandbox\n\n# Review\n\nPlease don't spend more than 2-4 hours on this - we're looking to see how you approached the problem and the decisions made rather than a complete solution. This should be a fun challenge rather than a stressful endeavour.\n\nThere is no right answer as such, we will mainly be looking at code quality, software architecture skills, completeness of the solution from a software engineering perspective, and clarity of thought.\n\nOnce completed, please create a PR containing your work, send us an email, and book a second follow-up interview via angellist (https://angel.co/schedule/mandeep-gill-2).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdatapane%2Fbe-hiring-challenge","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdatapane%2Fbe-hiring-challenge","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdatapane%2Fbe-hiring-challenge/lists"}