codebread 1.1.3__tar.gz → 1.1.4__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.
Files changed (42) hide show
  1. {codebread-1.1.3 → codebread-1.1.4}/PKG-INFO +10 -4
  2. {codebread-1.1.3 → codebread-1.1.4}/README.md +9 -3
  3. {codebread-1.1.3 → codebread-1.1.4}/codebread/web/app.js +50 -0
  4. {codebread-1.1.3 → codebread-1.1.4}/codebread/web/index.html +13 -0
  5. {codebread-1.1.3 → codebread-1.1.4}/codebread/web/style.css +37 -5
  6. {codebread-1.1.3 → codebread-1.1.4}/codebread.egg-info/PKG-INFO +10 -4
  7. {codebread-1.1.3 → codebread-1.1.4}/pyproject.toml +1 -1
  8. {codebread-1.1.3 → codebread-1.1.4}/LICENSE +0 -0
  9. {codebread-1.1.3 → codebread-1.1.4}/codebread/__init__.py +0 -0
  10. {codebread-1.1.3 → codebread-1.1.4}/codebread/analyzer.py +0 -0
  11. {codebread-1.1.3 → codebread-1.1.4}/codebread/classifier.py +0 -0
  12. {codebread-1.1.3 → codebread-1.1.4}/codebread/cli.py +0 -0
  13. {codebread-1.1.3 → codebread-1.1.4}/codebread/connections.py +0 -0
  14. {codebread-1.1.3 → codebread-1.1.4}/codebread/context.py +0 -0
  15. {codebread-1.1.3 → codebread-1.1.4}/codebread/deobfuscate.py +0 -0
  16. {codebread-1.1.3 → codebread-1.1.4}/codebread/diff.py +0 -0
  17. {codebread-1.1.3 → codebread-1.1.4}/codebread/export.py +0 -0
  18. {codebread-1.1.3 → codebread-1.1.4}/codebread/languages.py +0 -0
  19. {codebread-1.1.3 → codebread-1.1.4}/codebread/models.py +0 -0
  20. {codebread-1.1.3 → codebread-1.1.4}/codebread/parsers/__init__.py +0 -0
  21. {codebread-1.1.3 → codebread-1.1.4}/codebread/parsers/generic_parser.py +0 -0
  22. {codebread-1.1.3 → codebread-1.1.4}/codebread/parsers/javascript_parser.py +0 -0
  23. {codebread-1.1.3 → codebread-1.1.4}/codebread/parsers/python_parser.py +0 -0
  24. {codebread-1.1.3 → codebread-1.1.4}/codebread/scanner.py +0 -0
  25. {codebread-1.1.3 → codebread-1.1.4}/codebread/server.py +0 -0
  26. {codebread-1.1.3 → codebread-1.1.4}/codebread.egg-info/SOURCES.txt +0 -0
  27. {codebread-1.1.3 → codebread-1.1.4}/codebread.egg-info/dependency_links.txt +0 -0
  28. {codebread-1.1.3 → codebread-1.1.4}/codebread.egg-info/entry_points.txt +0 -0
  29. {codebread-1.1.3 → codebread-1.1.4}/codebread.egg-info/requires.txt +0 -0
  30. {codebread-1.1.3 → codebread-1.1.4}/codebread.egg-info/top_level.txt +0 -0
  31. {codebread-1.1.3 → codebread-1.1.4}/setup.cfg +0 -0
  32. {codebread-1.1.3 → codebread-1.1.4}/tests/test_analyzer.py +0 -0
  33. {codebread-1.1.3 → codebread-1.1.4}/tests/test_config_parser.py +0 -0
  34. {codebread-1.1.3 → codebread-1.1.4}/tests/test_connections.py +0 -0
  35. {codebread-1.1.3 → codebread-1.1.4}/tests/test_context.py +0 -0
  36. {codebread-1.1.3 → codebread-1.1.4}/tests/test_deobfuscate.py +0 -0
  37. {codebread-1.1.3 → codebread-1.1.4}/tests/test_generic_parser.py +0 -0
  38. {codebread-1.1.3 → codebread-1.1.4}/tests/test_javascript_parser.py +0 -0
  39. {codebread-1.1.3 → codebread-1.1.4}/tests/test_python_parser.py +0 -0
  40. {codebread-1.1.3 → codebread-1.1.4}/tests/test_scanner.py +0 -0
  41. {codebread-1.1.3 → codebread-1.1.4}/tests/test_server.py +0 -0
  42. {codebread-1.1.3 → codebread-1.1.4}/tests/test_version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codebread
3
- Version: 1.1.3
3
+ Version: 1.1.4
4
4
  Summary: Interactive codebase analyzer & visualizer — slice open a project and see how it's wired together.
5
5
  Author: Danial Irsyad
6
6
  License: MIT
@@ -29,7 +29,7 @@ Dynamic: license-file
29
29
  </p>
30
30
 
31
31
  <p align="center">
32
- <a href="https://pypi.org/project/codebread/"><img alt="PyPI" src="https://img.shields.io/pypi/v/codebread?color=b0541c&label=pypi"></a>
32
+ <a href="https://pypi.org/project/codebread/"><img alt="PyPI" src="https://img.shields.io/pypi/v/codebread?color=0e7490&label=pypi&cacheSeconds=3600"></a>
33
33
  <a href="https://github.com/honow48-tech/CodeBread/actions/workflows/ci.yml"><img alt="CI" src="https://github.com/honow48-tech/CodeBread/actions/workflows/ci.yml/badge.svg"></a>
34
34
  <img alt="Python 3.9+" src="https://img.shields.io/badge/python-3.9%2B-5f5c55">
35
35
  <img alt="No dependencies" src="https://img.shields.io/badge/dependencies-none-5f5c55">
@@ -82,6 +82,12 @@ it, all the way from a frontend `fetch()` to the database table.
82
82
 
83
83
  Read any file with an outline and syntax highlighting, without leaving the page.
84
84
 
85
+ ### Your colours
86
+
87
+ The report follows your system's light or dark mode. Click the dot at the
88
+ right of the top bar to pick an accent colour; your choice is saved in your
89
+ browser.
90
+
85
91
  <p align="center">
86
92
  <img src="https://cdn.jsdelivr.net/gh/honow48-tech/CodeBread@main/assets/code.png" alt="The Code view: file tree, function outline and highlighted source" width="880">
87
93
  </p>
@@ -128,7 +134,7 @@ codebread --path . --html report.html --no-serve
128
134
  | Python | ✓ | Flask, FastAPI, Django | requests, httpx, aiohttp | SQLAlchemy, Django, peewee |
129
135
  | JavaScript / TypeScript | ✓ | Express, Fastify, Koa, NestJS | fetch, axios | Prisma, Mongoose, Sequelize, Knex, TypeORM |
130
136
  | Vue / Svelte | ✓ | same as JS | fetch, axios | same as JS |
131
- | PHP | ✓ | Laravel | – | raw SQL |
137
+ | PHP | ✓ | Laravel (incl. closures) | – | Eloquent, migrations, raw SQL |
132
138
  | Java | ✓ | Spring | – | raw SQL |
133
139
  | C# | ✓ | ASP.NET | – | raw SQL |
134
140
  | Go | ✓ | Gin, net/http | – | raw SQL |
@@ -154,7 +160,7 @@ structural regex with brace matching and gets parameter names only.
154
160
  | Java | regex | ✓ | ✓ | ✓ | – | – | ✓ | ✓ | – |
155
161
  | C# | regex | ✓ | ✓ | ✓ | – | – | ✓ | ✓ | – |
156
162
  | Go | regex | ✓ | structs | ✓ | – | – | ✓ | ✓ | – |
157
- | PHP | regex | ✓ | ✓ | ✓ | – | – | ✓ | ✓ | ✓ |
163
+ | PHP | regex | ✓ | ✓ | ✓ | – | Eloquent + migrations | ✓ | ✓ | ✓ |
158
164
  | Ruby | regex | ✓ | ✓ | ✓ | – | – | ✓ | ✓ | ✓ |
159
165
  | SQL | regex | – | – | – | – | tables + columns | ✓ | – | – |
160
166
  | Config (`.env`, json, yaml, toml, ini, xml) | key scan | – | – | – | – | – | – | – | – |
@@ -13,7 +13,7 @@
13
13
  </p>
14
14
 
15
15
  <p align="center">
16
- <a href="https://pypi.org/project/codebread/"><img alt="PyPI" src="https://img.shields.io/pypi/v/codebread?color=b0541c&label=pypi"></a>
16
+ <a href="https://pypi.org/project/codebread/"><img alt="PyPI" src="https://img.shields.io/pypi/v/codebread?color=0e7490&label=pypi&cacheSeconds=3600"></a>
17
17
  <a href="https://github.com/honow48-tech/CodeBread/actions/workflows/ci.yml"><img alt="CI" src="https://github.com/honow48-tech/CodeBread/actions/workflows/ci.yml/badge.svg"></a>
18
18
  <img alt="Python 3.9+" src="https://img.shields.io/badge/python-3.9%2B-5f5c55">
19
19
  <img alt="No dependencies" src="https://img.shields.io/badge/dependencies-none-5f5c55">
@@ -66,6 +66,12 @@ it, all the way from a frontend `fetch()` to the database table.
66
66
 
67
67
  Read any file with an outline and syntax highlighting, without leaving the page.
68
68
 
69
+ ### Your colours
70
+
71
+ The report follows your system's light or dark mode. Click the dot at the
72
+ right of the top bar to pick an accent colour; your choice is saved in your
73
+ browser.
74
+
69
75
  <p align="center">
70
76
  <img src="https://cdn.jsdelivr.net/gh/honow48-tech/CodeBread@main/assets/code.png" alt="The Code view: file tree, function outline and highlighted source" width="880">
71
77
  </p>
@@ -112,7 +118,7 @@ codebread --path . --html report.html --no-serve
112
118
  | Python | ✓ | Flask, FastAPI, Django | requests, httpx, aiohttp | SQLAlchemy, Django, peewee |
113
119
  | JavaScript / TypeScript | ✓ | Express, Fastify, Koa, NestJS | fetch, axios | Prisma, Mongoose, Sequelize, Knex, TypeORM |
114
120
  | Vue / Svelte | ✓ | same as JS | fetch, axios | same as JS |
115
- | PHP | ✓ | Laravel | – | raw SQL |
121
+ | PHP | ✓ | Laravel (incl. closures) | – | Eloquent, migrations, raw SQL |
116
122
  | Java | ✓ | Spring | – | raw SQL |
117
123
  | C# | ✓ | ASP.NET | – | raw SQL |
118
124
  | Go | ✓ | Gin, net/http | – | raw SQL |
@@ -138,7 +144,7 @@ structural regex with brace matching and gets parameter names only.
138
144
  | Java | regex | ✓ | ✓ | ✓ | – | – | ✓ | ✓ | – |
139
145
  | C# | regex | ✓ | ✓ | ✓ | – | – | ✓ | ✓ | – |
140
146
  | Go | regex | ✓ | structs | ✓ | – | – | ✓ | ✓ | – |
141
- | PHP | regex | ✓ | ✓ | ✓ | – | – | ✓ | ✓ | ✓ |
147
+ | PHP | regex | ✓ | ✓ | ✓ | – | Eloquent + migrations | ✓ | ✓ | ✓ |
142
148
  | Ruby | regex | ✓ | ✓ | ✓ | – | – | ✓ | ✓ | ✓ |
143
149
  | SQL | regex | – | – | – | – | tables + columns | ✓ | – | – |
144
150
  | Config (`.env`, json, yaml, toml, ini, xml) | key scan | – | – | – | – | – | – | – | – |
@@ -71,6 +71,7 @@ window.addEventListener("resize", invalidateRectCache);
71
71
  /* ---------------- boot ---------------- */
72
72
  function boot(data) {
73
73
  S.data = data;
74
+ bindAccent(); // first, so a saved accent applies before anything animates in
74
75
  indexData();
75
76
  renderHeader();
76
77
  renderLanguages();
@@ -2413,6 +2414,55 @@ function esc(s) {
2413
2414
  }
2414
2415
 
2415
2416
 
2417
+ /* ---------------- accent color ----------------
2418
+ The viewer's pick sets --accent-pick; CSS derives everything else (--soft,
2419
+ focus rings, highlights). Dark mode gets a lightened mix so it stays legible.
2420
+ Saved per browser: it's a personal preference, not part of the report. */
2421
+ const ACCENTS = [["Cyan (logo)", null], ["Blue", "#2563eb"], ["Crust", "#b0541c"],
2422
+ ["Green", "#3f7d3a"], ["Violet", "#7c4dbd"], ["Rose", "#c2416b"], ["Graphite", "#3f3f46"]];
2423
+ const ACCENT_DEFAULT = "#0e7490"; // keep in sync with --accent in style.css
2424
+ const ACCENT_KEY = "codebread_accent";
2425
+
2426
+ function applyAccent(hex, save = true) {
2427
+ const st = document.documentElement.style;
2428
+ if (hex) {
2429
+ st.setProperty("--accent-pick", hex);
2430
+ st.setProperty("--accent-pick-dark", `color-mix(in srgb, ${hex} 62%, white)`);
2431
+ } else {
2432
+ st.removeProperty("--accent-pick");
2433
+ st.removeProperty("--accent-pick-dark");
2434
+ }
2435
+ if (save) {
2436
+ try { hex ? localStorage.setItem(ACCENT_KEY, hex) : localStorage.removeItem(ACCENT_KEY); } catch (e) { /* no storage */ }
2437
+ }
2438
+ document.querySelectorAll(".swatch").forEach(b => b.classList.toggle("on", (b.dataset.hex || null) === hex));
2439
+ $("accent-input").value = hex || ACCENT_DEFAULT;
2440
+ }
2441
+
2442
+ function bindAccent() {
2443
+ $("accent-swatches").innerHTML = ACCENTS.map(([name, hex]) =>
2444
+ `<button class="swatch" ${hex ? `data-hex="${hex}"` : ""} title="${name}" aria-label="${name}" ` +
2445
+ `style="background:${hex || ACCENT_DEFAULT}"></button>`).join("");
2446
+ let saved = null;
2447
+ try { saved = localStorage.getItem(ACCENT_KEY); } catch (e) { /* no storage */ }
2448
+ applyAccent(saved, false);
2449
+
2450
+ const btn = $("accent-btn"), pop = $("accent-pop");
2451
+ const toggle = (open) => {
2452
+ pop.classList.toggle("hidden", !open);
2453
+ btn.setAttribute("aria-expanded", String(open));
2454
+ };
2455
+ btn.addEventListener("click", () => toggle(pop.classList.contains("hidden")));
2456
+ $("accent-swatches").addEventListener("click", (ev) => {
2457
+ const sw = ev.target.closest(".swatch");
2458
+ if (sw) applyAccent(sw.dataset.hex || null);
2459
+ });
2460
+ $("accent-input").addEventListener("input", (ev) => applyAccent(ev.target.value));
2461
+ $("accent-reset").addEventListener("click", () => applyAccent(null));
2462
+ document.addEventListener("click", (ev) => { if (!ev.target.closest("#accent-wrap")) toggle(false); });
2463
+ document.addEventListener("keydown", (ev) => { if (ev.key === "Escape") toggle(false); });
2464
+ }
2465
+
2416
2466
  /* ---------------- start ----------------
2417
2467
  Must run after every top-level const above is initialized: the static
2418
2468
  --html export inlines CODEBREAD_DATA, so boot() runs synchronously and
@@ -47,6 +47,19 @@
47
47
  <button data-layer="database">Database</button>
48
48
  <button data-layer="config">Config</button>
49
49
  </nav>
50
+
51
+ <div id="accent-wrap">
52
+ <button id="accent-btn" title="Accent color" aria-label="Accent color"
53
+ aria-haspopup="dialog" aria-expanded="false"><span></span></button>
54
+ <div id="accent-pop" class="hidden" role="dialog" aria-label="Accent color">
55
+ <div class="kicker">Accent color</div>
56
+ <div id="accent-swatches"></div>
57
+ <div class="accent-row">
58
+ <label class="accent-custom"><input type="color" id="accent-input"> Custom</label>
59
+ <button id="accent-reset" class="chip">Reset</button>
60
+ </div>
61
+ </div>
62
+ </div>
50
63
  </header>
51
64
 
52
65
  <div id="main">
@@ -14,9 +14,11 @@
14
14
  --ink-3: #9a978e;
15
15
  --line: #e3e0d7;
16
16
  --line2: #cfcbc0;
17
- --accent: #b0541c;
17
+ /* default: the logo's cyan, deepened for text contrast on paper (~5:1).
18
+ Viewers can pick another from the top bar, see applyAccent() */
19
+ --accent: var(--accent-pick, #0e7490);
18
20
  --accent-ink: #fff;
19
- --soft: rgba(176, 84, 28, 0.08);
21
+ --soft: color-mix(in srgb, var(--accent) 9%, transparent);
20
22
  --warn: #98580f;
21
23
  --bad: #a3372a;
22
24
  --shadow: 0 18px 40px -22px rgba(30, 24, 12, 0.35);
@@ -51,9 +53,9 @@
51
53
  --ink-3: #6c6a63;
52
54
  --line: #2a2a27;
53
55
  --line2: #3a3934;
54
- --accent: #e59a62;
55
- --accent-ink: #1a0f08;
56
- --soft: rgba(229, 154, 98, 0.11);
56
+ --accent: var(--accent-pick-dark, #67e8f9); /* the logo's exact cyan */
57
+ --accent-ink: #062a33;
58
+ --soft: color-mix(in srgb, var(--accent) 12%, transparent);
57
59
  --warn: #e2a85c;
58
60
  --bad: #ef8a7a;
59
61
  --shadow: 0 18px 40px -18px rgba(0, 0, 0, 0.7);
@@ -162,6 +164,36 @@ kbd {
162
164
  .sr-item .sr-path { margin-left: auto; color: var(--ink-3); font-size: 11.5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
163
165
  .sr-empty { padding: 10px 12px; color: var(--ink-3); font-size: 13px; }
164
166
 
167
+ /* ---------- accent picker ------------------------------------------------ */
168
+
169
+ #accent-wrap { position: relative; }
170
+ #accent-btn {
171
+ width: 30px; height: 30px; display: grid; place-items: center; cursor: pointer;
172
+ background: none; border: 1px solid var(--line2); border-radius: 50%;
173
+ transition: border-color .2s, transform .15s;
174
+ }
175
+ #accent-btn:hover { border-color: var(--ink); }
176
+ #accent-btn:active { transform: scale(.94); }
177
+ #accent-btn span { width: 16px; height: 16px; border-radius: 50%; background: var(--accent); transition: background .3s; }
178
+ #accent-pop {
179
+ position: absolute; top: calc(100% + 8px); right: 0; z-index: 60; width: 236px;
180
+ padding: 14px; background: var(--panel); border: 1px solid var(--line2); border-radius: 12px;
181
+ box-shadow: var(--shadow); animation: drop .18s var(--ease);
182
+ }
183
+ #accent-swatches { display: grid; grid-template-columns: repeat(7, 1fr); gap: 6px; margin: 12px 0; }
184
+ .swatch {
185
+ aspect-ratio: 1; border-radius: 50%; cursor: pointer; padding: 0;
186
+ border: 2px solid var(--panel); box-shadow: 0 0 0 1px var(--line2);
187
+ transition: box-shadow .2s, transform .15s;
188
+ }
189
+ .swatch:hover { transform: scale(1.1); }
190
+ .swatch.on { box-shadow: 0 0 0 2px var(--ink); }
191
+ .accent-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
192
+ .accent-custom { display: flex; align-items: center; gap: 8px; font-size: 13px; color: var(--ink-2); cursor: pointer; }
193
+ #accent-input { width: 28px; height: 28px; padding: 0; border: 1px solid var(--line2); border-radius: 6px; background: none; cursor: pointer; }
194
+ #accent-input::-webkit-color-swatch-wrapper { padding: 2px; }
195
+ #accent-input::-webkit-color-swatch { border: 0; border-radius: 4px; }
196
+
165
197
  /* ---------- layout ----------------------------------------------------- */
166
198
 
167
199
  #main { display: flex; flex: 1; min-height: 0; position: relative; }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codebread
3
- Version: 1.1.3
3
+ Version: 1.1.4
4
4
  Summary: Interactive codebase analyzer & visualizer — slice open a project and see how it's wired together.
5
5
  Author: Danial Irsyad
6
6
  License: MIT
@@ -29,7 +29,7 @@ Dynamic: license-file
29
29
  </p>
30
30
 
31
31
  <p align="center">
32
- <a href="https://pypi.org/project/codebread/"><img alt="PyPI" src="https://img.shields.io/pypi/v/codebread?color=b0541c&label=pypi"></a>
32
+ <a href="https://pypi.org/project/codebread/"><img alt="PyPI" src="https://img.shields.io/pypi/v/codebread?color=0e7490&label=pypi&cacheSeconds=3600"></a>
33
33
  <a href="https://github.com/honow48-tech/CodeBread/actions/workflows/ci.yml"><img alt="CI" src="https://github.com/honow48-tech/CodeBread/actions/workflows/ci.yml/badge.svg"></a>
34
34
  <img alt="Python 3.9+" src="https://img.shields.io/badge/python-3.9%2B-5f5c55">
35
35
  <img alt="No dependencies" src="https://img.shields.io/badge/dependencies-none-5f5c55">
@@ -82,6 +82,12 @@ it, all the way from a frontend `fetch()` to the database table.
82
82
 
83
83
  Read any file with an outline and syntax highlighting, without leaving the page.
84
84
 
85
+ ### Your colours
86
+
87
+ The report follows your system's light or dark mode. Click the dot at the
88
+ right of the top bar to pick an accent colour; your choice is saved in your
89
+ browser.
90
+
85
91
  <p align="center">
86
92
  <img src="https://cdn.jsdelivr.net/gh/honow48-tech/CodeBread@main/assets/code.png" alt="The Code view: file tree, function outline and highlighted source" width="880">
87
93
  </p>
@@ -128,7 +134,7 @@ codebread --path . --html report.html --no-serve
128
134
  | Python | ✓ | Flask, FastAPI, Django | requests, httpx, aiohttp | SQLAlchemy, Django, peewee |
129
135
  | JavaScript / TypeScript | ✓ | Express, Fastify, Koa, NestJS | fetch, axios | Prisma, Mongoose, Sequelize, Knex, TypeORM |
130
136
  | Vue / Svelte | ✓ | same as JS | fetch, axios | same as JS |
131
- | PHP | ✓ | Laravel | – | raw SQL |
137
+ | PHP | ✓ | Laravel (incl. closures) | – | Eloquent, migrations, raw SQL |
132
138
  | Java | ✓ | Spring | – | raw SQL |
133
139
  | C# | ✓ | ASP.NET | – | raw SQL |
134
140
  | Go | ✓ | Gin, net/http | – | raw SQL |
@@ -154,7 +160,7 @@ structural regex with brace matching and gets parameter names only.
154
160
  | Java | regex | ✓ | ✓ | ✓ | – | – | ✓ | ✓ | – |
155
161
  | C# | regex | ✓ | ✓ | ✓ | – | – | ✓ | ✓ | – |
156
162
  | Go | regex | ✓ | structs | ✓ | – | – | ✓ | ✓ | – |
157
- | PHP | regex | ✓ | ✓ | ✓ | – | – | ✓ | ✓ | ✓ |
163
+ | PHP | regex | ✓ | ✓ | ✓ | – | Eloquent + migrations | ✓ | ✓ | ✓ |
158
164
  | Ruby | regex | ✓ | ✓ | ✓ | – | – | ✓ | ✓ | ✓ |
159
165
  | SQL | regex | – | – | – | – | tables + columns | ✓ | – | – |
160
166
  | Config (`.env`, json, yaml, toml, ini, xml) | key scan | – | – | – | – | – | – | – | – |
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "codebread"
7
- version = "1.1.3"
7
+ version = "1.1.4"
8
8
  description = "Interactive codebase analyzer & visualizer — slice open a project and see how it's wired together."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes