railspress-engine 1.0.0 → 1.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/README.md +3 -1
- data/app/assets/stylesheets/railspress/admin/components/lexxy.css +12 -1
- data/app/helpers/railspress/cms_helper.rb +4 -23
- data/app/javascript/railspress/controllers/cms_inline_editor_controller.js +39 -22
- data/app/javascript/railspress/index.js +3 -0
- data/app/models/railspress/focal_point.rb +1 -1
- data/app/models/railspress/post_export_processor.rb +1 -1
- data/app/models/railspress/post_import_processor.rb +3 -3
- data/app/models/railspress/tag.rb +3 -1
- data/app/services/railspress/content_import_service.rb +3 -3
- data/config/importmap.rb +3 -0
- data/lib/generators/railspress/install/install_generator.rb +41 -21
- data/lib/railspress/version.rb +1 -1
- metadata +19 -14
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f1ca2f73a89851d3359c2d32b51c5b5a3770e9e5d3c4f81655e5436fcf249fd4
|
|
4
|
+
data.tar.gz: 5c8c712b7139a6ab50be2b30831de8320b254a99a96e8f23fa69c0ad4d2ab8ae
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: fc61ccdaa5f8af6baa55c5186c07525a5272bb87bf4bec19f09c1ec6bdd710d8107d804a384f4d339a5243a8d44d0ca4dc82655a6328775587a831077567b470
|
|
7
|
+
data.tar.gz: d8d931f5f83c225d75b7d939a5251e4d8343c6b223fc7e56d8855024da7c58fae3c3236348e51aafc2e80f144cfc6e2dc40899db430e6da5df87f8b01530dd45
|
data/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
</p>
|
|
5
5
|
|
|
6
6
|
<p align="center">
|
|
7
|
-
<a href="https://rubygems.org/gems/railspress-engine"><img src="https://img.shields.io/gem/v/railspress-engine.svg?style=flat" alt="Gem Version"></a>
|
|
7
|
+
<a href="https://rubygems.org/gems/railspress-engine"><img src="https://img.shields.io/gem/v/railspress-engine.svg?style=flat&bump=true" alt="Gem Version"></a>
|
|
8
8
|
<img src="https://img.shields.io/badge/Rails-8.1%2B-red.svg?style=flat" alt="Rails 8.1+">
|
|
9
9
|
<img src="https://img.shields.io/badge/Ruby-3.3%2B-red.svg?style=flat" alt="Ruby 3.3+">
|
|
10
10
|
<a href="https://osaasy.dev/"><img src="https://img.shields.io/badge/License-O'Saasy-blue.svg?style=flat" alt="License"></a>
|
|
@@ -14,6 +14,8 @@
|
|
|
14
14
|
|
|
15
15
|
RailsPress is a mountable Rails engine that gives your app a complete content management system — namespaced and isolated so it stays out of your way.
|
|
16
16
|
|
|
17
|
+
You can read more at [Railspress.org](https://railspress.org).
|
|
18
|
+
|
|
17
19
|
It manages three kinds of content:
|
|
18
20
|
|
|
19
21
|
## Posts, Entities, and Blocks
|
|
@@ -4,11 +4,21 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
:where(lexxy-toolbar){
|
|
7
|
+
position: sticky;
|
|
8
|
+
top: 0;
|
|
9
|
+
z-index: 10;
|
|
10
|
+
background: var(--rp-bg-elevated, #fff);
|
|
7
11
|
margin-bottom: 20px;
|
|
8
12
|
padding-bottom: 10px;
|
|
13
|
+
border-bottom: 1px solid var(--rp-border);
|
|
9
14
|
}
|
|
10
15
|
|
|
11
|
-
/*
|
|
16
|
+
/*
|
|
17
|
+
* Disabled custom Lexxy dropdown sizing override.
|
|
18
|
+
* Lexxy 0.9.8.beta manages dropdown layout internally; forcing fixed 34x34
|
|
19
|
+
* sizing can break toolbar dropdown/picker rendering.
|
|
20
|
+
*/
|
|
21
|
+
/*
|
|
12
22
|
.lexxy-editor__toolbar-dropdown {
|
|
13
23
|
width: 34px !important;
|
|
14
24
|
height: 34px !important;
|
|
@@ -30,6 +40,7 @@
|
|
|
30
40
|
.lexxy-editor__toolbar-dropdown > summary::-webkit-details-marker {
|
|
31
41
|
display: none;
|
|
32
42
|
}
|
|
43
|
+
*/
|
|
33
44
|
|
|
34
45
|
/* Rich text content spacing */
|
|
35
46
|
.rp-rich-text p,
|
|
@@ -153,8 +153,9 @@ module Railspress
|
|
|
153
153
|
private
|
|
154
154
|
|
|
155
155
|
# Wrap content in a Stimulus-controlled <span> for inline editing.
|
|
156
|
-
#
|
|
157
|
-
#
|
|
156
|
+
# Only the display Turbo Frame lives inside the span — the menu and
|
|
157
|
+
# backdrop are created dynamically on document.body by the JS controller
|
|
158
|
+
# to avoid inheriting ancestor stacking contexts (opacity, transforms).
|
|
158
159
|
def inline_wrapper_for(content_element, rendered_content)
|
|
159
160
|
suffix = SecureRandom.hex(4)
|
|
160
161
|
display_frame_id = "cms_display_#{content_element.id}_#{suffix}"
|
|
@@ -177,27 +178,7 @@ module Railspress
|
|
|
177
178
|
},
|
|
178
179
|
style: "display:contents"
|
|
179
180
|
) do
|
|
180
|
-
|
|
181
|
-
display = content_tag("turbo-frame", rendered_content, id: display_frame_id)
|
|
182
|
-
|
|
183
|
-
# Context menu panel (hidden by default)
|
|
184
|
-
menu = content_tag(:div, class: "rp-inline-menu rp-inline-hidden",
|
|
185
|
-
data: { "rp--cms-inline-editor-target": "menu" }
|
|
186
|
-
) do
|
|
187
|
-
# Form Turbo Frame (lazy-loaded on first open)
|
|
188
|
-
content_tag("turbo-frame", "", id: form_frame_id,
|
|
189
|
-
src: nil,
|
|
190
|
-
data: { "rp--cms-inline-editor-target": "frame" })
|
|
191
|
-
end
|
|
192
|
-
|
|
193
|
-
# Backdrop (hidden by default)
|
|
194
|
-
backdrop = content_tag(:div, "", class: "rp-inline-backdrop rp-inline-hidden",
|
|
195
|
-
data: {
|
|
196
|
-
"rp--cms-inline-editor-target": "backdrop",
|
|
197
|
-
action: "click->rp--cms-inline-editor#close"
|
|
198
|
-
})
|
|
199
|
-
|
|
200
|
-
safe_join([ display, menu, backdrop ])
|
|
181
|
+
content_tag("turbo-frame", rendered_content, id: display_frame_id)
|
|
201
182
|
end
|
|
202
183
|
end
|
|
203
184
|
|
|
@@ -7,6 +7,9 @@ import { Controller } from "@hotwired/stimulus"
|
|
|
7
7
|
* Opens a positioned context menu with a Turbo Frame that lazy-loads an
|
|
8
8
|
* inline edit form from the admin controller.
|
|
9
9
|
*
|
|
10
|
+
* The menu and backdrop are created dynamically on document.body to avoid
|
|
11
|
+
* inheriting ancestor stacking contexts (opacity, transforms, etc.).
|
|
12
|
+
*
|
|
10
13
|
* Usage (generated by CmsHelper#inline_wrapper_for):
|
|
11
14
|
* <span data-controller="rp--cms-inline-editor"
|
|
12
15
|
* data-rp--cms-inline-editor-inline-path-value="/railspress/admin/content_elements/1/inline"
|
|
@@ -15,17 +18,10 @@ import { Controller } from "@hotwired/stimulus"
|
|
|
15
18
|
* data-rp--cms-inline-editor-element-id-value="1"
|
|
16
19
|
* data-action="contextmenu->rp--cms-inline-editor#open"
|
|
17
20
|
* style="display:contents">
|
|
18
|
-
*
|
|
19
21
|
* <turbo-frame id="cms_display_1_abc123">Content here</turbo-frame>
|
|
20
|
-
* <div class="rp-inline-menu rp-inline-hidden" data-rp--cms-inline-editor-target="menu">
|
|
21
|
-
* <turbo-frame id="cms_form_1_abc123" data-rp--cms-inline-editor-target="frame"></turbo-frame>
|
|
22
|
-
* </div>
|
|
23
|
-
* <div class="rp-inline-backdrop rp-inline-hidden" data-rp--cms-inline-editor-target="backdrop"></div>
|
|
24
22
|
* </span>
|
|
25
23
|
*/
|
|
26
24
|
export default class extends Controller {
|
|
27
|
-
static targets = ["menu", "frame", "backdrop"]
|
|
28
|
-
|
|
29
25
|
static values = {
|
|
30
26
|
inlinePath: String,
|
|
31
27
|
frameId: String,
|
|
@@ -37,32 +33,53 @@ export default class extends Controller {
|
|
|
37
33
|
connect() {
|
|
38
34
|
this._handleKeydown = this.handleKeydown.bind(this)
|
|
39
35
|
this._handleSubmitEnd = this.handleSubmitEnd.bind(this)
|
|
36
|
+
this._handleBackdropClick = () => this.close()
|
|
40
37
|
}
|
|
41
38
|
|
|
42
39
|
disconnect() {
|
|
43
40
|
document.removeEventListener("keydown", this._handleKeydown)
|
|
44
|
-
this.
|
|
41
|
+
if (this._menu) this._menu.remove()
|
|
42
|
+
if (this._backdrop) this._backdrop.remove()
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Lazily create the menu and backdrop on document.body (once per controller)
|
|
46
|
+
_ensureMenuExists() {
|
|
47
|
+
if (this._menu) return
|
|
48
|
+
|
|
49
|
+
this._backdrop = document.createElement("div")
|
|
50
|
+
this._backdrop.className = "rp-inline-backdrop rp-inline-hidden"
|
|
51
|
+
this._backdrop.addEventListener("click", this._handleBackdropClick)
|
|
52
|
+
document.body.appendChild(this._backdrop)
|
|
53
|
+
|
|
54
|
+
this._menu = document.createElement("div")
|
|
55
|
+
this._menu.className = "rp-inline-menu rp-inline-hidden"
|
|
56
|
+
document.body.appendChild(this._menu)
|
|
57
|
+
|
|
58
|
+
this._frame = document.createElement("turbo-frame")
|
|
59
|
+
this._frame.id = this.formFrameIdValue
|
|
60
|
+
this._menu.appendChild(this._frame)
|
|
45
61
|
}
|
|
46
62
|
|
|
47
63
|
open(event) {
|
|
48
64
|
event.preventDefault()
|
|
49
65
|
event.stopPropagation()
|
|
50
66
|
|
|
67
|
+
this._ensureMenuExists()
|
|
68
|
+
|
|
51
69
|
// Close any other open inline editors (one-at-a-time)
|
|
52
70
|
document.querySelectorAll(".rp-inline-menu:not(.rp-inline-hidden)").forEach(menu => {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
)
|
|
57
|
-
if (controller && controller !== this) controller.close()
|
|
71
|
+
if (menu !== this._menu) menu.classList.add("rp-inline-hidden")
|
|
72
|
+
})
|
|
73
|
+
document.querySelectorAll(".rp-inline-backdrop:not(.rp-inline-hidden)").forEach(backdrop => {
|
|
74
|
+
if (backdrop !== this._backdrop) backdrop.classList.add("rp-inline-hidden")
|
|
58
75
|
})
|
|
59
76
|
|
|
60
77
|
// Lazy-load the form Turbo Frame on first open
|
|
61
|
-
if (!this.loadedValue
|
|
78
|
+
if (!this.loadedValue) {
|
|
62
79
|
const url = new URL(this.inlinePathValue, window.location.origin)
|
|
63
80
|
url.searchParams.set("form_frame_id", this.formFrameIdValue)
|
|
64
81
|
url.searchParams.set("display_frame_id", this.frameIdValue)
|
|
65
|
-
this.
|
|
82
|
+
this._frame.setAttribute("src", url.toString())
|
|
66
83
|
this.loadedValue = true
|
|
67
84
|
}
|
|
68
85
|
|
|
@@ -70,19 +87,19 @@ export default class extends Controller {
|
|
|
70
87
|
this.positionMenu(event.clientX, event.clientY)
|
|
71
88
|
|
|
72
89
|
// Show menu and backdrop
|
|
73
|
-
this.
|
|
74
|
-
this.
|
|
90
|
+
this._menu.classList.remove("rp-inline-hidden")
|
|
91
|
+
this._backdrop.classList.remove("rp-inline-hidden")
|
|
75
92
|
|
|
76
93
|
// Listen for escape and form submission
|
|
77
94
|
document.addEventListener("keydown", this._handleKeydown)
|
|
78
|
-
this.
|
|
95
|
+
this._menu.addEventListener("turbo:submit-end", this._handleSubmitEnd)
|
|
79
96
|
}
|
|
80
97
|
|
|
81
98
|
close() {
|
|
82
|
-
this.
|
|
83
|
-
this.
|
|
99
|
+
if (this._menu) this._menu.classList.add("rp-inline-hidden")
|
|
100
|
+
if (this._backdrop) this._backdrop.classList.add("rp-inline-hidden")
|
|
84
101
|
document.removeEventListener("keydown", this._handleKeydown)
|
|
85
|
-
this.
|
|
102
|
+
if (this._menu) this._menu.removeEventListener("turbo:submit-end", this._handleSubmitEnd)
|
|
86
103
|
}
|
|
87
104
|
|
|
88
105
|
handleKeydown(event) {
|
|
@@ -101,7 +118,7 @@ export default class extends Controller {
|
|
|
101
118
|
}
|
|
102
119
|
|
|
103
120
|
positionMenu(x, y) {
|
|
104
|
-
const menu = this.
|
|
121
|
+
const menu = this._menu
|
|
105
122
|
// Reset position to measure natural dimensions
|
|
106
123
|
menu.style.left = "0px"
|
|
107
124
|
menu.style.top = "0px"
|
|
@@ -30,7 +30,7 @@ module Railspress
|
|
|
30
30
|
|
|
31
31
|
# Get override for specific context
|
|
32
32
|
def override_for(context)
|
|
33
|
-
overrides
|
|
33
|
+
overrides&.dig(context.to_s)&.with_indifferent_access
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
# Check if context has custom override (not using focal point)
|
|
@@ -132,7 +132,7 @@ module Railspress
|
|
|
132
132
|
zip_filename = "posts_export_#{timestamp}.zip"
|
|
133
133
|
zip_path = Rails.root.join("tmp", zip_filename)
|
|
134
134
|
|
|
135
|
-
Zip::File.open(zip_path,
|
|
135
|
+
Zip::File.open(zip_path, create: true) do |zipfile|
|
|
136
136
|
add_directory_to_zip(zipfile, @export_dir, "")
|
|
137
137
|
end
|
|
138
138
|
|
|
@@ -60,9 +60,9 @@ module Railspress
|
|
|
60
60
|
zip_file.each do |entry|
|
|
61
61
|
next if entry.name.start_with?("__MACOSX", ".")
|
|
62
62
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
entry.extract(
|
|
63
|
+
# rubyzip 3+ expects extraction with a destination directory.
|
|
64
|
+
destination = File.join(@extract_dir.to_s, entry.name)
|
|
65
|
+
entry.extract(entry.name, destination_directory: @extract_dir.to_s) unless File.exist?(destination)
|
|
66
66
|
end
|
|
67
67
|
end
|
|
68
68
|
|
|
@@ -21,7 +21,9 @@ module Railspress
|
|
|
21
21
|
return [] if csv_string.blank?
|
|
22
22
|
|
|
23
23
|
tag_names = csv_string.split(",").map { |t| t.strip.downcase }.reject(&:blank?).uniq
|
|
24
|
-
tag_names.map
|
|
24
|
+
tag_names.map do |name|
|
|
25
|
+
find_by(name: name) || find_by(slug: name.parameterize) || create!(name: name)
|
|
26
|
+
end
|
|
25
27
|
end
|
|
26
28
|
|
|
27
29
|
private
|
|
@@ -73,9 +73,9 @@ module Railspress
|
|
|
73
73
|
break
|
|
74
74
|
end
|
|
75
75
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
entry.extract(
|
|
76
|
+
# rubyzip 3+ expects extraction with a destination directory.
|
|
77
|
+
destination = File.join(@extract_dir.to_s, entry.name)
|
|
78
|
+
entry.extract(entry.name, destination_directory: @extract_dir.to_s) unless File.exist?(destination)
|
|
79
79
|
end
|
|
80
80
|
end
|
|
81
81
|
rescue Zip::Error => e
|
data/config/importmap.rb
CHANGED
|
@@ -8,6 +8,9 @@
|
|
|
8
8
|
#
|
|
9
9
|
# This auto-registers all RailsPress Stimulus controllers.
|
|
10
10
|
|
|
11
|
+
# Lexxy rich text editor (hard dependency — auto-pinned so host apps don't need to)
|
|
12
|
+
pin "lexxy", to: "lexxy.js"
|
|
13
|
+
|
|
11
14
|
# Turbo for Turbo Frames support
|
|
12
15
|
pin "@hotwired/turbo-rails", to: "turbo.min.js"
|
|
13
16
|
|
|
@@ -10,6 +10,10 @@ module Railspress
|
|
|
10
10
|
|
|
11
11
|
desc "Install RailsPress: copy migrations, mount engine, and configure JavaScript"
|
|
12
12
|
|
|
13
|
+
def detect_install_mode
|
|
14
|
+
@upgrading_existing_install = existing_railspress_installation?
|
|
15
|
+
end
|
|
16
|
+
|
|
13
17
|
def copy_railspress_migrations
|
|
14
18
|
run "bundle exec rake railspress:install:migrations"
|
|
15
19
|
end
|
|
@@ -59,17 +63,7 @@ module Railspress
|
|
|
59
63
|
say_status :pinned, "@rails/activestorage in importmap", :green
|
|
60
64
|
end
|
|
61
65
|
|
|
62
|
-
#
|
|
63
|
-
if importmap_content.include?('"lexxy"')
|
|
64
|
-
say_status :skip, "Lexxy already pinned in importmap", :yellow
|
|
65
|
-
else
|
|
66
|
-
append_to_file importmap_file, <<~RUBY
|
|
67
|
-
|
|
68
|
-
# RailsPress rich text editor
|
|
69
|
-
pin "lexxy", to: "lexxy.js"
|
|
70
|
-
RUBY
|
|
71
|
-
say_status :pinned, "Lexxy in importmap", :green
|
|
72
|
-
end
|
|
66
|
+
# Lexxy is auto-pinned by the engine's importmap — no host app pin needed
|
|
73
67
|
end
|
|
74
68
|
|
|
75
69
|
def generate_initializer
|
|
@@ -84,21 +78,34 @@ module Railspress
|
|
|
84
78
|
end
|
|
85
79
|
|
|
86
80
|
def show_post_install_message
|
|
81
|
+
upgrading = !!@upgrading_existing_install
|
|
82
|
+
|
|
87
83
|
say ""
|
|
88
84
|
say "=" * 60, :green
|
|
89
|
-
say
|
|
85
|
+
say(" RailsPress #{upgrading ? "upgrade setup completed!" : "installed successfully!"}", :green)
|
|
90
86
|
say "=" * 60, :green
|
|
91
87
|
say ""
|
|
92
|
-
say "Next steps:", :yellow
|
|
88
|
+
say(upgrading ? "Upgrade next steps:" : "Next steps:", :yellow)
|
|
93
89
|
say ""
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
90
|
+
if upgrading
|
|
91
|
+
say " 1. Review upgrade notes:"
|
|
92
|
+
say " docs/UPGRADING.md", :cyan
|
|
93
|
+
say ""
|
|
94
|
+
say " 2. Run migrations:"
|
|
95
|
+
say " $ rails db:migrate", :cyan
|
|
96
|
+
say ""
|
|
97
|
+
say " 3. Verify your JS integration if using host-page features:"
|
|
98
|
+
say ' app/javascript/application.js includes: import "railspress"', :cyan
|
|
99
|
+
else
|
|
100
|
+
say " 1. Run migrations:"
|
|
101
|
+
say " $ rails db:migrate", :cyan
|
|
102
|
+
say ""
|
|
103
|
+
say " 2. Access the admin dashboard:"
|
|
104
|
+
say " http://localhost:3000/railspress/admin", :cyan
|
|
105
|
+
say ""
|
|
106
|
+
say " 3. (Optional) Change the mount path in config/routes.rb:"
|
|
107
|
+
say ' mount Railspress::Engine => "/blog"', :cyan
|
|
108
|
+
end
|
|
102
109
|
say ""
|
|
103
110
|
say "Optional features:", :yellow
|
|
104
111
|
say " Edit config/initializers/railspress.rb to enable:"
|
|
@@ -106,6 +113,9 @@ module Railspress
|
|
|
106
113
|
say " - Inline CMS editing (config.inline_editing_check)"
|
|
107
114
|
say " See docs/CONFIGURING.md and docs/INLINE_EDITING.md for details."
|
|
108
115
|
say ""
|
|
116
|
+
say "Full guides & documentation:", :yellow
|
|
117
|
+
say " https://railspress.org", :cyan
|
|
118
|
+
say ""
|
|
109
119
|
say "=" * 60, :green
|
|
110
120
|
end
|
|
111
121
|
|
|
@@ -130,6 +140,16 @@ module Railspress
|
|
|
130
140
|
def importmap_available?
|
|
131
141
|
defined?(Importmap) && Rails.root.join("config", "importmap.rb").exist?
|
|
132
142
|
end
|
|
143
|
+
|
|
144
|
+
def existing_railspress_installation?
|
|
145
|
+
routes_mounted = File.read(rails_route_file).include?("Railspress::Engine")
|
|
146
|
+
initializer_exists = Rails.root.join("config", "initializers", "railspress.rb").exist?
|
|
147
|
+
migrations_copied = Dir.glob(migrations_dir.join("*railspress*.rb")).any?
|
|
148
|
+
|
|
149
|
+
routes_mounted || initializer_exists || migrations_copied
|
|
150
|
+
rescue Errno::ENOENT
|
|
151
|
+
false
|
|
152
|
+
end
|
|
133
153
|
end
|
|
134
154
|
end
|
|
135
155
|
end
|
data/lib/railspress/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: railspress-engine
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Avi Flombaum
|
|
@@ -27,42 +27,42 @@ dependencies:
|
|
|
27
27
|
name: lexxy
|
|
28
28
|
requirement: !ruby/object:Gem::Requirement
|
|
29
29
|
requirements:
|
|
30
|
-
- - "
|
|
30
|
+
- - ">="
|
|
31
31
|
- !ruby/object:Gem::Version
|
|
32
|
-
version: 0.
|
|
32
|
+
version: 0.9.0.beta
|
|
33
33
|
type: :runtime
|
|
34
34
|
prerelease: false
|
|
35
35
|
version_requirements: !ruby/object:Gem::Requirement
|
|
36
36
|
requirements:
|
|
37
|
-
- - "
|
|
37
|
+
- - ">="
|
|
38
38
|
- !ruby/object:Gem::Version
|
|
39
|
-
version: 0.
|
|
39
|
+
version: 0.9.0.beta
|
|
40
40
|
- !ruby/object:Gem::Dependency
|
|
41
41
|
name: rubyzip
|
|
42
42
|
requirement: !ruby/object:Gem::Requirement
|
|
43
43
|
requirements:
|
|
44
|
-
- - "
|
|
44
|
+
- - ">="
|
|
45
45
|
- !ruby/object:Gem::Version
|
|
46
46
|
version: '2.3'
|
|
47
47
|
type: :runtime
|
|
48
48
|
prerelease: false
|
|
49
49
|
version_requirements: !ruby/object:Gem::Requirement
|
|
50
50
|
requirements:
|
|
51
|
-
- - "
|
|
51
|
+
- - ">="
|
|
52
52
|
- !ruby/object:Gem::Version
|
|
53
53
|
version: '2.3'
|
|
54
54
|
- !ruby/object:Gem::Dependency
|
|
55
55
|
name: redcarpet
|
|
56
56
|
requirement: !ruby/object:Gem::Requirement
|
|
57
57
|
requirements:
|
|
58
|
-
- - "
|
|
58
|
+
- - ">="
|
|
59
59
|
- !ruby/object:Gem::Version
|
|
60
60
|
version: '3.6'
|
|
61
61
|
type: :runtime
|
|
62
62
|
prerelease: false
|
|
63
63
|
version_requirements: !ruby/object:Gem::Requirement
|
|
64
64
|
requirements:
|
|
65
|
-
- - "
|
|
65
|
+
- - ">="
|
|
66
66
|
- !ruby/object:Gem::Version
|
|
67
67
|
version: '3.6'
|
|
68
68
|
- !ruby/object:Gem::Dependency
|
|
@@ -297,14 +297,19 @@ metadata:
|
|
|
297
297
|
post_install_message: |2+
|
|
298
298
|
|
|
299
299
|
============================================================
|
|
300
|
-
RailsPress installed
|
|
300
|
+
RailsPress installed/updated.
|
|
301
301
|
|
|
302
|
+
New install:
|
|
302
303
|
$ rails generate railspress:install
|
|
303
304
|
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
305
|
+
Upgrading existing app:
|
|
306
|
+
$ rails railspress:install:migrations
|
|
307
|
+
$ rails db:migrate
|
|
308
|
+
|
|
309
|
+
Guides:
|
|
310
|
+
- Install/setup: README.md + docs/CONFIGURING.md
|
|
311
|
+
- Upgrading: docs/UPGRADING.md
|
|
312
|
+
- Full docs: https://railspress.org
|
|
308
313
|
============================================================
|
|
309
314
|
|
|
310
315
|
rdoc_options: []
|