kececinumbers 0.4.6__py3-none-any.whl → 0.4.8__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.
- docs/conf.py +34 -0
- kececinumbers/__init__.py +1 -1
- kececinumbers/_version.py +1 -1
- {kececinumbers-0.4.6.dist-info → kececinumbers-0.4.8.dist-info}/METADATA +1 -1
- kececinumbers-0.4.8.dist-info/RECORD +10 -0
- {kececinumbers-0.4.6.dist-info → kececinumbers-0.4.8.dist-info}/top_level.txt +2 -0
- tests/test_sample.py +283 -0
- kececinumbers-0.4.6.dist-info/RECORD +0 -8
- {kececinumbers-0.4.6.dist-info → kececinumbers-0.4.8.dist-info}/WHEEL +0 -0
- {kececinumbers-0.4.6.dist-info → kececinumbers-0.4.8.dist-info}/licenses/LICENSE +0 -0
docs/conf.py
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# Project Information
|
2
|
+
project = 'kececinumbers'
|
3
|
+
author = 'Mehmet Keçeci'
|
4
|
+
copyright = '2025, Mehmet Keçeci'
|
5
|
+
|
6
|
+
# Version Management
|
7
|
+
# from setuptools_scm import get_version
|
8
|
+
# version = get_version(root='..', relative_to=__file__)
|
9
|
+
# Sürüm Bilgisi (setuptools_scm kullanmıyorsanız sabit olarak tanımlayın)
|
10
|
+
# Gerçek sürümü modülden al (eğer mümkünse)
|
11
|
+
try:
|
12
|
+
from kececinumbers import __version__
|
13
|
+
version = __version__
|
14
|
+
release = __version__
|
15
|
+
except (ImportError, AttributeError) as e:
|
16
|
+
print(f"Warning: Could not import __version__ from kececinumbers: {e}")
|
17
|
+
# Varsayılan değerler korunur
|
18
|
+
#version = '0.4.1' # Replace with your actual version number
|
19
|
+
#release = version
|
20
|
+
|
21
|
+
# General Configuration
|
22
|
+
master_doc = 'index'
|
23
|
+
extensions = [
|
24
|
+
'sphinx.ext.autodoc',
|
25
|
+
'sphinx.ext.viewcode',
|
26
|
+
'sphinx.ext.napoleon'
|
27
|
+
]
|
28
|
+
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
|
29
|
+
|
30
|
+
# HTML Output Configuration
|
31
|
+
html_theme = 'sphinx_rtd_theme'
|
32
|
+
html_static_path = ['_static']
|
33
|
+
html_logo = '_static/logo.png' # Optional: Add your project logo
|
34
|
+
html_favicon = '_static/favicon.ico' # Optional: Add a favicon
|
kececinumbers/__init__.py
CHANGED
kececinumbers/_version.py
CHANGED
@@ -0,0 +1,10 @@
|
|
1
|
+
docs/conf.py,sha256=jkpH_TchRJcC_EspKeY1E_rml2ODmIWhWoqvyCPu_ok,1116
|
2
|
+
kececinumbers/__init__.py,sha256=3mNmzH49xwaTUgjBcpoXJMOUu5uDQ3Xj5joZGnQv5x0,3596
|
3
|
+
kececinumbers/_version.py,sha256=gyZSHokRzoMk1k4yXFFf4b-WOBMwEhsnSLYzs4B5h9I,429
|
4
|
+
kececinumbers/kececinumbers.py,sha256=nlK65PcoiCJ32xbnwLpNFesfTiaksUyodqc2bj7lcSk,39705
|
5
|
+
kececinumbers-0.4.8.dist-info/licenses/LICENSE,sha256=NJZsJEbQuKzxn1mWPWCbRx8jRUqGS22thl8wwuRQJ9c,1071
|
6
|
+
tests/test_sample.py,sha256=qMWUBGQtlF1gZHZ_e6Gye1vHtyNnUWH7iXK72a1y6VQ,9728
|
7
|
+
kececinumbers-0.4.8.dist-info/METADATA,sha256=Plc8CqRMdD3YZXOvfv8VERn2JRULVM5Kcscz6SRKQBk,32997
|
8
|
+
kececinumbers-0.4.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
9
|
+
kececinumbers-0.4.8.dist-info/top_level.txt,sha256=ABQEKRH9iYb4sWnFdx7gIx7Hg899YktRkQpbRlSSqwU,25
|
10
|
+
kececinumbers-0.4.8.dist-info/RECORD,,
|
tests/test_sample.py
ADDED
@@ -0,0 +1,283 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# test_sample.py
|
3
|
+
"""
|
4
|
+
Comprehensive unit tests for the kececinumbers module.
|
5
|
+
Tests core functionality, number type generation, and mathematical properties.
|
6
|
+
"""
|
7
|
+
|
8
|
+
import unittest
|
9
|
+
import numpy as np
|
10
|
+
import quaternion
|
11
|
+
from kececinumbers import (
|
12
|
+
# Constants
|
13
|
+
TYPE_POSITIVE_REAL,
|
14
|
+
TYPE_NEGATIVE_REAL,
|
15
|
+
TYPE_COMPLEX,
|
16
|
+
TYPE_FLOAT,
|
17
|
+
TYPE_RATIONAL,
|
18
|
+
TYPE_QUATERNION,
|
19
|
+
TYPE_NEUTROSOPHIC,
|
20
|
+
TYPE_NEUTROSOPHIC_COMPLEX,
|
21
|
+
TYPE_HYPERREAL,
|
22
|
+
TYPE_BICOMPLEX,
|
23
|
+
TYPE_NEUTROSOPHIC_BICOMPLEX,
|
24
|
+
|
25
|
+
# Core generator
|
26
|
+
unified_generator,
|
27
|
+
|
28
|
+
# Helper functions
|
29
|
+
is_prime,
|
30
|
+
_get_integer_representation,
|
31
|
+
find_kececi_prime_number,
|
32
|
+
|
33
|
+
# Custom classes
|
34
|
+
NeutrosophicNumber,
|
35
|
+
NeutrosophicComplexNumber,
|
36
|
+
HyperrealNumber,
|
37
|
+
BicomplexNumber,
|
38
|
+
NeutrosophicBicomplexNumber,
|
39
|
+
)
|
40
|
+
|
41
|
+
|
42
|
+
class TestKececiNumbers(unittest.TestCase):
|
43
|
+
|
44
|
+
def setUp(self):
|
45
|
+
"""Run before each test."""
|
46
|
+
self.iterations = 10
|
47
|
+
|
48
|
+
def test_positive_real_generation(self):
|
49
|
+
"""Test sequence generation for positive real numbers."""
|
50
|
+
seq = unified_generator(
|
51
|
+
kececi_type=TYPE_POSITIVE_REAL,
|
52
|
+
start_input_raw="5",
|
53
|
+
add_input_base_scalar=3.0,
|
54
|
+
iterations=self.iterations
|
55
|
+
)
|
56
|
+
self.assertTrue(len(seq) > 0)
|
57
|
+
self.assertIsInstance(seq[0], int)
|
58
|
+
self.assertGreaterEqual(seq[0], 0)
|
59
|
+
|
60
|
+
def test_negative_real_generation(self):
|
61
|
+
"""Test sequence generation for negative real numbers."""
|
62
|
+
seq = unified_generator(
|
63
|
+
kececi_type=TYPE_NEGATIVE_REAL,
|
64
|
+
start_input_raw="-7",
|
65
|
+
add_input_base_scalar=2.0,
|
66
|
+
iterations=self.iterations
|
67
|
+
)
|
68
|
+
self.assertTrue(len(seq) > 0)
|
69
|
+
self.assertIsInstance(seq[0], int)
|
70
|
+
self.assertLessEqual(seq[0], 0)
|
71
|
+
|
72
|
+
def test_float_generation(self):
|
73
|
+
"""Test sequence generation for float numbers."""
|
74
|
+
seq = unified_generator(
|
75
|
+
kececi_type=TYPE_FLOAT,
|
76
|
+
start_input_raw="3.14",
|
77
|
+
add_input_base_scalar=1.5,
|
78
|
+
iterations=self.iterations
|
79
|
+
)
|
80
|
+
self.assertTrue(len(seq) > 0)
|
81
|
+
self.assertIsInstance(seq[0], float)
|
82
|
+
|
83
|
+
def test_complex_generation(self):
|
84
|
+
"""Test sequence generation for complex numbers."""
|
85
|
+
seq = unified_generator(
|
86
|
+
kececi_type=TYPE_COMPLEX,
|
87
|
+
start_input_raw="2+3j",
|
88
|
+
add_input_base_scalar=1.0,
|
89
|
+
iterations=self.iterations
|
90
|
+
)
|
91
|
+
self.assertTrue(len(seq) > 0)
|
92
|
+
self.assertIsInstance(seq[0], complex)
|
93
|
+
self.assertEqual(seq[0].real, 2.0)
|
94
|
+
self.assertEqual(seq[0].imag, 3.0)
|
95
|
+
|
96
|
+
def test_rational_generation(self):
|
97
|
+
"""Test sequence generation for rational numbers."""
|
98
|
+
seq = unified_generator(
|
99
|
+
kececi_type=TYPE_RATIONAL,
|
100
|
+
start_input_raw="7/3",
|
101
|
+
add_input_base_scalar=2.0,
|
102
|
+
iterations=self.iterations
|
103
|
+
)
|
104
|
+
self.assertTrue(len(seq) > 0)
|
105
|
+
from fractions import Fraction
|
106
|
+
self.assertIsInstance(seq[0], Fraction)
|
107
|
+
self.assertEqual(str(seq[0]), "7/3")
|
108
|
+
|
109
|
+
def test_quaternion_generation(self):
|
110
|
+
"""Test sequence generation for quaternions."""
|
111
|
+
seq = unified_generator(
|
112
|
+
kececi_type=TYPE_QUATERNION,
|
113
|
+
start_input_raw="1+2i-3j+k",
|
114
|
+
add_input_base_scalar=1.0,
|
115
|
+
iterations=self.iterations
|
116
|
+
)
|
117
|
+
self.assertTrue(len(seq) > 0)
|
118
|
+
self.assertIsInstance(seq[0], np.quaternion)
|
119
|
+
# Check if parsing worked
|
120
|
+
q = seq[0]
|
121
|
+
self.assertAlmostEqual(q.w, 1.0)
|
122
|
+
self.assertAlmostEqual(q.x, 2.0)
|
123
|
+
self.assertAlmostEqual(q.y, -3.0)
|
124
|
+
self.assertAlmostEqual(q.z, 1.0)
|
125
|
+
|
126
|
+
def test_neutrosophic_generation(self):
|
127
|
+
"""Test sequence generation for neutrosophic numbers."""
|
128
|
+
seq = unified_generator(
|
129
|
+
kececi_type=TYPE_NEUTROSOPHIC,
|
130
|
+
start_input_raw="5+2I",
|
131
|
+
add_input_base_scalar=1.0,
|
132
|
+
iterations=self.iterations
|
133
|
+
)
|
134
|
+
self.assertTrue(len(seq) > 0)
|
135
|
+
self.assertIsInstance(seq[0], NeutrosophicNumber)
|
136
|
+
self.assertEqual(seq[0].a, 5.0)
|
137
|
+
self.assertEqual(seq[0].b, 2.0)
|
138
|
+
|
139
|
+
def test_neutrosophic_complex_generation(self):
|
140
|
+
"""Test sequence generation for neutrosophic complex numbers."""
|
141
|
+
seq = unified_generator(
|
142
|
+
kececi_type=TYPE_NEUTROSOPHIC_COMPLEX,
|
143
|
+
start_input_raw="1-2j",
|
144
|
+
add_input_base_scalar=1.0,
|
145
|
+
iterations=self.iterations
|
146
|
+
)
|
147
|
+
self.assertTrue(len(seq) > 0)
|
148
|
+
self.assertIsInstance(seq[0], NeutrosophicComplexNumber)
|
149
|
+
self.assertAlmostEqual(seq[0].real, 1.0)
|
150
|
+
self.assertAlmostEqual(seq[0].imag, -2.0)
|
151
|
+
self.assertAlmostEqual(seq[0].indeterminacy, 0.0)
|
152
|
+
|
153
|
+
def test_hyperreal_generation(self):
|
154
|
+
"""Test sequence generation for hyperreal numbers."""
|
155
|
+
seq = unified_generator(
|
156
|
+
kececi_type=TYPE_HYPERREAL,
|
157
|
+
start_input_raw="5+3e",
|
158
|
+
add_input_base_scalar=1.0,
|
159
|
+
iterations=self.iterations
|
160
|
+
)
|
161
|
+
self.assertTrue(len(seq) > 0)
|
162
|
+
self.assertIsInstance(seq[0], HyperrealNumber)
|
163
|
+
self.assertGreater(len(seq[0].sequence), 0)
|
164
|
+
|
165
|
+
def test_bicomplex_generation(self):
|
166
|
+
"""Test sequence generation for bicomplex numbers."""
|
167
|
+
seq = unified_generator(
|
168
|
+
kececi_type=TYPE_BICOMPLEX,
|
169
|
+
start_input_raw="2+1j",
|
170
|
+
add_input_base_scalar=1.0,
|
171
|
+
iterations=self.iterations
|
172
|
+
)
|
173
|
+
self.assertTrue(len(seq) > 0)
|
174
|
+
self.assertIsInstance(seq[0], BicomplexNumber)
|
175
|
+
z1, z2 = seq[0].z1, seq[0].z2
|
176
|
+
self.assertIsInstance(z1, complex)
|
177
|
+
self.assertIsInstance(z2, complex)
|
178
|
+
|
179
|
+
def test_neutrosophic_bicomplex_generation(self):
|
180
|
+
"""Test sequence generation for neutrosophic bicomplex numbers."""
|
181
|
+
seq = unified_generator(
|
182
|
+
kececi_type=TYPE_NEUTROSOPHIC_BICOMPLEX,
|
183
|
+
start_input_raw="1+2j",
|
184
|
+
add_input_base_scalar=1.0,
|
185
|
+
iterations=self.iterations
|
186
|
+
)
|
187
|
+
self.assertTrue(len(seq) > 0)
|
188
|
+
self.assertIsInstance(seq[0], NeutrosophicBicomplexNumber)
|
189
|
+
|
190
|
+
def test_get_integer_representation(self):
|
191
|
+
"""Test _get_integer_representation for various types."""
|
192
|
+
self.assertEqual(_get_integer_representation(42), 42)
|
193
|
+
self.assertEqual(_get_integer_representation(-15), 15)
|
194
|
+
self.assertEqual(_get_integer_representation(3.14), 3)
|
195
|
+
self.assertEqual(_get_integer_representation(complex(5, 3)), 5)
|
196
|
+
self.assertEqual(_get_integer_representation(np.quaternion(7, 1, 2, 3)), 7)
|
197
|
+
self.assertEqual(_get_integer_representation(NeutrosophicNumber(9.5, 2.1)), 9)
|
198
|
+
self.assertEqual(_get_integer_representation(HyperrealNumber([10.1, 11.2])), 10)
|
199
|
+
self.assertEqual(_get_integer_representation(None), None)
|
200
|
+
|
201
|
+
def test_is_prime_with_supported_types(self):
|
202
|
+
"""Test is_prime function with various number types."""
|
203
|
+
# Prime numbers
|
204
|
+
self.assertTrue(is_prime(2))
|
205
|
+
self.assertTrue(is_prime(3))
|
206
|
+
self.assertTrue(is_prime(5))
|
207
|
+
self.assertTrue(is_prime(7))
|
208
|
+
|
209
|
+
# Non-prime
|
210
|
+
self.assertFalse(is_prime(1))
|
211
|
+
self.assertFalse(is_prime(4))
|
212
|
+
self.assertFalse(is_prime(6))
|
213
|
+
|
214
|
+
# Complex: uses real part
|
215
|
+
self.assertTrue(is_prime(complex(3, 4))) # 3 is prime
|
216
|
+
self.assertFalse(is_prime(complex(4, 5))) # 4 is not prime
|
217
|
+
|
218
|
+
# Quaternion: uses scalar part
|
219
|
+
q = np.quaternion(5, 1, 2, 3)
|
220
|
+
self.assertTrue(is_prime(q)) # 5 is prime
|
221
|
+
|
222
|
+
# Neutrosophic: uses 'a' component
|
223
|
+
n = NeutrosophicNumber(7.0, 1.0)
|
224
|
+
self.assertTrue(is_prime(n)) # 7 is prime
|
225
|
+
|
226
|
+
# Invalid input
|
227
|
+
self.assertFalse(is_prime("invalid"))
|
228
|
+
self.assertFalse(is_prime(None))
|
229
|
+
|
230
|
+
def test_find_kececi_prime_number(self):
|
231
|
+
"""Test if a repeating prime is correctly identified."""
|
232
|
+
# Simulate a sequence where 3 appears multiple times
|
233
|
+
mock_sequence = [
|
234
|
+
2, 3, 4, 5, 3, 6, 3 # 3 repeats
|
235
|
+
]
|
236
|
+
kpn = find_kececi_prime_number(mock_sequence)
|
237
|
+
self.assertEqual(kpn, 3)
|
238
|
+
|
239
|
+
# No prime repeats
|
240
|
+
mock_sequence2 = [2, 3, 5, 7] # all prime but no repeat
|
241
|
+
kpn2 = find_kececi_prime_number(mock_sequence2)
|
242
|
+
self.assertIsNone(kpn2)
|
243
|
+
|
244
|
+
# Empty sequence
|
245
|
+
self.assertIsNone(find_kececi_prime_number([]))
|
246
|
+
|
247
|
+
def test_divisibility_and_logic_flow(self):
|
248
|
+
"""Basic check that generator does not crash and produces expected types."""
|
249
|
+
seq = unified_generator(
|
250
|
+
kececi_type=TYPE_POSITIVE_REAL,
|
251
|
+
start_input_raw="10",
|
252
|
+
add_input_base_scalar=2.0,
|
253
|
+
iterations=5
|
254
|
+
)
|
255
|
+
self.assertGreater(len(seq), 5)
|
256
|
+
# Should include integers, possibly divided by 2 or 3
|
257
|
+
for item in seq:
|
258
|
+
self.assertIsInstance(item, int)
|
259
|
+
|
260
|
+
def test_edge_case_empty_start(self):
|
261
|
+
"""Test handling of invalid or empty input."""
|
262
|
+
seq = unified_generator(
|
263
|
+
kececi_type=TYPE_FLOAT,
|
264
|
+
start_input_raw="", # empty
|
265
|
+
add_input_base_scalar=1.0,
|
266
|
+
iterations=1
|
267
|
+
)
|
268
|
+
self.assertEqual(len(seq), 0) # should fail gracefully
|
269
|
+
|
270
|
+
def test_unsupported_type(self):
|
271
|
+
"""Test that unsupported type raises ValueError."""
|
272
|
+
with self.assertRaises(ValueError):
|
273
|
+
unified_generator(
|
274
|
+
kececi_type=99, # invalid
|
275
|
+
start_input_raw="0",
|
276
|
+
add_input_base_scalar=1.0,
|
277
|
+
iterations=1
|
278
|
+
)
|
279
|
+
|
280
|
+
|
281
|
+
if __name__ == '__main__':
|
282
|
+
unittest.main()
|
283
|
+
|
@@ -1,8 +0,0 @@
|
|
1
|
-
kececinumbers/__init__.py,sha256=-tFCu7U8ZtvdRKlNEbWYvbaj4iESqnZIiHuOv8_SJnk,3596
|
2
|
-
kececinumbers/_version.py,sha256=UqBf2qxJKmEp9RFNVJUqugyd4v60MzcUIwqPKkbyMGM,429
|
3
|
-
kececinumbers/kececinumbers.py,sha256=nlK65PcoiCJ32xbnwLpNFesfTiaksUyodqc2bj7lcSk,39705
|
4
|
-
kececinumbers-0.4.6.dist-info/licenses/LICENSE,sha256=NJZsJEbQuKzxn1mWPWCbRx8jRUqGS22thl8wwuRQJ9c,1071
|
5
|
-
kececinumbers-0.4.6.dist-info/METADATA,sha256=23wNwUizAHbhwqDNEyr8rLSjunENsEbu2GLj9D9EMlo,32997
|
6
|
-
kececinumbers-0.4.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
7
|
-
kececinumbers-0.4.6.dist-info/top_level.txt,sha256=VvlbQKmTjOlzBbvq54-AaXp_WPRZ5dOhw91lV-ytPRQ,14
|
8
|
-
kececinumbers-0.4.6.dist-info/RECORD,,
|
File without changes
|
File without changes
|