difflicious 0.1.0__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.
- difflicious/__init__.py +6 -0
- difflicious/app.py +505 -0
- difflicious/cli.py +77 -0
- difflicious/diff_parser.py +525 -0
- difflicious/dummy_data.json +44 -0
- difflicious/git_operations.py +1005 -0
- difflicious/services/__init__.py +1 -0
- difflicious/services/base_service.py +32 -0
- difflicious/services/diff_service.py +403 -0
- difflicious/services/exceptions.py +19 -0
- difflicious/services/git_service.py +135 -0
- difflicious/services/syntax_service.py +162 -0
- difflicious/services/template_service.py +382 -0
- difflicious/static/css/styles.css +885 -0
- difflicious/static/css/tailwind.css +1 -0
- difflicious/static/css/tailwind.input.css +5 -0
- difflicious/static/js/app.js +1002 -0
- difflicious/static/js/diff-interactions.js +1617 -0
- difflicious/templates/base.html +54 -0
- difflicious/templates/diff_file.html +90 -0
- difflicious/templates/diff_groups.html +29 -0
- difflicious/templates/diff_hunk.html +170 -0
- difflicious/templates/index.html +54 -0
- difflicious/templates/partials/empty_state.html +29 -0
- difflicious/templates/partials/global_controls.html +23 -0
- difflicious/templates/partials/loading_state.html +7 -0
- difflicious/templates/partials/toolbar.html +165 -0
- difflicious-0.1.0.dist-info/METADATA +190 -0
- difflicious-0.1.0.dist-info/RECORD +32 -0
- difflicious-0.1.0.dist-info/WHEEL +4 -0
- difflicious-0.1.0.dist-info/entry_points.txt +2 -0
- difflicious-0.1.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: difflicious
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: A sleek web-based git diff visualization tool for developers
|
|
5
|
+
Project-URL: Homepage, https://github.com/insipid/difflicious
|
|
6
|
+
Project-URL: Repository, https://github.com/insipid/difflicious
|
|
7
|
+
Project-URL: Issues, https://github.com/insipid/difflicious/issues
|
|
8
|
+
Author-email: Drew <noreply@example.com>
|
|
9
|
+
License: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: development,diff,git,visualization,web
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Topic :: Software Development :: Version Control :: Git
|
|
21
|
+
Classifier: Topic :: Text Processing :: General
|
|
22
|
+
Requires-Python: >=3.9
|
|
23
|
+
Requires-Dist: click>=8.0.0
|
|
24
|
+
Requires-Dist: flask>=2.3.0
|
|
25
|
+
Requires-Dist: jinja-partials>=0.2.0
|
|
26
|
+
Requires-Dist: markupsafe>=2.1.0
|
|
27
|
+
Requires-Dist: pygments>=2.17.0
|
|
28
|
+
Requires-Dist: unidiff>=0.7.5
|
|
29
|
+
Provides-Extra: dev
|
|
30
|
+
Requires-Dist: black>=23.0.0; extra == 'dev'
|
|
31
|
+
Requires-Dist: mypy>=1.0.0; extra == 'dev'
|
|
32
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == 'dev'
|
|
33
|
+
Requires-Dist: pytest>=7.0.0; extra == 'dev'
|
|
34
|
+
Requires-Dist: ruff>=0.1.0; extra == 'dev'
|
|
35
|
+
Description-Content-Type: text/markdown
|
|
36
|
+
|
|
37
|
+
# Difflicious
|
|
38
|
+
|
|
39
|
+
A sleek web-based git diff visualization tool used when working locally on branches. Difflicious provides a lightweight local web application that transforms git diffs into an intuitive, interactive experience.
|
|
40
|
+
|
|
41
|
+
## What is Difflicious?
|
|
42
|
+
|
|
43
|
+
Difflicious is a developer-focused tool that runs locally and provides a beautiful interface for viewing git changes. Instead of squinting at terminal output, you get a clean, searchable, and toggleable view of your work-in-progress changes.
|
|
44
|
+
|
|
45
|
+
Perfect for:
|
|
46
|
+
- Reviewing changes before committing
|
|
47
|
+
- Understanding complex diffs across multiple files
|
|
48
|
+
- Quickly navigating through modifications in your current branch
|
|
49
|
+
- Getting a bird's-eye view of your development progress
|
|
50
|
+
|
|
51
|
+
## Features
|
|
52
|
+
|
|
53
|
+
- **Side-by-Side Diff Visualization**: Professional-grade side-by-side view with accurate line numbering
|
|
54
|
+
- **Syntax Highlighting**: Beautiful code highlighting for 30+ programming languages using Highlight.js
|
|
55
|
+
- **Intelligent Diff Parsing**: Advanced git diff parser with proper alignment of additions and deletions
|
|
56
|
+
- **Smart UI Controls**: Expand/collapse all buttons with intelligent disabled states
|
|
57
|
+
- **Interactive Interface**: Toggle visibility, search through changes, and filter content
|
|
58
|
+
- **Clean File Paths**: Automatic removal of git diff artifacts (a/, b/ prefixes)
|
|
59
|
+
- **Secure Git Integration**: Safe git command execution with subprocess sanitization
|
|
60
|
+
- **Real-time Status**: Live git repository status and branch information
|
|
61
|
+
- **Modern UI**: Clean Tailwind CSS design with responsive layout
|
|
62
|
+
- **Lightweight**: Minimal infrastructure using Flask backend and Alpine.js frontend
|
|
63
|
+
- **Developer-Friendly**: Designed by developers, for developers
|
|
64
|
+
|
|
65
|
+
## Installation & Quick Start
|
|
66
|
+
|
|
67
|
+
### Option 1: Install from PyPI (Recommended)
|
|
68
|
+
```bash
|
|
69
|
+
# Install via pip
|
|
70
|
+
pip install difflicious
|
|
71
|
+
|
|
72
|
+
# Run the application
|
|
73
|
+
difflicious
|
|
74
|
+
|
|
75
|
+
# Open your browser to localhost:5000
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Option 2: Docker (Containerized)
|
|
79
|
+
```bash
|
|
80
|
+
# Pull and run the Docker image
|
|
81
|
+
docker run -p 5000:5000 -v $(pwd):/workspace difflicious/difflicious
|
|
82
|
+
|
|
83
|
+
# Open your browser to localhost:5000
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Option 3: From Source (Development)
|
|
87
|
+
```bash
|
|
88
|
+
# Clone the repository
|
|
89
|
+
git clone https://github.com/insipid/difflicious.git
|
|
90
|
+
cd difflicious
|
|
91
|
+
|
|
92
|
+
# Install uv if not already installed
|
|
93
|
+
xoxo
|
|
94
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
95
|
+
|
|
96
|
+
# Create virtual environment and install dependencies
|
|
97
|
+
uv sync
|
|
98
|
+
|
|
99
|
+
# Run the application
|
|
100
|
+
uv run difflicious
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Font Customization
|
|
104
|
+
|
|
105
|
+
Difflicious supports beautiful programming fonts via Google Fonts CDN integration. You can customize the font used for code and diff content.
|
|
106
|
+
|
|
107
|
+
### Available Fonts
|
|
108
|
+
|
|
109
|
+
- **JetBrains Mono** (default) - Designed specifically for developers
|
|
110
|
+
- **Fira Code** - Popular programming font with ligatures
|
|
111
|
+
- **Source Code Pro** - Adobe's professional programming font
|
|
112
|
+
- **IBM Plex Mono** - Modern, clean monospace design
|
|
113
|
+
- **Roboto Mono** - Google's versatile monospace font
|
|
114
|
+
- **Inconsolata** - Humanist monospace font
|
|
115
|
+
|
|
116
|
+
### Font Configuration
|
|
117
|
+
|
|
118
|
+
Set the `DIFFLICIOUS_FONT` environment variable to choose your preferred font:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
# Use Fira Code
|
|
122
|
+
export DIFFLICIOUS_FONT=fira-code
|
|
123
|
+
difflicious
|
|
124
|
+
|
|
125
|
+
# Use Source Code Pro
|
|
126
|
+
export DIFFLICIOUS_FONT=source-code-pro
|
|
127
|
+
difflicious
|
|
128
|
+
|
|
129
|
+
# List all available fonts
|
|
130
|
+
difflicious --list-fonts
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Available Font Keys
|
|
134
|
+
|
|
135
|
+
- `jetbrains-mono` - JetBrains Mono (default)
|
|
136
|
+
- `fira-code` - Fira Code
|
|
137
|
+
- `source-code-pro` - Source Code Pro
|
|
138
|
+
- `ibm-plex-mono` - IBM Plex Mono
|
|
139
|
+
- `roboto-mono` - Roboto Mono
|
|
140
|
+
- `inconsolata` - Inconsolata
|
|
141
|
+
|
|
142
|
+
### Disable Google Fonts
|
|
143
|
+
|
|
144
|
+
If you prefer to use system fonts only (no external CDN requests):
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
export DIFFLICIOUS_DISABLE_GOOGLE_FONTS=true
|
|
148
|
+
difflicious
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
This will fall back to system monospace fonts like SF Mono, Cascadia Code, Monaco, and Consolas.
|
|
152
|
+
|
|
153
|
+
## Technology Stack
|
|
154
|
+
|
|
155
|
+
- **Backend**: Python Flask for minimal setup and excellent git integration
|
|
156
|
+
- **Frontend**: Alpine.js + vanilla CSS for lightweight, declarative UI
|
|
157
|
+
- **Real-time**: Server-Sent Events for live git status updates
|
|
158
|
+
- **Security**: Proper subprocess sanitization for safe git command execution
|
|
159
|
+
- **Distribution**: Modern Python packaging (PyPI) and Docker containers
|
|
160
|
+
- **Development**: uv for fast Python package management and virtual environments
|
|
161
|
+
|
|
162
|
+
## Development Status
|
|
163
|
+
|
|
164
|
+
✅ **Production-ready diff visualization** - Advanced side-by-side interface implemented!
|
|
165
|
+
|
|
166
|
+
### Completed ✅
|
|
167
|
+
- Modern Python project structure with pyproject.toml and uv
|
|
168
|
+
- Flask backend with comprehensive API endpoints
|
|
169
|
+
- Advanced git diff parser with side-by-side structure
|
|
170
|
+
- Professional side-by-side diff visualization interface
|
|
171
|
+
- Secure git command execution wrapper with subprocess sanitization
|
|
172
|
+
- Interactive Alpine.js frontend with Tailwind CSS styling
|
|
173
|
+
- Comprehensive test suite (28 tests, 73% coverage)
|
|
174
|
+
- Real git integration (status, diff, branch detection, parsing)
|
|
175
|
+
|
|
176
|
+
### Coming Soon 🚧
|
|
177
|
+
- Docker containerization with uv
|
|
178
|
+
- PyPI package publishing
|
|
179
|
+
- Enhanced syntax highlighting for code content
|
|
180
|
+
- Advanced search and filtering capabilities
|
|
181
|
+
- Keyboard shortcuts and accessibility features
|
|
182
|
+
- Server-Sent Events for real-time updates
|
|
183
|
+
|
|
184
|
+
## Contributing
|
|
185
|
+
|
|
186
|
+
This project is in early development. More contribution guidelines will be available as the core functionality is completed.
|
|
187
|
+
|
|
188
|
+
## License
|
|
189
|
+
|
|
190
|
+
MIT License - see LICENSE file for details.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
difflicious/__init__.py,sha256=Npx_GS-QsbJarHUbaxNcyT6T_XKDlRtO9F4SC7FQtfc,225
|
|
2
|
+
difflicious/app.py,sha256=de27J605UF6vT0dUKnWWTT1jkyGEGfrawolAr5IgWuI,20243
|
|
3
|
+
difflicious/cli.py,sha256=SuzfjxzdePaqTWOSHpBDJIrZizLsWhCAcf6lWQf4EjM,2391
|
|
4
|
+
difflicious/diff_parser.py,sha256=rEa-57Sic-BD1OZwOXIiEwJU24jDi83qg7pvVk7ae-8,17604
|
|
5
|
+
difflicious/dummy_data.json,sha256=PWSdISbuRzgLgc7AGzClItjO7dERXP6XSfkRYUe7huI,2606
|
|
6
|
+
difflicious/git_operations.py,sha256=lTXgCUM1X80xaK34eYnINiceApthNUXFb9viNp9-AYU,37530
|
|
7
|
+
difflicious/services/__init__.py,sha256=Wxhqj5pmwQdjXDEdy2KcbBPZHBvKAAmOH5sK9Q17hvY,51
|
|
8
|
+
difflicious/services/base_service.py,sha256=PunvoJwILcQ14skYhiX6yYRgbj4NflP78up_K0CVkOc,995
|
|
9
|
+
difflicious/services/diff_service.py,sha256=a2xp2QSciM1qvfLuWyACdTaY7IWcmQS5xWfOjbqBfbM,16130
|
|
10
|
+
difflicious/services/exceptions.py,sha256=p74eXZ46O0J-vQ4hFhiIRZbCcQIfPEmLHkcQQbzCc_A,334
|
|
11
|
+
difflicious/services/git_service.py,sha256=dhzmcUMmIFlU3dDrkCkPRbTI_4YBUCSuM6PqDuCZIso,4504
|
|
12
|
+
difflicious/services/syntax_service.py,sha256=OFVLOz0MrVTQDRGrCjmEdLJQnTowKm1-f4jbytiOGEg,5625
|
|
13
|
+
difflicious/services/template_service.py,sha256=lW4wAqp9C1r_ngkhFK1Z-c8mN5QddH2Gn5cPEv9S2kk,15386
|
|
14
|
+
difflicious/static/css/styles.css,sha256=T2UkMMtkYqvAqBjUQhGJ9PzytuIaw1Zd6JX52iozsSI,21866
|
|
15
|
+
difflicious/static/css/tailwind.css,sha256=es_PPn8acfVBJ7keY5sSWkzCg8ezHsW9axbZV0MNfXI,13906
|
|
16
|
+
difflicious/static/css/tailwind.input.css,sha256=CpVsNPuOef8MsdFdgpIdkSmoMs09XPdFCCph7RL31Ao,96
|
|
17
|
+
difflicious/static/js/app.js,sha256=QcpMngfa7wnk2Bg-aePZNcmPhtl496eA797IuMAj3Yg,40375
|
|
18
|
+
difflicious/static/js/diff-interactions.js,sha256=8zNTQCLbhbJL0MXCGQQ_FS35jOmXQoUQ01HzwraRs2M,69315
|
|
19
|
+
difflicious/templates/base.html,sha256=P0NTJmJfNCt3_VH_txEYqjhzVXPTfyJOYAdwegwlxzw,1692
|
|
20
|
+
difflicious/templates/diff_file.html,sha256=pliksc-XKGUpL1Zwhjc1dh_HiBA1Br4ZexPu-B1900c,4469
|
|
21
|
+
difflicious/templates/diff_groups.html,sha256=NZiCzeDZkBQj6uiYS97t24UjIniOvVa58QmR1FN5vbQ,1286
|
|
22
|
+
difflicious/templates/diff_hunk.html,sha256=W8qwPVj1Qjo7TJeyIpmIDOCUQj6y7erRCbjYVmUm1c4,9919
|
|
23
|
+
difflicious/templates/index.html,sha256=Az1P5OyD46ybZo11PtykdsiIQxFOLmPRX7o9eUrpJP4,1947
|
|
24
|
+
difflicious/templates/partials/empty_state.html,sha256=P7wwG5avrOwB5gHEQLvw2QHesXRWRw8Z9JbyJYIOSdo,1263
|
|
25
|
+
difflicious/templates/partials/global_controls.html,sha256=qx0YoVjENZKH0svE381HLMrauTTPSqjeE7Hejw4HPbQ,1535
|
|
26
|
+
difflicious/templates/partials/loading_state.html,sha256=r8ZqoeFfkmZFwH4Ruj7wXabbJk0PgMYtwbSy9yGZqdc,297
|
|
27
|
+
difflicious/templates/partials/toolbar.html,sha256=xXUoDBhViqmf5zZwZPC4pr5uHXejo9h-RIj8-uRyZ24,10818
|
|
28
|
+
difflicious-0.1.0.dist-info/METADATA,sha256=wCzldABrBxK_m-tTerR6pQLccQVDiG05dtW2B2A_6FQ,6731
|
|
29
|
+
difflicious-0.1.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
30
|
+
difflicious-0.1.0.dist-info/entry_points.txt,sha256=uU-dNhvVWb2ZcD5nmY6rA9TmwLnMZTQ9qDmtZKhEavY,53
|
|
31
|
+
difflicious-0.1.0.dist-info/licenses/LICENSE,sha256=yx9XSSR3ZKKrTqInWDAsvszNXnaiy-w85vb2A5iodMc,1067
|
|
32
|
+
difflicious-0.1.0.dist-info/RECORD,,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Drew Amato
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|