Metadata-Version: 2.1
Name: noether
Version: 1.0.0
Summary: Work with physical measurements and constants
Home-page: https://github.com/yunruse/noether
Author: Mia yun Ruse
Author-email: mia@yunru.se
Keywords: physics unit measure constant measurement uncertainty
Classifier: Programming Language :: Python :: 3
Classifier: Operating System :: OS Independent
Classifier: License :: OSI Approved
Classifier: Topic :: Scientific/Engineering
Classifier: Development Status :: 4 - Beta
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE.txt

# Noether 1.0

[![PyPI](https://img.shields.io/pypi/v/noether?color=blue)](https://pypi.org/packages/noether)

**Noether** is a unit-enriched Python package, akin to Wolfram Alpha or gnu `units`. It has a large (and expanding) catalogue of up-to-date units and constants, allowing code to be written directly in the units they are concerned with while also ensuring e.g. you don't mistakenly add an energy to a length.

Just grab Python 3.10 or later and `pip install noether` to run!

Development is ongoing, especially in expanding the unit catalogue and improving unit display mechanisms.

## Usage 

Noether can be used as a Python package or as a CLI:

```sh
$ alias noe='python -im noether'
$ noe marathon
marathon  # length, 42195 m, Race length based on Greek legend, set by convention from 1908 Summer Olympics
$ noether 23degC @ degF
73.4 °F  # temperature
```

The CLI allows a few niceties such as slightly terser syntax, but otherwise behaves identically to Python:

```sh
$ noether 5cm @ in --value
1.9685039370078738
$ python
>>> from noether import *
>>> 5*cm @ inch
1.9685039370078738 in  # length
```

In addition to `@` for display, you can more permanently set display units:

```py
>>> display(inch)
>>> 5 * cm
>>> mile
mile  # length, 63360 in
```

Units can propagate uncertainty automatically under most operations:

```py
>>> m(5, 0.1)**3
125 ± 7.5 m**3  # volume
```

You can define your own units and dimensions:

```py
>>> foo = Unit(3e11 * furlong / fortnight, 'foo')
>>> c @ foo
6.008724999284181 foo  # speed

>>> health = Dimension.new('health', 'H')
>>> apple = Unit(health, 'apple', 'a')
>>> apple / day
apple / day  # health / time, 1.1574074074074073e-05 a / s
```

Various `conf` settings allow for customisation to behaviour:

```py
>>> conf.info_spectrum = True
>>> nm(400)
4e-07 m  # length, visible, purple
```

Use `conf.save()` to save to (by default) `~/.config/noether.toml`.


## For more, see...

Check out [CONTRIBUTING.md](CONTRIBUTING.md) and [LICENSE.txt](LICENSE.txt) for info of that sort.

Other tools for working with units include:
- [Wolfram Alpha](https://www.wolframalpha.com), a comprehensive online intelligence engine
- [gnu `units`](https://www.gnu.org/software/units/), a command-line tool you likely already have
- [units](https://pypi.org/project/units/), a simple Python package for defining your own units
- [unyt](https://pypi.org/project/unyt/), a Python package with numpy support

### 📚 _**Did you know?**_

```
>>> lunation / (year % lunation)
2.7153489666011486
```
A [**lunation**](https://en.wikipedia.org/wiki/Lunar_month#Synodic_month) (about 29 days) separates one full moon from another. Every so often a thirteenth full moon occurs in a year - "a [blue moon](https://en.wikipedia.org/wiki/Blue_moon)". "Once in a blue moon" is actually only every 2.71 years or so - not as rare as you'd think. Don't tell Sinatra!
