gitflow-analytics 1.0.1__py3-none-any.whl → 1.0.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. gitflow_analytics/__init__.py +11 -11
  2. gitflow_analytics/_version.py +2 -2
  3. gitflow_analytics/cli.py +612 -258
  4. gitflow_analytics/cli_rich.py +353 -0
  5. gitflow_analytics/config.py +251 -141
  6. gitflow_analytics/core/analyzer.py +140 -103
  7. gitflow_analytics/core/branch_mapper.py +132 -132
  8. gitflow_analytics/core/cache.py +240 -169
  9. gitflow_analytics/core/identity.py +210 -173
  10. gitflow_analytics/extractors/base.py +13 -11
  11. gitflow_analytics/extractors/story_points.py +70 -59
  12. gitflow_analytics/extractors/tickets.py +101 -87
  13. gitflow_analytics/integrations/github_integration.py +84 -77
  14. gitflow_analytics/integrations/jira_integration.py +116 -104
  15. gitflow_analytics/integrations/orchestrator.py +86 -85
  16. gitflow_analytics/metrics/dora.py +181 -177
  17. gitflow_analytics/models/database.py +190 -53
  18. gitflow_analytics/qualitative/__init__.py +30 -0
  19. gitflow_analytics/qualitative/classifiers/__init__.py +13 -0
  20. gitflow_analytics/qualitative/classifiers/change_type.py +468 -0
  21. gitflow_analytics/qualitative/classifiers/domain_classifier.py +399 -0
  22. gitflow_analytics/qualitative/classifiers/intent_analyzer.py +436 -0
  23. gitflow_analytics/qualitative/classifiers/risk_analyzer.py +412 -0
  24. gitflow_analytics/qualitative/core/__init__.py +13 -0
  25. gitflow_analytics/qualitative/core/llm_fallback.py +653 -0
  26. gitflow_analytics/qualitative/core/nlp_engine.py +373 -0
  27. gitflow_analytics/qualitative/core/pattern_cache.py +457 -0
  28. gitflow_analytics/qualitative/core/processor.py +540 -0
  29. gitflow_analytics/qualitative/models/__init__.py +25 -0
  30. gitflow_analytics/qualitative/models/schemas.py +272 -0
  31. gitflow_analytics/qualitative/utils/__init__.py +13 -0
  32. gitflow_analytics/qualitative/utils/batch_processor.py +326 -0
  33. gitflow_analytics/qualitative/utils/cost_tracker.py +343 -0
  34. gitflow_analytics/qualitative/utils/metrics.py +347 -0
  35. gitflow_analytics/qualitative/utils/text_processing.py +243 -0
  36. gitflow_analytics/reports/analytics_writer.py +11 -4
  37. gitflow_analytics/reports/csv_writer.py +51 -31
  38. gitflow_analytics/reports/narrative_writer.py +16 -14
  39. gitflow_analytics/tui/__init__.py +5 -0
  40. gitflow_analytics/tui/app.py +721 -0
  41. gitflow_analytics/tui/screens/__init__.py +8 -0
  42. gitflow_analytics/tui/screens/analysis_progress_screen.py +487 -0
  43. gitflow_analytics/tui/screens/configuration_screen.py +547 -0
  44. gitflow_analytics/tui/screens/loading_screen.py +358 -0
  45. gitflow_analytics/tui/screens/main_screen.py +304 -0
  46. gitflow_analytics/tui/screens/results_screen.py +698 -0
  47. gitflow_analytics/tui/widgets/__init__.py +7 -0
  48. gitflow_analytics/tui/widgets/data_table.py +257 -0
  49. gitflow_analytics/tui/widgets/export_modal.py +301 -0
  50. gitflow_analytics/tui/widgets/progress_widget.py +192 -0
  51. {gitflow_analytics-1.0.1.dist-info → gitflow_analytics-1.0.3.dist-info}/METADATA +31 -4
  52. gitflow_analytics-1.0.3.dist-info/RECORD +62 -0
  53. gitflow_analytics-1.0.1.dist-info/RECORD +0 -31
  54. {gitflow_analytics-1.0.1.dist-info → gitflow_analytics-1.0.3.dist-info}/WHEEL +0 -0
  55. {gitflow_analytics-1.0.1.dist-info → gitflow_analytics-1.0.3.dist-info}/entry_points.txt +0 -0
  56. {gitflow_analytics-1.0.1.dist-info → gitflow_analytics-1.0.3.dist-info}/licenses/LICENSE +0 -0
  57. {gitflow_analytics-1.0.1.dist-info → gitflow_analytics-1.0.3.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,192 @@
1
+ """Progress widget with ETA for GitFlow Analytics TUI."""
2
+
3
+ import time
4
+ from typing import Optional
5
+ from datetime import datetime, timedelta
6
+
7
+ from textual.widgets import ProgressBar, Label
8
+ from textual.containers import Container, Vertical
9
+ from textual.reactive import reactive
10
+ from rich.text import Text
11
+
12
+
13
+ class AnalysisProgressWidget(Container):
14
+ """
15
+ Custom progress widget that shows progress with ETA calculation.
16
+
17
+ WHY: Standard progress bars don't provide time estimates which are crucial
18
+ for long-running analysis operations. This widget combines progress tracking
19
+ with ETA calculations to give users better feedback.
20
+
21
+ DESIGN DECISION: Uses reactive attributes for real-time updates and
22
+ calculates ETA based on average processing speed rather than simple linear
23
+ extrapolation for more accurate estimates.
24
+ """
25
+
26
+ DEFAULT_CSS = """
27
+ AnalysisProgressWidget {
28
+ height: auto;
29
+ border: solid $primary;
30
+ margin: 1;
31
+ padding: 1;
32
+ }
33
+
34
+ .progress-title {
35
+ text-style: bold;
36
+ color: $primary;
37
+ margin-bottom: 1;
38
+ }
39
+
40
+ .progress-status {
41
+ color: $text;
42
+ margin-top: 1;
43
+ }
44
+
45
+ .progress-eta {
46
+ color: $accent;
47
+ text-style: italic;
48
+ }
49
+ """
50
+
51
+ progress = reactive(0.0)
52
+ total = reactive(100.0)
53
+ status_text = reactive("Initializing...")
54
+
55
+ def __init__(
56
+ self,
57
+ title: str,
58
+ total: float = 100.0,
59
+ *,
60
+ name: Optional[str] = None,
61
+ id: Optional[str] = None,
62
+ classes: Optional[str] = None
63
+ ) -> None:
64
+ super().__init__(name=name, id=id, classes=classes)
65
+ self.title = title
66
+ self.total = total
67
+ self.start_time = time.time()
68
+ self.last_update_time = time.time()
69
+ self.progress_history = []
70
+
71
+ def compose(self):
72
+ """Compose the progress widget."""
73
+ yield Label(self.title, classes="progress-title")
74
+ yield ProgressBar(total=self.total, id="progress-bar")
75
+ yield Label(self.status_text, classes="progress-status", id="status-label")
76
+ yield Label("", classes="progress-eta", id="eta-label")
77
+
78
+ def update_progress(self, value: float, status: str = "") -> None:
79
+ """
80
+ Update progress and status with ETA calculation.
81
+
82
+ WHY: Provides comprehensive progress updates including time estimates
83
+ which are essential for user experience during long operations.
84
+
85
+ @param value: Current progress value
86
+ @param status: Status message to display
87
+ """
88
+ current_time = time.time()
89
+
90
+ # Update reactive values
91
+ self.progress = value
92
+ if status:
93
+ self.status_text = status
94
+
95
+ # Update progress bar
96
+ progress_bar = self.query_one("#progress-bar", ProgressBar)
97
+ progress_bar.update(progress=value)
98
+
99
+ # Update status label
100
+ status_label = self.query_one("#status-label", Label)
101
+ status_label.update(status)
102
+
103
+ # Calculate and update ETA
104
+ eta_text = self._calculate_eta(value, current_time)
105
+ eta_label = self.query_one("#eta-label", Label)
106
+ eta_label.update(eta_text)
107
+
108
+ # Store progress history for better ETA calculation
109
+ self.progress_history.append({
110
+ 'time': current_time,
111
+ 'progress': value
112
+ })
113
+
114
+ # Keep only recent history (last 10 updates)
115
+ if len(self.progress_history) > 10:
116
+ self.progress_history = self.progress_history[-10:]
117
+
118
+ def _calculate_eta(self, current_progress: float, current_time: float) -> str:
119
+ """
120
+ Calculate estimated time of arrival based on progress history.
121
+
122
+ WHY: Uses historical data points to calculate a more accurate ETA
123
+ than simple linear extrapolation, accounting for variations in
124
+ processing speed.
125
+ """
126
+ if current_progress <= 0 or current_progress >= self.total:
127
+ return ""
128
+
129
+ # Need at least 2 data points for calculation
130
+ if len(self.progress_history) < 2:
131
+ return "Calculating ETA..."
132
+
133
+ # Calculate average rate from recent history
134
+ recent_history = self.progress_history[-5:] # Last 5 updates
135
+ if len(recent_history) < 2:
136
+ return "Calculating ETA..."
137
+
138
+ time_span = recent_history[-1]['time'] - recent_history[0]['time']
139
+ progress_span = recent_history[-1]['progress'] - recent_history[0]['progress']
140
+
141
+ if time_span <= 0 or progress_span <= 0:
142
+ return "Calculating ETA..."
143
+
144
+ # Calculate rate (progress per second)
145
+ rate = progress_span / time_span
146
+
147
+ # Calculate remaining work and time
148
+ remaining_progress = self.total - current_progress
149
+ estimated_seconds = remaining_progress / rate
150
+
151
+ # Format ETA
152
+ if estimated_seconds < 60:
153
+ return f"ETA: {estimated_seconds:.0f}s"
154
+ elif estimated_seconds < 3600:
155
+ minutes = estimated_seconds / 60
156
+ return f"ETA: {minutes:.1f}m"
157
+ else:
158
+ hours = estimated_seconds / 3600
159
+ return f"ETA: {hours:.1f}h"
160
+
161
+ def reset(self) -> None:
162
+ """Reset the progress widget to initial state."""
163
+ self.progress = 0.0
164
+ self.status_text = "Initializing..."
165
+ self.start_time = time.time()
166
+ self.progress_history = []
167
+
168
+ # Reset UI elements
169
+ progress_bar = self.query_one("#progress-bar", ProgressBar)
170
+ progress_bar.update(progress=0)
171
+
172
+ status_label = self.query_one("#status-label", Label)
173
+ status_label.update("Initializing...")
174
+
175
+ eta_label = self.query_one("#eta-label", Label)
176
+ eta_label.update("")
177
+
178
+ def complete(self, final_message: str = "Complete!") -> None:
179
+ """Mark progress as complete."""
180
+ self.update_progress(self.total, final_message)
181
+
182
+ # Calculate total elapsed time
183
+ total_time = time.time() - self.start_time
184
+ if total_time < 60:
185
+ time_str = f"{total_time:.1f}s"
186
+ elif total_time < 3600:
187
+ time_str = f"{total_time/60:.1f}m"
188
+ else:
189
+ time_str = f"{total_time/3600:.1f}h"
190
+
191
+ eta_label = self.query_one("#eta-label", Label)
192
+ eta_label.update(f"Completed in {time_str}")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gitflow-analytics
3
- Version: 1.0.1
3
+ Version: 1.0.3
4
4
  Summary: Analyze Git repositories for developer productivity insights
5
5
  Author-email: Bob Matyas <bobmatnyc@gmail.com>
6
6
  License: MIT
@@ -12,14 +12,13 @@ Keywords: git,analytics,productivity,metrics,development
12
12
  Classifier: Development Status :: 5 - Production/Stable
13
13
  Classifier: Intended Audience :: Developers
14
14
  Classifier: Programming Language :: Python :: 3
15
- Classifier: Programming Language :: Python :: 3.8
16
15
  Classifier: Programming Language :: Python :: 3.9
17
16
  Classifier: Programming Language :: Python :: 3.10
18
17
  Classifier: Programming Language :: Python :: 3.11
19
18
  Classifier: Programming Language :: Python :: 3.12
20
19
  Classifier: Topic :: Software Development :: Version Control :: Git
21
20
  Classifier: Topic :: Software Development :: Quality Assurance
22
- Requires-Python: >=3.8
21
+ Requires-Python: >=3.9
23
22
  Description-Content-Type: text/markdown
24
23
  License-File: LICENSE
25
24
  Requires-Dist: click>=8.1
@@ -30,6 +29,12 @@ Requires-Dist: pandas>=2.0
30
29
  Requires-Dist: pyyaml>=6.0
31
30
  Requires-Dist: python-dateutil>=2.8
32
31
  Requires-Dist: python-dotenv>=1.0
32
+ Requires-Dist: rich>=13.0.0
33
+ Requires-Dist: spacy>=3.7.0
34
+ Requires-Dist: scikit-learn>=1.3.0
35
+ Requires-Dist: openai>=1.30.0
36
+ Requires-Dist: tiktoken>=0.7.0
37
+ Requires-Dist: numpy>=1.24.0
33
38
  Provides-Extra: dev
34
39
  Requires-Dist: pytest>=7.0; extra == "dev"
35
40
  Requires-Dist: pytest-cov>=4.0; extra == "dev"
@@ -37,14 +42,26 @@ Requires-Dist: pytest-mock>=3.0; extra == "dev"
37
42
  Requires-Dist: ruff>=0.1.0; extra == "dev"
38
43
  Requires-Dist: mypy>=1.0; extra == "dev"
39
44
  Requires-Dist: black>=23.0; extra == "dev"
45
+ Requires-Dist: isort>=5.0; extra == "dev"
46
+ Requires-Dist: bandit[toml]>=1.7; extra == "dev"
47
+ Requires-Dist: safety>=2.0; extra == "dev"
48
+ Requires-Dist: python-semantic-release>=8.0.0; extra == "dev"
49
+ Requires-Dist: types-PyYAML>=6.0; extra == "dev"
50
+ Requires-Dist: types-requests>=2.28; extra == "dev"
40
51
  Provides-Extra: github
41
52
  Requires-Dist: pygithub>=1.58; extra == "github"
53
+ Provides-Extra: tui
54
+ Requires-Dist: textual>=0.41.0; extra == "tui"
42
55
  Provides-Extra: all
43
- Requires-Dist: gitflow-analytics[github]; extra == "all"
56
+ Requires-Dist: gitflow-analytics[github,tui]; extra == "all"
44
57
  Dynamic: license-file
45
58
 
46
59
  # GitFlow Analytics
47
60
 
61
+ [![PyPI version](https://badge.fury.io/py/gitflow-analytics.svg)](https://badge.fury.io/py/gitflow-analytics)
62
+ [![Python Support](https://img.shields.io/pypi/pyversions/gitflow-analytics.svg)](https://pypi.org/project/gitflow-analytics/)
63
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
64
+
48
65
  A Python package for analyzing Git repositories to generate comprehensive developer productivity reports. It extracts data directly from Git history and GitHub APIs, providing weekly summaries, productivity insights, and gap analysis.
49
66
 
50
67
  ## Features
@@ -64,10 +81,20 @@ A Python package for analyzing Git repositories to generate comprehensive develo
64
81
 
65
82
  ### Installation
66
83
 
84
+ **From PyPI (Recommended):**
85
+
67
86
  ```bash
68
87
  pip install gitflow-analytics
69
88
  ```
70
89
 
90
+ **From Source (Development):**
91
+
92
+ ```bash
93
+ git clone https://github.com/bobmatnyc/gitflow-analytics.git
94
+ cd gitflow-analytics
95
+ pip install -e ".[dev]"
96
+ ```
97
+
71
98
  ### Basic Usage
72
99
 
73
100
  1. Create a configuration file (`config.yaml`):
@@ -0,0 +1,62 @@
1
+ gitflow_analytics/__init__.py,sha256=yN1dyAUu4l9qX-YNAGRItEf4RFFe-5GQiOntXPIfdxo,683
2
+ gitflow_analytics/_version.py,sha256=K1RfTm9uAPTEUj21mrxdqQ3kT2CuA6F1ML8t6HzEZwk,137
3
+ gitflow_analytics/cli.py,sha256=xHfdi9qYNgy2My78paWsFYPZg5Exo3fJXHmw7liI4Sw,37378
4
+ gitflow_analytics/cli_rich.py,sha256=FqOBGWNqTmxD2BHfmqtHWvHx4AFO-FgOTRwtx9eOEHE,13604
5
+ gitflow_analytics/config.py,sha256=08f5n9FFfA2wj-tEHQwYrQzBT42GSKURzhZgWRzTk0w,20966
6
+ gitflow_analytics/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ gitflow_analytics/core/analyzer.py,sha256=RgdfpH8tCjJJRKAhZGSiGQ83F-ekGQ9YtL4hf8r-rNw,10737
8
+ gitflow_analytics/core/branch_mapper.py,sha256=1L1ctrhTEqMZ61eS1nZRkcyaarLipeQgotw4HdXcSmM,7407
9
+ gitflow_analytics/core/cache.py,sha256=LIrp4O5GQfMvvgW_rG8zHr8vurYOsH6Du5u3Exh8S9k,14292
10
+ gitflow_analytics/core/identity.py,sha256=vcPcvKyIgf3gIjrdamW_ma7av6igK89ZH-1AZ0pQWMQ,17191
11
+ gitflow_analytics/extractors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
+ gitflow_analytics/extractors/base.py,sha256=AKbYkFiMhNxVj7zfNzsJfh0rpyTdNr4Faea3bcZPPBo,1168
13
+ gitflow_analytics/extractors/story_points.py,sha256=oS8nb0PWkZfhq3Jq14Hf_OMZN_tQwJWw9Dqc8ur5Kuk,5044
14
+ gitflow_analytics/extractors/tickets.py,sha256=erXzMPBTv2Wx2lbXE9HeOm0cy6hHu1pF6ZaQG6KATqg,7233
15
+ gitflow_analytics/integrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
+ gitflow_analytics/integrations/github_integration.py,sha256=0v9CtXQ6IhDCQBfoh_etAwiEFiPeHWTy0HQBtoItQBs,6437
17
+ gitflow_analytics/integrations/jira_integration.py,sha256=DRBXqILinsuyON8lxmhT-hRFhB85StX0DD3d7JMu808,10240
18
+ gitflow_analytics/integrations/orchestrator.py,sha256=KtBm3LBtwOK41azL3S1SYcpVuoJbGDy2BvojA7_rJEU,5732
19
+ gitflow_analytics/metrics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
+ gitflow_analytics/metrics/dora.py,sha256=H86NSqSL7ngWapt09w_mGGSVwpv04Dth8e5q4ZGar3I,12053
21
+ gitflow_analytics/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
+ gitflow_analytics/models/database.py,sha256=EUalU5RaQ8WB5idQSIw45rrpnyn-305j8tL9UnI0wxQ,10015
23
+ gitflow_analytics/qualitative/__init__.py,sha256=KUMF-RPpItm1ZcgVGRXeLkU12T1G0xDsowFdsGp0_so,886
24
+ gitflow_analytics/qualitative/classifiers/__init__.py,sha256=GSjcSNFzbtPfY6cMINExTd2Mssb7xJpRPeXmJRW22bc,348
25
+ gitflow_analytics/qualitative/classifiers/change_type.py,sha256=9EKbwFs8x4hV2J_57DZTYRDVeMm9YTRI25q6ySQMDTU,17828
26
+ gitflow_analytics/qualitative/classifiers/domain_classifier.py,sha256=azGjMpHLanm-rkZCZnihvHCukC0H9Cp5RiOx32Jwcc0,14881
27
+ gitflow_analytics/qualitative/classifiers/intent_analyzer.py,sha256=jfRPJUr3XgbEpwJ6CL-zyMCMZrkfhy2XisMdht-XK-M,16354
28
+ gitflow_analytics/qualitative/classifiers/risk_analyzer.py,sha256=XDt0CTv_ALqON47GEFoUvkC631084bDzrUIr99U2KBY,15395
29
+ gitflow_analytics/qualitative/core/__init__.py,sha256=1QkGWNhkWnVRWNCDuLUCYSrt1CM4hNwms33trBcCKEs,315
30
+ gitflow_analytics/qualitative/core/llm_fallback.py,sha256=8HQ-ekp9gevquvhiZotNhIXkWe7ir9N6gCVUAswUCt0,25206
31
+ gitflow_analytics/qualitative/core/nlp_engine.py,sha256=erde27Nag6YTbAbtk9Nb3Tm9rpnm8kwOW76Q1R4QvZI,14463
32
+ gitflow_analytics/qualitative/core/pattern_cache.py,sha256=4cFpYOEIEai8BXeTaHhGLilfnV0a_yLJ0ttlBWOTV8k,18985
33
+ gitflow_analytics/qualitative/core/processor.py,sha256=UqS2YWd0KFxhR8QoCV1x7KQg7worYB5aLUwXY0NhKX0,22329
34
+ gitflow_analytics/qualitative/models/__init__.py,sha256=VV4s_5_VvK4lPvRktdT_K0DGRx65rzQ4oB8NjQGFIfg,458
35
+ gitflow_analytics/qualitative/models/schemas.py,sha256=8T8BAUju7c3aQMZN4XyBB5P0Vn5TLdx0JANxkHXHw2g,10357
36
+ gitflow_analytics/qualitative/utils/__init__.py,sha256=M_zkw--7cDuWbUq-_pXzMIwkz-pqC6fmncz2INPPggU,320
37
+ gitflow_analytics/qualitative/utils/batch_processor.py,sha256=34Zh4KTPwn0JRk7D9bPj4eTK_F0iJPL_v3bHN4QtJ0g,12335
38
+ gitflow_analytics/qualitative/utils/cost_tracker.py,sha256=-NiIAIZUNDEfWqXZmumqyigN7QUuRnmJjIgdHXnQARQ,12709
39
+ gitflow_analytics/qualitative/utils/metrics.py,sha256=_TLFRsx5cYUOsBJix_VtCZv6mhoC_QXWGfIegnjai10,13443
40
+ gitflow_analytics/qualitative/utils/text_processing.py,sha256=RoZChe3je_M617HNxZSwPm3uTIrVJPvMSBB1ldz9LGg,9195
41
+ gitflow_analytics/reports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
+ gitflow_analytics/reports/analytics_writer.py,sha256=hpIMQMNvoD0srSfSAPTvZzyKvk9i3K_uz9OkBXNDY8Y,19870
43
+ gitflow_analytics/reports/csv_writer.py,sha256=XWaeL6Avj0TW6cQ_0Tl-5wNLT7XcDCJjuyqEK584Fig,14053
44
+ gitflow_analytics/reports/narrative_writer.py,sha256=HTUG44sKkO0kLStqHDFOiVi2LXcG_BUCDPf34kwAfGE,13048
45
+ gitflow_analytics/tui/__init__.py,sha256=fySf6x1-WQuyvXA0qKsBpgNFW9Akazi5WdvwYHeSi9I,125
46
+ gitflow_analytics/tui/app.py,sha256=LL0jTUuGYDFuPGojM6_2ecp2o3sf7bLfI_9BY_AaQO0,22756
47
+ gitflow_analytics/tui/screens/__init__.py,sha256=KuXesK7UNaJEvzpQ83lMhe1UGWmgRNtTrUOL8cnDJBU,326
48
+ gitflow_analytics/tui/screens/analysis_progress_screen.py,sha256=xW4oNcPyxksysjBdQNof1C3trqYXJItj1LcY751Od1k,21490
49
+ gitflow_analytics/tui/screens/configuration_screen.py,sha256=uT9nKlcF1ZMw7Y6dQnZDkFuoeKa5mSsvvk-2zOpJ8K8,20207
50
+ gitflow_analytics/tui/screens/loading_screen.py,sha256=cRuebJDZ9SSV8naaMolOD9BeDtakjrSQa8BgK1ioHtY,15351
51
+ gitflow_analytics/tui/screens/main_screen.py,sha256=AW0lJBVs_uB4VrP79_TdO33xkwWwMYXWj9ijZR116B4,11735
52
+ gitflow_analytics/tui/screens/results_screen.py,sha256=zfR6JIMbKNAIAuqhT4dyss7H9F0pFvjphEUEKjC5TJU,29608
53
+ gitflow_analytics/tui/widgets/__init__.py,sha256=l4U-2_DmxEm4wgjK0OS9KthI-9KBWY0d_k49PAbqTqc,258
54
+ gitflow_analytics/tui/widgets/data_table.py,sha256=FLBUZBN_LJ527NMyhKjnxVUGm95VopIB8xRbwLShTgI,9050
55
+ gitflow_analytics/tui/widgets/export_modal.py,sha256=rXbjgnfqy1vi4dm3qpk4Ng1pX7w_zfj8aUlYZbIjwII,11189
56
+ gitflow_analytics/tui/widgets/progress_widget.py,sha256=L0L5h5PlClajLUT0tH4MriRRCXEw359BoZwPPbP0xlw,6504
57
+ gitflow_analytics-1.0.3.dist-info/licenses/LICENSE,sha256=xwvSwY1GYXpRpmbnFvvnbmMwpobnrdN9T821sGvjOY0,1066
58
+ gitflow_analytics-1.0.3.dist-info/METADATA,sha256=Z2wxKlmDXtipMIyqY56hEZ3ULg0gN-SsUQcvPXPCa-U,13703
59
+ gitflow_analytics-1.0.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
60
+ gitflow_analytics-1.0.3.dist-info/entry_points.txt,sha256=a3y8HnfLOvK1QVOgAkDY6VQXXm3o9ZSQRZrpiaS3hEM,65
61
+ gitflow_analytics-1.0.3.dist-info/top_level.txt,sha256=CQyxZXjKvpSB1kgqqtuE0PCRqfRsXZJL8JrYpJKtkrk,18
62
+ gitflow_analytics-1.0.3.dist-info/RECORD,,
@@ -1,31 +0,0 @@
1
- gitflow_analytics/__init__.py,sha256=9g64-8GIadOL3mCDsxHPMIlUhztZAx_nUISQtRotsuY,682
2
- gitflow_analytics/_version.py,sha256=d6tbYJNPyd-1yr5YWMYdu12zn6-tSRgYnpW5-dGvQWA,136
3
- gitflow_analytics/cli.py,sha256=1zC5kOSFKtgGHaew6JOjezRUXh3FrVmZEYE2mu5h0QY,21103
4
- gitflow_analytics/config.py,sha256=xQpsQTKtTU5L3k44YG3grtXl-b4miL9l5GcPV0w5Vkc,15896
5
- gitflow_analytics/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- gitflow_analytics/core/analyzer.py,sha256=7DRofL9aRdafuRaTxKne0h42QAhdDn245-cIhkDyNaQ,10379
7
- gitflow_analytics/core/branch_mapper.py,sha256=p1MzezL2aMjhVX0672aC9Zc_1QPVnKmw1EEn4CSZTCc,7603
8
- gitflow_analytics/core/cache.py,sha256=nAWdkT210mrsMrpC50pCYXJ5e7mi5YzgrgB5Bd0UXOo,11641
9
- gitflow_analytics/core/identity.py,sha256=FXD5aeMbf1yyFwDKQqu943kHIMRLbb7lclw1m421qF4,17046
10
- gitflow_analytics/extractors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
- gitflow_analytics/extractors/base.py,sha256=EIs8udjsJOMJMuqo6GJD9m-LQ-bmXuD8Ofdxr9KHYzQ,1208
12
- gitflow_analytics/extractors/story_points.py,sha256=2NUViohigV5QHMw5U_NMwEuNd4pFLVuFYphM7ZliZ-Y,5038
13
- gitflow_analytics/extractors/tickets.py,sha256=pjexGozeZlxy0oG6D-qxtkWrQiWbdU2PU3CmdJxIZfY,6655
14
- gitflow_analytics/integrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
- gitflow_analytics/integrations/github_integration.py,sha256=snRjPKZXBP0XK_vProHJeqRWDAxAVbuGEbRf1yWsZew,6719
16
- gitflow_analytics/integrations/jira_integration.py,sha256=UE8UmMt90Py2PZTldAjLhBYHhFF81F5gwAuvjtHAI18,10549
17
- gitflow_analytics/integrations/orchestrator.py,sha256=72l6mt2MGk5eJBO1GuwUEMg_K16SeK8fzp1TNlm8wbQ,5688
18
- gitflow_analytics/metrics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
- gitflow_analytics/metrics/dora.py,sha256=hn99XATw-lWr8RdQQb5u7XwT-tAZs0CC5Qbj0xOHkWw,12709
20
- gitflow_analytics/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
- gitflow_analytics/models/database.py,sha256=y93oyZHe1EyYX9YYgI2jDnuXtBG4_BsvJx7ei9mRgl0,5521
22
- gitflow_analytics/reports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
- gitflow_analytics/reports/analytics_writer.py,sha256=FoXLcdS11q6DekB2QfR-1J30gUQkARfiR-hyWZZO5hw,19496
24
- gitflow_analytics/reports/csv_writer.py,sha256=SgQLa9mNc-pLhLwy1hhttMjKPTXcRYvOaUwvUD1WI84,13021
25
- gitflow_analytics/reports/narrative_writer.py,sha256=GKBdbFL6_Qwfi8xXsD5C_inFf12h4_gy-9QasanTv1Q,12879
26
- gitflow_analytics-1.0.1.dist-info/licenses/LICENSE,sha256=xwvSwY1GYXpRpmbnFvvnbmMwpobnrdN9T821sGvjOY0,1066
27
- gitflow_analytics-1.0.1.dist-info/METADATA,sha256=yy2hzjV1Y1DdhXUn7MuOdnyjVxYIZ5u306ux_VZYKFk,12677
28
- gitflow_analytics-1.0.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
29
- gitflow_analytics-1.0.1.dist-info/entry_points.txt,sha256=a3y8HnfLOvK1QVOgAkDY6VQXXm3o9ZSQRZrpiaS3hEM,65
30
- gitflow_analytics-1.0.1.dist-info/top_level.txt,sha256=CQyxZXjKvpSB1kgqqtuE0PCRqfRsXZJL8JrYpJKtkrk,18
31
- gitflow_analytics-1.0.1.dist-info/RECORD,,