cloudx-proxy 0.9.4__tar.gz → 0.9.6__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.
- {cloudx_proxy-0.9.4 → cloudx_proxy-0.9.6}/.github/workflows/release.yml +2 -2
- cloudx_proxy-0.9.6/ARCHITECTURE_REVIEW.md +300 -0
- {cloudx_proxy-0.9.4 → cloudx_proxy-0.9.6}/CHANGELOG.md +4 -0
- cloudx_proxy-0.9.6/DOCUMENTATION_FINDINGS.md +81 -0
- cloudx_proxy-0.9.6/IMPROVEMENT_ROADMAP.md +480 -0
- {cloudx_proxy-0.9.4 → cloudx_proxy-0.9.6}/PKG-INFO +1 -1
- {cloudx_proxy-0.9.4 → cloudx_proxy-0.9.6}/cloudx_proxy/_version.py +2 -2
- {cloudx_proxy-0.9.4 → cloudx_proxy-0.9.6}/cloudx_proxy.egg-info/PKG-INFO +1 -1
- {cloudx_proxy-0.9.4 → cloudx_proxy-0.9.6}/cloudx_proxy.egg-info/SOURCES.txt +3 -0
- {cloudx_proxy-0.9.4 → cloudx_proxy-0.9.6}/.clinerules +0 -0
- {cloudx_proxy-0.9.4 → cloudx_proxy-0.9.6}/.envrc +0 -0
- {cloudx_proxy-0.9.4 → cloudx_proxy-0.9.6}/.github/dependabot.yml +0 -0
- {cloudx_proxy-0.9.4 → cloudx_proxy-0.9.6}/.github/workflows/claude.yml +0 -0
- {cloudx_proxy-0.9.4 → cloudx_proxy-0.9.6}/.gitignore +0 -0
- {cloudx_proxy-0.9.4 → cloudx_proxy-0.9.6}/.releaserc +0 -0
- {cloudx_proxy-0.9.4 → cloudx_proxy-0.9.6}/CLAUDE.md +0 -0
- {cloudx_proxy-0.9.4 → cloudx_proxy-0.9.6}/CONTRIBUTING.md +0 -0
- {cloudx_proxy-0.9.4 → cloudx_proxy-0.9.6}/LICENSE +0 -0
- {cloudx_proxy-0.9.4 → cloudx_proxy-0.9.6}/NOTICE +0 -0
- {cloudx_proxy-0.9.4 → cloudx_proxy-0.9.6}/README.md +0 -0
- {cloudx_proxy-0.9.4 → cloudx_proxy-0.9.6}/cloudx_proxy/_1password.py +0 -0
- {cloudx_proxy-0.9.4 → cloudx_proxy-0.9.6}/cloudx_proxy/__init__.py +0 -0
- {cloudx_proxy-0.9.4 → cloudx_proxy-0.9.6}/cloudx_proxy/cli.py +0 -0
- {cloudx_proxy-0.9.4 → cloudx_proxy-0.9.6}/cloudx_proxy/core.py +0 -0
- {cloudx_proxy-0.9.4 → cloudx_proxy-0.9.6}/cloudx_proxy/setup.py +0 -0
- {cloudx_proxy-0.9.4 → cloudx_proxy-0.9.6}/cloudx_proxy.egg-info/dependency_links.txt +0 -0
- {cloudx_proxy-0.9.4 → cloudx_proxy-0.9.6}/cloudx_proxy.egg-info/entry_points.txt +0 -0
- {cloudx_proxy-0.9.4 → cloudx_proxy-0.9.6}/cloudx_proxy.egg-info/requires.txt +0 -0
- {cloudx_proxy-0.9.4 → cloudx_proxy-0.9.6}/cloudx_proxy.egg-info/top_level.txt +0 -0
- {cloudx_proxy-0.9.4 → cloudx_proxy-0.9.6}/pyproject.toml +0 -0
- {cloudx_proxy-0.9.4 → cloudx_proxy-0.9.6}/setup.cfg +0 -0
|
@@ -36,7 +36,7 @@ jobs:
|
|
|
36
36
|
run: liccheck
|
|
37
37
|
|
|
38
38
|
- name: Upload pip-audit results
|
|
39
|
-
uses: actions/upload-artifact@
|
|
39
|
+
uses: actions/upload-artifact@v5
|
|
40
40
|
if: always()
|
|
41
41
|
with:
|
|
42
42
|
name: pip-audit-report
|
|
@@ -55,7 +55,7 @@ jobs:
|
|
|
55
55
|
fetch-depth: 0
|
|
56
56
|
|
|
57
57
|
- name: Setup Node.js
|
|
58
|
-
uses: actions/setup-node@
|
|
58
|
+
uses: actions/setup-node@v6
|
|
59
59
|
with:
|
|
60
60
|
node-version: "lts/*"
|
|
61
61
|
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
# Architecture Review & Code Quality Analysis
|
|
2
|
+
|
|
3
|
+
This document provides a comprehensive analysis of the cloudX-proxy codebase, identifying areas for improvement in architecture, code quality, testing, and maintainability.
|
|
4
|
+
|
|
5
|
+
## Executive Summary
|
|
6
|
+
|
|
7
|
+
The cloudX-proxy project is functionally complete but suffers from significant architectural and code quality issues that impact maintainability, testability, and future development velocity. Key concerns include violation of SOLID principles, insufficient error handling, lack of testing infrastructure, and security vulnerabilities.
|
|
8
|
+
|
|
9
|
+
**Critical Metrics**:
|
|
10
|
+
- **Lines of Code**: ~1,500 (excluding tests - none exist)
|
|
11
|
+
- **Largest Class**: CloudXSetup (983 lines, 23 methods)
|
|
12
|
+
- **Test Coverage**: 0%
|
|
13
|
+
- **Type Coverage**: ~60% (missing return types, complex types)
|
|
14
|
+
- **Technical Debt**: High
|
|
15
|
+
|
|
16
|
+
## Detailed Module Analysis
|
|
17
|
+
|
|
18
|
+
### cli.py - Command Line Interface
|
|
19
|
+
|
|
20
|
+
**Issues Identified**:
|
|
21
|
+
|
|
22
|
+
1. **Complex Command Logic** (Lines 98-144):
|
|
23
|
+
- Setup command contains business logic that should be in service layer
|
|
24
|
+
- Hard to test CLI commands due to tight coupling
|
|
25
|
+
- Magic values scattered throughout (`'vscode'`, 22, etc.)
|
|
26
|
+
|
|
27
|
+
2. **Poor Error Handling**:
|
|
28
|
+
- Generic `Exception` catching (Lines 63-65, 142-144)
|
|
29
|
+
- No distinction between different error types
|
|
30
|
+
- Error messages lack context for debugging
|
|
31
|
+
|
|
32
|
+
3. **Hardcoded Colors**:
|
|
33
|
+
- ANSI color codes embedded in CLI logic
|
|
34
|
+
- Should be extracted to UI utility module
|
|
35
|
+
|
|
36
|
+
4. **Missing Input Validation**:
|
|
37
|
+
- No validation of instance ID format
|
|
38
|
+
- Port number validation incomplete
|
|
39
|
+
- Region validation missing
|
|
40
|
+
|
|
41
|
+
**Code Quality Score**: 6/10
|
|
42
|
+
|
|
43
|
+
### core.py - Connection Management
|
|
44
|
+
|
|
45
|
+
**Issues Identified**:
|
|
46
|
+
|
|
47
|
+
1. **Constructor Complexity** (Lines 9-50):
|
|
48
|
+
- 7 parameters with complex initialization logic
|
|
49
|
+
- Environment variable mutation in constructor
|
|
50
|
+
- Should use dependency injection pattern
|
|
51
|
+
|
|
52
|
+
2. **AWS Client Management**:
|
|
53
|
+
- Creates multiple AWS clients without connection pooling
|
|
54
|
+
- No client lifecycle management
|
|
55
|
+
- Potential resource leaks
|
|
56
|
+
|
|
57
|
+
3. **Security Concerns**:
|
|
58
|
+
- Direct subprocess execution without input sanitization (Lines 147-154)
|
|
59
|
+
- Command injection potential in AWS CLI calls
|
|
60
|
+
- No timeout on subprocess operations
|
|
61
|
+
|
|
62
|
+
4. **Error Handling**:
|
|
63
|
+
- Broad exception catching (Lines 65-66, 117-119)
|
|
64
|
+
- Lost error context
|
|
65
|
+
- No retry mechanisms for transient failures
|
|
66
|
+
|
|
67
|
+
5. **Magic Constants**:
|
|
68
|
+
- Hardcoded values: `'eu-west-1'`, `'ec2-user'`, `30`, `3`
|
|
69
|
+
- Should be in configuration system
|
|
70
|
+
|
|
71
|
+
**Code Quality Score**: 5/10
|
|
72
|
+
|
|
73
|
+
### setup.py - Setup Orchestration
|
|
74
|
+
|
|
75
|
+
**Issues Identified**:
|
|
76
|
+
|
|
77
|
+
1. **Massive Class Violation of SRP** (983 lines, 23 methods):
|
|
78
|
+
- Single class handles AWS, SSH, 1Password, UI, and configuration
|
|
79
|
+
- Should be split into 5-7 focused classes
|
|
80
|
+
- Impossible to test individual concerns
|
|
81
|
+
|
|
82
|
+
2. **Method Complexity**:
|
|
83
|
+
- `setup_ssh_config()`: 127 lines (Lines 767-897)
|
|
84
|
+
- `_create_1password_key()`: 125 lines (Lines 231-355)
|
|
85
|
+
- Multiple methods exceed 50 lines
|
|
86
|
+
|
|
87
|
+
3. **Tight Coupling**:
|
|
88
|
+
- UI logic mixed with business logic
|
|
89
|
+
- Hard to test without user interaction
|
|
90
|
+
- AWS operations mixed with file operations
|
|
91
|
+
|
|
92
|
+
4. **Poor Error Recovery**:
|
|
93
|
+
- Many methods have "continue anyway?" prompts
|
|
94
|
+
- No clear error recovery strategies
|
|
95
|
+
- Inconsistent error handling patterns
|
|
96
|
+
|
|
97
|
+
5. **Configuration Management**:
|
|
98
|
+
- Configuration scattered across multiple methods
|
|
99
|
+
- No centralized config validation
|
|
100
|
+
- Path handling inconsistencies
|
|
101
|
+
|
|
102
|
+
6. **Resource Management**:
|
|
103
|
+
- File operations without proper context managers
|
|
104
|
+
- No cleanup of temporary resources
|
|
105
|
+
- Permission setting scattered throughout
|
|
106
|
+
|
|
107
|
+
**Code Quality Score**: 3/10
|
|
108
|
+
|
|
109
|
+
### _1password.py - 1Password Integration
|
|
110
|
+
|
|
111
|
+
**Issues Identified**:
|
|
112
|
+
|
|
113
|
+
1. **Inconsistent Error Handling**:
|
|
114
|
+
- Functions return different types on failure
|
|
115
|
+
- Some return empty values, others return False
|
|
116
|
+
- No error context preservation
|
|
117
|
+
|
|
118
|
+
2. **Subprocess Security**:
|
|
119
|
+
- No input validation for external commands
|
|
120
|
+
- Potential command injection (though limited exposure)
|
|
121
|
+
- No timeout on subprocess calls
|
|
122
|
+
|
|
123
|
+
3. **Parsing Fragility**:
|
|
124
|
+
- Manual parsing of 1Password CLI output (Lines 129-153)
|
|
125
|
+
- Brittle to CLI output format changes
|
|
126
|
+
- No validation of parsed data
|
|
127
|
+
|
|
128
|
+
4. **Magic Values**:
|
|
129
|
+
- Category names hardcoded in multiple places
|
|
130
|
+
- Comments indicate confusion about correct values
|
|
131
|
+
|
|
132
|
+
**Code Quality Score**: 7/10
|
|
133
|
+
|
|
134
|
+
## Architecture Problems
|
|
135
|
+
|
|
136
|
+
### 1. Violation of SOLID Principles
|
|
137
|
+
|
|
138
|
+
**Single Responsibility Principle**:
|
|
139
|
+
- CloudXSetup class handles 6+ distinct responsibilities
|
|
140
|
+
- Core class mixes AWS operations with SSH operations
|
|
141
|
+
- CLI commands contain business logic
|
|
142
|
+
|
|
143
|
+
**Open/Closed Principle**:
|
|
144
|
+
- Adding new AWS services requires modifying existing classes
|
|
145
|
+
- New SSH configuration options require core changes
|
|
146
|
+
|
|
147
|
+
**Dependency Inversion Principle**:
|
|
148
|
+
- No abstractions for external dependencies
|
|
149
|
+
- Direct coupling to AWS SDK, subprocess, file system
|
|
150
|
+
|
|
151
|
+
### 2. Missing Abstraction Layers
|
|
152
|
+
|
|
153
|
+
**No Service Layer**:
|
|
154
|
+
- Business logic embedded in CLI and setup classes
|
|
155
|
+
- No clear API for programmatic usage
|
|
156
|
+
|
|
157
|
+
**No Data Access Layer**:
|
|
158
|
+
- File operations scattered throughout codebase
|
|
159
|
+
- No consistent configuration management
|
|
160
|
+
|
|
161
|
+
**No Infrastructure Layer**:
|
|
162
|
+
- AWS operations mixed with business logic
|
|
163
|
+
- No abstraction for external service calls
|
|
164
|
+
|
|
165
|
+
### 3. Testing Challenges
|
|
166
|
+
|
|
167
|
+
**Untestable Design**:
|
|
168
|
+
- Heavy use of static methods and global state
|
|
169
|
+
- No dependency injection
|
|
170
|
+
- Side effects in constructors
|
|
171
|
+
|
|
172
|
+
**External Dependencies**:
|
|
173
|
+
- Hard to mock AWS services
|
|
174
|
+
- File system operations difficult to test
|
|
175
|
+
- Subprocess calls prevent isolated testing
|
|
176
|
+
|
|
177
|
+
## Security Analysis
|
|
178
|
+
|
|
179
|
+
### High Risk Issues
|
|
180
|
+
|
|
181
|
+
1. **Command Injection** (core.py:147-154):
|
|
182
|
+
- Direct subprocess execution with user input
|
|
183
|
+
- Potential for command injection via AWS CLI parameters
|
|
184
|
+
|
|
185
|
+
2. **Path Traversal** (setup.py:various):
|
|
186
|
+
- User-provided paths not properly validated
|
|
187
|
+
- Could write files outside intended directories
|
|
188
|
+
|
|
189
|
+
3. **Credential Exposure**:
|
|
190
|
+
- Environment variables modified globally
|
|
191
|
+
- Potential for credential leakage in error messages
|
|
192
|
+
|
|
193
|
+
### Medium Risk Issues
|
|
194
|
+
|
|
195
|
+
1. **File Permissions**:
|
|
196
|
+
- Inconsistent permission setting
|
|
197
|
+
- Some files created with overly permissive permissions
|
|
198
|
+
|
|
199
|
+
2. **Error Information Disclosure**:
|
|
200
|
+
- Stack traces may expose system information
|
|
201
|
+
- AWS error messages could reveal infrastructure details
|
|
202
|
+
|
|
203
|
+
## Performance Issues
|
|
204
|
+
|
|
205
|
+
### 1. Resource Management
|
|
206
|
+
|
|
207
|
+
- Multiple AWS client instances created
|
|
208
|
+
- No connection pooling or reuse
|
|
209
|
+
- File operations not optimized
|
|
210
|
+
|
|
211
|
+
### 2. Blocking Operations
|
|
212
|
+
|
|
213
|
+
- Synchronous subprocess calls without timeouts
|
|
214
|
+
- No async operations for I/O bound tasks
|
|
215
|
+
- Single-threaded design limits throughput
|
|
216
|
+
|
|
217
|
+
### 3. Memory Usage
|
|
218
|
+
|
|
219
|
+
- Potential memory leaks from unclosed resources
|
|
220
|
+
- Large configuration strings built in memory
|
|
221
|
+
- No streaming for large file operations
|
|
222
|
+
|
|
223
|
+
## Testing Gaps
|
|
224
|
+
|
|
225
|
+
### 1. No Testing Framework
|
|
226
|
+
|
|
227
|
+
- Zero test coverage
|
|
228
|
+
- No unit tests for individual components
|
|
229
|
+
- No integration tests for workflows
|
|
230
|
+
|
|
231
|
+
### 2. No Mocking Strategy
|
|
232
|
+
|
|
233
|
+
- External dependencies not abstracted
|
|
234
|
+
- Difficult to test without real AWS accounts
|
|
235
|
+
- File system operations require cleanup
|
|
236
|
+
|
|
237
|
+
### 3. No Continuous Integration
|
|
238
|
+
|
|
239
|
+
- No automated testing in CI pipeline
|
|
240
|
+
- No code quality gates
|
|
241
|
+
- No security scanning
|
|
242
|
+
|
|
243
|
+
## Technical Debt Assessment
|
|
244
|
+
|
|
245
|
+
### High Priority Debt
|
|
246
|
+
|
|
247
|
+
1. **Monolithic Classes**: CloudXSetup class needs immediate refactoring
|
|
248
|
+
2. **Error Handling**: Systematic error handling needs implementation
|
|
249
|
+
3. **Testing**: Testing framework needs to be established
|
|
250
|
+
|
|
251
|
+
### Medium Priority Debt
|
|
252
|
+
|
|
253
|
+
1. **Type Safety**: Complete type hint coverage needed
|
|
254
|
+
2. **Configuration**: Centralized configuration system required
|
|
255
|
+
3. **Security**: Input validation and sanitization needed
|
|
256
|
+
|
|
257
|
+
### Low Priority Debt
|
|
258
|
+
|
|
259
|
+
1. **Performance**: Optimization opportunities exist
|
|
260
|
+
2. **Documentation**: API documentation incomplete
|
|
261
|
+
3. **Tooling**: Development tooling could be improved
|
|
262
|
+
|
|
263
|
+
## Recommendations Summary
|
|
264
|
+
|
|
265
|
+
### Immediate Actions (Week 1-2)
|
|
266
|
+
|
|
267
|
+
1. **Split CloudXSetup class** into focused components
|
|
268
|
+
2. **Add type hints** to all public interfaces
|
|
269
|
+
3. **Implement proper error handling** with custom exceptions
|
|
270
|
+
4. **Add input validation** for security-critical operations
|
|
271
|
+
|
|
272
|
+
### Short Term (Month 1)
|
|
273
|
+
|
|
274
|
+
1. **Establish testing framework** with pytest
|
|
275
|
+
2. **Create configuration management** system
|
|
276
|
+
3. **Add dependency injection** for external services
|
|
277
|
+
4. **Implement proper logging** system
|
|
278
|
+
|
|
279
|
+
### Medium Term (Month 2-3)
|
|
280
|
+
|
|
281
|
+
1. **Achieve 80% test coverage**
|
|
282
|
+
2. **Add performance monitoring**
|
|
283
|
+
3. **Implement security scanning**
|
|
284
|
+
4. **Add comprehensive documentation**
|
|
285
|
+
|
|
286
|
+
### Long Term (Month 3+)
|
|
287
|
+
|
|
288
|
+
1. **Consider async operations** for I/O bound tasks
|
|
289
|
+
2. **Add caching layer** for improved performance
|
|
290
|
+
3. **Implement monitoring hooks**
|
|
291
|
+
4. **Add plugin architecture** for extensibility
|
|
292
|
+
|
|
293
|
+
## Success Metrics
|
|
294
|
+
|
|
295
|
+
- **Bug Reduction**: Target 50% reduction in reported issues
|
|
296
|
+
- **Development Velocity**: Target 80% faster feature development
|
|
297
|
+
- **Test Coverage**: Target 90% line coverage
|
|
298
|
+
- **Type Safety**: Target 95% type hint coverage
|
|
299
|
+
- **Security**: Zero high-risk security vulnerabilities
|
|
300
|
+
- **Performance**: Sub-5-second connection establishment
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
## [0.9.6](https://github.com/easytocloud/cloudX-proxy/compare/v0.9.5...v0.9.6) (2025-11-14)
|
|
2
|
+
|
|
3
|
+
## [0.9.5](https://github.com/easytocloud/cloudX-proxy/compare/v0.9.4...v0.9.5) (2025-10-27)
|
|
4
|
+
|
|
1
5
|
## [0.9.4](https://github.com/easytocloud/cloudX-proxy/compare/v0.9.3...v0.9.4) (2025-09-15)
|
|
2
6
|
|
|
3
7
|
## [0.9.3](https://github.com/easytocloud/cloudX-proxy/compare/v0.9.2...v0.9.3) (2025-09-12)
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Documentation Analysis Findings
|
|
2
|
+
|
|
3
|
+
## Assessment: Areas Where New Users Will Struggle
|
|
4
|
+
|
|
5
|
+
**Date:** 2025-01-09
|
|
6
|
+
**Status:** Identified issues for future improvement
|
|
7
|
+
**Context:** Analysis of README.md comprehensiveness for new users
|
|
8
|
+
|
|
9
|
+
### Critical Confusion Points
|
|
10
|
+
|
|
11
|
+
#### 1. **What is CloudX?**
|
|
12
|
+
- The document mentions "CloudX/Cloud9 EC2 instances" but never explains what CloudX is
|
|
13
|
+
- Users don't know if they need CloudX or if this works with any EC2 instance
|
|
14
|
+
- No explanation of the relationship between CloudX and regular EC2
|
|
15
|
+
- **Impact:** High - Users can't determine if this tool is for them
|
|
16
|
+
|
|
17
|
+
#### 2. **AWS Prerequisites Missing**
|
|
18
|
+
- Doesn't explain that users need an AWS account with proper IAM setup
|
|
19
|
+
- The AWS permissions section comes too late and assumes CloudX environment exists
|
|
20
|
+
- No mention of needing EC2 instances to connect to
|
|
21
|
+
- **Impact:** High - Users can't complete setup without proper AWS foundation
|
|
22
|
+
|
|
23
|
+
#### 3. **Installation Section is Empty**
|
|
24
|
+
- Says "available on PyPI" but gives no installation instructions
|
|
25
|
+
- Contradicts itself by saying "can run using uvx without explicit installation"
|
|
26
|
+
- **Impact:** Medium - Confusing but uvx usage is explained elsewhere
|
|
27
|
+
|
|
28
|
+
#### 4. **Quick Start Too Brief**
|
|
29
|
+
- Missing context about what AWS profile/instance ID users should use
|
|
30
|
+
- Assumes users have instances ready to connect to
|
|
31
|
+
- **Impact:** Medium - Experienced users can figure out, but new users stuck
|
|
32
|
+
|
|
33
|
+
### Structure Issues
|
|
34
|
+
|
|
35
|
+
#### 5. **Troubleshooting Numbering Errors**
|
|
36
|
+
- Two different "2." entries in troubleshooting section (lines 476, 482)
|
|
37
|
+
- Confusing flow and organization
|
|
38
|
+
- **Impact:** Low - Functional but unprofessional
|
|
39
|
+
|
|
40
|
+
#### 6. **Technical Jargon Without Explanation**
|
|
41
|
+
- Terms like "SSM", "EC2 Instance Connect", "ABAC" used without definition
|
|
42
|
+
- ProxyCommand, IdentityAgent concepts not explained for SSH beginners
|
|
43
|
+
- **Impact:** Medium - Excludes users without AWS/SSH background
|
|
44
|
+
|
|
45
|
+
### Missing Critical Information
|
|
46
|
+
|
|
47
|
+
#### 7. **No Clear First-Time User Path**
|
|
48
|
+
- Doesn't explain the order of operations for someone who has never used this
|
|
49
|
+
- AWS setup comes after tool setup, but AWS is needed first
|
|
50
|
+
- **Impact:** High - New users don't know where to start
|
|
51
|
+
|
|
52
|
+
#### 8. **Incomplete AWS Guidance**
|
|
53
|
+
- Mentions cloudX-user from Service Catalog but doesn't explain how to get it
|
|
54
|
+
- ABAC tags and permissions explained too late
|
|
55
|
+
- No guidance on how to create EC2 instances if you don't have CloudX
|
|
56
|
+
- **Impact:** High - Users can't complete AWS setup
|
|
57
|
+
|
|
58
|
+
## Recommended Future Improvements
|
|
59
|
+
|
|
60
|
+
### Priority 1 (High Impact)
|
|
61
|
+
1. Add "What is CloudX?" section explaining the ecosystem
|
|
62
|
+
2. Move AWS prerequisites to the top with complete setup guide
|
|
63
|
+
3. Add first-time user workflow section
|
|
64
|
+
4. Clarify AWS permissions and how to obtain them
|
|
65
|
+
|
|
66
|
+
### Priority 2 (Medium Impact)
|
|
67
|
+
5. Add glossary section for technical terms
|
|
68
|
+
6. Complete the Installation section properly
|
|
69
|
+
7. Expand Quick Start with more context
|
|
70
|
+
8. Fix technical jargon with explanations
|
|
71
|
+
|
|
72
|
+
### Priority 3 (Low Impact)
|
|
73
|
+
9. Fix numbering errors in troubleshooting
|
|
74
|
+
10. Improve document flow and organization
|
|
75
|
+
|
|
76
|
+
## Implementation Notes
|
|
77
|
+
|
|
78
|
+
- Focus on reducing assumptions about user knowledge
|
|
79
|
+
- Provide clear prerequisites before diving into setup
|
|
80
|
+
- Add beginner-friendly explanations for AWS and SSH concepts
|
|
81
|
+
- Create a logical flow: AWS setup → Tool setup → VSCode configuration → Usage
|
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
# Code Quality Improvement Roadmap
|
|
2
|
+
|
|
3
|
+
This document outlines a comprehensive 6-phase plan to improve the cloudX-proxy codebase architecture, code quality, testing, and maintainability based on the findings in [ARCHITECTURE_REVIEW.md](./ARCHITECTURE_REVIEW.md).
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The improvement plan is structured in 6 phases, prioritized by impact and dependencies. Each phase builds upon the previous ones to create a robust, maintainable, and testable codebase.
|
|
8
|
+
|
|
9
|
+
**Total Estimated Timeline**: 3-4 months
|
|
10
|
+
**Expected Outcomes**: 50% bug reduction, 80% faster development, 90% test coverage
|
|
11
|
+
|
|
12
|
+
## Phase 1: Foundation & Architecture (Weeks 1-3) 🏗️
|
|
13
|
+
|
|
14
|
+
**Priority**: Critical
|
|
15
|
+
**Dependencies**: None
|
|
16
|
+
**Effort**: 3 weeks
|
|
17
|
+
|
|
18
|
+
### 1.1 Configuration Management System
|
|
19
|
+
|
|
20
|
+
**Goal**: Eliminate magic strings and centralize configuration
|
|
21
|
+
|
|
22
|
+
**Tasks**:
|
|
23
|
+
- Create `cloudx_proxy/config.py` with dataclasses
|
|
24
|
+
- Define configuration schemas with Pydantic validation
|
|
25
|
+
- Extract all hardcoded values ('vscode', 22, 'eu-west-1', etc.)
|
|
26
|
+
- Support environment-based configurations (dev/prod/test)
|
|
27
|
+
|
|
28
|
+
**Files to Create**:
|
|
29
|
+
```
|
|
30
|
+
cloudx_proxy/
|
|
31
|
+
├── config.py # Configuration dataclasses and validation
|
|
32
|
+
├── constants.py # All magic constants
|
|
33
|
+
└── exceptions.py # Custom exception hierarchy
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**Success Criteria**:
|
|
37
|
+
- Zero magic strings in business logic
|
|
38
|
+
- All configuration validated at startup
|
|
39
|
+
- Environment-specific configurations working
|
|
40
|
+
|
|
41
|
+
### 1.2 Dependency Injection & Interfaces
|
|
42
|
+
|
|
43
|
+
**Goal**: Enable testable architecture through abstraction
|
|
44
|
+
|
|
45
|
+
**Tasks**:
|
|
46
|
+
- Create interfaces for external dependencies
|
|
47
|
+
- Implement dependency injection pattern
|
|
48
|
+
- Create factory classes for AWS clients
|
|
49
|
+
- Abstract file system operations
|
|
50
|
+
|
|
51
|
+
**Files to Create**:
|
|
52
|
+
```
|
|
53
|
+
cloudx_proxy/
|
|
54
|
+
├── interfaces/
|
|
55
|
+
│ ├── aws_interface.py # AWS service abstractions
|
|
56
|
+
│ ├── file_interface.py # File system abstractions
|
|
57
|
+
│ └── process_interface.py # Subprocess abstractions
|
|
58
|
+
├── factories/
|
|
59
|
+
│ ├── aws_factory.py # AWS client factories
|
|
60
|
+
│ └── service_factory.py # Service creation
|
|
61
|
+
└── services/
|
|
62
|
+
└── base_service.py # Base service class
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**Success Criteria**:
|
|
66
|
+
- All external dependencies abstracted
|
|
67
|
+
- Constructor injection implemented
|
|
68
|
+
- Easy to mock for testing
|
|
69
|
+
|
|
70
|
+
### 1.3 Error Handling System
|
|
71
|
+
|
|
72
|
+
**Goal**: Implement robust error handling with context preservation
|
|
73
|
+
|
|
74
|
+
**Tasks**:
|
|
75
|
+
- Design custom exception hierarchy
|
|
76
|
+
- Implement error context preservation
|
|
77
|
+
- Add structured logging system
|
|
78
|
+
- Create error recovery strategies
|
|
79
|
+
|
|
80
|
+
**Exception Hierarchy**:
|
|
81
|
+
```python
|
|
82
|
+
CloudXProxyError
|
|
83
|
+
├── ConfigurationError
|
|
84
|
+
├── AWSError
|
|
85
|
+
│ ├── InstanceNotFoundError
|
|
86
|
+
│ ├── PermissionError
|
|
87
|
+
│ └── RegionError
|
|
88
|
+
├── SSHError
|
|
89
|
+
│ ├── KeyError
|
|
90
|
+
│ └── ConfigError
|
|
91
|
+
└── OnePasswordError
|
|
92
|
+
├── CLINotFoundError
|
|
93
|
+
└── AuthenticationError
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**Success Criteria**:
|
|
97
|
+
- All errors have specific types
|
|
98
|
+
- Error context preserved throughout stack
|
|
99
|
+
- Actionable error messages
|
|
100
|
+
- Structured logging implemented
|
|
101
|
+
|
|
102
|
+
## Phase 2: Code Quality & Type Safety (Weeks 4-6) 🔒
|
|
103
|
+
|
|
104
|
+
**Priority**: High
|
|
105
|
+
**Dependencies**: Phase 1
|
|
106
|
+
**Effort**: 3 weeks
|
|
107
|
+
|
|
108
|
+
### 2.1 Type System Improvements
|
|
109
|
+
|
|
110
|
+
**Goal**: Achieve 95% type coverage with proper type safety
|
|
111
|
+
|
|
112
|
+
**Tasks**:
|
|
113
|
+
- Add complete type hints to all functions
|
|
114
|
+
- Use proper generic types and protocols
|
|
115
|
+
- Configure mypy with strict settings
|
|
116
|
+
- Fix all type checking errors
|
|
117
|
+
|
|
118
|
+
**Type Safety Targets**:
|
|
119
|
+
```python
|
|
120
|
+
# Before
|
|
121
|
+
def connect(self, instance_id, port=22):
|
|
122
|
+
return True
|
|
123
|
+
|
|
124
|
+
# After
|
|
125
|
+
def connect(self, instance_id: InstanceId, port: Port = 22) -> ConnectionResult:
|
|
126
|
+
return ConnectionResult(success=True, session_id="...")
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
**Success Criteria**:
|
|
130
|
+
- 95% type hint coverage
|
|
131
|
+
- Zero mypy errors
|
|
132
|
+
- Proper use of generics and protocols
|
|
133
|
+
|
|
134
|
+
### 2.2 Input Validation & Security
|
|
135
|
+
|
|
136
|
+
**Goal**: Prevent security vulnerabilities through proper validation
|
|
137
|
+
|
|
138
|
+
**Tasks**:
|
|
139
|
+
- Implement input validation for all user inputs
|
|
140
|
+
- Audit subprocess calls for injection vulnerabilities
|
|
141
|
+
- Add path traversal protection
|
|
142
|
+
- Secure credential handling
|
|
143
|
+
|
|
144
|
+
**Validation Rules**:
|
|
145
|
+
- Instance IDs: `^i-[0-9a-f]{8,17}$`
|
|
146
|
+
- Regions: AWS region validation
|
|
147
|
+
- File paths: No parent directory traversal
|
|
148
|
+
- Commands: Whitelist allowed commands
|
|
149
|
+
|
|
150
|
+
**Success Criteria**:
|
|
151
|
+
- All inputs validated
|
|
152
|
+
- Zero high-risk security vulnerabilities
|
|
153
|
+
- Comprehensive security audit passed
|
|
154
|
+
|
|
155
|
+
### 2.3 Resource Management
|
|
156
|
+
|
|
157
|
+
**Goal**: Proper resource management and cleanup
|
|
158
|
+
|
|
159
|
+
**Tasks**:
|
|
160
|
+
- Use context managers for all file operations
|
|
161
|
+
- Add timeout management for network operations
|
|
162
|
+
- Implement proper AWS client lifecycle
|
|
163
|
+
- Ensure resource cleanup
|
|
164
|
+
|
|
165
|
+
**Success Criteria**:
|
|
166
|
+
- All file operations use context managers
|
|
167
|
+
- Network operations have proper timeouts
|
|
168
|
+
- No resource leaks
|
|
169
|
+
|
|
170
|
+
## Phase 3: Architecture Refactoring (Weeks 7-9) 🏛️
|
|
171
|
+
|
|
172
|
+
**Priority**: High
|
|
173
|
+
**Dependencies**: Phases 1-2
|
|
174
|
+
**Effort**: 3 weeks
|
|
175
|
+
|
|
176
|
+
### 3.1 Single Responsibility Principle
|
|
177
|
+
|
|
178
|
+
**Goal**: Break down monolithic classes into focused components
|
|
179
|
+
|
|
180
|
+
**Tasks**:
|
|
181
|
+
- Split CloudXSetup into focused classes
|
|
182
|
+
- Extract CLI logic to service layer
|
|
183
|
+
- Create domain-specific modules
|
|
184
|
+
- Implement clean service boundaries
|
|
185
|
+
|
|
186
|
+
**New Architecture**:
|
|
187
|
+
```
|
|
188
|
+
cloudx_proxy/
|
|
189
|
+
├── services/
|
|
190
|
+
│ ├── aws_profile_manager.py # AWS profile operations
|
|
191
|
+
│ ├── ssh_config_builder.py # SSH configuration
|
|
192
|
+
│ ├── onepassword_manager.py # 1Password integration
|
|
193
|
+
│ └── user_interface.py # User interaction
|
|
194
|
+
├── domain/
|
|
195
|
+
│ ├── aws/ # AWS-related logic
|
|
196
|
+
│ ├── ssh/ # SSH operations
|
|
197
|
+
│ └── onepassword/ # 1Password operations
|
|
198
|
+
└── utils/
|
|
199
|
+
├── file_ops.py # File utilities
|
|
200
|
+
└── subprocess_helper.py # Safe subprocess operations
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
**Success Criteria**:
|
|
204
|
+
- No class over 200 lines
|
|
205
|
+
- Each class has single responsibility
|
|
206
|
+
- Clear service boundaries
|
|
207
|
+
|
|
208
|
+
### 3.2 Code Organization
|
|
209
|
+
|
|
210
|
+
**Goal**: Organize code by domain and concern
|
|
211
|
+
|
|
212
|
+
**Tasks**:
|
|
213
|
+
- Reorganize modules by domain
|
|
214
|
+
- Extract common utilities
|
|
215
|
+
- Create models for data structures
|
|
216
|
+
- Implement clean import structure
|
|
217
|
+
|
|
218
|
+
**Success Criteria**:
|
|
219
|
+
- Logical module organization
|
|
220
|
+
- No circular dependencies
|
|
221
|
+
- Clear public APIs
|
|
222
|
+
|
|
223
|
+
## Phase 4: Testing Framework (Weeks 10-12) 🧪
|
|
224
|
+
|
|
225
|
+
**Priority**: Medium
|
|
226
|
+
**Dependencies**: Phase 3
|
|
227
|
+
**Effort**: 3 weeks
|
|
228
|
+
|
|
229
|
+
### 4.1 Testing Infrastructure
|
|
230
|
+
|
|
231
|
+
**Goal**: Establish comprehensive testing framework
|
|
232
|
+
|
|
233
|
+
**Tasks**:
|
|
234
|
+
- Configure pytest with proper structure
|
|
235
|
+
- Set up mocking strategy
|
|
236
|
+
- Create test fixtures and utilities
|
|
237
|
+
- Configure test environments
|
|
238
|
+
|
|
239
|
+
**Test Structure**:
|
|
240
|
+
```
|
|
241
|
+
tests/
|
|
242
|
+
├── unit/ # Unit tests
|
|
243
|
+
│ ├── test_services/
|
|
244
|
+
│ ├── test_domain/
|
|
245
|
+
│ └── test_utils/
|
|
246
|
+
├── integration/ # Integration tests
|
|
247
|
+
├── fixtures/ # Test fixtures
|
|
248
|
+
├── mocks/ # Mock implementations
|
|
249
|
+
└── conftest.py # Pytest configuration
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
**Success Criteria**:
|
|
253
|
+
- Pytest configured and working
|
|
254
|
+
- Comprehensive mocking strategy
|
|
255
|
+
- Test fixtures for common scenarios
|
|
256
|
+
|
|
257
|
+
### 4.2 Test Coverage
|
|
258
|
+
|
|
259
|
+
**Goal**: Achieve 90% test coverage
|
|
260
|
+
|
|
261
|
+
**Tasks**:
|
|
262
|
+
- Write unit tests for all services
|
|
263
|
+
- Create integration tests for workflows
|
|
264
|
+
- Add contract tests for interfaces
|
|
265
|
+
- Implement property-based testing
|
|
266
|
+
|
|
267
|
+
**Coverage Targets**:
|
|
268
|
+
- Unit tests: 95% coverage
|
|
269
|
+
- Integration tests: Key workflows
|
|
270
|
+
- Contract tests: All interfaces
|
|
271
|
+
- Performance tests: Critical paths
|
|
272
|
+
|
|
273
|
+
**Success Criteria**:
|
|
274
|
+
- 90% overall test coverage
|
|
275
|
+
- All critical paths tested
|
|
276
|
+
- Fast test execution (<30s)
|
|
277
|
+
|
|
278
|
+
### 4.3 CI Integration
|
|
279
|
+
|
|
280
|
+
**Goal**: Automated quality gates
|
|
281
|
+
|
|
282
|
+
**Tasks**:
|
|
283
|
+
- Add test runs to GitHub Actions
|
|
284
|
+
- Configure coverage reporting
|
|
285
|
+
- Add type checking to CI
|
|
286
|
+
- Implement code quality gates
|
|
287
|
+
|
|
288
|
+
**CI Pipeline**:
|
|
289
|
+
```yaml
|
|
290
|
+
Quality Gates:
|
|
291
|
+
- Unit tests pass
|
|
292
|
+
- Coverage > 90%
|
|
293
|
+
- Type checking passes
|
|
294
|
+
- Security scan passes
|
|
295
|
+
- Code formatting correct
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
**Success Criteria**:
|
|
299
|
+
- All PRs run full test suite
|
|
300
|
+
- Quality gates prevent regressions
|
|
301
|
+
- Coverage reports generated
|
|
302
|
+
|
|
303
|
+
## Phase 5: Performance & Reliability (Weeks 13-14) ⚡
|
|
304
|
+
|
|
305
|
+
**Priority**: Medium
|
|
306
|
+
**Dependencies**: Phase 4
|
|
307
|
+
**Effort**: 2 weeks
|
|
308
|
+
|
|
309
|
+
### 5.1 Performance Optimizations
|
|
310
|
+
|
|
311
|
+
**Goal**: Improve performance and resource utilization
|
|
312
|
+
|
|
313
|
+
**Tasks**:
|
|
314
|
+
- Implement connection pooling for AWS clients
|
|
315
|
+
- Add caching for configuration lookups
|
|
316
|
+
- Optimize file operations
|
|
317
|
+
- Consider async operations for I/O bound tasks
|
|
318
|
+
|
|
319
|
+
**Performance Targets**:
|
|
320
|
+
- Connection establishment: <5 seconds
|
|
321
|
+
- Configuration parsing: <1 second
|
|
322
|
+
- Memory usage: <50MB baseline
|
|
323
|
+
- CPU usage: <20% during operations
|
|
324
|
+
|
|
325
|
+
**Success Criteria**:
|
|
326
|
+
- Performance targets met
|
|
327
|
+
- Resource usage optimized
|
|
328
|
+
- Benchmark suite implemented
|
|
329
|
+
|
|
330
|
+
### 5.2 Reliability Improvements
|
|
331
|
+
|
|
332
|
+
**Goal**: Handle failures gracefully
|
|
333
|
+
|
|
334
|
+
**Tasks**:
|
|
335
|
+
- Implement retry mechanisms with exponential backoff
|
|
336
|
+
- Add circuit breakers for external services
|
|
337
|
+
- Create health check capabilities
|
|
338
|
+
- Add monitoring hooks
|
|
339
|
+
|
|
340
|
+
**Reliability Features**:
|
|
341
|
+
- Automatic retries for transient failures
|
|
342
|
+
- Circuit breakers for AWS services
|
|
343
|
+
- Graceful degradation strategies
|
|
344
|
+
- Comprehensive error recovery
|
|
345
|
+
|
|
346
|
+
**Success Criteria**:
|
|
347
|
+
- Handles transient failures automatically
|
|
348
|
+
- No cascading failures
|
|
349
|
+
- Comprehensive error recovery
|
|
350
|
+
|
|
351
|
+
## Phase 6: Developer Experience (Weeks 15-16) 👩💻
|
|
352
|
+
|
|
353
|
+
**Priority**: Low
|
|
354
|
+
**Dependencies**: Phase 5
|
|
355
|
+
**Effort**: 2 weeks
|
|
356
|
+
|
|
357
|
+
### 6.1 Documentation
|
|
358
|
+
|
|
359
|
+
**Goal**: Comprehensive documentation for developers
|
|
360
|
+
|
|
361
|
+
**Tasks**:
|
|
362
|
+
- Add API documentation with examples
|
|
363
|
+
- Create architecture documentation
|
|
364
|
+
- Update development setup guide
|
|
365
|
+
- Create troubleshooting documentation
|
|
366
|
+
|
|
367
|
+
**Documentation Structure**:
|
|
368
|
+
```
|
|
369
|
+
docs/
|
|
370
|
+
├── architecture/ # Architecture decisions
|
|
371
|
+
├── api/ # API documentation
|
|
372
|
+
├── development/ # Development guide
|
|
373
|
+
├── troubleshooting/ # Common issues
|
|
374
|
+
└── examples/ # Usage examples
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
**Success Criteria**:
|
|
378
|
+
- Complete API documentation
|
|
379
|
+
- Clear development guide
|
|
380
|
+
- Comprehensive troubleshooting
|
|
381
|
+
|
|
382
|
+
### 6.2 Development Tools
|
|
383
|
+
|
|
384
|
+
**Goal**: Improve developer productivity
|
|
385
|
+
|
|
386
|
+
**Tasks**:
|
|
387
|
+
- Configure pre-commit hooks
|
|
388
|
+
- Set up development environment automation
|
|
389
|
+
- Add debug tooling and enhanced logging
|
|
390
|
+
- Create code generation templates
|
|
391
|
+
|
|
392
|
+
**Developer Tools**:
|
|
393
|
+
- Pre-commit hooks for formatting and linting
|
|
394
|
+
- Docker development environment
|
|
395
|
+
- Debug mode with enhanced logging
|
|
396
|
+
- Code templates for new components
|
|
397
|
+
|
|
398
|
+
**Success Criteria**:
|
|
399
|
+
- Streamlined development setup
|
|
400
|
+
- Consistent code formatting
|
|
401
|
+
- Enhanced debugging capabilities
|
|
402
|
+
|
|
403
|
+
## Implementation Strategy
|
|
404
|
+
|
|
405
|
+
### Parallel Development
|
|
406
|
+
|
|
407
|
+
**Phases 1-2**: Foundation work (can be done by 1-2 developers)
|
|
408
|
+
**Phases 3-4**: Can be split between multiple developers:
|
|
409
|
+
- Developer A: Architecture refactoring
|
|
410
|
+
- Developer B: Testing framework
|
|
411
|
+
- Developer C: Documentation and tooling
|
|
412
|
+
|
|
413
|
+
### Risk Mitigation
|
|
414
|
+
|
|
415
|
+
**Breaking Changes**:
|
|
416
|
+
- Maintain backward compatibility where possible
|
|
417
|
+
- Use feature flags for major changes
|
|
418
|
+
- Comprehensive migration guide
|
|
419
|
+
|
|
420
|
+
**Timeline Risks**:
|
|
421
|
+
- Buffer time built into each phase
|
|
422
|
+
- Milestone reviews at phase boundaries
|
|
423
|
+
- Ability to deprioritize Phase 6 if needed
|
|
424
|
+
|
|
425
|
+
### Success Measurement
|
|
426
|
+
|
|
427
|
+
**Weekly Metrics**:
|
|
428
|
+
- Test coverage percentage
|
|
429
|
+
- Type hint coverage
|
|
430
|
+
- Code quality scores
|
|
431
|
+
- Performance benchmarks
|
|
432
|
+
|
|
433
|
+
**Milestone Reviews**:
|
|
434
|
+
- End of each phase review
|
|
435
|
+
- Architecture review after Phase 3
|
|
436
|
+
- Quality gate review after Phase 4
|
|
437
|
+
|
|
438
|
+
## Expected Outcomes
|
|
439
|
+
|
|
440
|
+
### Quantitative Benefits
|
|
441
|
+
|
|
442
|
+
- **50% reduction in bugs** through better error handling and type safety
|
|
443
|
+
- **80% faster development** through improved architecture and testing
|
|
444
|
+
- **90% test coverage** ensuring reliability
|
|
445
|
+
- **95% type coverage** preventing type-related errors
|
|
446
|
+
- **Sub-5-second performance** for connection establishment
|
|
447
|
+
|
|
448
|
+
### Qualitative Benefits
|
|
449
|
+
|
|
450
|
+
- **Maintainable codebase** that evolves with requirements
|
|
451
|
+
- **Confident deployments** through comprehensive testing
|
|
452
|
+
- **Faster onboarding** for new developers
|
|
453
|
+
- **Better security posture** through proper validation
|
|
454
|
+
- **Professional code quality** meeting industry standards
|
|
455
|
+
|
|
456
|
+
## Migration Path
|
|
457
|
+
|
|
458
|
+
### Backward Compatibility
|
|
459
|
+
|
|
460
|
+
- Maintain existing CLI interface
|
|
461
|
+
- Support existing configuration files
|
|
462
|
+
- Gradual migration of internal APIs
|
|
463
|
+
- Deprecation warnings for old patterns
|
|
464
|
+
|
|
465
|
+
### Rollout Strategy
|
|
466
|
+
|
|
467
|
+
1. **Phase 1-2**: Internal improvements, no user-facing changes
|
|
468
|
+
2. **Phase 3**: Service layer changes, maintain CLI compatibility
|
|
469
|
+
3. **Phase 4-6**: Enhanced features and developer experience
|
|
470
|
+
|
|
471
|
+
### Success Criteria by Phase
|
|
472
|
+
|
|
473
|
+
**Phase 1**: Configuration system working, error handling improved
|
|
474
|
+
**Phase 2**: Type safety achieved, security vulnerabilities fixed
|
|
475
|
+
**Phase 3**: Clean architecture, maintainable services
|
|
476
|
+
**Phase 4**: 90% test coverage, CI pipeline working
|
|
477
|
+
**Phase 5**: Performance targets met, reliability improved
|
|
478
|
+
**Phase 6**: Complete documentation, enhanced developer experience
|
|
479
|
+
|
|
480
|
+
This roadmap provides a clear path from the current state to a production-ready, maintainable, and well-tested codebase that will serve as a solid foundation for future development.
|
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '0.9.
|
|
32
|
-
__version_tuple__ = version_tuple = (0, 9,
|
|
31
|
+
__version__ = version = '0.9.6'
|
|
32
|
+
__version_tuple__ = version_tuple = (0, 9, 6)
|
|
33
33
|
|
|
34
34
|
__commit_id__ = commit_id = None
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|