iron-cms 0.1.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.
Files changed (240) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +174 -0
  4. data/Rakefile +8 -0
  5. data/app/assets/builds/iron.css +2 -0
  6. data/app/assets/config/iron_manifest.js +1 -0
  7. data/app/assets/images/iron/icons/sprite.svg +9425 -0
  8. data/app/assets/tailwind/iron/actiontext.css +550 -0
  9. data/app/assets/tailwind/iron/application.css +66 -0
  10. data/app/assets/tailwind/iron/components/button.css +74 -0
  11. data/app/assets/tailwind/iron/components/dropdown.css +42 -0
  12. data/app/assets/tailwind/iron/components/fieldset.css +18 -0
  13. data/app/assets/tailwind/iron/components/form.css +14 -0
  14. data/app/assets/tailwind/iron/components/icon-picker.css +9 -0
  15. data/app/assets/tailwind/iron/components/input.css +44 -0
  16. data/app/assets/tailwind/iron/components/page.css +7 -0
  17. data/app/assets/tailwind/iron/components/select.css +36 -0
  18. data/app/assets/tailwind/iron/components/sidebar.css +21 -0
  19. data/app/assets/tailwind/iron/components/textarea.css +27 -0
  20. data/app/controllers/concerns/iron/authentication.rb +66 -0
  21. data/app/controllers/concerns/iron/authorization.rb +11 -0
  22. data/app/controllers/concerns/iron/locale_aware.rb +20 -0
  23. data/app/controllers/concerns/iron/web_page.rb +18 -0
  24. data/app/controllers/iron/application_controller.rb +7 -0
  25. data/app/controllers/iron/block_definitions/field_definitions_controller.rb +8 -0
  26. data/app/controllers/iron/block_definitions_controller.rb +52 -0
  27. data/app/controllers/iron/blocks_controller.rb +12 -0
  28. data/app/controllers/iron/content_types/field_definitions_controller.rb +8 -0
  29. data/app/controllers/iron/content_types_controller.rb +52 -0
  30. data/app/controllers/iron/entries_controller.rb +103 -0
  31. data/app/controllers/iron/field_definitions_controller.rb +55 -0
  32. data/app/controllers/iron/first_runs_controller.rb +29 -0
  33. data/app/controllers/iron/home_controller.rb +6 -0
  34. data/app/controllers/iron/icons_controller.rb +10 -0
  35. data/app/controllers/iron/locales_controller.rb +52 -0
  36. data/app/controllers/iron/passwords_controller.rb +36 -0
  37. data/app/controllers/iron/references_controller.rb +11 -0
  38. data/app/controllers/iron/schemas_controller.rb +32 -0
  39. data/app/controllers/iron/sessions_controller.rb +32 -0
  40. data/app/controllers/iron/settings_controller.rb +23 -0
  41. data/app/controllers/iron/users_controller.rb +66 -0
  42. data/app/helpers/iron/application_helper.rb +25 -0
  43. data/app/helpers/iron/avatar_helper.rb +35 -0
  44. data/app/helpers/iron/block_helper.rb +4 -0
  45. data/app/helpers/iron/buttons_helper.rb +14 -0
  46. data/app/helpers/iron/components/badge_helper.rb +70 -0
  47. data/app/helpers/iron/components/dropdown_helper.rb +161 -0
  48. data/app/helpers/iron/content_types_helper.rb +11 -0
  49. data/app/helpers/iron/entries_helper.rb +13 -0
  50. data/app/helpers/iron/field_definitions_helper.rb +5 -0
  51. data/app/helpers/iron/form_builder.rb +43 -0
  52. data/app/helpers/iron/icons_helper.rb +30 -0
  53. data/app/helpers/iron/image_helper.rb +50 -0
  54. data/app/javascript/iron/application.js +6 -0
  55. data/app/javascript/iron/controllers/application.js +9 -0
  56. data/app/javascript/iron/controllers/element_controller.js +11 -0
  57. data/app/javascript/iron/controllers/file_upload_controller.js +18 -0
  58. data/app/javascript/iron/controllers/form_controller.js +7 -0
  59. data/app/javascript/iron/controllers/handle_controller.js +27 -0
  60. data/app/javascript/iron/controllers/icon_picker_controller.js +48 -0
  61. data/app/javascript/iron/controllers/index.js +4 -0
  62. data/app/javascript/iron/controllers/sortable_list_controller.js +125 -0
  63. data/app/javascript/iron/controllers/toggle_controller.js +14 -0
  64. data/app/javascript/iron/controllers/trix_controller.js +19 -0
  65. data/app/javascript/iron/lib/lexorank.js +51 -0
  66. data/app/jobs/iron/application_job.rb +4 -0
  67. data/app/jobs/iron/generate_entry_routes_job.rb +15 -0
  68. data/app/mailers/iron/application_mailer.rb +6 -0
  69. data/app/mailers/passwords_mailer.rb +6 -0
  70. data/app/models/concerns/iron/csv_serializable.rb +28 -0
  71. data/app/models/iron/account/joinable.rb +16 -0
  72. data/app/models/iron/account.rb +13 -0
  73. data/app/models/iron/application_record.rb +5 -0
  74. data/app/models/iron/block_definition/portable.rb +20 -0
  75. data/app/models/iron/block_definition.rb +10 -0
  76. data/app/models/iron/content_type/field_queryable.rb +101 -0
  77. data/app/models/iron/content_type/portable.rb +30 -0
  78. data/app/models/iron/content_type/titlable.rb +13 -0
  79. data/app/models/iron/content_type/web_publishable.rb +47 -0
  80. data/app/models/iron/content_type.rb +39 -0
  81. data/app/models/iron/content_types/collection.rb +6 -0
  82. data/app/models/iron/content_types/single.rb +9 -0
  83. data/app/models/iron/current.rb +12 -0
  84. data/app/models/iron/entry/deep_validation.rb +32 -0
  85. data/app/models/iron/entry/presentable.rb +40 -0
  86. data/app/models/iron/entry/schemable.rb +16 -0
  87. data/app/models/iron/entry/titlable.rb +35 -0
  88. data/app/models/iron/entry/web_publishable.rb +85 -0
  89. data/app/models/iron/entry.rb +16 -0
  90. data/app/models/iron/field/belongs_to_entry.rb +29 -0
  91. data/app/models/iron/field.rb +20 -0
  92. data/app/models/iron/field_definition/portable.rb +36 -0
  93. data/app/models/iron/field_definition.rb +42 -0
  94. data/app/models/iron/field_definitions/block.rb +23 -0
  95. data/app/models/iron/field_definitions/block_list.rb +8 -0
  96. data/app/models/iron/field_definitions/boolean.rb +7 -0
  97. data/app/models/iron/field_definitions/date.rb +7 -0
  98. data/app/models/iron/field_definitions/file.rb +67 -0
  99. data/app/models/iron/field_definitions/number.rb +7 -0
  100. data/app/models/iron/field_definitions/reference.rb +8 -0
  101. data/app/models/iron/field_definitions/reference_list.rb +8 -0
  102. data/app/models/iron/field_definitions/rich_text_area.rb +4 -0
  103. data/app/models/iron/field_definitions/text_area.rb +7 -0
  104. data/app/models/iron/field_definitions/text_field.rb +25 -0
  105. data/app/models/iron/fields/block.rb +40 -0
  106. data/app/models/iron/fields/block_list.rb +16 -0
  107. data/app/models/iron/fields/boolean.rb +7 -0
  108. data/app/models/iron/fields/date.rb +7 -0
  109. data/app/models/iron/fields/file.rb +29 -0
  110. data/app/models/iron/fields/number.rb +7 -0
  111. data/app/models/iron/fields/reference.rb +14 -0
  112. data/app/models/iron/fields/reference_list.rb +17 -0
  113. data/app/models/iron/fields/rich_text_area.rb +9 -0
  114. data/app/models/iron/fields/text_area.rb +7 -0
  115. data/app/models/iron/fields/text_field.rb +19 -0
  116. data/app/models/iron/first_run.rb +13 -0
  117. data/app/models/iron/icon_catalog.rb +45 -0
  118. data/app/models/iron/locale.rb +30 -0
  119. data/app/models/iron/reference.rb +8 -0
  120. data/app/models/iron/schema_archive.rb +71 -0
  121. data/app/models/iron/schema_exporter.rb +15 -0
  122. data/app/models/iron/schema_importer.rb +278 -0
  123. data/app/models/iron/session.rb +5 -0
  124. data/app/models/iron/user/role.rb +21 -0
  125. data/app/models/iron/user.rb +37 -0
  126. data/app/views/active_storage/blobs/_blob.html.erb +14 -0
  127. data/app/views/iron/block_definitions/_block_definition.html.erb +21 -0
  128. data/app/views/iron/block_definitions/_form.html.erb +46 -0
  129. data/app/views/iron/block_definitions/edit.html.erb +8 -0
  130. data/app/views/iron/block_definitions/index.html.erb +18 -0
  131. data/app/views/iron/block_definitions/new.html.erb +8 -0
  132. data/app/views/iron/block_definitions/show.html.erb +34 -0
  133. data/app/views/iron/blocks/new.turbo_stream.erb +6 -0
  134. data/app/views/iron/content_types/_content_type.html.erb +21 -0
  135. data/app/views/iron/content_types/_form.html.erb +137 -0
  136. data/app/views/iron/content_types/edit.html.erb +8 -0
  137. data/app/views/iron/content_types/index.html.erb +28 -0
  138. data/app/views/iron/content_types/new.html.erb +8 -0
  139. data/app/views/iron/content_types/show.html.erb +49 -0
  140. data/app/views/iron/entries/_entry.html.erb +17 -0
  141. data/app/views/iron/entries/_entry_option.html.erb +19 -0
  142. data/app/views/iron/entries/_form.html.erb +63 -0
  143. data/app/views/iron/entries/edit.html.erb +52 -0
  144. data/app/views/iron/entries/entry.html.erb +21 -0
  145. data/app/views/iron/entries/fields/_block.html.erb +92 -0
  146. data/app/views/iron/entries/fields/_block_list.html.erb +45 -0
  147. data/app/views/iron/entries/fields/_boolean.html.erb +13 -0
  148. data/app/views/iron/entries/fields/_date.html.erb +11 -0
  149. data/app/views/iron/entries/fields/_file.html.erb +60 -0
  150. data/app/views/iron/entries/fields/_number.html.erb +11 -0
  151. data/app/views/iron/entries/fields/_reference.html.erb +12 -0
  152. data/app/views/iron/entries/fields/_reference_item.html.erb +28 -0
  153. data/app/views/iron/entries/fields/_reference_list.html.erb +44 -0
  154. data/app/views/iron/entries/fields/_rich_text_area.html.erb +13 -0
  155. data/app/views/iron/entries/fields/_text_area.html.erb +11 -0
  156. data/app/views/iron/entries/fields/_text_field.html.erb +28 -0
  157. data/app/views/iron/entries/index.html.erb +21 -0
  158. data/app/views/iron/entries/new.html.erb +8 -0
  159. data/app/views/iron/entries/search.html.erb +33 -0
  160. data/app/views/iron/field_definitions/_field_definition.html.erb +37 -0
  161. data/app/views/iron/field_definitions/block/_form.html.erb +16 -0
  162. data/app/views/iron/field_definitions/block_list/_form.html.erb +13 -0
  163. data/app/views/iron/field_definitions/boolean/_form.html.erb +2 -0
  164. data/app/views/iron/field_definitions/date/_form.html.erb +2 -0
  165. data/app/views/iron/field_definitions/edit.html.erb +16 -0
  166. data/app/views/iron/field_definitions/file/_form.html.erb +40 -0
  167. data/app/views/iron/field_definitions/index.html.erb +14 -0
  168. data/app/views/iron/field_definitions/layouts/_form.html.erb +47 -0
  169. data/app/views/iron/field_definitions/new.html.erb +22 -0
  170. data/app/views/iron/field_definitions/number/_form.html.erb +2 -0
  171. data/app/views/iron/field_definitions/reference/_form.html.erb +13 -0
  172. data/app/views/iron/field_definitions/reference_list/_form.html.erb +13 -0
  173. data/app/views/iron/field_definitions/rich_text_area/_form.html.erb +2 -0
  174. data/app/views/iron/field_definitions/text_area/_form.html.erb +2 -0
  175. data/app/views/iron/field_definitions/text_field/_form.html.erb +17 -0
  176. data/app/views/iron/first_runs/show.html.erb +44 -0
  177. data/app/views/iron/home/show.html.erb +2 -0
  178. data/app/views/iron/icons/index.html.erb +21 -0
  179. data/app/views/iron/locales/_form.html.erb +24 -0
  180. data/app/views/iron/locales/_locale.html.erb +15 -0
  181. data/app/views/iron/locales/edit.html.erb +8 -0
  182. data/app/views/iron/locales/index.html.erb +12 -0
  183. data/app/views/iron/locales/new.html.erb +8 -0
  184. data/app/views/iron/passwords/edit.html.erb +7 -0
  185. data/app/views/iron/passwords/new.html.erb +26 -0
  186. data/app/views/iron/passwords_mailer/reset.html.erb +4 -0
  187. data/app/views/iron/passwords_mailer/reset.text.erb +2 -0
  188. data/app/views/iron/published_pages/show.html.erb +10 -0
  189. data/app/views/iron/references/new.turbo_stream.erb +6 -0
  190. data/app/views/iron/schemas/new.html.erb +57 -0
  191. data/app/views/iron/sessions/new.html.erb +36 -0
  192. data/app/views/iron/settings/show.html.erb +38 -0
  193. data/app/views/iron/shared/_icon_picker.html.erb +60 -0
  194. data/app/views/iron/users/_form.html.erb +21 -0
  195. data/app/views/iron/users/_user.html.erb +27 -0
  196. data/app/views/iron/users/edit.html.erb +12 -0
  197. data/app/views/iron/users/index.html.erb +21 -0
  198. data/app/views/iron/users/new.html.erb +29 -0
  199. data/app/views/iron/users/show.html.erb +21 -0
  200. data/app/views/layouts/action_text/contents/_content.html.erb +3 -0
  201. data/app/views/layouts/iron/_sidebar.html.erb +83 -0
  202. data/app/views/layouts/iron/_sidebar_item.html.erb +14 -0
  203. data/app/views/layouts/iron/_toast.html.erb +29 -0
  204. data/app/views/layouts/iron/application.html.erb +46 -0
  205. data/app/views/layouts/iron/authentication.html.erb +41 -0
  206. data/config/importmap.rb +9 -0
  207. data/config/routes.rb +40 -0
  208. data/db/migrate/20250422131656_initial_iron_schema.rb +105 -0
  209. data/db/migrate/20250427100754_create_iron_accounts.rb +10 -0
  210. data/db/migrate/20250427104020_add_role_to_iron_users.rb +5 -0
  211. data/db/migrate/20250428094923_add_default_iron_locale_to_iron_account.rb +5 -0
  212. data/db/migrate/20250504144731_create_join_table_content_types_field_definitions.rb +25 -0
  213. data/db/migrate/20250505090716_add_title_field_definition_to_iron_content_types.rb +5 -0
  214. data/db/migrate/20250512210352_create_iron_references.rb +11 -0
  215. data/db/migrate/20250524220355_add_referenced_entry_id_to_iron_fields.rb +5 -0
  216. data/db/migrate/20250529211703_add_metadata_to_iron_field_definitions.rb +5 -0
  217. data/db/migrate/20250529211704_add_value_boolean_to_iron_fields.rb +5 -0
  218. data/db/migrate/20250531172837_add_type_to_iron_content_types.rb +5 -0
  219. data/db/migrate/20250601080146_add_icon_to_iron_content_types.rb +5 -0
  220. data/db/migrate/20250609091605_add_web_publishing_to_iron_content_types.rb +7 -0
  221. data/db/migrate/20250609091813_add_route_to_iron_entries.rb +6 -0
  222. data/lib/generators/iron/pages/pages_generator.rb +34 -0
  223. data/lib/generators/iron/pages/templates/pages_controller.rb +14 -0
  224. data/lib/generators/iron/pages/templates/show.html.erb +9 -0
  225. data/lib/generators/iron/template/template_generator.rb +35 -0
  226. data/lib/generators/iron/template/templates/content_type.html.erb +5 -0
  227. data/lib/iron/cva.rb +69 -0
  228. data/lib/iron/engine.rb +42 -0
  229. data/lib/iron/image_analyzer.rb +26 -0
  230. data/lib/iron/lexorank/exceptions.rb +4 -0
  231. data/lib/iron/lexorank/rankable.rb +185 -0
  232. data/lib/iron/lexorank/rebalance_rank_job.rb +10 -0
  233. data/lib/iron/lexorank/utils.rb +77 -0
  234. data/lib/iron/lexorank.rb +7 -0
  235. data/lib/iron/routing.rb +66 -0
  236. data/lib/iron/sdk.rb +19 -0
  237. data/lib/iron/version.rb +3 -0
  238. data/lib/iron.rb +8 -0
  239. data/lib/puma/plugin/iron_tailwindcss.rb +78 -0
  240. metadata +458 -0
@@ -0,0 +1,66 @@
1
+ module Iron
2
+ module Routing
3
+ def iron_pages
4
+ published_page_constraint = Iron::PublishedPageConstraint.new
5
+
6
+ direct :iron_entry do |entry|
7
+ locale = entry._metadata.locale
8
+ locale_prefix = locale && locale != Iron::Account.first.default_locale ? "/#{locale.code}" : ""
9
+ "#{locale_prefix}#{entry._metadata.web.path}"
10
+ end
11
+
12
+ Iron::ContentType.web_published.each do |content_type|
13
+ if content_type.base_path.present?
14
+ get "(/:locale)/#{content_type.base_path}/*route",
15
+ to: "pages#show",
16
+ defaults: { content_type: content_type.handle },
17
+ constraints: published_page_constraint
18
+ else
19
+ get "(/:locale)/*route",
20
+ to: "pages#show",
21
+ defaults: { content_type: content_type.handle },
22
+ constraints: lambda { |req|
23
+ published_page_constraint.matches?(req) &&
24
+ req.params[:route].present?
25
+ }
26
+
27
+ get ":locale",
28
+ to: "pages#show",
29
+ defaults: { content_type: content_type.handle, route: "" },
30
+ constraints: published_page_constraint
31
+
32
+ get "/",
33
+ to: "pages#show",
34
+ defaults: { content_type: content_type.handle, route: "" },
35
+ constraints: published_page_constraint
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+
42
+ class PublishedPageConstraint
43
+ def matches?(request)
44
+ matches_locale?(request) && has_published_entry?(request)
45
+ end
46
+
47
+ private
48
+
49
+ def matches_locale?(request)
50
+ locale = request.params[:locale]
51
+ return true if locale.blank?
52
+ return false if locale.start_with?("rails")
53
+ Iron::Locale.pluck(:code).include?(locale)
54
+ end
55
+
56
+ def has_published_entry?(request)
57
+ content_type_handle = request.params[:content_type]
58
+ route = request.params[:route].presence || ""
59
+ # For v1 we won't handle localization, we need to figure out how to localize routes
60
+ # locale = Iron::Locale.detect(request) || Iron::Locale.default
61
+
62
+ content_type = Iron::ContentType.find_by!(handle: content_type_handle)
63
+ content_type.entries.exists?(route: route)
64
+ end
65
+ end
66
+ end
data/lib/iron/sdk.rb ADDED
@@ -0,0 +1,19 @@
1
+ module Iron
2
+ class SDK
3
+ def self.method_missing(method)
4
+ content_type_handle = method.to_s
5
+ content_type = Iron::ContentType.find_by(handle: content_type_handle)
6
+
7
+ return super unless content_type.present?
8
+
9
+ return content_type.entry if content_type.single?
10
+
11
+ content_type.entries
12
+ end
13
+
14
+ def self.respond_to_missing?(method, include_private = false)
15
+ content_type_handle = method.to_s
16
+ Iron::ContentType.exists?(handle: content_type_handle) || super
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,3 @@
1
+ module Iron
2
+ VERSION = "0.1.0"
3
+ end
data/lib/iron.rb ADDED
@@ -0,0 +1,8 @@
1
+ require "iron/version"
2
+ require "iron/engine"
3
+ require "iron/cva"
4
+ require "iron/sdk"
5
+
6
+ module Iron
7
+ # Your code goes here...
8
+ end
@@ -0,0 +1,78 @@
1
+ require "puma/plugin"
2
+
3
+ Puma::Plugin.create do
4
+ attr_reader :puma_pid, :iron_tailwind_pid, :log_writer
5
+
6
+ def start(launcher)
7
+ @log_writer = launcher.log_writer
8
+ @puma_pid = $$
9
+
10
+ # Build the Iron engine Tailwind CSS command
11
+ engine_root = File.expand_path("../../..", __dir__)
12
+ command = [
13
+ "bundle", "exec", "tailwindcss",
14
+ "-i", "#{engine_root}/app/assets/tailwind/iron/application.css",
15
+ "-o", "#{engine_root}/app/assets/builds/iron.css",
16
+ "-w"
17
+ ]
18
+
19
+ @iron_tailwind_pid = fork do
20
+ Thread.new { monitor_puma }
21
+ begin
22
+ IO.popen(command, "r+") do |io|
23
+ IO.copy_stream(io, $stdout)
24
+ end
25
+ rescue Interrupt
26
+ end
27
+ end
28
+
29
+ launcher.events.on_stopped { stop_iron_tailwind }
30
+
31
+ in_background do
32
+ monitor_iron_tailwind
33
+ end
34
+ end
35
+
36
+ private
37
+ def stop_iron_tailwind
38
+ Process.waitpid(iron_tailwind_pid, Process::WNOHANG)
39
+ log "Stopping Iron tailwind..."
40
+ Process.kill(:INT, iron_tailwind_pid) if iron_tailwind_pid
41
+ Process.wait(iron_tailwind_pid)
42
+ rescue Errno::ECHILD, Errno::ESRCH
43
+ end
44
+
45
+ def monitor_puma
46
+ monitor(:puma_dead?, "Detected Puma has gone away, stopping Iron tailwind...")
47
+ end
48
+
49
+ def monitor_iron_tailwind
50
+ monitor(:iron_tailwind_dead?, "Detected Iron tailwind has gone away, stopping Puma...")
51
+ end
52
+
53
+ def monitor(process_dead, message)
54
+ loop do
55
+ if send(process_dead)
56
+ log message
57
+ Process.kill(:INT, $$)
58
+ break
59
+ end
60
+ sleep 2
61
+ end
62
+ end
63
+
64
+ def iron_tailwind_dead?
65
+ Process.waitpid(iron_tailwind_pid, Process::WNOHANG)
66
+ false
67
+ rescue Errno::ECHILD, Errno::ESRCH
68
+ true
69
+ end
70
+
71
+ def puma_dead?
72
+ Process.ppid != puma_pid
73
+ end
74
+
75
+ def log(...)
76
+ log_writer.log(...)
77
+ end
78
+ end
metadata ADDED
@@ -0,0 +1,458 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: iron-cms
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Massimo De Marchi
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: rails
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '8.0'
19
+ - - ">="
20
+ - !ruby/object:Gem::Version
21
+ version: 8.0.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - "~>"
27
+ - !ruby/object:Gem::Version
28
+ version: '8.0'
29
+ - - ">="
30
+ - !ruby/object:Gem::Version
31
+ version: 8.0.0
32
+ - !ruby/object:Gem::Dependency
33
+ name: activestorage
34
+ requirement: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - "~>"
37
+ - !ruby/object:Gem::Version
38
+ version: '8.0'
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: 8.0.0
42
+ type: :runtime
43
+ prerelease: false
44
+ version_requirements: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '8.0'
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: 8.0.0
52
+ - !ruby/object:Gem::Dependency
53
+ name: actiontext
54
+ requirement: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - "~>"
57
+ - !ruby/object:Gem::Version
58
+ version: '8.0'
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 8.0.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '8.0'
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: 8.0.0
72
+ - !ruby/object:Gem::Dependency
73
+ name: importmap-rails
74
+ requirement: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - "~>"
77
+ - !ruby/object:Gem::Version
78
+ version: '2.0'
79
+ type: :runtime
80
+ prerelease: false
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - "~>"
84
+ - !ruby/object:Gem::Version
85
+ version: '2.0'
86
+ - !ruby/object:Gem::Dependency
87
+ name: turbo-rails
88
+ requirement: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - "~>"
91
+ - !ruby/object:Gem::Version
92
+ version: '2.0'
93
+ type: :runtime
94
+ prerelease: false
95
+ version_requirements: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - "~>"
98
+ - !ruby/object:Gem::Version
99
+ version: '2.0'
100
+ - !ruby/object:Gem::Dependency
101
+ name: stimulus-rails
102
+ requirement: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - "~>"
105
+ - !ruby/object:Gem::Version
106
+ version: '1.3'
107
+ type: :runtime
108
+ prerelease: false
109
+ version_requirements: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - "~>"
112
+ - !ruby/object:Gem::Version
113
+ version: '1.3'
114
+ - !ruby/object:Gem::Dependency
115
+ name: ostruct
116
+ requirement: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - "~>"
119
+ - !ruby/object:Gem::Version
120
+ version: '0.6'
121
+ type: :runtime
122
+ prerelease: false
123
+ version_requirements: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - "~>"
126
+ - !ruby/object:Gem::Version
127
+ version: '0.6'
128
+ - !ruby/object:Gem::Dependency
129
+ name: bcrypt
130
+ requirement: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - "~>"
133
+ - !ruby/object:Gem::Version
134
+ version: 3.1.7
135
+ type: :runtime
136
+ prerelease: false
137
+ version_requirements: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - "~>"
140
+ - !ruby/object:Gem::Version
141
+ version: 3.1.7
142
+ - !ruby/object:Gem::Dependency
143
+ name: tailwind_merge
144
+ requirement: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - "~>"
147
+ - !ruby/object:Gem::Version
148
+ version: '0.16'
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: 0.16.0
152
+ type: :runtime
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: '0.16'
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ version: 0.16.0
162
+ - !ruby/object:Gem::Dependency
163
+ name: image_processing
164
+ requirement: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - "~>"
167
+ - !ruby/object:Gem::Version
168
+ version: '1.13'
169
+ type: :runtime
170
+ prerelease: false
171
+ version_requirements: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - "~>"
174
+ - !ruby/object:Gem::Version
175
+ version: '1.13'
176
+ - !ruby/object:Gem::Dependency
177
+ name: csv
178
+ requirement: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - "~>"
181
+ - !ruby/object:Gem::Version
182
+ version: '3.3'
183
+ type: :runtime
184
+ prerelease: false
185
+ version_requirements: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - "~>"
188
+ - !ruby/object:Gem::Version
189
+ version: '3.3'
190
+ description: A Rails engine for managing and publishing content with a flexible schema.
191
+ email:
192
+ - massimo@inkofpixel.com
193
+ executables: []
194
+ extensions: []
195
+ extra_rdoc_files: []
196
+ files:
197
+ - MIT-LICENSE
198
+ - README.md
199
+ - Rakefile
200
+ - app/assets/builds/iron.css
201
+ - app/assets/config/iron_manifest.js
202
+ - app/assets/images/iron/icons/sprite.svg
203
+ - app/assets/tailwind/iron/actiontext.css
204
+ - app/assets/tailwind/iron/application.css
205
+ - app/assets/tailwind/iron/components/button.css
206
+ - app/assets/tailwind/iron/components/dropdown.css
207
+ - app/assets/tailwind/iron/components/fieldset.css
208
+ - app/assets/tailwind/iron/components/form.css
209
+ - app/assets/tailwind/iron/components/icon-picker.css
210
+ - app/assets/tailwind/iron/components/input.css
211
+ - app/assets/tailwind/iron/components/page.css
212
+ - app/assets/tailwind/iron/components/select.css
213
+ - app/assets/tailwind/iron/components/sidebar.css
214
+ - app/assets/tailwind/iron/components/textarea.css
215
+ - app/controllers/concerns/iron/authentication.rb
216
+ - app/controllers/concerns/iron/authorization.rb
217
+ - app/controllers/concerns/iron/locale_aware.rb
218
+ - app/controllers/concerns/iron/web_page.rb
219
+ - app/controllers/iron/application_controller.rb
220
+ - app/controllers/iron/block_definitions/field_definitions_controller.rb
221
+ - app/controllers/iron/block_definitions_controller.rb
222
+ - app/controllers/iron/blocks_controller.rb
223
+ - app/controllers/iron/content_types/field_definitions_controller.rb
224
+ - app/controllers/iron/content_types_controller.rb
225
+ - app/controllers/iron/entries_controller.rb
226
+ - app/controllers/iron/field_definitions_controller.rb
227
+ - app/controllers/iron/first_runs_controller.rb
228
+ - app/controllers/iron/home_controller.rb
229
+ - app/controllers/iron/icons_controller.rb
230
+ - app/controllers/iron/locales_controller.rb
231
+ - app/controllers/iron/passwords_controller.rb
232
+ - app/controllers/iron/references_controller.rb
233
+ - app/controllers/iron/schemas_controller.rb
234
+ - app/controllers/iron/sessions_controller.rb
235
+ - app/controllers/iron/settings_controller.rb
236
+ - app/controllers/iron/users_controller.rb
237
+ - app/helpers/iron/application_helper.rb
238
+ - app/helpers/iron/avatar_helper.rb
239
+ - app/helpers/iron/block_helper.rb
240
+ - app/helpers/iron/buttons_helper.rb
241
+ - app/helpers/iron/components/badge_helper.rb
242
+ - app/helpers/iron/components/dropdown_helper.rb
243
+ - app/helpers/iron/content_types_helper.rb
244
+ - app/helpers/iron/entries_helper.rb
245
+ - app/helpers/iron/field_definitions_helper.rb
246
+ - app/helpers/iron/form_builder.rb
247
+ - app/helpers/iron/icons_helper.rb
248
+ - app/helpers/iron/image_helper.rb
249
+ - app/javascript/iron/application.js
250
+ - app/javascript/iron/controllers/application.js
251
+ - app/javascript/iron/controllers/element_controller.js
252
+ - app/javascript/iron/controllers/file_upload_controller.js
253
+ - app/javascript/iron/controllers/form_controller.js
254
+ - app/javascript/iron/controllers/handle_controller.js
255
+ - app/javascript/iron/controllers/icon_picker_controller.js
256
+ - app/javascript/iron/controllers/index.js
257
+ - app/javascript/iron/controllers/sortable_list_controller.js
258
+ - app/javascript/iron/controllers/toggle_controller.js
259
+ - app/javascript/iron/controllers/trix_controller.js
260
+ - app/javascript/iron/lib/lexorank.js
261
+ - app/jobs/iron/application_job.rb
262
+ - app/jobs/iron/generate_entry_routes_job.rb
263
+ - app/mailers/iron/application_mailer.rb
264
+ - app/mailers/passwords_mailer.rb
265
+ - app/models/concerns/iron/csv_serializable.rb
266
+ - app/models/iron/account.rb
267
+ - app/models/iron/account/joinable.rb
268
+ - app/models/iron/application_record.rb
269
+ - app/models/iron/block_definition.rb
270
+ - app/models/iron/block_definition/portable.rb
271
+ - app/models/iron/content_type.rb
272
+ - app/models/iron/content_type/field_queryable.rb
273
+ - app/models/iron/content_type/portable.rb
274
+ - app/models/iron/content_type/titlable.rb
275
+ - app/models/iron/content_type/web_publishable.rb
276
+ - app/models/iron/content_types/collection.rb
277
+ - app/models/iron/content_types/single.rb
278
+ - app/models/iron/current.rb
279
+ - app/models/iron/entry.rb
280
+ - app/models/iron/entry/deep_validation.rb
281
+ - app/models/iron/entry/presentable.rb
282
+ - app/models/iron/entry/schemable.rb
283
+ - app/models/iron/entry/titlable.rb
284
+ - app/models/iron/entry/web_publishable.rb
285
+ - app/models/iron/field.rb
286
+ - app/models/iron/field/belongs_to_entry.rb
287
+ - app/models/iron/field_definition.rb
288
+ - app/models/iron/field_definition/portable.rb
289
+ - app/models/iron/field_definitions/block.rb
290
+ - app/models/iron/field_definitions/block_list.rb
291
+ - app/models/iron/field_definitions/boolean.rb
292
+ - app/models/iron/field_definitions/date.rb
293
+ - app/models/iron/field_definitions/file.rb
294
+ - app/models/iron/field_definitions/number.rb
295
+ - app/models/iron/field_definitions/reference.rb
296
+ - app/models/iron/field_definitions/reference_list.rb
297
+ - app/models/iron/field_definitions/rich_text_area.rb
298
+ - app/models/iron/field_definitions/text_area.rb
299
+ - app/models/iron/field_definitions/text_field.rb
300
+ - app/models/iron/fields/block.rb
301
+ - app/models/iron/fields/block_list.rb
302
+ - app/models/iron/fields/boolean.rb
303
+ - app/models/iron/fields/date.rb
304
+ - app/models/iron/fields/file.rb
305
+ - app/models/iron/fields/number.rb
306
+ - app/models/iron/fields/reference.rb
307
+ - app/models/iron/fields/reference_list.rb
308
+ - app/models/iron/fields/rich_text_area.rb
309
+ - app/models/iron/fields/text_area.rb
310
+ - app/models/iron/fields/text_field.rb
311
+ - app/models/iron/first_run.rb
312
+ - app/models/iron/icon_catalog.rb
313
+ - app/models/iron/locale.rb
314
+ - app/models/iron/reference.rb
315
+ - app/models/iron/schema_archive.rb
316
+ - app/models/iron/schema_exporter.rb
317
+ - app/models/iron/schema_importer.rb
318
+ - app/models/iron/session.rb
319
+ - app/models/iron/user.rb
320
+ - app/models/iron/user/role.rb
321
+ - app/views/active_storage/blobs/_blob.html.erb
322
+ - app/views/iron/block_definitions/_block_definition.html.erb
323
+ - app/views/iron/block_definitions/_form.html.erb
324
+ - app/views/iron/block_definitions/edit.html.erb
325
+ - app/views/iron/block_definitions/index.html.erb
326
+ - app/views/iron/block_definitions/new.html.erb
327
+ - app/views/iron/block_definitions/show.html.erb
328
+ - app/views/iron/blocks/new.turbo_stream.erb
329
+ - app/views/iron/content_types/_content_type.html.erb
330
+ - app/views/iron/content_types/_form.html.erb
331
+ - app/views/iron/content_types/edit.html.erb
332
+ - app/views/iron/content_types/index.html.erb
333
+ - app/views/iron/content_types/new.html.erb
334
+ - app/views/iron/content_types/show.html.erb
335
+ - app/views/iron/entries/_entry.html.erb
336
+ - app/views/iron/entries/_entry_option.html.erb
337
+ - app/views/iron/entries/_form.html.erb
338
+ - app/views/iron/entries/edit.html.erb
339
+ - app/views/iron/entries/entry.html.erb
340
+ - app/views/iron/entries/fields/_block.html.erb
341
+ - app/views/iron/entries/fields/_block_list.html.erb
342
+ - app/views/iron/entries/fields/_boolean.html.erb
343
+ - app/views/iron/entries/fields/_date.html.erb
344
+ - app/views/iron/entries/fields/_file.html.erb
345
+ - app/views/iron/entries/fields/_number.html.erb
346
+ - app/views/iron/entries/fields/_reference.html.erb
347
+ - app/views/iron/entries/fields/_reference_item.html.erb
348
+ - app/views/iron/entries/fields/_reference_list.html.erb
349
+ - app/views/iron/entries/fields/_rich_text_area.html.erb
350
+ - app/views/iron/entries/fields/_text_area.html.erb
351
+ - app/views/iron/entries/fields/_text_field.html.erb
352
+ - app/views/iron/entries/index.html.erb
353
+ - app/views/iron/entries/new.html.erb
354
+ - app/views/iron/entries/search.html.erb
355
+ - app/views/iron/field_definitions/_field_definition.html.erb
356
+ - app/views/iron/field_definitions/block/_form.html.erb
357
+ - app/views/iron/field_definitions/block_list/_form.html.erb
358
+ - app/views/iron/field_definitions/boolean/_form.html.erb
359
+ - app/views/iron/field_definitions/date/_form.html.erb
360
+ - app/views/iron/field_definitions/edit.html.erb
361
+ - app/views/iron/field_definitions/file/_form.html.erb
362
+ - app/views/iron/field_definitions/index.html.erb
363
+ - app/views/iron/field_definitions/layouts/_form.html.erb
364
+ - app/views/iron/field_definitions/new.html.erb
365
+ - app/views/iron/field_definitions/number/_form.html.erb
366
+ - app/views/iron/field_definitions/reference/_form.html.erb
367
+ - app/views/iron/field_definitions/reference_list/_form.html.erb
368
+ - app/views/iron/field_definitions/rich_text_area/_form.html.erb
369
+ - app/views/iron/field_definitions/text_area/_form.html.erb
370
+ - app/views/iron/field_definitions/text_field/_form.html.erb
371
+ - app/views/iron/first_runs/show.html.erb
372
+ - app/views/iron/home/show.html.erb
373
+ - app/views/iron/icons/index.html.erb
374
+ - app/views/iron/locales/_form.html.erb
375
+ - app/views/iron/locales/_locale.html.erb
376
+ - app/views/iron/locales/edit.html.erb
377
+ - app/views/iron/locales/index.html.erb
378
+ - app/views/iron/locales/new.html.erb
379
+ - app/views/iron/passwords/edit.html.erb
380
+ - app/views/iron/passwords/new.html.erb
381
+ - app/views/iron/passwords_mailer/reset.html.erb
382
+ - app/views/iron/passwords_mailer/reset.text.erb
383
+ - app/views/iron/published_pages/show.html.erb
384
+ - app/views/iron/references/new.turbo_stream.erb
385
+ - app/views/iron/schemas/new.html.erb
386
+ - app/views/iron/sessions/new.html.erb
387
+ - app/views/iron/settings/show.html.erb
388
+ - app/views/iron/shared/_icon_picker.html.erb
389
+ - app/views/iron/users/_form.html.erb
390
+ - app/views/iron/users/_user.html.erb
391
+ - app/views/iron/users/edit.html.erb
392
+ - app/views/iron/users/index.html.erb
393
+ - app/views/iron/users/new.html.erb
394
+ - app/views/iron/users/show.html.erb
395
+ - app/views/layouts/action_text/contents/_content.html.erb
396
+ - app/views/layouts/iron/_sidebar.html.erb
397
+ - app/views/layouts/iron/_sidebar_item.html.erb
398
+ - app/views/layouts/iron/_toast.html.erb
399
+ - app/views/layouts/iron/application.html.erb
400
+ - app/views/layouts/iron/authentication.html.erb
401
+ - config/importmap.rb
402
+ - config/routes.rb
403
+ - db/migrate/20250422131656_initial_iron_schema.rb
404
+ - db/migrate/20250427100754_create_iron_accounts.rb
405
+ - db/migrate/20250427104020_add_role_to_iron_users.rb
406
+ - db/migrate/20250428094923_add_default_iron_locale_to_iron_account.rb
407
+ - db/migrate/20250504144731_create_join_table_content_types_field_definitions.rb
408
+ - db/migrate/20250505090716_add_title_field_definition_to_iron_content_types.rb
409
+ - db/migrate/20250512210352_create_iron_references.rb
410
+ - db/migrate/20250524220355_add_referenced_entry_id_to_iron_fields.rb
411
+ - db/migrate/20250529211703_add_metadata_to_iron_field_definitions.rb
412
+ - db/migrate/20250529211704_add_value_boolean_to_iron_fields.rb
413
+ - db/migrate/20250531172837_add_type_to_iron_content_types.rb
414
+ - db/migrate/20250601080146_add_icon_to_iron_content_types.rb
415
+ - db/migrate/20250609091605_add_web_publishing_to_iron_content_types.rb
416
+ - db/migrate/20250609091813_add_route_to_iron_entries.rb
417
+ - lib/generators/iron/pages/pages_generator.rb
418
+ - lib/generators/iron/pages/templates/pages_controller.rb
419
+ - lib/generators/iron/pages/templates/show.html.erb
420
+ - lib/generators/iron/template/template_generator.rb
421
+ - lib/generators/iron/template/templates/content_type.html.erb
422
+ - lib/iron.rb
423
+ - lib/iron/cva.rb
424
+ - lib/iron/engine.rb
425
+ - lib/iron/image_analyzer.rb
426
+ - lib/iron/lexorank.rb
427
+ - lib/iron/lexorank/exceptions.rb
428
+ - lib/iron/lexorank/rankable.rb
429
+ - lib/iron/lexorank/rebalance_rank_job.rb
430
+ - lib/iron/lexorank/utils.rb
431
+ - lib/iron/routing.rb
432
+ - lib/iron/sdk.rb
433
+ - lib/iron/version.rb
434
+ - lib/puma/plugin/iron_tailwindcss.rb
435
+ homepage: https://github.com/inkOfPixel/iron
436
+ licenses:
437
+ - MIT
438
+ metadata:
439
+ homepage_uri: https://github.com/inkOfPixel/iron
440
+ changelog_uri: https://github.com/inkOfPixel/iron/blob/main/CHANGELOG.md
441
+ rdoc_options: []
442
+ require_paths:
443
+ - lib
444
+ required_ruby_version: !ruby/object:Gem::Requirement
445
+ requirements:
446
+ - - ">="
447
+ - !ruby/object:Gem::Version
448
+ version: 3.2.0
449
+ required_rubygems_version: !ruby/object:Gem::Requirement
450
+ requirements:
451
+ - - ">="
452
+ - !ruby/object:Gem::Version
453
+ version: '0'
454
+ requirements: []
455
+ rubygems_version: 3.6.7
456
+ specification_version: 4
457
+ summary: Iron is a Ruby on Rails engine for managing and publishing content.
458
+ test_files: []