rangebar 11.6.1__cp313-cp313-macosx_11_0_arm64.whl

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 (54) hide show
  1. rangebar/CLAUDE.md +327 -0
  2. rangebar/__init__.py +227 -0
  3. rangebar/__init__.pyi +1089 -0
  4. rangebar/_core.cpython-313-darwin.so +0 -0
  5. rangebar/checkpoint.py +472 -0
  6. rangebar/cli.py +298 -0
  7. rangebar/clickhouse/CLAUDE.md +139 -0
  8. rangebar/clickhouse/__init__.py +100 -0
  9. rangebar/clickhouse/bulk_operations.py +309 -0
  10. rangebar/clickhouse/cache.py +734 -0
  11. rangebar/clickhouse/client.py +121 -0
  12. rangebar/clickhouse/config.py +141 -0
  13. rangebar/clickhouse/mixin.py +120 -0
  14. rangebar/clickhouse/preflight.py +504 -0
  15. rangebar/clickhouse/query_operations.py +345 -0
  16. rangebar/clickhouse/schema.sql +187 -0
  17. rangebar/clickhouse/tunnel.py +222 -0
  18. rangebar/constants.py +288 -0
  19. rangebar/conversion.py +177 -0
  20. rangebar/exceptions.py +207 -0
  21. rangebar/exness.py +364 -0
  22. rangebar/hooks.py +311 -0
  23. rangebar/logging.py +171 -0
  24. rangebar/notify/__init__.py +15 -0
  25. rangebar/notify/pushover.py +155 -0
  26. rangebar/notify/telegram.py +271 -0
  27. rangebar/orchestration/__init__.py +20 -0
  28. rangebar/orchestration/count_bounded.py +797 -0
  29. rangebar/orchestration/helpers.py +412 -0
  30. rangebar/orchestration/models.py +76 -0
  31. rangebar/orchestration/precompute.py +498 -0
  32. rangebar/orchestration/range_bars.py +736 -0
  33. rangebar/orchestration/tick_fetcher.py +226 -0
  34. rangebar/ouroboros.py +454 -0
  35. rangebar/processors/__init__.py +22 -0
  36. rangebar/processors/api.py +383 -0
  37. rangebar/processors/core.py +522 -0
  38. rangebar/resource_guard.py +567 -0
  39. rangebar/storage/__init__.py +22 -0
  40. rangebar/storage/checksum_registry.py +218 -0
  41. rangebar/storage/parquet.py +728 -0
  42. rangebar/streaming.py +300 -0
  43. rangebar/validation/__init__.py +69 -0
  44. rangebar/validation/cache_staleness.py +277 -0
  45. rangebar/validation/continuity.py +664 -0
  46. rangebar/validation/gap_classification.py +294 -0
  47. rangebar/validation/post_storage.py +317 -0
  48. rangebar/validation/tier1.py +175 -0
  49. rangebar/validation/tier2.py +261 -0
  50. rangebar-11.6.1.dist-info/METADATA +308 -0
  51. rangebar-11.6.1.dist-info/RECORD +54 -0
  52. rangebar-11.6.1.dist-info/WHEEL +4 -0
  53. rangebar-11.6.1.dist-info/entry_points.txt +2 -0
  54. rangebar-11.6.1.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,308 @@
1
+ Metadata-Version: 2.4
2
+ Name: rangebar
3
+ Version: 11.6.1
4
+ Classifier: Development Status :: 4 - Beta
5
+ Classifier: Intended Audience :: Financial and Insurance Industry
6
+ Classifier: License :: OSI Approved :: MIT License
7
+ Classifier: Programming Language :: Python :: 3.13
8
+ Classifier: Programming Language :: Rust
9
+ Classifier: Topic :: Office/Business :: Financial :: Investment
10
+ Requires-Dist: pandas>=2.0
11
+ Requires-Dist: numpy>=1.24
12
+ Requires-Dist: polars>=1.0
13
+ Requires-Dist: pyarrow>=14.0
14
+ Requires-Dist: platformdirs>=4.0
15
+ Requires-Dist: clickhouse-connect>=0.8
16
+ Requires-Dist: arro3-core>=0.6.5
17
+ Requires-Dist: click>=8.0
18
+ Requires-Dist: requests>=2.28
19
+ Requires-Dist: loguru>=0.7.0
20
+ Requires-Dist: backtesting>=0.3 ; extra == 'backtesting'
21
+ Requires-Dist: pytest>=7.0 ; extra == 'dev'
22
+ Requires-Dist: pytest-benchmark>=4.0 ; extra == 'dev'
23
+ Requires-Dist: mypy>=1.0 ; extra == 'dev'
24
+ Requires-Dist: black>=23.0 ; extra == 'dev'
25
+ Requires-Dist: ruff>=0.1 ; extra == 'dev'
26
+ Provides-Extra: backtesting
27
+ Provides-Extra: dev
28
+ Provides-Extra: exness
29
+ License-File: LICENSE
30
+ Summary: Python bindings for rangebar: Non-lookahead range bar construction for cryptocurrency trading
31
+ Keywords: trading,cryptocurrency,range-bars,backtesting,technical-analysis
32
+ Author: Terry Li
33
+ License: MIT
34
+ Requires-Python: >=3.13
35
+ Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
36
+ Project-URL: Documentation, https://github.com/terrylica/rangebar-py#readme
37
+ Project-URL: Repository, https://github.com/terrylica/rangebar-py
38
+ Project-URL: Upstream (Rust), https://github.com/terrylica/rangebar
39
+
40
+ # rangebar-py
41
+
42
+ Python bindings for the [rangebar](https://github.com/terrylica/rangebar-py/tree/main/crates) Rust crates via PyO3/maturin.
43
+
44
+ [![PyPI](https://img.shields.io/pypi/v/rangebar.svg)](https://pypi.org/project/rangebar/)
45
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/terrylica/rangebar-py/blob/main/LICENSE)
46
+ [![Python](https://img.shields.io/pypi/pyversions/rangebar.svg)](https://pypi.org/project/rangebar/)
47
+
48
+ ## Links
49
+
50
+ | Resource | URL |
51
+ | --------------------- | ----------------------------------------------------------- |
52
+ | PyPI | <https://pypi.org/project/rangebar/> |
53
+ | Repository | <https://github.com/terrylica/rangebar-py> |
54
+ | Performance Dashboard | <https://terrylica.github.io/rangebar-py/> |
55
+ | Rust Crates | <https://github.com/terrylica/rangebar-py/tree/main/crates> |
56
+ | Issues | <https://github.com/terrylica/rangebar-py/issues> |
57
+
58
+ ## Installation
59
+
60
+ ```bash
61
+ pip install rangebar
62
+ ```
63
+
64
+ Pre-built wheels: Linux (x86_64), macOS (ARM64), Python 3.13
65
+
66
+ Source build requires Rust toolchain and maturin.
67
+
68
+ ## Overview
69
+
70
+ Converts trade tick data into range bars for backtesting. Range bars close when price moves a fixed percentage from the opening price, adapting to market volatility rather than fixed time intervals.
71
+
72
+ **Output format**: pandas DataFrame with DatetimeIndex and OHLCV columns, compatible with [backtesting.py](https://github.com/kernc/backtesting.py).
73
+
74
+ ## Quick Start
75
+
76
+ ```python
77
+ from rangebar import get_range_bars
78
+
79
+ # Fetch data and generate range bars in one call
80
+ df = get_range_bars("BTCUSDT", "2024-01-01", "2024-06-30")
81
+
82
+ # Use with backtesting.py
83
+ from backtesting import Backtest, Strategy
84
+ bt = Backtest(df, MyStrategy, cash=10000, commission=0.0002)
85
+ stats = bt.run()
86
+ ```
87
+
88
+ ## API Reference
89
+
90
+ ### get_range_bars (Date-Bounded)
91
+
92
+ The entry point for date-bounded range bar generation with automatic data fetching and caching.
93
+
94
+ ```python
95
+ from rangebar import get_range_bars
96
+
97
+ # Basic usage - Binance spot
98
+ df = get_range_bars("BTCUSDT", "2024-01-01", "2024-06-30")
99
+
100
+ # Using threshold presets
101
+ df = get_range_bars("BTCUSDT", "2024-01-01", "2024-03-31", threshold_decimal_bps="tight")
102
+
103
+ # Binance USD-M Futures
104
+ df = get_range_bars("BTCUSDT", "2024-01-01", "2024-03-31", market="futures-um")
105
+
106
+ # With microstructure data (vwap, buy_volume, sell_volume)
107
+ df = get_range_bars("BTCUSDT", "2024-01-01", "2024-01-31", include_microstructure=True)
108
+ ```
109
+
110
+ **Parameters**:
111
+
112
+ - `symbol`: Trading symbol (e.g., "BTCUSDT", "ETHUSDT")
113
+ - `start_date`: Start date in YYYY-MM-DD format
114
+ - `end_date`: End date in YYYY-MM-DD format
115
+ - `threshold_decimal_bps`: Threshold in decimal basis points or preset name (default: 250 = 25bps = 0.25%)
116
+ - `source`: Data source - "binance" or "exness" (default: "binance")
117
+ - `market`: Market type - "spot", "futures-um"/"um", "futures-cm"/"cm" (default: "spot")
118
+ - `include_microstructure`: Include vwap, buy_volume, sell_volume columns (default: False)
119
+ - `use_cache`: Cache tick data locally (default: True)
120
+
121
+ **Returns**: pandas DataFrame with DatetimeIndex and columns `Open`, `High`, `Low`, `Close`, `Volume`
122
+
123
+ ### get_n_range_bars (Count-Bounded)
124
+
125
+ Get exactly N range bars - useful for ML training, walk-forward optimization, and consistent backtest comparisons.
126
+
127
+ ```python
128
+ from rangebar import get_n_range_bars
129
+
130
+ # Get last 10,000 bars for ML training
131
+ df = get_n_range_bars("BTCUSDT", n_bars=10000)
132
+ assert len(df) == 10000
133
+
134
+ # Get 5,000 bars ending at specific date
135
+ df = get_n_range_bars("BTCUSDT", n_bars=5000, end_date="2024-06-01")
136
+
137
+ # With safety limit (won't fetch more than 30 days of data)
138
+ df = get_n_range_bars("BTCUSDT", n_bars=1000, max_lookback_days=30)
139
+ ```
140
+
141
+ **Parameters**:
142
+
143
+ - `symbol`: Trading symbol (e.g., "BTCUSDT")
144
+ - `n_bars`: Number of bars to retrieve (must be > 0)
145
+ - `threshold_decimal_bps`: Threshold in decimal basis points or preset name (default: 250)
146
+ - `end_date`: End date (YYYY-MM-DD) or None for most recent data
147
+ - `source`: Data source - "binance" or "exness" (default: "binance")
148
+ - `market`: Market type (default: "spot")
149
+ - `use_cache`: Use ClickHouse cache (default: True)
150
+ - `fetch_if_missing`: Fetch data if cache doesn't have enough bars (default: True)
151
+ - `max_lookback_days`: Safety limit for data fetching (default: 90)
152
+ - `warn_if_fewer`: Emit warning if returning fewer bars than requested (default: True)
153
+
154
+ **Returns**: pandas DataFrame with exactly `n_bars` rows (or fewer if insufficient data), sorted chronologically
155
+
156
+ **Cache behavior**:
157
+
158
+ - **Fast path**: If ClickHouse cache has >= n_bars, returns immediately (~50ms)
159
+ - **Slow path**: Fetches additional data, computes bars, stores in cache
160
+
161
+ ### Threshold Presets
162
+
163
+ Use string presets for common threshold values:
164
+
165
+ | Preset | Value | Percentage | Use Case |
166
+ | ------------ | ----- | ------------- | ---------------- |
167
+ | `"micro"` | 10 | 0.01% (1bps) | Scalping |
168
+ | `"tight"` | 50 | 0.05% (5bps) | Day trading |
169
+ | `"standard"` | 100 | 0.1% (10bps) | Swing trading |
170
+ | `"medium"` | 250 | 0.25% (25bps) | Default |
171
+ | `"wide"` | 500 | 0.5% (50bps) | Position trading |
172
+ | `"macro"` | 1000 | 1% (100bps) | Long-term |
173
+
174
+ ```python
175
+ from rangebar import get_range_bars, THRESHOLD_PRESETS
176
+
177
+ # Using preset string
178
+ df = get_range_bars("BTCUSDT", "2024-01-01", "2024-01-31", threshold_decimal_bps="tight")
179
+
180
+ # Or numeric value
181
+ df = get_range_bars("BTCUSDT", "2024-01-01", "2024-01-31", threshold_decimal_bps=50)
182
+
183
+ # View all presets
184
+ print(THRESHOLD_PRESETS)
185
+ # {'micro': 10, 'tight': 50, 'standard': 100, 'medium': 250, 'wide': 500, 'macro': 1000}
186
+ ```
187
+
188
+ ### Configuration Constants
189
+
190
+ ```python
191
+ from rangebar import TIER1_SYMBOLS, THRESHOLD_PRESETS, THRESHOLD_DECIMAL_MIN, THRESHOLD_DECIMAL_MAX
192
+
193
+ # 18 high-liquidity symbols available on all Binance markets
194
+ print(TIER1_SYMBOLS)
195
+ # ('AAVE', 'ADA', 'AVAX', 'BCH', 'BNB', 'BTC', 'DOGE', 'ETH', 'FIL',
196
+ # 'LINK', 'LTC', 'NEAR', 'SOL', 'SUI', 'UNI', 'WIF', 'WLD', 'XRP')
197
+
198
+ # Valid threshold range
199
+ print(f"Min: {THRESHOLD_DECIMAL_MIN}, Max: {THRESHOLD_DECIMAL_MAX}")
200
+ # Min: 1, Max: 100000
201
+ ```
202
+
203
+ ### Advanced APIs
204
+
205
+ For users with existing tick data (not fetching from Binance):
206
+
207
+ #### process_trades_to_dataframe
208
+
209
+ ```python
210
+ import pandas as pd
211
+ from rangebar import process_trades_to_dataframe
212
+
213
+ # Load your own trade data
214
+ trades = pd.read_csv("BTCUSDT-aggTrades.csv")
215
+
216
+ # Convert to range bars
217
+ df = process_trades_to_dataframe(trades, threshold_decimal_bps=250)
218
+ ```
219
+
220
+ #### process_trades_polars (Recommended for Polars Users)
221
+
222
+ **2-3x faster** than `process_trades_to_dataframe()` with lazy evaluation and predicate pushdown:
223
+
224
+ ```python
225
+ import polars as pl
226
+ from rangebar import process_trades_polars
227
+
228
+ # LazyFrame - predicates pushed to I/O layer (10-100x memory reduction)
229
+ lazy_df = pl.scan_parquet("trades/*.parquet").filter(pl.col("timestamp") >= start_ts)
230
+ bars = process_trades_polars(lazy_df, threshold_decimal_bps=250)
231
+
232
+ # Or with eager DataFrame
233
+ df = pl.read_parquet("trades.parquet")
234
+ bars = process_trades_polars(df)
235
+ ```
236
+
237
+ **Performance benefits**:
238
+
239
+ - Predicate pushdown: filters applied at Parquet read, not after
240
+ - Minimal conversion: only required columns extracted
241
+ - Chunked processing: 100K records per batch
242
+ - Memory efficient: avoids materializing full dataset
243
+
244
+ #### process_trades_chunked
245
+
246
+ Memory-safe processing for large datasets:
247
+
248
+ ```python
249
+ from rangebar import process_trades_chunked
250
+
251
+ # Process 10M+ trades without OOM
252
+ for bars_df in process_trades_chunked(iter(trades), chunk_size=50_000):
253
+ process_batch(bars_df)
254
+ ```
255
+
256
+ ## Requirements
257
+
258
+ **Runtime**: Python >= 3.13, pandas >= 2.0, numpy >= 1.24, polars >= 1.0
259
+
260
+ **Optional**: backtesting >= 0.3 (for backtesting integration)
261
+
262
+ **Build**: Rust toolchain, maturin >= 1.7
263
+
264
+ ## Architecture
265
+
266
+ ```
267
+ rangebar (Rust crate)
268
+ ↓ Cargo dependency
269
+ rangebar-py (this package)
270
+ ├── src/lib.rs (PyO3 bindings)
271
+ └── python/rangebar/ (Python API)
272
+ ↓ pip install
273
+ Python applications
274
+ ```
275
+
276
+ ## Development
277
+
278
+ ```bash
279
+ git clone https://github.com/terrylica/rangebar-py.git
280
+ cd rangebar-py
281
+ pip install maturin
282
+ maturin develop --features data-providers
283
+ pytest tests/
284
+ ```
285
+
286
+ ## Documentation
287
+
288
+ | Document | Description |
289
+ | ------------------------------------------------------------------------------------------------------- | --------------------- |
290
+ | [Examples](https://github.com/terrylica/rangebar-py/tree/main/examples) | Usage examples |
291
+ | [CLAUDE.md](https://github.com/terrylica/rangebar-py/blob/main/CLAUDE.md) | Project context |
292
+ | [Architecture](https://github.com/terrylica/rangebar-py/blob/main/docs/ARCHITECTURE.md) | System design |
293
+ | [Performance Guide](https://github.com/terrylica/rangebar-py/blob/main/docs/development/PERFORMANCE.md) | Benchmark methodology |
294
+
295
+ ## License
296
+
297
+ MIT License. See [LICENSE](https://github.com/terrylica/rangebar-py/blob/main/LICENSE).
298
+
299
+ ## Citation
300
+
301
+ ```bibtex
302
+ @software{rangebar-py,
303
+ title = {rangebar-py: Python bindings for range bar construction},
304
+ author = {Terry Li},
305
+ url = {https://github.com/terrylica/rangebar-py}
306
+ }
307
+ ```
308
+
@@ -0,0 +1,54 @@
1
+ rangebar/CLAUDE.md,sha256=a93bvlk4hGcPydRDBbfzMUro5hX01j4jQV8WmDWy6DQ,9680
2
+ rangebar/__init__.py,sha256=tYLjvpehB-BcnOcLSGqtppqMuzposfZegp_KVR8_ZR0,7407
3
+ rangebar/__init__.pyi,sha256=cbSe-uoWZFviCu1owiZUCH0G5picol3bcNFo4FeRZI8,39531
4
+ rangebar/_core.cpython-313-darwin.so,sha256=n0F_Vx7jvRW9K6i9DXrq6nV3cqOu51Lxom0aMNb8U9k,7440176
5
+ rangebar/checkpoint.py,sha256=dbtjV6R09q2vXovwHKXYZLUueTXBbV1Jg0RXaA19wy0,13055
6
+ rangebar/cli.py,sha256=kJdZvPIOTudQCrlyP6GBJqJNXyW_jPkuau5HUx463sc,8948
7
+ rangebar/clickhouse/CLAUDE.md,sha256=b8YtpHrAZBhYEC5EYJNEIcks2_M-VNttfOd-_T0l4ek,4390
8
+ rangebar/clickhouse/__init__.py,sha256=6enwJRjxxRBTg_GigRd7xTaRAuKQaM-Y7NZL-iDB4Q0,3021
9
+ rangebar/clickhouse/bulk_operations.py,sha256=IDgJiG49axaDgiMIMs8Te8YeMpFXxjygfb0UFjBSK4A,10725
10
+ rangebar/clickhouse/cache.py,sha256=mnwboxwyhX_yrTzOCvRAsWMX_ZUnezzK-x8A1T7ca4A,23381
11
+ rangebar/clickhouse/client.py,sha256=Aij6k2-odeoLe75KpP11rk5AwhWsybsqZ1cLEtA_QAM,2841
12
+ rangebar/clickhouse/config.py,sha256=RzWruoY6lRMxgnisE8iI30RPwaJkXm5gxiG6ZdJfMlo,4050
13
+ rangebar/clickhouse/mixin.py,sha256=7py8EMt4tx5gwIcKnpTaFCRa0fVMs1SzZGJ108ZuG9U,3473
14
+ rangebar/clickhouse/preflight.py,sha256=1BcHN-xDy0XPFlT0022-zAoV2i6uBVJObvPaIokq0GQ,17070
15
+ rangebar/clickhouse/query_operations.py,sha256=qnOR-YYUQdGuX_liIigE6VPesAHd0lAhPw4_ZJeC5RM,12000
16
+ rangebar/clickhouse/schema.sql,sha256=Pq8BDvytm5XhQDq-W1hMEzWoDbG3n7mELFIw0n5J0bA,8549
17
+ rangebar/clickhouse/tunnel.py,sha256=sb4mNh5sLk7P36HO1lzx1E9u42a_fakwa1OSnqcFLy8,6609
18
+ rangebar/constants.py,sha256=bFmaX6o5NdiCUE3ouzo3Kf_1wXGKuKrhMPFL0uc7kw8,9674
19
+ rangebar/conversion.py,sha256=3XPZuHLheZ-9XgVc0a8Kj4ElDcutQVmJ1ESvYvA_Jw8,5065
20
+ rangebar/exceptions.py,sha256=07WO9ZYNJsowkEe6sqVrPpaGqr0dpJkmoyUq7N82vGE,5819
21
+ rangebar/exness.py,sha256=IluUL_PZkOXIBg4jsBl2t5Nii8rrG6KXpchgwCYrJBM,12370
22
+ rangebar/hooks.py,sha256=Zc8hv9jGMbvYqcrWy_uuTh3B-2YDdH7jF2DV8aXwk_4,8555
23
+ rangebar/logging.py,sha256=HOkFj7JmsXW-AJJnxuSR75xpMRiWecffgRLgoysY9ZE,4516
24
+ rangebar/notify/__init__.py,sha256=J6HMJQ4ejryHntnJH6QsiuQ4E7AAzooD3NRDa6DtKR8,380
25
+ rangebar/notify/pushover.py,sha256=ZOZCYlsPPf8EfMp4ZomAl44svVxfCb94hxteUHiFLng,4715
26
+ rangebar/notify/telegram.py,sha256=-LeaZ7lsBdSAuFKXKUU7u4pq-cOfOxhWzi813lXemIM,7641
27
+ rangebar/orchestration/__init__.py,sha256=fk3-pYAUADGpBxk6S7gmsu9ccLFwYEUqaEPWK4GBifE,645
28
+ rangebar/orchestration/count_bounded.py,sha256=VXZc-Gm3YDwAltz6YBXQnQ4jYPThAx6uwgk4qXcc5jE,29224
29
+ rangebar/orchestration/helpers.py,sha256=b7S_t1e4Rvv84UBrF78dmYMGgpoYPMRsV2iJESdwZzg,13544
30
+ rangebar/orchestration/models.py,sha256=_gw5RH0iojCymanDgGvwPG1nJHy05cS5SEYf91mKElw,2059
31
+ rangebar/orchestration/precompute.py,sha256=LT1_LDuoUkyrhYcaCnicDdyxmBLFeB6PMASVFuNxcZI,20210
32
+ rangebar/orchestration/range_bars.py,sha256=w3SnkfUQwsk2fJQYJIdXvU0cwEROuuLCrfRMW9kR_5Q,30016
33
+ rangebar/orchestration/tick_fetcher.py,sha256=iMYtwT9EWmiylBTK1Q4UOF2DAakw186p0tGribDtzqA,7463
34
+ rangebar/ouroboros.py,sha256=hfCxtaoEPNip25NsPEpWWNf6vy08KoW-G4PVup-jrX8,14231
35
+ rangebar/processors/__init__.py,sha256=IpPdEIpLzA-dIytR1rGv4img8GxQa65RnEv2g0R6VRk,635
36
+ rangebar/processors/api.py,sha256=2i0txl5-VVk76i4CuErOPIaW3TKExpvF1W3FaWX3rjk,12540
37
+ rangebar/processors/core.py,sha256=svA2tZTVj0tapesmCDVsDBdsV-_6r4NDmpM5gE3YExg,18782
38
+ rangebar/resource_guard.py,sha256=FZS91LBYEvijldpOnAzuwOLWFLa2M8ZqEJOYRXPlkgc,18768
39
+ rangebar/storage/__init__.py,sha256=HLfTiyih939NN3GtoVon8wUNAN32VyqhAi18r6pAkvw,719
40
+ rangebar/storage/checksum_registry.py,sha256=V9Zc8Iy8K5K5ceg5C93USEIbla5ta2JToJWNz_vfRRY,6965
41
+ rangebar/storage/parquet.py,sha256=RjYC8w57zlmOJbo6kvhgHtF3MQ6LHrudfTOZIUwOy_I,23346
42
+ rangebar/streaming.py,sha256=k_5_AABRPymAVWx8Pa1O55RycfCUaLKsD-mwqE2l850,9726
43
+ rangebar/validation/__init__.py,sha256=HFzJJPgOFwA213KkKhRJuOGyNWJvoBIo7cgeYpmJ8XY,1939
44
+ rangebar/validation/cache_staleness.py,sha256=Dj2tftNzqU4Jb6jR1aCC85mvrHvJBzkztg4vWW5uVYI,8869
45
+ rangebar/validation/continuity.py,sha256=e3M5-0fRECi-EdjEwhZQ1rEg9vbOg0D3GP5BA9lkV6g,21332
46
+ rangebar/validation/gap_classification.py,sha256=9WLKwsQUi8JJT1nAjkphwWLn13MCQRsHiD4TstgbOZE,9894
47
+ rangebar/validation/post_storage.py,sha256=kWgraWeKhDwAFlWxlzEGb0de3RzKk7-nlrJ7t5FyKSo,9696
48
+ rangebar/validation/tier1.py,sha256=3KkXiIQjz7U6HJmgFiuwPSOdIF6JoJTWlj6AuTIoZ70,5591
49
+ rangebar/validation/tier2.py,sha256=PUtT9q8Pe_VbBm25EdHDR6bxFJkq7tUQQJE7iXfUy4A,8970
50
+ rangebar-11.6.1.dist-info/METADATA,sha256=HvZJI_UVNsq5EjM8Axu42H_Hd_MAgrP_gPhXTxQRHpE,10955
51
+ rangebar-11.6.1.dist-info/WHEEL,sha256=V0PyzvBcSARU334gfbMpVsvFu6xR7hFdhQVohqdzf7E,105
52
+ rangebar-11.6.1.dist-info/entry_points.txt,sha256=NRIcb9BtRf3_wr5MBmOJSykOGa6BDcnapRmEQ3QPQyI,45
53
+ rangebar-11.6.1.dist-info/licenses/LICENSE,sha256=QStVwwVTxSvPQ6LIaG7LwxymOexwcbrbgxIJQasda-4,1081
54
+ rangebar-11.6.1.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: maturin (1.11.5)
3
+ Root-Is-Purelib: false
4
+ Tag: cp313-cp313-macosx_11_0_arm64
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ rangebar=rangebar.cli:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 rangebar-py contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.