dtools.datastructures 0.25.0__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (21) hide show
  1. dtools_datastructures-0.25.0/CHANGELOG.md +606 -0
  2. dtools_datastructures-0.25.0/LICENSE +190 -0
  3. dtools_datastructures-0.25.0/PKG-INFO +65 -0
  4. dtools_datastructures-0.25.0/README.md +41 -0
  5. dtools_datastructures-0.25.0/pyproject.toml +71 -0
  6. dtools_datastructures-0.25.0/pytest.ini +4 -0
  7. dtools_datastructures-0.25.0/src/dtools/datastructures/__init__.py +31 -0
  8. dtools_datastructures-0.25.0/src/dtools/datastructures/nodes.py +189 -0
  9. dtools_datastructures-0.25.0/src/dtools/datastructures/py.typed +0 -0
  10. dtools_datastructures-0.25.0/src/dtools/datastructures/queues.py +420 -0
  11. dtools_datastructures-0.25.0/src/dtools/datastructures/splitends/__init__.py +27 -0
  12. dtools_datastructures-0.25.0/src/dtools/datastructures/splitends/py.typed +0 -0
  13. dtools_datastructures-0.25.0/src/dtools/datastructures/splitends/se.py +179 -0
  14. dtools_datastructures-0.25.0/src/dtools/datastructures/tuples.py +203 -0
  15. dtools_datastructures-0.25.0/tests/grscheller/datastructures/splitends/test_se.py +253 -0
  16. dtools_datastructures-0.25.0/tests/grscheller/datastructures/test_ftuple.py +161 -0
  17. dtools_datastructures-0.25.0/tests/grscheller/datastructures/test_functional.py +127 -0
  18. dtools_datastructures-0.25.0/tests/grscheller/datastructures/test_node.py +63 -0
  19. dtools_datastructures-0.25.0/tests/grscheller/datastructures/test_queue.py +500 -0
  20. dtools_datastructures-0.25.0/tests/grscheller/datastructures/test_repr.py +234 -0
  21. dtools_datastructures-0.25.0/tests/grscheller/datastructures/test_str.py +110 -0
@@ -0,0 +1,606 @@
1
+ # CHANGELOG
2
+
3
+ PyPI grscheller.datastructures project.
4
+
5
+ #### Semantic versioning
6
+
7
+ * first digit - major event, epoch, or paradigm shift
8
+ * second digit - breaking API changes, major changes
9
+ * third digit - bug fixes, API additions, breaking API in dev env
10
+ * forth digit - commit count changes/regressions (dev environment only)
11
+
12
+ ## Releases and other important milestones
13
+
14
+ ### Version 0.24.0 - PyPI release date 2024-11-18
15
+
16
+ * Changed flatMap to bind thru out project
17
+
18
+ ### Version 0.23.1 - PyPI release date 2024-11-18
19
+
20
+ * Fixed bug with datastructures.tuple module
21
+ * forgot to import std lib typing.cast into tuples.py
22
+
23
+ ### Version 0.23.0 - PyPI release date 2024-11-18
24
+
25
+ * publishing previous change and grscheller consistency changes
26
+ * suspect SplitEnd class needs more work, not just clean up
27
+ * not prepared to wrap my brain around it right now
28
+ * don't want to delay PyPI releases for other repos
29
+ * once splitends under control, will consider a 1.0.0 release
30
+
31
+ ### Version 0.22.3.0 - Preparing for a 0.23.0 PyPI release
32
+
33
+ * renamed class FTuple -> ftuple
34
+ * ftuple now takes 0 or 1 iterables, like list and tuple do
35
+ * created factory function for original constructor use case
36
+ * FT[D](*ds: D) -> ftuple[D]
37
+
38
+ ### Version 0.22.1 - PyPI release date 2024-10-20
39
+
40
+ * removed docs from repo
41
+ * docs for all grscheller namespace projects maintained here
42
+ * https://grscheller.github.io/grscheller-pypi-namespace-docs/
43
+
44
+ ### Version 0.22.0 - PyPI release date 2024-10-18
45
+
46
+ * Major refactoring of SplitEnd class
47
+ * splitends is now a subpackage containing the se module
48
+ * removed supporting classes
49
+ * can now be empty
50
+ * grscheller.datastructures no longer uses nada as a sentinel value
51
+ * replaced with grscheller.fp.nothingness.noValue
52
+ * made classes in nodes module less passive with better encapsulation
53
+ * compatible with:
54
+ * grscheller.fp >= 1.0.0 < 1.01
55
+ * grscheller.circular-array >= 3.6.1 < 3.7
56
+
57
+ ### Version 0.21.1.1 - BROKEN as of 2024-10-03
58
+
59
+ * Does not work with either
60
+ * grscheller.fp 0.3.3 (version working for 0.21.0 release)
61
+ * grscheller.fp 0.4.0 (latest version of fp)
62
+ * Needs an upgrade
63
+ * TODO: replace Nada with MB as was done for grscheller.fp.iterables
64
+
65
+ ### Version 0.21.1.0 - mostly docstring updates 2024-09-17
66
+
67
+ * renamed module `split_ends` -> `stacks`
68
+
69
+ ### Version 0.21.0 - PyPI release date 2024-08-20
70
+
71
+ * got back to a state maintainer is happy with
72
+ * many dependencies needed updating first
73
+
74
+ ### Version 0.20.5.1 - datastructures coming back together 2024-08-19
75
+
76
+ * works with all the current versions of fp and circular-array
77
+ * preparing for PyPI 0.21.0 release
78
+
79
+ ### Version 0.20.5.0 - datastructures coming back together 2024-08-17
80
+
81
+ * updated to use grscheller.fp.nada instead of grscheller.untyped.nothing
82
+ * made debugging tons easier
83
+ * updated to use all latest PyPI versions of dependencies
84
+ * three failed tests involving class SplitEnd
85
+ * putting off PyPI v1.0.0 release indefinitely
86
+ * all dependencies need to be at v1.0+
87
+ * need to work out SplitEnd bugs
88
+ * still need to finalize design (need to use it!)
89
+ * need to find good SplitEnd use case
90
+ * other Stack variants like SplintEnd??? (shared data/node variants?)
91
+
92
+ ### Version 0.20.2.0 - Going down a typing rabbit hole 2024-08-03
93
+
94
+ * updated to use grscheller.circular-array version 3.3.0 (3.2.3.0)
95
+ * updated to use grscheller.fp version 0.3.0 (0.2.3.0)
96
+ * removed grscheller.circular-array dependency from datastructures.SplitEnd
97
+ * still preparing for the 1.0.0 datastructures release
98
+ * as I tighten up typing, I find I must do so for dependencies too
99
+ * using `# type: ignore` is a band-aid, use `@overload` and `cast` instead
100
+ * using `@overload` to "untype" optional parameters is the way to go
101
+ * use `cast` only when you have knowledge beyond what the typechecker can know
102
+
103
+ ### Version 0.19.0 - PyPI release date 2024-07-15
104
+
105
+ * continuing to prepare for PyPI release 1.0.0
106
+ * cleaned up docstrings for a 1.0.0 release
107
+ * changed accumulate1 to accumulate for FTuple
108
+ * considering requiring grscheller.fp as a dependency
109
+
110
+ ### Version 0.18.0.0 - Beginning to prepare for PyPI release 1.0.0
111
+
112
+ * first devel version requiring circular-array 3.1.0
113
+ * still some design work to be done
114
+ * gave Class SplitEnd fold and fold1 methods
115
+ * TODO: Verify flatMap family yields results in "natural" order
116
+
117
+ ### Version 0.17.0.4 - Start of effort to relax None restrictions
118
+
119
+ * have begun relaxing the requirement of not storing None as a value
120
+ * completed for queues.py
121
+ * requires grscheller.circular-array >= 3.0.3.0
122
+ * perhaps next PyPI release will be v1.0.0 ???
123
+
124
+ ### Version 0.16.0.0 - Preparing to support PEP 695 generics
125
+
126
+ * Requires Python >= 3.12
127
+ * preparing to support PEP 695 generics
128
+ * will require Python 3.12
129
+ * will not have to import typing for Python 3.12 and beyond
130
+ * BUT... mypy does not support PEP 695 generics yet (Pyright does)
131
+ * bumped minimum Python version to >= 3.12 in pyproject.toml
132
+ * map methods mutating objects don't play nice with typing
133
+ * map methods now return copies
134
+ * THEREFORE: tests need to be completely overhauled
135
+
136
+ ### Version 0.14.1.1 - Preparing to add TypeVars
137
+
138
+ * tests working with grscheller.circular-array >= 3.0.0, <3.2
139
+ * lots of mypy complaints
140
+ * first version using TypeVars will be 0.15.0.0
141
+
142
+ ### Version 0.14.0 - PyPI release date 2024-03-09
143
+
144
+ * updated dependency on CircularArray class
145
+ * dependencies = ["grscheller.circular-array >= 0.2.0, < 2.1"]
146
+ * minor README.md woodsmithing
147
+ * keeping project an Alpha release for now
148
+
149
+ ### Version 0.13.3.1 - Preparing for another PyPI release soon
150
+
151
+ * overhauled docstrings with Markdown markup
152
+ * updated pyproject.py to drop project back to an Alpha release
153
+ * allows more renaming flexibility
154
+ * intending to develop more graph based data structures
155
+ * renamed class core.nodes.Tree_Node to core.node.BT_Node
156
+ * BT for Binary Tree (data in each node of tree)
157
+ * created class core.nodes.LT_Node
158
+ * LT for Leaf Tree (data are the leaves of the tree)
159
+ * removed deprecated reduce method from various classes
160
+ * use foldL instead
161
+
162
+ ### Version 0.13.2 - PyPI release date 2024-02-20
163
+
164
+ * Forgot to update pyproject.toml dependencies
165
+ * dependencies = ["grscheller.circular-array >= 0.1.1, < 1.1"]
166
+
167
+ ### Version 0.13.1 - PyPI Release date 2024-01-31
168
+
169
+ * FTuple now supports both slicing and indexing
170
+ * more tests for FTuple
171
+ * slicing and indexing
172
+ * map, foldL, accumulate methods
173
+ * flatMap, mergeMap, exhaustMap methods
174
+ * forgot to update CHANGELOG for v0.13.0 release
175
+
176
+ ### Version 0.13.0 - PyPI Release date 2024-01-30
177
+
178
+ * BREAKING API CHANGE - CircularArray class removed
179
+ * CircularArray moved to its own PyPI & GitHub repos
180
+ * https://pypi.org/project/grscheller.circular-array/
181
+ * https://github.com/grscheller/circular-array
182
+ * Fix various out-of-date docstrings
183
+
184
+ ### Version 0.12.3 - PyPI Release date 2024-01-20
185
+
186
+ * cutting next PyPI release from development (main)
187
+ * if experiment works, will drop release branch
188
+ * will not include `docs/`
189
+ * will not include `.gitignore` and `.github/`
190
+ * will include `tests/`
191
+ * made pytest >= 7.4 an optional test dependency
192
+
193
+ ### Version 0.12.2 - PyPI Release date 2024-01-17
194
+
195
+ * designing sensible reduce & accumulate overrides for Maybe & Either
196
+ * default implementations were not that useful
197
+ * taking their behavior as bugs and not API changes
198
+ * more tests for accumulate & reduce
199
+ * fixed Stack reverse() method
200
+ * should have caught this when I fixed FStack on last PyPI release
201
+ * more Stack tests
202
+ * many more FP tests
203
+
204
+ ### Version 0.12.1 - PyPI Release date 2024-01-15
205
+
206
+ * BUG FIX: FStack reverse() method
207
+ * added more tests
208
+
209
+ ### Version 0.12.0 - PyPI Release date 2024-01-14
210
+
211
+ * Considerable future-proofing for first real Beta release
212
+
213
+ ### Version 0.11.3.4 - Finally decided to make next PyPI release Beta
214
+
215
+ * Package structure mature and not subject to change beyond additions
216
+ * Will endeavor to keep top level & core module names the same
217
+ * API changes will be deprecated before removed
218
+
219
+ ### Version 0.11.0 - PyPI Release date 2023-12-20
220
+
221
+ * A lot of work done on class CLArray
222
+ * probably will change its name before the next PyPI Release
223
+ * perhaps to "ProcessArray" or "PArray"
224
+ * Keeping this release an Alpha version
225
+ * mostly for the freedom to rename and restructure the package
226
+
227
+ ### Version 0.10.17.0+ (0.11.0-RC2) - 2023-12-17
228
+
229
+ * Second release candidate - probably will become next PyPI release
230
+ * main now development branch, release will be release branch
231
+ * decided to drop it back to Alpha
232
+ * making datastructures a Beta release was premature
233
+ * classifier "Development Status :: 3 - Alpha"
234
+ * will cut next PyPI release with Flit from release branch
235
+ * will need to regenerate docs on release & move to main
236
+ * things to add in main before next release
237
+ * will not make Maybe Nothing a singleton
238
+ * last touched CLArray refactor
239
+ * improve CLArray test coverage
240
+ * Things for future PYPI releases
241
+ * inherit FTuple from Tuple (use __new__) for performance boost
242
+ * hold off using __slots__ until I understand them better
243
+
244
+ ### Version 0.10.14.2 (0.11.0-RC1) - 2023-12-11
245
+
246
+ * First release candidate - unlikely this will be the next PyPI release
247
+ * will cut next PyPI release with Flit from main branch
248
+ * removed docs directory before merge (docs/ will be main only)
249
+ * things to add in main before next release
250
+ * make Maybe Nothing a singleton (use __new__)
251
+ * derive FTuple from Tuple (use __new__) for performance boost
252
+ * simplify CLArray to use a Queue instead of CircularArray & iterator
253
+ * start using __slots__ for performance boost to data structures
254
+ * efficiency trumps extensibility
255
+ * prevents client code adding arbitrary attributes & methods
256
+ * smaller size & quicker method/attribute lookups
257
+ * big difference when dealing with huge number of data structures
258
+
259
+ ### Version 0.10.14.0 - commit date 2023-12-09
260
+
261
+ * Finished massive renaming & repackaging effort
262
+ * to help with future growth in future
263
+ * name choices more self-documenting
264
+ * top level modules
265
+ * array
266
+ * CLArray
267
+ * queue
268
+ * FIFOQueue (formerly SQueue)
269
+ * LIFOQueue (LIFO version of above)
270
+ * DoubleQueue (formerly DQueue)
271
+ * stack
272
+ * Stack (formerly PStack)
273
+ * FStack
274
+ * tuple-like
275
+ * FTuple
276
+
277
+ ### Version 0.10.11.0 - commit date 2023-11-27
278
+
279
+ * Created new datastructures class CLArray
280
+ * more imperative version of FCLArray
281
+ * has an iterator to swap None values instead of a default value
282
+ * when iterator is exhausted, will swap in () for None
283
+ * no flatMap type methods
284
+ * map method mutates self
285
+ * can be resized
286
+ * returns false when CLArray contains no non-() elements
287
+ * TODO: does not yet handle StopIteration events properly
288
+ * made package more overall "atomic"
289
+
290
+ ### Version 0.10.10.0 - commit date 2023-11-26
291
+
292
+ * More or less finalized FCLArray API
293
+ * finished overriding default flatMap, mergeMap & exhaustMap from FP
294
+ * need mergeMap & exhaustMap versions of unit tests
295
+ * found this data structure very interesting
296
+ * hopefully find a use for it
297
+ * considering a simpler CLArray version
298
+
299
+ ### Version 0.10.9 - PyPI release date 2023-11-21
300
+
301
+ ### Version 0.10.8.0 - commit date 2023-11-18
302
+
303
+ * Bumping requires-python = ">=3.11" in pyproject.toml
304
+ * Currently developing & testing on Python 3.11.5
305
+ * 0.10.7.X will be used on the GitHub pypy3 branch
306
+ * Pypy3 (7.3.13) using Python (3.10.13)
307
+ * tests pass but are 4X slower
308
+ * LSP almost useless due to more primitive typing module
309
+
310
+ ### Version 0.10.7.0 - commit date 2023-11-18
311
+
312
+ * Overhauled __repr__ & __str__ methods for all classes
313
+ * tests that ds == eval(repr(ds)) for all data structures ds in package
314
+ * CLArray API is in a state of flux
315
+ * no longer stores None as a value
316
+ * __add__ concatenates, no longer component adds
317
+ * maybe allow zero length CLArrays?
318
+ * would make it a monoid and not just a semigroup
319
+ * make an immutable version too?
320
+ * Updated markdown overview documentation
321
+
322
+ ### Version 0.10.1.0 - commit date 2023-11-11
323
+
324
+ * Removed flatMap methods from stateful objects
325
+ * FLArray, DQueue, SQueue, PStack
326
+ * kept the map method for each
327
+ * some restructuring so package will scale better in the future
328
+
329
+ ### Version 0.9.1 - PyPI release date: 2023-11-09
330
+
331
+ * First Beta release of grscheller.datastructures on PyPI
332
+ * Infrastructure stable
333
+ * Existing datastructures only should need API additions
334
+ * Type annotations working extremely well
335
+ * Using Pdoc3 to generate documentation on GitHub
336
+ * see https://grscheller.github.io/datastructures/
337
+ * All iterators conform to Python language "iterator protocol"
338
+ * Improved docstrings
339
+ * Future directions:
340
+ * Develop some "typed" containers
341
+ * Add sequence & transverse methods to functional subpackage classes
342
+ * Monad transformers???
343
+ * Need to use this package in other projects to gain insight
344
+
345
+ ### Version 0.8.6.0 - PyPI release date: 2023-11-05
346
+
347
+ * Finally got queue.py & stack.py inheritance sorted out
348
+ * LSP with Pyright working quite well
349
+ * Goals for next PyPI release:
350
+ * combine methods
351
+ * tail and tailOr
352
+ * cons and consOr
353
+ * head and headOr
354
+
355
+ ### Version 0.8.4.0 - commit date 2023-11-03
356
+
357
+ * new data structure FTuple added
358
+ * wrapped tuple with a FP interface
359
+ * initial minimal viable product
360
+
361
+ ### Version 0.8.3.0 - commit date 2023-11-02
362
+
363
+ * major API breaking change
364
+ * now two versions of Stack class
365
+ * PStack (stateful) with push, pop, peak methods
366
+ * FStack (immutable) with cons, tail, head methods
367
+ * Dqueue renamed DQueue
368
+ * FLarray renamed FLArray
369
+ * tests now work
370
+
371
+ ### Version 0.8.0.0 - commit date 2023-10-28
372
+
373
+ * API breaking changes
374
+ * did not find everything returning self upon mutation
375
+ * Efforts for future directions
376
+ * decided to use pdoc3 over sphinx to generate API documentation
377
+ * need to resolve tension of package being Pythonic and Functional
378
+
379
+ ### Version 0.7.5.0 - commit date 2023-10-26
380
+
381
+ * moved pytest test suite to root of the repo
382
+ * src/grscheller/datastructures/tests -> tests/
383
+ * seems to be the canonical location of a test suite
384
+ * instructions to run test suite in tests/__init__.py
385
+
386
+ ### Version 0.7.4.0 - PyPI release date: 2023-10-25
387
+
388
+ * More mature
389
+ * More Pythonic
390
+ * Major API changes
391
+ * Still tagging it an Alpha release
392
+
393
+ ### Version 0.7.2.0 - commit date 2023-10-18
394
+
395
+ * Queue & Dqueue no longer return Maybe objects
396
+ * Neither store None as a value
397
+ * Now safe to return None for non-existent values
398
+ * like popping or peaking from an empty queue or dqueue
399
+
400
+ ### Version 0.7.0.0 - commit date 2023-10-16
401
+
402
+ * added Queue data structure representing a FIFO queue
403
+ * renamed two Dqueue methods
404
+ * headR -> peakLastIn
405
+ * headL -> peakNextOut
406
+ * went ahead and removed Stack head method
407
+ * fair since I still labeling releases as alpha releases
408
+ * the API is still a work in progress
409
+ * updated README.md
410
+ * foreshadowing making a distinction between
411
+ * objects "sharing" their data -> FP methods return copies
412
+ * objects "contain" their data -> FP methods mutate object
413
+ * added info on class Queue
414
+
415
+ ### Version 0.6.9.0 - PyPI release date: 2023-10-09
416
+
417
+ * deprecated Stack head() method
418
+ * replaced with peak() method
419
+ * renamed core module to iterlib module
420
+ * library just contained functions for manipulating iterators
421
+ * TODO: use mergeIters as a guide for an iterator "zip" function
422
+ * class Stack better in alignment with:
423
+ * Python lists
424
+ * more natural for Stack to iterate backwards starting from head
425
+ * removed Stack's __getitem__ method
426
+ * both pop and push/append from end
427
+ * Dqueue which wraps a Circle instance
428
+ * also Dqueue does not have a __getitem__ method
429
+ * Circle which implements a circular array with a Python List
430
+ * Stack now implements map, flatMap, mergeMap methods
431
+ * each returns a new Stack instance, with new nodes
432
+
433
+ ### Version 0.6.8.6 - commit date: 2023-10-08
434
+
435
+ * 3 new methods for class Circle and Dqueue
436
+ * mapSelf, flatMapSelf, mergeMapSelf
437
+ * these correspond to map, flatMap, mergeMap
438
+ * except they act on the class objects themselves, not new instances
439
+ * these new methods will NOT be added to the Stack class
440
+ * they would destroy node sharing
441
+ * did add a map method which returns a new instance (with new nodes)
442
+ * TODO: add flatMap and mergeMap methods
443
+ * probably will add them to the Dqueue class too
444
+ * not worth the maintenance effort maintaining two version of Dqueue
445
+ * one returning new instances
446
+ * the other modifying the object in place
447
+
448
+ ### Version 0.6.8.3 - commit date: 2023-10-06
449
+
450
+ * Stack now works with Python Reversed builtin function
451
+ * using a __reversed__ method which is O(n)
452
+ * never figured out why reversed() failed with __getitems__ & __len__
453
+ * this would have been O(n^2) anyway
454
+ * Stack no longer implements the __getitems__ method
455
+ * class Carray renamed to Circle
456
+ * implements a circular array based on a Python List
457
+ * resizes itself as needed
458
+ * will handle None values being pushed and popped from it
459
+ * implemented in the grscheller.datastructures.circle module
460
+ * in the src/grscheller/datastructures/circle.py file
461
+ * O(1) pushing/popping to/from either end
462
+ * O(1) length determination
463
+ * O(1) indexing for setting and getting values.
464
+ * Dqueue implemented with Circle class instead of List class directly
465
+ * Ensured that None is never pushed to Stack & Dqueue objects
466
+
467
+
468
+ ### Version 0.6.4.1 - commit date: 2023-10-01
469
+
470
+ * Initial prototypes for map and flatMap for Dqueue class
471
+ * Started grscheller.datastructures.core module
472
+ * used for grscheller.datastructures implementation
473
+ * no particular need to indicate them to be _private
474
+ * exports the following functions so far
475
+ * concatIters - sequentially concatenate multiple iterators
476
+ * mergeIters - merge multiple iterators until one is exhausted
477
+ * mapIter - lazily map a function over an iterator stream
478
+ * Decided to keep Alpha for next PyPI release
479
+
480
+ ### Version 0.6.3.2 - commit date: 2023-09-30
481
+
482
+ * Made functional module into a sub package of datastructures
483
+ * Improved comments and type annotations
484
+ * Removed isEmpty method from Dqueue class
485
+ * Both Dqueue & Stack objects evaluate true when non-empty
486
+ * Beginning preparations for the next PyPI release
487
+ * Want to make next PyPI release a Beta release
488
+ * Need to improve test suite first
489
+
490
+ ### Version 0.6.2.0 - commit date: 2023-09-25
491
+
492
+ * Started work on a Left biased Either Monad
493
+ * removed isEmpty method from Stack class
494
+
495
+ ### Version 0.6.1.0 - commit date: 2023-09-25
496
+
497
+ * Maybe get() and getOrElse() API changes
498
+ * getting a better handle on type annotation
499
+ * work-in-progress
500
+ * erroneous LSP error messages greatly reduced
501
+
502
+ ### Version 0.5.2.1 - PyPI release date: 2023-09-24
503
+
504
+ * data structures now support a much more FP style for Python
505
+ * implemented Maybe monad
506
+ * introduces the use of type annotations for this effort
507
+ * much better test coverage
508
+
509
+ ### Version 0.5.0.0 - commit date: 2023-09-20
510
+
511
+ * begin work on a more functional approach
512
+ * create a monadic Option class
513
+ * drop the subclassing of NONE
514
+ * put this effort on a new branch: feature_maybe
515
+ * some flaws with previous approach
516
+ * the OO redirection not best
517
+ * for a class used in computationally intense contexts
518
+ * adds way too much complexity to the design
519
+ * some Python library probably already implemented this
520
+ * without looking, these probably throw tons of exceptions
521
+ * more fun implementing it myself
522
+ * then being dissatisfied with someone else's design
523
+
524
+ ### Version 0.4.0.0 - commit date: 2023-09-11
525
+
526
+ * subtle paradigm shift for Stack class
527
+ * empty Stacks no longer returned for nonexistent stacks
528
+ * like the tail of an empty stack
529
+ * singleton Stack.stackNONE class object returned instead
530
+ * Stack & _StackNONE classes inherit from _StackBase
531
+ * still working out the API
532
+
533
+ ### Version 0.3.0.2 - PyPI release date: 2023-09-09
534
+
535
+ * updated class Dqueue
536
+ * added __eq__ method
537
+ * added equality tests to tests/test_dqueue.py
538
+ * improved docstrings
539
+
540
+ ### Version 0.2.3.0 - commit date: 2023-09-06
541
+
542
+ * added __eq__ method to Stack class
543
+ * added some preliminary tests
544
+ * more tests are needed
545
+ * worst case O(n)
546
+ * will short circuit fast if possible
547
+
548
+ ### Version 0.2.2.2 - PyPI release date: 2023-09-04
549
+
550
+ * decided base package should have no dependencies other than
551
+ * Python version (>=2.10 due to use of Python match statement)
552
+ * Python standard libraries
553
+ * made pytest an optional \[test\] dependency
554
+ * added src/ as a top level directory as per
555
+ * https://packaging.python.org/en/latest/tutorials/packaging-projects/
556
+ * could not do the same for tests/ if end users are to have access
557
+
558
+ ### Version 0.2.1.0 - PyPI release date: 2023-09-03
559
+
560
+ * first Version uploaded to PyPI
561
+ * https://pypi.org/project/grscheller.datastructures/
562
+ * Install from PyPI
563
+ * $ pip install grscheller.datastructures==0.2.1.0
564
+ * $ pip install grscheller.datastructures # for top level version
565
+ * Install from GitHub
566
+ * $ pip install git+https://github.com/grscheller/datastructures@v0.2.1.0
567
+ * pytest made a dependency
568
+ * useful & less confusing to developers and end users
569
+ * good for systems I have not tested on
570
+ * prevents another pytest from being picked up from shell $PATH
571
+ * using a different python version
572
+ * giving "package not found" errors
573
+ * for CI/CD pipelines requiring unit testing
574
+
575
+ ### Version 0.2.0.2 - github only release date: 2023-08-29
576
+
577
+ * First version able to be installed from GitHub with pip
578
+ * $ pip install git+https://github.com/grscheller/datastructures@v0.2.0.2
579
+
580
+ ### Version 0.2.0.1 - commit date: 2023-08-29
581
+
582
+ * First failed attempt to make package installable from GitHub with pip
583
+
584
+ ### Version 0.2.0.0 - commit date: 2023-08-29
585
+
586
+ * BREAKING API CHANGE!!!
587
+ * Stack push method now returns reference to self
588
+ * Dqueue pushL & pushR methods now return references to self
589
+ * These methods used to return the data being pushed
590
+ * Now able to "." chain push methods together
591
+ * Updated tests - before making API changes
592
+ * First version to be "released" on GitHub
593
+
594
+ ### Version 0.1.1.0 - commit date: 2023-08-27
595
+
596
+ * grscheller.datastructures moved to its own GitHub repo
597
+ * https://github.com/grscheller/datastructures
598
+ * GitHub and PyPI user names just a happy coincidence
599
+
600
+ ### Version 0.1.0.0 - initial version: 2023-08-27
601
+
602
+ * Package implementing data structures which do not throw exceptions
603
+ * Did not push to PyPI until version 0.2.1.0
604
+ * Initial Python grscheller.datastructures for 0.1.0.0 commit:
605
+ * dqueue - implements a double sided queue class Dqueue
606
+ * stack - implements a LIFO stack class Stack