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.
- gitflow_analytics/__init__.py +11 -11
- gitflow_analytics/_version.py +2 -2
- gitflow_analytics/cli.py +612 -258
- gitflow_analytics/cli_rich.py +353 -0
- gitflow_analytics/config.py +251 -141
- gitflow_analytics/core/analyzer.py +140 -103
- gitflow_analytics/core/branch_mapper.py +132 -132
- gitflow_analytics/core/cache.py +240 -169
- gitflow_analytics/core/identity.py +210 -173
- gitflow_analytics/extractors/base.py +13 -11
- gitflow_analytics/extractors/story_points.py +70 -59
- gitflow_analytics/extractors/tickets.py +101 -87
- gitflow_analytics/integrations/github_integration.py +84 -77
- gitflow_analytics/integrations/jira_integration.py +116 -104
- gitflow_analytics/integrations/orchestrator.py +86 -85
- gitflow_analytics/metrics/dora.py +181 -177
- gitflow_analytics/models/database.py +190 -53
- gitflow_analytics/qualitative/__init__.py +30 -0
- gitflow_analytics/qualitative/classifiers/__init__.py +13 -0
- gitflow_analytics/qualitative/classifiers/change_type.py +468 -0
- gitflow_analytics/qualitative/classifiers/domain_classifier.py +399 -0
- gitflow_analytics/qualitative/classifiers/intent_analyzer.py +436 -0
- gitflow_analytics/qualitative/classifiers/risk_analyzer.py +412 -0
- gitflow_analytics/qualitative/core/__init__.py +13 -0
- gitflow_analytics/qualitative/core/llm_fallback.py +653 -0
- gitflow_analytics/qualitative/core/nlp_engine.py +373 -0
- gitflow_analytics/qualitative/core/pattern_cache.py +457 -0
- gitflow_analytics/qualitative/core/processor.py +540 -0
- gitflow_analytics/qualitative/models/__init__.py +25 -0
- gitflow_analytics/qualitative/models/schemas.py +272 -0
- gitflow_analytics/qualitative/utils/__init__.py +13 -0
- gitflow_analytics/qualitative/utils/batch_processor.py +326 -0
- gitflow_analytics/qualitative/utils/cost_tracker.py +343 -0
- gitflow_analytics/qualitative/utils/metrics.py +347 -0
- gitflow_analytics/qualitative/utils/text_processing.py +243 -0
- gitflow_analytics/reports/analytics_writer.py +11 -4
- gitflow_analytics/reports/csv_writer.py +51 -31
- gitflow_analytics/reports/narrative_writer.py +16 -14
- gitflow_analytics/tui/__init__.py +5 -0
- gitflow_analytics/tui/app.py +721 -0
- gitflow_analytics/tui/screens/__init__.py +8 -0
- gitflow_analytics/tui/screens/analysis_progress_screen.py +487 -0
- gitflow_analytics/tui/screens/configuration_screen.py +547 -0
- gitflow_analytics/tui/screens/loading_screen.py +358 -0
- gitflow_analytics/tui/screens/main_screen.py +304 -0
- gitflow_analytics/tui/screens/results_screen.py +698 -0
- gitflow_analytics/tui/widgets/__init__.py +7 -0
- gitflow_analytics/tui/widgets/data_table.py +257 -0
- gitflow_analytics/tui/widgets/export_modal.py +301 -0
- gitflow_analytics/tui/widgets/progress_widget.py +192 -0
- {gitflow_analytics-1.0.1.dist-info → gitflow_analytics-1.0.3.dist-info}/METADATA +31 -4
- gitflow_analytics-1.0.3.dist-info/RECORD +62 -0
- gitflow_analytics-1.0.1.dist-info/RECORD +0 -31
- {gitflow_analytics-1.0.1.dist-info → gitflow_analytics-1.0.3.dist-info}/WHEEL +0 -0
- {gitflow_analytics-1.0.1.dist-info → gitflow_analytics-1.0.3.dist-info}/entry_points.txt +0 -0
- {gitflow_analytics-1.0.1.dist-info → gitflow_analytics-1.0.3.dist-info}/licenses/LICENSE +0 -0
- {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.
|
|
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.
|
|
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
|
+
[](https://badge.fury.io/py/gitflow-analytics)
|
|
62
|
+
[](https://pypi.org/project/gitflow-analytics/)
|
|
63
|
+
[](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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|