Skip to content

Commit a01beaa

Browse files
committed
Add custom base examples to README
1 parent 7ad7afa commit a01beaa

File tree

2 files changed

+109
-4
lines changed

2 files changed

+109
-4
lines changed

README.md

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,13 @@ $ pip install fractional-indexing
1818

1919
## Usage
2020

21+
### Generate a single key
22+
2123
```python
2224
from fractional_indexing import generate_key_between
2325

2426

27+
# Insert at the beginning
2528
first = generate_key_between(None, None)
2629
assert first == 'a0'
2730

@@ -43,6 +46,68 @@ assert second_and_half == 'a1V'
4346

4447
```
4548

49+
### Generate multiple keys
50+
51+
```python
52+
from fractional_indexing import generate_n_keys_between
53+
54+
55+
# Insert 3 at the beginning
56+
keys = generate_n_keys_between(None, None, n=3)
57+
assert keys == ['a0', 'a1', 'a2']
58+
59+
# Insert 3 after 1st
60+
keys = generate_n_keys_between('a0', None, n=3)
61+
assert keys == ['a1', 'a2', 'a3']
62+
63+
# Insert 3 before 1st
64+
keys = generate_n_keys_between(None, 'a0', n=3)
65+
assert keys == ['Zx', 'Zy', 'Zz']
66+
67+
# Insert 3 in between 2nd and 3rd. Midpoint
68+
keys = generate_n_keys_between('a1', 'a2', n=3)
69+
assert keys == ['a1G', 'a1V', 'a1l']
70+
71+
```
72+
73+
74+
### Validate a key
75+
76+
```python
77+
from fractional_indexing import validate_order_key, FIError
78+
79+
validate_order_key('a0')
80+
81+
try:
82+
validate_order_key('foo')
83+
except FIError as e:
84+
print(e) # fractional_indexing.FIError: invalid order key: foo
85+
86+
```
87+
88+
### Use custom base digits
89+
90+
By default, this library uses Base62 character encoding. To use a different set of digits, pass them in as the `digits`
91+
argument to `generate_key_between()`, `generate_n_keys_between()`, and `validate_order_key()`:
92+
93+
```python
94+
from fractional_indexing import generate_key_between, generate_n_keys_between, validate_order_key
95+
96+
97+
BASE_95_DIGITS = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'
98+
99+
100+
assert generate_key_between(None, None, digits=BASE_95_DIGITS) == 'a '
101+
assert generate_key_between('a ', None, digits=BASE_95_DIGITS) == 'a!'
102+
assert generate_key_between(None, 'a ', digits=BASE_95_DIGITS) == 'Z~'
103+
104+
assert generate_n_keys_between('a ', 'a!', n=3, digits=BASE_95_DIGITS) == ['a"', 'a#', 'a$']
105+
106+
validate_order_key('a ', digits=BASE_95_DIGITS)
107+
108+
```
109+
110+
46111
## Other Languages
47112

48113
This is a Python port of the original JavaScript implementation by [@rocicorp](https://github.com/rocicorp). That means that this implementation is byte-for-byte compatible with:

tests.py

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22

33
import pytest
44

5-
from fractional_indexing import FIError, generate_key_between, generate_n_keys_between
5+
from fractional_indexing import FIError, generate_key_between, generate_n_keys_between, validate_order_key
6+
7+
8+
BASE_95_DIGITS = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'
69

710

811
@pytest.mark.parametrize(['a', 'b', 'expected'], [
@@ -79,11 +82,10 @@ def test_generate_n_keys_between(a: Optional[str], b: Optional[str], n: int, exp
7982
(None, 'A ', FIError('invalid order key: A ')),
8083
])
8184
def test_base95_digits(a: Optional[str], b: Optional[str], expected: str) -> None:
82-
base_95_digits = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'
8385
kwargs = {
8486
'a': a,
8587
'b': b,
86-
'digits': base_95_digits,
88+
'digits': BASE_95_DIGITS,
8789
}
8890
if isinstance(expected, FIError):
8991
with pytest.raises(FIError) as e:
@@ -98,7 +100,8 @@ def test_base95_digits(a: Optional[str], b: Optional[str], expected: str) -> Non
98100
assert act == expected
99101

100102

101-
def test_readme_example():
103+
def test_readme_examples_single_key():
104+
# Insert at the beginning
102105
first = generate_key_between(None, None)
103106
assert first == 'a0'
104107

@@ -117,3 +120,40 @@ def test_readme_example():
117120
# Insert in between 2nd and 3rd. Midpoint
118121
second_and_half = generate_key_between(second, third)
119122
assert second_and_half == 'a1V'
123+
124+
125+
def test_readme_examples_multiple_keys():
126+
# Insert 3 at the beginning
127+
keys = generate_n_keys_between(None, None, n=3)
128+
assert keys == ['a0', 'a1', 'a2']
129+
130+
# Insert 3 after 1st
131+
keys = generate_n_keys_between('a0', None, n=3)
132+
assert keys == ['a1', 'a2', 'a3']
133+
134+
# Insert 3 before 1st
135+
keys = generate_n_keys_between(None, 'a0', n=3)
136+
assert keys == ['Zx', 'Zy', 'Zz']
137+
138+
# Insert 3 in between 2nd and 3rd. Midpoint
139+
keys = generate_n_keys_between('a1', 'a2', n=3)
140+
assert keys == ['a1G', 'a1V', 'a1l']
141+
142+
143+
def test_readme_examples_validate_order_key():
144+
from fractional_indexing import validate_order_key, FIError
145+
146+
validate_order_key('a0')
147+
148+
try:
149+
validate_order_key('foo')
150+
except FIError as e:
151+
print(e) # fractional_indexing.FIError: invalid order key: foo
152+
153+
154+
def test_readme_examples_custom_base():
155+
validate_order_key('a ', digits=BASE_95_DIGITS)
156+
assert generate_key_between(None, None, digits=BASE_95_DIGITS) == 'a '
157+
assert generate_key_between('a ', None, digits=BASE_95_DIGITS) == 'a!'
158+
assert generate_key_between(None, 'a ', digits=BASE_95_DIGITS) == 'Z~'
159+
assert generate_n_keys_between('a ', 'a!', n=3, digits=BASE_95_DIGITS) == ['a 8', 'a P', 'a h']

0 commit comments

Comments
 (0)