Skip to main content

Tools to help plan deliveries for Bellingham Food Bank.

Project description

Bellingham Food Bank delivery planning toolkit

Summary

This set of tools cuts some cruft around creating delivery route manifests. It's made from the reference_package template repo: https://github.com/crickets-and-comb/reference_package. See the docs: https://crickets-and-comb.github.io/bfb_delivery/.

The plan is to continue to build this package out to take on more of the tasks food bank staff do manually to plan the delivery routes.

They currently use Circuit (https://getcircuit.com), but there are some tedious tasks to prepare the data for Circuit and then to process the data after using Circuit. They currently upload all the stops they need to Circuit to produce a single huge route, then they manually chunk up the route by driver according to how many boxes a driver can carry and what is a sensible set of stops, and finally they upload those smaller routes to Circuit again to optimize them. They spend several hours each week on the manual pieces of this, the chunking alone taking about four hours.

At this point, this package will do most of that short of uploading and downloading from Circuit. That functionality is on the way.

What it does so far

  1. Splits a spreadsheet of delivery stops labeled by driver into n workbooks (1 per staff member working on the route generation), one workbook sheet per driver. This allows staff to split the task of submitting unique driver routes to Circuit. The tool for this is called split_chunked_route. See below and/or docs for usage.

  2. Combines route CSVs into a single workbook with a sheet for each route. The tool for this is called combine_route_tables.

  3. Formats the routes workbook into driver manifests to print, with format_combined_routes.

See docs for usage: https://crickets-and-comb.github.io/bfb_delivery/.

Dev plan

Without replacing Circuit, there are some processes that can be further automated:

  • Chunking by driver: This may be the most challenging piece, I'm only a little confident I can solve this well enough to justify using my solution. So, I will save it for after I've cleared some of the low-hanging fruit. My first plan of attack is to try using k-nearest neighbors. But, there are additional constraints to consider per driver. It may not be possible to encode all of them, but knocking out some of them may help cut down time.

  • Wrapping the sheet combining and formatting into a single tool. This is simple and forthcoming. But, I am pausing to allow users to adopt the two-step method and provide feedback, discover bugs, etc. If one part of it breaks, they can at least still use the other part.

  • Uploading and exporting can be done via the Circuit API, which would enable more of the steps to be wrapped into a single ETL pipeline.

The plan of attack is to start with the low-hanging fruit of data formatting before moving onto the bigger problem of chunking. Integrating with the Circuit API may come before or after the chunking solution, depending on how complicated each proves.

Structure

    src/bfb_delivery/api            Public and internal API.
    src/bfb_delivery/cli            Command-line-interface.
    src/bfb_delivery/lib            Implementation.
    tests/e2e                       End-to-end tests.
    test/integration                Integration tests.
    tests/unit                      Unit tests.

Dependencies

Installation

Run pip install bfb_delivery. See https://pypi.org/project/bfb-delivery/.

Usage Examples

See docs for full usage.

Public API

bfb_delivery is a library from which you can import functions. Import the public split_chunked_route function like this:

    from bfb_delivery import split_chunked_route
    # These are okay too:
    # from bfb_delivery.api import split_chunked_route
    # from bfb_delivery.api.public import split_chunked_route

Or, if you're a power user and want any extra options that may exist, you may want to import the internal version like this:

    from bfb_delivery.api.internal import split_chunked_route

Unless you're developing, avoid importing directly from library:

    # Don't do this:
    from bfb_delivery.lib.formatting.sheet_shaping import split_chunked_route

CLI

Try the CLI with this package installed:

$ split_chunked_route --input_path "some/path_to/raw_chunked_sheet.xlsx"

See other options in the help menu:

$ split_chunked_route --help

CLI tools (see docs for more information):

  • combine_route_tables
  • split_chunked_route

Dev

Setting up shared tools

There are some shared dev tools in a Git submodule called shared. See https://github.com/crickets-and-comb/shared. When you first clone this repo, you need to initialize the submodule:

$ git submodule init
$ git submodule update

See https://git-scm.com/book/en/v2/Git-Tools-Submodules

Dev installation

You'll want this package's site-package files to be the source files in this repo so you can test your changes without having to reinstall. We've got some tools for that.

First build and activate the env before installing this package:

$ make build-env
$ conda activate bfb_delivery_py3.12

(Note, you will need Python activated, e.g. via conda base env, for build-env to work, since it uses Python to grab PACKAGE_NAME in the Makefile. You could alternatively just hardcode the name.)

Then, install this package and its dev dependencies:

$ make install

This installs all the dependencies in your conda env site-packages, but the files for this package's installation are now your source files in this repo.

Dev workflow

You can list all the make tools you might want to use:

$ make list-targets

Go check them out in Makefile.

QC and testing

Before pushing commits, you'll usually want to rebuild the env and run all the QC and testing:

$ make clean full

When making smaller commits, you might just want to run some of the smaller commands:

$ make clean format full-qc full-test

CI test run

Before opening a PR or pushing to it, you'll want to run locally the same CI pipeline that GitHub will run (.github/workflows/QC-and-build.yml). This runs on multiple images, so you'll need to install Docker and have it running on your machine: https://www.docker.com/

Once that's installed and running, you can use act. You'll need to install that as well. I develop on a Mac, so I used homebrew to install it (which you'll also need to install: https://brew.sh/):

$ brew install act

Then, run it from the repo directory:

$ make run-act

That will run .github/workflows/QC-and-build.yml and every other action tagged to the pull_request event. Also, since act doesn't work with Mac and Windows architecture, it skips/fails them, but it is a good test of the Linux build.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bfb_delivery-0.3.0.tar.gz (20.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

bfb_delivery-0.3.0-py3-none-any.whl (21.1 kB view details)

Uploaded Python 3

File details

Details for the file bfb_delivery-0.3.0.tar.gz.

File metadata

  • Download URL: bfb_delivery-0.3.0.tar.gz
  • Upload date:
  • Size: 20.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.0.1 CPython/3.12.8

File hashes

Hashes for bfb_delivery-0.3.0.tar.gz
Algorithm Hash digest
SHA256 e908c5f7fe6d26402a92db86bd1a681e24b8d550d1cef2f8d9b72b8c42da8fdd
MD5 65087a4b7df747b9ae35fbc161b7c759
BLAKE2b-256 4fdb4d4ae5989fddffd6bc69d60c92faa61da940fb19341cb2f8d6f3bbbf8025

See more details on using hashes here.

Provenance

The following attestation bundles were made for bfb_delivery-0.3.0.tar.gz:

Publisher: CI_CD.yml on crickets-and-comb/bfb_delivery

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bfb_delivery-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: bfb_delivery-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 21.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.0.1 CPython/3.12.8

File hashes

Hashes for bfb_delivery-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0925e9e3d7f3b0edd8037f627c4483d6d0f57fa333fd237d799a979b38a29277
MD5 767c38b763975f7dbd77fa6a32d16e08
BLAKE2b-256 141d3f6348bd950b7604360e793789f3dda435fde1480b9c9de703fba006596b

See more details on using hashes here.

Provenance

The following attestation bundles were made for bfb_delivery-0.3.0-py3-none-any.whl:

Publisher: CI_CD.yml on crickets-and-comb/bfb_delivery

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page