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.
- {tinyflux-1.2.0/tinyflux.egg-info → tinyflux-1.2.1}/PKG-INFO +11 -10
- {tinyflux-1.2.0 → tinyflux-1.2.1}/README.md +7 -7
- {tinyflux-1.2.0 → tinyflux-1.2.1}/setup.cfg +3 -2
- {tinyflux-1.2.0 → tinyflux-1.2.1}/tests/test_index.py +17 -0
- {tinyflux-1.2.0 → tinyflux-1.2.1}/tests/test_storages.py +4 -4
- {tinyflux-1.2.0 → tinyflux-1.2.1}/tests/test_tinyflux.py +18 -3
- {tinyflux-1.2.0 → tinyflux-1.2.1}/tinyflux/index.py +20 -9
- {tinyflux-1.2.0 → tinyflux-1.2.1}/tinyflux/queries.py +5 -0
- tinyflux-1.2.1/tinyflux/version.py +3 -0
- {tinyflux-1.2.0 → tinyflux-1.2.1/tinyflux.egg-info}/PKG-INFO +11 -10
- tinyflux-1.2.0/tinyflux/version.py +0 -3
- {tinyflux-1.2.0 → tinyflux-1.2.1}/LICENSE +0 -0
- {tinyflux-1.2.0 → tinyflux-1.2.1}/MANIFEST.in +0 -0
- {tinyflux-1.2.0 → tinyflux-1.2.1}/pyproject.toml +0 -0
- {tinyflux-1.2.0 → tinyflux-1.2.1}/tests/__init__.py +0 -0
- {tinyflux-1.2.0 → tinyflux-1.2.1}/tests/conftest.py +0 -0
- {tinyflux-1.2.0 → tinyflux-1.2.1}/tests/test_measurement.py +0 -0
- {tinyflux-1.2.0 → tinyflux-1.2.1}/tests/test_point.py +0 -0
- {tinyflux-1.2.0 → tinyflux-1.2.1}/tests/test_queries.py +0 -0
- {tinyflux-1.2.0 → tinyflux-1.2.1}/tests/test_utils.py +0 -0
- {tinyflux-1.2.0 → tinyflux-1.2.1}/tinyflux/__init__.py +0 -0
- {tinyflux-1.2.0 → tinyflux-1.2.1}/tinyflux/database.py +0 -0
- {tinyflux-1.2.0 → tinyflux-1.2.1}/tinyflux/decorators.py +0 -0
- {tinyflux-1.2.0 → tinyflux-1.2.1}/tinyflux/measurement.py +0 -0
- {tinyflux-1.2.0 → tinyflux-1.2.1}/tinyflux/point.py +0 -0
- {tinyflux-1.2.0 → tinyflux-1.2.1}/tinyflux/py.typed +0 -0
- {tinyflux-1.2.0 → tinyflux-1.2.1}/tinyflux/storages.py +0 -0
- {tinyflux-1.2.0 → tinyflux-1.2.1}/tinyflux/utils.py +0 -0
- {tinyflux-1.2.0 → tinyflux-1.2.1}/tinyflux.egg-info/SOURCES.txt +0 -0
- {tinyflux-1.2.0 → tinyflux-1.2.1}/tinyflux.egg-info/dependency_links.txt +0 -0
- {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.
|
|
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.
|
|
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
|
|
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
|
[](https://tinyflux.readthedocs.io/en/latest/?badge=latest)
|
|
43
44
|
[](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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
[](https://tinyflux.readthedocs.io/en/latest/?badge=latest)
|
|
11
11
|
[](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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
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.
|
|
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
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tinyflux
|
|
3
|
-
Version: 1.2.
|
|
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.
|
|
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
|
|
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
|
[](https://tinyflux.readthedocs.io/en/latest/?badge=latest)
|
|
43
44
|
[](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
|
-
|
|
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
|
-
|
|
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
|
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|