textutils-kit 0.0.1__py3-none-any.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.
textutils/__init__.py ADDED
@@ -0,0 +1,17 @@
1
+ from .casing import camel_case
2
+ from .casing._capitalize_words import capitalize_words
3
+ from .casing._snake_case import snake_case
4
+ from .counting._character_count import character_count
5
+ from .counting._word_count import word_count
6
+ from .frequency._word_frequency import word_frequency
7
+ from .transform._reverse import reverse
8
+
9
+ __all__ = [
10
+ "camel_case",
11
+ "capitalize_words",
12
+ "character_count",
13
+ "reverse",
14
+ "snake_case",
15
+ "word_count",
16
+ "word_frequency",
17
+ ]
@@ -0,0 +1,7 @@
1
+ """Utilities for text casing and naming conventions."""
2
+
3
+ from ._camel_case import camel_case
4
+ from ._capitalize_words import capitalize_words
5
+ from ._snake_case import snake_case
6
+
7
+ __all__ = ["camel_case", "capitalize_words", "snake_case"]
@@ -0,0 +1,20 @@
1
+ def camel_case(text):
2
+ """
3
+ Convert a text to camel case.
4
+
5
+ Parameters
6
+ ----------
7
+ text : str
8
+ The text to convert to camel case.
9
+
10
+ Returns
11
+ -------
12
+ str
13
+ The text converted to camel case.
14
+ """
15
+ words = text.split()
16
+
17
+ if not words:
18
+ return ""
19
+
20
+ return words[0].lower() + "".join(word.capitalize() for word in words[1:])
@@ -0,0 +1,21 @@
1
+ def capitalize_words(text):
2
+ """
3
+ Capitalize the first letter of each word in a text.
4
+
5
+ Parameters
6
+ ----------
7
+ text : str
8
+ The text in which to capitalize the words.
9
+
10
+ Returns
11
+ -------
12
+ str
13
+ The text with each word capitalized.
14
+ """
15
+ result = ""
16
+ for i in range(len(text)):
17
+ if i == 0 or text[i - 1].isspace():
18
+ result += text[i].upper()
19
+ else:
20
+ result += text[i]
21
+ return result
@@ -0,0 +1,15 @@
1
+ def snake_case(text):
2
+ """
3
+ Convert a text to snake case.
4
+
5
+ Parameters
6
+ ----------
7
+ text : str
8
+ The text to convert to snake case.
9
+
10
+ Returns
11
+ -------
12
+ str
13
+ The text converted to snake case.
14
+ """
15
+ return "_".join(text.lower().split())
@@ -0,0 +1,29 @@
1
+ from textutils.casing._camel_case import camel_case
2
+
3
+
4
+ def test_camel_case_normal():
5
+ assert camel_case("hello world") == "helloWorld"
6
+
7
+
8
+ def test_camel_case_upper():
9
+ assert camel_case("HELLO WORLD") == "helloWorld"
10
+
11
+
12
+ def test_camel_case_multiple_spaces():
13
+ assert camel_case("hello world") == "helloWorld"
14
+
15
+
16
+ def test_camel_case_empty():
17
+ assert camel_case("") == ""
18
+
19
+
20
+ def test_camel_case_newlines():
21
+ assert camel_case("hello\nworld") == "helloWorld"
22
+
23
+
24
+ def test_camel_case_tabs():
25
+ assert camel_case("hello\tworld") == "helloWorld"
26
+
27
+
28
+ def test_camel_case_leading_trailing_spaces():
29
+ assert camel_case(" hello world ") == "helloWorld"
@@ -0,0 +1,37 @@
1
+ from textutils.casing._capitalize_words import capitalize_words
2
+
3
+
4
+ def test_capitalize_words_normal():
5
+ assert capitalize_words("hello world") == "Hello World"
6
+
7
+
8
+ def test_capitalize_words_capitalize():
9
+ assert capitalize_words("Hello World") == "Hello World"
10
+
11
+
12
+ def test_capitalize_words_upper():
13
+ assert capitalize_words("HELLO WORLD") == "HELLO WORLD"
14
+
15
+
16
+ def test_capitalize_words_empty():
17
+ assert capitalize_words("") == ""
18
+
19
+
20
+ def test_capitalize_words_number():
21
+ assert capitalize_words("1234") == "1234"
22
+
23
+
24
+ def test_capitalize_words_multiple_spaces():
25
+ assert capitalize_words("hello world") == "Hello World"
26
+
27
+
28
+ def test_capitalize_words_newlines():
29
+ assert capitalize_words("hello\nworld") == "Hello\nWorld"
30
+
31
+
32
+ def test_capitalize_words_tabs():
33
+ assert capitalize_words("hello\tworld") == "Hello\tWorld"
34
+
35
+
36
+ def test_capitalize_words_apostrophe():
37
+ assert capitalize_words("don't stop") == "Don't Stop"
@@ -0,0 +1,33 @@
1
+ from textutils.casing._snake_case import snake_case
2
+
3
+
4
+ def test_snake_case_normal():
5
+ assert snake_case("hello world") == "hello_world"
6
+
7
+
8
+ def test_snake_case_upper():
9
+ assert snake_case("HELLO WORLD") == "hello_world"
10
+
11
+
12
+ def test_snake_case_multiple_spaces():
13
+ assert snake_case("hello world") == "hello_world"
14
+
15
+
16
+ def test_snake_case_empty():
17
+ assert snake_case("") == ""
18
+
19
+
20
+ def test_snake_case_already_snake_case():
21
+ assert snake_case("hello_world") == "hello_world"
22
+
23
+
24
+ def test_snake_case_newlines():
25
+ assert snake_case("hello\nworld") == "hello_world"
26
+
27
+
28
+ def test_snake_case_tabs():
29
+ assert snake_case("hello\tworld") == "hello_world"
30
+
31
+
32
+ def test_snake_case_leading_trailing_spaces():
33
+ assert snake_case(" hello world ") == "hello_world"
@@ -0,0 +1,6 @@
1
+ """Utilities for counting words and characters."""
2
+
3
+ from ._character_count import character_count
4
+ from ._word_count import word_count
5
+
6
+ __all__ = ["character_count", "word_count"]
@@ -0,0 +1,24 @@
1
+ def character_count(text, include_spaces=True):
2
+ """
3
+ Count the number of characters in a text.
4
+
5
+ Parameters
6
+ ----------
7
+ text : str
8
+ The text in which to count the characters.
9
+ include_spaces : bool, optional
10
+ Whether to include spaces in the count. Defaults to True.
11
+
12
+ Returns
13
+ -------
14
+ int
15
+ The number of characters in the text.
16
+ """
17
+ if not include_spaces:
18
+ nb = 0
19
+ for i in range(len(text)):
20
+ if text[i] != " ":
21
+ nb += 1
22
+ return nb
23
+ else:
24
+ return len(text)
@@ -0,0 +1,16 @@
1
+ def word_count(text):
2
+ """
3
+ Count the number of words in a text.
4
+
5
+ Parameters
6
+ ----------
7
+ text : str
8
+ The text in which to count the words.
9
+
10
+ Returns
11
+ -------
12
+ int
13
+ The number of words in the text.
14
+ """
15
+ words = text.split()
16
+ return len(words)
@@ -0,0 +1,61 @@
1
+ from textutils.counting._character_count import character_count
2
+
3
+
4
+ def test_character_count():
5
+ assert character_count("Hello world") == 11
6
+
7
+
8
+ def test_character_count_normal_true():
9
+ assert character_count("Hello world", True) == 11
10
+
11
+
12
+ def test_character_count_normal_false():
13
+ assert character_count("Hello world", False) == 10
14
+
15
+
16
+ def test_character_count_empty_true():
17
+ assert character_count("", True) == 0
18
+
19
+
20
+ def test_character_count_empty_false():
21
+ assert character_count("", False) == 0
22
+
23
+
24
+ def test_character_count_single_word_true():
25
+ assert character_count("Hello", True) == 5
26
+
27
+
28
+ def test_character_count_single_word_false():
29
+ assert character_count("Hello", False) == 5
30
+
31
+
32
+ def test_character_count_multiple_spaces_true():
33
+ assert character_count("Hello world", True) == 13
34
+
35
+
36
+ def test_character_count_multiple_spaces_false():
37
+ assert character_count("Hello world", False) == 10
38
+
39
+
40
+ def test_character_count_whitespace_true():
41
+ assert character_count(" ", True) == 3
42
+
43
+
44
+ def test_character_count_whitespace_false():
45
+ assert character_count(" ", False) == 0
46
+
47
+
48
+ def test_character_count_newlines_true():
49
+ assert character_count("Hello\nworld", True) == 11
50
+
51
+
52
+ def test_character_count_newlines_false():
53
+ assert character_count("Hello\nworld", False) == 11
54
+
55
+
56
+ def test_character_count_tabs_true():
57
+ assert character_count("Hello\tworld", True) == 11
58
+
59
+
60
+ def test_character_count_tabs_false():
61
+ assert character_count("Hello\tworld", False) == 11
@@ -0,0 +1,29 @@
1
+ from textutils.counting._word_count import word_count
2
+
3
+
4
+ def test_word_count_normal():
5
+ assert word_count("Hello world") == 2
6
+
7
+
8
+ def test_word_count_empty():
9
+ assert word_count("") == 0
10
+
11
+
12
+ def test_word_count_single_word():
13
+ assert word_count("Hello") == 1
14
+
15
+
16
+ def test_word_count_multiple_spaces():
17
+ assert word_count("Hello world") == 2
18
+
19
+
20
+ def test_word_count_whitespace():
21
+ assert word_count(" ") == 0
22
+
23
+
24
+ def test_word_count_newlines():
25
+ assert word_count("Hello\nworld") == 2
26
+
27
+
28
+ def test_word_count_tabs():
29
+ assert word_count("Hello\tworld") == 2
@@ -0,0 +1,5 @@
1
+ """Utilities for analyzing word frequencies."""
2
+
3
+ from ._word_frequency import word_frequency
4
+
5
+ __all__ = ["word_frequency"]
@@ -0,0 +1,163 @@
1
+ import string
2
+
3
+
4
+ def _normalize(word, case_sensitive):
5
+ """
6
+ Strip surrounding punctuation and apply the case option to a word.
7
+
8
+ Parameters
9
+ ----------
10
+ word : str
11
+ The word to clean.
12
+ case_sensitive : bool
13
+ If False, the word is converted to lowercase.
14
+
15
+ Returns
16
+ -------
17
+ str
18
+ The cleaned word, which may be empty if it contained
19
+ only punctuation.
20
+ """
21
+ word = word.strip(string.punctuation)
22
+ return word if case_sensitive else word.lower()
23
+
24
+
25
+ def _normalize_ignored(ignore_words, case_sensitive):
26
+ """
27
+ Build the set of words to ignore, following the case option.
28
+
29
+ Parameters
30
+ ----------
31
+ ignore_words : list[str] or None
32
+ Words to exclude, or None for no exclusion.
33
+ case_sensitive : bool
34
+ If False, ignored words are converted to lowercase.
35
+
36
+ Returns
37
+ -------
38
+ set[str]
39
+ The normalized words to ignore.
40
+ """
41
+ return {_normalize(word, case_sensitive) for word in (ignore_words or [])}
42
+
43
+
44
+ def _extract_words(text, case_sensitive, ignored, min_length):
45
+ """
46
+ Yield the words of a text that must be counted.
47
+
48
+ Parameters
49
+ ----------
50
+ text : str
51
+ The text to analyze.
52
+ case_sensitive : bool
53
+ Whether to preserve the original case.
54
+ ignored : set[str]
55
+ Normalized words to skip.
56
+ min_length : int
57
+ Words shorter than this are skipped.
58
+
59
+ Yields
60
+ ------
61
+ str
62
+ Each normalized word that passes the filters.
63
+ """
64
+ for raw_word in text.split():
65
+ word = _normalize(raw_word, case_sensitive)
66
+ if word and len(word) >= min_length and word not in ignored:
67
+ yield word
68
+
69
+
70
+ def _count_words(words):
71
+ """
72
+ Count word occurrences, keeping the order of first appearance.
73
+
74
+ Parameters
75
+ ----------
76
+ words : Iterable[str]
77
+ The words to count.
78
+
79
+ Returns
80
+ -------
81
+ dict[str, int]
82
+ The number of occurrences of each word.
83
+ """
84
+ counts = {}
85
+ for word in words:
86
+ counts[word] = counts.get(word, 0) + 1
87
+ return counts
88
+
89
+
90
+ def _sort_by_frequency(counts):
91
+ """
92
+ Sort word counts by decreasing frequency.
93
+
94
+ Words with equal frequencies keep their order of first appearance.
95
+
96
+ Parameters
97
+ ----------
98
+ counts : dict[str, int]
99
+ The number of occurrences of each word.
100
+
101
+ Returns
102
+ -------
103
+ list[tuple[str, int]]
104
+ The (word, count) pairs, ordered by decreasing frequency.
105
+ """
106
+ return sorted(counts.items(), key=lambda item: -item[1])
107
+
108
+
109
+ def word_frequency(
110
+ text, case_sensitive=False, ignore_words=None, min_length=1, top_n=None
111
+ ):
112
+ """
113
+ Count how often each word appears in a text.
114
+
115
+ Punctuation around words is ignored, so "python", "python." and "python!"
116
+ are the same word. Apostrophes inside a word (e.g. "don't") are kept.
117
+
118
+ Parameters
119
+ ----------
120
+ text : str
121
+ The text to analyze.
122
+ case_sensitive : bool, optional
123
+ If False (default), "Python" and "python" are counted as the
124
+ same word and returned in lowercase.
125
+ ignore_words : list[str] or None, optional
126
+ Words to exclude from the result.
127
+ The comparison follows the case_sensitive option.
128
+ min_length : int, optional
129
+ Words shorter than this are ignored. Defaults to 1.
130
+ top_n : int or None, optional
131
+ If set, only the top_n most frequent words are returned.
132
+ Defaults to None.
133
+
134
+ Returns
135
+ -------
136
+ dict[str, int]
137
+ A dictionary ordered by decreasing frequency. Words with
138
+ the same frequency keep their order of first appearance.
139
+ An empty or whitespace-only text returns an empty dictionary.
140
+
141
+ Raises
142
+ ------
143
+ TypeError
144
+ If text is not a string.
145
+ ValueError
146
+ If min_length is negative.
147
+
148
+ Examples
149
+ --------
150
+ >>> word_frequency("Python is great. Python is simple.")
151
+ {'python': 2, 'is': 2, 'great': 1, 'simple': 1}
152
+ """
153
+ if not isinstance(text, str):
154
+ raise TypeError("text must be a string")
155
+ if min_length < 0:
156
+ raise ValueError("min_length must be greater than or equal to 0")
157
+ if top_n is not None and top_n <= 0:
158
+ return {}
159
+
160
+ ignored = _normalize_ignored(ignore_words, case_sensitive)
161
+ words = _extract_words(text, case_sensitive, ignored, min_length)
162
+ ordered = _sort_by_frequency(_count_words(words))
163
+ return dict(ordered[:top_n])
@@ -0,0 +1,97 @@
1
+ import pytest
2
+
3
+ from textutils.frequency._word_frequency import word_frequency
4
+
5
+
6
+ def test_word_frequency_normal():
7
+ assert word_frequency("hello world hello") == {
8
+ "hello": 2,
9
+ "world": 1,
10
+ }
11
+
12
+
13
+ def test_word_frequency_empty():
14
+ assert word_frequency("") == {}
15
+
16
+
17
+ def test_word_frequency_whitespace():
18
+ assert word_frequency(" ") == {}
19
+
20
+
21
+ def test_word_frequency_single_word():
22
+ assert word_frequency("hello") == {
23
+ "hello": 1,
24
+ }
25
+
26
+
27
+ def test_word_frequency_upper_false():
28
+ assert word_frequency("Hello hello HELLO") == {
29
+ "hello": 3,
30
+ }
31
+
32
+
33
+ def test_word_frequency_upper_true():
34
+ assert word_frequency("Hello hello HELLO", case_sensitive=True) == {
35
+ "Hello": 1,
36
+ "hello": 1,
37
+ "HELLO": 1,
38
+ }
39
+
40
+
41
+ def test_word_frequency_punctuation():
42
+ assert word_frequency("Hello! hello. hello?") == {
43
+ "hello": 3,
44
+ }
45
+
46
+
47
+ def test_word_frequency_ignore_words():
48
+ assert word_frequency("hello world hello", ignore_words=["hello"]) == {
49
+ "world": 1,
50
+ }
51
+
52
+
53
+ def test_word_frequency_min_length():
54
+ assert word_frequency("I love Python", min_length=2) == {
55
+ "love": 1,
56
+ "python": 1,
57
+ }
58
+
59
+
60
+ def test_word_frequency_top_n():
61
+ assert word_frequency("cat dog cat bird cat dog", top_n=2) == {
62
+ "cat": 3,
63
+ "dog": 2,
64
+ }
65
+
66
+
67
+ def test_word_frequency_top_n_zero():
68
+ assert word_frequency("cat dog cat bird cat dog", top_n=0) == {}
69
+
70
+
71
+ def test_word_frequency_invalid_text():
72
+ with pytest.raises(TypeError):
73
+ word_frequency(123)
74
+
75
+
76
+ def test_word_frequency_negative_min_length():
77
+ with pytest.raises(ValueError):
78
+ word_frequency("hello world", min_length=-1)
79
+
80
+
81
+ def test_word_frequency_apostrophe():
82
+ assert word_frequency("don't don't") == {"don't": 2}
83
+
84
+
85
+ def test_word_frequency_tied_frequencies():
86
+ assert list(word_frequency("dog cat dog cat")) == ["dog", "cat"]
87
+
88
+
89
+ def test_word_frequency_ignore_words_case():
90
+ assert word_frequency(
91
+ "Hello hello world",
92
+ ignore_words=["HELLO"],
93
+ ) == {"world": 1}
94
+
95
+
96
+ def test_word_frequency_only_punctuation():
97
+ assert word_frequency("!!! ??? ...") == {}
@@ -0,0 +1,5 @@
1
+ """Utilities for text transformations."""
2
+
3
+ from ._reverse import reverse
4
+
5
+ __all__ = ["reverse"]
@@ -0,0 +1,15 @@
1
+ def reverse(text):
2
+ """
3
+ Reverse the characters in a text.
4
+
5
+ Parameters
6
+ ----------
7
+ text : str
8
+ The text to reverse.
9
+
10
+ Returns
11
+ -------
12
+ str
13
+ The reversed text.
14
+ """
15
+ return text[::-1]
@@ -0,0 +1,25 @@
1
+ from textutils.transform._reverse import reverse
2
+
3
+
4
+ def test_reverse_normal():
5
+ assert reverse("bonjour") == "ruojnob"
6
+
7
+
8
+ def test_reverse_empty():
9
+ assert reverse("") == ""
10
+
11
+
12
+ def test_reverse_single_character():
13
+ assert reverse("a") == "a"
14
+
15
+
16
+ def test_reverse_with_spaces():
17
+ assert reverse("hello world") == "dlrow olleh"
18
+
19
+
20
+ def test_reverse_unicode():
21
+ assert reverse("été") == "été"
22
+
23
+
24
+ def test_reverse_numbers():
25
+ assert reverse("12345") == "54321"
@@ -0,0 +1,121 @@
1
+ Metadata-Version: 2.4
2
+ Name: textutils-kit
3
+ Version: 0.0.1
4
+ Summary: A Python library providing utilities for text manipulation and analysis.
5
+ Requires-Python: >=3.11
6
+ Description-Content-Type: text/markdown
7
+ License-File: LICENSE
8
+ Provides-Extra: dev
9
+ Requires-Dist: pytest<10,>=9; extra == "dev"
10
+ Requires-Dist: pytest-cov<8,>=7; extra == "dev"
11
+ Requires-Dist: black<26,>=25; extra == "dev"
12
+ Requires-Dist: ruff<0.18,>=0.17; extra == "dev"
13
+ Dynamic: license-file
14
+
15
+ # textutils
16
+
17
+ An open-source Python library providing simple utilities for common text-processing operations.
18
+
19
+ ## Features
20
+
21
+ - `word_count(text)`: Count the number of words in a text.
22
+ - `character_count(text, include_spaces=True)`: Count the number of characters in a text, with the option to include or exclude spaces.
23
+ - `reverse(text)`: Reverse the characters in a text.
24
+ - `capitalize_words(text)`: Capitalize the first letter of each word in a text.
25
+ - `snake_case(text)`: Convert a text to snake case.
26
+ - `word_frequency(text, case_sensitive=False, ignore_words=None, min_length=1, top_n=None)`: Count how often each word appears in a text, ordered by frequency.
27
+
28
+ ## Requirements
29
+
30
+ - Python 3.12 or later.
31
+
32
+ ## Installation
33
+
34
+ Clone the repository and install the package:
35
+
36
+ ```bash
37
+ git clone https://github.com/Emilie-Th/textutils.git
38
+ cd textutils
39
+ python -m pip install .
40
+ ```
41
+
42
+ To install the package with the development dependencies:
43
+
44
+ ```bash
45
+ python -m pip install -e ".[dev]"
46
+ ```
47
+
48
+ ## Usage
49
+
50
+ ```python
51
+ from textutils import (
52
+ word_count,
53
+ character_count,
54
+ reverse,
55
+ capitalize_words,
56
+ snake_case,
57
+ word_frequency,
58
+ )
59
+
60
+ print(word_count("Hello Open Source!"))
61
+ print(character_count("Hello Open Source!", include_spaces=False))
62
+ print(reverse("Hello Open Source!"))
63
+ print(capitalize_words("hello open source!"))
64
+ print(snake_case("Hello Open Source!"))
65
+ print(word_frequency("Python is great. Python is simple."))
66
+ ```
67
+
68
+ ## Testing
69
+
70
+ The project uses **pytest** for automated testing and **pytest-cov** to measure test coverage.
71
+
72
+ Run the complete test suite:
73
+
74
+ ```bash
75
+ python -m pytest -q
76
+ ```
77
+
78
+ Run the tests with a coverage report:
79
+
80
+ ```bash
81
+ python -m pytest -q --cov=textutils --cov-report=term-missing
82
+ ```
83
+
84
+ ## Code Quality
85
+
86
+ The project uses **Black** for consistent code formatting and **Ruff** for linting and static code analysis.
87
+
88
+ Check formatting with Black:
89
+
90
+ ```bash
91
+ python -m black --check .
92
+ ```
93
+
94
+ Format the code automatically:
95
+
96
+ ```bash
97
+ python -m black .
98
+ ```
99
+
100
+ Check code quality with Ruff:
101
+
102
+ ```bash
103
+ python -m ruff check .
104
+ ```
105
+
106
+ These checks should pass before submitting a pull request.
107
+
108
+ ## Contributing
109
+
110
+ Contributions are welcome!
111
+
112
+ Before submitting a pull request, please:
113
+
114
+ 1. Add or update tests for any changes.
115
+ 2. Ensure all tests pass.
116
+ 3. Check the code with Black and Ruff.
117
+ 4. Follow the existing package structure and document public functions using NumPy-style docstrings.
118
+
119
+ ## License
120
+
121
+ This project is licensed under the MIT License.
@@ -0,0 +1,24 @@
1
+ textutils/__init__.py,sha256=hYsSNiDdm3ctUhZjGC4xHOfhHjL8Zqkh0j1KlZDQ84Q,476
2
+ textutils/casing/__init__.py,sha256=XSCtxlPi-fYECel0jBlpusjAIYn9vZbHPDMxEPepGKA,237
3
+ textutils/casing/_camel_case.py,sha256=A3Z7MzZaKgV4Afo260GtXAuGZ_teh0ooV-eQG8Lzj5Y,378
4
+ textutils/casing/_capitalize_words.py,sha256=xwhLFhLym7QH450w7UL5gJeZon63X2Pv6S90UxWcJsU,466
5
+ textutils/casing/_snake_case.py,sha256=pZxbEUzafcZPO-5MDlZ94kqHWat-w8wSLysam9ysDDs,278
6
+ textutils/casing/tests/test_camel_case.py,sha256=fD9GsRrbkzradli4OF7FggzLbi5TtDAZt9T0mMnFPoA,656
7
+ textutils/casing/tests/test_capitalize_words.py,sha256=ArvX_yB6ISgxzX-IendnTLkvHRaG1Usm-wC7oHti46M,931
8
+ textutils/casing/tests/test_snake_case.py,sha256=QZOneAo6LZy8yzxuFeVUV0nNmH9BjvFGBl8aO0ukR7Y,760
9
+ textutils/counting/__init__.py,sha256=qpjKo2UWyfcLwc2HfhukGoi1N0N8V42IA97lf77xB2s,179
10
+ textutils/counting/_character_count.py,sha256=DWUv0D8w6JZcx-NzzZQIPzCcaXTBLfwJ2nvTc0vB4fw,573
11
+ textutils/counting/_word_count.py,sha256=PWWH4Vrx2pG2ZSRlHkyt4sZ7YjzFkhijnC6ohAubP7Q,292
12
+ textutils/counting/tests/test_character_count.py,sha256=YGGpOfxPn4mRqawcSU42uEz39QeZgZjhY-ZOYe4al3k,1486
13
+ textutils/counting/tests/test_word_count.py,sha256=HWn8xR7RGYmUv3IlWgHUOo1UCUCp7FsgnhuuX5W2B4g,568
14
+ textutils/frequency/__init__.py,sha256=ptxHVvDt85NNfOrAbXmWvR_dLetjJwyTebufF7MgpXA,123
15
+ textutils/frequency/_word_frequency.py,sha256=zR3bnNJkUhkK_pVAEusKUbOFDOkIkOS6CQjvKBmzAe0,4390
16
+ textutils/frequency/tests/test_word_frequency.py,sha256=nJgUUhiTLDmeh-JUanBmPw-4As0CaGlLWn0hLJDb7pI,2142
17
+ textutils/transform/__init__.py,sha256=Y6GVMMUyA3bIpXObWyO--D11rBLFrdLZ4Lz333N4Ra0,96
18
+ textutils/transform/_reverse.py,sha256=7RhIm1NKQq0dQQD4h7HsV8K-DnGBtFb-1lz9QVyGvKQ,230
19
+ textutils/transform/tests/test_reverse.py,sha256=YO-nmPnfUqsXpTS7J6sOLbKYLxCHioAJLPJbDdQ9Xog,471
20
+ textutils_kit-0.0.1.dist-info/licenses/LICENSE,sha256=IYraf---0PfR3P3G-WPwtHLYBrncvUQOupLhY1JGPYw,1066
21
+ textutils_kit-0.0.1.dist-info/METADATA,sha256=ix6SZEo6uXTRvENJMxcReRbHvZnbsucwNnNF2EiaNT0,2909
22
+ textutils_kit-0.0.1.dist-info/WHEEL,sha256=mOdXR9C3wMVov7cSY8PY-XCzo3SmmWCHvGQr5csJoao,91
23
+ textutils_kit-0.0.1.dist-info/top_level.txt,sha256=amWgGsYwaWzVol7zPaWIjxj2Of6hEptj7rE9MR3bp_E,10
24
+ textutils_kit-0.0.1.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.2.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Emilie-Th
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.
@@ -0,0 +1 @@
1
+ textutils