tinyflux 1.2.0__tar.gz → 1.2.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. {tinyflux-1.2.0/tinyflux.egg-info → tinyflux-1.2.1}/PKG-INFO +11 -10
  2. {tinyflux-1.2.0 → tinyflux-1.2.1}/README.md +7 -7
  3. {tinyflux-1.2.0 → tinyflux-1.2.1}/setup.cfg +3 -2
  4. {tinyflux-1.2.0 → tinyflux-1.2.1}/tests/test_index.py +17 -0
  5. {tinyflux-1.2.0 → tinyflux-1.2.1}/tests/test_storages.py +4 -4
  6. {tinyflux-1.2.0 → tinyflux-1.2.1}/tests/test_tinyflux.py +18 -3
  7. {tinyflux-1.2.0 → tinyflux-1.2.1}/tinyflux/index.py +20 -9
  8. {tinyflux-1.2.0 → tinyflux-1.2.1}/tinyflux/queries.py +5 -0
  9. tinyflux-1.2.1/tinyflux/version.py +3 -0
  10. {tinyflux-1.2.0 → tinyflux-1.2.1/tinyflux.egg-info}/PKG-INFO +11 -10
  11. tinyflux-1.2.0/tinyflux/version.py +0 -3
  12. {tinyflux-1.2.0 → tinyflux-1.2.1}/LICENSE +0 -0
  13. {tinyflux-1.2.0 → tinyflux-1.2.1}/MANIFEST.in +0 -0
  14. {tinyflux-1.2.0 → tinyflux-1.2.1}/pyproject.toml +0 -0
  15. {tinyflux-1.2.0 → tinyflux-1.2.1}/tests/__init__.py +0 -0
  16. {tinyflux-1.2.0 → tinyflux-1.2.1}/tests/conftest.py +0 -0
  17. {tinyflux-1.2.0 → tinyflux-1.2.1}/tests/test_measurement.py +0 -0
  18. {tinyflux-1.2.0 → tinyflux-1.2.1}/tests/test_point.py +0 -0
  19. {tinyflux-1.2.0 → tinyflux-1.2.1}/tests/test_queries.py +0 -0
  20. {tinyflux-1.2.0 → tinyflux-1.2.1}/tests/test_utils.py +0 -0
  21. {tinyflux-1.2.0 → tinyflux-1.2.1}/tinyflux/__init__.py +0 -0
  22. {tinyflux-1.2.0 → tinyflux-1.2.1}/tinyflux/database.py +0 -0
  23. {tinyflux-1.2.0 → tinyflux-1.2.1}/tinyflux/decorators.py +0 -0
  24. {tinyflux-1.2.0 → tinyflux-1.2.1}/tinyflux/measurement.py +0 -0
  25. {tinyflux-1.2.0 → tinyflux-1.2.1}/tinyflux/point.py +0 -0
  26. {tinyflux-1.2.0 → tinyflux-1.2.1}/tinyflux/py.typed +0 -0
  27. {tinyflux-1.2.0 → tinyflux-1.2.1}/tinyflux/storages.py +0 -0
  28. {tinyflux-1.2.0 → tinyflux-1.2.1}/tinyflux/utils.py +0 -0
  29. {tinyflux-1.2.0 → tinyflux-1.2.1}/tinyflux.egg-info/SOURCES.txt +0 -0
  30. {tinyflux-1.2.0 → tinyflux-1.2.1}/tinyflux.egg-info/dependency_links.txt +0 -0
  31. {tinyflux-1.2.0 → tinyflux-1.2.1}/tinyflux.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tinyflux
3
- Version: 1.2.0
3
+ Version: 1.2.1
4
4
  Summary: The Tiny Time-Series Database Optimized for Your Happiness
5
5
  Home-page: https://github.com/citrusvanilla/tinyflux
6
6
  Author: Justin Fung
@@ -17,15 +17,16 @@ Classifier: Topic :: Database
17
17
  Classifier: Topic :: Database :: Database Engines/Servers
18
18
  Classifier: Topic :: Utilities
19
19
  Classifier: Programming Language :: Python :: 3
20
- Classifier: Programming Language :: Python :: 3.9
21
20
  Classifier: Programming Language :: Python :: 3.10
22
21
  Classifier: Programming Language :: Python :: 3.11
23
22
  Classifier: Programming Language :: Python :: 3.12
24
23
  Classifier: Programming Language :: Python :: 3.13
24
+ Classifier: Programming Language :: Python :: 3.14
25
+ Classifier: Programming Language :: Python :: 3.15
25
26
  Classifier: Programming Language :: Python :: Implementation :: CPython
26
27
  Classifier: Operating System :: OS Independent
27
28
  Classifier: Typing :: Typed
28
- Requires-Python: >=3.9
29
+ Requires-Python: >=3.10
29
30
  Description-Content-Type: text/markdown
30
31
  License-File: LICENSE
31
32
  Dynamic: license-file
@@ -37,7 +38,7 @@ Dynamic: license-file
37
38
 
38
39
  TinyFlux is the tiny time series database optimized for your happiness 😎
39
40
 
40
- TinyFlux is the time series version of [TinyDB](https://tinydb.readthedocs.io/en/latest/index.html) that is written in Python and has no external dependencies. It consistently writes atomically to file at over 6,000 writes per second and supports greater than 100 queries per second for time-based range queries on datasets up to 100,000 points. It's a perfect companion for small analytics workflows and apps, as well as at-home IOT data stores. TinyFlux has 100% test coverage, over 150,000 downloads, and no open issues.
41
+ TinyFlux is the time series version of [TinyDB](https://tinydb.readthedocs.io/en/latest/index.html) that is written in Python and has no external dependencies. It consistently writes atomically to file at over 6,000 writes per second and supports greater than 100 queries per second for time-based range queries on datasets up to 100,000 points. It's a perfect companion for small analytics workflows and apps, as well as at-home IOT data stores. TinyFlux has 100% test coverage, over 200,000 downloads, and no open issues.
41
42
 
42
43
  [![Documentation](https://readthedocs.org/projects/tinyflux/badge/?version=latest)](https://tinyflux.readthedocs.io/en/latest/?badge=latest)
43
44
  [![Version](https://img.shields.io/pypi/v/tinyflux.svg)](https://pypi.org/project/tinyflux/)
@@ -59,6 +60,8 @@ Install from PyPI:
59
60
  pip install tinyflux
60
61
  ```
61
62
 
63
+ TinyFlux supports CPython 3.10 through 3.15.
64
+
62
65
  ## Quick Start
63
66
 
64
67
  ```python
@@ -238,13 +241,11 @@ TinyFlux automatic indexing provides:
238
241
 
239
242
  ## TinyFlux Across the Internet
240
243
 
241
- - **IoT Sensor Networks**: Collect and analyze device telemetry
242
- - **System Monitoring**: Track server metrics and application performance
243
- - **Financial Data**: Store and query stock prices, trading volumes
244
- - **Scientific Research**: Log experimental measurements and observations
245
- - **Web Analytics**: Time-stamped user interaction data
244
+ Articles, tutorials, and other instances of TinyFlux in the wild:
246
245
 
247
- *Perfect for prototyping, edge computing, embedded systems, and applications where simplicity matters.*
246
+ - ["Introducing TinyFlux: The Tiny Time Series Database for Python-based IoT & Analytics Applications"](https://citrusvanilla.medium.com/introducing-tinyflux-the-tiny-time-series-database-for-python-based-iot-analytics-applications-c3ef3c3bedf): A Medium.com article announcing the release of TinyFlux
247
+ - ["Storing Time Series Data in Python Using TinyFluxDB"](http://www.steves-internet-guide.com/storing-time-series-data-python-using-tinyflux-db/): A tutorial from [Steve's Internet Guide](http://www.steves-internet-guide.com/), a portal for learning MQTT and IoT development for Python
248
+ - ["KaiCode 2024 Shortlist"](https://www.kaicode.org/2024.html): TinyFlux came in 10th place out of 412 entrants in the 7th edition of this open-source festival, a festival dedicated to recognizing projects with high-quality open-source principles
248
249
 
249
250
  ## Contributing
250
251
 
@@ -5,7 +5,7 @@
5
5
 
6
6
  TinyFlux is the tiny time series database optimized for your happiness 😎
7
7
 
8
- TinyFlux is the time series version of [TinyDB](https://tinydb.readthedocs.io/en/latest/index.html) that is written in Python and has no external dependencies. It consistently writes atomically to file at over 6,000 writes per second and supports greater than 100 queries per second for time-based range queries on datasets up to 100,000 points. It's a perfect companion for small analytics workflows and apps, as well as at-home IOT data stores. TinyFlux has 100% test coverage, over 150,000 downloads, and no open issues.
8
+ TinyFlux is the time series version of [TinyDB](https://tinydb.readthedocs.io/en/latest/index.html) that is written in Python and has no external dependencies. It consistently writes atomically to file at over 6,000 writes per second and supports greater than 100 queries per second for time-based range queries on datasets up to 100,000 points. It's a perfect companion for small analytics workflows and apps, as well as at-home IOT data stores. TinyFlux has 100% test coverage, over 200,000 downloads, and no open issues.
9
9
 
10
10
  [![Documentation](https://readthedocs.org/projects/tinyflux/badge/?version=latest)](https://tinyflux.readthedocs.io/en/latest/?badge=latest)
11
11
  [![Version](https://img.shields.io/pypi/v/tinyflux.svg)](https://pypi.org/project/tinyflux/)
@@ -27,6 +27,8 @@ Install from PyPI:
27
27
  pip install tinyflux
28
28
  ```
29
29
 
30
+ TinyFlux supports CPython 3.10 through 3.15.
31
+
30
32
  ## Quick Start
31
33
 
32
34
  ```python
@@ -206,13 +208,11 @@ TinyFlux automatic indexing provides:
206
208
 
207
209
  ## TinyFlux Across the Internet
208
210
 
209
- - **IoT Sensor Networks**: Collect and analyze device telemetry
210
- - **System Monitoring**: Track server metrics and application performance
211
- - **Financial Data**: Store and query stock prices, trading volumes
212
- - **Scientific Research**: Log experimental measurements and observations
213
- - **Web Analytics**: Time-stamped user interaction data
211
+ Articles, tutorials, and other instances of TinyFlux in the wild:
214
212
 
215
- *Perfect for prototyping, edge computing, embedded systems, and applications where simplicity matters.*
213
+ - ["Introducing TinyFlux: The Tiny Time Series Database for Python-based IoT & Analytics Applications"](https://citrusvanilla.medium.com/introducing-tinyflux-the-tiny-time-series-database-for-python-based-iot-analytics-applications-c3ef3c3bedf): A Medium.com article announcing the release of TinyFlux
214
+ - ["Storing Time Series Data in Python Using TinyFluxDB"](http://www.steves-internet-guide.com/storing-time-series-data-python-using-tinyflux-db/): A tutorial from [Steve's Internet Guide](http://www.steves-internet-guide.com/), a portal for learning MQTT and IoT development for Python
215
+ - ["KaiCode 2024 Shortlist"](https://www.kaicode.org/2024.html): TinyFlux came in 10th place out of 412 entrants in the 7th edition of this open-source festival, a festival dedicated to recognizing projects with high-quality open-source principles
216
216
 
217
217
  ## Contributing
218
218
 
@@ -30,18 +30,19 @@ classifiers =
30
30
  Topic :: Database :: Database Engines/Servers
31
31
  Topic :: Utilities
32
32
  Programming Language :: Python :: 3
33
- Programming Language :: Python :: 3.9
34
33
  Programming Language :: Python :: 3.10
35
34
  Programming Language :: Python :: 3.11
36
35
  Programming Language :: Python :: 3.12
37
36
  Programming Language :: Python :: 3.13
37
+ Programming Language :: Python :: 3.14
38
+ Programming Language :: Python :: 3.15
38
39
  Programming Language :: Python :: Implementation :: CPython
39
40
  Operating System :: OS Independent
40
41
  Typing :: Typed
41
42
 
42
43
  [options]
43
44
  packages = tinyflux
44
- python_requires = >=3.9
45
+ python_requires = >=3.10
45
46
 
46
47
  [options.package_data]
47
48
  tinyflux = py.typed
@@ -350,6 +350,23 @@ def test_search_field_query():
350
350
  assert rst.items == set({})
351
351
 
352
352
 
353
+ def test_search_field_query_with_map():
354
+ """Test Index search applies map functions to field values."""
355
+ index = Index()
356
+ index._insert_fields(0, {"temp": 70.0})
357
+
358
+ rst = index.search(FieldQuery().temp.map(lambda x: x * 2) == 140.0)
359
+ assert rst.items == {0}
360
+
361
+ rst = index.search(
362
+ FieldQuery().map(lambda fields: fields["temp"] * 2) == 140.0
363
+ )
364
+ assert rst.items == {0}
365
+
366
+ rst = index.search(FieldQuery().temp.map(lambda _: 1 / 0) == 1)
367
+ assert rst.items == set({})
368
+
369
+
353
370
  def test_search_compound_query_not():
354
371
  """Test search_query of Index on compound 'not' queries."""
355
372
  # Some timestamps.
@@ -352,7 +352,7 @@ def test_connect_to_existing_csv(tmpdir, csv_storage_with_counters):
352
352
 
353
353
  # Mock CSV store. Insert points out of order.
354
354
  path = os.path.join(tmpdir, "test.csv")
355
- with open(path, "w") as f:
355
+ with open(path, "w", newline="") as f:
356
356
  w = csv.writer(f)
357
357
  w.writerow(p2._serialize_to_list())
358
358
  w.writerow(p1._serialize_to_list())
@@ -478,7 +478,7 @@ def test_multiple_appends(
478
478
 
479
479
  # Mock CSV store. Insert points out of order.
480
480
  path = os.path.join(tmpdir, "test.csv")
481
- with open(path, "w") as f:
481
+ with open(path, "w", newline="") as f:
482
482
  w = csv.writer(f)
483
483
  w.writerow(p2._serialize_to_list())
484
484
  w.writerow(p1._serialize_to_list())
@@ -514,7 +514,7 @@ def test_multiple_reads(
514
514
  path = os.path.join(tmpdir, "test.csv")
515
515
  t = datetime.now(timezone.utc)
516
516
 
517
- with open(path, "w") as f:
517
+ with open(path, "w", newline="") as f:
518
518
  w = csv.writer(f)
519
519
  for _ in range(10):
520
520
  w.writerow(Point(time=t)._serialize_to_list())
@@ -533,7 +533,7 @@ def test_multiple_reads(
533
533
 
534
534
  # Mock CSV store. Insert points out-of-order.
535
535
  path = os.path.join(tmpdir, "test.csv")
536
- with open(path, "w") as f:
536
+ with open(path, "w", newline="") as f:
537
537
  w = csv.writer(f)
538
538
  for _ in range(10):
539
539
  w.writerow(Point(time=t)._serialize_to_list())
@@ -657,7 +657,7 @@ def test_reindex(tmpdir, capsys):
657
657
 
658
658
  # Mock CSV store. Insert points out of order.
659
659
  path = os.path.join(tmpdir, "test.csv")
660
- f = open(path, "w")
660
+ f = open(path, "w", newline="")
661
661
  w = csv.writer(f)
662
662
  w.writerow(p2._serialize_to_list())
663
663
  w.writerow(p1._serialize_to_list())
@@ -842,6 +842,21 @@ def test_search():
842
842
  assert db.search(FieldQuery().a.exists()) == [p2]
843
843
 
844
844
 
845
+ def test_search_field_map_index_storage_parity():
846
+ """Test mapped FieldQuery search matches with and without the index."""
847
+ point = Point(fields={"a": 70})
848
+ query = FieldQuery().a.map(lambda value: value * 2) == 140
849
+
850
+ db_storage = TinyFlux(storage=MemoryStorage, auto_index=False)
851
+ db_storage.insert(point)
852
+
853
+ db_index = TinyFlux(storage=MemoryStorage, auto_index=True)
854
+ db_index.insert(point)
855
+
856
+ assert db_storage.search(query) == [point]
857
+ assert db_index.search(query) == [point]
858
+
859
+
845
860
  def test_select():
846
861
  """Test select method."""
847
862
  db = TinyFlux(storage=MemoryStorage, auto_index=False)
@@ -1175,7 +1190,7 @@ def test_storage_index_initialization_with_autoindex_ON(tmpdir, capsys):
1175
1190
 
1176
1191
  # Mock CSV store. Insert points out of order.
1177
1192
  path = os.path.join(tmpdir, "test.csv")
1178
- with open(path, "w") as f:
1193
+ with open(path, "w", newline="") as f:
1179
1194
  w = csv.writer(f)
1180
1195
  w.writerow(p2._serialize_to_list())
1181
1196
  w.writerow(p1._serialize_to_list())
@@ -1217,7 +1232,7 @@ def test_open_unindexed_storage_with_autoindex_OFF(tmpdir):
1217
1232
 
1218
1233
  # Mock CSV store.
1219
1234
  path = os.path.join(tmpdir, "test.csv")
1220
- with open(path, "w") as f:
1235
+ with open(path, "w", newline="") as f:
1221
1236
  w = csv.writer(f)
1222
1237
  w.writerow(p2._serialize_to_list())
1223
1238
  w.writerow(p1._serialize_to_list())
@@ -600,17 +600,28 @@ class Index:
600
600
  """
601
601
  rst_items: Set[int] = set([])
602
602
 
603
- for field_key, items in self._fields.items():
604
- # Transform the key. We're only concerned with whether or not a
605
- # storage item has a relevant field key before testing its value.
606
- # It if does, then we the values, and add these items to results.
607
- try:
608
- query._path_resolver({field_key: 0.0})
609
- except Exception:
610
- continue
603
+ field_items: Iterable[Tuple[str, List[Tuple[int, FieldValue]]]]
604
+
605
+ if query._path and isinstance(query._path[0], str):
606
+ field_items = [
607
+ (query._path[0], self._fields.get(query._path[0], []))
608
+ ]
609
+ else:
610
+ field_items = self._fields.items()
611
611
 
612
+ for field_key, items in field_items:
612
613
  for idx, test_value in items:
613
- if query._test(test_value):
614
+ if len(query._path) == 1 and isinstance(query._path[0], str):
615
+ resolved_value = test_value
616
+ else:
617
+ try:
618
+ resolved_value = query._path_resolver(
619
+ {field_key: test_value}
620
+ )
621
+ except Exception:
622
+ continue
623
+
624
+ if query._test(resolved_value):
614
625
  rst_items.add(idx)
615
626
 
616
627
  return rst_items
@@ -206,6 +206,7 @@ class SimpleQuery:
206
206
  rhs: Any,
207
207
  test: Callable[..., bool],
208
208
  path_resolver: Callable[..., Any],
209
+ path: Tuple[Union[str, Callable[..., Any]], ...],
209
210
  hashval: Any,
210
211
  ) -> None:
211
212
  """Initialize an SimpleQuery.
@@ -217,6 +218,7 @@ class SimpleQuery:
217
218
  test: The combined logic as a callable.
218
219
  path_resolver: A fetcher/translator for Point metadata that the
219
220
  query will be evaluated on.
221
+ path: The query path from the point attribute to the tested value.
220
222
  hashval: The hash value for the query.
221
223
  """
222
224
  self._point_attr = point_attr
@@ -224,6 +226,7 @@ class SimpleQuery:
224
226
  self._rhs = rhs
225
227
  self._test = test
226
228
  self._path_resolver = path_resolver
229
+ self._path = path
227
230
  self._hash = hashval
228
231
 
229
232
  @property
@@ -509,6 +512,7 @@ class BaseQuery:
509
512
  rhs=rhs,
510
513
  test=test,
511
514
  path_resolver=path_resolver,
515
+ path=self._path,
512
516
  hashval=hashval if self.is_hashable() else None,
513
517
  )
514
518
 
@@ -732,6 +736,7 @@ class BaseQuery:
732
736
  rhs=None,
733
737
  test=lambda _: True,
734
738
  path_resolver=lambda x: x,
739
+ path=(),
735
740
  hashval=(),
736
741
  )
737
742
 
@@ -0,0 +1,3 @@
1
+ """Version."""
2
+
3
+ __version__ = "1.2.1" # pragma: no cover
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tinyflux
3
- Version: 1.2.0
3
+ Version: 1.2.1
4
4
  Summary: The Tiny Time-Series Database Optimized for Your Happiness
5
5
  Home-page: https://github.com/citrusvanilla/tinyflux
6
6
  Author: Justin Fung
@@ -17,15 +17,16 @@ Classifier: Topic :: Database
17
17
  Classifier: Topic :: Database :: Database Engines/Servers
18
18
  Classifier: Topic :: Utilities
19
19
  Classifier: Programming Language :: Python :: 3
20
- Classifier: Programming Language :: Python :: 3.9
21
20
  Classifier: Programming Language :: Python :: 3.10
22
21
  Classifier: Programming Language :: Python :: 3.11
23
22
  Classifier: Programming Language :: Python :: 3.12
24
23
  Classifier: Programming Language :: Python :: 3.13
24
+ Classifier: Programming Language :: Python :: 3.14
25
+ Classifier: Programming Language :: Python :: 3.15
25
26
  Classifier: Programming Language :: Python :: Implementation :: CPython
26
27
  Classifier: Operating System :: OS Independent
27
28
  Classifier: Typing :: Typed
28
- Requires-Python: >=3.9
29
+ Requires-Python: >=3.10
29
30
  Description-Content-Type: text/markdown
30
31
  License-File: LICENSE
31
32
  Dynamic: license-file
@@ -37,7 +38,7 @@ Dynamic: license-file
37
38
 
38
39
  TinyFlux is the tiny time series database optimized for your happiness 😎
39
40
 
40
- TinyFlux is the time series version of [TinyDB](https://tinydb.readthedocs.io/en/latest/index.html) that is written in Python and has no external dependencies. It consistently writes atomically to file at over 6,000 writes per second and supports greater than 100 queries per second for time-based range queries on datasets up to 100,000 points. It's a perfect companion for small analytics workflows and apps, as well as at-home IOT data stores. TinyFlux has 100% test coverage, over 150,000 downloads, and no open issues.
41
+ TinyFlux is the time series version of [TinyDB](https://tinydb.readthedocs.io/en/latest/index.html) that is written in Python and has no external dependencies. It consistently writes atomically to file at over 6,000 writes per second and supports greater than 100 queries per second for time-based range queries on datasets up to 100,000 points. It's a perfect companion for small analytics workflows and apps, as well as at-home IOT data stores. TinyFlux has 100% test coverage, over 200,000 downloads, and no open issues.
41
42
 
42
43
  [![Documentation](https://readthedocs.org/projects/tinyflux/badge/?version=latest)](https://tinyflux.readthedocs.io/en/latest/?badge=latest)
43
44
  [![Version](https://img.shields.io/pypi/v/tinyflux.svg)](https://pypi.org/project/tinyflux/)
@@ -59,6 +60,8 @@ Install from PyPI:
59
60
  pip install tinyflux
60
61
  ```
61
62
 
63
+ TinyFlux supports CPython 3.10 through 3.15.
64
+
62
65
  ## Quick Start
63
66
 
64
67
  ```python
@@ -238,13 +241,11 @@ TinyFlux automatic indexing provides:
238
241
 
239
242
  ## TinyFlux Across the Internet
240
243
 
241
- - **IoT Sensor Networks**: Collect and analyze device telemetry
242
- - **System Monitoring**: Track server metrics and application performance
243
- - **Financial Data**: Store and query stock prices, trading volumes
244
- - **Scientific Research**: Log experimental measurements and observations
245
- - **Web Analytics**: Time-stamped user interaction data
244
+ Articles, tutorials, and other instances of TinyFlux in the wild:
246
245
 
247
- *Perfect for prototyping, edge computing, embedded systems, and applications where simplicity matters.*
246
+ - ["Introducing TinyFlux: The Tiny Time Series Database for Python-based IoT & Analytics Applications"](https://citrusvanilla.medium.com/introducing-tinyflux-the-tiny-time-series-database-for-python-based-iot-analytics-applications-c3ef3c3bedf): A Medium.com article announcing the release of TinyFlux
247
+ - ["Storing Time Series Data in Python Using TinyFluxDB"](http://www.steves-internet-guide.com/storing-time-series-data-python-using-tinyflux-db/): A tutorial from [Steve's Internet Guide](http://www.steves-internet-guide.com/), a portal for learning MQTT and IoT development for Python
248
+ - ["KaiCode 2024 Shortlist"](https://www.kaicode.org/2024.html): TinyFlux came in 10th place out of 412 entrants in the 7th edition of this open-source festival, a festival dedicated to recognizing projects with high-quality open-source principles
248
249
 
249
250
  ## Contributing
250
251
 
@@ -1,3 +0,0 @@
1
- """Version."""
2
-
3
- __version__ = "1.2.0" # pragma: no cover
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes