https://github.com/polyconseil/metaset
metaset
https://github.com/polyconseil/metaset
django postgresql
Last synced: about 1 month ago
JSON representation
metaset
- Host: GitHub
- URL: https://github.com/polyconseil/metaset
- Owner: Polyconseil
- License: other
- Created: 2016-09-28T08:27:48.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2024-01-11T08:22:49.000Z (over 2 years ago)
- Last Synced: 2025-02-22T19:20:25.819Z (over 1 year ago)
- Topics: django, postgresql
- Language: Python
- Homepage:
- Size: 50.8 KB
- Stars: 0
- Watchers: 25
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.rst
- Changelog: CHANGES.rst
- License: LICENSE.txt
Awesome Lists containing this project
README
metaset
=======
This package provides a collection that is basically a "dict of sets", named MetaSet.
.. image:: https://travis-ci.org/Polyconseil/metaset.svg?branch=master
:alt: Build status
.. image:: https://img.shields.io/pypi/pyversions/metaset.svg
:alt: Supported Python versions
.. image:: https://img.shields.io/pypi/wheel/metaset.svg
:alt: Wheel status
.. image:: https://img.shields.io/pypi/l/metaset.svg
:alt: License
Links
-----
- Package on `PyPI`_: http://pypi.python.org/pypi/metaset/
- Source on `GitHub `_: http://github.com/Polyconseil/metaset/
- Build on `Travis CI `_: http://travis-ci.org/polyconseil/metaset/
Quickstart
----------
Install the package from PyPI_, using pip:
.. _PyPI: http://pypi.python.org/pypi/metaset/
.. code-block:: sh
pip install metaset
Or from GitHub:
.. code-block:: sh
git clone git://github.com/Polyconseil/metaset.git
Import it in your code:
.. code-block:: python
>>> from metaset import MetaSet
Usage is quite straight forward,
basic set operations are supported via the binary operators ``+`` ``-`` ``|`` ``^``.
.. code-block:: python
>>> from pprint import pprint
>>> pprint(MetaSet(a={1, 2}, b={3}) | MetaSet(b={4}, c={5}))
{'a': {1, 2}, 'b': {3, 4}, 'c': {5}}
Django Postgres
---------------
A custom Django field is available.
It is quite straightforward:
.. code-block:: python
>>> from metaset.django_field import MetaSetField
>>> from django.db import models # doctest: +SKIP
>>> class MyModel(models.Model): # doctest: +SKIP
mset = MetaSetField() # doctest: +SKIP
The following versions of Python and Django are supported:
- Python 3.8, 3.9, 3.10, 3.11 and 3.12;
- Django 3.2, 4.2 and 5.0.
Detailed considerations
-----------------------
They are two ways to consider the "dict of sets" notion,
differing on how you handle the empty values for keys.
The easiest idea is to consider that a key with no content is non-existent.
This is how the dictset_ package is implemented.
In this alternative implementation,
we chose to keep the empty keys as meaningful elements,
allowing for smart unions and intersections.
.. code-block:: python
>>> pprint(MetaSet(a={1}) | MetaSet(a={2}, b=set()))
{'a': {1, 2}, 'b': set()}
>>> MetaSet(a={1}) & MetaSet(a={2}, b={3})
{'a': set()}
So, beware of how empty-keys are handled,
and consider using dictset_ if it is a better match for your use case.
The behavior for subtraction and symmetric difference,
although sound on a mathematical point of view, may not be what you want.
.. code-block:: python
>>> MetaSet(a={1}) - MetaSet(a={1})
{'a': set()}
>>> MetaSet(a={1}) ^ MetaSet(a={1})
{'a': set()}
.. _dictset: https://code.google.com/archive/p/dictset/