kececinumbers 0.4.7__tar.gz → 0.4.8__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kececinumbers
3
- Version: 0.4.7
3
+ Version: 0.4.8
4
4
  Summary: Keçeci Numbers: An Exploration of a Dynamic Sequence Across Diverse Number Sets
5
5
  Home-page: https://github.com/WhiteSymmetry/kececinumbers
6
6
  Author: Mehmet Keçeci
@@ -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
@@ -21,7 +21,7 @@ import warnings
21
21
  # importlib.reload(kececinumbers) # F821 undefined name 'kececinumbers'
22
22
 
23
23
  # Paket sürüm numarası
24
- __version__ = "0.4.6"
24
+ __version__ = "0.4.7"
25
25
  __author__ = "Mehmet Keçeci"
26
26
  __email__ = "mkececi@yaani.com"
27
27
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kececinumbers
3
- Version: 0.4.7
3
+ Version: 0.4.8
4
4
  Summary: Keçeci Numbers: An Exploration of a Dynamic Sequence Across Diverse Number Sets
5
5
  Home-page: https://github.com/WhiteSymmetry/kececinumbers
6
6
  Author: Mehmet Keçeci
@@ -4,6 +4,7 @@ README.md
4
4
  pyproject.toml
5
5
  setup.cfg
6
6
  setup.py
7
+ docs/conf.py
7
8
  kececinumbers/__init__.py
8
9
  kececinumbers/_version.py
9
10
  kececinumbers/kececinumbers.py
@@ -0,0 +1,6 @@
1
+ dist
2
+ docs
3
+ examples
4
+ kececinumbers
5
+ recipe
6
+ tests
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
6
6
 
7
7
  [project]
8
8
  name = "kececinumbers"
9
- version = "0.4.7"
9
+ version = "0.4.8"
10
10
 
11
11
  # Diğer proje bilgileri (isteğe bağlı ama tavsiye edilir)
12
12
  authors = [
@@ -44,6 +44,9 @@ test = [
44
44
  "sympy",
45
45
  ]
46
46
 
47
+ [tool.setuptools.packages.find]
48
+ where = ["."]
49
+
47
50
  [project.urls]
48
51
  "Homepage" = "https://github.com/WhiteSymmetry/kececinumbers"
49
52
  "Bug Tracker" = "https://github.com/WhiteSymmetry/kececinumbers/issues"
@@ -11,6 +11,9 @@ import sys
11
11
  with open("README.md", "r", encoding="utf-8") as fh:
12
12
  long_description = fh.read()
13
13
 
14
+ with open("kececinumbers/kececinumbers.py", "r", encoding="utf-8") as f:
15
+ long_description = f.read()
16
+
14
17
  sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
15
18
 
16
19
 
@@ -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 +0,0 @@
1
- kececinumbers
@@ -1,2 +0,0 @@
1
- def test_placeholder():
2
- assert True
File without changes
File without changes
File without changes
File without changes