Skip to main content

Self storage space and inventory in Python

Calculate packed volume and keep an inventory of belongings going into storage. The package takes each item's outer measurements in centimetres, returns its volume in cubic metres, totals the volume by room and reads or writes the list as CSV. It uses Python 3.10 or newer, calculates with Decimal, has no dependencies and makes no network calls.

We built it at Wadaya Self Storage, an air-conditioned self storage facility in Tubli, Bahrain. A measured inventory helps people choose a unit and find their things later. Each item has an ID for its label, measurements are validated, and CSV exports protect text fields from being interpreted as spreadsheet formulas.

Install

pip install wadaya-moving-kit

You get the wadaya_moving_kit library and a wadaya-moving-kit command.

How much space an item takes

from wadaya_moving_kit import packed_volume_m3

packed_volume_m3(75, 50, 30)              # Decimal('0.1125'): one suitcase
packed_volume_m3(75, 50, 30, quantity=2)  # Decimal('0.225'): two of them

Length, width and height are in centimetres, as ints, floats, Decimals or numeric strings, so values from a form or a CSV can go straight in. Take them from the item as it will be stored: boxed, wrapped or taken apart. Anything that isn't a positive, finite number raises ValueError, with a message plain enough to show the person who typed it.

Keep a storage inventory

InventoryItem is one row of an inventory: an ID, the room it belongs to, a description, three measurements and a quantity. Each item checks itself when it's created, and summarize adds a list of them up.

from wadaya_moving_kit import InventoryItem, summarize

items = [
    InventoryItem("GR-1", "Guest room", "Suitcases", 75, 50, 30, quantity=2),
    InventoryItem("GR-2", "Guest room", "Rolled rug", 200, 30, 30),
    InventoryItem("MJ-1", "Majlis", "Floor cushions", 60, 60, 20, quantity=6),
]

totals = summarize(items)
totals["rows"]              # 3
totals["items"]             # 9
totals["packed_volume_m3"]  # Decimal('0.837')
totals["rooms"]             # {'Guest room': Decimal('0.405'), 'Majlis': Decimal('0.432')}

quantity lets one row stand for several identical things. Anything someone may want to find on its own later deserves a row and an ID of its own. A single item's volume is item.volume_m3.

Read and write CSV

read_inventory turns a CSV text stream into a list of InventoryItem, and write_inventory writes a list back out with a calculated packed_volume_m3 column.

from wadaya_moving_kit import read_inventory, summarize, write_inventory

with open("inventory.csv", encoding="utf-8-sig", newline="") as source:
    items = read_inventory(source)

print(summarize(items)["packed_volume_m3"])

with open("with-volumes.csv", "w", encoding="utf-8", newline="") as target:
    write_inventory(items, target)

The same inventory as a file:

item_id,room,description,length_cm,width_cm,height_cm,quantity
GR-1,Guest room,Suitcases,75,50,30,2
GR-2,Guest room,Rolled rug,200,30,30,1
MJ-1,Majlis,Floor cushions,60,60,20,6

An item_id is up to 32 letters, digits, hyphens and underscores, starts with a letter or digit, and can't repeat within a file. Rooms and descriptions can be written in Arabic or English; the column names stay in English. On reading, any packed_volume_m3 column is ignored and every volume is worked out again from the measurements, so a hand-edited file can't carry a stale total. To keep a spreadsheet from treating text as a formula, a room or description beginning with =, +, - or @ is saved with a leading apostrophe.

Command line

wadaya-moving-kit volume 75 50 30 --quantity 2           # 0.225 m³ for the two suitcases
wadaya-moving-kit summary inventory.csv                  # counts, total and a subtotal per room
wadaya-moving-kit summary inventory.csv --json           # the same, as JSON
wadaya-moving-kit export inventory.csv with-volumes.csv  # a copy with volumes added

With --json, volumes are returned as strings to preserve decimal precision. export will not overwrite an existing file. You can also run the commands with python -m wadaya_moving_kit if the script is not on your PATH.

From cubic metres to a storage unit

Storage units are rented by floor area. For stackable boxes, divide packed volume by the planned stacking height to estimate that area: 3 m³ stacked 1.5 m high covers about 2 m² before gaps and access space. Furniture may need a separate floor layout because it cannot always be stacked.

Our units in Tubli range from 1.5 to 25 m². If you build a size estimate using this package, allow for safe stacking, door dimensions and space to collect items. The library calculates volume; it does not check whether a load fits a particular unit.

MIT License. Write to hello@wadayaselfstorage.com with questions or suggestions.

Metadata

Release files for wadaya-moving-kit 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for wadaya-moving-kit 0.1.0
File Size Uploaded
wadaya_moving_kit-0.1.0.tar.gz 39.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for wadaya-moving-kit 0.1.0
File Interpreter ABI Platform
wadaya_moving_kit-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 48.2 kB

Release files / wadaya_moving_kit-0.1.0.tar.gz

Download URL wadaya_moving_kit-0.1.0.tar.gz
Size 39.3 kB
Tags Source
SHA-256 checksum
How to use checksums
ae2d9d8c3ff48a6a6c9762dedda5ae83355b7f9e8e04ec13c1ddc1862c11d310
BLAKE2b-256 checksum
How to use checksums
bf6beaef18bc639f9cc2d790f3a44b7e7234de04f569cd7b8c0ad4093289c72a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.

Transparency log

Release files / wadaya_moving_kit-0.1.0-py3-none-any.whl

Download URL wadaya_moving_kit-0.1.0-py3-none-any.whl
Size 8.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
79b404eb5018ec958a1ca554640af40390b34547cb0393bdccfbe9d0e2895f57
BLAKE2b-256 checksum
How to use checksums
3d18b2381ba889caa47729691f9297626b851ced41389faa571cfae3198eb886
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page