From a82fbfce41c8ac53b4a06b33c8241613dca76f00 Mon Sep 17 00:00:00 2001 From: Ykaros Date: Fri, 26 Jan 2024 15:56:30 -0500 Subject: [PATCH] Update to contributing.md #1543 (#1610) --- archive/aws/CONTRIBUTING.md | 89 ++++++++++++----------- archive/aws/misc/images/architecture.png | Bin 0 -> 39103 bytes 2 files changed, 48 insertions(+), 41 deletions(-) create mode 100644 archive/aws/misc/images/architecture.png diff --git a/archive/aws/CONTRIBUTING.md b/archive/aws/CONTRIBUTING.md index 527bd9a31..24a2b63cd 100644 --- a/archive/aws/CONTRIBUTING.md +++ b/archive/aws/CONTRIBUTING.md @@ -1,47 +1,44 @@ -# Engineering Getting Started +# Project Overview Welcome! This readme assumes you have already listened to the 311-data pitch, and gone through the basic onboarding. The following will be more geared towards the programming side of 311-data and getting your development environment setup. If you run into any problems, please submit a new issue. -## Feature Branching -For development we use feature branching to ensure easy collaboration. There aren't any rules to branch naming or how many branches you are allowed to have, but the recommended convention would look like `issueId-Prefix-MinimalDescription` -For example, a documentation branch could look like `138-DOC-OnboardingUpdate`. - -Read more about feature branching [here](https://www.atlassian.com/git/tutorials/comparing-workflows/feature-branch-workflow). - -## Default Branch -Building on feature branching, we treat the `dev` branch as the main contribution branch. Pull requests to this branch should be as frequent as developers are closing issues *(Hopefully very frequent!)*. Pushes to `master` will be much less frequent and will be handled by administrators. With this workflow, `master` will have an extra layer of protection and should always represent a working version of the application. +Before we dive into contributing the project, going through each component of the project that might help you gain quick understanding about how they integrate into our project. -In other words, whenever you are about to start on a new feature, checkout your branch based off of the `dev` branch. Your command would look something like `git checkout -b 567-BACK-NewEndpoint dev`. See [this stackoverflow post](https://stackoverflow.com/questions/4470523/create-a-branch-in-git-from-another-branch) for more context. - -## Branch Protection/Github Actions -We use [Github Actions](https://github.com/features/actions) to run our continuous integration (CI). These actions include status checks that run whenever you submit a pull request to `dev` or `master`. When you submit a PR, Github will run a set of operations to build and test all or part of the codebase. If any of these steps fail, the pull request will not be allowed to be merged until they are fixed. From the pull request UI you can find the reason an operation may have failed in the status checks section towards the bottom. - -If you want to look at our setup, check out the "Actions" tab in Github, as well as the [workflows directory](https://github.com/hackforla/311-data/tree/master/.github/workflows), which contains the code that Github runs when actions are triggered. - -In addition to status checks, PR's are required to have at least one reviewer before being merged into `dev` or `master`. +Here is our architecture diagram. +![System diagram](misc/images/architecture.png) +## Recurring 311-data Update +Our data is obtained from [MyLA311 Service Request Data](https://data.lacity.org/browse?q=myla311%20service%20request%20data&sortBy=relevance) and updated on a daily basis. +## DuckDB +Since we do not have a backend server, we use DuckDB to process and store data from CSV files obtained as mentioned previously. +## Front End +The front end is written in React/Redux as the application is a reporting dashboard with several visualizations driven by sets of filters. If you are unfamiliar, we recommend starting [here](https://hackernoon.com/getting-started-with-react-redux-1baae4dcb99b). -## Testing -CI Is driven by tests, they help instill confidence in pull requests because a developer can say "All the status checks pass and my new tests pass so the PR is safe to merge" When contributing new features, it is most ideal to write at least 4 tests targeting your code. - - One for the "happy path" - - Test the endpoint/feature in the way it is intended to be used - - One for the "extreme path" - - Test with extreme inputs/characteristics (What if I use 10,000 XYZ) - - One for the "negative path" - - Test with strange input, (What if I send characters to a function that expects integers) - - One for the "null path" - - Test with empty params/nothing/emptiness +# Git Operations +If you have prior experiences with git, you can skip this section. +## Git 101 +1. Clone a Repository: `git clone https://github.com/hackforla/311-data.git` +2. Add Changes: `git add ` +3. Commit Changes: `git commit -m ""` (provide a message to describe changes) +4. Push Changes to Repo: `git push origin ` +5. Note: make sure you sync with the repo by `git fetch` and `git pull` +## Feature Branching +For development we use feature branching to ensure easy collaboration. There aren't any rules to branch naming or how many branches you are allowed to have, but the recommended convention would look like `issueId-Prefix-MinimalDescription` +For example, a documentation branch could look like `1534-feature-description` by creating a new branch with `git checkout -b 1534-feature-description` -Our front end tests are run through Enzyme and our backend tests are run through Pytest. -## System architecture -Here is our rough draft of our architecture diagram: -![System diagram](misc/images/311-system-architecture.png) +Read more about feature branching [here](https://www.atlassian.com/git/tutorials/comparing-workflows/feature-branch-workflow). -## Postgres -Our persistence layer is run by Postgresql. You can review [this](https://www.tutorialspoint.com/postgresql/postgresql_overview.html) if you are unfamiliar. -For local development, we utilize a volatile docker container through docker compose. This is meant for experimentation and working with datasets in isolation. +# Quick Start +* Ensure that node version manager (nvm) is installed (e.g. follow a [tutorial](https://heynode.com/tutorial/install-nodejs-locally-nvm/)) +* Run `nvm install lts/erbium` +* Run `nvm use lts/erbium` +* Confirm you are using Node 12 by running `node -v` (e.g. `Now using node v12.22.12 (npm v6.14.16)`) +* Clone the repo +* cd 311-data/ +* cp .example.env .env +* Edit .env and supply a valid MAPBOX_TOKEN. If you are a member of hack4la, please contact someone in 311-engineering for one +* npm run setup && npm start +* Visit http://localhost:3000 -## Python -Since this project is very data driven, we have targeted python 3 as our backend language. It is utilized in isolation for discovery and exploration. As we get closer to deployment, the exploration work done by the data team will be converted into web server code to enable an interface for the front end to connect to. ## Virtual Environments Package management in python is handled through our [requirements.txt](https://github.com/hackforla/311-data/blob/master/server/api/requirements.txt). When cloning the repo, this file should allow any python developer to retrieve all the requirements necessary to run the backend. A virtual environment is an organizational structure to isolate your pip dependencies. @@ -51,11 +48,6 @@ This will create the virtual enviroment in the home folder under `.envs` and it Running this command does not mean you are _in_ the virtual environment yet. in order to utilize the environment, run `source ~/.envs/311-data/bin/activate` and your terminal should now be prefixed with `(311-data)`. -## Flask/Sanic -For backend work we are using an asynchronous variant of python-flask called Sanic. You can read more about the specific differences [here](https://www.fullstackpython.com/sanic.html). - -## React -The front end is written in React/Redux as the application is a reporting dashboard with several visualizations driven by sets of filters. If you are unfamiliar, we recommend starting [here](https://hackernoon.com/getting-started-with-react-redux-1baae4dcb99b). ## API Secrets We use `.env` files to store secrets and other configuration values. These files are excluded from version control so that secrets are not pushed to our public repository. If you update one of the example `.env` value to include new configuration, be sure not to include secrets when you push to Github. @@ -70,3 +62,18 @@ https://data.lacity.org/resource/pvft-t768.csv &$group=Address&$order=CallVolume%20DESC &$limit=50000000 ``` + +# Code Quality +When contributing code to the project, there are some principles to bear in mind: +## Readability: +1. Proper indentation, comments and documentation +2. Meaningful variable names +3. Consistent coding style + +## Scalability +1. Modularized functions +2. Proper error and exception handling + +## Maintainability +1. Avoid unnecessary complexity +2. Follow a clear and logical structure \ No newline at end of file diff --git a/archive/aws/misc/images/architecture.png b/archive/aws/misc/images/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..9734b35e589f5ff1ec5c5a21b87b89c76495f09b GIT binary patch literal 39103 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