comfy_middle_seat 3.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.
Files changed (436) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +4 -0
  3. data/.gitattributes +3 -0
  4. data/.github/dependabot.yml +7 -0
  5. data/.github/issue_template.md +19 -0
  6. data/.github/pull_request_template.md +6 -0
  7. data/.github/workflows/claude-code-review.yml +46 -0
  8. data/.github/workflows/claude.yml +148 -0
  9. data/.github/workflows/coveralls.yml +53 -0
  10. data/.github/workflows/rubyonrails.yml +94 -0
  11. data/.gitignore +25 -0
  12. data/.rubocop.yml +82 -0
  13. data/.travis.yml +44 -0
  14. data/CHANGELOG.md +147 -0
  15. data/CONTRIBUTING.md +42 -0
  16. data/Gemfile +44 -0
  17. data/LICENSE +20 -0
  18. data/README.md +158 -0
  19. data/Rakefile +206 -0
  20. data/app/assets/builds/.keep +0 -0
  21. data/app/assets/config/manifest.js +1 -0
  22. data/app/assets/fonts/comfy/admin/cms/lib/redactor-font.eot +0 -0
  23. data/app/assets/javascripts/comfy/admin/cms/application.js +27 -0
  24. data/app/assets/javascripts/comfy/admin/cms/base.js +48 -0
  25. data/app/assets/javascripts/comfy/admin/cms/categories.js +17 -0
  26. data/app/assets/javascripts/comfy/admin/cms/codemirror.js +43 -0
  27. data/app/assets/javascripts/comfy/admin/cms/custom.js +1 -0
  28. data/app/assets/javascripts/comfy/admin/cms/diff.js +12 -0
  29. data/app/assets/javascripts/comfy/admin/cms/file_link.js +96 -0
  30. data/app/assets/javascripts/comfy/admin/cms/file_upload.js +229 -0
  31. data/app/assets/javascripts/comfy/admin/cms/files_modal.js +97 -0
  32. data/app/assets/javascripts/comfy/admin/cms/page_fragments.js +22 -0
  33. data/app/assets/javascripts/comfy/admin/cms/slugify.js +34 -0
  34. data/app/assets/javascripts/comfy/admin/cms/sortable_list.js +49 -0
  35. data/app/assets/javascripts/comfy/admin/cms/timepicker.js +38 -0
  36. data/app/assets/javascripts/comfy/admin/cms/wysiwyg.js +91 -0
  37. data/app/assets/javascripts/comfy/vendor/diff/diff_match_patch.min.js +49 -0
  38. data/app/assets/javascripts/comfy/vendor/diff/pretty_text_diff.js +88 -0
  39. data/app/assets/javascripts/comfy/vendor/flatpickr.min.js +2 -0
  40. data/app/assets/javascripts/comfy/vendor/fontawesome.js +5 -0
  41. data/app/assets/javascripts/comfy/vendor/redactor/definedlinks.js +50 -0
  42. data/app/assets/javascripts/comfy/vendor/redactor/filemanager.js +79 -0
  43. data/app/assets/javascripts/comfy/vendor/redactor/i18n/ar.js +76 -0
  44. data/app/assets/javascripts/comfy/vendor/redactor/i18n/az.js +75 -0
  45. data/app/assets/javascripts/comfy/vendor/redactor/i18n/ba.js +79 -0
  46. data/app/assets/javascripts/comfy/vendor/redactor/i18n/bg.js +77 -0
  47. data/app/assets/javascripts/comfy/vendor/redactor/i18n/by.js +77 -0
  48. data/app/assets/javascripts/comfy/vendor/redactor/i18n/ca.js +75 -0
  49. data/app/assets/javascripts/comfy/vendor/redactor/i18n/cs.js +87 -0
  50. data/app/assets/javascripts/comfy/vendor/redactor/i18n/da.js +75 -0
  51. data/app/assets/javascripts/comfy/vendor/redactor/i18n/de.js +80 -0
  52. data/app/assets/javascripts/comfy/vendor/redactor/i18n/el.js +76 -0
  53. data/app/assets/javascripts/comfy/vendor/redactor/i18n/en.js +75 -0
  54. data/app/assets/javascripts/comfy/vendor/redactor/i18n/eo.js +76 -0
  55. data/app/assets/javascripts/comfy/vendor/redactor/i18n/es.js +75 -0
  56. data/app/assets/javascripts/comfy/vendor/redactor/i18n/es_AR.js +76 -0
  57. data/app/assets/javascripts/comfy/vendor/redactor/i18n/fa.js +76 -0
  58. data/app/assets/javascripts/comfy/vendor/redactor/i18n/fi.js +75 -0
  59. data/app/assets/javascripts/comfy/vendor/redactor/i18n/fr.js +75 -0
  60. data/app/assets/javascripts/comfy/vendor/redactor/i18n/ge.js +75 -0
  61. data/app/assets/javascripts/comfy/vendor/redactor/i18n/gr.js +75 -0
  62. data/app/assets/javascripts/comfy/vendor/redactor/i18n/he.js +75 -0
  63. data/app/assets/javascripts/comfy/vendor/redactor/i18n/hr.js +78 -0
  64. data/app/assets/javascripts/comfy/vendor/redactor/i18n/hu.js +77 -0
  65. data/app/assets/javascripts/comfy/vendor/redactor/i18n/id.js +76 -0
  66. data/app/assets/javascripts/comfy/vendor/redactor/i18n/it.js +78 -0
  67. data/app/assets/javascripts/comfy/vendor/redactor/i18n/ja.js +76 -0
  68. data/app/assets/javascripts/comfy/vendor/redactor/i18n/kn.js +75 -0
  69. data/app/assets/javascripts/comfy/vendor/redactor/i18n/ko.js +76 -0
  70. data/app/assets/javascripts/comfy/vendor/redactor/i18n/lt.js +75 -0
  71. data/app/assets/javascripts/comfy/vendor/redactor/i18n/lv.js +75 -0
  72. data/app/assets/javascripts/comfy/vendor/redactor/i18n/mk.js +75 -0
  73. data/app/assets/javascripts/comfy/vendor/redactor/i18n/nb.js +77 -0
  74. data/app/assets/javascripts/comfy/vendor/redactor/i18n/nl.js +80 -0
  75. data/app/assets/javascripts/comfy/vendor/redactor/i18n/pl.js +78 -0
  76. data/app/assets/javascripts/comfy/vendor/redactor/i18n/pt-BR.js +75 -0
  77. data/app/assets/javascripts/comfy/vendor/redactor/i18n/pt.js +75 -0
  78. data/app/assets/javascripts/comfy/vendor/redactor/i18n/ro.js +76 -0
  79. data/app/assets/javascripts/comfy/vendor/redactor/i18n/ru.js +76 -0
  80. data/app/assets/javascripts/comfy/vendor/redactor/i18n/sk.js +76 -0
  81. data/app/assets/javascripts/comfy/vendor/redactor/i18n/sl.js +79 -0
  82. data/app/assets/javascripts/comfy/vendor/redactor/i18n/sq.js +79 -0
  83. data/app/assets/javascripts/comfy/vendor/redactor/i18n/sr-CIR.js +79 -0
  84. data/app/assets/javascripts/comfy/vendor/redactor/i18n/sr-LAT.js +79 -0
  85. data/app/assets/javascripts/comfy/vendor/redactor/i18n/sv.js +74 -0
  86. data/app/assets/javascripts/comfy/vendor/redactor/i18n/th.js +74 -0
  87. data/app/assets/javascripts/comfy/vendor/redactor/i18n/tr.js +75 -0
  88. data/app/assets/javascripts/comfy/vendor/redactor/i18n/ua.js +77 -0
  89. data/app/assets/javascripts/comfy/vendor/redactor/i18n/uk.js +77 -0
  90. data/app/assets/javascripts/comfy/vendor/redactor/i18n/vi.js +74 -0
  91. data/app/assets/javascripts/comfy/vendor/redactor/i18n/zh-CN.js +75 -0
  92. data/app/assets/javascripts/comfy/vendor/redactor/i18n/zh-TW.js +75 -0
  93. data/app/assets/javascripts/comfy/vendor/redactor/imagemanager.js +68 -0
  94. data/app/assets/javascripts/comfy/vendor/redactor/table.js +348 -0
  95. data/app/assets/javascripts/comfy/vendor/redactor/video.js +82 -0
  96. data/app/assets/javascripts/comfy/vendor/redactor.js +9563 -0
  97. data/app/assets/stylesheets/comfy/admin/cms/application.sass +11 -0
  98. data/app/assets/stylesheets/comfy/admin/cms/base.sass +256 -0
  99. data/app/assets/stylesheets/comfy/admin/cms/codemirror_overrides.sass +19 -0
  100. data/app/assets/stylesheets/comfy/admin/cms/custom.sass +1 -0
  101. data/app/assets/stylesheets/comfy/admin/cms/redactor_overrides.sass +22 -0
  102. data/app/assets/stylesheets/comfy/vendor/bootstrap/_alert.scss +51 -0
  103. data/app/assets/stylesheets/comfy/vendor/bootstrap/_badge.scss +54 -0
  104. data/app/assets/stylesheets/comfy/vendor/bootstrap/_breadcrumb.scss +41 -0
  105. data/app/assets/stylesheets/comfy/vendor/bootstrap/_button-group.scss +163 -0
  106. data/app/assets/stylesheets/comfy/vendor/bootstrap/_buttons.scss +137 -0
  107. data/app/assets/stylesheets/comfy/vendor/bootstrap/_card.scss +289 -0
  108. data/app/assets/stylesheets/comfy/vendor/bootstrap/_carousel.scss +197 -0
  109. data/app/assets/stylesheets/comfy/vendor/bootstrap/_close.scss +41 -0
  110. data/app/assets/stylesheets/comfy/vendor/bootstrap/_code.scss +48 -0
  111. data/app/assets/stylesheets/comfy/vendor/bootstrap/_custom-forms.scss +507 -0
  112. data/app/assets/stylesheets/comfy/vendor/bootstrap/_dropdown.scss +191 -0
  113. data/app/assets/stylesheets/comfy/vendor/bootstrap/_forms.scss +330 -0
  114. data/app/assets/stylesheets/comfy/vendor/bootstrap/_functions.scss +86 -0
  115. data/app/assets/stylesheets/comfy/vendor/bootstrap/_grid.scss +52 -0
  116. data/app/assets/stylesheets/comfy/vendor/bootstrap/_images.scss +42 -0
  117. data/app/assets/stylesheets/comfy/vendor/bootstrap/_input-group.scss +193 -0
  118. data/app/assets/stylesheets/comfy/vendor/bootstrap/_jumbotron.scss +17 -0
  119. data/app/assets/stylesheets/comfy/vendor/bootstrap/_list-group.scss +149 -0
  120. data/app/assets/stylesheets/comfy/vendor/bootstrap/_media.scss +8 -0
  121. data/app/assets/stylesheets/comfy/vendor/bootstrap/_mixins.scss +47 -0
  122. data/app/assets/stylesheets/comfy/vendor/bootstrap/_modal.scss +229 -0
  123. data/app/assets/stylesheets/comfy/vendor/bootstrap/_nav.scss +120 -0
  124. data/app/assets/stylesheets/comfy/vendor/bootstrap/_navbar.scss +294 -0
  125. data/app/assets/stylesheets/comfy/vendor/bootstrap/_pagination.scss +73 -0
  126. data/app/assets/stylesheets/comfy/vendor/bootstrap/_popover.scss +171 -0
  127. data/app/assets/stylesheets/comfy/vendor/bootstrap/_print.scss +141 -0
  128. data/app/assets/stylesheets/comfy/vendor/bootstrap/_progress.scss +43 -0
  129. data/app/assets/stylesheets/comfy/vendor/bootstrap/_reboot.scss +483 -0
  130. data/app/assets/stylesheets/comfy/vendor/bootstrap/_root.scss +19 -0
  131. data/app/assets/stylesheets/comfy/vendor/bootstrap/_spinners.scss +55 -0
  132. data/app/assets/stylesheets/comfy/vendor/bootstrap/_tables.scss +185 -0
  133. data/app/assets/stylesheets/comfy/vendor/bootstrap/_toasts.scss +44 -0
  134. data/app/assets/stylesheets/comfy/vendor/bootstrap/_tooltip.scss +115 -0
  135. data/app/assets/stylesheets/comfy/vendor/bootstrap/_transitions.scss +20 -0
  136. data/app/assets/stylesheets/comfy/vendor/bootstrap/_type.scss +125 -0
  137. data/app/assets/stylesheets/comfy/vendor/bootstrap/_utilities.scss +17 -0
  138. data/app/assets/stylesheets/comfy/vendor/bootstrap/_variables.scss +1123 -0
  139. data/app/assets/stylesheets/comfy/vendor/bootstrap/bootstrap-grid.scss +29 -0
  140. data/app/assets/stylesheets/comfy/vendor/bootstrap/bootstrap-reboot.scss +12 -0
  141. data/app/assets/stylesheets/comfy/vendor/bootstrap/bootstrap.scss +44 -0
  142. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_alert.scss +13 -0
  143. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_background-variant.scss +21 -0
  144. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_badge.scss +17 -0
  145. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_border-radius.scss +63 -0
  146. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_box-shadow.scss +20 -0
  147. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_breakpoints.scss +123 -0
  148. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_buttons.scss +107 -0
  149. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_caret.scss +62 -0
  150. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_clearfix.scss +7 -0
  151. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_deprecate.scss +10 -0
  152. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_float.scss +14 -0
  153. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_forms.scss +192 -0
  154. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_gradients.scss +45 -0
  155. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_grid-framework.scss +66 -0
  156. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_grid.scss +51 -0
  157. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_hover.scss +37 -0
  158. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_image.scss +36 -0
  159. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_list-group.scss +21 -0
  160. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_lists.scss +7 -0
  161. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_nav-divider.scss +10 -0
  162. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_pagination.scss +22 -0
  163. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_reset-text.scss +17 -0
  164. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_resize.scss +6 -0
  165. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_screen-reader.scss +33 -0
  166. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_size.scss +7 -0
  167. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_table-row.scss +39 -0
  168. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_text-emphasis.scss +16 -0
  169. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_text-hide.scss +11 -0
  170. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_text-truncate.scss +8 -0
  171. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_transition.scss +16 -0
  172. data/app/assets/stylesheets/comfy/vendor/bootstrap/mixins/_visibility.scss +8 -0
  173. data/app/assets/stylesheets/comfy/vendor/bootstrap/utilities/_align.scss +8 -0
  174. data/app/assets/stylesheets/comfy/vendor/bootstrap/utilities/_background.scss +19 -0
  175. data/app/assets/stylesheets/comfy/vendor/bootstrap/utilities/_borders.scss +75 -0
  176. data/app/assets/stylesheets/comfy/vendor/bootstrap/utilities/_clearfix.scss +3 -0
  177. data/app/assets/stylesheets/comfy/vendor/bootstrap/utilities/_display.scss +26 -0
  178. data/app/assets/stylesheets/comfy/vendor/bootstrap/utilities/_embed.scss +39 -0
  179. data/app/assets/stylesheets/comfy/vendor/bootstrap/utilities/_flex.scss +51 -0
  180. data/app/assets/stylesheets/comfy/vendor/bootstrap/utilities/_float.scss +11 -0
  181. data/app/assets/stylesheets/comfy/vendor/bootstrap/utilities/_overflow.scss +5 -0
  182. data/app/assets/stylesheets/comfy/vendor/bootstrap/utilities/_position.scss +32 -0
  183. data/app/assets/stylesheets/comfy/vendor/bootstrap/utilities/_screenreaders.scss +11 -0
  184. data/app/assets/stylesheets/comfy/vendor/bootstrap/utilities/_shadows.scss +6 -0
  185. data/app/assets/stylesheets/comfy/vendor/bootstrap/utilities/_sizing.scss +20 -0
  186. data/app/assets/stylesheets/comfy/vendor/bootstrap/utilities/_spacing.scss +73 -0
  187. data/app/assets/stylesheets/comfy/vendor/bootstrap/utilities/_stretched-link.scss +19 -0
  188. data/app/assets/stylesheets/comfy/vendor/bootstrap/utilities/_text.scss +72 -0
  189. data/app/assets/stylesheets/comfy/vendor/bootstrap/utilities/_visibility.scss +13 -0
  190. data/app/assets/stylesheets/comfy/vendor/bootstrap/vendor/_rfs.scss +204 -0
  191. data/app/assets/stylesheets/comfy/vendor/fontawesome.css +343 -0
  192. data/app/assets/stylesheets/comfy/vendor/redactor.css +948 -0
  193. data/app/controllers/application_controller.rb +5 -0
  194. data/app/controllers/comfy/admin/base_controller.rb +20 -0
  195. data/app/controllers/comfy/admin/cms/base_controller.rb +54 -0
  196. data/app/controllers/comfy/admin/cms/categories_controller.rb +38 -0
  197. data/app/controllers/comfy/admin/cms/files_controller.rb +140 -0
  198. data/app/controllers/comfy/admin/cms/layouts_controller.rb +69 -0
  199. data/app/controllers/comfy/admin/cms/pages_controller.rb +193 -0
  200. data/app/controllers/comfy/admin/cms/revisions/base_controller.rb +48 -0
  201. data/app/controllers/comfy/admin/cms/revisions/layout_controller.rb +16 -0
  202. data/app/controllers/comfy/admin/cms/revisions/page_controller.rb +28 -0
  203. data/app/controllers/comfy/admin/cms/revisions/snippet_controller.rb +16 -0
  204. data/app/controllers/comfy/admin/cms/revisions/translation_controller.rb +29 -0
  205. data/app/controllers/comfy/admin/cms/sites_controller.rb +68 -0
  206. data/app/controllers/comfy/admin/cms/snippets_controller.rb +66 -0
  207. data/app/controllers/comfy/admin/cms/translations_controller.rb +117 -0
  208. data/app/controllers/comfy/cms/assets_controller.rb +38 -0
  209. data/app/controllers/comfy/cms/base_controller.rb +35 -0
  210. data/app/controllers/comfy/cms/content_controller.rb +90 -0
  211. data/app/controllers/concerns/comfy/paginate.rb +11 -0
  212. data/app/controllers/concerns/comfy/reorder_action.rb +19 -0
  213. data/app/helpers/comfy/admin/cms_helper.rb +50 -0
  214. data/app/helpers/comfy/cms_helper.rb +71 -0
  215. data/app/models/comfy/cms/categorization.rb +23 -0
  216. data/app/models/comfy/cms/category.rb +22 -0
  217. data/app/models/comfy/cms/file.rb +65 -0
  218. data/app/models/comfy/cms/fragment.rb +65 -0
  219. data/app/models/comfy/cms/layout.rb +119 -0
  220. data/app/models/comfy/cms/page.rb +182 -0
  221. data/app/models/comfy/cms/revision.rb +10 -0
  222. data/app/models/comfy/cms/site.rb +93 -0
  223. data/app/models/comfy/cms/snippet.rb +43 -0
  224. data/app/models/comfy/cms/translation.rb +47 -0
  225. data/app/models/concerns/comfy/cms/with_categories.rb +51 -0
  226. data/app/models/concerns/comfy/cms/with_fragments.rb +123 -0
  227. data/app/views/comfy/admin/cms/categories/_categories.html.haml +4 -0
  228. data/app/views/comfy/admin/cms/categories/_edit.html.haml +7 -0
  229. data/app/views/comfy/admin/cms/categories/_form.html.haml +5 -0
  230. data/app/views/comfy/admin/cms/categories/_index.html.haml +28 -0
  231. data/app/views/comfy/admin/cms/categories/_show.html.haml +15 -0
  232. data/app/views/comfy/admin/cms/categories/create.js.erb +7 -0
  233. data/app/views/comfy/admin/cms/categories/destroy.js.erb +8 -0
  234. data/app/views/comfy/admin/cms/categories/edit.js.erb +3 -0
  235. data/app/views/comfy/admin/cms/categories/update.js.erb +6 -0
  236. data/app/views/comfy/admin/cms/files/_file.html.haml +31 -0
  237. data/app/views/comfy/admin/cms/files/_form.html.haml +26 -0
  238. data/app/views/comfy/admin/cms/files/_modal.html.haml +3 -0
  239. data/app/views/comfy/admin/cms/files/destroy.js.erb +4 -0
  240. data/app/views/comfy/admin/cms/files/edit.html.haml +5 -0
  241. data/app/views/comfy/admin/cms/files/index.html.haml +31 -0
  242. data/app/views/comfy/admin/cms/files/new.html.haml +5 -0
  243. data/app/views/comfy/admin/cms/fragments/_form_fragment_attachments.html.haml +23 -0
  244. data/app/views/comfy/admin/cms/fragments/_form_fragments.html.haml +38 -0
  245. data/app/views/comfy/admin/cms/layouts/_form.html.haml +20 -0
  246. data/app/views/comfy/admin/cms/layouts/_index_branch.html.haml +26 -0
  247. data/app/views/comfy/admin/cms/layouts/edit.html.haml +9 -0
  248. data/app/views/comfy/admin/cms/layouts/index.html.haml +10 -0
  249. data/app/views/comfy/admin/cms/layouts/new.html.haml +5 -0
  250. data/app/views/comfy/admin/cms/pages/_form.html.haml +31 -0
  251. data/app/views/comfy/admin/cms/pages/_index_branch.html.haml +44 -0
  252. data/app/views/comfy/admin/cms/pages/edit.html.haml +14 -0
  253. data/app/views/comfy/admin/cms/pages/index.html.haml +13 -0
  254. data/app/views/comfy/admin/cms/pages/new.html.haml +5 -0
  255. data/app/views/comfy/admin/cms/pages/toggle_branch.js.erb +19 -0
  256. data/app/views/comfy/admin/cms/revisions/_sidebar.html.haml +2 -0
  257. data/app/views/comfy/admin/cms/revisions/show.html.haml +36 -0
  258. data/app/views/comfy/admin/cms/sites/_form.html.haml +15 -0
  259. data/app/views/comfy/admin/cms/sites/edit.html.haml +5 -0
  260. data/app/views/comfy/admin/cms/sites/index.html.haml +28 -0
  261. data/app/views/comfy/admin/cms/sites/new.html.haml +5 -0
  262. data/app/views/comfy/admin/cms/snippets/_form.html.haml +19 -0
  263. data/app/views/comfy/admin/cms/snippets/edit.html.haml +9 -0
  264. data/app/views/comfy/admin/cms/snippets/index.html.haml +33 -0
  265. data/app/views/comfy/admin/cms/snippets/new.html.haml +5 -0
  266. data/app/views/comfy/admin/cms/translations/_form.html.haml +20 -0
  267. data/app/views/comfy/admin/cms/translations/_sidebar.html.haml +19 -0
  268. data/app/views/comfy/admin/cms/translations/edit.html.haml +10 -0
  269. data/app/views/comfy/admin/cms/translations/new.html.haml +5 -0
  270. data/app/views/kaminari/comfy/_first_page.html.haml +3 -0
  271. data/app/views/kaminari/comfy/_gap.html.haml +2 -0
  272. data/app/views/kaminari/comfy/_last_page.html.haml +3 -0
  273. data/app/views/kaminari/comfy/_next_page.html.haml +2 -0
  274. data/app/views/kaminari/comfy/_page.html.haml +2 -0
  275. data/app/views/kaminari/comfy/_paginator.html.haml +11 -0
  276. data/app/views/kaminari/comfy/_prev_page.html.haml +2 -0
  277. data/app/views/layouts/comfy/admin/cms/_body.html.haml +14 -0
  278. data/app/views/layouts/comfy/admin/cms/_flash.html.haml +4 -0
  279. data/app/views/layouts/comfy/admin/cms/_footer_js.html.haml +6 -0
  280. data/app/views/layouts/comfy/admin/cms/_head.html.haml +19 -0
  281. data/app/views/layouts/comfy/admin/cms/_left.html.haml +46 -0
  282. data/app/views/layouts/comfy/admin/cms/_right.html.haml +5 -0
  283. data/app/views/layouts/comfy/admin/cms.html.haml +4 -0
  284. data/bin/bundle +3 -0
  285. data/bin/rails +4 -0
  286. data/bin/rake +4 -0
  287. data/bin/setup +36 -0
  288. data/bin/update +31 -0
  289. data/bin/yarn +11 -0
  290. data/comfy_middle_seat.gemspec +35 -0
  291. data/config/application.rb +62 -0
  292. data/config/boot.rb +5 -0
  293. data/config/cable.yml +10 -0
  294. data/config/cms_routes.rb +8 -0
  295. data/config/database.yml +40 -0
  296. data/config/environment.rb +7 -0
  297. data/config/environments/development.rb +81 -0
  298. data/config/environments/production.rb +93 -0
  299. data/config/environments/test.rb +74 -0
  300. data/config/initializers/comfortable_media_surfer.rb +122 -0
  301. data/config/initializers/content_security_policy.rb +27 -0
  302. data/config/initializers/filter_parameter_logging.rb +10 -0
  303. data/config/initializers/inflections.rb +18 -0
  304. data/config/initializers/json.rb +11 -0
  305. data/config/initializers/new_framework_defaults_7_0.rb +144 -0
  306. data/config/initializers/new_framework_defaults_7_1.rb +225 -0
  307. data/config/initializers/permissions_policy.rb +15 -0
  308. data/config/locales/ar.yml +268 -0
  309. data/config/locales/ca.yml +268 -0
  310. data/config/locales/cs.yml +268 -0
  311. data/config/locales/da.yml +268 -0
  312. data/config/locales/de.yml +268 -0
  313. data/config/locales/en.yml +268 -0
  314. data/config/locales/es.yml +268 -0
  315. data/config/locales/fi.yml +268 -0
  316. data/config/locales/fr.yml +268 -0
  317. data/config/locales/gr.yml +268 -0
  318. data/config/locales/hr.yml +268 -0
  319. data/config/locales/it.yml +268 -0
  320. data/config/locales/ja.yml +268 -0
  321. data/config/locales/nb.yml +268 -0
  322. data/config/locales/nl.yml +268 -0
  323. data/config/locales/pl.yml +268 -0
  324. data/config/locales/pt-BR.yml +268 -0
  325. data/config/locales/ru.yml +268 -0
  326. data/config/locales/sk.yml +268 -0
  327. data/config/locales/sv.yml +268 -0
  328. data/config/locales/tr.yml +268 -0
  329. data/config/locales/uk.yml +268 -0
  330. data/config/locales/zh-CN.yml +268 -0
  331. data/config/locales/zh-TW.yml +268 -0
  332. data/config/puma.rb +43 -0
  333. data/config/storage.yml +35 -0
  334. data/config.ru +6 -0
  335. data/db/cms_seeds/sample-site/files/_default.jpg.yml +5 -0
  336. data/db/cms_seeds/sample-site/files/default.jpg +0 -0
  337. data/db/cms_seeds/sample-site/layouts/default/content.html +16 -0
  338. data/db/cms_seeds/sample-site/layouts/default/nested/content.html +14 -0
  339. data/db/cms_seeds/sample-site/pages/index/child_a/content.html +7 -0
  340. data/db/cms_seeds/sample-site/pages/index/child_b/child_a/content.html +6 -0
  341. data/db/cms_seeds/sample-site/pages/index/child_b/content.html +6 -0
  342. data/db/cms_seeds/sample-site/pages/index/cms logo.png +0 -0
  343. data/db/cms_seeds/sample-site/pages/index/content.es.html +6 -0
  344. data/db/cms_seeds/sample-site/pages/index/content.fr.html +6 -0
  345. data/db/cms_seeds/sample-site/pages/index/content.html +25 -0
  346. data/db/cms_seeds/sample-site/pages/index/footer.png +0 -0
  347. data/db/cms_seeds/sample-site/pages/index/header.png +0 -0
  348. data/db/cms_seeds/sample-site/snippets/default.html +8 -0
  349. data/db/migrate/00_create_active_storage_tables.active_storage.rb +50 -0
  350. data/db/migrate/01_create_cms.rb +142 -0
  351. data/db/migrate/02_add_markdown_to_snippets.rb +5 -0
  352. data/gemfiles/7.2.gemfile +36 -0
  353. data/gemfiles/8.0.gemfile +36 -0
  354. data/gemfiles/8.1.gemfile +36 -0
  355. data/lib/comfortable_media_surfer/access_control/admin_authentication.rb +22 -0
  356. data/lib/comfortable_media_surfer/access_control/admin_authorization.rb +10 -0
  357. data/lib/comfortable_media_surfer/access_control/public_authentication.rb +10 -0
  358. data/lib/comfortable_media_surfer/access_control/public_authorization.rb +10 -0
  359. data/lib/comfortable_media_surfer/configuration.rb +138 -0
  360. data/lib/comfortable_media_surfer/content/block.rb +12 -0
  361. data/lib/comfortable_media_surfer/content/params_parser.rb +149 -0
  362. data/lib/comfortable_media_surfer/content/renderer.rb +146 -0
  363. data/lib/comfortable_media_surfer/content/tag.rb +48 -0
  364. data/lib/comfortable_media_surfer/content/tags/asset.rb +57 -0
  365. data/lib/comfortable_media_surfer/content/tags/audio.rb +39 -0
  366. data/lib/comfortable_media_surfer/content/tags/breadcrumbs.rb +43 -0
  367. data/lib/comfortable_media_surfer/content/tags/checkbox.rb +27 -0
  368. data/lib/comfortable_media_surfer/content/tags/children.rb +52 -0
  369. data/lib/comfortable_media_surfer/content/tags/date.rb +19 -0
  370. data/lib/comfortable_media_surfer/content/tags/datetime.rb +42 -0
  371. data/lib/comfortable_media_surfer/content/tags/file.rb +70 -0
  372. data/lib/comfortable_media_surfer/content/tags/file_link.rb +58 -0
  373. data/lib/comfortable_media_surfer/content/tags/files.rb +41 -0
  374. data/lib/comfortable_media_surfer/content/tags/fragment.rb +64 -0
  375. data/lib/comfortable_media_surfer/content/tags/helper.rb +53 -0
  376. data/lib/comfortable_media_surfer/content/tags/image.rb +56 -0
  377. data/lib/comfortable_media_surfer/content/tags/markdown.rb +22 -0
  378. data/lib/comfortable_media_surfer/content/tags/mixins/file_content.rb +42 -0
  379. data/lib/comfortable_media_surfer/content/tags/number.rb +18 -0
  380. data/lib/comfortable_media_surfer/content/tags/page_file_link.rb +86 -0
  381. data/lib/comfortable_media_surfer/content/tags/partial.rb +47 -0
  382. data/lib/comfortable_media_surfer/content/tags/siblings.rb +66 -0
  383. data/lib/comfortable_media_surfer/content/tags/snippet.rb +36 -0
  384. data/lib/comfortable_media_surfer/content/tags/template.rb +42 -0
  385. data/lib/comfortable_media_surfer/content/tags/text.rb +18 -0
  386. data/lib/comfortable_media_surfer/content/tags/textarea.rb +19 -0
  387. data/lib/comfortable_media_surfer/content/tags/wysiwyg.rb +19 -0
  388. data/lib/comfortable_media_surfer/content/tags.rb +29 -0
  389. data/lib/comfortable_media_surfer/content.rb +11 -0
  390. data/lib/comfortable_media_surfer/engine.rb +24 -0
  391. data/lib/comfortable_media_surfer/error.rb +24 -0
  392. data/lib/comfortable_media_surfer/extensions/acts_as_tree.rb +114 -0
  393. data/lib/comfortable_media_surfer/extensions/has_revisions.rb +68 -0
  394. data/lib/comfortable_media_surfer/extensions.rb +8 -0
  395. data/lib/comfortable_media_surfer/form_builder.rb +43 -0
  396. data/lib/comfortable_media_surfer/render_methods.rb +106 -0
  397. data/lib/comfortable_media_surfer/routing.rb +87 -0
  398. data/lib/comfortable_media_surfer/seeds/file/exporter.rb +37 -0
  399. data/lib/comfortable_media_surfer/seeds/file/importer.rb +55 -0
  400. data/lib/comfortable_media_surfer/seeds/layout/exporter.rb +38 -0
  401. data/lib/comfortable_media_surfer/seeds/layout/importer.rb +60 -0
  402. data/lib/comfortable_media_surfer/seeds/page/exporter.rb +88 -0
  403. data/lib/comfortable_media_surfer/seeds/page/importer.rb +245 -0
  404. data/lib/comfortable_media_surfer/seeds/snippet/exporter.rb +32 -0
  405. data/lib/comfortable_media_surfer/seeds/snippet/importer.rb +47 -0
  406. data/lib/comfortable_media_surfer/seeds.rb +110 -0
  407. data/lib/comfortable_media_surfer/version.rb +3 -0
  408. data/lib/comfortable_media_surfer/view_hooks.rb +33 -0
  409. data/lib/comfortable_media_surfer.rb +56 -0
  410. data/lib/comfy_middle_seat/version.rb +5 -0
  411. data/lib/comfy_middle_seat.rb +3 -0
  412. data/lib/generators/comfy/cms/README +21 -0
  413. data/lib/generators/comfy/cms/assets_generator.rb +16 -0
  414. data/lib/generators/comfy/cms/cms_generator.rb +69 -0
  415. data/lib/generators/comfy/cms/controllers_generator.rb +15 -0
  416. data/lib/generators/comfy/cms/models_generator.rb +15 -0
  417. data/lib/generators/comfy/cms/views_generator.rb +15 -0
  418. data/lib/generators/comfy/scaffold/scaffold_generator.rb +79 -0
  419. data/lib/generators/comfy/scaffold/templates/controller.rb.tt +62 -0
  420. data/lib/generators/comfy/scaffold/templates/migration.rb.tt +11 -0
  421. data/lib/generators/comfy/scaffold/templates/model.rb.tt +21 -0
  422. data/lib/generators/comfy/scaffold/templates/tests/controller.rb.tt +115 -0
  423. data/lib/generators/comfy/scaffold/templates/tests/fixture.yml.tt +4 -0
  424. data/lib/generators/comfy/scaffold/templates/tests/model.rb.tt +26 -0
  425. data/lib/generators/comfy/scaffold/templates/views/_form.haml.tt +7 -0
  426. data/lib/generators/comfy/scaffold/templates/views/edit.haml.tt +5 -0
  427. data/lib/generators/comfy/scaffold/templates/views/index.haml.tt +21 -0
  428. data/lib/generators/comfy/scaffold/templates/views/new.haml.tt +5 -0
  429. data/lib/generators/comfy/scaffold/templates/views/show.haml.tt +4 -0
  430. data/lib/tasks/cms_assets.rake +19 -0
  431. data/lib/tasks/cms_seeds.rake +40 -0
  432. data/package-lock.json +989 -0
  433. data/package.json +23 -0
  434. data/public/favicon.ico +0 -0
  435. data/rakelib/create_release.rake +82 -0
  436. metadata +665 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 385ae2594717984eee4d7a568cb9bde9443f709965748fe601812be607f13dea
4
+ data.tar.gz: 879f3f1d267b529b30ad012d57c61bfbd64e4cb877b062b44e022eac015502de
5
+ SHA512:
6
+ metadata.gz: 430cebb413df49b32fb311c6a7bc1462ea52cf5c7056f7c35c6c24ad4ff9740f3344f35a860eb2eb0d3d94671c5385d82be0d916e6ac7309df974e2897d74aa6
7
+ data.tar.gz: 7ea323b71050068057948cde56b61fc0ae986d3235a9ef990fd0e01feae6390f7f73ea29bf8533bfe806e88999773faa310cd354d1582eb5e949f82df55f1f37
data/.codeclimate.yml ADDED
@@ -0,0 +1,4 @@
1
+ exclude_paths:
2
+ - app/assets/javascripts/comfy/vendor/*
3
+ - app/assets/stylesheets/comfy/vendor/*
4
+ - db/*
data/.gitattributes ADDED
@@ -0,0 +1,3 @@
1
+ app/assets/javascripts/comfy/vendor/* linguist-vendored
2
+ app/assets/stylesheets/comfy/vendor/* linguist-vendored
3
+ app/assets/builds/* linguist-generated
@@ -0,0 +1,7 @@
1
+ version: 2
2
+ updates:
3
+ # Enable version updates for npm
4
+ - package-ecosystem: "bundler"
5
+ directory: "/" # The root directory where your Gemfile is located
6
+ schedule:
7
+ interval: "monthly" # Options: "daily", "weekly", "monthly"
@@ -0,0 +1,19 @@
1
+ ### Expected behavior
2
+ Tell us what should happen
3
+
4
+ ### Actual behavior
5
+ Tell us what does happen
6
+
7
+ ### Steps to reproduce
8
+ Things that help:
9
+
10
+ * Describe the issue in detail.
11
+ * Add relevant code snippets.
12
+ * Create a failing test case.
13
+
14
+ ### System configuration
15
+ **Rails version**:
16
+
17
+ **CMS version**:
18
+
19
+ **Ruby version**:
@@ -0,0 +1,6 @@
1
+ ### Summary
2
+
3
+ General information about what this PR is all about. If it fixes any issues
4
+ please don't forget to tag them.
5
+
6
+ Thanks for contributing!
@@ -0,0 +1,46 @@
1
+ name: Claude Code Review
2
+
3
+ on:
4
+ pull_request:
5
+ types: [opened, synchronize, ready_for_review, reopened]
6
+
7
+ jobs:
8
+ claude-review:
9
+ runs-on: ubuntu-latest
10
+ permissions:
11
+ contents: read
12
+ pull-requests: write
13
+ issues: write
14
+ id-token: write
15
+
16
+ steps:
17
+ - name: Checkout repository
18
+ uses: actions/checkout@v6
19
+ with:
20
+ fetch-depth: 1
21
+
22
+ - name: Run Claude Code Review
23
+ id: claude-review
24
+ uses: anthropics/claude-code-action@v1
25
+ env:
26
+ CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
27
+ with:
28
+ claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
29
+ prompt: |
30
+ REPO: ${{ github.repository }}
31
+ PR NUMBER: ${{ github.event.pull_request.number }}
32
+
33
+ Please review this pull request with a focus on:
34
+ - Code quality and best practices
35
+ - Potential bugs or issues
36
+ - Security implications
37
+ - Performance considerations
38
+
39
+ Note: The PR branch is already checked out in the current working directory.
40
+
41
+ Use `gh pr comment` for top-level feedback.
42
+ Use `mcp__github_inline_comment__create_inline_comment` to highlight specific code issues.
43
+ Only post GitHub comments - don't submit review text as messages.
44
+
45
+ claude_args: |
46
+ --allowedTools "mcp__github_inline_comment__create_inline_comment,Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*)"
@@ -0,0 +1,148 @@
1
+ name: Claude Code
2
+
3
+ on:
4
+ issue_comment:
5
+ types: [created]
6
+ pull_request_review_comment:
7
+ types: [created]
8
+ issues:
9
+ types: [opened, assigned]
10
+ pull_request_review:
11
+ types: [submitted]
12
+
13
+ jobs:
14
+ authorize_claude_actor:
15
+ if: |
16
+ (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
17
+ (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
18
+ (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
19
+ (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
20
+ runs-on: ubuntu-latest
21
+ permissions:
22
+ contents: read
23
+ outputs:
24
+ authorized: ${{ steps.permission-gate.outputs.authorized }}
25
+ steps:
26
+ - name: Verify actor can run Claude
27
+ id: permission-gate
28
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9
29
+ with:
30
+ script: |
31
+ const owner = context.repo.owner;
32
+ const repo = context.repo.repo;
33
+ const permissionByLogin = new Map();
34
+
35
+ function claudeRequester() {
36
+ if (
37
+ context.eventName === 'issue_comment' ||
38
+ context.eventName === 'pull_request_review_comment'
39
+ ) {
40
+ return context.payload.comment?.user?.login;
41
+ }
42
+
43
+ if (context.eventName === 'pull_request_review') {
44
+ return context.payload.review?.user?.login;
45
+ }
46
+
47
+ if (context.eventName === 'issues') {
48
+ return context.payload.issue?.user?.login;
49
+ }
50
+
51
+ return null;
52
+ }
53
+
54
+ async function hasWriteAccessFor(username) {
55
+ if (!username) {
56
+ return false;
57
+ }
58
+
59
+ if (permissionByLogin.has(username)) {
60
+ return permissionByLogin.get(username);
61
+ }
62
+
63
+ let hasWriteAccess = false;
64
+ try {
65
+ const { data: permission } = await github.rest.repos.getCollaboratorPermissionLevel({
66
+ owner,
67
+ repo,
68
+ username
69
+ });
70
+ hasWriteAccess = ['admin', 'write'].includes(permission.permission);
71
+ } catch (error) {
72
+ core.warning(
73
+ `Unable to verify ${username} write permission for Claude; ` +
74
+ `treating the Claude request as untrusted: ${error.message || error}`
75
+ );
76
+ }
77
+
78
+ permissionByLogin.set(username, hasWriteAccess);
79
+ return hasWriteAccess;
80
+ }
81
+
82
+ const actor = context.actor;
83
+ const requester = claudeRequester();
84
+
85
+ if (!requester) {
86
+ core.setOutput('authorized', 'false');
87
+ core.setFailed('Unable to run Claude because the requester could not be determined.');
88
+ return;
89
+ }
90
+
91
+ if (!(await hasWriteAccessFor(actor))) {
92
+ core.setOutput('authorized', 'false');
93
+ core.setFailed(`Unable to run Claude because ${actor} does not have write/admin repository permission.`);
94
+ return;
95
+ }
96
+
97
+ if (!(await hasWriteAccessFor(requester))) {
98
+ core.setOutput('authorized', 'false');
99
+ core.setFailed(
100
+ `Unable to run Claude because requester ${requester} does not have write/admin repository permission.`
101
+ );
102
+ return;
103
+ }
104
+
105
+ core.setOutput('authorized', 'true');
106
+ core.info(`Authorized ${actor} and Claude requester ${requester} to run Claude.`);
107
+
108
+ claude:
109
+ needs: authorize_claude_actor
110
+ if: needs.authorize_claude_actor.outputs.authorized == 'true'
111
+ runs-on: ubuntu-latest
112
+ permissions:
113
+ contents: read
114
+ pull-requests: read
115
+ issues: read
116
+ id-token: write
117
+ actions: read # Required for Claude to read CI results on PRs
118
+ checks: read
119
+ statuses: read
120
+ steps:
121
+ - name: Checkout repository
122
+ uses: actions/checkout@v4
123
+ with:
124
+ fetch-depth: 1
125
+
126
+ - name: Run Claude Code
127
+ id: claude
128
+ uses: anthropics/claude-code-action@v1
129
+ env:
130
+ CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
131
+ with:
132
+ github_token: ${{ github.token }}
133
+ claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
134
+
135
+ # This is an optional setting that allows Claude to read CI results on PRs
136
+ additional_permissions: |
137
+ actions: read
138
+ checks: read
139
+ statuses: read
140
+
141
+ # Optional: Give a custom prompt to Claude. If this is not specified, Claude will perform the instructions specified in the comment that tagged it.
142
+ # prompt: 'Update the pull request description to include a summary of changes.'
143
+
144
+ # Optional: Add claude_args to customize behavior and configuration
145
+ # See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md
146
+ # or https://code.claude.com/docs/en/cli-reference for available options
147
+ # claude_args: '--allowed-tools Bash(gh pr:*)'
148
+
@@ -0,0 +1,53 @@
1
+ name: "Coveralls"
2
+ on:
3
+ push:
4
+ branches:
5
+ - main
6
+ - master
7
+ pull_request:
8
+
9
+ jobs:
10
+ coveralls:
11
+ strategy:
12
+ matrix:
13
+ ruby-version:
14
+ - "3.4"
15
+ rails-version:
16
+ - "8.1"
17
+ continue-on-error: [true]
18
+ name: ${{ format('Coverage (Ruby {0}, Rails {1})', matrix.ruby-version, matrix.rails-version) }}
19
+ runs-on: ubuntu-latest
20
+ continue-on-error: ${{ matrix.continue-on-error }}
21
+ env:
22
+ BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.rails-version }}.gemfile
23
+ RAILS_ENV: test
24
+ COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }}
25
+
26
+ steps:
27
+ - name: Checkout source
28
+ uses: actions/checkout@v2
29
+
30
+ - name: Install Node.js
31
+ uses: actions/setup-node@v4
32
+ with:
33
+ cache: npm
34
+ - run: npm ci
35
+
36
+ - name: Install Ruby ${{ matrix.ruby-version }}
37
+ uses: ruby/setup-ruby@v1
38
+ with:
39
+ ruby-version: ${{ matrix.ruby-version }}
40
+ bundler-cache: true
41
+
42
+ - name: Update CMS gem
43
+ run: bundle update comfy_middle_seat
44
+
45
+ - name: Compile assets
46
+ run: bin/bundle exec rails comfy:compile_assets
47
+
48
+ - name: Run tests, report coverage
49
+ run: |
50
+ bin/bundle exec rails db:drop
51
+ bin/bundle exec rails db:create
52
+ bin/bundle exec rails db:migrate
53
+ bin/bundle exec rake test:serial
@@ -0,0 +1,94 @@
1
+ name: "Rails CI"
2
+ on:
3
+ push:
4
+ branches:
5
+ - main
6
+ - master
7
+ pull_request:
8
+
9
+ jobs:
10
+ build_test_lint_audit:
11
+ strategy:
12
+ matrix:
13
+ ruby-version:
14
+ - "3.3"
15
+ - "3.4"
16
+ - "4.0"
17
+ rails-version:
18
+ - "7.2"
19
+ - "8.0"
20
+ - "8.1"
21
+ name: ${{ format('Tests (Ruby {0}, Rails {1})', matrix.ruby-version, matrix.rails-version) }}
22
+ runs-on: ubuntu-latest
23
+ env:
24
+ BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.rails-version }}.gemfile
25
+ RAILS_ENV: test
26
+ SKIP_COV: true
27
+ steps:
28
+ - name: Checkout source
29
+ uses: actions/checkout@v2
30
+
31
+ - name: Install Node.js
32
+ uses: actions/setup-node@v4
33
+ with:
34
+ cache: npm
35
+ - run: npm ci
36
+
37
+ - name: Install Ruby ${{ matrix.ruby-version }}
38
+ uses: ruby/setup-ruby@v1
39
+ with:
40
+ ruby-version: ${{ matrix.ruby-version }}
41
+ bundler-cache: true
42
+
43
+ - name: Update CMS gem
44
+ run: bundle update comfy_middle_seat
45
+
46
+ - name: Compile assets
47
+ run: bin/bundle exec rails comfy:compile_assets
48
+
49
+ - name: Run tests
50
+ run: |
51
+ bin/bundle exec rails db:drop
52
+ bin/bundle exec rails db:create
53
+ bin/bundle exec rails db:migrate
54
+ bin/bundle exec rake test
55
+
56
+ - name: Lint the code
57
+ run: bin/bundle exec rubocop --parallel
58
+
59
+ - name: Audit for security
60
+ run: |
61
+ bin/bundle exec brakeman -q -w3
62
+ bin/bundle exec bundler-audit --update --gemfile-lock gemfiles/${{ matrix.rails-version }}.gemfile.lock
63
+
64
+ system_tests:
65
+ name: System tests (Ruby 4.0, Rails 8.1)
66
+ runs-on: ubuntu-latest
67
+ env:
68
+ BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/8.1.gemfile
69
+ RAILS_ENV: test
70
+ SKIP_COV: true
71
+ steps:
72
+ - name: Checkout source
73
+ uses: actions/checkout@v4
74
+
75
+ - name: Install Node.js
76
+ uses: actions/setup-node@v4
77
+ with:
78
+ cache: npm
79
+ - run: npm ci
80
+
81
+ - name: Install Ruby 4.0
82
+ uses: ruby/setup-ruby@v1
83
+ with:
84
+ ruby-version: "4.0"
85
+ bundler-cache: true
86
+
87
+ - name: Compile assets
88
+ run: npm run build && npm run build:css
89
+
90
+ - name: Prepare database
91
+ run: bin/bundle exec rails db:prepare
92
+
93
+ - name: Run system tests
94
+ run: bin/bundle exec rake test:system
data/.gitignore ADDED
@@ -0,0 +1,25 @@
1
+ .bundle
2
+ db/*.sqlite3*
3
+ log/*
4
+ tmp/**/*
5
+ .DS_Store
6
+ db/schema.rb
7
+ db/development_structure.sql
8
+ db/test.sqlite3-journal
9
+ pkg
10
+ rdoc
11
+ /tmp
12
+ public/system/
13
+ Gemfile.lock
14
+ .rvmrc
15
+ .ruby-version
16
+ .ruby-gemset
17
+ /.sass-cache
18
+ coverage/
19
+ /storage
20
+ db/cms_fixtures/test-site/
21
+ .idea
22
+
23
+ /node_modules
24
+ /app/assets/builds/*
25
+ !/app/assets/builds/.keep
data/.rubocop.yml ADDED
@@ -0,0 +1,82 @@
1
+ require:
2
+ # - rubocop-rails
3
+ # - rubocop-minitest
4
+
5
+ AllCops:
6
+ TargetRubyVersion: 3.2
7
+ NewCops: enable
8
+ SuggestExtensions: false
9
+ Exclude:
10
+ - bin/*
11
+ - db/schema.rb
12
+ - db/migrate/**/*
13
+ - test/fixtures/**/*
14
+ - tmp/**/*
15
+ - vendor/bundle/**/*
16
+
17
+ # -- Layout --------------------------------------------------------------------
18
+ Layout/FirstArrayElementIndentation:
19
+ EnforcedStyle: consistent
20
+
21
+ Layout/LineLength:
22
+ Max: 148
23
+
24
+ Layout/MultilineMethodCallIndentation:
25
+ EnforcedStyle: indented
26
+
27
+ Layout/AccessModifierIndentation:
28
+ EnforcedStyle: outdent
29
+
30
+ # -- Metrics -------------------------------------------------------------------
31
+ Metrics/AbcSize:
32
+ Enabled: false
33
+
34
+ Metrics/BlockLength:
35
+ Max: 45
36
+
37
+ Metrics/ClassLength:
38
+ Enabled: false
39
+
40
+ Metrics/CyclomaticComplexity:
41
+ Max: 12
42
+
43
+ Metrics/MethodLength:
44
+ Enabled: false
45
+
46
+ Metrics/PerceivedComplexity:
47
+ Max: 15
48
+
49
+ # -- Naming --------------------------------------------------------------------
50
+ Naming/MethodParameterName:
51
+ Enabled: false
52
+
53
+ Naming/PredicateMethod:
54
+ Enabled: false
55
+
56
+ # -- Style ---------------------------------------------------------------------
57
+ Style/ClassAndModuleChildren:
58
+ Enabled: false
59
+
60
+ Style/Documentation:
61
+ Enabled: false
62
+
63
+ Style/DocumentDynamicEvalDefinition:
64
+ Enabled: false
65
+
66
+ Style/HashSyntax:
67
+ Enabled: false
68
+
69
+ Style/IfUnlessModifier:
70
+ Enabled: false
71
+
72
+ Style/Lambda:
73
+ EnforcedStyle: literal
74
+
75
+ Style/OptionalBooleanParameter:
76
+ Enabled: false
77
+
78
+ Style/SafeNavigation:
79
+ Enabled: false
80
+
81
+ Style/RegexpLiteral:
82
+ EnforcedStyle: percent_r
data/.travis.yml ADDED
@@ -0,0 +1,44 @@
1
+ dist: xenial
2
+ services:
3
+ - xvfb
4
+ addons:
5
+ sources:
6
+ - google-chrome
7
+ apt:
8
+ packages:
9
+ - google-chrome-stable
10
+
11
+ language: ruby
12
+ rvm:
13
+ - 2.3.8
14
+ - 2.4.9
15
+ - 2.5.7
16
+ - 2.6.5
17
+ gemfile:
18
+ - test/gemfiles/5.2.gemfile
19
+ jobs:
20
+ include:
21
+ - rvm: 2.5.7
22
+ gemfile: test/gemfiles/6.0.gemfile
23
+ - rvm: 2.6.5
24
+ gemfile: test/gemfiles/6.0.gemfile
25
+ branches:
26
+ only:
27
+ - master
28
+ before_install:
29
+ - gem update --system
30
+ - gem update bundler
31
+ before_script:
32
+ - wget http://chromedriver.storage.googleapis.com/2.36/chromedriver_linux64.zip
33
+ - unzip chromedriver_linux64.zip
34
+ - sudo apt-get install libnss3
35
+ - sudo apt-get --only-upgrade install google-chrome-stable
36
+ - sudo cp chromedriver /usr/local/bin/.
37
+ - sudo chmod +x /usr/local/bin/chromedriver
38
+ - export DISPLAY=:99.0
39
+ - sleep 3
40
+ script:
41
+ - bundle exec rake db:migrate
42
+ - bundle exec rake test
43
+ - SKIP_COV=true bundle exec rake test:system
44
+ - bundle exec rubocop
data/CHANGELOG.md ADDED
@@ -0,0 +1,147 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project's source code will be documented in this file. Items under `Unreleased` are upcoming features that will be out in the next version.
4
+
5
+ ## Contributors
6
+
7
+ Please follow the recommendations outlined at [keepachangelog.com](https://keepachangelog.com). Please use the existing headings and styling as a guide, and add a link for the version diff at the bottom of the file. Also, please update the `Unreleased` link to compare it to the latest release version.
8
+
9
+ For all changes prior to the inception of this project, see the [Release History](https://github.com/comfy/comfortable-mexican-sofa/releases) of ComfortableMexicanSofa.
10
+
11
+ ## Versions
12
+
13
+ ## [Unreleased]
14
+
15
+ ## [v3.1.7] - 2026-02-20
16
+
17
+ ### Fixed
18
+
19
+ - Fix wrong number of arguments for `to_s` in date tags from [PR 58](https://github.com/shakacode/comfortable-media-surfer/pull/58)
20
+
21
+ ### Changed
22
+
23
+ - Update rubocop requirement from ~> 1.81.1 to ~> 1.84.0
24
+
25
+ ## [v3.1.6] - 2026-02-19
26
+
27
+ ### Added
28
+
29
+ - Claude code workflow
30
+
31
+ ### Fixed
32
+
33
+ - problem creating root/home page from [P5 45](https://github.com/shakacode/comfortable-media-surfer/pull/45)
34
+
35
+ ## [v3.1.5] - 2026-01-08
36
+
37
+ ### Added
38
+
39
+ - Rails 8.1 compatibility
40
+
41
+ ### Fixed
42
+
43
+ - Strip possible spaces around exclude page slugs, from [PR 42](https://github.com/shakacode/comfortable-media-surfer/pull/42)
44
+
45
+ ### Changed
46
+
47
+ - gem updates for propshaft, brakeman, rubocop, haml-rails
48
+
49
+ ## [v3.1.4] - 2025-07-14
50
+
51
+ ### Fixed
52
+
53
+ - removed obsolete JQuery reference
54
+
55
+ ### Changed
56
+
57
+ - updated gem versions
58
+ - update README for migration from Occams
59
+
60
+ ## [v3.1.3] - 2025-05-29
61
+
62
+ ### Fixed
63
+
64
+ - Fixed file descriptor leak during seeds import
65
+ - Fixed ‘Deep nesting of tags’ error for pages containing more than MAX_DEPTH tags
66
+ - Fixed importing pages with the same slug but different parents
67
+
68
+ ## [v3.1.2] - 2025-05-26
69
+
70
+ ### Fixed
71
+
72
+ - Fixed Expand/Collapse error in Admin/Pages.
73
+ - Include sassc-rails to gemspec, since it is deprecated after rails 7.0.8
74
+ - Update documentation to reflect recent changes
75
+
76
+ ### Added
77
+
78
+ - added migration for Markdown snippets
79
+
80
+ ## [v3.1.1] - 2025-02-08
81
+
82
+ ### Fixed
83
+
84
+ - Fixed scss: use scss imports, not css ones that cannot be resolved by the browser
85
+
86
+ ### Added
87
+
88
+ - Added rake task to compile assets, corresponding post install message
89
+ - Added import Rails from UJS
90
+ - Added missing jQuery import
91
+
92
+ ### Removed
93
+
94
+ - Removed yarn, as not needed
95
+
96
+ ## [v3.1.0] - 2024-12-31 (gem yanked, pending resolution of [Issue 8](https://github.com/shakacode/comfortable-media-surfer/issues/8)
97
+
98
+ ### Added
99
+
100
+ - Added compatibility and support for Rails 8
101
+ - Added compatibility and support for propshaft (sprockets is still supported) - installing the gem now requires NodeJS to be installed. In addition, the `comfy:compile_assets` task needs to be run after installing the gem.
102
+
103
+ ### Removed
104
+
105
+ - Removed sassc sprockets
106
+ - Rails 6.x compatibility dropped, since it is not being maintained as of October 2024
107
+
108
+ ### Changed
109
+
110
+ - Updated README links to point to the Surfer wiki
111
+
112
+ ## [v3.0.0] - 2024-11-30
113
+
114
+ First release of `comfortable_media_surfer`. This new gem is a revival of [ComfortableMexicanSofa](https://github.com/comfy/comfortable-mexican-sofa) which had been dormant for nearly 5 years.
115
+
116
+ ### Fixed
117
+
118
+ - Fixed all broken tests to now pass on Rails 6.x and 7.x
119
+ - Code syntax per Rubocop linting
120
+
121
+ ### Added
122
+
123
+ - Rails 7 compatibility, including many config and code changes. See the [PR](https://github.com/shakacode/comfortable-media-surfer/pull/1/files) for full details
124
+ - Added github actions workflows for CI build and test coverage
125
+ - Added CMS tags for navigation: children, siblings, breadcrumbs, with tests
126
+ - Added CMS tag for embedded audio, with tests
127
+ - Added CMS tag for image, with tests
128
+ - Added ability to write CMS snippets in Markdown, with tests
129
+
130
+ ### Removed
131
+
132
+ - Rails 5 compatibility dropped, as it is EOL
133
+
134
+ ### Changed
135
+
136
+ - Rebranded **ComfortableMexicanSofa** as **ComfortableMediaSurfer** in order to publish new gem (database table names and schema have not changed).
137
+
138
+ [Unreleased]: https://github.com/shakacode/comfortable-media-surfer/compare/v3.1.7...master
139
+ [v3.1.7]: https://github.com/shakacode/comfortable-media-surfer/compare/v3.1.6...v3.1.7
140
+ [v3.1.6]: https://github.com/shakacode/comfortable-media-surfer/compare/v3.1.5...v3.1.6
141
+ [v3.1.5]: https://github.com/shakacode/comfortable-media-surfer/compare/v3.1.4...v3.1.5
142
+ [v3.1.4]: https://github.com/shakacode/comfortable-media-surfer/compare/v3.1.3...v3.1.4
143
+ [v3.1.3]: https://github.com/shakacode/comfortable-media-surfer/compare/v3.1.2...v3.1.3
144
+ [v3.1.2]: https://github.com/shakacode/comfortable-media-surfer/compare/v3.1.1...v3.1.2
145
+ [v3.1.1]: https://github.com/shakacode/comfortable-media-surfer/compare/v3.1.0...v3.1.1
146
+ [v3.1.0]: https://github.com/shakacode/comfortable-media-surfer/compare/v3.0.0...v3.1.0
147
+ [v3.0.0]: https://github.com/shakacode/comfortable-media-surfer/compare/v2.0.19...v3.0.0