kececilayout 0.2.3__tar.gz → 0.2.5__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: kececilayout
3
- Version: 0.2.3
3
+ Version: 0.2.5
4
4
  Summary: A deterministic node placement algorithm used in graph visualization. In this layout, nodes are arranged sequentially along a defined primary axis. Each subsequent node is then alternately offset along a secondary, perpendicular axis, typically moving to one side of the primary axis and then the other. Often, the magnitude of this secondary offset increases as nodes progress along the primary axis, creating a characteristic zig-zag or serpentine pattern.
5
5
  Home-page: https://github.com/WhiteSymmetry/kececilayout
6
6
  Author: Mehmet Keçeci
@@ -41,8 +41,11 @@ Dynamic: summary
41
41
  [![PyPI version](https://badge.fury.io/py/kececilayout.svg)](https://badge.fury.io/py/kececilayout)
42
42
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
43
43
 
44
- [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.15313947.svg)](https://doi.org/10.5281/zenodo.15313947)
44
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.15313946.svg)](https://doi.org/10.5281/zenodo.15313946)
45
45
  [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.15314329.svg)](https://doi.org/10.5281/zenodo.15314329)
46
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.15353535.svg)](https://doi.org/10.5281/zenodo.15353535)
47
+
48
+ [![WorkflowHub DOI](https://img.shields.io/badge/DOI-10.48546%2Fworkflowhub.datafile.17.1-blue)](https://doi.org/10.48546/workflowhub.datafile.17.1)
46
49
 
47
50
  [![Anaconda-Server Badge](https://anaconda.org/bilgi/kececilayout/badges/version.svg)](https://anaconda.org/bilgi/kececilayout)
48
51
  [![Anaconda-Server Badge](https://anaconda.org/bilgi/kececilayout/badges/latest_release_date.svg)](https://anaconda.org/bilgi/kececilayout)
@@ -50,10 +53,61 @@ Dynamic: summary
50
53
  [![Anaconda-Server Badge](https://anaconda.org/bilgi/kececilayout/badges/license.svg)](https://anaconda.org/bilgi/kececilayout)
51
54
 
52
55
  [![Open Source](https://img.shields.io/badge/Open%20Source-Open%20Source-brightgreen.svg)](https://opensource.org/)
53
- [![Documentation Status](https://app.readthedocs.org/projects/kececilayout/badge/?0.2.1=main)](https://kececilayout.readthedocs.io/en/main/?badge=main)
56
+ [![Documentation Status](https://app.readthedocs.org/projects/kececilayout/badge/?0.2.3=main)](https://kececilayout.readthedocs.io/en/latest)
54
57
 
55
58
  [![OpenSSF Best Practices](https://www.bestpractices.dev/projects/10531/badge)](https://www.bestpractices.dev/projects/10531)
56
59
 
60
+ [![Python CI](https://github.com/WhiteSymmetry/kececilayout/actions/workflows/python_ci.yml/badge.svg?branch=main)](https://github.com/WhiteSymmetry/kececilayout/actions/workflows/python_ci.yml)
61
+ [![codecov](https://codecov.io/gh/WhiteSymmetry/kececilayout/graph/badge.svg?token=1SDH8E9RAJ)](https://codecov.io/gh/WhiteSymmetry/kececilayout)
62
+ [![Documentation Status](https://readthedocs.org/projects/kececilayout/badge/?version=latest)](https://kececilayout.readthedocs.io/en/latest/)
63
+ [![Binder](https://terrarium.evidencepub.io/badge_logo.svg)](https://terrarium.evidencepub.io/v2/gh/WhiteSymmetry/kececilayout/HEAD)
64
+ [![PyPI version](https://badge.fury.io/py/kececilayout.svg)](https://badge.fury.io/py/kececilayout)
65
+ [![PyPI Downloads](https://static.pepy.tech/badge/kececilayout)](https://pepy.tech/projects/kececilayout)
66
+ [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md)
67
+ [![CI/CD](https://github.com/WhiteSymmetry/kececilayout/actions/workflows/ci-cd.yml/badge.svg)](https://github.com/WhiteSymmetry/kececilayout/actions/workflows/ci-cd.yml)
68
+ [![Linted with Ruff](https://img.shields.io/badge/Linted%20with-Ruff-green?logo=python&logoColor=white)](https://github.com/astral-sh/ruff)
69
+
70
+ ---
71
+
72
+ <p align="left">
73
+ <table>
74
+ <tr>
75
+ <td style="text-align: center;">PyPI</td>
76
+ <td style="text-align: center;">
77
+ <a href="https://pypi.org/project/kececilayout/">
78
+ <img src="https://badge.fury.io/py/kececilayout.svg" alt="PyPI version" height="18"/>
79
+ </a>
80
+ </td>
81
+ </tr>
82
+ <tr>
83
+ <td style="text-align: center;">Conda</td>
84
+ <td style="text-align: center;">
85
+ <a href="https://anaconda.org/bilgi/kececilayout">
86
+ <img src="https://anaconda.org/bilgi/kececilayout/badges/version.svg" alt="conda-forge version" height="18"/>
87
+ </a>
88
+ </td>
89
+ </tr>
90
+ <tr>
91
+ <td style="text-align: center;">DOI</td>
92
+ <td style="text-align: center;">
93
+ <a href="https://doi.org/10.5281/zenodo.15313946">
94
+ <img src="https://zenodo.org/badge/DOI/10.5281/zenodo.15313946.svg" alt="DOI" height="18"/>
95
+ </a>
96
+ </td>
97
+ </tr>
98
+ <tr>
99
+ <td style="text-align: center;">License: MIT</td>
100
+ <td style="text-align: center;">
101
+ <a href="https://opensource.org/licenses/MIT">
102
+ <img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License" height="18"/>
103
+ </a>
104
+ </td>
105
+ </tr>
106
+ </table>
107
+ </p>
108
+
109
+ ---
110
+
57
111
  **Kececi Layout (Keçeci Yerleşimi)**: A deterministic graph layout algorithm designed for visualizing linear or sequential structures with a characteristic "zig-zag" or "serpentine" pattern.
58
112
 
59
113
  *Python implementation of the Keçeci layout algorithm for graph visualization.*
@@ -684,15 +738,15 @@ If this library was useful to you in your research, please cite us. Following th
684
738
  ### BibTeX
685
739
 
686
740
  ```bibtex
687
- @misc{kececi_2025_15313947,
741
+ @misc{kececi_2025_15313946,
688
742
  author = {Keçeci, Mehmet},
689
743
  title = {kececilayout},
690
744
  month = may,
691
745
  year = 2025,
692
746
  publisher = {PyPI, Anaconda, Github, Zenodo},
693
747
  version = {0.2.0},
694
- doi = {10.5281/zenodo.15313947},
695
- url = {https://doi.org/10.5281/zenodo.15313947},
748
+ doi = {10.5281/zenodo.15313946},
749
+ url = {https://doi.org/10.5281/zenodo.15313946},
696
750
  }
697
751
 
698
752
  @misc{kececi_2025_15314329,
@@ -709,15 +763,52 @@ If this library was useful to you in your research, please cite us. Following th
709
763
  ### APA
710
764
 
711
765
  ```
712
- Keçeci, M. (2025). kececilayout (0.2.0). PyPI, Anaconda, GitHub, Zenodo. https://doi.org/10.5281/zenodo.15313947
713
766
 
714
- Keçeci, M. (2025). Keçeci Layout. https://doi.org/10.5281/zenodo.15314329
767
+ Keçeci, M. (2025). The Keçeci Layout: A Deterministic Visualisation Framework for the Structural Analysis of Ordered Systems in Chemistry and Environmental Science. Open Science Articles (OSAs), Zenodo. https://doi.org/10.5281/zenodo.16696713
768
+
769
+ Keçeci, M. (2025). The Keçeci Layout: A Deterministic, Order-Preserving Visualization Algorithm for Structured Systems. Open Science Articles (OSAs), Zenodo. https://doi.org/10.5281/zenodo.16526798
770
+
771
+ Keçeci, M. (2025). Keçeci Deterministic Zigzag Layout. WorkflowHub. https://doi.org/10.48546/workflowhub.document.31.1
772
+
773
+ Keçeci, M. (2025). Keçeci Zigzag Layout Algorithm. Authorea. https://doi.org/10.22541/au.175087581.16524538/v1
774
+
775
+ Keçeci, M. (2025). The Keçeci Layout: A Structural Approach for Interdisciplinary Scientific Analysis. Open Science Articles (OSAs), Zenodo. https://doi.org/10.5281/zenodo.15792684
776
+
777
+ Keçeci, M. (2025). When Nodes Have an Order: The Keçeci Layout for Structured System Visualization. HAL open science. https://hal.science/hal-05143155; https://doi.org/10.13140/RG.2.2.19098.76484
778
+
779
+ Keçeci, M. (2025). The Keçeci Layout: A Cross-Disciplinary Graphical Framework for Structural Analysis of Ordered Systems. Authorea. https://doi.org/10.22541/au.175156702.26421899/v1
780
+
781
+ Keçeci, M. (2025). Beyond Traditional Diagrams: The Keçeci Layout for Structural Thinking. Knowledge Commons. https://doi.org/10.17613/v4w94-ak572
782
+
783
+ Keçeci, M. (2025). The Keçeci Layout: A Structural Approach for Interdisciplinary Scientific Analysis. figshare. Journal contribution. https://doi.org/10.6084/m9.figshare.29468135
784
+
785
+ Keçeci, M. (2025, July 3). The Keçeci Layout: A Structural Approach for Interdisciplinary Scientific Analysis. OSF. https://doi.org/10.17605/OSF.IO/9HTG3
786
+
787
+ Keçeci, M. (2025). Beyond Topology: Deterministic and Order-Preserving Graph Visualization with the Keçeci Layout. WorkflowHub. https://doi.org/10.48546/workflowhub.document.34.4
788
+
789
+ Keçeci, M. (2025). A Graph-Theoretic Perspective on the Keçeci Layout: Structuring Cross-Disciplinary Inquiry. Preprints. https://doi.org/10.20944/preprints202507.0589.v1
790
+
791
+ Keçeci, M. (2025). Keçeci Layout. Open Science Articles (OSAs), Zenodo. https://doi.org/10.5281/zenodo.15314328
792
+
793
+ Keçeci, M. (2025). kececilayout [Data set]. WorkflowHub. https://doi.org/10.48546/workflowhub.datafile.17.1
794
+
795
+ Keçeci, M. (2025, May 1). Kececilayout. Open Science Articles (OSAs), Zenodo. https://doi.org/10.5281/zenodo.15313946
796
+
715
797
  ```
716
798
 
717
799
  ### Chicago
718
800
 
719
801
  ```
720
- Keçeci, Mehmet. “Kececilayout”. PyPI, Anaconda, GitHub, Zenodo, 01 May 2025. https://doi.org/10.5281/zenodo.15313947.
721
802
 
722
- Keçeci, Mehmet. Keçeci Layout”, 01 May 2025. https://doi.org/10.5281/zenodo.15314329.
803
+ Keçeci, Mehmet. The Keçeci Layout: A Deterministic Visualisation Framework for the Structural Analysis of Ordered Systems in Chemistry and Environmental Science. Open Science Articles (OSAs), Zenodo, 2025. https://doi.org/10.5281/zenodo.16696713
804
+
805
+ Keçeci, Mehmet. The Keçeci Layout: A Deterministic, Order-Preserving Visualization Algorithm for Structured Systems. Open Science Articles (OSAs), Zenodo, 2025. https://doi.org/10.5281/zenodo.16526798
806
+
807
+ Keçeci, Mehmet. kececilayout [Data set]. WorkflowHub, 2025. https://doi.org/10.48546/workflowhub.datafile.17.1
808
+
809
+ Keçeci, Mehmet. "Kececilayout". Open Science Articles (OSAs), Zenodo, 2025. https://doi.org/10.5281/zenodo.15313946.
810
+
811
+ Keçeci, Mehmet. "Keçeci Layout". Open Science Articles (OSAs), Zenodo, 2025. https://doi.org/10.5281/zenodo.15314329.
723
812
  ```
813
+
814
+
@@ -3,8 +3,11 @@
3
3
  [![PyPI version](https://badge.fury.io/py/kececilayout.svg)](https://badge.fury.io/py/kececilayout)
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
5
 
6
- [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.15313947.svg)](https://doi.org/10.5281/zenodo.15313947)
6
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.15313946.svg)](https://doi.org/10.5281/zenodo.15313946)
7
7
  [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.15314329.svg)](https://doi.org/10.5281/zenodo.15314329)
8
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.15353535.svg)](https://doi.org/10.5281/zenodo.15353535)
9
+
10
+ [![WorkflowHub DOI](https://img.shields.io/badge/DOI-10.48546%2Fworkflowhub.datafile.17.1-blue)](https://doi.org/10.48546/workflowhub.datafile.17.1)
8
11
 
9
12
  [![Anaconda-Server Badge](https://anaconda.org/bilgi/kececilayout/badges/version.svg)](https://anaconda.org/bilgi/kececilayout)
10
13
  [![Anaconda-Server Badge](https://anaconda.org/bilgi/kececilayout/badges/latest_release_date.svg)](https://anaconda.org/bilgi/kececilayout)
@@ -12,10 +15,61 @@
12
15
  [![Anaconda-Server Badge](https://anaconda.org/bilgi/kececilayout/badges/license.svg)](https://anaconda.org/bilgi/kececilayout)
13
16
 
14
17
  [![Open Source](https://img.shields.io/badge/Open%20Source-Open%20Source-brightgreen.svg)](https://opensource.org/)
15
- [![Documentation Status](https://app.readthedocs.org/projects/kececilayout/badge/?0.2.1=main)](https://kececilayout.readthedocs.io/en/main/?badge=main)
18
+ [![Documentation Status](https://app.readthedocs.org/projects/kececilayout/badge/?0.2.3=main)](https://kececilayout.readthedocs.io/en/latest)
16
19
 
17
20
  [![OpenSSF Best Practices](https://www.bestpractices.dev/projects/10531/badge)](https://www.bestpractices.dev/projects/10531)
18
21
 
22
+ [![Python CI](https://github.com/WhiteSymmetry/kececilayout/actions/workflows/python_ci.yml/badge.svg?branch=main)](https://github.com/WhiteSymmetry/kececilayout/actions/workflows/python_ci.yml)
23
+ [![codecov](https://codecov.io/gh/WhiteSymmetry/kececilayout/graph/badge.svg?token=1SDH8E9RAJ)](https://codecov.io/gh/WhiteSymmetry/kececilayout)
24
+ [![Documentation Status](https://readthedocs.org/projects/kececilayout/badge/?version=latest)](https://kececilayout.readthedocs.io/en/latest/)
25
+ [![Binder](https://terrarium.evidencepub.io/badge_logo.svg)](https://terrarium.evidencepub.io/v2/gh/WhiteSymmetry/kececilayout/HEAD)
26
+ [![PyPI version](https://badge.fury.io/py/kececilayout.svg)](https://badge.fury.io/py/kececilayout)
27
+ [![PyPI Downloads](https://static.pepy.tech/badge/kececilayout)](https://pepy.tech/projects/kececilayout)
28
+ [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md)
29
+ [![CI/CD](https://github.com/WhiteSymmetry/kececilayout/actions/workflows/ci-cd.yml/badge.svg)](https://github.com/WhiteSymmetry/kececilayout/actions/workflows/ci-cd.yml)
30
+ [![Linted with Ruff](https://img.shields.io/badge/Linted%20with-Ruff-green?logo=python&logoColor=white)](https://github.com/astral-sh/ruff)
31
+
32
+ ---
33
+
34
+ <p align="left">
35
+ <table>
36
+ <tr>
37
+ <td style="text-align: center;">PyPI</td>
38
+ <td style="text-align: center;">
39
+ <a href="https://pypi.org/project/kececilayout/">
40
+ <img src="https://badge.fury.io/py/kececilayout.svg" alt="PyPI version" height="18"/>
41
+ </a>
42
+ </td>
43
+ </tr>
44
+ <tr>
45
+ <td style="text-align: center;">Conda</td>
46
+ <td style="text-align: center;">
47
+ <a href="https://anaconda.org/bilgi/kececilayout">
48
+ <img src="https://anaconda.org/bilgi/kececilayout/badges/version.svg" alt="conda-forge version" height="18"/>
49
+ </a>
50
+ </td>
51
+ </tr>
52
+ <tr>
53
+ <td style="text-align: center;">DOI</td>
54
+ <td style="text-align: center;">
55
+ <a href="https://doi.org/10.5281/zenodo.15313946">
56
+ <img src="https://zenodo.org/badge/DOI/10.5281/zenodo.15313946.svg" alt="DOI" height="18"/>
57
+ </a>
58
+ </td>
59
+ </tr>
60
+ <tr>
61
+ <td style="text-align: center;">License: MIT</td>
62
+ <td style="text-align: center;">
63
+ <a href="https://opensource.org/licenses/MIT">
64
+ <img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License" height="18"/>
65
+ </a>
66
+ </td>
67
+ </tr>
68
+ </table>
69
+ </p>
70
+
71
+ ---
72
+
19
73
  **Kececi Layout (Keçeci Yerleşimi)**: A deterministic graph layout algorithm designed for visualizing linear or sequential structures with a characteristic "zig-zag" or "serpentine" pattern.
20
74
 
21
75
  *Python implementation of the Keçeci layout algorithm for graph visualization.*
@@ -646,15 +700,15 @@ If this library was useful to you in your research, please cite us. Following th
646
700
  ### BibTeX
647
701
 
648
702
  ```bibtex
649
- @misc{kececi_2025_15313947,
703
+ @misc{kececi_2025_15313946,
650
704
  author = {Keçeci, Mehmet},
651
705
  title = {kececilayout},
652
706
  month = may,
653
707
  year = 2025,
654
708
  publisher = {PyPI, Anaconda, Github, Zenodo},
655
709
  version = {0.2.0},
656
- doi = {10.5281/zenodo.15313947},
657
- url = {https://doi.org/10.5281/zenodo.15313947},
710
+ doi = {10.5281/zenodo.15313946},
711
+ url = {https://doi.org/10.5281/zenodo.15313946},
658
712
  }
659
713
 
660
714
  @misc{kececi_2025_15314329,
@@ -671,15 +725,52 @@ If this library was useful to you in your research, please cite us. Following th
671
725
  ### APA
672
726
 
673
727
  ```
674
- Keçeci, M. (2025). kececilayout (0.2.0). PyPI, Anaconda, GitHub, Zenodo. https://doi.org/10.5281/zenodo.15313947
675
728
 
676
- Keçeci, M. (2025). Keçeci Layout. https://doi.org/10.5281/zenodo.15314329
729
+ Keçeci, M. (2025). The Keçeci Layout: A Deterministic Visualisation Framework for the Structural Analysis of Ordered Systems in Chemistry and Environmental Science. Open Science Articles (OSAs), Zenodo. https://doi.org/10.5281/zenodo.16696713
730
+
731
+ Keçeci, M. (2025). The Keçeci Layout: A Deterministic, Order-Preserving Visualization Algorithm for Structured Systems. Open Science Articles (OSAs), Zenodo. https://doi.org/10.5281/zenodo.16526798
732
+
733
+ Keçeci, M. (2025). Keçeci Deterministic Zigzag Layout. WorkflowHub. https://doi.org/10.48546/workflowhub.document.31.1
734
+
735
+ Keçeci, M. (2025). Keçeci Zigzag Layout Algorithm. Authorea. https://doi.org/10.22541/au.175087581.16524538/v1
736
+
737
+ Keçeci, M. (2025). The Keçeci Layout: A Structural Approach for Interdisciplinary Scientific Analysis. Open Science Articles (OSAs), Zenodo. https://doi.org/10.5281/zenodo.15792684
738
+
739
+ Keçeci, M. (2025). When Nodes Have an Order: The Keçeci Layout for Structured System Visualization. HAL open science. https://hal.science/hal-05143155; https://doi.org/10.13140/RG.2.2.19098.76484
740
+
741
+ Keçeci, M. (2025). The Keçeci Layout: A Cross-Disciplinary Graphical Framework for Structural Analysis of Ordered Systems. Authorea. https://doi.org/10.22541/au.175156702.26421899/v1
742
+
743
+ Keçeci, M. (2025). Beyond Traditional Diagrams: The Keçeci Layout for Structural Thinking. Knowledge Commons. https://doi.org/10.17613/v4w94-ak572
744
+
745
+ Keçeci, M. (2025). The Keçeci Layout: A Structural Approach for Interdisciplinary Scientific Analysis. figshare. Journal contribution. https://doi.org/10.6084/m9.figshare.29468135
746
+
747
+ Keçeci, M. (2025, July 3). The Keçeci Layout: A Structural Approach for Interdisciplinary Scientific Analysis. OSF. https://doi.org/10.17605/OSF.IO/9HTG3
748
+
749
+ Keçeci, M. (2025). Beyond Topology: Deterministic and Order-Preserving Graph Visualization with the Keçeci Layout. WorkflowHub. https://doi.org/10.48546/workflowhub.document.34.4
750
+
751
+ Keçeci, M. (2025). A Graph-Theoretic Perspective on the Keçeci Layout: Structuring Cross-Disciplinary Inquiry. Preprints. https://doi.org/10.20944/preprints202507.0589.v1
752
+
753
+ Keçeci, M. (2025). Keçeci Layout. Open Science Articles (OSAs), Zenodo. https://doi.org/10.5281/zenodo.15314328
754
+
755
+ Keçeci, M. (2025). kececilayout [Data set]. WorkflowHub. https://doi.org/10.48546/workflowhub.datafile.17.1
756
+
757
+ Keçeci, M. (2025, May 1). Kececilayout. Open Science Articles (OSAs), Zenodo. https://doi.org/10.5281/zenodo.15313946
758
+
677
759
  ```
678
760
 
679
761
  ### Chicago
680
762
 
681
763
  ```
682
- Keçeci, Mehmet. “Kececilayout”. PyPI, Anaconda, GitHub, Zenodo, 01 May 2025. https://doi.org/10.5281/zenodo.15313947.
683
764
 
684
- Keçeci, Mehmet. Keçeci Layout”, 01 May 2025. https://doi.org/10.5281/zenodo.15314329.
765
+ Keçeci, Mehmet. The Keçeci Layout: A Deterministic Visualisation Framework for the Structural Analysis of Ordered Systems in Chemistry and Environmental Science. Open Science Articles (OSAs), Zenodo, 2025. https://doi.org/10.5281/zenodo.16696713
766
+
767
+ Keçeci, Mehmet. The Keçeci Layout: A Deterministic, Order-Preserving Visualization Algorithm for Structured Systems. Open Science Articles (OSAs), Zenodo, 2025. https://doi.org/10.5281/zenodo.16526798
768
+
769
+ Keçeci, Mehmet. kececilayout [Data set]. WorkflowHub, 2025. https://doi.org/10.48546/workflowhub.datafile.17.1
770
+
771
+ Keçeci, Mehmet. "Kececilayout". Open Science Articles (OSAs), Zenodo, 2025. https://doi.org/10.5281/zenodo.15313946.
772
+
773
+ Keçeci, Mehmet. "Keçeci Layout". Open Science Articles (OSAs), Zenodo, 2025. https://doi.org/10.5281/zenodo.15314329.
685
774
  ```
775
+
776
+
@@ -0,0 +1,76 @@
1
+ # __init__.py
2
+ # Bu dosya paketin başlangıç noktası olarak çalışır.
3
+ # Alt modülleri yükler, sürüm bilgileri tanımlar ve geriye dönük uyumluluk için uyarılar sağlar.
4
+
5
+ from __future__ import annotations
6
+ import importlib
7
+ import warnings
8
+ import os
9
+ # if os.getenv("DEVELOPMENT") == "true":
10
+ # importlib.reload(kececi_layout) # F821 undefined name 'kececi_layout'
11
+
12
+ # Dışa aktarılacak semboller listesi
13
+ __all__ = [
14
+ 'kececi_layout_v4',
15
+ 'kececi_layout',
16
+ 'kececi_layout_v4_nx',
17
+ 'kececi_layout_v4_networkx',
18
+ 'kececi_layout_v4_ig',
19
+ 'kececi_layout_v4_igraph',
20
+ 'kececi_layout_v4_nk',
21
+ 'kececi_layout_v4_networkit',
22
+ 'kececi_layout_v4_gg',
23
+ 'kececi_layout_v4_graphillion',
24
+ 'kececi_layout_v4_rx',
25
+ 'kececi_layout_v4_rustworkx',
26
+ 'generate_random_rx_graph',
27
+ 'kececi_layout_v4_pure',
28
+ 'generate_random_graph',
29
+ 'generate_random_graph_ig'
30
+ ]
31
+
32
+ # Göreli modül içe aktarmaları
33
+ # F401 hatasını önlemek için sadece kullanacağınız şeyleri dışa aktarın
34
+ # Aksi halde linter'lar "imported but unused" uyarısı verir
35
+ try:
36
+ #from .kececi_layout import * # gerekirse burada belirli fonksiyonları seçmeli yapmak daha güvenlidir
37
+ #from . import kececi_layout # Modülün kendisine doğrudan erişim isteniyorsa
38
+ from .kececi_layout import (
39
+ kececi_layout_v4,
40
+ kececi_layout,
41
+ kececi_layout_v4_nx,
42
+ kececi_layout_v4_networkx,
43
+ kececi_layout_v4_ig,
44
+ kececi_layout_v4_igraph,
45
+ kececi_layout_v4_nk,
46
+ kececi_layout_v4_networkit,
47
+ kececi_layout_v4_gg,
48
+ kececi_layout_v4_graphillion,
49
+ kececi_layout_v4_rx,
50
+ kececi_layout_v4_rustworkx,
51
+ generate_random_rx_graph,
52
+ kececi_layout_v4_pure,
53
+ generate_random_graph,
54
+ generate_random_graph_ig
55
+ )
56
+ except ImportError as e:
57
+ warnings.warn(f"Gerekli modül yüklenemedi: {e}", ImportWarning)
58
+
59
+ # Eski bir fonksiyonun yer tutucusu - gelecekte kaldırılacak
60
+ def eski_fonksiyon():
61
+ """
62
+ Kaldırılması planlanan eski bir fonksiyondur.
63
+ Lütfen alternatif fonksiyonları kullanın.
64
+ """
65
+ warnings.warn(
66
+ "eski_fonksiyon() artık kullanılmamaktadır ve gelecekte kaldırılacaktır. "
67
+ "Lütfen yeni alternatif fonksiyonları kullanın. "
68
+ "Keçeci Layout; Python 3.7-3.14 sürümlerinde sorunsuz çalışmalıdır.",
69
+ category=DeprecationWarning,
70
+ stacklevel=2
71
+ )
72
+
73
+ # Paket sürüm numarası
74
+ __version__ = "0.2.5"
75
+
76
+
@@ -1,9 +1,10 @@
1
1
  # _version.py
2
2
 
3
- __version__ = "0.2.2"
3
+ __version__ = "0.2.5"
4
4
  __license__ = "MIT"
5
5
  __description__ = "A deterministic node placement algorithm used in graph visualization. In this layout, nodes are arranged sequentially along a defined primary axis. Each subsequent node is then alternately offset along a secondary, perpendicular axis, typically moving to one side of the primary axis and then the other. Often, the magnitude of this secondary offset increases as nodes progress along the primary axis, creating a characteristic zig-zag or serpentine pattern."
6
6
  __author__ = "Mehmet Keçeci"
7
7
  __url__ = "https://github.com/WhiteSymmetry/kececilayout"
8
8
  __docs__ = "https://github.com/WhiteSymmetry/kececilayout" # Opsiyonel: Dokümantasyon linki
9
9
  __dependencies__ = ["python>=3.9"] # Diğer bağımlılıkları da ekleyebilirsiniz
10
+
@@ -1,4 +1,5 @@
1
1
  # kececilayout/kececi_layout.py
2
+
2
3
  import itertools # Graphillion için eklendi
3
4
  import numpy as np # rustworkx
4
5
  import math
@@ -107,11 +108,16 @@ def kececi_layout_v4(graph, primary_spacing=1.0, secondary_spacing=1.0,
107
108
  else:
108
109
  # Desteklenmeyen tip veya kütüphane kurulu değilse
109
110
  supported_types = []
110
- if nx: supported_types.append("NetworkX")
111
- if rx: supported_types.append("Rustworkx")
112
- if ig: supported_types.append("igraph")
113
- if nk: supported_types.append("Networkit")
114
- if gg: supported_types.append("Graphillion.GraphSet")
111
+ if nx:
112
+ supported_types.append("NetworkX")
113
+ if rx:
114
+ supported_types.append("Rustworkx")
115
+ if ig:
116
+ supported_types.append("igraph")
117
+ if nk:
118
+ supported_types.append("Networkit")
119
+ if gg:
120
+ supported_types.append("Graphillion.GraphSet")
115
121
  raise TypeError(f"Unsupported graph type: {type(graph)}. Desteklenen türler: {', '.join(supported_types)}")
116
122
 
117
123
  # ----- Buradan sonrası tüm kütüphaneler için ortak -----
@@ -140,16 +146,21 @@ def kececi_layout_v4(graph, primary_spacing=1.0, secondary_spacing=1.0,
140
146
 
141
147
  # 1. Ana eksen koordinatını hesapla
142
148
  if primary_direction == 'top-down':
143
- primary_coord = i * -primary_spacing; secondary_axis = 'x'
149
+ primary_coord = i * -primary_spacing;
150
+ secondary_axis = 'x'
144
151
  elif primary_direction == 'bottom-up':
145
- primary_coord = i * primary_spacing; secondary_axis = 'x'
152
+ primary_coord = i * primary_spacing;
153
+ secondary_axis = 'x'
146
154
  elif primary_direction == 'left-to-right':
147
- primary_coord = i * primary_spacing; secondary_axis = 'y'
155
+ primary_coord = i * primary_spacing;
156
+ secondary_axis = 'y'
148
157
  else: # right-to-left
149
- primary_coord = i * -primary_spacing; secondary_axis = 'y'
158
+ primary_coord = i * -primary_spacing;
159
+ secondary_axis = 'y'
150
160
 
151
161
  # 2. Yan eksen ofsetini hesapla (zigzag)
152
- if i == 0: secondary_offset_multiplier = 0.0
162
+ if i == 0:
163
+ secondary_offset_multiplier = 0.0
153
164
  else:
154
165
  start_mult = 1.0 if secondary_start in ['right', 'up'] else -1.0
155
166
  magnitude = math.ceil(i / 2.0)
@@ -158,8 +169,10 @@ def kececi_layout_v4(graph, primary_spacing=1.0, secondary_spacing=1.0,
158
169
  secondary_coord = secondary_offset_multiplier * secondary_spacing
159
170
 
160
171
  # 3. (x, y) koordinatlarını ata
161
- if secondary_axis == 'x': x, y = secondary_coord, primary_coord
162
- else: x, y = primary_coord, secondary_coord
172
+ if secondary_axis == 'x':
173
+ x, y = secondary_coord, primary_coord
174
+ else:
175
+ x, y = primary_coord, secondary_coord
163
176
 
164
177
  # Sonuç sözlüğüne ekle
165
178
  pos[node_id] = (x, y)
@@ -229,11 +242,16 @@ def kececi_layout(graph, primary_spacing=1.0, secondary_spacing=1.0,
229
242
  else:
230
243
  # Desteklenmeyen tip veya kütüphane kurulu değilse
231
244
  supported_types = []
232
- if nx: supported_types.append("NetworkX")
233
- if rx: supported_types.append("Rustworkx")
234
- if ig: supported_types.append("igraph")
235
- if nk: supported_types.append("Networkit")
236
- if gg: supported_types.append("Graphillion.GraphSet")
245
+ if nx:
246
+ supported_types.append("NetworkX")
247
+ if rx:
248
+ supported_types.append("Rustworkx")
249
+ if ig:
250
+ supported_types.append("igraph")
251
+ if nk:
252
+ supported_types.append("Networkit")
253
+ if gg:
254
+ supported_types.append("Graphillion.GraphSet")
237
255
  raise TypeError(f"Unsupported graph type: {type(graph)}. Desteklenen türler: {', '.join(supported_types)}")
238
256
 
239
257
  # ----- Buradan sonrası tüm kütüphaneler için ortak -----
@@ -262,16 +280,21 @@ def kececi_layout(graph, primary_spacing=1.0, secondary_spacing=1.0,
262
280
 
263
281
  # 1. Ana eksen koordinatını hesapla
264
282
  if primary_direction == 'top-down':
265
- primary_coord = i * -primary_spacing; secondary_axis = 'x'
283
+ primary_coord = i * -primary_spacing;
284
+ secondary_axis = 'x'
266
285
  elif primary_direction == 'bottom-up':
267
- primary_coord = i * primary_spacing; secondary_axis = 'x'
286
+ primary_coord = i * primary_spacing;
287
+ secondary_axis = 'x'
268
288
  elif primary_direction == 'left-to-right':
269
- primary_coord = i * primary_spacing; secondary_axis = 'y'
289
+ primary_coord = i * primary_spacing;
290
+ secondary_axis = 'y'
270
291
  else: # right-to-left
271
- primary_coord = i * -primary_spacing; secondary_axis = 'y'
292
+ primary_coord = i * -primary_spacing;
293
+ secondary_axis = 'y'
272
294
 
273
295
  # 2. Yan eksen ofsetini hesapla (zigzag)
274
- if i == 0: secondary_offset_multiplier = 0.0
296
+ if i == 0:
297
+ secondary_offset_multiplier = 0.0
275
298
  else:
276
299
  start_mult = 1.0 if secondary_start in ['right', 'up'] else -1.0
277
300
  magnitude = math.ceil(i / 2.0)
@@ -280,8 +303,10 @@ def kececi_layout(graph, primary_spacing=1.0, secondary_spacing=1.0,
280
303
  secondary_coord = secondary_offset_multiplier * secondary_spacing
281
304
 
282
305
  # 3. (x, y) koordinatlarını ata
283
- if secondary_axis == 'x': x, y = secondary_coord, primary_coord
284
- else: x, y = primary_coord, secondary_coord
306
+ if secondary_axis == 'x':
307
+ x, y = secondary_coord, primary_coord
308
+ else:
309
+ x, y = primary_coord, secondary_coord
285
310
 
286
311
  # Sonuç sözlüğüne ekle
287
312
  pos[node_id] = (x, y)
@@ -298,19 +323,26 @@ def kececi_layout_v4_nx(graph, primary_spacing=1.0, secondary_spacing=1.0,
298
323
  # NetworkX 2.x ve 3.x uyumluluğu için listeye çevirme
299
324
  nodes = sorted(list(graph.nodes()))
300
325
  num_nodes = len(nodes)
301
- if num_nodes == 0: return {}
326
+ if num_nodes == 0:
327
+ return {}
302
328
 
303
329
  is_vertical = primary_direction in ['top-down', 'bottom-up']
304
330
  is_horizontal = primary_direction in ['left-to-right', 'right-to-left']
305
- if not (is_vertical or is_horizontal): raise ValueError(f"Invalid primary_direction: {primary_direction}")
306
- if is_vertical and secondary_start not in ['right', 'left']: raise ValueError(f"Invalid secondary_start for vertical: {secondary_start}")
307
- if is_horizontal and secondary_start not in ['up', 'down']: raise ValueError(f"Invalid secondary_start for horizontal: {secondary_start}")
331
+ if not (is_vertical or is_horizontal):
332
+ raise ValueError(f"Invalid primary_direction: {primary_direction}")
333
+ if is_vertical and secondary_start not in ['right', 'left']:
334
+ raise ValueError(f"Invalid secondary_start for vertical: {secondary_start}")
335
+ if is_horizontal and secondary_start not in ['up', 'down']:
336
+ raise ValueError(f"Invalid secondary_start for horizontal: {secondary_start}")
308
337
 
309
338
  for i, node_id in enumerate(nodes):
310
339
  # 1. Ana Eksen Koordinatını Hesapla
311
- if primary_direction == 'top-down': primary_coord, secondary_axis = i * -primary_spacing, 'x'
312
- elif primary_direction == 'bottom-up': primary_coord, secondary_axis = i * primary_spacing, 'x'
313
- elif primary_direction == 'left-to-right': primary_coord, secondary_axis = i * primary_spacing, 'y'
340
+ if primary_direction == 'top-down':
341
+ primary_coord, secondary_axis = i * -primary_spacing, 'x'
342
+ elif primary_direction == 'bottom-up':
343
+ primary_coord, secondary_axis = i * primary_spacing, 'x'
344
+ elif primary_direction == 'left-to-right':
345
+ primary_coord, secondary_axis = i * primary_spacing, 'y'
314
346
  else: # right-to-left
315
347
  primary_coord, secondary_axis = i * -primary_spacing, 'y'
316
348
 
@@ -344,19 +376,26 @@ def kececi_layout_v4_networkx(graph, primary_spacing=1.0, secondary_spacing=1.0,
344
376
  # NetworkX 2.x ve 3.x uyumluluğu için listeye çevirme
345
377
  nodes = sorted(list(graph.nodes()))
346
378
  num_nodes = len(nodes)
347
- if num_nodes == 0: return {}
379
+ if num_nodes == 0:
380
+ return {}
348
381
 
349
382
  is_vertical = primary_direction in ['top-down', 'bottom-up']
350
383
  is_horizontal = primary_direction in ['left-to-right', 'right-to-left']
351
- if not (is_vertical or is_horizontal): raise ValueError(f"Invalid primary_direction: {primary_direction}")
352
- if is_vertical and secondary_start not in ['right', 'left']: raise ValueError(f"Invalid secondary_start for vertical: {secondary_start}")
353
- if is_horizontal and secondary_start not in ['up', 'down']: raise ValueError(f"Invalid secondary_start for horizontal: {secondary_start}")
384
+ if not (is_vertical or is_horizontal):
385
+ raise ValueError(f"Invalid primary_direction: {primary_direction}")
386
+ if is_vertical and secondary_start not in ['right', 'left']:
387
+ raise ValueError(f"Invalid secondary_start for vertical: {secondary_start}")
388
+ if is_horizontal and secondary_start not in ['up', 'down']:
389
+ raise ValueError(f"Invalid secondary_start for horizontal: {secondary_start}")
354
390
 
355
391
  for i, node_id in enumerate(nodes):
356
392
  # 1. Ana Eksen Koordinatını Hesapla
357
- if primary_direction == 'top-down': primary_coord, secondary_axis = i * -primary_spacing, 'x'
358
- elif primary_direction == 'bottom-up': primary_coord, secondary_axis = i * primary_spacing, 'x'
359
- elif primary_direction == 'left-to-right': primary_coord, secondary_axis = i * primary_spacing, 'y'
393
+ if primary_direction == 'top-down':
394
+ primary_coord, secondary_axis = i * -primary_spacing, 'x'
395
+ elif primary_direction == 'bottom-up':
396
+ primary_coord, secondary_axis = i * primary_spacing, 'x'
397
+ elif primary_direction == 'left-to-right':
398
+ primary_coord, secondary_axis = i * primary_spacing, 'y'
360
399
  else: # right-to-left
361
400
  primary_coord, secondary_axis = i * -primary_spacing, 'y'
362
401
 
@@ -740,15 +779,20 @@ def kececi_layout_v4_gg(graph_set: gg.GraphSet,
740
779
  for i, node_id in enumerate(nodes):
741
780
  # ... (Koordinat hesaplama kısmı aynı kalır) ...
742
781
  if primary_direction == 'top-down':
743
- primary_coord = i * -primary_spacing; secondary_axis = 'x'
782
+ primary_coord = i * -primary_spacing;
783
+ secondary_axis = 'x'
744
784
  elif primary_direction == 'bottom-up':
745
- primary_coord = i * primary_spacing; secondary_axis = 'x'
785
+ primary_coord = i * primary_spacing;
786
+ secondary_axis = 'x'
746
787
  elif primary_direction == 'left-to-right':
747
- primary_coord = i * primary_spacing; secondary_axis = 'y'
788
+ primary_coord = i * primary_spacing;
789
+ secondary_axis = 'y'
748
790
  else: # right-to-left
749
- primary_coord = i * -primary_spacing; secondary_axis = 'y'
791
+ primary_coord = i * -primary_spacing;
792
+ secondary_axis = 'y'
750
793
 
751
- if i == 0: secondary_offset_multiplier = 0.0
794
+ if i == 0:
795
+ secondary_offset_multiplier = 0.0
752
796
  else:
753
797
  start_mult = 1.0 if secondary_start in ['right', 'up'] else -1.0
754
798
  magnitude = math.ceil(i / 2.0)
@@ -756,8 +800,10 @@ def kececi_layout_v4_gg(graph_set: gg.GraphSet,
756
800
  secondary_offset_multiplier = start_mult * magnitude * side
757
801
  secondary_coord = secondary_offset_multiplier * secondary_spacing
758
802
 
759
- if secondary_axis == 'x': x, y = secondary_coord, primary_coord
760
- else: x, y = primary_coord, secondary_coord
803
+ if secondary_axis == 'x':
804
+ x, y = secondary_coord, primary_coord
805
+ else:
806
+ x, y = primary_coord, secondary_coord
761
807
  pos[node_id] = (x, y)
762
808
 
763
809
  return pos
@@ -801,15 +847,20 @@ def kececi_layout_v4_graphillion(graph_set: gg.GraphSet,
801
847
  for i, node_id in enumerate(nodes):
802
848
  # ... (Koordinat hesaplama kısmı aynı kalır) ...
803
849
  if primary_direction == 'top-down':
804
- primary_coord = i * -primary_spacing; secondary_axis = 'x'
850
+ primary_coord = i * -primary_spacing;
851
+ secondary_axis = 'x'
805
852
  elif primary_direction == 'bottom-up':
806
- primary_coord = i * primary_spacing; secondary_axis = 'x'
853
+ primary_coord = i * primary_spacing;
854
+ secondary_axis = 'x'
807
855
  elif primary_direction == 'left-to-right':
808
- primary_coord = i * primary_spacing; secondary_axis = 'y'
856
+ primary_coord = i * primary_spacing;
857
+ secondary_axis = 'y'
809
858
  else: # right-to-left
810
- primary_coord = i * -primary_spacing; secondary_axis = 'y'
859
+ primary_coord = i * -primary_spacing;
860
+ secondary_axis = 'y'
811
861
 
812
- if i == 0: secondary_offset_multiplier = 0.0
862
+ if i == 0:
863
+ secondary_offset_multiplier = 0.0
813
864
  else:
814
865
  start_mult = 1.0 if secondary_start in ['right', 'up'] else -1.0
815
866
  magnitude = math.ceil(i / 2.0)
@@ -817,32 +868,44 @@ def kececi_layout_v4_graphillion(graph_set: gg.GraphSet,
817
868
  secondary_offset_multiplier = start_mult * magnitude * side
818
869
  secondary_coord = secondary_offset_multiplier * secondary_spacing
819
870
 
820
- if secondary_axis == 'x': x, y = secondary_coord, primary_coord
821
- else: x, y = primary_coord, secondary_coord
871
+ if secondary_axis == 'x':
872
+ x, y = secondary_coord, primary_coord
873
+ else:
874
+ x, y = primary_coord, secondary_coord
822
875
  pos[node_id] = (x, y)
823
876
 
824
877
  return pos
825
878
 
826
- def kececi_layout_v4_rx(graph: rx.PyGraph, primary_spacing=1.0, secondary_spacing=1.0,
879
+ def kececi_layout_v4_rx(graph:
880
+ rx.PyGraph, primary_spacing=1.0, secondary_spacing=1.0,
827
881
  primary_direction='top-down', secondary_start='right'):
828
882
  pos = {}
829
883
  nodes = sorted(graph.node_indices())
830
884
  num_nodes = len(nodes)
831
- if num_nodes == 0: return {}
885
+ if num_nodes == 0:
886
+ return {}
832
887
 
833
888
  is_vertical = primary_direction in ['top-down', 'bottom-up']
834
889
  is_horizontal = primary_direction in ['left-to-right', 'right-to-left']
835
- if not (is_vertical or is_horizontal): raise ValueError(f"Invalid primary_direction: {primary_direction}")
836
- if is_vertical and secondary_start not in ['right', 'left']: raise ValueError(f"Invalid secondary_start for vertical: {secondary_start}")
837
- if is_horizontal and secondary_start not in ['up', 'down']: raise ValueError(f"Invalid secondary_start for horizontal: {secondary_start}")
890
+ if not (is_vertical or is_horizontal):
891
+ raise ValueError(f"Invalid primary_direction: {primary_direction}")
892
+ if is_vertical and secondary_start not in ['right', 'left']:
893
+ raise ValueError(f"Invalid secondary_start for vertical: {secondary_start}")
894
+ if is_horizontal and secondary_start not in ['up', 'down']:
895
+ raise ValueError(f"Invalid secondary_start for horizontal: {secondary_start}")
838
896
 
839
897
  for i, node_index in enumerate(nodes):
840
- if primary_direction == 'top-down': primary_coord, secondary_axis = i * -primary_spacing, 'x'
841
- elif primary_direction == 'bottom-up': primary_coord, secondary_axis = i * primary_spacing, 'x'
842
- elif primary_direction == 'left-to-right': primary_coord, secondary_axis = i * primary_spacing, 'y'
843
- else: primary_coord, secondary_axis = i * -primary_spacing, 'y'
898
+ if primary_direction == 'top-down':
899
+ primary_coord, secondary_axis = i * -primary_spacing, 'x'
900
+ elif primary_direction == 'bottom-up':
901
+ primary_coord, secondary_axis = i * primary_spacing, 'x'
902
+ elif primary_direction == 'left-to-right':
903
+ primary_coord, secondary_axis = i * primary_spacing, 'y'
904
+ else:
905
+ primary_coord, secondary_axis = i * -primary_spacing, 'y'
844
906
 
845
- if i == 0: secondary_offset_multiplier = 0.0
907
+ if i == 0:
908
+ secondary_offset_multiplier = 0.0
846
909
  else:
847
910
  start_mult = 1.0 if secondary_start in ['right', 'up'] else -1.0
848
911
  magnitude = math.ceil(i / 2.0)
@@ -854,26 +917,36 @@ def kececi_layout_v4_rx(graph: rx.PyGraph, primary_spacing=1.0, secondary_spacin
854
917
  pos[node_index] = np.array([x, y])
855
918
  return pos
856
919
 
857
- def kececi_layout_v4_rustworkx(graph: rx.PyGraph, primary_spacing=1.0, secondary_spacing=1.0,
920
+ def kececi_layout_v4_rustworkx(graph:
921
+ rx.PyGraph, primary_spacing=1.0, secondary_spacing=1.0,
858
922
  primary_direction='top-down', secondary_start='right'):
859
923
  pos = {}
860
924
  nodes = sorted(graph.node_indices())
861
925
  num_nodes = len(nodes)
862
- if num_nodes == 0: return {}
926
+ if num_nodes == 0:
927
+ return {}
863
928
 
864
929
  is_vertical = primary_direction in ['top-down', 'bottom-up']
865
930
  is_horizontal = primary_direction in ['left-to-right', 'right-to-left']
866
- if not (is_vertical or is_horizontal): raise ValueError(f"Invalid primary_direction: {primary_direction}")
867
- if is_vertical and secondary_start not in ['right', 'left']: raise ValueError(f"Invalid secondary_start for vertical: {secondary_start}")
868
- if is_horizontal and secondary_start not in ['up', 'down']: raise ValueError(f"Invalid secondary_start for horizontal: {secondary_start}")
931
+ if not (is_vertical or is_horizontal):
932
+ raise ValueError(f"Invalid primary_direction: {primary_direction}")
933
+ if is_vertical and secondary_start not in ['right', 'left']:
934
+ raise ValueError(f"Invalid secondary_start for vertical: {secondary_start}")
935
+ if is_horizontal and secondary_start not in ['up', 'down']:
936
+ raise ValueError(f"Invalid secondary_start for horizontal: {secondary_start}")
869
937
 
870
938
  for i, node_index in enumerate(nodes):
871
- if primary_direction == 'top-down': primary_coord, secondary_axis = i * -primary_spacing, 'x'
872
- elif primary_direction == 'bottom-up': primary_coord, secondary_axis = i * primary_spacing, 'x'
873
- elif primary_direction == 'left-to-right': primary_coord, secondary_axis = i * primary_spacing, 'y'
874
- else: primary_coord, secondary_axis = i * -primary_spacing, 'y'
939
+ if primary_direction == 'top-down':
940
+ primary_coord, secondary_axis = i * -primary_spacing, 'x'
941
+ elif primary_direction == 'bottom-up':
942
+ primary_coord, secondary_axis = i * primary_spacing, 'x'
943
+ elif primary_direction == 'left-to-right':
944
+ primary_coord, secondary_axis = i * primary_spacing, 'y'
945
+ else:
946
+ primary_coord, secondary_axis = i * -primary_spacing, 'y'
875
947
 
876
- if i == 0: secondary_offset_multiplier = 0.0
948
+ if i == 0:
949
+ secondary_offset_multiplier = 0.0
877
950
  else:
878
951
  start_mult = 1.0 if secondary_start in ['right', 'up'] else -1.0
879
952
  magnitude = math.ceil(i / 2.0)
@@ -889,8 +962,10 @@ def kececi_layout_v4_rustworkx(graph: rx.PyGraph, primary_spacing=1.0, secondary
889
962
  # Rastgele Graf Oluşturma Fonksiyonu (Rustworkx ile - Düzeltilmiş subgraph)
890
963
  # =============================================================================
891
964
  def generate_random_rx_graph(min_nodes=5, max_nodes=15, edge_prob_min=0.15, edge_prob_max=0.4):
892
- if min_nodes < 2: min_nodes = 2
893
- if max_nodes < min_nodes: max_nodes = min_nodes
965
+ if min_nodes < 2:
966
+ min_nodes = 2
967
+ if max_nodes < min_nodes:
968
+ max_nodes = min_nodes
894
969
  while True:
895
970
  num_nodes_target = random.randint(min_nodes, max_nodes)
896
971
  edge_probability = random.uniform(edge_prob_min, edge_prob_max)
@@ -901,22 +976,29 @@ def generate_random_rx_graph(min_nodes=5, max_nodes=15, edge_prob_min=0.15, edge
901
976
  if random.random() < edge_probability:
902
977
  G_candidate.add_edge(node_indices[i], node_indices[j], None)
903
978
 
904
- if G_candidate.num_nodes() == 0: continue
905
- if num_nodes_target > 1 and G_candidate.num_edges() == 0: continue
979
+ if G_candidate.num_nodes() == 0:
980
+ continue
981
+ if num_nodes_target > 1 and G_candidate.num_edges() == 0:
982
+ continue
906
983
 
907
984
  if not rx.is_connected(G_candidate):
908
985
  components = rx.connected_components(G_candidate)
909
- if not components: continue
986
+ if not components:
987
+ continue
910
988
  largest_cc_nodes_indices = max(components, key=len, default=set())
911
- if len(largest_cc_nodes_indices) < 2 and num_nodes_target >=2 : continue
912
- if not largest_cc_nodes_indices: continue
989
+ if len(largest_cc_nodes_indices) < 2 and num_nodes_target >=2 :
990
+ continue
991
+ if not largest_cc_nodes_indices:
992
+ continue
913
993
  # Set'i listeye çevirerek subgraph oluştur
914
994
  G = G_candidate.subgraph(list(largest_cc_nodes_indices))
915
- if G.num_nodes() == 0: continue
995
+ if G.num_nodes() == 0:
996
+ continue
916
997
  else:
917
998
  G = G_candidate
918
999
 
919
- if G.num_nodes() >= 2: break
1000
+ if G.num_nodes() >= 2:
1001
+ break
920
1002
  print(f"Oluşturulan Rustworkx Graf: {G.num_nodes()} Düğüm, {G.num_edges()} Kenar (Başlangıç p={edge_probability:.3f})")
921
1003
  return G
922
1004
 
@@ -938,20 +1020,28 @@ def kececi_layout_v4_pure(nodes, primary_spacing=1.0, secondary_spacing=1.0,
938
1020
  sorted_nodes = list(nodes)
939
1021
 
940
1022
  num_nodes = len(sorted_nodes)
941
- if num_nodes == 0: return {}
1023
+ if num_nodes == 0:
1024
+ return {}
942
1025
  is_vertical = primary_direction in ['top-down', 'bottom-up']
943
1026
  is_horizontal = primary_direction in ['left-to-right', 'right-to-left']
944
- if not (is_vertical or is_horizontal): raise ValueError(f"Invalid primary_direction: {primary_direction}")
945
- if is_vertical and secondary_start not in ['right', 'left']: raise ValueError(f"Dikey yön için geçersiz secondary_start: {secondary_start}")
946
- if is_horizontal and secondary_start not in ['up', 'down']: raise ValueError(f"Yatay yön için geçersiz secondary_start: {secondary_start}")
1027
+ if not (is_vertical or is_horizontal):
1028
+ raise ValueError(f"Invalid primary_direction: {primary_direction}")
1029
+ if is_vertical and secondary_start not in ['right', 'left']:
1030
+ raise ValueError(f"Dikey yön için geçersiz secondary_start: {secondary_start}")
1031
+ if is_horizontal and secondary_start not in ['up', 'down']:
1032
+ raise ValueError(f"Yatay yön için geçersiz secondary_start: {secondary_start}")
947
1033
 
948
1034
  for i, node_id in enumerate(sorted_nodes):
949
1035
  primary_coord = 0.0
950
1036
  secondary_axis = ''
951
- if primary_direction == 'top-down': primary_coord, secondary_axis = i * -primary_spacing, 'x'
952
- elif primary_direction == 'bottom-up': primary_coord, secondary_axis = i * primary_spacing, 'x'
953
- elif primary_direction == 'left-to-right': primary_coord, secondary_axis = i * primary_spacing, 'y'
954
- else: primary_coord, secondary_axis = i * -primary_spacing, 'y'
1037
+ if primary_direction == 'top-down':
1038
+ primary_coord, secondary_axis = i * -primary_spacing, 'x'
1039
+ elif primary_direction == 'bottom-up':
1040
+ primary_coord, secondary_axis = i * primary_spacing, 'x'
1041
+ elif primary_direction == 'left-to-right':
1042
+ primary_coord, secondary_axis = i * primary_spacing, 'y'
1043
+ else:
1044
+ primary_coord, secondary_axis = i * -primary_spacing, 'y'
955
1045
 
956
1046
  secondary_offset_multiplier = 0.0
957
1047
  if i > 0:
@@ -970,27 +1060,37 @@ def kececi_layout_v4_pure(nodes, primary_spacing=1.0, secondary_spacing=1.0,
970
1060
  # =============================================================================
971
1061
  def generate_random_graph(min_nodes=0, max_nodes=200, edge_prob_min=0.15, edge_prob_max=0.4):
972
1062
 
973
- if min_nodes < 2: min_nodes = 2
974
- if max_nodes < min_nodes: max_nodes = min_nodes
1063
+ if min_nodes < 2:
1064
+ min_nodes = 2
1065
+ if max_nodes < min_nodes:
1066
+ max_nodes = min_nodes
975
1067
  while True:
976
1068
  num_nodes_target = random.randint(min_nodes, max_nodes)
977
1069
  edge_probability = random.uniform(edge_prob_min, edge_prob_max)
978
1070
  G_candidate = nx.gnp_random_graph(num_nodes_target, edge_probability, seed=None)
979
- if G_candidate.number_of_nodes() == 0: continue
1071
+ if G_candidate.number_of_nodes() == 0:
1072
+ continue
980
1073
  # Düzeltme: 0 kenarlı ama >1 düğümlü grafı da tekrar dene
981
- if num_nodes_target > 1 and G_candidate.number_of_edges() == 0 : continue
1074
+ if num_nodes_target > 1 and G_candidate.number_of_edges() == 0 :
1075
+ continue
982
1076
 
983
1077
  if not nx.is_connected(G_candidate):
984
1078
  # Düzeltme: default=set() kullanmak yerine önce kontrol et
985
1079
  connected_components = list(nx.connected_components(G_candidate))
986
- if not connected_components: continue # Bileşen yoksa tekrar dene
1080
+ if not connected_components:
1081
+ continue # Bileşen yoksa tekrar dene
987
1082
  largest_cc_nodes = max(connected_components, key=len)
988
- if len(largest_cc_nodes) < 2 and num_nodes_target >=2 : continue
989
- if not largest_cc_nodes: continue # Bu aslında gereksiz ama garanti olsun
1083
+ if len(largest_cc_nodes) < 2 and num_nodes_target >=2 :
1084
+ continue
1085
+ if not largest_cc_nodes:
1086
+ continue # Bu aslında gereksiz ama garanti olsun
990
1087
  G = G_candidate.subgraph(largest_cc_nodes).copy()
991
- if G.number_of_nodes() == 0: continue
992
- else: G = G_candidate
993
- if G.number_of_nodes() >= 2: break
1088
+ if G.number_of_nodes() == 0:
1089
+ continue
1090
+ else:
1091
+ G = G_candidate
1092
+ if G.number_of_nodes() >= 2:
1093
+ break
994
1094
  G = nx.convert_node_labels_to_integers(G, first_label=0)
995
1095
  print(f"Oluşturulan Graf: {G.number_of_nodes()} Düğüm, {G.number_of_edges()} Kenar (Başlangıç p={edge_probability:.3f})")
996
1096
  return G
@@ -998,24 +1098,36 @@ def generate_random_graph(min_nodes=0, max_nodes=200, edge_prob_min=0.15, edge_p
998
1098
  def generate_random_graph_ig(min_nodes=0, max_nodes=200, edge_prob_min=0.15, edge_prob_max=0.4):
999
1099
  """igraph kullanarak rastgele bağlı bir graf oluşturur."""
1000
1100
 
1001
- if min_nodes < 2: min_nodes = 2
1002
- if max_nodes < min_nodes: max_nodes = min_nodes
1101
+ if min_nodes < 2:
1102
+ min_nodes = 2
1103
+ if max_nodes < min_nodes:
1104
+ max_nodes = min_nodes
1003
1105
  while True:
1004
1106
  num_nodes_target = random.randint(min_nodes, max_nodes)
1005
1107
  edge_probability = random.uniform(edge_prob_min, edge_prob_max)
1006
1108
  g_candidate = ig.Graph.Erdos_Renyi(n=num_nodes_target, p=edge_probability, directed=False)
1007
- if g_candidate.vcount() == 0: continue
1008
- if num_nodes_target > 1 and g_candidate.ecount() == 0 : continue
1109
+ if g_candidate.vcount() == 0:
1110
+ continue
1111
+ if num_nodes_target > 1 and g_candidate.ecount() == 0 :
1112
+ continue
1009
1113
  if not g_candidate.is_connected(mode='weak'):
1010
1114
  components = g_candidate.components(mode='weak')
1011
- if not components or len(components) == 0: continue
1115
+ if not components or len(components) == 0:
1116
+ continue
1012
1117
  largest_cc_subgraph = components.giant()
1013
- if largest_cc_subgraph.vcount() < 2 and num_nodes_target >=2 : continue
1118
+ if largest_cc_subgraph.vcount() < 2 and num_nodes_target >=2 :
1119
+ continue
1014
1120
  g = largest_cc_subgraph
1015
- if g.vcount() == 0: continue
1016
- else: g = g_candidate
1017
- if g.vcount() >= 2: break
1121
+ if g.vcount() == 0:
1122
+ continue
1123
+ else:
1124
+ g = g_candidate
1125
+ if g.vcount() >= 2:
1126
+ break
1018
1127
  print(f"Oluşturulan igraph Graf: {g.vcount()} Düğüm, {g.ecount()} Kenar (Başlangıç p={edge_probability:.3f})")
1019
1128
  g.vs["label"] = [str(i) for i in range(g.vcount())]
1020
1129
  g.vs["degree"] = g.degree()
1021
1130
  return g
1131
+
1132
+
1133
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kececilayout
3
- Version: 0.2.3
3
+ Version: 0.2.5
4
4
  Summary: A deterministic node placement algorithm used in graph visualization. In this layout, nodes are arranged sequentially along a defined primary axis. Each subsequent node is then alternately offset along a secondary, perpendicular axis, typically moving to one side of the primary axis and then the other. Often, the magnitude of this secondary offset increases as nodes progress along the primary axis, creating a characteristic zig-zag or serpentine pattern.
5
5
  Home-page: https://github.com/WhiteSymmetry/kececilayout
6
6
  Author: Mehmet Keçeci
@@ -41,8 +41,11 @@ Dynamic: summary
41
41
  [![PyPI version](https://badge.fury.io/py/kececilayout.svg)](https://badge.fury.io/py/kececilayout)
42
42
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
43
43
 
44
- [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.15313947.svg)](https://doi.org/10.5281/zenodo.15313947)
44
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.15313946.svg)](https://doi.org/10.5281/zenodo.15313946)
45
45
  [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.15314329.svg)](https://doi.org/10.5281/zenodo.15314329)
46
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.15353535.svg)](https://doi.org/10.5281/zenodo.15353535)
47
+
48
+ [![WorkflowHub DOI](https://img.shields.io/badge/DOI-10.48546%2Fworkflowhub.datafile.17.1-blue)](https://doi.org/10.48546/workflowhub.datafile.17.1)
46
49
 
47
50
  [![Anaconda-Server Badge](https://anaconda.org/bilgi/kececilayout/badges/version.svg)](https://anaconda.org/bilgi/kececilayout)
48
51
  [![Anaconda-Server Badge](https://anaconda.org/bilgi/kececilayout/badges/latest_release_date.svg)](https://anaconda.org/bilgi/kececilayout)
@@ -50,10 +53,61 @@ Dynamic: summary
50
53
  [![Anaconda-Server Badge](https://anaconda.org/bilgi/kececilayout/badges/license.svg)](https://anaconda.org/bilgi/kececilayout)
51
54
 
52
55
  [![Open Source](https://img.shields.io/badge/Open%20Source-Open%20Source-brightgreen.svg)](https://opensource.org/)
53
- [![Documentation Status](https://app.readthedocs.org/projects/kececilayout/badge/?0.2.1=main)](https://kececilayout.readthedocs.io/en/main/?badge=main)
56
+ [![Documentation Status](https://app.readthedocs.org/projects/kececilayout/badge/?0.2.3=main)](https://kececilayout.readthedocs.io/en/latest)
54
57
 
55
58
  [![OpenSSF Best Practices](https://www.bestpractices.dev/projects/10531/badge)](https://www.bestpractices.dev/projects/10531)
56
59
 
60
+ [![Python CI](https://github.com/WhiteSymmetry/kececilayout/actions/workflows/python_ci.yml/badge.svg?branch=main)](https://github.com/WhiteSymmetry/kececilayout/actions/workflows/python_ci.yml)
61
+ [![codecov](https://codecov.io/gh/WhiteSymmetry/kececilayout/graph/badge.svg?token=1SDH8E9RAJ)](https://codecov.io/gh/WhiteSymmetry/kececilayout)
62
+ [![Documentation Status](https://readthedocs.org/projects/kececilayout/badge/?version=latest)](https://kececilayout.readthedocs.io/en/latest/)
63
+ [![Binder](https://terrarium.evidencepub.io/badge_logo.svg)](https://terrarium.evidencepub.io/v2/gh/WhiteSymmetry/kececilayout/HEAD)
64
+ [![PyPI version](https://badge.fury.io/py/kececilayout.svg)](https://badge.fury.io/py/kececilayout)
65
+ [![PyPI Downloads](https://static.pepy.tech/badge/kececilayout)](https://pepy.tech/projects/kececilayout)
66
+ [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md)
67
+ [![CI/CD](https://github.com/WhiteSymmetry/kececilayout/actions/workflows/ci-cd.yml/badge.svg)](https://github.com/WhiteSymmetry/kececilayout/actions/workflows/ci-cd.yml)
68
+ [![Linted with Ruff](https://img.shields.io/badge/Linted%20with-Ruff-green?logo=python&logoColor=white)](https://github.com/astral-sh/ruff)
69
+
70
+ ---
71
+
72
+ <p align="left">
73
+ <table>
74
+ <tr>
75
+ <td style="text-align: center;">PyPI</td>
76
+ <td style="text-align: center;">
77
+ <a href="https://pypi.org/project/kececilayout/">
78
+ <img src="https://badge.fury.io/py/kececilayout.svg" alt="PyPI version" height="18"/>
79
+ </a>
80
+ </td>
81
+ </tr>
82
+ <tr>
83
+ <td style="text-align: center;">Conda</td>
84
+ <td style="text-align: center;">
85
+ <a href="https://anaconda.org/bilgi/kececilayout">
86
+ <img src="https://anaconda.org/bilgi/kececilayout/badges/version.svg" alt="conda-forge version" height="18"/>
87
+ </a>
88
+ </td>
89
+ </tr>
90
+ <tr>
91
+ <td style="text-align: center;">DOI</td>
92
+ <td style="text-align: center;">
93
+ <a href="https://doi.org/10.5281/zenodo.15313946">
94
+ <img src="https://zenodo.org/badge/DOI/10.5281/zenodo.15313946.svg" alt="DOI" height="18"/>
95
+ </a>
96
+ </td>
97
+ </tr>
98
+ <tr>
99
+ <td style="text-align: center;">License: MIT</td>
100
+ <td style="text-align: center;">
101
+ <a href="https://opensource.org/licenses/MIT">
102
+ <img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License" height="18"/>
103
+ </a>
104
+ </td>
105
+ </tr>
106
+ </table>
107
+ </p>
108
+
109
+ ---
110
+
57
111
  **Kececi Layout (Keçeci Yerleşimi)**: A deterministic graph layout algorithm designed for visualizing linear or sequential structures with a characteristic "zig-zag" or "serpentine" pattern.
58
112
 
59
113
  *Python implementation of the Keçeci layout algorithm for graph visualization.*
@@ -684,15 +738,15 @@ If this library was useful to you in your research, please cite us. Following th
684
738
  ### BibTeX
685
739
 
686
740
  ```bibtex
687
- @misc{kececi_2025_15313947,
741
+ @misc{kececi_2025_15313946,
688
742
  author = {Keçeci, Mehmet},
689
743
  title = {kececilayout},
690
744
  month = may,
691
745
  year = 2025,
692
746
  publisher = {PyPI, Anaconda, Github, Zenodo},
693
747
  version = {0.2.0},
694
- doi = {10.5281/zenodo.15313947},
695
- url = {https://doi.org/10.5281/zenodo.15313947},
748
+ doi = {10.5281/zenodo.15313946},
749
+ url = {https://doi.org/10.5281/zenodo.15313946},
696
750
  }
697
751
 
698
752
  @misc{kececi_2025_15314329,
@@ -709,15 +763,52 @@ If this library was useful to you in your research, please cite us. Following th
709
763
  ### APA
710
764
 
711
765
  ```
712
- Keçeci, M. (2025). kececilayout (0.2.0). PyPI, Anaconda, GitHub, Zenodo. https://doi.org/10.5281/zenodo.15313947
713
766
 
714
- Keçeci, M. (2025). Keçeci Layout. https://doi.org/10.5281/zenodo.15314329
767
+ Keçeci, M. (2025). The Keçeci Layout: A Deterministic Visualisation Framework for the Structural Analysis of Ordered Systems in Chemistry and Environmental Science. Open Science Articles (OSAs), Zenodo. https://doi.org/10.5281/zenodo.16696713
768
+
769
+ Keçeci, M. (2025). The Keçeci Layout: A Deterministic, Order-Preserving Visualization Algorithm for Structured Systems. Open Science Articles (OSAs), Zenodo. https://doi.org/10.5281/zenodo.16526798
770
+
771
+ Keçeci, M. (2025). Keçeci Deterministic Zigzag Layout. WorkflowHub. https://doi.org/10.48546/workflowhub.document.31.1
772
+
773
+ Keçeci, M. (2025). Keçeci Zigzag Layout Algorithm. Authorea. https://doi.org/10.22541/au.175087581.16524538/v1
774
+
775
+ Keçeci, M. (2025). The Keçeci Layout: A Structural Approach for Interdisciplinary Scientific Analysis. Open Science Articles (OSAs), Zenodo. https://doi.org/10.5281/zenodo.15792684
776
+
777
+ Keçeci, M. (2025). When Nodes Have an Order: The Keçeci Layout for Structured System Visualization. HAL open science. https://hal.science/hal-05143155; https://doi.org/10.13140/RG.2.2.19098.76484
778
+
779
+ Keçeci, M. (2025). The Keçeci Layout: A Cross-Disciplinary Graphical Framework for Structural Analysis of Ordered Systems. Authorea. https://doi.org/10.22541/au.175156702.26421899/v1
780
+
781
+ Keçeci, M. (2025). Beyond Traditional Diagrams: The Keçeci Layout for Structural Thinking. Knowledge Commons. https://doi.org/10.17613/v4w94-ak572
782
+
783
+ Keçeci, M. (2025). The Keçeci Layout: A Structural Approach for Interdisciplinary Scientific Analysis. figshare. Journal contribution. https://doi.org/10.6084/m9.figshare.29468135
784
+
785
+ Keçeci, M. (2025, July 3). The Keçeci Layout: A Structural Approach for Interdisciplinary Scientific Analysis. OSF. https://doi.org/10.17605/OSF.IO/9HTG3
786
+
787
+ Keçeci, M. (2025). Beyond Topology: Deterministic and Order-Preserving Graph Visualization with the Keçeci Layout. WorkflowHub. https://doi.org/10.48546/workflowhub.document.34.4
788
+
789
+ Keçeci, M. (2025). A Graph-Theoretic Perspective on the Keçeci Layout: Structuring Cross-Disciplinary Inquiry. Preprints. https://doi.org/10.20944/preprints202507.0589.v1
790
+
791
+ Keçeci, M. (2025). Keçeci Layout. Open Science Articles (OSAs), Zenodo. https://doi.org/10.5281/zenodo.15314328
792
+
793
+ Keçeci, M. (2025). kececilayout [Data set]. WorkflowHub. https://doi.org/10.48546/workflowhub.datafile.17.1
794
+
795
+ Keçeci, M. (2025, May 1). Kececilayout. Open Science Articles (OSAs), Zenodo. https://doi.org/10.5281/zenodo.15313946
796
+
715
797
  ```
716
798
 
717
799
  ### Chicago
718
800
 
719
801
  ```
720
- Keçeci, Mehmet. “Kececilayout”. PyPI, Anaconda, GitHub, Zenodo, 01 May 2025. https://doi.org/10.5281/zenodo.15313947.
721
802
 
722
- Keçeci, Mehmet. Keçeci Layout”, 01 May 2025. https://doi.org/10.5281/zenodo.15314329.
803
+ Keçeci, Mehmet. The Keçeci Layout: A Deterministic Visualisation Framework for the Structural Analysis of Ordered Systems in Chemistry and Environmental Science. Open Science Articles (OSAs), Zenodo, 2025. https://doi.org/10.5281/zenodo.16696713
804
+
805
+ Keçeci, Mehmet. The Keçeci Layout: A Deterministic, Order-Preserving Visualization Algorithm for Structured Systems. Open Science Articles (OSAs), Zenodo, 2025. https://doi.org/10.5281/zenodo.16526798
806
+
807
+ Keçeci, Mehmet. kececilayout [Data set]. WorkflowHub, 2025. https://doi.org/10.48546/workflowhub.datafile.17.1
808
+
809
+ Keçeci, Mehmet. "Kececilayout". Open Science Articles (OSAs), Zenodo, 2025. https://doi.org/10.5281/zenodo.15313946.
810
+
811
+ Keçeci, Mehmet. "Keçeci Layout". Open Science Articles (OSAs), Zenodo, 2025. https://doi.org/10.5281/zenodo.15314329.
723
812
  ```
813
+
814
+
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
 
3
3
  setup(
4
4
  name="kececilayout",
5
- version="0.2.3",
5
+ version="0.2.5",
6
6
  description="A deterministic node placement algorithm used in graph visualization. In this layout, nodes are arranged sequentially along a defined primary axis. Each subsequent node is then alternately offset along a secondary, perpendicular axis, typically moving to one side of the primary axis and then the other. Often, the magnitude of this secondary offset increases as nodes progress along the primary axis, creating a characteristic zig-zag or serpentine pattern.",
7
7
  long_description=open("README.md").read(),
8
8
  long_description_content_type="text/markdown",
@@ -20,7 +20,7 @@ setup(
20
20
  "networkit",
21
21
  "graphillion",
22
22
  "pycairo" ,
23
- "cairocffi",
23
+ "cairocffi"
24
24
  ],
25
25
  extras_require={
26
26
 
@@ -28,8 +28,9 @@ setup(
28
28
  classifiers=[
29
29
  "Programming Language :: Python :: 3",
30
30
  "License :: OSI Approved :: MIT License",
31
- "Operating System :: OS Independent",
31
+ "Operating System :: OS Independent"
32
32
  ],
33
33
  python_requires='>=3.9',
34
34
  license="MIT",
35
35
  )
36
+
@@ -0,0 +1,17 @@
1
+ def test_placeholder():
2
+ assert True
3
+
4
+ def add_numbers(a, b):
5
+ return a + b
6
+
7
+ def test_add_numbers():
8
+ result = add_numbers(2, 3)
9
+ assert result == 5, f"Expected 5, but got {result}"
10
+
11
+ result2 = add_numbers(-1, 4)
12
+ assert result2 == 3, f"Expected 3, but got {result2}"
13
+
14
+ result3 = add_numbers(0, 0)
15
+ assert result3 == 0, f"Expected 0, but got {result3}"
16
+
17
+ test_add_numbers()
@@ -1,37 +0,0 @@
1
- # __init__.py
2
- # Bu dosya paketin başlangıç noktası olarak çalışır.
3
- # Alt modülleri yükler, sürüm bilgileri tanımlar ve geriye dönük uyumluluk için uyarılar sağlar.
4
-
5
- from __future__ import annotations
6
- import importlib
7
- import warnings
8
- import os
9
- # if os.getenv("DEVELOPMENT") == "true":
10
- # importlib.reload(kececi_layout) # F821 undefined name 'kececi_layout'
11
-
12
- # Göreli modül içe aktarmaları
13
- # F401 hatasını önlemek için sadece kullanacağınız şeyleri dışa aktarın
14
- # Aksi halde linter'lar "imported but unused" uyarısı verir
15
- try:
16
- from .kececi_layout import * # gerekirse burada belirli fonksiyonları seçmeli yapmak daha güvenlidir
17
- from . import kececi_layout # Modülün kendisine doğrudan erişim isteniyorsa
18
- except ImportError as e:
19
- warnings.warn(f"Gerekli modül yüklenemedi: {e}", ImportWarning)
20
-
21
- # Eski bir fonksiyonun yer tutucusu - gelecekte kaldırılacak
22
- def eski_fonksiyon():
23
- """
24
- Kaldırılması planlanan eski bir fonksiyondur.
25
- Lütfen alternatif fonksiyonları kullanın.
26
- """
27
- warnings.warn(
28
- "eski_fonksiyon() artık kullanılmamaktadır ve gelecekte kaldırılacaktır. "
29
- "Lütfen yeni alternatif fonksiyonları kullanın. "
30
- "Keçeci Layout; Python 3.7-3.14 sürümlerinde sorunsuz çalışmalıdır.",
31
- category=DeprecationWarning,
32
- stacklevel=2
33
- )
34
-
35
-
36
- # Paket sürüm numarası
37
- __version__ = "0.2.2"
@@ -1,2 +0,0 @@
1
- def test_placeholder():
2
- assert True
File without changes
File without changes
File without changes