locomotivecms_steam 0.1.2.pre.beta → 1.0.0.pre.alpha

Sign up to get free protection for your applications and to get access to all the features.
Files changed (355) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.travis.yml +8 -1
  4. data/Gemfile +17 -8
  5. data/Gemfile.lock +160 -113
  6. data/LICENSE +1 -1
  7. data/README.md +36 -15
  8. data/Rakefile +27 -1
  9. data/bin/steam.rb +97 -0
  10. data/config/locales/en.yml +2 -1
  11. data/config/locales/fr.yml +2 -1
  12. data/lib/locomotive/steam.rb +28 -19
  13. data/lib/locomotive/steam/adapters/concerns/key.rb +15 -0
  14. data/lib/locomotive/steam/adapters/filesystem.rb +124 -0
  15. data/lib/locomotive/steam/adapters/filesystem/sanitizer.rb +54 -0
  16. data/lib/locomotive/steam/adapters/filesystem/sanitizers/content_entry.rb +86 -0
  17. data/lib/locomotive/steam/adapters/filesystem/sanitizers/content_type.rb +21 -0
  18. data/lib/locomotive/steam/adapters/filesystem/sanitizers/page.rb +160 -0
  19. data/lib/locomotive/steam/adapters/filesystem/sanitizers/simple.rb +15 -0
  20. data/lib/locomotive/steam/adapters/filesystem/sanitizers/snippet.rb +33 -0
  21. data/lib/locomotive/steam/adapters/filesystem/simple_cache_store.rb +38 -0
  22. data/lib/locomotive/steam/adapters/filesystem/yaml_loader.rb +47 -0
  23. data/lib/locomotive/steam/adapters/filesystem/yaml_loaders/content_entry.rb +87 -0
  24. data/lib/locomotive/steam/adapters/filesystem/yaml_loaders/content_type.rb +96 -0
  25. data/lib/locomotive/steam/adapters/filesystem/yaml_loaders/page.rb +145 -0
  26. data/lib/locomotive/steam/adapters/filesystem/yaml_loaders/site.rb +25 -0
  27. data/lib/locomotive/steam/adapters/filesystem/yaml_loaders/snippet.rb +66 -0
  28. data/lib/locomotive/steam/adapters/filesystem/yaml_loaders/theme_asset.rb +21 -0
  29. data/lib/locomotive/steam/adapters/filesystem/yaml_loaders/translation.rb +72 -0
  30. data/lib/locomotive/steam/adapters/memory.rb +55 -0
  31. data/lib/locomotive/steam/adapters/memory/condition.rb +103 -0
  32. data/lib/locomotive/steam/adapters/memory/dataset.rb +77 -0
  33. data/lib/locomotive/steam/adapters/memory/order.rb +60 -0
  34. data/lib/locomotive/steam/adapters/memory/query.rb +116 -0
  35. data/lib/locomotive/steam/adapters/mongodb.rb +83 -0
  36. data/lib/locomotive/steam/adapters/mongodb/dataset.rb +20 -0
  37. data/lib/locomotive/steam/adapters/mongodb/origin.rb +3 -0
  38. data/lib/locomotive/steam/adapters/mongodb/query.rb +82 -0
  39. data/lib/locomotive/steam/configuration.rb +106 -2
  40. data/lib/locomotive/steam/core_ext.rb +2 -1
  41. data/lib/locomotive/steam/core_ext/hash.rb +31 -19
  42. data/lib/locomotive/steam/core_ext/kernel.rb +14 -0
  43. data/lib/locomotive/steam/core_ext/string.rb +35 -6
  44. data/lib/locomotive/steam/decorators/i18n_decorator.rb +99 -0
  45. data/lib/locomotive/steam/decorators/template_decorator.rb +37 -0
  46. data/lib/locomotive/steam/entities/content_entry.rb +151 -0
  47. data/lib/locomotive/steam/entities/content_type.rb +44 -6
  48. data/lib/locomotive/steam/entities/content_type_field.rb +71 -0
  49. data/lib/locomotive/steam/entities/editable_element.rb +21 -0
  50. data/lib/locomotive/steam/entities/page.rb +48 -127
  51. data/lib/locomotive/steam/entities/site.rb +36 -27
  52. data/lib/locomotive/steam/entities/snippet.rb +20 -0
  53. data/lib/locomotive/steam/entities/theme_asset.rb +9 -0
  54. data/lib/locomotive/steam/entities/translation.rb +15 -0
  55. data/lib/locomotive/steam/initializers.rb +0 -4
  56. data/lib/locomotive/steam/initializers/dragonfly.rb +51 -11
  57. data/lib/locomotive/steam/initializers/i18n.rb +6 -3
  58. data/lib/locomotive/steam/initializers/sprockets.rb +4 -1
  59. data/lib/locomotive/steam/liquid.rb +4 -7
  60. data/lib/locomotive/steam/liquid/drops/base.rb +0 -1
  61. data/lib/locomotive/steam/liquid/drops/content_entry.rb +37 -16
  62. data/lib/locomotive/steam/liquid/drops/content_entry_collection.rb +77 -0
  63. data/lib/locomotive/steam/liquid/drops/content_types.rb +5 -102
  64. data/lib/locomotive/steam/liquid/drops/current_user.rb +23 -0
  65. data/lib/locomotive/steam/liquid/drops/i18n_base.rb +39 -0
  66. data/lib/locomotive/steam/liquid/drops/page.rb +77 -11
  67. data/lib/locomotive/steam/liquid/drops/session_proxy.rb +1 -1
  68. data/lib/locomotive/steam/liquid/drops/site.rb +14 -8
  69. data/lib/locomotive/steam/liquid/drops/upload_file.rb +23 -0
  70. data/lib/locomotive/steam/liquid/errors.rb +3 -9
  71. data/lib/locomotive/steam/liquid/filters/base.rb +62 -0
  72. data/lib/locomotive/steam/liquid/filters/date.rb +85 -61
  73. data/lib/locomotive/steam/liquid/filters/html.rb +30 -115
  74. data/lib/locomotive/steam/liquid/filters/misc.rb +6 -5
  75. data/lib/locomotive/steam/liquid/filters/pagination.rb +55 -0
  76. data/lib/locomotive/steam/liquid/filters/resize.rb +2 -3
  77. data/lib/locomotive/steam/liquid/filters/text.rb +15 -15
  78. data/lib/locomotive/steam/liquid/filters/translate.rb +5 -14
  79. data/lib/locomotive/steam/liquid/patches.rb +29 -23
  80. data/lib/locomotive/steam/liquid/tags/concerns/i18n_page.rb +36 -0
  81. data/lib/locomotive/steam/liquid/tags/concerns/path.rb +114 -0
  82. data/lib/locomotive/steam/liquid/tags/consume.rb +39 -43
  83. data/lib/locomotive/steam/liquid/tags/csrf.rb +21 -12
  84. data/lib/locomotive/steam/liquid/tags/editable.rb +1 -3
  85. data/lib/locomotive/steam/liquid/tags/editable/base.rb +54 -15
  86. data/lib/locomotive/steam/liquid/tags/editable/control.rb +17 -4
  87. data/lib/locomotive/steam/liquid/tags/editable/file.rb +34 -2
  88. data/lib/locomotive/steam/liquid/tags/editable/text.rb +54 -2
  89. data/lib/locomotive/steam/liquid/tags/extends.rb +45 -8
  90. data/lib/locomotive/steam/liquid/tags/fetch_page.rb +38 -0
  91. data/lib/locomotive/steam/liquid/tags/google_analytics.rb +25 -12
  92. data/lib/locomotive/steam/liquid/tags/hybrid.rb +24 -12
  93. data/lib/locomotive/steam/liquid/tags/inherited_block.rb +39 -0
  94. data/lib/locomotive/steam/liquid/tags/inline_editor.rb +14 -4
  95. data/lib/locomotive/steam/liquid/tags/link_to.rb +16 -27
  96. data/lib/locomotive/steam/liquid/tags/locale_switcher.rb +45 -56
  97. data/lib/locomotive/steam/liquid/tags/model_form.rb +72 -0
  98. data/lib/locomotive/steam/liquid/tags/nav.rb +65 -57
  99. data/lib/locomotive/steam/liquid/tags/paginate.rb +79 -47
  100. data/lib/locomotive/steam/liquid/tags/path_to.rb +8 -20
  101. data/lib/locomotive/steam/liquid/tags/seo.rb +8 -8
  102. data/lib/locomotive/steam/liquid/tags/session_assign.rb +6 -8
  103. data/lib/locomotive/steam/liquid/tags/snippet.rb +26 -42
  104. data/lib/locomotive/steam/liquid/tags/with_scope.rb +44 -26
  105. data/lib/locomotive/steam/middlewares.rb +7 -13
  106. data/lib/locomotive/steam/middlewares/default_env.rb +25 -0
  107. data/lib/locomotive/steam/middlewares/dynamic_assets.rb +34 -17
  108. data/lib/locomotive/steam/middlewares/entry_submission.rb +117 -79
  109. data/lib/locomotive/steam/middlewares/favicon.rb +5 -2
  110. data/lib/locomotive/steam/middlewares/helpers.rb +44 -0
  111. data/lib/locomotive/steam/middlewares/locale.rb +25 -17
  112. data/lib/locomotive/steam/middlewares/locale_redirection.rb +62 -0
  113. data/lib/locomotive/steam/middlewares/logging.rb +7 -3
  114. data/lib/locomotive/steam/middlewares/page.rb +17 -48
  115. data/lib/locomotive/steam/middlewares/path.rb +5 -8
  116. data/lib/locomotive/steam/middlewares/renderer.rb +65 -106
  117. data/lib/locomotive/steam/middlewares/robots.rb +20 -0
  118. data/lib/locomotive/steam/middlewares/site.rb +42 -0
  119. data/lib/locomotive/steam/middlewares/sitemap.rb +94 -0
  120. data/lib/locomotive/steam/middlewares/stack_proxy.rb +46 -0
  121. data/lib/locomotive/steam/middlewares/templatized_page.rb +40 -14
  122. data/lib/locomotive/steam/middlewares/threadsafe.rb +65 -0
  123. data/lib/locomotive/steam/middlewares/timezone.rb +10 -6
  124. data/lib/locomotive/steam/models.rb +12 -0
  125. data/lib/locomotive/steam/models/associations/belongs_to.rb +18 -0
  126. data/lib/locomotive/steam/models/associations/embedded.rb +43 -0
  127. data/lib/locomotive/steam/models/associations/has_many.rb +22 -0
  128. data/lib/locomotive/steam/models/associations/many_to_many.rb +22 -0
  129. data/lib/locomotive/steam/models/associations/referenced.rb +48 -0
  130. data/lib/locomotive/steam/models/concerns/validation.rb +58 -0
  131. data/lib/locomotive/steam/models/entity.rb +40 -0
  132. data/lib/locomotive/steam/models/i18n_field.rb +42 -0
  133. data/lib/locomotive/steam/models/mapper.rb +119 -0
  134. data/lib/locomotive/steam/models/pager.rb +53 -0
  135. data/lib/locomotive/steam/models/repository.rb +101 -0
  136. data/lib/locomotive/steam/models/scope.rb +31 -0
  137. data/lib/locomotive/steam/repositories.rb +51 -0
  138. data/lib/locomotive/steam/repositories/content_entry_repository.rb +183 -0
  139. data/lib/locomotive/steam/repositories/content_type_field_repository.rb +50 -0
  140. data/lib/locomotive/steam/repositories/content_type_field_select_option_repository.rb +23 -0
  141. data/lib/locomotive/steam/repositories/content_type_repository.rb +38 -0
  142. data/lib/locomotive/steam/repositories/editable_element_repository.rb +20 -0
  143. data/lib/locomotive/steam/repositories/page_repository.rb +86 -0
  144. data/lib/locomotive/steam/repositories/site_repository.rb +29 -0
  145. data/lib/locomotive/steam/repositories/snippet_repository.rb +19 -0
  146. data/lib/locomotive/steam/repositories/theme_asset_repository.rb +24 -0
  147. data/lib/locomotive/steam/repositories/translation_repository.rb +17 -0
  148. data/lib/locomotive/steam/server.rb +61 -40
  149. data/lib/locomotive/steam/services.rb +120 -1
  150. data/lib/locomotive/steam/services/asset_host_service.rb +51 -0
  151. data/lib/locomotive/steam/services/concerns/decorator.rb +35 -0
  152. data/lib/locomotive/steam/services/csrf_protection_service.rb +13 -0
  153. data/lib/locomotive/steam/services/editable_element_service.rb +19 -0
  154. data/lib/locomotive/steam/services/entry_submission_service.rb +91 -0
  155. data/lib/locomotive/steam/services/external_api_service.rb +55 -0
  156. data/lib/locomotive/steam/services/image_resizer_service.rb +49 -0
  157. data/lib/locomotive/steam/services/liquid_parser_service.rb +23 -0
  158. data/lib/locomotive/steam/services/markdown_service.rb +17 -0
  159. data/lib/locomotive/steam/services/no_cache_service.rb +17 -0
  160. data/lib/locomotive/steam/services/page_finder_service.rb +44 -0
  161. data/lib/locomotive/steam/services/parent_finder_service.rb +23 -0
  162. data/lib/locomotive/steam/services/site_finder_service.rb +13 -0
  163. data/lib/locomotive/steam/services/snippet_finder_service.rb +17 -0
  164. data/lib/locomotive/steam/services/textile_service.rb +17 -0
  165. data/lib/locomotive/steam/services/theme_asset_url_service.rb +43 -0
  166. data/lib/locomotive/steam/services/translator_service.rb +34 -0
  167. data/lib/locomotive/steam/services/url_builder_service.rb +40 -0
  168. data/lib/locomotive/steam/version.rb +1 -1
  169. data/locomotivecms_steam.gemspec +34 -28
  170. data/script/ci/before_build.sh +4 -0
  171. data/spec/fixtures/default/app/content_types/bands.yml +3 -1
  172. data/spec/fixtures/default/app/content_types/events.yml +2 -2
  173. data/spec/fixtures/default/app/views/pages/about_us.liquid.haml +2 -1
  174. data/spec/fixtures/default/app/views/pages/archives.liquid.haml +6 -0
  175. data/spec/fixtures/default/app/views/pages/basic.liquid.haml +1 -0
  176. data/spec/fixtures/default/app/views/pages/contest.liquid.haml +2 -1
  177. data/spec/fixtures/default/app/views/pages/events.fr.liquid +4 -0
  178. data/spec/fixtures/default/app/views/pages/events.liquid.haml +23 -1
  179. data/spec/fixtures/default/app/views/pages/filtered.liquid.haml +16 -5
  180. data/spec/fixtures/default/app/views/pages/grunge_bands.liquid.haml +2 -1
  181. data/spec/fixtures/default/app/views/pages/index.liquid.haml +12 -11
  182. data/spec/fixtures/default/app/views/pages/music.liquid.haml +1 -1
  183. data/spec/fixtures/default/app/views/pages/songs.liquid +6 -0
  184. data/spec/fixtures/default/app/views/pages/songs/song-number-1.liquid.haml +5 -0
  185. data/spec/fixtures/default/app/views/pages/store.liquid +2 -1
  186. data/spec/fixtures/default/app/views/pages/tags.liquid +6 -0
  187. data/spec/fixtures/default/app/views/pages/unlisted_pages.liquid.haml +2 -1
  188. data/spec/fixtures/default/app/views/snippets/song.fr.liquid.haml +1 -1
  189. data/spec/fixtures/default/config/deploy.yml +2 -2
  190. data/spec/fixtures/default/config/site.yml +7 -1
  191. data/spec/fixtures/default/data/bands.yml +3 -0
  192. data/spec/fixtures/mongodb/locomotive_accounts.bson +0 -0
  193. data/spec/fixtures/mongodb/locomotive_accounts.metadata.json +1 -0
  194. data/spec/fixtures/mongodb/locomotive_content_assets.bson +0 -0
  195. data/spec/fixtures/mongodb/locomotive_content_assets.metadata.json +1 -0
  196. data/spec/fixtures/mongodb/locomotive_content_entries.bson +0 -0
  197. data/spec/fixtures/mongodb/locomotive_content_entries.metadata.json +1 -0
  198. data/spec/fixtures/mongodb/locomotive_content_types.bson +0 -0
  199. data/spec/fixtures/mongodb/locomotive_content_types.metadata.json +1 -0
  200. data/spec/fixtures/mongodb/locomotive_pages.bson +0 -0
  201. data/spec/fixtures/mongodb/locomotive_pages.metadata.json +1 -0
  202. data/spec/fixtures/mongodb/locomotive_sites.bson +0 -0
  203. data/spec/fixtures/mongodb/locomotive_sites.metadata.json +1 -0
  204. data/spec/fixtures/mongodb/locomotive_snippets.bson +0 -0
  205. data/spec/fixtures/mongodb/locomotive_snippets.metadata.json +1 -0
  206. data/spec/fixtures/mongodb/locomotive_theme_assets.bson +0 -0
  207. data/spec/fixtures/mongodb/locomotive_theme_assets.metadata.json +1 -0
  208. data/spec/fixtures/mongodb/locomotive_translations.bson +0 -0
  209. data/spec/fixtures/mongodb/locomotive_translations.metadata.json +1 -0
  210. data/spec/fixtures/mongodb/sessions.bson +0 -0
  211. data/spec/fixtures/mongodb/sessions.metadata.json +1 -0
  212. data/spec/fixtures/mongodb/system.indexes.bson +0 -0
  213. data/spec/integration/integration_helper.rb +2 -2
  214. data/spec/integration/liquid/tags/paginate_spec.rb +79 -0
  215. data/spec/integration/repositories/content_entry_repository_spec.rb +94 -0
  216. data/spec/integration/repositories/content_type_repository_spec.rb +69 -0
  217. data/spec/integration/repositories/page_repository_spec.rb +105 -0
  218. data/spec/integration/repositories/site_repository_spec.rb +45 -0
  219. data/spec/integration/repositories/snippet_repository_spec.rb +50 -0
  220. data/spec/integration/repositories/theme_asset_repository_spec.rb +48 -0
  221. data/spec/integration/repositories/translation_repository_spec.rb +50 -0
  222. data/spec/integration/server/assets_spec.rb +60 -0
  223. data/spec/integration/server/basic_spec.rb +100 -100
  224. data/spec/integration/server/contact_form_spec.rb +96 -25
  225. data/spec/integration/server/liquid_spec.rb +19 -41
  226. data/spec/integration/server/nav_spec.rb +49 -0
  227. data/spec/integration/server/session_spec.rb +33 -0
  228. data/spec/integration/server/sitemap_spec.rb +34 -0
  229. data/spec/integration/server/with_scope_spec.rb +28 -2
  230. data/spec/integration/services/external_api_service_spec.rb +20 -0
  231. data/spec/locales/locales_spec.rb +7 -7
  232. data/spec/spec_helper.rb +27 -13
  233. data/spec/support.rb +5 -1
  234. data/spec/support/cache_store.rb +3 -0
  235. data/spec/support/helpers.rb +20 -23
  236. data/spec/support/liquid.rb +29 -0
  237. data/spec/support/pry.rb +4 -0
  238. data/spec/support/time.rb +3 -0
  239. data/spec/unit/adapters/filesystem/yaml_loaders/content_entry_spec.rb +50 -0
  240. data/spec/unit/adapters/filesystem/yaml_loaders/content_type_spec.rb +25 -0
  241. data/spec/unit/adapters/filesystem/yaml_loaders/page_spec.rb +25 -0
  242. data/spec/unit/adapters/filesystem/yaml_loaders/site_spec.rb +19 -0
  243. data/spec/unit/adapters/filesystem/yaml_loaders/snippet_spec.rb +26 -0
  244. data/spec/unit/adapters/filesystem/yaml_loaders/translation_spec.rb +25 -0
  245. data/spec/unit/adapters/filesystem_adapter_spec.rb +53 -0
  246. data/spec/unit/adapters/memory/condition_spec.rb +125 -0
  247. data/spec/unit/adapters/memory/dataset_spec.rb +73 -0
  248. data/spec/unit/adapters/memory/order_spec.rb +67 -0
  249. data/spec/unit/adapters/memory/query_spec.rb +85 -0
  250. data/spec/unit/adapters/memory_adapter_spec.rb +36 -0
  251. data/spec/unit/adapters/mongodb/query_spec.rb +68 -0
  252. data/spec/unit/adapters/mongodb_adapter_spec.rb +17 -0
  253. data/spec/unit/configuration_spec.rb +29 -0
  254. data/spec/unit/core_ext/string_spec.rb +44 -0
  255. data/spec/unit/decorators/i18n_decorator_spec.rb +80 -0
  256. data/spec/unit/entities/content_entry_spec.rb +159 -0
  257. data/spec/unit/entities/content_type_field_spec.rb +67 -0
  258. data/spec/unit/entities/content_type_spec.rb +59 -0
  259. data/spec/unit/entities/page_spec.rb +40 -34
  260. data/spec/unit/entities/site_spec.rb +56 -5
  261. data/spec/unit/initializers/dragonfly_spec.rb +31 -0
  262. data/spec/unit/liquid/drops/content_entry_collection_spec.rb +81 -0
  263. data/spec/unit/liquid/drops/content_entry_spec.rb +99 -0
  264. data/spec/unit/liquid/drops/content_types_spec.rb +25 -0
  265. data/spec/unit/liquid/drops/current_user_spec.rb +45 -0
  266. data/spec/unit/liquid/drops/page_spec.rb +134 -0
  267. data/spec/unit/liquid/drops/session_proxy_spec.rb +13 -0
  268. data/spec/unit/liquid/drops/site_spec.rb +49 -0
  269. data/spec/unit/liquid/filters/date_spec.rb +160 -0
  270. data/spec/unit/liquid/filters/html_spec.rb +263 -0
  271. data/spec/unit/liquid/filters/misc_spec.rb +108 -0
  272. data/spec/unit/liquid/filters/pagination_spec.rb +42 -0
  273. data/spec/unit/liquid/filters/resize_spec.rb +36 -0
  274. data/spec/unit/liquid/filters/text_spec.rb +56 -0
  275. data/spec/unit/liquid/filters/translate_spec.rb +33 -0
  276. data/spec/unit/liquid/patches_spec.rb +50 -0
  277. data/spec/unit/liquid/tags/consume_spec.rb +87 -0
  278. data/spec/unit/liquid/tags/csrf_spec.rb +47 -0
  279. data/spec/unit/liquid/tags/editable/control_spec.rb +109 -0
  280. data/spec/unit/liquid/tags/editable/file_spec.rb +116 -0
  281. data/spec/unit/liquid/tags/editable/text_spec.rb +139 -0
  282. data/spec/unit/liquid/tags/extends_spec.rb +38 -0
  283. data/spec/unit/liquid/tags/fetch_page_spec.rb +39 -0
  284. data/spec/unit/liquid/tags/google_analytics_spec.rb +16 -0
  285. data/spec/unit/liquid/tags/inherited_block_spec.rb +33 -0
  286. data/spec/unit/liquid/tags/link_to_spec.rb +112 -0
  287. data/spec/unit/liquid/tags/locale_switcher_spec.rb +58 -0
  288. data/spec/unit/liquid/tags/model_form_spec.rb +35 -0
  289. data/spec/unit/liquid/tags/nav_spec.rb +184 -111
  290. data/spec/unit/liquid/tags/paginate_spec.rb +131 -0
  291. data/spec/unit/liquid/tags/path_to_spec.rb +100 -0
  292. data/spec/unit/liquid/tags/seo_spec.rb +85 -0
  293. data/spec/unit/liquid/tags/session_assign_spec.rb +51 -0
  294. data/spec/unit/liquid/tags/snippet_spec.rb +42 -0
  295. data/spec/unit/liquid/tags/with_scope_spec.rb +66 -0
  296. data/spec/unit/middlewares/dynamic_assets_spec.rb +25 -0
  297. data/spec/unit/middlewares/locale_redirection_spec.rb +105 -0
  298. data/spec/unit/middlewares/renderer_spec.rb +29 -0
  299. data/spec/unit/middlewares/stack_proxy_spec.rb +67 -0
  300. data/spec/unit/models/mapper_spec.rb +75 -0
  301. data/spec/unit/models/pager_spec.rb +82 -0
  302. data/spec/unit/models/repository_spec.rb +46 -0
  303. data/spec/unit/models/scope_spec.rb +27 -0
  304. data/spec/unit/repositories/content_entry_repository_spec.rb +347 -0
  305. data/spec/unit/repositories/content_type_repository_spec.rb +126 -0
  306. data/spec/unit/repositories/page_repository_spec.rb +365 -0
  307. data/spec/unit/repositories/site_repository_spec.rb +41 -0
  308. data/spec/unit/repositories/snippet_repository_spec.rb +37 -0
  309. data/spec/unit/repositories/theme_asset_repository_spec.rb +35 -0
  310. data/spec/unit/repositories/translation_repository_spec.rb +34 -0
  311. data/spec/unit/services/asset_host_service_spec.rb +79 -0
  312. data/spec/unit/services/entry_submission_service_spec.rb +143 -0
  313. data/spec/unit/services/external_api_service_spec.rb +80 -0
  314. data/spec/unit/services/image_resizer_service_spec.rb +75 -0
  315. data/spec/unit/services/markdown_service_spec.rb +36 -0
  316. data/spec/unit/services/parent_finder_service_spec.rb +41 -0
  317. data/spec/unit/services/textile_service_spec.rb +34 -0
  318. data/spec/unit/services/translator_service_spec.rb +65 -0
  319. data/spec/unit/services/url_builder_service_spec.rb +48 -0
  320. data/spec/unit/services_spec.rb +25 -0
  321. metadata +462 -119
  322. data/example/server.rb +0 -31
  323. data/lib/locomotive/steam/decorators.rb +0 -1
  324. data/lib/locomotive/steam/decorators/page_decorator.rb +0 -50
  325. data/lib/locomotive/steam/exceptions.rb +0 -62
  326. data/lib/locomotive/steam/liquid/scopeable.rb +0 -149
  327. data/lib/locomotive/steam/liquid/tags/editable/long_text.rb +0 -15
  328. data/lib/locomotive/steam/liquid/tags/editable/short_text.rb +0 -20
  329. data/lib/locomotive/steam/liquid/tags/path_helper.rb +0 -98
  330. data/lib/locomotive/steam/loaders/yml/pages_loader.rb +0 -193
  331. data/lib/locomotive/steam/loaders/yml/site_loader.rb +0 -49
  332. data/lib/locomotive/steam/loaders/yml/utils/localized_tree.rb +0 -33
  333. data/lib/locomotive/steam/loaders/yml/utils/yaml_front_matters_template.rb +0 -66
  334. data/lib/locomotive/steam/loaders/yml_loader.rb +0 -33
  335. data/lib/locomotive/steam/mapper.rb +0 -86
  336. data/lib/locomotive/steam/middlewares/base.rb +0 -65
  337. data/lib/locomotive/steam/middlewares/stack.rb +0 -66
  338. data/lib/locomotive/steam/middlewares/static_assets.rb +0 -25
  339. data/lib/locomotive/steam/monkey_patches.rb +0 -3
  340. data/lib/locomotive/steam/monkey_patches/haml.rb +0 -17
  341. data/lib/locomotive/steam/repositories/content_types_repository.rb +0 -14
  342. data/lib/locomotive/steam/repositories/pages_repository.rb +0 -23
  343. data/lib/locomotive/steam/repositories/sites_repository.rb +0 -16
  344. data/lib/locomotive/steam/services/dragonfly.rb +0 -49
  345. data/lib/locomotive/steam/services/external_api.rb +0 -47
  346. data/lib/locomotive/steam/services/markdown.rb +0 -20
  347. data/lib/locomotive/steam/standalone_server.rb +0 -30
  348. data/spec/unit/decorators/page_decorator_spec.rb +0 -55
  349. data/spec/unit/loaders/pages_loader_spec.rb +0 -42
  350. data/spec/unit/loaders/site_loader_spec.rb +0 -21
  351. data/spec/unit/loaders/utils/localized_tree_spec.rb +0 -33
  352. data/spec/unit/loaders/utils/yaml_front_matters_template_spec.rb +0 -39
  353. data/spec/unit/middlewares/base_spec.rb +0 -20
  354. data/spec/unit/middlewares/page_spec.rb +0 -51
  355. data/spec/unit/repositories/pages_spec.rb +0 -11
@@ -4,31 +4,40 @@ module Locomotive
4
4
  module Tags
5
5
  module Csrf
6
6
 
7
- class Param < ::Liquid::Tag
8
-
7
+ class Base < ::Liquid::Tag
9
8
  def render(context)
10
- %{<input type="hidden" name="authenticity_token" value="helloworld" />}
11
- end
9
+ service = context.registers[:services].csrf_protection
12
10
 
11
+ if service.enabled?
12
+ render_csrf(service)
13
+
14
+ else
15
+ ''
16
+ end
17
+ end
13
18
  end
14
19
 
15
- class Meta < ::Liquid::Tag
20
+ class Param < Base
21
+ def render_csrf(service)
22
+ %(<input type="hidden" name="#{service.field}" value="#{service.token}" />)
23
+ end
24
+ end
16
25
 
17
- def render(context)
26
+ class Meta < Base
27
+ def render_csrf(service)
18
28
  %{
19
- <meta name="csrf-param" content="authenticity_token" />
20
- <meta name="csrf-token" content="helloworld" />
29
+ <meta name="csrf-param" content="#{service.field}" />
30
+ <meta name="csrf-token" content="#{service.token}" />
21
31
  }
22
32
  end
23
-
24
33
  end
25
34
 
26
35
  end
27
36
 
28
- ::Liquid::Template.register_tag('csrf_param', Csrf::Param)
29
- ::Liquid::Template.register_tag('csrf_meta', Csrf::Meta)
37
+ ::Liquid::Template.register_tag('csrf_param'.freeze, Csrf::Param)
38
+ ::Liquid::Template.register_tag('csrf_meta'.freeze, Csrf::Meta)
30
39
 
31
40
  end
32
41
  end
33
42
  end
34
- end
43
+ end
@@ -1,6 +1,4 @@
1
1
  require_relative 'editable/base'
2
2
  require_relative 'editable/text'
3
- require_relative 'editable/short_text'
4
- require_relative 'editable/long_text'
5
3
  require_relative 'editable/file'
6
- require_relative 'editable/control'
4
+ require_relative 'editable/control'
@@ -5,40 +5,79 @@ module Locomotive
5
5
  module Editable
6
6
  class Base < ::Liquid::Block
7
7
 
8
- Syntax = /(#{::Liquid::QuotedFragment})(\s*,\s*#{::Liquid::Expression}+)?/
8
+ Syntax = /(#{::Liquid::QuotedFragment})(\s*,\s*#{::Liquid::Expression}+)?/o
9
9
 
10
- def initialize(tag_name, markup, tokens, options)
10
+ attr_accessor :slug
11
+
12
+ def initialize(tag_name, markup, options)
11
13
  if markup =~ Syntax
12
- @slug = $1.gsub(/[\"\']/, '')
13
- @_options = {}
14
- markup.scan(::Liquid::TagAttributes) { |key, value| @_options[key.to_sym] = value.gsub(/^'/, '').gsub(/'$/, '') }
14
+ @slug = $1.gsub(/[\"\']/, '')
15
+ @element_options = { fixed: false }
16
+ markup.scan(::Liquid::TagAttributes) { |key, value| @element_options[key.to_sym] = value.gsub(/^[\"\']/, '').gsub(/[\"\']$/, '') }
15
17
  else
16
- raise ::Liquid::SyntaxError.new(options[:locale].t("errors.syntax.#{tag_name}"), options[:line])
18
+ raise ::Liquid::SyntaxError.new("Valid syntax: #{tag_name} <slug>(, <options>)")
17
19
  end
18
20
 
19
21
  super
20
22
  end
21
23
 
22
- def render(context)
23
- current_page = context.registers[:page]
24
+ def parse(tokens)
25
+ super
24
26
 
25
- element = current_page.find_editable_element(self.current_block_name(context), @slug)
27
+ if listener = options[:events_listener]
28
+ listener.emit(@tag_name.to_sym, page: options[:page], attributes: default_element_attributes)
29
+ end
30
+ end
31
+
32
+ def render(context)
33
+ service = context.registers[:services].editable_element
34
+ page = context.registers[:page]
35
+ block = context['block'].try(:name)
26
36
 
27
- if element.present?
37
+ if element = service.find(page, block, @slug)
28
38
  render_element(context, element)
29
39
  else
40
+ # Locomotive::Common::Logger.error "[#{page.fullpath}] missing #{@tag_name} \"#{@slug}\" (#{context['block'].try(:name) || 'default'})"
30
41
  super
31
42
  end
32
43
  end
33
44
 
34
45
  protected
35
46
 
36
- def render_element(context, element)
37
- element.content
47
+ def default_element_attributes
48
+ {
49
+ block: self.current_inherited_block_name,
50
+ slug: @slug,
51
+ hint: @element_options[:hint],
52
+ priority: @element_options[:priority] || 0,
53
+ fixed: !!@element_options[:fixed],
54
+ disabled: false,
55
+ inline_editing: true,
56
+ from_parent: false
57
+ }
58
+ end
59
+
60
+ def current_inherited_block_name
61
+ @element_options[:block] || current_inherited_block.try(:name)
62
+ end
63
+
64
+ def current_inherited_block
65
+ options[:inherited_blocks].try(:[], :nested).try(:last)
66
+ end
67
+
68
+ def render_default_content
69
+ begin
70
+ if nodelist.all? { |n| n.is_a? String }
71
+ @body.render(::Liquid::Context.new)
72
+ else
73
+ raise ::Liquid::SyntaxError.new("No liquid tags are allowed inside the #{@tag_name} \"#{@slug}\" (block: #{current_inherited_block_name || 'default'})")
74
+ end
75
+ end
38
76
  end
39
77
 
40
- def current_block_name(context)
41
- context['block'].try(:name)
78
+ #:nocov:
79
+ def render_element(element)
80
+ raise 'FIXME: has to be overidden'
42
81
  end
43
82
 
44
83
  end
@@ -47,4 +86,4 @@ module Locomotive
47
86
  end
48
87
  end
49
88
  end
50
- end
89
+ end
@@ -5,15 +5,28 @@ module Locomotive
5
5
  module Editable
6
6
  class Control < Base
7
7
 
8
- def render(context)
9
- super
8
+ protected
9
+
10
+ def default_element_attributes
11
+ super.merge({
12
+ content: render_default_content,
13
+ options: @element_options[:options]
14
+ })
15
+ end
16
+
17
+ def render_element(context, element)
18
+ element.content
19
+ end
20
+
21
+ def render_default_content
22
+ super.try(:strip)
10
23
  end
11
24
 
12
25
  end
13
26
 
14
- ::Liquid::Template.register_tag('editable_control', Control)
27
+ ::Liquid::Template.register_tag('editable_control'.freeze, Control)
15
28
  end
16
29
  end
17
30
  end
18
31
  end
19
- end
32
+ end
@@ -5,11 +5,43 @@ module Locomotive
5
5
  module Editable
6
6
  class File < Base
7
7
 
8
+ protected
9
+
10
+ def default_element_attributes
11
+ super.merge({
12
+ default_source_url: render_default_content.strip
13
+ })
14
+ end
15
+
16
+ def render_element(context, element)
17
+ default_timestamp = context.registers[:page].updated_at.to_i
18
+
19
+ url, timestamp = (if element.source
20
+ [source_url(element), default_timestamp]
21
+ else
22
+ if element.default_source_url.present?
23
+ [element.default_source_url, default_timestamp]
24
+ else
25
+ [render_default_content, nil]
26
+ end
27
+ end)
28
+
29
+ context.registers[:services].asset_host.compute(url, timestamp)
30
+ end
31
+
32
+ def source_url(element)
33
+ if element.source =~ /^https?/
34
+ element.source
35
+ else
36
+ "#{element.base_url}/#{element.source}"
37
+ end
38
+ end
39
+
8
40
  end
9
41
 
10
- ::Liquid::Template.register_tag('editable_file', File)
42
+ ::Liquid::Template.register_tag('editable_file'.freeze, File)
11
43
  end
12
44
  end
13
45
  end
14
46
  end
15
- end
47
+ end
@@ -5,11 +5,63 @@ module Locomotive
5
5
  module Editable
6
6
  class Text < Base
7
7
 
8
+ protected
9
+
10
+ def render_element(context, element)
11
+ with_inline_editing(context, element) do
12
+ if element.default_content?
13
+ render_default_content
14
+ else
15
+ element.content
16
+ end
17
+ end
18
+ end
19
+
20
+ def with_inline_editing(context, element, &block)
21
+ if editable?(context, element)
22
+ %{<span class="locomotive-editable-text" data-element-id="#{element.id}">#{yield}</span>}
23
+ else
24
+ yield
25
+ end
26
+ end
27
+
28
+ def editable?(context, element)
29
+ !!context['inline_editing'] && element.inline_editing?
30
+ end
31
+
32
+ def default_element_attributes
33
+ super.merge(
34
+ content_from_default: self.render_default_content,
35
+ format: @options[:format] || 'html',
36
+ rows: @options[:rows] || 10,
37
+ line_break: @options[:line_break].blank? ? true : @options[:line_break]
38
+ )
39
+ end
40
+
41
+ end
42
+
43
+ ::Liquid::Template.register_tag('editable_text'.freeze, Text)
44
+
45
+ class ShortText < Text
46
+ def initialize(tag_name, markup, options)
47
+ Locomotive::Common::Logger.warn %(The "#{tag_name}" liquid tag is deprecated. Use "editable_text" instead.).yellow
48
+ super
49
+ end
50
+ def default_element_attributes
51
+ super.merge(format: 'raw', rows: 2, line_break: false)
52
+ end
53
+ end
54
+ ::Liquid::Template.register_tag('editable_short_text'.freeze, ShortText)
55
+
56
+ class LongText < ShortText
57
+ def default_element_attributes
58
+ super.merge(format: 'html', rows: 15, line_break: true)
59
+ end
8
60
  end
61
+ ::Liquid::Template.register_tag('editable_long_text'.freeze, LongText)
9
62
 
10
- ::Liquid::Template.register_tag('editable_text', Text)
11
63
  end
12
64
  end
13
65
  end
14
66
  end
15
- end
67
+ end
@@ -4,22 +4,59 @@ module Locomotive
4
4
  module Tags
5
5
  class Extends < ::Liquid::Extends
6
6
 
7
+ private
8
+
7
9
  def parse_parent_template
8
- mounting_point = @options[:mounting_point]
10
+ parent = options[:parent_finder].find(options[:page], @template_name)
11
+
12
+ # no need to go further if the parent does not exist
13
+ raise PageNotFound.new("Page with fullpath '#{@template_name}' was not found") if parent.nil?
9
14
 
10
- page = if @template_name == 'parent'
11
- @options[:page].parent
12
- else
13
- mounting_point.pages[@template_name]
15
+ if listener = options[:events_listener]
16
+ listener.emit(:extends, page: options[:page], parent: parent)
14
17
  end
15
18
 
16
- ::Liquid::Template.parse(page.source, { mounting_point: mounting_point, page: page })
19
+ # the source has already been parsed before
20
+ options[:parser]._parse(parent, options.merge(page: parent))
21
+ # parent.template || ::Liquid::Template.parse(parent.source, options.merge(page: parent))
17
22
  end
18
23
 
19
24
  end
20
25
 
21
- ::Liquid::Template.register_tag('extends', Extends)
26
+ ::Liquid::Template.register_tag('extends'.freeze, Extends)
22
27
  end
23
28
  end
24
29
  end
25
- end
30
+ end
31
+
32
+ # def prepare_parsing
33
+ # super
34
+
35
+ # parent_page = @context[:parent_page]
36
+
37
+ # @context[:page].merge_editable_elements_from_page(parent_page)
38
+
39
+ # @context[:snippets] = parent_page.snippet_dependencies
40
+ # @context[:templates] = ([*parent_page.template_dependencies] + [parent_page.id]).compact
41
+ # end
42
+
43
+ # if @template_name == 'parent'
44
+ # @context[:parent_page] = @context[:cached_parent] || @context[:page].parent
45
+ # else
46
+ # locale = ::Mongoid::Fields::I18n.locale
47
+
48
+ # @context[:parent_page] = @context[:cached_pages].try(:[], @template_name) ||
49
+ # @context[:site].pages.where("fullpath.#{locale}" => @template_name).first
50
+ # end
51
+
52
+ # raise PageNotFound.new("Page with fullpath '#{@template_name}' was not found") if @context[:parent_page].nil?
53
+
54
+ # # be sure to work with a copy of the parent template otherwise there will be conflicts
55
+ # parent_template = @context[:parent_page].template.try(:clone)
56
+
57
+ # raise PageNotTranslated.new("Page with fullpath '#{@template_name}' was not translated") if parent_template.nil?
58
+
59
+ # # force the page to restore the original version of its template (from the serialized version)
60
+ # @context[:parent_page].instance_variable_set(:@template, nil)
61
+
62
+ # parent_template
@@ -0,0 +1,38 @@
1
+ module Locomotive
2
+ module Steam
3
+ module Liquid
4
+ module Tags
5
+
6
+ # Fetch a page from its handle and assign it to a liquid variable.
7
+ #
8
+ # Usage:
9
+ #
10
+ # {% fetch_page about_us as a_page %}
11
+ # <p>{{ a_page.title }}</p>
12
+ #
13
+ class FetchPage < ::Liquid::Tag
14
+
15
+ Syntax = /(#{::Liquid::VariableSignature}+)\s+as\s+(#{::Liquid::VariableSignature}+)/o
16
+
17
+ def initialize(tag_name, markup, options)
18
+ if markup =~ Syntax
19
+ @handle, @var = $1, $2
20
+ else
21
+ raise SyntaxError.new("Syntax Error in 'fetch_page' - Valid syntax: fetch_page page_handle as variable")
22
+ end
23
+
24
+ super
25
+ end
26
+
27
+ def render(context)
28
+ page = context.registers[:repositories].page.by_handle(@handle)
29
+ context.scopes.last[@var] = page
30
+ ''
31
+ end
32
+ end
33
+
34
+ ::Liquid::Template.register_tag('fetch_page'.freeze, FetchPage)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -2,27 +2,40 @@ module Locomotive
2
2
  module Steam
3
3
  module Liquid
4
4
  module Tags
5
- class GoogleAnalytics < ::Liquid::Tag
5
+ class GoogleAnalytics < ::Solid::Tag
6
6
 
7
- Syntax = /(#{::Liquid::Expression}+)?/
7
+ tag_name :google_analytics
8
8
 
9
- def initialize(tag_name, markup, tokens, options)
10
- if markup =~ Syntax
11
- @account_id = $1.gsub('\'', '')
9
+ def display(account_id = nil)
10
+ if account_id.blank?
11
+ raise ::Liquid::SyntaxError.new("Syntax Error in 'google_analytics' - Valid syntax: google_analytics <account_id>")
12
12
  else
13
- raise ::Liquid::SyntaxError.new(options[:locale].t("errors.syntax.google_analytics"), options[:line])
13
+ ga_snippet(account_id)
14
14
  end
15
-
16
- super
17
15
  end
18
16
 
19
- def render(context)
20
- "<!-- google analytics for #{@account_id} -->"
17
+ private
18
+
19
+ def ga_snippet(account_id)
20
+ %{
21
+ <script type="text/javascript">
22
+
23
+ var _gaq = _gaq || [];
24
+ _gaq.push(['_setAccount', '#{account_id}']);
25
+ _gaq.push(['_trackPageview']);
26
+
27
+ (function() \{
28
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
29
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
30
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
31
+ \})();
32
+
33
+ </script>}
21
34
  end
35
+
22
36
  end
23
37
 
24
- ::Liquid::Template.register_tag('google_analytics', GoogleAnalytics)
25
38
  end
26
39
  end
27
40
  end
28
- end
41
+ end