rails-realtime-erd 0.1.0 → 0.2.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +45 -0
- data/README.md +22 -0
- data/app/assets/stylesheets/rails_realtime_erd/erd.css +11 -3
- data/app/javascript/rails_realtime_erd/application.js +41 -3
- data/app/views/rails_realtime_erd/erd/_main.html.erb +3 -3
- data/app/views/rails_realtime_erd/erd/_sidebar.html.erb +5 -0
- data/app/views/rails_realtime_erd/erd/show.html.erb +7 -6
- data/config/routes.rb +1 -1
- data/lib/rails-realtime-erd/builder.rb +1 -0
- data/lib/rails-realtime-erd/engine.rb +1 -1
- data/lib/rails-realtime-erd/version.rb +2 -1
- metadata +6 -64
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2ae54e73c4ce9a8ab0a5c5c5b74f195f3f3442aee53a7696c60dd1186b76a129
|
|
4
|
+
data.tar.gz: 4b0951392d68a93e7a9993854e930dbf465d6e60ecb8a0456fb77fc1a738c4ef
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e68e63082526393acf1ab417a137625cddacf2bb6adb4f51668eaa2b1aa196dbe506bb5c788dc5b1d84f7b8077bdb4c1be35b8491f343b7f8bf5b3df6e40c3df
|
|
7
|
+
data.tar.gz: e01dc9df62a4fc40781961de6cec26a177e340ddc1bf1ceea6393300936fc8b4ded496690e2c6b845b9fe3e745bf1adef46a0bc68e34fc559efc9e20fff4d535
|
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project are documented in this file.
|
|
4
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
5
|
+
and this project adheres to [Semantic Versioning](https://semver.org/).
|
|
6
|
+
|
|
7
|
+
## [0.2.0] - 2026-11-12
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- "Show Column Type & Size" option: displays each column's raw database type
|
|
12
|
+
(`varchar(255)`, `numeric(10,2)`, `timestamp(6)`, …) instead of the abstract
|
|
13
|
+
Rails type. Verbose Postgres types are shortened to their standard aliases
|
|
14
|
+
(`character varying` → `varchar`, `timestamp with time zone` → `timestamptz`,
|
|
15
|
+
`double precision` → `float8`). ([#1], [#3])
|
|
16
|
+
- Declared `required_ruby_version >= 2.5.0`. ([#2])
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
|
|
20
|
+
- The viewer now fills the browser window: the page never scrolls, the model
|
|
21
|
+
sidebar scrolls on its own and the ERD/Code panes take the remaining height,
|
|
22
|
+
with the zoom/pan controls always at the bottom of the window. Previously a
|
|
23
|
+
long model list or a small window made the whole page scroll. ([#4])
|
|
24
|
+
- Diagrams are fitted inside the pane on render (never upscaled), so tall
|
|
25
|
+
diagrams are no longer clipped at the top and bottom. SVG/PNG downloads still
|
|
26
|
+
export the full-size diagram. ([#4])
|
|
27
|
+
|
|
28
|
+
### Fixed
|
|
29
|
+
|
|
30
|
+
- The footer link now points to the gem's repository instead of github.com.
|
|
31
|
+
|
|
32
|
+
### Compatibility
|
|
33
|
+
|
|
34
|
+
- Tested against Rails 6.1, 7.2 and 8.1 on Ruby 3.0 through 4.0 in CI. ([#2])
|
|
35
|
+
|
|
36
|
+
## [0.1.0] - 2026-05-17
|
|
37
|
+
|
|
38
|
+
- Initial release.
|
|
39
|
+
|
|
40
|
+
[0.2.0]: https://github.com/jacksonpires/rails-realtime-erd/compare/v0.1.0...v0.2.0
|
|
41
|
+
[0.1.0]: https://github.com/jacksonpires/rails-realtime-erd/releases/tag/v0.1.0
|
|
42
|
+
[#1]: https://github.com/jacksonpires/rails-realtime-erd/pull/1
|
|
43
|
+
[#2]: https://github.com/jacksonpires/rails-realtime-erd/pull/2
|
|
44
|
+
[#3]: https://github.com/jacksonpires/rails-realtime-erd/pull/3
|
|
45
|
+
[#4]: https://github.com/jacksonpires/rails-realtime-erd/pull/4
|
data/README.md
CHANGED
|
@@ -6,6 +6,10 @@ Inspired by [`rails-mermaid_erd`](https://github.com/koedame/rails-mermaid_erd)
|
|
|
6
6
|
|
|
7
7
|
The frontend is plain Hotwire (Stimulus) — **no Vue**, no build step, no asset pipeline required in the host app.
|
|
8
8
|
|
|
9
|
+

|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
9
13
|
## Features
|
|
10
14
|
|
|
11
15
|
- Mounts `/rails/erd` automatically in `development` and `test` environments
|
|
@@ -14,6 +18,8 @@ The frontend is plain Hotwire (Stimulus) — **no Vue**, no build step, no asset
|
|
|
14
18
|
- Copy Mermaid code, Copy Markdown, Copy shareable URL (state in `location.hash`)
|
|
15
19
|
- Download SVG / PNG of the rendered diagram
|
|
16
20
|
- Sidebar filter to scope the diagram to a subset of models
|
|
21
|
+
- Optional raw column types & sizes as reported by the database (`varchar(255)`, `numeric(10,2)`, …)
|
|
22
|
+
- Full-window viewer: the sidebar scrolls on its own and the diagram is fitted to the pane on render
|
|
17
23
|
- Works with any host asset pipeline (Sprockets, Propshaft, importmap, or none) — all CSS/JS is inlined by the engine layout
|
|
18
24
|
|
|
19
25
|
## Installation
|
|
@@ -69,8 +75,24 @@ Specs run against a SQLite-backed dummy Rails app in `spec/dummy`. SQLite does n
|
|
|
69
75
|
```bash
|
|
70
76
|
$ bundle install
|
|
71
77
|
$ bundle exec rspec
|
|
78
|
+
$ bundle exec standardrb
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
The root `Gemfile` targets the latest Rails. Older supported Rails versions have their own Gemfile under `gemfiles/`:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
$ BUNDLE_GEMFILE=gemfiles/rails_6_1.gemfile bundle install
|
|
85
|
+
$ BUNDLE_GEMFILE=gemfiles/rails_6_1.gemfile bundle exec rspec
|
|
72
86
|
```
|
|
73
87
|
|
|
88
|
+
CI (`.github/workflows/ci.yml`) runs the suite against this matrix:
|
|
89
|
+
|
|
90
|
+
| Rails | Ruby |
|
|
91
|
+
|---|---|
|
|
92
|
+
| 6.1 (`gemfiles/rails_6_1.gemfile`) | 3.0, 3.3 — Rails 6.1 itself does not load on Ruby ≥ 3.4 |
|
|
93
|
+
| 7.2 (`gemfiles/rails_7_2.gemfile`) | 3.3, 4.0 |
|
|
94
|
+
| 8.1 (`Gemfile`) | 3.4, 4.0 |
|
|
95
|
+
|
|
74
96
|
## License
|
|
75
97
|
|
|
76
98
|
MIT. See `MIT-LICENSE`.
|
|
@@ -109,8 +109,8 @@ a { color: inherit; text-decoration: inherit; }
|
|
|
109
109
|
.h-4 { height: 1rem; }
|
|
110
110
|
.h-6 { height: 1.5rem; }
|
|
111
111
|
.h-full { height: 100%; }
|
|
112
|
-
.
|
|
113
|
-
.min-h
|
|
112
|
+
.h-screen { height: 100vh; height: 100dvh; }
|
|
113
|
+
.min-h-0 { min-height: 0; }
|
|
114
114
|
|
|
115
115
|
/* ------- Borders ------- */
|
|
116
116
|
.border { border-width: 1px; }
|
|
@@ -176,6 +176,8 @@ a { color: inherit; text-decoration: inherit; }
|
|
|
176
176
|
|
|
177
177
|
/* ------- Misc ------- */
|
|
178
178
|
.overflow-hidden { overflow: hidden; }
|
|
179
|
+
.overflow-y-auto { overflow-y: auto; }
|
|
180
|
+
.resize-none { resize: none; }
|
|
179
181
|
|
|
180
182
|
/* ------- Mermaid override ------- */
|
|
181
183
|
#mermaid-erd { fill: #9c9c9c !important; }
|
|
@@ -206,9 +208,15 @@ a { color: inherit; text-decoration: inherit; }
|
|
|
206
208
|
display: flex;
|
|
207
209
|
align-items: center;
|
|
208
210
|
justify-content: center;
|
|
209
|
-
padding
|
|
211
|
+
/* Bottom padding keeps the fitted diagram clear of the overlaid
|
|
212
|
+
* Movement/Zoom hint bar at the bottom of the pane. */
|
|
213
|
+
padding: 1rem 1rem 5rem;
|
|
210
214
|
}
|
|
215
|
+
/* Fit the diagram inside the pane on first render (never upscaled: Mermaid
|
|
216
|
+
* caps the SVG at its natural size via an inline max-width). Zoom/pan then
|
|
217
|
+
* works from there. */
|
|
211
218
|
#rre-preview svg {
|
|
212
219
|
max-width: 100%;
|
|
220
|
+
max-height: 100%;
|
|
213
221
|
height: auto;
|
|
214
222
|
}
|
|
@@ -17,8 +17,8 @@ window.RailsRealtimeErdStimulus = application;
|
|
|
17
17
|
class FilterController extends Controller {
|
|
18
18
|
static targets = [
|
|
19
19
|
"search", "modelList", "modelRow", "modelCheckbox",
|
|
20
|
-
"previewRelations", "showRelationComment", "showKey", "showComment", "hideColumns", "showOnlyKeys",
|
|
21
|
-
"showKeyLabel", "showCommentLabel", "showOnlyKeysLabel"
|
|
20
|
+
"previewRelations", "showRelationComment", "showKey", "showComment", "showType", "hideColumns", "showOnlyKeys",
|
|
21
|
+
"showKeyLabel", "showCommentLabel", "showTypeLabel", "showOnlyKeysLabel"
|
|
22
22
|
];
|
|
23
23
|
|
|
24
24
|
connect() {
|
|
@@ -28,6 +28,7 @@ class FilterController extends Controller {
|
|
|
28
28
|
isShowRelationComment: false,
|
|
29
29
|
isShowKey: false,
|
|
30
30
|
isShowComment: false,
|
|
31
|
+
isShowType: false,
|
|
31
32
|
isHideColumns: false,
|
|
32
33
|
isShowOnlyKeys: false,
|
|
33
34
|
filterText: ""
|
|
@@ -56,6 +57,7 @@ class FilterController extends Controller {
|
|
|
56
57
|
if (this.hasShowRelationCommentTarget) this.showRelationCommentTarget.checked = !!this.state.isShowRelationComment;
|
|
57
58
|
if (this.hasShowKeyTarget) this.showKeyTarget.checked = !!this.state.isShowKey;
|
|
58
59
|
if (this.hasShowCommentTarget) this.showCommentTarget.checked = !!this.state.isShowComment;
|
|
60
|
+
if (this.hasShowTypeTarget) this.showTypeTarget.checked = !!this.state.isShowType;
|
|
59
61
|
if (this.hasHideColumnsTarget) this.hideColumnsTarget.checked = !!this.state.isHideColumns;
|
|
60
62
|
if (this.hasShowOnlyKeysTarget) this.showOnlyKeysTarget.checked = !!this.state.isShowOnlyKeys;
|
|
61
63
|
if (this.hasSearchTarget) this.searchTarget.value = this.state.filterText;
|
|
@@ -81,12 +83,14 @@ class FilterController extends Controller {
|
|
|
81
83
|
const inputs = [
|
|
82
84
|
this.hasShowKeyTarget && this.showKeyTarget,
|
|
83
85
|
this.hasShowCommentTarget && this.showCommentTarget,
|
|
86
|
+
this.hasShowTypeTarget && this.showTypeTarget,
|
|
84
87
|
this.hasShowOnlyKeysTarget && this.showOnlyKeysTarget
|
|
85
88
|
].filter(Boolean);
|
|
86
89
|
inputs.forEach(input => { input.disabled = disabled; });
|
|
87
90
|
const labels = [
|
|
88
91
|
this.hasShowKeyLabelTarget && this.showKeyLabelTarget,
|
|
89
92
|
this.hasShowCommentLabelTarget && this.showCommentLabelTarget,
|
|
93
|
+
this.hasShowTypeLabelTarget && this.showTypeLabelTarget,
|
|
90
94
|
this.hasShowOnlyKeysLabelTarget && this.showOnlyKeysLabelTarget
|
|
91
95
|
].filter(Boolean);
|
|
92
96
|
labels.forEach(label => {
|
|
@@ -119,6 +123,7 @@ class FilterController extends Controller {
|
|
|
119
123
|
isShowRelationComment: this.hasShowRelationCommentTarget && this.showRelationCommentTarget.checked,
|
|
120
124
|
isShowKey: this.hasShowKeyTarget && this.showKeyTarget.checked,
|
|
121
125
|
isShowComment: this.hasShowCommentTarget && this.showCommentTarget.checked,
|
|
126
|
+
isShowType: this.hasShowTypeTarget && this.showTypeTarget.checked,
|
|
122
127
|
isHideColumns: this.hasHideColumnsTarget && this.hideColumnsTarget.checked,
|
|
123
128
|
isShowOnlyKeys: this.hasShowOnlyKeysTarget && this.showOnlyKeysTarget.checked
|
|
124
129
|
};
|
|
@@ -158,6 +163,7 @@ class FilterController extends Controller {
|
|
|
158
163
|
isShowRelationComment: false,
|
|
159
164
|
isShowKey: false,
|
|
160
165
|
isShowComment: false,
|
|
166
|
+
isShowType: false,
|
|
161
167
|
isHideColumns: false,
|
|
162
168
|
isShowOnlyKeys: false,
|
|
163
169
|
filterText: ""
|
|
@@ -232,7 +238,8 @@ class DiagramController extends Controller {
|
|
|
232
238
|
if (state.isShowOnlyKeys && !column.key) return;
|
|
233
239
|
const key = state.isShowKey ? (column.key || "") : "";
|
|
234
240
|
const comment = state.isShowComment ? `"${column.comment || ""}"` : "";
|
|
235
|
-
|
|
241
|
+
const type = state.isShowType ? this.sanitizeType(column.sql_type) || column.type : column.type;
|
|
242
|
+
lines.push(` ${type} ${column.name} ${key} ${comment}`);
|
|
236
243
|
});
|
|
237
244
|
}
|
|
238
245
|
lines.push(" }");
|
|
@@ -247,6 +254,35 @@ class DiagramController extends Controller {
|
|
|
247
254
|
return lines.join("\n");
|
|
248
255
|
}
|
|
249
256
|
|
|
257
|
+
// Mermaid erDiagram attribute types must match [*A-Za-z_][A-Za-z0-9\-_\[\]()]*
|
|
258
|
+
// — no spaces, commas or quotes. Postgres reports verbose multi-word types,
|
|
259
|
+
// so map those to their standard short aliases first, then make whatever is
|
|
260
|
+
// left parser-safe:
|
|
261
|
+
// character varying(255) -> varchar(255)
|
|
262
|
+
// timestamp(6) without time zone -> timestamp(6)
|
|
263
|
+
// timestamp with time zone -> timestamptz
|
|
264
|
+
// decimal(10,2) -> decimal(10_2)
|
|
265
|
+
// enum('a','b') -> enum(a_b)
|
|
266
|
+
// integer[] -> integer[]
|
|
267
|
+
sanitizeType(raw) {
|
|
268
|
+
let s = String(raw || "").trim();
|
|
269
|
+
s = s
|
|
270
|
+
.replace(/^character varying/i, "varchar")
|
|
271
|
+
.replace(/^character\b/i, "char")
|
|
272
|
+
.replace(/^bit varying/i, "varbit")
|
|
273
|
+
.replace(/^double precision/i, "float8")
|
|
274
|
+
.replace(/^(timestamp|time)(\(\d+\))? without time zone/i, "$1$2")
|
|
275
|
+
.replace(/^(timestamp|time)(\(\d+\))? with time zone/i, "$1tz$2");
|
|
276
|
+
s = s
|
|
277
|
+
.replace(/['"`]/g, "")
|
|
278
|
+
.replace(/\s*,\s*/g, "_")
|
|
279
|
+
.replace(/[^A-Za-z0-9\-_\[\]()]+/g, "_")
|
|
280
|
+
.replace(/_+/g, "_")
|
|
281
|
+
.replace(/^_+|_+$/g, "");
|
|
282
|
+
if (/^[0-9\-\[\]()]/.test(s)) s = `_${s}`;
|
|
283
|
+
return s;
|
|
284
|
+
}
|
|
285
|
+
|
|
250
286
|
filteredData(state) {
|
|
251
287
|
const selected = new Set(state.selectModels || []);
|
|
252
288
|
let relations;
|
|
@@ -330,6 +366,7 @@ class HashStateController extends Controller {
|
|
|
330
366
|
isShowRelationComment: !!parsed.isShowRelationComment,
|
|
331
367
|
isShowKey: !!parsed.isShowKey,
|
|
332
368
|
isShowComment: !!parsed.isShowComment,
|
|
369
|
+
isShowType: !!parsed.isShowType,
|
|
333
370
|
isHideColumns: !!parsed.isHideColumns,
|
|
334
371
|
isShowOnlyKeys: !!parsed.isShowOnlyKeys
|
|
335
372
|
});
|
|
@@ -344,6 +381,7 @@ class HashStateController extends Controller {
|
|
|
344
381
|
isShowRelationComment: state.isShowRelationComment,
|
|
345
382
|
isShowKey: state.isShowKey,
|
|
346
383
|
isShowComment: state.isShowComment,
|
|
384
|
+
isShowType: state.isShowType,
|
|
347
385
|
isHideColumns: state.isHideColumns,
|
|
348
386
|
isShowOnlyKeys: state.isShowOnlyKeys
|
|
349
387
|
};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
<div class="space-x-2
|
|
1
|
+
<div class="space-x-2 flex flex-none p-4">
|
|
2
2
|
<button type="button" data-tab-target="erdButton" data-action="click->tab#showErd" class="text-xs py-1 px-2 rounded hover:bg-white focus:ring-2 focus:ring-white focus:ring-offset-2 focus:ring-offset-gray-900 bg-white text-gray-900">ERD</button>
|
|
3
3
|
<button type="button" data-tab-target="codeButton" data-action="click->tab#showCode" class="text-xs py-1 px-2 rounded hover:bg-white focus:ring-2 focus:ring-white focus:ring-offset-2 focus:ring-offset-gray-900 bg-gray-400 text-gray-900">Code</button>
|
|
4
4
|
</div>
|
|
5
5
|
|
|
6
|
-
<div data-tab-target="erdPane" class="px-4 w-full min-h-
|
|
6
|
+
<div data-tab-target="erdPane" class="px-4 w-full flex-1 min-h-0 relative overflow-hidden" data-zoom-pan-target="canvas">
|
|
7
7
|
<div data-zoom-pan-target="area">
|
|
8
8
|
<div id="rre-preview" data-diagram-target="preview"></div>
|
|
9
9
|
</div>
|
|
@@ -37,4 +37,4 @@
|
|
|
37
37
|
</div>
|
|
38
38
|
</div>
|
|
39
39
|
|
|
40
|
-
<textarea data-tab-target="codePane" data-rre-hidden data-diagram-target="codeOutput" readonly class="px-4 bg-gray-900 text-gray-300 font-mono w-full text-xs min-h-
|
|
40
|
+
<textarea data-tab-target="codePane" data-rre-hidden data-diagram-target="codeOutput" readonly class="px-4 bg-gray-900 text-gray-300 font-mono w-full text-xs flex-1 min-h-0 resize-none border-0 focus:ring-0 block"></textarea>
|
|
@@ -63,6 +63,11 @@
|
|
|
63
63
|
<span class="text-xs text-gray-900">Show Column Comment</span>
|
|
64
64
|
</label>
|
|
65
65
|
|
|
66
|
+
<label class="relative flex items-start hover:bg-gray-100 rounded text-sm" data-filter-target="showTypeLabel">
|
|
67
|
+
<input type="checkbox" class="h-4 w-4 rounded border-gray-300 text-red-600 mr-2 focus:ring-red-600" data-filter-target="showType" data-action="change->filter#onOptionChange">
|
|
68
|
+
<span class="text-xs text-gray-900">Show Column Type & Size</span>
|
|
69
|
+
</label>
|
|
70
|
+
|
|
66
71
|
<label class="relative flex items-start hover:bg-gray-100 rounded text-sm" data-filter-target="showOnlyKeysLabel">
|
|
67
72
|
<input type="checkbox" class="h-4 w-4 rounded border-gray-300 text-red-600 mr-2 focus:ring-red-600" data-filter-target="showOnlyKeys" data-action="change->filter#onOptionChange">
|
|
68
73
|
<span class="text-xs text-gray-900">Only Show Keys</span>
|
|
@@ -2,13 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
<div
|
|
4
4
|
id="rre-app"
|
|
5
|
+
class="flex flex-col h-screen overflow-hidden"
|
|
5
6
|
data-controller="hash-state filter diagram clipboard download tab zoom-pan"
|
|
6
7
|
data-hash-state-filter-outlet="[data-controller~='filter']"
|
|
7
8
|
data-filter-diagram-outlet="[data-controller~='diagram']"
|
|
8
9
|
data-clipboard-diagram-outlet="[data-controller~='diagram']"
|
|
9
10
|
data-download-diagram-outlet="[data-controller~='diagram']"
|
|
10
11
|
>
|
|
11
|
-
<header class="bg-red-600">
|
|
12
|
+
<header class="bg-red-600 flex-none">
|
|
12
13
|
<nav class="mx-auto px-4">
|
|
13
14
|
<div class="flex w-full items-center justify-between py-4">
|
|
14
15
|
<h1 class="text-white inline-flex space-x-2 items-center">
|
|
@@ -24,19 +25,19 @@
|
|
|
24
25
|
</nav>
|
|
25
26
|
</header>
|
|
26
27
|
|
|
27
|
-
<div class="flex">
|
|
28
|
-
<aside class="w-[250px] border-r border-gray-300 flex-none p-2">
|
|
28
|
+
<div class="flex flex-1 min-h-0">
|
|
29
|
+
<aside class="w-[250px] border-r border-gray-300 flex-none p-2 overflow-y-auto">
|
|
29
30
|
<%= render "sidebar" %>
|
|
30
31
|
</aside>
|
|
31
32
|
|
|
32
|
-
<main class="flex-1 bg-gray-900
|
|
33
|
+
<main class="flex-1 min-w-0 bg-gray-900 flex flex-col">
|
|
33
34
|
<%= render "main" %>
|
|
34
35
|
</main>
|
|
35
36
|
</div>
|
|
36
37
|
|
|
37
|
-
<footer class="bg-gray-100">
|
|
38
|
+
<footer class="bg-gray-100 flex-none">
|
|
38
39
|
<p class="text-center text-xs text-gray-600 py-2">
|
|
39
|
-
<a href="
|
|
40
|
+
<a href="<%= RailsRealtimeErd::HOMEPAGE %>" class="hover:text-gray-400" target="_blank" rel="noopener noreferrer">
|
|
40
41
|
Rails Realtime ERD v<%= @version %>
|
|
41
42
|
</a>
|
|
42
43
|
</p>
|
data/config/routes.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rails-realtime-erd
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Jackson Pires
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: bin
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
13
|
name: rails
|
|
@@ -24,62 +23,6 @@ dependencies:
|
|
|
24
23
|
- - ">="
|
|
25
24
|
- !ruby/object:Gem::Version
|
|
26
25
|
version: 6.1.7.10
|
|
27
|
-
- !ruby/object:Gem::Dependency
|
|
28
|
-
name: sqlite3
|
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
|
30
|
-
requirements:
|
|
31
|
-
- - '='
|
|
32
|
-
- !ruby/object:Gem::Version
|
|
33
|
-
version: 1.5.0
|
|
34
|
-
type: :development
|
|
35
|
-
prerelease: false
|
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
-
requirements:
|
|
38
|
-
- - '='
|
|
39
|
-
- !ruby/object:Gem::Version
|
|
40
|
-
version: 1.5.0
|
|
41
|
-
- !ruby/object:Gem::Dependency
|
|
42
|
-
name: rspec-rails
|
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
|
44
|
-
requirements:
|
|
45
|
-
- - '='
|
|
46
|
-
- !ruby/object:Gem::Version
|
|
47
|
-
version: 6.1.5
|
|
48
|
-
type: :development
|
|
49
|
-
prerelease: false
|
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
-
requirements:
|
|
52
|
-
- - '='
|
|
53
|
-
- !ruby/object:Gem::Version
|
|
54
|
-
version: 6.1.5
|
|
55
|
-
- !ruby/object:Gem::Dependency
|
|
56
|
-
name: rake
|
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
|
58
|
-
requirements:
|
|
59
|
-
- - '='
|
|
60
|
-
- !ruby/object:Gem::Version
|
|
61
|
-
version: 13.4.2
|
|
62
|
-
type: :development
|
|
63
|
-
prerelease: false
|
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
-
requirements:
|
|
66
|
-
- - '='
|
|
67
|
-
- !ruby/object:Gem::Version
|
|
68
|
-
version: 13.4.2
|
|
69
|
-
- !ruby/object:Gem::Dependency
|
|
70
|
-
name: standard
|
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
|
72
|
-
requirements:
|
|
73
|
-
- - '='
|
|
74
|
-
- !ruby/object:Gem::Version
|
|
75
|
-
version: 1.28.5
|
|
76
|
-
type: :development
|
|
77
|
-
prerelease: false
|
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
-
requirements:
|
|
80
|
-
- - '='
|
|
81
|
-
- !ruby/object:Gem::Version
|
|
82
|
-
version: 1.28.5
|
|
83
26
|
description: Mounts /rails/erd in your Rails app. On every request the gem introspects
|
|
84
27
|
ActiveRecord models and renders a Mermaid ERD viewer with Stimulus-driven filters,
|
|
85
28
|
zoom/pan, copy & download. No pre-generated HTML file.
|
|
@@ -89,6 +32,7 @@ executables: []
|
|
|
89
32
|
extensions: []
|
|
90
33
|
extra_rdoc_files: []
|
|
91
34
|
files:
|
|
35
|
+
- CHANGELOG.md
|
|
92
36
|
- MIT-LICENSE
|
|
93
37
|
- README.md
|
|
94
38
|
- Rakefile
|
|
@@ -114,9 +58,8 @@ homepage: https://github.com/jacksonpires/rails-realtime-erd
|
|
|
114
58
|
licenses:
|
|
115
59
|
- MIT
|
|
116
60
|
metadata:
|
|
117
|
-
homepage_uri: https://github.com/jacksonpires/rails-realtime-erd
|
|
118
61
|
source_code_uri: https://github.com/jacksonpires/rails-realtime-erd
|
|
119
|
-
|
|
62
|
+
changelog_uri: https://github.com/jacksonpires/rails-realtime-erd/blob/main/CHANGELOG.md
|
|
120
63
|
rdoc_options: []
|
|
121
64
|
require_paths:
|
|
122
65
|
- lib
|
|
@@ -124,15 +67,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
124
67
|
requirements:
|
|
125
68
|
- - ">="
|
|
126
69
|
- !ruby/object:Gem::Version
|
|
127
|
-
version:
|
|
70
|
+
version: 2.5.0
|
|
128
71
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
129
72
|
requirements:
|
|
130
73
|
- - ">="
|
|
131
74
|
- !ruby/object:Gem::Version
|
|
132
75
|
version: '0'
|
|
133
76
|
requirements: []
|
|
134
|
-
rubygems_version:
|
|
135
|
-
signing_key:
|
|
77
|
+
rubygems_version: 4.0.20
|
|
136
78
|
specification_version: 4
|
|
137
79
|
summary: Live Mermaid ERD viewer mounted as a Rails route, powered by Hotwire.
|
|
138
80
|
test_files: []
|