Skip to main content

A terminal spreadsheet powered by Python formulas

Project description

gridcalc

PyPI Python License: MIT

A programmable terminal spreadsheet for developers and technical users, with Excel-ish formulas, Python escape hatches, XLSX interop, goal seek, and LP/MIP solving.

Inspired by Serge Zaitsev's kalk.

pip install gridcalc
gridcalc budget.json

What it gives you

  • Excel-compatible formulas (=IF(A1>=B1, A1*0.05, 0)) and arrays (=SUM(A1:A10 * B1:B10)) without leaving the terminal.
  • Multi-sheet workbooks with cross-sheet refs (=Sheet2!A1) and a proper dep graph.
  • Three formula modes per file: strict Excel, Excel-plus-py.*, or full Python eval with numpy/pandas.
  • xlsx interop via OpenXLSX C++ -- read every sheet's formulas + values; export with cached values.
  • Linear & mixed-integer programming built in via lp_solve -- :opt max B4 vars A4:A5 st D4:D6 solves an LP from cells in the sheet. Models persist in the workbook.
  • Goal-seek -- :goal B10 = 100 by A1 adjusts a variable so a formula hits a target value.
  • Vim-style command line (:w, :e, :q, /search, y/p, visual selection, undo), with system-clipboard copy/paste -- yank pushes values as TSV, paste pulls TSV in from other apps.

Try it on the provided examples:

gridcalc example_excel.json          # sales report, named ranges, IF/MATCH
gridcalc example_hybrid.json         # progressive tax via py.* + aggregations
gridcalc example.json                # PYTHON: numpy/pandas, list-comprehensions
gridcalc example_multisheet.json     # 3-sheet budget, cross-sheet formulas
gridcalc example_lp.json             # LP/MIP demo -- type :opt to solve
gridcalc example_goal.json           # goal-seek demo -- :goal B1 = 11 by A1

Install

Two options:

pip install gridcalc            # core: zero third-party runtime deps
pip install 'gridcalc[extras]'  # adds numpy, pandas, pygments

Or with uv: uv tool install 'gridcalc[extras]'.

The core install has zero third-party runtime dependencies on Linux and macOS -- the full 300+ Excel function library (statistical distributions, financial functions, LINEST/TREND regression, ...) works on stdlib alone. (The 3.10 wheel pulls tomli for config-file parsing; 3.11+ uses stdlib tomllib. On Windows only, windows-curses is pulled in because curses is not in the Windows stdlib.)

The [extras] bundle enables, all at once:

  • np.array(...) in formulas; LAPACK-backed solvers; faster LINEST.
  • pd.DataFrame(...), :pd load/save, DataFrame cell display.
  • Pygments syntax-highlight in the load-time trust prompt.

Quick tour

Cells hold a number, a label (any non-=-prefixed string), or a formula (prefixed with =). Arrow keys move; Enter commits and moves down; Tab commits and moves right.

        A          B          C
1  Revenue   Cost       Margin
2  1000      600        =(A2-B2)/A2*100      <- formula
3  1200      700        =(A3-B3)/A3*100
4  Total     =SUM(B2:B3) =AVG(C2:C3)

Press : for the command line. The basics:

Command Purpose
:w [file] save (extension .json or .xlsx)
:o file open
:q, :q! quit, force-quit
:e edit the workbook's Python code block in $EDITOR
u, Ctrl-R undo / redo
v enter visual selection mode (then y yanks, p pastes)
/text search (n/N to cycle matches)
> go to a named cell (e.g. > AA10)

A full command reference lives in the Reference section below.

Modes

Each workbook has one of three evaluation modes, controlling which formulas parse and what's reachable from them:

Mode Grammar Python escape hatch Sandbox Use case
EXCEL strict Excel none not needed (no eval) xlsx interop, untrusted files
HYBRID Excel + py.* code-block functions reachable as py.foo(...) code blocks only most new sheets
PYTHON Python eval() full Python expressions full AST sandbox numpy/pandas-heavy work

Switch with :mode <name> -- the change is refused if any current formula doesn't parse in the target mode. Files without an explicit mode field load as PYTHON (back-compat). :xlsx load switches to EXCEL automatically.

Formulas

=A1 + B1 * 2                          arithmetic, Excel precedence
=(A1 + A2) / 2                        grouping
=2^10                                 exponent (PYTHON: ** also works)
=50%                                  percent postfix -> 0.5
="hello " & A1                        string concat
=IF(A1 > 0, "pos", "neg")             conditionals
=IFERROR(B1/C1, 0)                    error catch -- #DIV/0!, #VALUE!, #N/A, ...
=SUM(A1:A10)                          range -> 1D array
=SUM(A1:A3 * B1:B3)                   element-wise array arithmetic
=LET(x, SUM(A1:A9), x/COUNT(A1:A9))   local bindings -- compute once, reuse
=FILTER(A1:A9, B1:B9 > 0)             dynamic arrays: FILTER/SORT/UNIQUE
=SUM(revenue)                         named range
=py.margin(A1, B1)                    HYBRID: call a code-block function

Excel error values (#DIV/0!, #N/A, #NAME?, #REF!, #VALUE!, #NUM!, #NULL!) propagate through arithmetic and are catchable with IFERROR/IFNA.

Built-in functions (always available): SUM, AVG, MIN, MAX, COUNT, ABS, SQRT, INT, plus everything in math (sin, cos, log, pi, e, ...).

Excel-compatible library (auto-loaded in EXCEL/HYBRID): IF, IFERROR, AND, OR, NOT, ROUND, AVERAGE, MEDIAN, SUMIF, COUNTIF, AVERAGEIF, LET, VLOOKUP, HLOOKUP, XLOOKUP, XMATCH, INDEX, MATCH, FILTER, SORT, UNIQUE, SEQUENCE, CONCATENATE, LEFT, RIGHT, MID, LEN, TRIM, UPPER, LOWER, SUBSTITUTE, and 280+ others. Dynamic-array functions return whole rows/columns and compose (=INDEX(SORT(A1:B9), 1, 2)).

PYTHON-only extras: the math module, Python builtins (sum, min, max, abs, len), list comprehensions, and -- when the relevant extras are installed -- np.array(...), np.linalg, matrix multiply (@), and pd.DataFrame(...).

Named ranges & custom functions

:name revenue A1:A12       Define a named range (workbook-global)
:names                     List
:unname revenue            Remove

Used directly in formulas: =SUM(revenue), =MAX(revenue - costs).

Open the per-workbook Python code block with :e. Anything defined there becomes callable from formulas:

def margin(rev, cost):
    return (rev - cost) / rev * 100

In HYBRID: =py.margin(A1, B1). In PYTHON: =margin(A1, B1). EXCEL mode forbids code blocks entirely.

Cell references

$A$1 fixes both; $A1 fixes the column; A$1 fixes the row. References adjust automatically on insert/delete/replicate.

Multi-sheet workbooks

:sheet                     List sheets (active marked *)
:sheet Inputs              Switch by name
:sheet 1                   Switch by zero-based index
:sheet add Outputs         Append (does not switch)
:sheet del Tmp             Remove (refused if last sheet)
:sheet rename Old New      Rename, rewriting `Old!` prefixes in formulas
:sheet move Inputs 0       Reorder

Reference cells on other sheets with Sheet!cell:

=Sheet2!A1
=SUM(Sheet2!A1:A10)
=Sheet1!A1 + Sheet2!B1

The dep graph is keyed on (sheet, col, row) so cross-sheet recalc works transparently. Cross-sheet ranges (Sheet1!A1:Sheet2!B5) are not supported (Excel doesn't either).

Optimization

:opt solves linear and mixed-integer programs defined by cells in the active sheet, via a vendored copy of lp_solve 5.5. Models are workbook-persistent: define once, save the file, re-run on reopen.

:opt                                                                       Run the saved 'default' model
:opt max|min <cell> vars <cells> st <cells> [bounds <spec>] [int <cells>] [bin <cells>]
                                                                           Solve inline AND save as 'default'
:opt def <name> max|min <cell> ...                                         Save under <name>; does not execute
:opt run [<name>]                                                          Execute a saved model
:opt list                                                                  List saved models
:opt undef <name>                                                          Remove a saved model

The model is sheet-resident: an objective formula in one cell, decision-variable cells holding values, and constraint cells holding comparison formulas like =A1+A2<=10. The constraint cells keep evaluating during recalc, so the sheet shows live feasibility (TRUE/FALSE) before and after the solve.

A worked example (also at examples/example_lp.json):

A B C D
3 Decision Objective Constraints
4 0 =3*A4+5*A5 =A4<=4
5 0 =2*A5<=12
6 =3*A4+2*A5<=18
:opt max B4 vars A4:A5 st D4:D6

Status bar shows opt: OPTIMAL obj=36; A4 and A5 become 2.0 and 6.0; u rolls back.

Clauses (any order after st):

  • bounds A1=lo:hi, B2=lo:hi -- per-variable bounds. lo/hi accept inf, +inf, -inf. Default is [0, +inf).
  • int <cells> -- decision variables are integer-valued (branch-and-bound).
  • bin <cells> -- decision variables are binary ({0,1}); bounds clamped to [0,1].

Cell lists everywhere accept ranges (A1:A5), comma-separated refs (A1,A3,B5), or a mix.

Saved models live under "models": {<name>: ...} in the JSON file and round-trip verbatim (the spec strings the user typed are stored, not pre-resolved coords).

Programmatic access:

from gridcalc.engine import Grid
from gridcalc.opt import solve

g = Grid()
g.jsonload("examples/example_lp.json")
g.recalc()
r = solve(g, objective_cell=(1, 3), decision_vars=[(0, 3), (0, 4)],
          constraint_cells=[(3, 3), (3, 4), (3, 5)], maximize=True)
print(r.status_name, r.objective, r.values)

Goal-seek

For 1-D what-if ("what input makes this output equal X?"), use :goal:

:goal <formula_cell> = <target> by <var_cell> [in <lo>:<hi>]
:goal B10 = 100 by A1                 auto-bracket from A1's current value
:goal B10 = 0 by A1 in -50:50         explicit search bracket

Uses bisection over Grid.recalc(); converges in milliseconds at spreadsheet scale. The variable cell must hold a value (not a formula). On success the variable cell is overwritten; u rolls back. Unlike :opt, goal-seek isn't persisted -- the three args fit on one line, so retyping is faster than naming.

Formatting

:f b                Toggle bold (also Ctrl-B)
:f u                Toggle underline (also Ctrl-U)
:f i                Toggle italic
:f bi               Combine: bold + italic

:f $                Dollar (2 decimal places)
:f %                Percentage (value*100, 2 decimals)
:f I                Integer (truncate)
:f *                Bar chart (asterisks proportional to value)
:f L | R | G | D    Left / right / general / use-global-format

:f ,.2f             Any Python format spec: 1,234.50
:f .1%              15.7%
:f .2e              1.23e+04

:gf <fmt> sets the workbook-wide default format. :width <n> sets column width (4-40). Labels longer than the column width spill into adjacent empty cells, Excel-style.

Import / export

Command Reads Writes Notes
:csv save/load CSV CSV Plain text, fast
:xlsx save/load .xlsx formulas + values EXCEL-mode: formulas + cached values; other modes: values only :xlsx load switches to EXCEL
:pd save/load CSV/TSV/Excel/JSON/Parquet same Uses pandas; row 1 as headers

:xlsx load translates Excel formulas into gridcalc's EXCEL grammar and reads every sheet. INDIRECT and 3D ranges (Sheet1:Sheet3!A1:B2) are deliberately unsupported -- they'd defeat the static dep graph. Functions outside the auto-loaded library produce #NAME?.

File format

JSON, v2. v1 (single sheet, top-level cells) still loads.

{
  "version": 2,
  "mode": "HYBRID",
  "active": "Inputs",
  "code": "def margin(rev, cost):\n    return (rev - cost) / rev * 100\n",
  "names":  { "revenue": "A1:A12", "costs": "B1:B12" },
  "models": { "default": { "sense": "max", "objective": "B4",
                           "vars": "A4:A5", "constraints": "D4:D6" } },
  "sheets": [
    { "name": "Inputs", "cells": [["Rev","Cost"],[1000,600],[1200,700]] },
    { "name": "Summary","cells": [["Total","=SUM(Inputs!A2:A3)"]] }
  ],
  "format": { "width": 10 }
}
  • mode: "EXCEL" | "HYBRID" | "PYTHON". Absent → PYTHON.
  • sheets (v2): each is {name, cells} with a 2D cells array.
  • active (v2): name of the sheet to focus on load.
  • names: workbook-global named ranges (sheet-relative when used).
  • models: persisted LP/MIP definitions (see Optimization).
  • code: per-workbook Python module string, editable via :e.

Configuration

Optional gridcalc.toml (lookup: $PWD then $XDG_CONFIG_HOME/gridcalc/):

sandbox = true             # AST validation of formulas + code blocks
width   = 12               # default column width
format  = "G"              # default cell format

[keys.grid]
next_sheet  = ["Tab", "F4"]
prev_sheet  = ["S-Tab", "F3"]
cursor_left = ["Left", "h"]
cursor_down = ["Down", "j"]
cursor_up   = ["Up", "k"]
cursor_right= ["Right", "l"]

Every TUI context (grid, entry, visual, cmdline, search) is rebindable. User bindings fire before the hardcoded fallback chain, so Tab → next_sheet replaces the default cursor-right meaning. See docs/keybindings.md for the keyspec grammar (Tab, S-Tab, C-x, C-Right, F3, ...) and rejected combinations.

Command reference

File          :w [file]   :wq   :q   :q!   :o file   :e
Edit          :b   :clear   :dr   :dc   :ir   :ic   :m   :r
              :sort [col] [desc]   yank/paste: y/p (syncs system clipboard)
              undo/redo: u / Ctrl-R
Format        :f <spec>   :gf <spec>   :width <n>   Ctrl-B / Ctrl-U
Search        /pattern   n   N
Sheets        :sheet [name|N|add|del|rename|move]
Names         :name <n> [range]   :names   :unname <n>
Modes         :mode [excel|hybrid|python]
Import/export :csv save/load   :xlsx save/load   :pd save/load
Optimization  :opt   :opt def   :opt run   :opt list   :opt undef
              :goal <cell> = <target> by <cell> [in <lo>:<hi>]
View          :view   E   :tv/:th/:tb/:tn (lock title rows/cols)

Limitations

  • INDIRECT is unsupported (would defeat the static dep graph).
  • LAMBDA and its higher-order helpers (MAP, REDUCE, BYROW, ...) are unsupported; LET is supported. Dynamic-array results are packed into their origin cell rather than spilling into neighbours.
  • xlsx export of formulas is EXCEL-mode only -- PYTHON/HYBRID syntax (**, list comprehensions, py.*) isn't strict Excel.
  • 3D range refs (Sheet1:Sheet3!A1:B2) are unsupported (returns nan). Workaround: expand manually with +.
  • Cross-sheet ranges (Sheet1!A1:Sheet2!B5) are rejected at parse time -- Excel doesn't support them either.
  • xlsx dates and styles aren't read or written; date serials arrive as floats.

Development

make build      # rebuild the C++ extensions (_core, _opt)
make test       # unit tests
make test-tty   # PTY-driven curses integration tests (slow, requires xterm-256color)
make lint       # ruff check
make typecheck  # mypy
make qa         # lint + typecheck + test + format

make wheel       # cpXX-cpXX wheel for current Python
make wheel-abi3  # single cp312-abi3 wheel (Python>=3.12)
make sdist       # source distribution
make publish     # upload to PyPI (after make check)

The abi3 build is gated on GRIDCALC_STABLE_ABI=ON (CMake) + wheel.py-api=cp312 (scikit-build-core). Per-version wheels and the abi3 wheel have separate CI workflows under .github/workflows/.

Prior Art

  • sc-im: A ncurses spreadsheet program for terminal
  • sheets: A terminal based spreadsheet tool
  • rustxl: A fast, keyboard-driven spreadsheet with vim-style navigation and Excel-compatible formulas.

License

MIT

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

gridcalc-0.2.0.tar.gz (1.1 MB view details)

Uploaded Source

Built Distributions

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

gridcalc-0.2.0-cp313-cp313-win_amd64.whl (680.0 kB view details)

Uploaded CPython 3.13Windows x86-64

gridcalc-0.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

gridcalc-0.2.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

gridcalc-0.2.0-cp313-cp313-macosx_11_0_arm64.whl (714.1 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

gridcalc-0.2.0-cp313-cp313-macosx_10_15_x86_64.whl (779.0 kB view details)

Uploaded CPython 3.13macOS 10.15+ x86-64

gridcalc-0.2.0-cp312-cp312-win_amd64.whl (680.1 kB view details)

Uploaded CPython 3.12Windows x86-64

gridcalc-0.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

gridcalc-0.2.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

gridcalc-0.2.0-cp312-cp312-macosx_11_0_arm64.whl (714.1 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

gridcalc-0.2.0-cp312-cp312-macosx_10_15_x86_64.whl (779.1 kB view details)

Uploaded CPython 3.12macOS 10.15+ x86-64

gridcalc-0.2.0-cp312-abi3-win_amd64.whl (678.7 kB view details)

Uploaded CPython 3.12+Windows x86-64

gridcalc-0.2.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.12+manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

gridcalc-0.2.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.12+manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

gridcalc-0.2.0-cp312-abi3-macosx_11_0_arm64.whl (712.1 kB view details)

Uploaded CPython 3.12+macOS 11.0+ ARM64

gridcalc-0.2.0-cp312-abi3-macosx_10_15_x86_64.whl (776.8 kB view details)

Uploaded CPython 3.12+macOS 10.15+ x86-64

gridcalc-0.2.0-cp311-cp311-win_amd64.whl (681.5 kB view details)

Uploaded CPython 3.11Windows x86-64

gridcalc-0.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

gridcalc-0.2.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

gridcalc-0.2.0-cp311-cp311-macosx_11_0_arm64.whl (716.8 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

gridcalc-0.2.0-cp311-cp311-macosx_10_15_x86_64.whl (781.0 kB view details)

Uploaded CPython 3.11macOS 10.15+ x86-64

gridcalc-0.2.0-cp310-cp310-win_amd64.whl (681.7 kB view details)

Uploaded CPython 3.10Windows x86-64

gridcalc-0.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

gridcalc-0.2.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

gridcalc-0.2.0-cp310-cp310-macosx_11_0_arm64.whl (717.0 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

gridcalc-0.2.0-cp310-cp310-macosx_10_15_x86_64.whl (781.3 kB view details)

Uploaded CPython 3.10macOS 10.15+ x86-64

File details

Details for the file gridcalc-0.2.0.tar.gz.

File metadata

  • Download URL: gridcalc-0.2.0.tar.gz
  • Upload date:
  • Size: 1.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for gridcalc-0.2.0.tar.gz
Algorithm Hash digest
SHA256 9621dbad033494b8f79275636cddbf983b34d0337e00dda28c19d194bb0f4090
MD5 2e5dfcf9906325526a2d9d7f11a8f111
BLAKE2b-256 6e22694c26ede2234ffb9a104001c3474c64fce195772504063bf60da7ee32a0

See more details on using hashes here.

File details

Details for the file gridcalc-0.2.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: gridcalc-0.2.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 680.0 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for gridcalc-0.2.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 f85876dbcd0e7ad4e53a7b00c60dc13ca4c2fac72c1111567804418c11c26431
MD5 798dd9a6d3c968f54507f7f096691289
BLAKE2b-256 fdaedbbc666799080eee66c36b9a3582f8cc6bf269c05427fa565ad207505d72

See more details on using hashes here.

File details

Details for the file gridcalc-0.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for gridcalc-0.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 60723174645c9936c041da2456c492eaaf8cea12b2c9cf769b8dc2633b3143e9
MD5 b7942be08431bde3f657cec810ba15c1
BLAKE2b-256 5bc3849267806457f128ee1bbdbcd3b86b9b09c161726bf9818a680d347272e6

See more details on using hashes here.

File details

Details for the file gridcalc-0.2.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for gridcalc-0.2.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 cceabf862a4b4e025a5553c761e26832073409f2f9728cb0e503003db061d3f7
MD5 c4f73bb23f2ba12d3fa9515fed85d766
BLAKE2b-256 dc4689307a6a4638682e5d64312d2351aeb2e6d3b66cb3d849fb286806b30154

See more details on using hashes here.

File details

Details for the file gridcalc-0.2.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for gridcalc-0.2.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d721358a9d0a328be0729f189ec7812987a27e93aeb382b41d97d2d3f2565529
MD5 bf14a7d544f3b1a60b5a126c1507dcd6
BLAKE2b-256 75b2becd2fa934d663f1145f666c7fae7ac484af0f90538f052f14b0f510c45f

See more details on using hashes here.

File details

Details for the file gridcalc-0.2.0-cp313-cp313-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for gridcalc-0.2.0-cp313-cp313-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 3b823d1eea3482a7673d5877f54c171937f3c18cf6952a753a153f8e7634f554
MD5 6d97222243ee9417cdadd3c6a0afeb3c
BLAKE2b-256 1bf20e68acda5059d3be1281f57ad49aa1ea31028c34958a5cccb8fe0929e7c9

See more details on using hashes here.

File details

Details for the file gridcalc-0.2.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: gridcalc-0.2.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 680.1 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for gridcalc-0.2.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 2e9f9f53a6d2167711a3b8b67b65d41a936124345d4b8142dc722364d848a292
MD5 d9c7b08515d08021c6d15140ba758201
BLAKE2b-256 b50a3767a301e1b92b597a7ab66150f9427d48ea6f94f8c139c7f898ab8d9672

See more details on using hashes here.

File details

Details for the file gridcalc-0.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for gridcalc-0.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c8884ac22c868234c0c9aaa439fc3dbe664bbf589b64e3a47638b23ec020047c
MD5 d46050e25149c8ef6d798388d9eb038b
BLAKE2b-256 a2f5137597638c5b6b91162ac4208095727c54a0f29b4abf330a4c540abb1237

See more details on using hashes here.

File details

Details for the file gridcalc-0.2.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for gridcalc-0.2.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ec5f48e3536799d9f5353f941093dca66db7a58e369f1bcfe9500573e238dcd8
MD5 331781568d15bea5e7f5e7f85fed7825
BLAKE2b-256 c864e0b2f8371dd71017ab4566baf884d77211d93275fe21428f7c060a9452c7

See more details on using hashes here.

File details

Details for the file gridcalc-0.2.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for gridcalc-0.2.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ee28aed6370df3b258bf74479a456851a3aeb673959a0e7ff78ab22b8db1b6d6
MD5 17145bd957bf256e0cbee9bf83a530c9
BLAKE2b-256 02a19e1b9c4fbd7d2e0790e4a13653de5675e8a32ff3e0bfe3c03bb1d131c6e3

See more details on using hashes here.

File details

Details for the file gridcalc-0.2.0-cp312-cp312-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for gridcalc-0.2.0-cp312-cp312-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 17b0e30440f0d5a14bae82754d00ce141c42c2e3a9a0706181df52bb3d72726c
MD5 1912c34d8e34ba33e7e6d75e183c62dd
BLAKE2b-256 4d361cce7d29f9583db4c2d741778085947f86fa917dea091acae4fec657e6fa

See more details on using hashes here.

File details

Details for the file gridcalc-0.2.0-cp312-abi3-win_amd64.whl.

File metadata

  • Download URL: gridcalc-0.2.0-cp312-abi3-win_amd64.whl
  • Upload date:
  • Size: 678.7 kB
  • Tags: CPython 3.12+, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for gridcalc-0.2.0-cp312-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 89e95e8564ee567a85be590afde8ff082c801553238803bb846735044438efb1
MD5 b7211c8f623ca70d1c9ea318356308c8
BLAKE2b-256 95c8f113781f962250380e0878022f3312bb95d1b42a588d5137c3aa274ca1a0

See more details on using hashes here.

File details

Details for the file gridcalc-0.2.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for gridcalc-0.2.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9bc0178b0320e423f45290aa5142e0be49d6dd3358f07defa3200cc9c2c83d82
MD5 16806fe1ddef434e6e86c4c65996d546
BLAKE2b-256 905aa7866c338bcef1c99927b63440b34886fd43f2dd66b1e9dcbce0d1513891

See more details on using hashes here.

File details

Details for the file gridcalc-0.2.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for gridcalc-0.2.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 caf9ce756b33bd1fb229361043aa2747e8fae865b335b2cc52ae7b8589d024b4
MD5 9a77665a3dc3ff850310980c585a34b0
BLAKE2b-256 8e44ca8b9d1852c1df034dad68dcb52f38f05597571424c6967069dc52da4189

See more details on using hashes here.

File details

Details for the file gridcalc-0.2.0-cp312-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for gridcalc-0.2.0-cp312-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ee660055cc7ba528002eb56225267b11ea6784ac46db50111239fbd11a7523a8
MD5 e3a270d71a6d7c35726c39651e046f64
BLAKE2b-256 652e34505fcd7b0d96b61e9fa313d0e6b794fc33b0ecb22b6eeeed6d22adf804

See more details on using hashes here.

File details

Details for the file gridcalc-0.2.0-cp312-abi3-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for gridcalc-0.2.0-cp312-abi3-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 81b67fb5e65f3dd219dcd748aabc66886ba74ef33c911930f873a1546b225ffb
MD5 9ca8bb05c74f08d739d06e372ced0ddd
BLAKE2b-256 287717ba0dfb98622b03801b73844db527d8c294f20f867a9952b00f8093e1f6

See more details on using hashes here.

File details

Details for the file gridcalc-0.2.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: gridcalc-0.2.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 681.5 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for gridcalc-0.2.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 357c0259382d1cf35313b22def3deadd34bc832e2efb688dad8668f60d57d2aa
MD5 649f5d565e0385cb4cfd7b402f03ae3c
BLAKE2b-256 13c6dd74768f188dba36b45364a5efbd4f803e86cfae91a90ec508a5fee08cbb

See more details on using hashes here.

File details

Details for the file gridcalc-0.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for gridcalc-0.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3a704520496efa7f9e7862077093d9f1e207595eec2396e52ddf9468676a02db
MD5 1bba0a2bf9a58554e2ade25dd81f7e1b
BLAKE2b-256 ea21c0b8de9738ea7aff903a94ab38ebb6a85def7d7df9e91a1ca00341acf96c

See more details on using hashes here.

File details

Details for the file gridcalc-0.2.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for gridcalc-0.2.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 65a767a3d573354acab41e8c39539b540ec72ff779721eb8f23533e135563053
MD5 f76a43691d9feea7fb81040ec726a1a9
BLAKE2b-256 526abf5c548a777eab9b50f588c88ba3ea9801074bea8a93b47e717e566c3f35

See more details on using hashes here.

File details

Details for the file gridcalc-0.2.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for gridcalc-0.2.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5e5248b19ba3215f146d52d05dc6222326af7e3eb49d9963b6487572a8fc21c9
MD5 dde895b5a5e92594da90c23bf48ceca9
BLAKE2b-256 98948d25e3d258d87a135a35a4d907277820a072a03742e9fc8d4a10c4d5b9bb

See more details on using hashes here.

File details

Details for the file gridcalc-0.2.0-cp311-cp311-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for gridcalc-0.2.0-cp311-cp311-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 56913520e548c89fbbd4297b2897b43cf75cf7ef4bffe3e35d767cd54b0632f5
MD5 8e980d4dcac83e2c210239fea431b3ec
BLAKE2b-256 37bc09e81174916f69af1cd577a19204b1eb5c5ecf0920360b1852f0c6a619d8

See more details on using hashes here.

File details

Details for the file gridcalc-0.2.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: gridcalc-0.2.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 681.7 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for gridcalc-0.2.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 36369b20637ee0865544399eec2e4c153facc17256ca33092c3f5f3f9bcc9ec6
MD5 72838df0272f364c5c5b60eea470d742
BLAKE2b-256 cf0c4f1bdcae86339c44de63c0bd0df1e279057bb3ef4325162f47c99b841e37

See more details on using hashes here.

File details

Details for the file gridcalc-0.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for gridcalc-0.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5c194902bd456508f350349c468776dc9d251073e4392c547cf390d624549147
MD5 381e8f76b29636204c1b65d8e0b29da4
BLAKE2b-256 c7f55b2f5be7cc98b7950ca07d9d5d342797e4ca680287a935c8015962cb049d

See more details on using hashes here.

File details

Details for the file gridcalc-0.2.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for gridcalc-0.2.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 897ada2ebb0841de2cd6d64070673c37cf8030a31719d2b64e5b591916f2458b
MD5 31ac9d39b716f48569816876d03fe4e3
BLAKE2b-256 c9f478686f69a896ece39fc30d800ab3f8d332128fda82768a4ff7dcbafad87a

See more details on using hashes here.

File details

Details for the file gridcalc-0.2.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for gridcalc-0.2.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e9c19e4af0d69fb066185449964f843b58c918245745d4fa4c93c54f4bb3b62b
MD5 cb6d9633153f9fa7711c50cb7e5751d6
BLAKE2b-256 852eeac58ddefda41116acb5ff98d2b1b7c0a27ca2ca732787f2582af49360d2

See more details on using hashes here.

File details

Details for the file gridcalc-0.2.0-cp310-cp310-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for gridcalc-0.2.0-cp310-cp310-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 fab59c21c8cd4835ef12f41040dfd940114ac21c5b0a0b9143c92143de092082
MD5 494b54bd6e09beb0e157e4cb1bcc9b3d
BLAKE2b-256 4a2c95bf8ec264b138dd50e85d6097cff05e2a6cf3317d197f016d57624ad1cf

See more details on using hashes here.

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