Metadata-Version: 2.4
Name: unitx
Version: 0.1.1
Summary: A Python library which dynamically converts different types of units
Author-email: devs_des1re <arjunbrij8811@gmail.com>
Maintainer-email: devs_des1re <arjunbrij8811@gmail.com>
License: Copyright (c) 2025 devs_des1re
        
        Permission is hereby granted, free of charge, to any person obtaining a copy
        of this software and associated documentation files (the "Software"), to deal
        in the Software without restriction, including without limitation the rights
        to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
        copies of the Software, and to permit persons to whom the Software is
        furnished to do so, subject to the following conditions:
        
        The above copyright notice and this permission notice shall be included in all
        copies or substantial portions of the Software.
        
        THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        SOFTWARE.
Project-URL: Homepage, https://github.com/devs-des1re/unitx
Project-URL: Issues, https://github.com/devs-des1re/unitx/issues
Project-URL: Documentation, https://unitx.readthedocs.io/en/stable
Keywords: app,macOS,windows,linux,flatpak
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Topic :: Software Development
Classifier: Topic :: Utilities
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Dynamic: license-file

# unitx
[![version](https://img.shields.io/pypi/v/unitx.svg?colorB=blue)](https://pypi.org/project/unitx/)
[![pyversions](https://img.shields.io/pypi/pyversions/unitx.svg?)](https://pypi.org/project/unitx/)
[![codecov](https://codecov.io/gh/devs-des1re/unitx/branch/main/graph/badge.svg?token=YOUR_CODECOV_TOKEN)](https://codecov.io/gh/devs-des1re/unitx)
![Tests](https://github.com/devs-des1re/unitx/actions/workflows/tests.yml/badge.svg)

A Python library which dynamically converts different types of units.

# Installation
To install unitx you will need `Python >= 3.10`

Run:
```
pip install unitx
```

Or:
```
python -m pip install unitx
```

Also works for MacOS and Linux with `pip3`.

# Conversions
There are different functions in unitx which help convert for you!

## Converting Distance
To convert distance, you'll use the `convert_distance` function. This also needs to be used with the enum class `Distance`.

```py
from unitx import convert_distance, Distance

converted_value = convert_distance(5, Distance.MILES, Distance.KILOMETERS)
print(converted_value)
```

## Converting Mass
To convert mass, you'll use the `convert_mass` function. This also needs to be used with the enum class `Mass`.

```py
from unitx import convert_mass, Mass

converted_value = convert_mass(1000, Mass.KILOGRAMS, Mass.TONNE)
print(converted_value)
```

## Converting Volume
To convert volume, you'll use the `convert_volume` function. This also needs to be used with the enum class `Volume`.

```py
from unitx import convert_volume, Volume

converted_value = convert_volume(10, Volume.LITER, Volume.MILLILITER)
print(converted_value)
```

## Converting Temperature
To convert temperature, you'll use the `convert_temperature` function. This also needs to be used with the enum class `Temperature`. 

**Note:** Units `kelvin` and `rankine` can also be converted

```py
from unitx import convert_temperature, Temperature

convert_temperature(0, Temperature.CELSIUS, Temperature.FAHRENHEIT)
print(converted_value)
```

## Converting Area
To convert area, you'll use the `convert_area` function. This also needs to be used with the enum class `Area`.

```py
from unitx import convert_Area, area

converted_value = convert_area(10, Area.SQUARE_KILOMETER, Area.SQUARE_METER)
print(converted_value)
```

# Enums
What are `enums`? `Enums` in Python are a way to define a set of symbolic names (constants) that are bound to unique, constant values. They make code more readable and organized by grouping related values under one type, instead of using plain integers or strings.

In Python, `enums` are created using the Enum class from the built-in enum module. Each member of an enum has a name and a value.

## Distance
Enum `Distance` contains float values for dynamic conversion, which just makes it simple for you to convert quickly and efficiently.

```py
from unitx import Distance

print(Distance.METERS)
print(Distance.KILOMETERS)
print(Distance.CENTIMETERS)
print(Distance.MILLIMETERS)
print(Distance.FEET)
print(Distance.INCHES)
print(Distance.YARDS)
print(Distance.MILES)
```

## Mass
Enum `Mass` contains float values for dynamic conversion, which just makes it simple for you to convert quickly and efficiently.

```py
from unitx import Mass

print(Mass.KILOGRAM)
print(Mass.GRAM)
print(Mass.MILLIGRAM)
print(Mass.MICROGRAM)
print(Mass.TONNE)
print(Mass.POUND)
print(Mass.OUNCE)
print(Mass.STONE)
```

## Temperature
Enum `Temperature` is a bit different. It contains a abbreviation, and then converts between the 4 of them .

```py
from unitx import Temperature

print(Temperature.CELSIUS)
print(Temperature.FAHRENHEIT)
print(Temperature.KELVIN)
print(Temperature.RANKINE)
```

## Volume
Enum `Volume` contains float values for dynamic conversion, which just makes it simple for you to convert quickly and efficiently.

```py
from unitx import Volume

print(Volume.LITER)
print(Volume.MILLILITER)
print(Volume.CUBIC_METER)
print(Volume.CUBIC_CENTIMETER)
print(Volume.GALLON_US)
print(Volume.QUART_US)
print(Volume.PINT_US)
print(Volume.CUP_US)
print(Volume.FLUID_OUNCE_US)
print(Volume.TABLESPOON_US)
print(Volume.TEASPOON_US)
```

## Area
Enum `Volume` contains float values for dynamic conversion, which just makes it simple for you to convert quickly and efficiently.

```py
from unitx import Area

print(Area.SQUARE_METER)
print(Area.SQUARE_KILOMETER)
print(Area.SQUARE_CENTIMETER)
print(Area.SQUARE_MILLIMETER)
print(Area.HECTARE)
print(Area.ACRE)
print(Area.SQUARE_FOOT)
print(Area.SQUARE_YARD)
print(Area.SQUARE_MILE)
```

# Exceptions
In programming, an exception is an event that occurs during the execution of a program that disrupts the normal flow of instructions. It usually happens when something goes wrong, like trying to divide by zero, accessing a file that doesn’t exist, or referencing a variable that hasn’t been defined. In `unitx` case, it tells you if you have passed invalid values for which then its raised.

## Unsupported Unit
This is raised when you have passed a unsupported value, even when passed from another enum! This is so that you are not passing random params.

```py
class UnsupportedUnitError(Exception):
    """Raised when a unit is not recognized."""

    def __init__(self, message):
        super().__init__(message)
```

## Invalid Unit
This is raised when you pass a enum from a different category which is not related to the conversion. This is so that you are converting properly.

```py
class InvalidUnitError(Exception):
    """Raised when units are from a different category."""

    def __init__(self, message):
        super().__init__(message)
```

## Non Numeric
This is raised when `value` is not a `int`/`float` object, and is something else, e.g. `str`, `list`, `dict`. This keeps the conversion easy and not full on annoying errors!

```py
class NonNumericError(Exception):
    """Raised when value is not int or float."""

    def __init__(self, message):
        super().__init__(message)
```

# Contributing
Contributions to this project are welcome! You can help by:

- Reporting bugs or issues

- Suggesting new features

- Writing or improving documentation

- Submitting code improvements or fixes

- Adding tests

## Note
Please check if another user has already said what you thought. It helps prevent repeating the same content, keeps conversations organized, and makes it easier to follow discussions. By using this, you can ensure that ideas stay unique, reduce clutter in busy channels, and maintain clarity in group chats or collaborative projects.
