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)
| File | Size | Uploaded | |
|---|---|---|---|
| wadaya_moving_kit-0.1.0.tar.gz | 39.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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 logRelease 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