comfortable_mexican_sofa 1.12.11 → 2.0.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 (490) hide show
  1. checksums.yaml +5 -5
  2. data/.codeclimate.yml +4 -0
  3. data/.gitattributes +2 -0
  4. data/.github/issue_template.md +22 -0
  5. data/.github/pull_request_template.md +6 -0
  6. data/.gitignore +3 -0
  7. data/.rubocop.yml +5 -0
  8. data/.rubocop_todo.yml +974 -0
  9. data/.travis.yml +2 -10
  10. data/Gemfile +5 -7
  11. data/README.md +40 -39
  12. data/Rakefile +1 -31
  13. data/app/assets/javascripts/comfy/admin/cms/application.js.coffee +7 -4
  14. data/app/assets/javascripts/comfy/admin/cms/base.js.coffee +23 -33
  15. data/app/assets/javascripts/comfy/admin/cms/lib/diff/pretty_text_diff.js +76 -0
  16. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr.min.js +2 -0
  17. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/ar.js +52 -0
  18. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/bg.js +65 -0
  19. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/bn.js +65 -0
  20. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/cat.js +83 -0
  21. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/cs.js +70 -0
  22. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/cy.js +92 -0
  23. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/da.js +71 -0
  24. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/de.js +70 -0
  25. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/default.js +80 -0
  26. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/eo.js +73 -0
  27. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/es.js +69 -0
  28. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/et.js +73 -0
  29. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/fa.js +68 -0
  30. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/fi.js +69 -0
  31. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/fr.js +75 -0
  32. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/gr.js +74 -0
  33. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/he.js +57 -0
  34. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/hi.js +65 -0
  35. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/hr.js +66 -0
  36. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/hu.js +72 -0
  37. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/id.js +61 -0
  38. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/it.js +70 -0
  39. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/ja.js +57 -0
  40. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/ko.js +60 -0
  41. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/lt.js +72 -0
  42. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/lv.js +67 -0
  43. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/mk.js +69 -0
  44. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/mn.js +67 -0
  45. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/ms.js +68 -0
  46. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/my.js +69 -0
  47. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/nl.js +75 -0
  48. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/no.js +73 -0
  49. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/pa.js +65 -0
  50. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/pl.js +68 -0
  51. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/pt-BR.js +66 -0
  52. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/pt.js +66 -0
  53. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/ro.js +69 -0
  54. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/ru.js +66 -0
  55. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/si.js +65 -0
  56. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/sk.js +70 -0
  57. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/sl.js +70 -0
  58. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/sq.js +65 -0
  59. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/sr.js +69 -0
  60. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/sv.js +70 -0
  61. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/th.js +72 -0
  62. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/tr.js +66 -0
  63. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/uk.js +66 -0
  64. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/vn.js +66 -0
  65. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/zh-CN.js +61 -0
  66. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/zh-TW.js +61 -0
  67. data/app/assets/javascripts/comfy/admin/cms/lib/redactor.js +9 -3
  68. data/app/assets/javascripts/comfy/admin/cms/uploader.js.coffee +9 -10
  69. data/app/assets/stylesheets/comfy/admin/cms/application.sass +4 -4
  70. data/app/assets/stylesheets/comfy/admin/cms/base.sass +215 -338
  71. data/app/assets/stylesheets/comfy/admin/cms/lib/flatpickr.min.css +13 -0
  72. data/app/assets/stylesheets/comfy/admin/cms/redactor_overrides.sass +2 -2
  73. data/app/controllers/comfy/admin/base_controller.rb +20 -0
  74. data/app/controllers/comfy/admin/cms/base_controller.rb +9 -22
  75. data/app/controllers/comfy/admin/cms/categories_controller.rb +2 -3
  76. data/app/controllers/comfy/admin/cms/files_controller.rb +50 -31
  77. data/app/controllers/comfy/admin/cms/layouts_controller.rb +12 -13
  78. data/app/controllers/comfy/admin/cms/pages_controller.rb +28 -28
  79. data/app/controllers/comfy/admin/cms/revisions_controller.rb +23 -14
  80. data/app/controllers/comfy/admin/cms/sites_controller.rb +9 -10
  81. data/app/controllers/comfy/admin/cms/snippets_controller.rb +11 -11
  82. data/app/controllers/comfy/admin/cms/translations_controller.rb +98 -0
  83. data/app/controllers/comfy/cms/assets_controller.rb +9 -10
  84. data/app/controllers/comfy/cms/base_controller.rb +0 -2
  85. data/app/controllers/comfy/cms/content_controller.rb +50 -31
  86. data/app/controllers/concerns/comfy/paginate.rb +2 -2
  87. data/app/helpers/comfy/admin/cms_helper.rb +29 -0
  88. data/app/helpers/comfy/cms_helper.rb +40 -60
  89. data/app/models/comfy/cms/categorization.rb +8 -11
  90. data/app/models/comfy/cms/category.rb +10 -14
  91. data/app/models/comfy/cms/file.rb +31 -47
  92. data/app/models/comfy/cms/fragment.rb +55 -0
  93. data/app/models/comfy/cms/layout.rb +45 -40
  94. data/app/models/comfy/cms/page.rb +47 -36
  95. data/app/models/comfy/cms/revision.rb +5 -8
  96. data/app/models/comfy/cms/site.rb +26 -51
  97. data/app/models/comfy/cms/snippet.rb +20 -24
  98. data/app/models/comfy/cms/translation.rb +37 -0
  99. data/app/models/concerns/comfy/cms/with_categories.rb +38 -0
  100. data/app/models/concerns/comfy/cms/with_fragments.rb +121 -0
  101. data/app/views/comfy/admin/cms/categories/_categories.html.haml +2 -1
  102. data/app/views/comfy/admin/cms/categories/_edit.html.haml +7 -6
  103. data/app/views/comfy/admin/cms/categories/_form.html.haml +8 -5
  104. data/app/views/comfy/admin/cms/categories/_index.html.haml +24 -20
  105. data/app/views/comfy/admin/cms/categories/_show.html.haml +10 -9
  106. data/app/views/comfy/admin/cms/categories/create.js.erb +2 -2
  107. data/app/views/comfy/admin/cms/categories/edit.js.erb +1 -1
  108. data/app/views/comfy/admin/cms/categories/update.js.erb +2 -2
  109. data/app/views/comfy/admin/cms/files/_file.html.haml +31 -25
  110. data/app/views/comfy/admin/cms/files/_form.html.haml +16 -12
  111. data/app/views/comfy/admin/cms/files/edit.html.haml +1 -1
  112. data/app/views/comfy/admin/cms/files/index.html.haml +17 -19
  113. data/app/views/comfy/admin/cms/files/new.html.haml +1 -1
  114. data/app/views/comfy/admin/cms/layouts/_form.html.haml +10 -10
  115. data/app/views/comfy/admin/cms/layouts/_index_branch.html.haml +21 -19
  116. data/app/views/comfy/admin/cms/layouts/edit.html.haml +5 -5
  117. data/app/views/comfy/admin/cms/layouts/index.html.haml +4 -7
  118. data/app/views/comfy/admin/cms/pages/_form.html.haml +15 -21
  119. data/app/views/comfy/admin/cms/pages/_form_fragments.html.haml +40 -0
  120. data/app/views/comfy/admin/cms/pages/_fragment_attachments.html.haml +10 -0
  121. data/app/views/comfy/admin/cms/pages/_index_branch.html.haml +34 -26
  122. data/app/views/comfy/admin/cms/pages/edit.html.haml +19 -5
  123. data/app/views/comfy/admin/cms/pages/form_fragments.js.erb +1 -0
  124. data/app/views/comfy/admin/cms/pages/index.html.haml +5 -8
  125. data/app/views/comfy/admin/cms/pages/new.html.haml +1 -1
  126. data/app/views/comfy/admin/cms/revisions/show.html.haml +29 -27
  127. data/app/views/comfy/admin/cms/sites/_form.html.haml +6 -8
  128. data/app/views/comfy/admin/cms/sites/edit.html.haml +1 -1
  129. data/app/views/comfy/admin/cms/sites/index.html.haml +23 -22
  130. data/app/views/comfy/admin/cms/sites/new.html.haml +1 -1
  131. data/app/views/comfy/admin/cms/snippets/_form.html.haml +9 -9
  132. data/app/views/comfy/admin/cms/snippets/edit.html.haml +6 -5
  133. data/app/views/comfy/admin/cms/snippets/index.html.haml +25 -25
  134. data/app/views/comfy/admin/cms/snippets/new.html.haml +1 -1
  135. data/app/views/comfy/admin/cms/translations/_form.html.haml +21 -0
  136. data/app/views/comfy/admin/cms/translations/edit.html.haml +9 -0
  137. data/app/views/comfy/admin/cms/translations/form_fragments.js.erb +1 -0
  138. data/app/views/comfy/admin/cms/translations/new.html.haml +5 -0
  139. data/app/views/kaminari/comfy/_first_page.html.haml +3 -2
  140. data/app/views/kaminari/comfy/_gap.html.haml +2 -2
  141. data/app/views/kaminari/comfy/_last_page.html.haml +3 -2
  142. data/app/views/kaminari/comfy/_next_page.html.haml +2 -2
  143. data/app/views/kaminari/comfy/_page.html.haml +2 -2
  144. data/app/views/kaminari/comfy/_prev_page.html.haml +1 -1
  145. data/app/views/layouts/comfy/admin/cms/_body.html.haml +13 -15
  146. data/app/views/layouts/comfy/admin/cms/_footer_js.html.haml +10 -3
  147. data/app/views/layouts/comfy/admin/cms/_head.html.haml +7 -10
  148. data/app/views/layouts/comfy/admin/cms/_left.html.haml +33 -15
  149. data/app/views/layouts/comfy/admin/cms/_right.html.haml +2 -2
  150. data/comfortable_mexican_sofa.gemspec +19 -19
  151. data/config/application.rb +14 -8
  152. data/config/boot.rb +2 -2
  153. data/config/cms_routes.rb +3 -3
  154. data/config/environments/development.rb +37 -4
  155. data/config/environments/test.rb +12 -14
  156. data/config/initializers/comfortable_mexican_sofa.rb +5 -12
  157. data/config/locales/cs.yml +33 -7
  158. data/config/locales/da.yml +33 -7
  159. data/config/locales/de.yml +32 -6
  160. data/config/locales/en.yml +33 -7
  161. data/config/locales/es.yml +33 -7
  162. data/config/locales/fr.yml +33 -7
  163. data/config/locales/it.yml +33 -7
  164. data/config/locales/ja.yml +33 -7
  165. data/config/locales/nb.yml +33 -7
  166. data/config/locales/nl.yml +33 -7
  167. data/config/locales/pl.yml +33 -7
  168. data/config/locales/pt-BR.yml +33 -7
  169. data/config/locales/ru.yml +33 -7
  170. data/config/locales/sk.yml +33 -7
  171. data/config/locales/sv.yml +33 -7
  172. data/config/locales/tr.yml +33 -7
  173. data/config/locales/uk.yml +33 -7
  174. data/config/locales/zh-CN.yml +33 -7
  175. data/config/locales/zh-TW.yml +33 -7
  176. data/config/storage.yml +35 -0
  177. data/db/cms_seeds/sample-site/files/_default.jpg.yml +5 -0
  178. data/db/{cms_fixtures/sample-site/files/sample.jpg → cms_seeds/sample-site/files/default.jpg} +0 -0
  179. data/db/cms_seeds/sample-site/layouts/default/content.html +16 -0
  180. data/db/cms_seeds/sample-site/layouts/default/nested/content.html +14 -0
  181. data/db/cms_seeds/sample-site/pages/index/child_a/content.html +7 -0
  182. data/db/cms_seeds/sample-site/pages/index/child_b/content.html +6 -0
  183. data/db/cms_seeds/sample-site/pages/index/content.es.html +6 -0
  184. data/db/cms_seeds/sample-site/pages/index/content.fr.html +6 -0
  185. data/db/cms_seeds/sample-site/pages/index/content.html +24 -0
  186. data/db/{cms_fixtures/sample-site/pages/index/child/thumbnail.png → cms_seeds/sample-site/pages/index/footer.png} +0 -0
  187. data/db/cms_seeds/sample-site/pages/index/header.png +0 -0
  188. data/db/cms_seeds/sample-site/snippets/default.html +8 -0
  189. data/db/migrate/00_create_active_storage_tables.active_storage.rb +26 -0
  190. data/db/migrate/01_create_cms.rb +113 -104
  191. data/doc/preview.jpg +0 -0
  192. data/lib/comfortable_mexican_sofa.rb +10 -14
  193. data/lib/comfortable_mexican_sofa/configuration.rb +9 -13
  194. data/lib/comfortable_mexican_sofa/content.rb +28 -0
  195. data/lib/comfortable_mexican_sofa/content/block.rb +11 -0
  196. data/lib/comfortable_mexican_sofa/content/params_parser.rb +80 -0
  197. data/lib/comfortable_mexican_sofa/content/renderer.rb +125 -0
  198. data/lib/comfortable_mexican_sofa/content/tag.rb +37 -0
  199. data/lib/comfortable_mexican_sofa/content/tags/asset.rb +56 -0
  200. data/lib/comfortable_mexican_sofa/content/tags/checkbox.rb +21 -0
  201. data/lib/comfortable_mexican_sofa/content/tags/date.rb +22 -0
  202. data/lib/comfortable_mexican_sofa/content/tags/datetime.rb +22 -0
  203. data/lib/comfortable_mexican_sofa/content/tags/file.rb +77 -0
  204. data/lib/comfortable_mexican_sofa/content/tags/file_link.rb +66 -0
  205. data/lib/comfortable_mexican_sofa/content/tags/files.rb +39 -0
  206. data/lib/comfortable_mexican_sofa/content/tags/fragment.rb +54 -0
  207. data/lib/comfortable_mexican_sofa/content/tags/helper.rb +52 -0
  208. data/lib/comfortable_mexican_sofa/content/tags/markdown.rb +21 -0
  209. data/lib/comfortable_mexican_sofa/content/tags/number.rb +17 -0
  210. data/lib/comfortable_mexican_sofa/content/tags/partial.rb +42 -0
  211. data/lib/comfortable_mexican_sofa/content/tags/snippet.rb +31 -0
  212. data/lib/comfortable_mexican_sofa/content/tags/template.rb +41 -0
  213. data/lib/comfortable_mexican_sofa/content/tags/text.rb +17 -0
  214. data/lib/comfortable_mexican_sofa/content/tags/textarea.rb +17 -0
  215. data/lib/comfortable_mexican_sofa/content/tags/wysiwyg.rb +18 -0
  216. data/lib/comfortable_mexican_sofa/engine.rb +3 -2
  217. data/lib/comfortable_mexican_sofa/extensions/acts_as_tree.rb +33 -30
  218. data/lib/comfortable_mexican_sofa/extensions/has_revisions.rb +27 -23
  219. data/lib/comfortable_mexican_sofa/form_builder.rb +32 -104
  220. data/lib/comfortable_mexican_sofa/render_methods.rb +24 -21
  221. data/lib/comfortable_mexican_sofa/routes/cms.rb +6 -14
  222. data/lib/comfortable_mexican_sofa/routes/cms_admin.rb +39 -29
  223. data/lib/comfortable_mexican_sofa/routing.rb +1 -1
  224. data/lib/comfortable_mexican_sofa/seeds.rb +102 -0
  225. data/lib/comfortable_mexican_sofa/seeds/file/exporter.rb +40 -0
  226. data/lib/comfortable_mexican_sofa/seeds/file/importer.rb +61 -0
  227. data/lib/comfortable_mexican_sofa/seeds/layout/exporter.rb +37 -0
  228. data/lib/comfortable_mexican_sofa/seeds/layout/importer.rb +59 -0
  229. data/lib/comfortable_mexican_sofa/seeds/page/exporter.rb +88 -0
  230. data/lib/comfortable_mexican_sofa/seeds/page/importer.rb +213 -0
  231. data/lib/comfortable_mexican_sofa/seeds/snippet/exporter.rb +31 -0
  232. data/lib/comfortable_mexican_sofa/seeds/snippet/importer.rb +48 -0
  233. data/lib/comfortable_mexican_sofa/version.rb +1 -1
  234. data/lib/comfortable_mexican_sofa/view_hooks.rb +0 -1
  235. data/lib/generators/comfy/cms/assets_generator.rb +0 -1
  236. data/lib/generators/comfy/cms/cms_generator.rb +15 -5
  237. data/lib/generators/comfy/scaffold/scaffold_generator.rb +26 -20
  238. data/lib/generators/comfy/scaffold/templates/{controller.rb → controller.rb.tt} +10 -10
  239. data/lib/generators/comfy/scaffold/templates/{migration.rb → migration.rb.tt} +2 -3
  240. data/lib/generators/comfy/scaffold/templates/{model.rb → model.rb.tt} +7 -7
  241. data/lib/generators/comfy/scaffold/templates/tests/{controller.rb → controller.rb.tt} +37 -24
  242. data/lib/generators/comfy/scaffold/templates/tests/{fixture.yml → fixture.yml.tt} +0 -0
  243. data/lib/generators/comfy/scaffold/templates/tests/{model.rb → model.rb.tt} +3 -4
  244. data/lib/generators/comfy/scaffold/templates/views/_form.haml.tt +7 -0
  245. data/lib/generators/comfy/scaffold/templates/views/{edit.haml → edit.haml.tt} +1 -1
  246. data/lib/generators/comfy/scaffold/templates/views/index.haml.tt +21 -0
  247. data/lib/generators/comfy/scaffold/templates/views/{new.haml → new.haml.tt} +1 -1
  248. data/lib/generators/comfy/scaffold/templates/views/{show.haml → show.haml.tt} +2 -2
  249. data/lib/tasks/cms_seeds.rake +37 -0
  250. data/test/controllers/comfy/admin/cms/base_controller_test.rb +5 -6
  251. data/test/controllers/comfy/admin/cms/categories_controller_test.rb +27 -24
  252. data/test/controllers/comfy/admin/cms/files_controller_test.rb +97 -97
  253. data/test/controllers/comfy/admin/cms/layouts_controller_test.rb +32 -31
  254. data/test/controllers/comfy/admin/cms/pages_controller_test.rb +317 -263
  255. data/test/controllers/comfy/admin/cms/revisions_controller_test.rb +175 -65
  256. data/test/controllers/comfy/admin/cms/sites_controller_test.rb +27 -29
  257. data/test/controllers/comfy/admin/cms/snippets_controller_test.rb +54 -51
  258. data/test/controllers/comfy/admin/cms/translations_controller_test.rb +181 -0
  259. data/test/controllers/comfy/cms/assets_controller_test.rb +24 -22
  260. data/test/controllers/comfy/cms/content_controller_test.rb +126 -140
  261. data/test/fixtures/active_storage/attachments.yml +9 -0
  262. data/test/fixtures/active_storage/blobs.yml +13 -0
  263. data/test/fixtures/comfy/cms/files.yml +2 -6
  264. data/test/fixtures/comfy/cms/fragments.yml +25 -0
  265. data/test/fixtures/comfy/cms/layouts.yml +7 -13
  266. data/test/fixtures/comfy/cms/pages.yml +2 -17
  267. data/test/fixtures/comfy/cms/revisions.yml +16 -8
  268. data/test/fixtures/comfy/cms/sites.yml +0 -1
  269. data/test/fixtures/comfy/cms/snippets.yml +1 -1
  270. data/test/fixtures/comfy/cms/translations.yml +7 -0
  271. data/test/fixtures/generators/cms/application.rb +7 -0
  272. data/test/fixtures/generators/cms/routes.rb +4 -7
  273. data/test/fixtures/generators/scaffold/controller.rb +10 -10
  274. data/test/fixtures/generators/scaffold/migration.rb +2 -3
  275. data/test/fixtures/generators/scaffold/model.rb +7 -7
  276. data/test/fixtures/generators/scaffold/routes.rb +1 -2
  277. data/test/fixtures/generators/scaffold/tests/controller.rb +37 -24
  278. data/test/fixtures/generators/scaffold/tests/model.rb +3 -4
  279. data/test/fixtures/generators/scaffold/views/_form.haml +3 -2
  280. data/test/fixtures/generators/scaffold/views/edit.haml +1 -1
  281. data/test/fixtures/generators/scaffold/views/index.haml +15 -13
  282. data/test/fixtures/generators/scaffold/views/new.haml +1 -1
  283. data/test/fixtures/generators/scaffold/views/show.haml +2 -2
  284. data/test/gemfiles/Gemfile.rails.5.2 +32 -0
  285. data/test/generators/cms_assets_generator_test.rb +1 -2
  286. data/test/generators/cms_generator_test.rb +3 -1
  287. data/test/generators/cms_views_generator_test.rb +1 -1
  288. data/test/generators/scaffold_generator_test.rb +2 -2
  289. data/test/helpers/cms_helper_test.rb +52 -73
  290. data/test/integration/access_control_test.rb +35 -28
  291. data/test/integration/js_variables_test.rb +1 -2
  292. data/test/integration/render_cms_test.rb +37 -37
  293. data/test/integration/routing_test.rb +4 -5
  294. data/test/integration/seeds_test.rb +76 -0
  295. data/test/integration/sites_test.rb +35 -49
  296. data/test/integration/view_hooks_test.rb +12 -13
  297. data/test/lib/configuration_test.rb +3 -4
  298. data/test/lib/content/block_test.rb +26 -0
  299. data/test/lib/content/params_parser_test.rb +125 -0
  300. data/test/lib/content/renderer_test.rb +240 -0
  301. data/test/lib/content/tag_test.rb +48 -0
  302. data/test/lib/content/tags/asset_test.rb +79 -0
  303. data/test/lib/content/tags/checkbox_test.rb +20 -0
  304. data/test/lib/content/tags/date_test.rb +20 -0
  305. data/test/lib/content/tags/datetime_test.rb +20 -0
  306. data/test/lib/content/tags/file_link_test.rb +78 -0
  307. data/test/lib/content/tags/file_test.rb +60 -0
  308. data/test/lib/content/tags/files_test.rb +49 -0
  309. data/test/lib/content/tags/fragment_test.rb +63 -0
  310. data/test/lib/content/tags/helper_test.rb +52 -0
  311. data/test/lib/content/tags/markdown_test.rb +33 -0
  312. data/test/lib/content/tags/number_test.rb +13 -0
  313. data/test/lib/content/tags/partial_test.rb +43 -0
  314. data/test/lib/content/tags/snippet_test.rb +36 -0
  315. data/test/lib/content/tags/template_test.rb +35 -0
  316. data/test/lib/content/tags/text_test.rb +13 -0
  317. data/test/lib/content/tags/textarea_test.rb +13 -0
  318. data/test/lib/content/tags/wysiwyg_test.rb +13 -0
  319. data/test/lib/revisions_test.rb +146 -111
  320. data/test/lib/seeds/files_test.rb +96 -0
  321. data/test/lib/seeds/layouts_test.rb +155 -0
  322. data/test/lib/seeds/pages_test.rb +227 -0
  323. data/test/lib/seeds/snippets_test.rb +98 -0
  324. data/test/lib/seeds_test.rb +50 -0
  325. data/test/models/categorization_test.rb +37 -38
  326. data/test/models/category_test.rb +14 -14
  327. data/test/models/file_test.rb +23 -96
  328. data/test/models/fragment_test.rb +131 -0
  329. data/test/models/layout_test.rb +105 -74
  330. data/test/models/page_test.rb +352 -97
  331. data/test/models/site_test.rb +101 -90
  332. data/test/models/snippet_test.rb +29 -23
  333. data/test/models/translation_test.rb +60 -0
  334. data/test/tasks/cms_seeds_test.rb +33 -0
  335. data/test/test_helper.rb +49 -32
  336. metadata +235 -210
  337. data/_config.yml +0 -1
  338. data/app/assets/images/comfy/admin/cms/arrow_bottom.gif +0 -0
  339. data/app/assets/images/comfy/admin/cms/arrow_right.gif +0 -0
  340. data/app/assets/images/comfy/admin/cms/checkerboard.gif +0 -0
  341. data/app/assets/images/comfy/admin/cms/icon_draft.gif +0 -0
  342. data/app/assets/images/comfy/admin/cms/icon_file.gif +0 -0
  343. data/app/assets/images/comfy/admin/cms/icon_layout.gif +0 -0
  344. data/app/assets/images/comfy/admin/cms/icon_move.gif +0 -0
  345. data/app/assets/images/comfy/admin/cms/icon_page.gif +0 -0
  346. data/app/assets/images/comfy/admin/cms/icon_site.gif +0 -0
  347. data/app/assets/images/comfy/admin/cms/icon_snippet.gif +0 -0
  348. data/app/assets/javascripts/comfy/admin/cms/lib/bootstrap-datetimepicker.js +0 -29
  349. data/app/assets/javascripts/comfy/admin/cms/lib/diff.js.coffee +0 -9
  350. data/app/assets/javascripts/comfy/admin/cms/lib/diff/pretty_text_diff.min.js +0 -5
  351. data/app/assets/stylesheets/comfy/admin/cms/bootstrap_overrides.sass +0 -32
  352. data/app/assets/stylesheets/comfy/admin/cms/lib/bootstrap-datetimepicker.css +0 -9
  353. data/app/models/comfy/cms/block.rb +0 -63
  354. data/app/views/comfy/admin/cms/files/_page_form.html.haml +0 -10
  355. data/app/views/comfy/admin/cms/pages/_form_blocks.html.haml +0 -32
  356. data/app/views/comfy/admin/cms/pages/form_blocks.js.erb +0 -1
  357. data/app/views/comfy/admin/cms/partials/_body_before.html.haml +0 -3
  358. data/app/views/comfy/admin/cms/partials/_file_form_after.html.haml +0 -3
  359. data/app/views/comfy/admin/cms/partials/_file_form_before.html.haml +0 -3
  360. data/app/views/comfy/admin/cms/partials/_files_after.html.haml +0 -3
  361. data/app/views/comfy/admin/cms/partials/_files_before.html.haml +0 -3
  362. data/app/views/comfy/admin/cms/partials/_html_footer.html.haml +0 -2
  363. data/app/views/comfy/admin/cms/partials/_html_head.html.haml +0 -2
  364. data/app/views/comfy/admin/cms/partials/_layout_form_after.html.haml +0 -3
  365. data/app/views/comfy/admin/cms/partials/_layout_form_before.html.haml +0 -3
  366. data/app/views/comfy/admin/cms/partials/_layouts_after.html.haml +0 -3
  367. data/app/views/comfy/admin/cms/partials/_layouts_before.html.haml +0 -3
  368. data/app/views/comfy/admin/cms/partials/_navigation_after.html.haml +0 -3
  369. data/app/views/comfy/admin/cms/partials/_navigation_before.html.haml +0 -3
  370. data/app/views/comfy/admin/cms/partials/_navigation_inner.html.haml +0 -3
  371. data/app/views/comfy/admin/cms/partials/_page_form_after.html.haml +0 -3
  372. data/app/views/comfy/admin/cms/partials/_page_form_before.html.haml +0 -3
  373. data/app/views/comfy/admin/cms/partials/_page_form_inner.html.haml +0 -3
  374. data/app/views/comfy/admin/cms/partials/_pages_after.html.haml +0 -3
  375. data/app/views/comfy/admin/cms/partials/_pages_before.html.haml +0 -3
  376. data/app/views/comfy/admin/cms/partials/_right_column_after.html.haml +0 -3
  377. data/app/views/comfy/admin/cms/partials/_right_column_before.html.haml +0 -3
  378. data/app/views/comfy/admin/cms/partials/_site_form_after.html.haml +0 -3
  379. data/app/views/comfy/admin/cms/partials/_site_form_before.html.haml +0 -3
  380. data/app/views/comfy/admin/cms/partials/_sites_after.html.haml +0 -3
  381. data/app/views/comfy/admin/cms/partials/_sites_before.html.haml +0 -3
  382. data/app/views/comfy/admin/cms/partials/_snippet_form_after.html.haml +0 -3
  383. data/app/views/comfy/admin/cms/partials/_snippet_form_before.html.haml +0 -3
  384. data/app/views/comfy/admin/cms/partials/_snippets_after.html.haml +0 -3
  385. data/app/views/comfy/admin/cms/partials/_snippets_before.html.haml +0 -3
  386. data/app/views/comfy/admin/cms/sites/_mirrors.html.haml +0 -18
  387. data/app/views/comfy/cms/content/render_sitemap.xml.builder +0 -14
  388. data/app/views/layouts/comfy/admin/cms/_footer.html.haml +0 -3
  389. data/config/initializers/paperclip.rb +0 -3
  390. data/config/initializers/secret_token.rb +0 -15
  391. data/db/cms_fixtures/sample-site/categories/files.yml +0 -1
  392. data/db/cms_fixtures/sample-site/categories/pages.yml +0 -1
  393. data/db/cms_fixtures/sample-site/categories/snippets.yml +0 -1
  394. data/db/cms_fixtures/sample-site/files/_sample.jpg.yml +0 -5
  395. data/db/cms_fixtures/sample-site/layouts/default/attributes.yml +0 -1
  396. data/db/cms_fixtures/sample-site/layouts/default/content.html +0 -5
  397. data/db/cms_fixtures/sample-site/layouts/default/javascript.js +0 -1
  398. data/db/cms_fixtures/sample-site/layouts/default/nested/attributes.yml +0 -2
  399. data/db/cms_fixtures/sample-site/layouts/default/nested/content.haml +0 -3
  400. data/db/cms_fixtures/sample-site/layouts/default/nested/javascript.js +0 -1
  401. data/db/cms_fixtures/sample-site/layouts/default/nested/stylesheet.css +0 -1
  402. data/db/cms_fixtures/sample-site/layouts/default/stylesheet.css +0 -1
  403. data/db/cms_fixtures/sample-site/pages/index/attributes.yml +0 -6
  404. data/db/cms_fixtures/sample-site/pages/index/child/attributes.yml +0 -3
  405. data/db/cms_fixtures/sample-site/pages/index/child/left.haml +0 -1
  406. data/db/cms_fixtures/sample-site/pages/index/child/right.html +0 -1
  407. data/db/cms_fixtures/sample-site/pages/index/content.html +0 -2
  408. data/db/cms_fixtures/sample-site/snippets/default/attributes.yml +0 -4
  409. data/db/cms_fixtures/sample-site/snippets/default/content.html +0 -1
  410. data/db/seeds.rb +0 -7
  411. data/db/upgrade_migrations/02_upgrade_to_1_1_0.rb +0 -19
  412. data/db/upgrade_migrations/03_upgrade_to_1_2_0.rb +0 -15
  413. data/db/upgrade_migrations/04_upgrade_to_1_3_0.rb +0 -23
  414. data/db/upgrade_migrations/05_upgrade_to_1_4_0.rb +0 -33
  415. data/db/upgrade_migrations/06_upgrade_to_1_5_0.rb +0 -21
  416. data/db/upgrade_migrations/07_upgrade_to_1_6_0.rb +0 -25
  417. data/db/upgrade_migrations/08_upgrade_to_1_12_0.rb +0 -83
  418. data/doc/preview.png +0 -0
  419. data/lib/comfortable_mexican_sofa/extensions/cms_manageable.rb +0 -106
  420. data/lib/comfortable_mexican_sofa/extensions/is_categorized.rb +0 -49
  421. data/lib/comfortable_mexican_sofa/extensions/is_mirrored.rb +0 -86
  422. data/lib/comfortable_mexican_sofa/extensions/rails.rb +0 -17
  423. data/lib/comfortable_mexican_sofa/fixture.rb +0 -82
  424. data/lib/comfortable_mexican_sofa/fixture/category.rb +0 -42
  425. data/lib/comfortable_mexican_sofa/fixture/file.rb +0 -85
  426. data/lib/comfortable_mexican_sofa/fixture/layout.rb +0 -95
  427. data/lib/comfortable_mexican_sofa/fixture/page.rb +0 -129
  428. data/lib/comfortable_mexican_sofa/fixture/snippet.rb +0 -75
  429. data/lib/comfortable_mexican_sofa/tag.rb +0 -154
  430. data/lib/comfortable_mexican_sofa/tags/asset.rb +0 -30
  431. data/lib/comfortable_mexican_sofa/tags/collection.rb +0 -64
  432. data/lib/comfortable_mexican_sofa/tags/field_boolean.rb +0 -17
  433. data/lib/comfortable_mexican_sofa/tags/field_datetime.rb +0 -17
  434. data/lib/comfortable_mexican_sofa/tags/field_integer.rb +0 -17
  435. data/lib/comfortable_mexican_sofa/tags/field_rich_text.rb +0 -17
  436. data/lib/comfortable_mexican_sofa/tags/field_string.rb +0 -17
  437. data/lib/comfortable_mexican_sofa/tags/field_text.rb +0 -17
  438. data/lib/comfortable_mexican_sofa/tags/file.rb +0 -29
  439. data/lib/comfortable_mexican_sofa/tags/helper.rb +0 -24
  440. data/lib/comfortable_mexican_sofa/tags/page_datetime.rb +0 -13
  441. data/lib/comfortable_mexican_sofa/tags/page_file.rb +0 -62
  442. data/lib/comfortable_mexican_sofa/tags/page_files.rb +0 -51
  443. data/lib/comfortable_mexican_sofa/tags/page_integer.rb +0 -13
  444. data/lib/comfortable_mexican_sofa/tags/page_markdown.rb +0 -16
  445. data/lib/comfortable_mexican_sofa/tags/page_rich_text.rb +0 -13
  446. data/lib/comfortable_mexican_sofa/tags/page_string.rb +0 -13
  447. data/lib/comfortable_mexican_sofa/tags/page_text.rb +0 -13
  448. data/lib/comfortable_mexican_sofa/tags/partial.rb +0 -23
  449. data/lib/comfortable_mexican_sofa/tags/snippet.rb +0 -19
  450. data/lib/comfortable_mexican_sofa/tags/template.rb +0 -22
  451. data/lib/generators/comfy/scaffold/templates/views/_form.haml +0 -6
  452. data/lib/generators/comfy/scaffold/templates/views/index.haml +0 -23
  453. data/lib/tasks/comfortable_mexican_sofa.rake +0 -37
  454. data/test/fixtures/comfy/cms/blocks.yml +0 -12
  455. data/test/gemfiles/Gemfile.rails.4.1 +0 -22
  456. data/test/gemfiles/Gemfile.rails.4.2 +0 -22
  457. data/test/gemfiles/Gemfile.rails.5.0 +0 -23
  458. data/test/gemfiles/Gemfile.rails.master +0 -23
  459. data/test/integration/fixtures_test.rb +0 -65
  460. data/test/integration/mirrors_test.rb +0 -72
  461. data/test/lib/fixtures/categories_test.rb +0 -36
  462. data/test/lib/fixtures/files_test.rb +0 -109
  463. data/test/lib/fixtures/layouts_test.rb +0 -135
  464. data/test/lib/fixtures/pages_test.rb +0 -168
  465. data/test/lib/fixtures/snippets_test.rb +0 -106
  466. data/test/lib/fixtures_test.rb +0 -43
  467. data/test/lib/mirrors_test.rb +0 -254
  468. data/test/lib/tag_test.rb +0 -309
  469. data/test/lib/tags/asset_test.rb +0 -95
  470. data/test/lib/tags/collection_test.rb +0 -117
  471. data/test/lib/tags/field_boolean_test.rb +0 -49
  472. data/test/lib/tags/field_datetime_test.rb +0 -50
  473. data/test/lib/tags/field_integer_test.rb +0 -49
  474. data/test/lib/tags/field_rich_text_test.rb +0 -49
  475. data/test/lib/tags/field_string_test.rb +0 -52
  476. data/test/lib/tags/field_text_test.rb +0 -48
  477. data/test/lib/tags/file_test.rb +0 -67
  478. data/test/lib/tags/helper_test.rb +0 -86
  479. data/test/lib/tags/page_datetime_test.rb +0 -50
  480. data/test/lib/tags/page_file_test.rb +0 -119
  481. data/test/lib/tags/page_files_test.rb +0 -117
  482. data/test/lib/tags/page_integer_test.rb +0 -49
  483. data/test/lib/tags/page_markdown_test.rb +0 -48
  484. data/test/lib/tags/page_rich_text_test.rb +0 -49
  485. data/test/lib/tags/page_string_test.rb +0 -49
  486. data/test/lib/tags/page_text_test.rb +0 -52
  487. data/test/lib/tags/partial_test.rb +0 -76
  488. data/test/lib/tags/snippet_test.rb +0 -45
  489. data/test/lib/tags/template_test.rb +0 -56
  490. data/test/models/block_test.rb +0 -233
@@ -1,26 +1,26 @@
1
1
  require_relative '../test_helper'
2
2
 
3
3
  class ViewHooksIntegrationTest < ActionDispatch::IntegrationTest
4
-
4
+
5
5
  def teardown
6
6
  ComfortableMexicanSofa::ViewHooks.remove(:navigation)
7
7
  end
8
-
8
+
9
9
  def test_hooks_rendering
10
10
  Comfy::Admin::Cms::SitesController.append_view_path(File.expand_path('../fixtures/views', File.dirname(__FILE__)))
11
11
  ComfortableMexicanSofa::ViewHooks.add(:navigation, '/nav_hook')
12
-
13
- http_auth :get, comfy_admin_cms_sites_path
12
+
13
+ r :get, comfy_admin_cms_sites_path
14
14
  assert_response :success
15
15
  assert_match /hook_content/, response.body
16
16
  end
17
-
17
+
18
18
  def test_hooks_rendering_with_multiples
19
19
  Comfy::Admin::Cms::SitesController.append_view_path(File.expand_path('../fixtures/views', File.dirname(__FILE__)))
20
20
  ComfortableMexicanSofa::ViewHooks.add(:navigation, '/nav_hook')
21
21
  ComfortableMexicanSofa::ViewHooks.add(:navigation, '/nav_hook_2')
22
-
23
- http_auth :get, comfy_admin_cms_sites_path
22
+
23
+ r :get, comfy_admin_cms_sites_path
24
24
  assert_response :success
25
25
  assert_match /hook_content/, response.body
26
26
  assert_match /<hook_content_2>/, response.body
@@ -30,18 +30,17 @@ class ViewHooksIntegrationTest < ActionDispatch::IntegrationTest
30
30
  Comfy::Admin::Cms::SitesController.append_view_path(File.expand_path('../fixtures/views', File.dirname(__FILE__)))
31
31
  ComfortableMexicanSofa::ViewHooks.add(:navigation, '/nav_hook_2', 0)
32
32
  ComfortableMexicanSofa::ViewHooks.add(:navigation, '/nav_hook', 1)
33
-
34
- http_auth :get, comfy_admin_cms_sites_path
33
+
34
+ r :get, comfy_admin_cms_sites_path
35
35
  assert_response :success
36
36
  assert_match /<hook_content_2>hook_content/, response.body
37
37
  end
38
-
38
+
39
39
  def test_hooks_rendering_with_no_hook
40
40
  ComfortableMexicanSofa::ViewHooks.remove(:navigation)
41
-
42
- http_auth :get, comfy_admin_cms_sites_path
41
+
42
+ r :get, comfy_admin_cms_sites_path
43
43
  assert_response :success
44
44
  assert_no_match /hook_content/, response.body
45
45
  end
46
-
47
46
  end
@@ -12,17 +12,16 @@ class ConfigurationTest < ActiveSupport::TestCase
12
12
  assert_equal 'ComfortableMexicanSofa::AccessControl::AdminAuthorization', config.admin_authorization
13
13
  assert_equal 'ComfortableMexicanSofa::AccessControl::PublicAuthentication', config.public_auth
14
14
  assert_equal '', config.admin_route_redirect
15
- assert_equal false, config.enable_fixtures
16
- assert_equal File.expand_path('db/cms_fixtures', Rails.root), config.fixtures_path
15
+ assert_equal false, config.enable_seeds
16
+ assert_equal File.expand_path('db/cms_seeds', Rails.root), config.seeds_path
17
17
  assert_equal 25, config.revisions_limit
18
18
  assert_equal ({
19
19
  'en' => 'English',
20
20
  'es' => 'Español'
21
21
  }), config.locales
22
22
  assert_nil config.admin_locale
23
- assert_equal ({}), config.upload_file_options
24
23
  assert_nil config.admin_cache_sweeper
25
- assert_equal false, config.allow_irb
24
+ assert_equal false, config.allow_erb
26
25
  assert_nil config.allowed_helpers
27
26
  assert_nil config.allowed_partials
28
27
  assert_nil config.allowed_templates
@@ -0,0 +1,26 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class ContentBlockTest < ActiveSupport::TestCase
4
+
5
+ class TestBlockTag < ComfortableMexicanSofa::Content::Block
6
+ # ...
7
+ end
8
+
9
+ setup do
10
+ ComfortableMexicanSofa::Content::Renderer.register_tag(:test_block, TestBlockTag)
11
+ end
12
+
13
+ teardown do
14
+ ComfortableMexicanSofa::Content::Renderer.tags.delete("test_block")
15
+ end
16
+
17
+ # -- Tests -------------------------------------------------------------------
18
+
19
+ def test_block_tag_nodes
20
+ block = TestBlockTag.new(nil, "")
21
+ assert_equal [], block.nodes
22
+ block.nodes << "text"
23
+ assert_equal ["text"], block.nodes
24
+ end
25
+
26
+ end
@@ -0,0 +1,125 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class ContentParamsParserTest < ActiveSupport::TestCase
4
+
5
+ def test_tokenizer
6
+ tokens = ComfortableMexicanSofa::Content::ParamsParser.tokenize("param")
7
+ assert_equal [[:string, "param"]], tokens
8
+ end
9
+
10
+ def test_tokenizer_with_integer
11
+ tokens = ComfortableMexicanSofa::Content::ParamsParser.tokenize("123")
12
+ assert_equal [[:string, "123"]], tokens
13
+ end
14
+
15
+ def test_tokenizer_with_commas
16
+ tokens = ComfortableMexicanSofa::Content::ParamsParser.tokenize("param_a, param_b, param_c")
17
+ assert_equal [
18
+ [:string, "param_a"], [:comma, ","], [:string, "param_b"], [:comma, ","], [:string, "param_c"]
19
+ ], tokens
20
+ end
21
+
22
+ def test_tokenizer_with_columns
23
+ tokens = ComfortableMexicanSofa::Content::ParamsParser.tokenize("key: value")
24
+ assert_equal [[:string, "key"], [:column, ":"], [:string, "value"]], tokens
25
+ end
26
+
27
+ def test_tokenizer_with_quoted_value
28
+ tokens = ComfortableMexicanSofa::Content::ParamsParser.tokenize("key: ''")
29
+ assert_equal [[:string, "key"], [:column, ":"], [:string, ""]], tokens
30
+
31
+ tokens = ComfortableMexicanSofa::Content::ParamsParser.tokenize("key: 'test'")
32
+ assert_equal [[:string, "key"], [:column, ":"], [:string, "test"]], tokens
33
+
34
+ tokens = ComfortableMexicanSofa::Content::ParamsParser.tokenize("key: 'v1, v2: v3'")
35
+ assert_equal [[:string, "key"], [:column, ":"], [:string, "v1, v2: v3"]], tokens
36
+
37
+ tokens = ComfortableMexicanSofa::Content::ParamsParser.tokenize('key: "v1, v2: v3"')
38
+ assert_equal [[:string, "key"], [:column, ":"], [:string, 'v1, v2: v3']], tokens
39
+ end
40
+
41
+ def test_tokenizer_with_bad_input
42
+ message = "Unexpected char: %"
43
+ assert_exception_raised ComfortableMexicanSofa::Content::ParamsParser::Error, message do
44
+ ComfortableMexicanSofa::Content::ParamsParser.tokenize("%")
45
+ end
46
+ end
47
+
48
+ def test_slice
49
+ tokens = [[:string, "a"], [:comma, ","], [:string, "b"]]
50
+ token_groups = ComfortableMexicanSofa::Content::ParamsParser.slice(tokens)
51
+ assert_equal [[[:string, "a"]], [[:string, "b"]]], token_groups
52
+ end
53
+
54
+ def test_parameterize
55
+ token_groups = [[[:string, "a"]]]
56
+ params = ComfortableMexicanSofa::Content::ParamsParser.parameterize(token_groups)
57
+ assert_equal ["a"], params
58
+
59
+ token_groups = [[[:string, "a"], [:column, ":"], [:string, "b"]]]
60
+ params = ComfortableMexicanSofa::Content::ParamsParser.parameterize(token_groups)
61
+ assert_equal [{"a" => "b"}], params
62
+ end
63
+
64
+ def test_parameterize_with_bad_input
65
+ message = "Unexpected tokens found: [[:string, \"a\"], [:string, \"b\"]]"
66
+ token_groups = [[[:string, "a"], [:string, "b"]]]
67
+ assert_exception_raised ComfortableMexicanSofa::Content::ParamsParser::Error, message do
68
+ ComfortableMexicanSofa::Content::ParamsParser.parameterize(token_groups)
69
+ end
70
+ end
71
+
72
+ def test_collect_param_for_string!
73
+ params = []
74
+ ComfortableMexicanSofa::Content::ParamsParser.collect_param_for_string!(params, [:string, "a"])
75
+ assert_equal ["a"], params
76
+ end
77
+
78
+ def test_collect_param_for_string_with_bad_input
79
+ message = "Unexpected token: [:invalid, \"a\"]"
80
+ assert_exception_raised ComfortableMexicanSofa::Content::ParamsParser::Error, message do
81
+ ComfortableMexicanSofa::Content::ParamsParser.collect_param_for_string!([], [:invalid, "a"])
82
+ end
83
+ end
84
+
85
+ def test_collect_param_for_hash!
86
+ params = []
87
+ tokens = [[:string, "a"], [:column, ":"], [:string, "b"]]
88
+ ComfortableMexicanSofa::Content::ParamsParser.collect_param_for_hash!(params, tokens)
89
+ assert_equal [{"a" => "b"}], params
90
+ end
91
+
92
+ def test_collect_param_for_hash_with_trailing_hash
93
+ params = ["x", {"y" => "z"}]
94
+ tokens = [[:string, "a"], [:column, ":"], [:string, "b"]]
95
+ ComfortableMexicanSofa::Content::ParamsParser.collect_param_for_hash!(params, tokens)
96
+ assert_equal ["x", {"y" => "z", "a" => "b"}], params
97
+ end
98
+
99
+ def test_collect_param_for_hash_with_trailing_param
100
+ params = ["x", {"y" => "z"}, "k"]
101
+ tokens = [[:string, "a"], [:column, ":"], [:string, "b"]]
102
+ ComfortableMexicanSofa::Content::ParamsParser.collect_param_for_hash!(params, tokens)
103
+ assert_equal ["x", {"y" => "z"}, "k", {"a" => "b"}], params
104
+ end
105
+
106
+ def test_collect_param_for_hash_with_bad_input
107
+ message = "Unexpected tokens: [[:string, \"a\"], [:invalid, \":\"], [:string, \"b\"]]"
108
+ assert_exception_raised ComfortableMexicanSofa::Content::ParamsParser::Error, message do
109
+ tokens = [[:string, "a"], [:invalid, ":"], [:string, "b"]]
110
+ ComfortableMexicanSofa::Content::ParamsParser.collect_param_for_hash!([], tokens)
111
+ end
112
+ end
113
+
114
+ def test_parse
115
+ text = "param_a, param_b, key_a: val_a, key_b: val_b, param_c, key_c: val_c"
116
+ params = ComfortableMexicanSofa::Content::ParamsParser.parse(text)
117
+ assert_equal [
118
+ "param_a",
119
+ "param_b",
120
+ {"key_a" => "val_a", "key_b" => "val_b"},
121
+ "param_c",
122
+ {"key_c" => "val_c"}
123
+ ], params
124
+ end
125
+ end
@@ -0,0 +1,240 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class ContentRendererTest < ActiveSupport::TestCase
4
+
5
+ class TestTag < ComfortableMexicanSofa::Content::Tag
6
+ def content
7
+ "test tag content"
8
+ end
9
+ end
10
+
11
+ class TestNestedTag < ComfortableMexicanSofa::Content::Tag
12
+ def content
13
+ "test {{cms:test}} content"
14
+ end
15
+ end
16
+
17
+ class TestBlockTag < ComfortableMexicanSofa::Content::Block
18
+ # ...
19
+ end
20
+
21
+ DEFAULT_REGISTERED_TAGS = {
22
+ "wysiwyg" => ComfortableMexicanSofa::Content::Tag::Wysiwyg,
23
+ "text" => ComfortableMexicanSofa::Content::Tag::Text,
24
+ "textarea" => ComfortableMexicanSofa::Content::Tag::TextArea,
25
+ "markdown" => ComfortableMexicanSofa::Content::Tag::Markdown,
26
+ "datetime" => ComfortableMexicanSofa::Content::Tag::Datetime,
27
+ "date" => ComfortableMexicanSofa::Content::Tag::Date,
28
+ "number" => ComfortableMexicanSofa::Content::Tag::Number,
29
+ "checkbox" => ComfortableMexicanSofa::Content::Tag::Checkbox,
30
+ "file" => ComfortableMexicanSofa::Content::Tag::File,
31
+ "files" => ComfortableMexicanSofa::Content::Tag::Files,
32
+ "snippet" => ComfortableMexicanSofa::Content::Tag::Snippet,
33
+ "asset" => ComfortableMexicanSofa::Content::Tag::Asset,
34
+ "file_link" => ComfortableMexicanSofa::Content::Tag::FileLink,
35
+ "helper" => ComfortableMexicanSofa::Content::Tag::Helper,
36
+ "partial" => ComfortableMexicanSofa::Content::Tag::Partial,
37
+ "template" => ComfortableMexicanSofa::Content::Tag::Template
38
+ }.freeze
39
+
40
+ setup do
41
+ @template = ComfortableMexicanSofa::Content::Renderer.new(comfy_cms_pages(:default))
42
+
43
+ ComfortableMexicanSofa::Content::Renderer.register_tag(:test, TestTag)
44
+ ComfortableMexicanSofa::Content::Renderer.register_tag(:test_nested, TestNestedTag)
45
+ ComfortableMexicanSofa::Content::Renderer.register_tag(:test_block, TestBlockTag)
46
+ end
47
+
48
+ teardown do
49
+ ComfortableMexicanSofa::Content::Renderer.tags.delete("test")
50
+ ComfortableMexicanSofa::Content::Renderer.tags.delete("test_nested")
51
+ ComfortableMexicanSofa::Content::Renderer.tags.delete("test_block")
52
+ end
53
+
54
+ # Test helper so we don't have to do this each time
55
+ def render_string(string, template = @template)
56
+ tokens = @template.tokenize(string)
57
+ nodes = @template.nodes(tokens)
58
+ @template.render(nodes)
59
+ end
60
+
61
+ # -- Tests -------------------------------------------------------------------
62
+
63
+ def test_tags
64
+ assert_equal (DEFAULT_REGISTERED_TAGS.merge(
65
+ "test" => ContentRendererTest::TestTag,
66
+ "test_nested" => ContentRendererTest::TestNestedTag,
67
+ "test_block" => ContentRendererTest::TestBlockTag
68
+ )), ComfortableMexicanSofa::Content::Renderer.tags
69
+ end
70
+
71
+ def test_register_tags
72
+ ComfortableMexicanSofa::Content::Renderer.register_tag(:other, TestTag)
73
+ assert_equal (DEFAULT_REGISTERED_TAGS.merge(
74
+ "test" => ContentRendererTest::TestTag,
75
+ "test_nested" => ContentRendererTest::TestNestedTag,
76
+ "test_block" => ContentRendererTest::TestBlockTag,
77
+ "other" => ContentRendererTest::TestTag
78
+ )), ComfortableMexicanSofa::Content::Renderer.tags
79
+ ensure
80
+ ComfortableMexicanSofa::Content::Renderer.tags.delete("other")
81
+ end
82
+
83
+ def test_tokenize
84
+ assert_equal ["test text"], @template.tokenize("test text")
85
+ end
86
+
87
+ def test_tokenize_with_tag
88
+ assert_equal ["test ", {tag_class: "tag", tag_params: ""}, " text"],
89
+ @template.tokenize("test {{cms:tag}} text")
90
+ end
91
+
92
+ def test_tokenize_with_tag_and_params
93
+ assert_equal ["test ", {tag_class: "tag", tag_params: "name, key:val"}, " text"],
94
+ @template.tokenize("test {{cms:tag name, key:val}} text")
95
+ end
96
+
97
+ def test_tokenize_with_invalid_tag
98
+ assert_equal ["test {{abc:tag}} text"],
99
+ @template.tokenize("test {{abc:tag}} text")
100
+ end
101
+
102
+ def test_tokenize_with_newlines
103
+ assert_equal [{tag_class: "test", tag_params: ""}, "\n", {tag_class: "test", tag_params: ""}],
104
+ @template.tokenize("{{cms:test}}\n{{cms:test}}")
105
+ end
106
+
107
+ def test_nodes
108
+ tokens = @template.tokenize("test")
109
+ nodes = @template.nodes(tokens)
110
+ assert_equal ["test"], nodes
111
+ end
112
+
113
+ def test_nodes_with_tags
114
+ tokens = @template.tokenize("test {{cms:test}} content {{cms:test}}")
115
+ nodes = @template.nodes(tokens)
116
+ assert_equal 4, nodes.count
117
+ assert_equal "test ", nodes[0]
118
+ assert nodes[1].is_a?(ContentRendererTest::TestTag)
119
+ assert_equal " content ", nodes[2]
120
+ assert nodes[3].is_a?(ContentRendererTest::TestTag)
121
+ end
122
+
123
+ def test_nodes_with_block_tag
124
+ string = "a {{cms:test_block}} b {{cms:end}} c"
125
+ tokens = @template.tokenize(string)
126
+ nodes = @template.nodes(tokens)
127
+ assert_equal 3, nodes.count
128
+
129
+ assert_equal "a ", nodes[0]
130
+ assert_equal " c", nodes[2]
131
+
132
+ block = nodes[1]
133
+ assert block.is_a?(ContentRendererTest::TestBlockTag)
134
+ assert_equal [" b "], block.nodes
135
+ end
136
+
137
+ def test_nodes_with_block_tag_and_tag
138
+ string = "a {{cms:test_block}} b {{cms:test}} c {{cms:end}} d"
139
+ tokens = @template.tokenize(string)
140
+ nodes = @template.nodes(tokens)
141
+ assert_equal 3, nodes.count
142
+ assert_equal "a ", nodes[0]
143
+ assert_equal " d", nodes[2]
144
+
145
+ block = nodes[1]
146
+ assert block.is_a?(ContentRendererTest::TestBlockTag)
147
+ assert_equal 3, block.nodes.count
148
+ assert_equal " b ", block.nodes[0]
149
+ assert_equal " c ", block.nodes[2]
150
+
151
+ tag = block.nodes[1]
152
+ assert tag.is_a?(ContentRendererTest::TestTag)
153
+ assert_equal ["test tag content"], tag.nodes
154
+ end
155
+
156
+ def test_nodes_with_nested_block_tag
157
+ string = "a {{cms:test_block}} b {{cms:test_block}} c {{cms:end}} d {{cms:end}} e"
158
+ tokens = @template.tokenize(string)
159
+ nodes = @template.nodes(tokens)
160
+ assert_equal 3, nodes.count
161
+ assert_equal "a ", nodes[0]
162
+ assert_equal " e", nodes[2]
163
+
164
+ block = nodes[1]
165
+ assert block.is_a?(ContentRendererTest::TestBlockTag)
166
+ assert_equal 3, block.nodes.count
167
+ assert_equal " b ", block.nodes[0]
168
+ assert_equal " d ", block.nodes[2]
169
+
170
+ block = block.nodes[1]
171
+ assert_equal [" c "], block.nodes
172
+ end
173
+
174
+ def test_nodes_with_unclosed_block_tag
175
+ string = "a {{cms:test_block}} b"
176
+ tokens = @template.tokenize(string)
177
+ assert_exception_raised ComfortableMexicanSofa::Content::Renderer::SyntaxError, "unclosed block detected" do
178
+ @template.nodes(tokens)
179
+ end
180
+ end
181
+
182
+ def test_nodes_with_closed_tag
183
+ string = "a {{cms:end}} b"
184
+ tokens = @template.tokenize(string)
185
+ assert_exception_raised ComfortableMexicanSofa::Content::Renderer::SyntaxError, "closing unopened block" do
186
+ @template.nodes(tokens)
187
+ end
188
+ end
189
+
190
+ def test_sanitize_erb
191
+ out = @template.sanitize_erb("<% test %>", false)
192
+ assert_equal "&lt;% test %&gt;", out
193
+
194
+ out = @template.sanitize_erb("<% test %>", true)
195
+ assert_equal "<% test %>", out
196
+ end
197
+
198
+ def test_render
199
+ out = render_string("test")
200
+ assert_equal "test", out
201
+ end
202
+
203
+ def test_render_with_tag
204
+ out = render_string("a {{cms:text content}} z")
205
+ assert_equal "a content z", out
206
+ end
207
+
208
+ def test_render_with_erb
209
+ out = render_string("<%= 1 + 1 %>")
210
+ assert_equal "&lt;%= 1 + 1 %&gt;", out
211
+ end
212
+
213
+ def test_render_with_erb_allowed
214
+ ComfortableMexicanSofa.config.allow_erb = true
215
+ out = render_string("<%= 1 + 1 %>")
216
+ assert_equal "<%= 1 + 1 %>", out
217
+ end
218
+
219
+ def test_render_with_erb_allowed_via_tag
220
+ out = render_string("{{cms:partial path}}")
221
+ assert_equal "<%= render partial: '@path', locals: {} %>", out
222
+ end
223
+
224
+ def test_render_with_nested_tag
225
+ string = "a {{cms:text content}} b"
226
+ comfy_cms_fragments(:default).update_column(:content, "c {{cms:snippet default}} d")
227
+ comfy_cms_snippets(:default).update_column(:content, "e {{cms:helper test}} f")
228
+ out = render_string(string)
229
+ assert_equal "a c e <%= test() %> f d b", out
230
+ end
231
+
232
+ def test_render_stack_overflow
233
+ # making self-referencing content loop here
234
+ comfy_cms_snippets(:default).update_column(:content, "a {{cms:snippet default}} b")
235
+ message = "Deep tag nesting or recursive nesting detected"
236
+ assert_exception_raised ComfortableMexicanSofa::Content::Renderer::Error, message do
237
+ render_string("{{cms:snippet default}}")
238
+ end
239
+ end
240
+ end