releaf-core 0.2.1

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 (288) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +24 -0
  3. data/app/assets/fonts/releaf/RobotoRegular_normal_400.ttf +0 -0
  4. data/app/assets/fonts/releaf/RobotoRegular_normal_400.woff +0 -0
  5. data/app/assets/fonts/releaf/RobotoRegular_normal_400.woff2 +0 -0
  6. data/app/assets/images/releaf/icons/apple-touch-icon-114x114-precomposed.png +0 -0
  7. data/app/assets/images/releaf/icons/apple-touch-icon-152x152-precomposed.png +0 -0
  8. data/app/assets/images/releaf/icons/apple-touch-icon-72x72-precomposed.png +0 -0
  9. data/app/assets/images/releaf/icons/favicon.ico +0 -0
  10. data/app/assets/images/releaf/icons/favicon.png +0 -0
  11. data/app/assets/images/releaf/icons/msapplication-tile-144x144.png +0 -0
  12. data/app/assets/images/releaf/logo-login.png +0 -0
  13. data/app/assets/images/releaf/logo.png +0 -0
  14. data/app/assets/javascripts/ckeditor/plugins/mediaembed/icons/hidpi/mediaembed.png +0 -0
  15. data/app/assets/javascripts/ckeditor/plugins/mediaembed/icons/mediaembed.png +0 -0
  16. data/app/assets/javascripts/ckeditor/plugins/mediaembed/lang/en.js +12 -0
  17. data/app/assets/javascripts/ckeditor/plugins/mediaembed/lang/es.js +12 -0
  18. data/app/assets/javascripts/ckeditor/plugins/mediaembed/plugin.js +63 -0
  19. data/app/assets/javascripts/releaf/3rd_party/jquery-ui-timepicker-addon.js +1882 -0
  20. data/app/assets/javascripts/releaf/3rd_party/jquery.magnific-popup.min.js +4 -0
  21. data/app/assets/javascripts/releaf/application.js +13 -0
  22. data/app/assets/javascripts/releaf/include/ajax.js +66 -0
  23. data/app/assets/javascripts/releaf/include/ajaxbox.js +179 -0
  24. data/app/assets/javascripts/releaf/include/dialogs.js +13 -0
  25. data/app/assets/javascripts/releaf/include/field.type_associated_set.js +32 -0
  26. data/app/assets/javascripts/releaf/include/field.type_date_or_datetime_or_time.js +73 -0
  27. data/app/assets/javascripts/releaf/include/field.type_richtext.js +188 -0
  28. data/app/assets/javascripts/releaf/include/loader.js +45 -0
  29. data/app/assets/javascripts/releaf/include/localization.js +213 -0
  30. data/app/assets/javascripts/releaf/include/nested_fields.js +295 -0
  31. data/app/assets/javascripts/releaf/include/notifications.js +267 -0
  32. data/app/assets/javascripts/releaf/include/pagination.js +19 -0
  33. data/app/assets/javascripts/releaf/include/profile_settings.js +28 -0
  34. data/app/assets/javascripts/releaf/include/remote_validator.js +437 -0
  35. data/app/assets/javascripts/releaf/include/search.js +140 -0
  36. data/app/assets/javascripts/releaf/include/sidebar.js +149 -0
  37. data/app/assets/javascripts/releaf/include/sortable.js +69 -0
  38. data/app/assets/javascripts/releaf/include/toolbox.js +221 -0
  39. data/app/assets/javascripts/releaf/include/url_builder.js +193 -0
  40. data/app/assets/stylesheets/releaf/application.scss +9 -0
  41. data/app/assets/stylesheets/releaf/environment/extras.scss +11 -0
  42. data/app/assets/stylesheets/releaf/environment/functions/units.scss +12 -0
  43. data/app/assets/stylesheets/releaf/environment/functions.scss +1 -0
  44. data/app/assets/stylesheets/releaf/environment/mixins/blocks.scss +133 -0
  45. data/app/assets/stylesheets/releaf/environment/mixins/elements.scss +64 -0
  46. data/app/assets/stylesheets/releaf/environment/mixins/text.scss +61 -0
  47. data/app/assets/stylesheets/releaf/environment/mixins.scss +3 -0
  48. data/app/assets/stylesheets/releaf/environment/variables/colors.scss +93 -0
  49. data/app/assets/stylesheets/releaf/environment/variables/dimensions.scss +0 -0
  50. data/app/assets/stylesheets/releaf/environment/variables/magnific-popup.scss +6 -0
  51. data/app/assets/stylesheets/releaf/environment/variables.scss +5 -0
  52. data/app/assets/stylesheets/releaf/environment.scss +4 -0
  53. data/app/assets/stylesheets/releaf/layout/base.scss +32 -0
  54. data/app/assets/stylesheets/releaf/layout/breadcrumbs.scss +47 -0
  55. data/app/assets/stylesheets/releaf/layout/buttons.scss +107 -0
  56. data/app/assets/stylesheets/releaf/layout/deprecated.scss +29 -0
  57. data/app/assets/stylesheets/releaf/layout/dialogs.scss +138 -0
  58. data/app/assets/stylesheets/releaf/layout/errors.scss +28 -0
  59. data/app/assets/stylesheets/releaf/layout/extras.scss +10 -0
  60. data/app/assets/stylesheets/releaf/layout/fields.scss +305 -0
  61. data/app/assets/stylesheets/releaf/layout/fonts.scss +16 -0
  62. data/app/assets/stylesheets/releaf/layout/footer.scss +80 -0
  63. data/app/assets/stylesheets/releaf/layout/forms.scss +23 -0
  64. data/app/assets/stylesheets/releaf/layout/header.scss +55 -0
  65. data/app/assets/stylesheets/releaf/layout/icons.scss +4 -0
  66. data/app/assets/stylesheets/releaf/layout/images.scss +4 -0
  67. data/app/assets/stylesheets/releaf/layout/links.scss +7 -0
  68. data/app/assets/stylesheets/releaf/layout/localization.scss +79 -0
  69. data/app/assets/stylesheets/releaf/layout/main.scss +43 -0
  70. data/app/assets/stylesheets/releaf/layout/notifications.scss +67 -0
  71. data/app/assets/stylesheets/releaf/layout/pagination.scss +18 -0
  72. data/app/assets/stylesheets/releaf/layout/search.scss +70 -0
  73. data/app/assets/stylesheets/releaf/layout/sections.scss +138 -0
  74. data/app/assets/stylesheets/releaf/layout/sidebar.scss +306 -0
  75. data/app/assets/stylesheets/releaf/layout/tables.scss +99 -0
  76. data/app/assets/stylesheets/releaf/layout/text.scss +31 -0
  77. data/app/assets/stylesheets/releaf/layout/toolboxes.scss +69 -0
  78. data/app/assets/stylesheets/releaf/layout.scss +35 -0
  79. data/app/assets/stylesheets/releaf/vendor/magnific-popup/main.scss +596 -0
  80. data/app/assets/stylesheets/releaf/vendor/magnific-popup/settings.scss +45 -0
  81. data/app/builders/releaf/builders/association_reflector.rb +58 -0
  82. data/app/builders/releaf/builders/base.rb +80 -0
  83. data/app/builders/releaf/builders/collection.rb +8 -0
  84. data/app/builders/releaf/builders/confirm_destroy_dialog_builder.rb +25 -0
  85. data/app/builders/releaf/builders/confirm_dialog_builder.rb +54 -0
  86. data/app/builders/releaf/builders/edit_builder.rb +66 -0
  87. data/app/builders/releaf/builders/form_builder.rb +594 -0
  88. data/app/builders/releaf/builders/index_builder.rb +118 -0
  89. data/app/builders/releaf/builders/orderer.rb +5 -0
  90. data/app/builders/releaf/builders/page/header_builder.rb +70 -0
  91. data/app/builders/releaf/builders/page/layout_builder.rb +155 -0
  92. data/app/builders/releaf/builders/page/menu_builder.rb +140 -0
  93. data/app/builders/releaf/builders/pagination_builder.rb +107 -0
  94. data/app/builders/releaf/builders/refused_destroy_dialog_builder.rb +68 -0
  95. data/app/builders/releaf/builders/resource.rb +9 -0
  96. data/app/builders/releaf/builders/resource_dialog.rb +8 -0
  97. data/app/builders/releaf/builders/resource_view.rb +54 -0
  98. data/app/builders/releaf/builders/show_builder.rb +3 -0
  99. data/app/builders/releaf/builders/table_builder.rb +280 -0
  100. data/app/builders/releaf/builders/tags/releaf_associated_set_field.rb +40 -0
  101. data/app/builders/releaf/builders/template.rb +8 -0
  102. data/app/builders/releaf/builders/toolbox.rb +23 -0
  103. data/app/builders/releaf/builders/toolbox_builder.rb +27 -0
  104. data/app/builders/releaf/builders/view.rb +132 -0
  105. data/app/builders/releaf/builders.rb +38 -0
  106. data/app/builders/releaf/core/settings/form_builder.rb +21 -0
  107. data/app/builders/releaf/core/settings/table_builder.rb +11 -0
  108. data/app/controllers/concerns/releaf/breadcrumbs.rb +42 -0
  109. data/app/controllers/concerns/releaf/richtext_attachments.rb +20 -0
  110. data/app/controllers/releaf/base_controller.rb +458 -0
  111. data/app/controllers/releaf/core/errors_controller.rb +5 -0
  112. data/app/controllers/releaf/core/settings_controller.rb +50 -0
  113. data/app/helpers/releaf/application_helper.rb +53 -0
  114. data/app/helpers/releaf/button_helper.rb +50 -0
  115. data/app/helpers/releaf/javascript_helper.rb +75 -0
  116. data/app/lib/releaf/core/assets_resolver.rb +58 -0
  117. data/app/lib/releaf/core/default_searchable_fields.rb +43 -0
  118. data/app/lib/releaf/core/error_formatter.rb +103 -0
  119. data/app/lib/releaf/core/item_orderer.rb +102 -0
  120. data/app/lib/releaf/core/resource_base.rb +66 -0
  121. data/app/lib/releaf/core/resource_fields.rb +6 -0
  122. data/app/lib/releaf/core/resource_params.rb +47 -0
  123. data/app/lib/releaf/core/resource_table_fields.rb +10 -0
  124. data/app/lib/releaf/core/resource_utilities.rb +36 -0
  125. data/app/lib/releaf/core/responders/access_denied_responder.rb +9 -0
  126. data/app/lib/releaf/core/responders/after_save_responder.rb +28 -0
  127. data/app/lib/releaf/core/responders/confirm_destroy_responder.rb +13 -0
  128. data/app/lib/releaf/core/responders/destroy_responder.rb +10 -0
  129. data/app/lib/releaf/core/responders/error_responder.rb +9 -0
  130. data/app/lib/releaf/core/responders/feature_disabled_responder.rb +9 -0
  131. data/app/lib/releaf/core/responders/page_not_found_responder.rb +9 -0
  132. data/app/lib/releaf/core/responders.rb +31 -0
  133. data/app/lib/releaf/core/search.rb +147 -0
  134. data/app/lib/releaf/core/template_field_type_mapper.rb +127 -0
  135. data/app/models/releaf/richtext_attachment.rb +6 -0
  136. data/app/models/releaf/settings.rb +27 -0
  137. data/app/views/layouts/releaf/admin.html.erb +1 -0
  138. data/app/views/releaf/base/confirm_destroy.ruby +1 -0
  139. data/app/views/releaf/base/create_releaf_richtext_attachment.haml +1 -0
  140. data/app/views/releaf/base/edit.ruby +1 -0
  141. data/app/views/releaf/base/index.ruby +1 -0
  142. data/app/views/releaf/base/new.ruby +1 -0
  143. data/app/views/releaf/base/refused_destroy.ruby +1 -0
  144. data/app/views/releaf/base/show.ruby +1 -0
  145. data/app/views/releaf/base/toolbox.ruby +1 -0
  146. data/app/views/releaf/error_pages/_error.html.haml +10 -0
  147. data/app/views/releaf/error_pages/access_denied.html.haml +1 -0
  148. data/app/views/releaf/error_pages/feature_disabled.html.haml +1 -0
  149. data/app/views/releaf/error_pages/page_not_found.html.haml +2 -0
  150. data/lib/generators/dummy/install_generator.rb +18 -0
  151. data/lib/generators/dummy/templates/builders/admin/books/form_builder.rb +13 -0
  152. data/lib/generators/dummy/templates/builders/admin/books/index_builder.rb +30 -0
  153. data/lib/generators/dummy/templates/builders/admin/books/table_builder.rb +7 -0
  154. data/lib/generators/dummy/templates/builders/admin/nodes/form_builder.rb +7 -0
  155. data/lib/generators/dummy/templates/config/routes.rb +19 -0
  156. data/lib/generators/dummy/templates/controllers/admin/authors_controller.rb +12 -0
  157. data/lib/generators/dummy/templates/controllers/admin/books_controller.rb +17 -0
  158. data/lib/generators/dummy/templates/controllers/admin/chapters_controller.rb +3 -0
  159. data/lib/generators/dummy/templates/controllers/admin/publishers_controller.rb +3 -0
  160. data/lib/generators/dummy/templates/controllers/application_controller.rb +39 -0
  161. data/lib/generators/dummy/templates/controllers/concerns/.keep +0 -0
  162. data/lib/generators/dummy/templates/controllers/concerns/node_controller.rb +37 -0
  163. data/lib/generators/dummy/templates/controllers/contacts_controller.rb +3 -0
  164. data/lib/generators/dummy/templates/controllers/home_pages_controller.rb +3 -0
  165. data/lib/generators/dummy/templates/controllers/text_pages_controller.rb +3 -0
  166. data/lib/generators/dummy/templates/initializers/releaf.rb +35 -0
  167. data/lib/generators/dummy/templates/migrations/create_authors.rb +14 -0
  168. data/lib/generators/dummy/templates/migrations/create_banners.rb +11 -0
  169. data/lib/generators/dummy/templates/migrations/create_book_sequels.rb +14 -0
  170. data/lib/generators/dummy/templates/migrations/create_books.rb +27 -0
  171. data/lib/generators/dummy/templates/migrations/create_bundles.rb +7 -0
  172. data/lib/generators/dummy/templates/migrations/create_chapters.rb +13 -0
  173. data/lib/generators/dummy/templates/migrations/create_home_pages.rb +9 -0
  174. data/lib/generators/dummy/templates/migrations/create_node_extra_fields.rb +5 -0
  175. data/lib/generators/dummy/templates/migrations/create_publishers.rb +8 -0
  176. data/lib/generators/dummy/templates/migrations/create_text_pages.rb +9 -0
  177. data/lib/generators/dummy/templates/models/author.rb +10 -0
  178. data/lib/generators/dummy/templates/models/banner.rb +5 -0
  179. data/lib/generators/dummy/templates/models/book.rb +19 -0
  180. data/lib/generators/dummy/templates/models/book_sequel.rb +4 -0
  181. data/lib/generators/dummy/templates/models/bundle.rb +17 -0
  182. data/lib/generators/dummy/templates/models/chapter.rb +7 -0
  183. data/lib/generators/dummy/templates/models/home_page.rb +5 -0
  184. data/lib/generators/dummy/templates/models/node.rb +10 -0
  185. data/lib/generators/dummy/templates/models/publisher.rb +9 -0
  186. data/lib/generators/dummy/templates/models/text_page.rb +5 -0
  187. data/lib/generators/dummy/templates/views/contacts/show.html.haml +1 -0
  188. data/lib/generators/dummy/templates/views/home_pages/show.haml +1 -0
  189. data/lib/generators/dummy/templates/views/layouts/application.html.haml +22 -0
  190. data/lib/generators/dummy/templates/views/text_pages/show.haml +1 -0
  191. data/lib/generators/releaf/install_generator.rb +93 -0
  192. data/lib/generators/releaf/templates/initializers/haml.rb +1 -0
  193. data/lib/generators/releaf/templates/initializers/releaf.rb +30 -0
  194. data/lib/generators/releaf/templates/migrations/create_releaf_nodes.rb +28 -0
  195. data/lib/generators/releaf/templates/migrations/create_releaf_permissions.rb +12 -0
  196. data/lib/generators/releaf/templates/migrations/create_releaf_richtext_attachments.rb +12 -0
  197. data/lib/generators/releaf/templates/migrations/create_releaf_roles.rb +9 -0
  198. data/lib/generators/releaf/templates/migrations/create_releaf_settings.rb +17 -0
  199. data/lib/generators/releaf/templates/migrations/create_releaf_translations.rb +21 -0
  200. data/lib/generators/releaf/templates/migrations/create_releaf_users.rb +52 -0
  201. data/lib/generators/releaf/templates/models/node.rb +3 -0
  202. data/lib/generators/releaf/templates/seeds/seeds.rb +54 -0
  203. data/lib/releaf/core/application.rb +17 -0
  204. data/lib/releaf/core/builders_autoload.rb +27 -0
  205. data/lib/releaf/core/component.rb +9 -0
  206. data/lib/releaf/core/configuration.rb +101 -0
  207. data/lib/releaf/core/engine.rb +35 -0
  208. data/lib/releaf/core/exceptions.rb +38 -0
  209. data/lib/releaf/core/route_mapper.rb +59 -0
  210. data/lib/releaf/core/settings_ui_component.rb +7 -0
  211. data/lib/releaf/core/validation_error_codes.rb +36 -0
  212. data/lib/releaf/version.rb +3 -0
  213. data/lib/releaf-core.rb +14 -0
  214. data/lib/tasks/releaf_tasks.rake +4 -0
  215. data/releaf-core.gemspec +35 -0
  216. data/spec/builders/builders/association_reflector_spec.rb +138 -0
  217. data/spec/builders/builders/base_spec.rb +276 -0
  218. data/spec/builders/builders/collection_spec.rb +18 -0
  219. data/spec/builders/builders/confirm_destroy_dialog_builder_spec.rb +71 -0
  220. data/spec/builders/builders/confirm_dialog_builder_spec.rb +105 -0
  221. data/spec/builders/builders/edit_builder_spec.rb +215 -0
  222. data/spec/builders/builders/form_builder_spec.rb +562 -0
  223. data/spec/builders/builders/index_builder_spec.rb +345 -0
  224. data/spec/builders/builders/orderer_spec.rb +22 -0
  225. data/spec/builders/builders/page/header_builder_spec.rb +143 -0
  226. data/spec/builders/builders/page/layout_builder_spec.rb +73 -0
  227. data/spec/builders/builders/page/menu_builder_spec.rb +160 -0
  228. data/spec/builders/builders/pagination_builder_spec.rb +330 -0
  229. data/spec/builders/builders/resource_dialog_spec.rb +21 -0
  230. data/spec/builders/builders/resource_view_spec.rb +158 -0
  231. data/spec/builders/builders/show_builder_spec.rb +7 -0
  232. data/spec/builders/builders/table_builder_spec.rb +638 -0
  233. data/spec/builders/builders/template_spec.rb +12 -0
  234. data/spec/builders/builders/toolbox_builder_spec.rb +67 -0
  235. data/spec/builders/builders/toolbox_spec.rb +48 -0
  236. data/spec/builders/builders/view_spec.rb +281 -0
  237. data/spec/builders/builders_spec.rb +134 -0
  238. data/spec/builders/core/settings/form_builder_spec.rb +69 -0
  239. data/spec/builders/core/settings/table_builder_spec.rb +21 -0
  240. data/spec/controllers/concerns/releaf/richtext_attachments_spec.rb +51 -0
  241. data/spec/controllers/releaf/base_controller_spec.rb +447 -0
  242. data/spec/controllers/releaf/core/settings_controller_spec.rb +31 -0
  243. data/spec/features/ajaxbox_spec.rb +111 -0
  244. data/spec/features/authorization_spec.rb +50 -0
  245. data/spec/features/dragonfly_integration_spec.rb +24 -0
  246. data/spec/features/edit_actions_spec.rb +142 -0
  247. data/spec/features/errors_spec.rb +29 -0
  248. data/spec/features/index_actions_spec.rb +85 -0
  249. data/spec/features/index_table_spec.rb +32 -0
  250. data/spec/features/menu_spec.rb +71 -0
  251. data/spec/features/richtext_attachments_spec.rb +64 -0
  252. data/spec/features/richtext_embed_spec.rb +29 -0
  253. data/spec/features/richtext_spec.rb +19 -0
  254. data/spec/features/search_spec.rb +825 -0
  255. data/spec/features/settings_spec.rb +38 -0
  256. data/spec/features/title_spec.rb +13 -0
  257. data/spec/fixtures/common_fields.yml +17 -0
  258. data/spec/fixtures/cs.png +0 -0
  259. data/spec/fixtures/time.formats.xlsx +0 -0
  260. data/spec/fixtures/unicorn.jpg +0 -0
  261. data/spec/helpers/application_helper_spec.rb +75 -0
  262. data/spec/helpers/button_helper_spec.rb +146 -0
  263. data/spec/lib/releaf/core/application_spec.rb +42 -0
  264. data/spec/lib/releaf/core/assets_resolver_spec.rb +113 -0
  265. data/spec/lib/releaf/core/configuration_spec.rb +230 -0
  266. data/spec/lib/releaf/core/default_searchable_fields_spec.rb +161 -0
  267. data/spec/lib/releaf/core/error_formatter_spec.rb +242 -0
  268. data/spec/lib/releaf/core/item_orderer_spec.rb +142 -0
  269. data/spec/lib/releaf/core/resource_base_spec.rb +174 -0
  270. data/spec/lib/releaf/core/resource_fields_spec.rb +12 -0
  271. data/spec/lib/releaf/core/resource_params_spec.rb +117 -0
  272. data/spec/lib/releaf/core/resource_table_fields_spec.rb +18 -0
  273. data/spec/lib/releaf/core/resource_utilities_spec.rb +87 -0
  274. data/spec/lib/releaf/core/responders/access_denied_responder_spec.rb +12 -0
  275. data/spec/lib/releaf/core/responders/after_save_responder_spec.rb +102 -0
  276. data/spec/lib/releaf/core/responders/confirm_destroy_responder_spec.rb +26 -0
  277. data/spec/lib/releaf/core/responders/destroy_responder_spec.rb +30 -0
  278. data/spec/lib/releaf/core/responders/error_responder_spec.rb +26 -0
  279. data/spec/lib/releaf/core/responders/feature_disabled_responder_spec.rb +12 -0
  280. data/spec/lib/releaf/core/responders/page_not_found_responder_spec.rb +12 -0
  281. data/spec/lib/releaf/core/responders_spec.rb +60 -0
  282. data/spec/lib/releaf/core/template_field_type_mapper_spec.rb +311 -0
  283. data/spec/lib/validation_error_codes_spec.rb +56 -0
  284. data/spec/misc/factories_spec.rb +43 -0
  285. data/spec/models/settings_spec.rb +58 -0
  286. data/spec/routing/route_mapper_spec.rb +185 -0
  287. data/spec/rspec_helpers/test_helpers_spec.rb +20 -0
  288. metadata +657 -0
@@ -0,0 +1,142 @@
1
+ require "rails_helper"
2
+
3
+ describe Releaf::Core::ItemOrderer do
4
+ let(:list){ ["a", "b", "c", "d", {items: "xx"}, "e", "f", "g"] }
5
+ subject{ described_class.new(*list) }
6
+
7
+ describe "#initialize" do
8
+ it "assigns given arguments to list accessor" do
9
+ subject = described_class.new(:a, :b, :c)
10
+ expect(subject.list).to eq([:a, :b, :c])
11
+ end
12
+ end
13
+
14
+ describe "#result" do
15
+ it "returns list" do
16
+ expect(subject.result).to eq(list)
17
+ subject.reorder(:a, :last)
18
+ expect(subject.result).to eq(["b", "c", "d", {items: "xx"}, "e", "f", "g", "a"])
19
+ end
20
+ end
21
+
22
+ describe "#to_a" do
23
+ it "returns result" do
24
+ allow(subject).to receive(:result).and_return(:x)
25
+ expect(subject.to_a).to eq(:x)
26
+ end
27
+ end
28
+
29
+ describe "#reorder" do
30
+ it "returns instance of itself" do
31
+ expect(subject.reorder(:a, :last)).to eq(subject)
32
+ end
33
+
34
+ it "deletes given values and insert deleted values in reversed order at reorder index" do
35
+ deleted_values = {a: "x", b: "y"}
36
+
37
+ expect(subject).to receive(:delete).with([:a, :b]).ordered.and_return(deleted_values)
38
+ expect(subject).to receive(:reorder_index).with(:last).ordered.and_return(1)
39
+
40
+ expect{ subject.reorder([:a, :b], :last) }.to change{ subject.list }
41
+ .to(["a", "x", "y", "b", "c", "d", {items: "xx"}, "e", "f", "g"])
42
+ end
43
+
44
+ context "when given value is array" do
45
+ it "process unmodified given value" do
46
+ expect(subject).to receive(:delete).with([:a]).and_call_original
47
+ subject.reorder([:a], :last)
48
+ end
49
+ end
50
+
51
+ context "when given value is not array" do
52
+ it "puts value within array" do
53
+ expect(subject).to receive(:delete).with([:a]).and_call_original
54
+ subject.reorder(:a, :last)
55
+ end
56
+ end
57
+ end
58
+
59
+ describe "#reorder_index" do
60
+ context "when given options is :first" do
61
+ it "returns 0" do
62
+ expect(subject.reorder_index(:first)).to eq(0)
63
+ end
64
+ end
65
+
66
+ context "when given options is :last" do
67
+ it "returns size of current list array" do
68
+ expect(subject.reorder_index(:last)).to eq(8)
69
+ subject.list = [:a, :b]
70
+ expect(subject.reorder_index(:last)).to eq(2)
71
+ end
72
+ end
73
+
74
+ context "when given options is :before" do
75
+ it "returns index of given `before` value" do
76
+ allow(subject).to receive(:index).with(:items).and_return(4)
77
+ expect(subject.reorder_index(before: :items)).to eq(4)
78
+ end
79
+ end
80
+
81
+ context "when given options is :after" do
82
+ it "returns index of given `after` value increased by 1" do
83
+ allow(subject).to receive(:index).with(:items).and_return(4)
84
+ expect(subject.reorder_index(after: :items)).to eq(5)
85
+ end
86
+ end
87
+
88
+ context "when unknown option given" do
89
+ it "raises ArgumentError" do
90
+ expect{ subject.reorder_index(asdasd: :items) }.to raise_error(ArgumentError, "unknown reorder option")
91
+ end
92
+ end
93
+ end
94
+
95
+ describe "#index" do
96
+ it "returns value index by comparing list and given values casted to strings" do
97
+ expect(subject.index(:c)).to eq(2)
98
+ expect(subject.index("c")).to eq(2)
99
+ subject.list = ["a", :b, :c]
100
+ expect(subject.index("c")).to eq(2)
101
+ end
102
+
103
+ context "when list value is Hash" do
104
+ it "compares by hash first key casted to string" do
105
+ expect(subject.index(:items)).to eq(4)
106
+ expect(subject.index("items")).to eq(4)
107
+
108
+ subject.list = ["a", {"items" => "x"}]
109
+ expect(subject.index(:items)).to eq(1)
110
+ expect(subject.index("items")).to eq(1)
111
+ end
112
+ end
113
+ end
114
+
115
+ describe "#delete" do
116
+ before do
117
+ subject.list = [:a, :b, :c, :d, {items: "x"}]
118
+ end
119
+
120
+ it "deletes given values from list" do
121
+ expect{ subject.delete(["a", "b", "items"]) }.to change{ subject.list }.to([:c, :d])
122
+ end
123
+
124
+ it "returns hash with mapped deleted values" do
125
+ expect(subject.delete(["a", "b", "items"])).to eq("a" => :a, "b" => :b, "items" => {items: "x"})
126
+ end
127
+ end
128
+
129
+ describe ".reorder" do
130
+ it "returns reordered array by given options" do
131
+ result = described_class.reorder(list,
132
+ [:a, :b] => {after: :c},
133
+ d: {before: :c},
134
+ g: :first,
135
+ [:e, :f] => {before: :g},
136
+ c: {after: :items},
137
+ items: :first
138
+ )
139
+ expect(result).to eq([{:items=>"xx"}, "e", "f", "g", "d", "a", "b", "c"])
140
+ end
141
+ end
142
+ end
@@ -0,0 +1,174 @@
1
+ require "rails_helper"
2
+
3
+ describe Releaf::Core::ResourceBase do
4
+ subject{ described_class.new(Book) }
5
+
6
+ describe "#initialize" do
7
+ it "assigns given class to resource class accessor" do
8
+ expect(subject.resource_class).to eq(Book)
9
+ end
10
+ end
11
+
12
+ describe "#excluded_attributes" do
13
+ it "returns array with id, created_at and updated_as" do
14
+ expect(subject.excluded_attributes).to eq(["id", "created_at", "updated_at"])
15
+ end
16
+ end
17
+
18
+ describe "#localized_attributes?" do
19
+ context "when resource class has globalize support" do
20
+ it "returns true" do
21
+ expect(subject.localized_attributes?).to be true
22
+ end
23
+ end
24
+
25
+ context "when resource class does not have globalize support" do
26
+ it "returns false" do
27
+ allow(subject.resource_class).to receive(:translates?).and_return(false)
28
+ expect(subject.localized_attributes?).to be false
29
+ end
30
+ end
31
+ end
32
+
33
+ describe "#localized_attributes" do
34
+ it "returns array of all localized attributes params" do
35
+ allow(subject.resource_class).to receive(:translated_attribute_names).and_return([:title, :summary])
36
+ expect(subject.localized_attributes).to eq(["title", "summary"])
37
+ end
38
+ end
39
+
40
+ describe "#associations_attributes" do
41
+ it "returns array with associations attributes within hashes" do
42
+ association_1 = subject.resource_class.reflections["chapters"]
43
+ association_2 = subject.resource_class.reflections["sequels"]
44
+
45
+ allow(subject).to receive(:associations).and_return([association_1, association_2])
46
+ allow(subject).to receive(:association_attributes).with(association_1).and_return(["a", "b"])
47
+ allow(subject).to receive(:association_attributes).with(association_2).and_return(["c", "d"])
48
+
49
+ expect(subject.associations_attributes).to eq([{chapters: ["a", "b"]}, {sequels: ["c", "d"]}])
50
+ end
51
+ end
52
+
53
+ describe "#association_attributes" do
54
+ it "returns association params without association excluded attributes" do
55
+ association = subject.resource_class.reflections["chapters"]
56
+ allow(described_class).to receive(:new).with(association.klass).and_call_original
57
+ allow_any_instance_of(described_class).to receive(:values).and_return(["a", "b", "c"])
58
+ allow(subject).to receive(:association_excluded_attributes).and_return(["b"])
59
+ expect(subject.association_attributes(association)).to eq(["a", "c"])
60
+ end
61
+ end
62
+
63
+ describe "#association_excluded_attributes" do
64
+ it "returns `foreign_key` and polymorphic association type key (if exists) casted to strings" do
65
+ association = subject.resource_class.reflections["chapters"]
66
+ allow(association).to receive(:foreign_key).and_return(:b)
67
+ expect(subject.association_excluded_attributes(association)).to eq(["b"])
68
+
69
+ allow(association).to receive(:type).and_return("x")
70
+ expect(subject.association_excluded_attributes(association)).to eq(["b", "x"])
71
+ end
72
+ end
73
+
74
+ describe "#values" do
75
+ before do
76
+ allow(subject).to receive(:associations_attributes).and_return(["x", "y"])
77
+ allow(subject).to receive(:base_attributes).and_return(["a", "b"])
78
+ allow(subject).to receive(:localized_attributes?).and_return(false)
79
+ end
80
+
81
+ it "returns resource params array alongside associations params" do
82
+ expect(subject.values).to eq(["a", "b", "x", "y"])
83
+ end
84
+
85
+ context "when `include_associations` is false" do
86
+ it "does not include association params" do
87
+ expect(subject.values(include_associations: false)).to eq(["a", "b"])
88
+ end
89
+ end
90
+
91
+ context "when resource has localized attributes" do
92
+ it "returns resource base attributes array alongside localized attributes" do
93
+ allow(subject).to receive(:localized_attributes?).and_return(true)
94
+ allow(subject).to receive(:localized_attributes).and_return(["c", "d"])
95
+ expect(subject.values).to eq(["a", "b", "c", "d", "x", "y"])
96
+ end
97
+ end
98
+ end
99
+
100
+ describe "#base_attributes" do
101
+ it "returns array with non-excluded attributes" do
102
+ allow(subject.resource_class).to receive(:column_names).and_return(["a", "b", "c"])
103
+ allow(subject).to receive(:excluded_attributes).and_return(["a"])
104
+ expect(subject.base_attributes).to eq(["b", "c"])
105
+
106
+ allow(subject).to receive(:excluded_attributes).and_return(["c"])
107
+ expect(subject.base_attributes).to eq(["a", "b"])
108
+ end
109
+ end
110
+
111
+ describe "#associations" do
112
+ it "returns array with includable associations" do
113
+ reflections = subject.resource_class.reflections
114
+ allow(subject).to receive(:includable_association?).with(reflections["releaf_richtext_attachments"]).and_return(false)
115
+ allow(subject).to receive(:includable_association?).with(reflections["chapters"]).and_return(true)
116
+ allow(subject).to receive(:includable_association?).with(reflections["book_sequels"]).and_return(false)
117
+ allow(subject).to receive(:includable_association?).with(reflections["sequels"]).and_return(true)
118
+ allow(subject).to receive(:includable_association?).with(reflections["author"]).and_return(false)
119
+ allow(subject).to receive(:includable_association?).with(reflections["translations"]).and_return(false)
120
+
121
+ expect(subject.associations).to eq([reflections["chapters"], reflections["sequels"]])
122
+ end
123
+ end
124
+
125
+ describe "#includable_association?" do
126
+ let(:association){ subject.resource_class.reflections["chapters"] }
127
+
128
+ context "when given association type is includable, association is not excluded, not `ThroughReflection` and has nested_attributes for it" do
129
+ it "returns true" do
130
+ expect(subject.includable_association?(association)).to be true
131
+ end
132
+ end
133
+
134
+ context "when given association is not :has_many" do
135
+ it "returns false" do
136
+ allow(subject).to receive(:includable_association_types).and_return([:a, :b])
137
+ expect(subject.includable_association?(association)).to be false
138
+ end
139
+ end
140
+
141
+ context "when given association is `ThroughReflection`" do
142
+ it "returns false" do
143
+ allow(association).to receive(:class).and_return(ActiveRecord::Reflection::ThroughReflection)
144
+ expect(subject.includable_association?(association)).to be false
145
+ end
146
+ end
147
+
148
+ context "when given association has no nested_attributes for it" do
149
+ it "returns false" do
150
+ allow(subject.resource_class).to receive(:nested_attributes_options).and_return({})
151
+ expect(subject.includable_association?(association)).to be false
152
+ end
153
+ end
154
+
155
+ context "when given association is within excluded associations" do
156
+ it "returns false" do
157
+ allow(subject).to receive(:excluded_associations).and_return([:chapters])
158
+ expect(subject.includable_association?(association)).to be false
159
+ end
160
+ end
161
+ end
162
+
163
+ describe "#includable_association_types" do
164
+ it "returns array with `:has_many` and `:has_one` as includable association types" do
165
+ expect(subject.includable_association_types).to eq([:has_many, :has_one])
166
+ end
167
+ end
168
+
169
+ describe "#excluded_associations" do
170
+ it "returns array with `translations`" do
171
+ expect(subject.excluded_associations).to eq([:translations])
172
+ end
173
+ end
174
+ end
@@ -0,0 +1,12 @@
1
+ require "rails_helper"
2
+
3
+ describe Releaf::Core::ResourceFields do
4
+ subject{ described_class.new(Book) }
5
+
6
+ describe "#excluded_attributes" do
7
+ it "returns array with excluded attributes" do
8
+ expect(subject.excluded_attributes)
9
+ .to eq(%w(id created_at updated_at password password_confirmation encrypted_password))
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,117 @@
1
+ require "rails_helper"
2
+
3
+ describe Releaf::Core::ResourceParams do
4
+ subject{ described_class.new(Book) }
5
+
6
+ describe "#file_attributes" do
7
+ it "returns list with file attributes" do
8
+ expect(subject.file_attributes).to eq(["cover_image_uid"])
9
+
10
+ subject.resource_class = Node
11
+ expect(subject.file_attributes).to eq([])
12
+ end
13
+ end
14
+
15
+ describe "#file_attribute?" do
16
+ context "when given attribute exists within file attributes" do
17
+ it "returns true" do
18
+ allow(subject).to receive(:file_attributes).and_return(["color"])
19
+ expect(subject.file_attribute?("color")).to be true
20
+ end
21
+ end
22
+
23
+ context "when given attribute does not exist within file attributes" do
24
+ it "returns false" do
25
+ allow(subject).to receive(:file_attributes).and_return(["size"])
26
+ expect(subject.file_attribute?("color")).to be false
27
+ end
28
+ end
29
+ end
30
+
31
+ describe "#file_attribute_params" do
32
+ it "returns array with dragonfly specific attributes" do
33
+ expect(subject.file_attribute_params("cover_image_uid"))
34
+ .to eq(["cover_image", "retained_cover_image", "remove_cover_image"])
35
+ end
36
+ end
37
+
38
+ describe "#localized_attributes" do
39
+ it "returns array of all localized attributes params" do
40
+ allow(subject.resource_class).to receive(:translated_attribute_names).and_return(["title", "summary"])
41
+ allow(subject).to receive(:localized_attribute_params).with("title").and_return(["t1", "t2"])
42
+ allow(subject).to receive(:localized_attribute_params).with("summary").and_return(["s1", "s2"])
43
+ expect(subject.localized_attributes).to eq(["t1", "t2", "s1", "s2"])
44
+
45
+ allow(subject.resource_class).to receive(:translated_attribute_names).and_return([])
46
+ expect(subject.localized_attributes).to eq([])
47
+ end
48
+ end
49
+
50
+ describe "#localized_attribute_params" do
51
+ it "returns array with localized attribute within all specified locales" do
52
+ expect(subject.localized_attribute_params(:description)).to eq(["description_en", "description_lv"])
53
+
54
+ allow(subject.resource_class).to receive(:globalize_locales).and_return(["de"])
55
+ expect(subject.localized_attribute_params(:description)).to eq(["description_de"])
56
+ end
57
+ end
58
+
59
+ describe "#base_attributes" do
60
+ it "returns array with non-excluded and file attributes" do
61
+ allow(subject.resource_class).to receive(:column_names).and_return(["a", "b", "c"])
62
+ allow(subject).to receive(:file_attribute?).and_return(false)
63
+ expect(subject.base_attributes).to eq(["a", "b", "c"])
64
+
65
+ allow(subject).to receive(:file_attribute?).with("b").and_return(true)
66
+ allow(subject).to receive(:file_attribute_params).with("b").and_return(["b1", "b2"])
67
+ expect(subject.base_attributes).to eq(["a", "b1", "b2", "c"])
68
+
69
+ allow(subject).to receive(:excluded_attributes).and_return(["a"])
70
+ expect(subject.base_attributes).to eq(["b1", "b2", "c"])
71
+ end
72
+ end
73
+
74
+ describe "#values" do
75
+ before do
76
+ allow(subject).to receive(:associations_attributes).and_return(["x", "y"])
77
+ end
78
+
79
+ it "returns resource params array alongside associations params" do
80
+ allow(subject).to receive(:base_attributes).and_return(["a", "b"])
81
+ allow(subject).to receive(:localized_attributes?).and_return(false)
82
+ expect(subject.values).to eq(["a", "b", "x", "y"])
83
+ end
84
+
85
+ context "when resource has localized attributes" do
86
+ it "returns resource params array alongside localized attributes" do
87
+ allow(subject).to receive(:base_attributes).and_return(["a", "b"])
88
+ allow(subject).to receive(:localized_attributes?).and_return(true)
89
+ allow(subject).to receive(:localized_attributes).and_return(["c", "d"])
90
+ expect(subject.values).to eq(["a", "b", "c", "d", "x", "y"])
91
+ end
92
+ end
93
+ end
94
+
95
+ describe "#associations_attributes" do
96
+ it "returns array with associations params within hashes" do
97
+ association_1 = subject.resource_class.reflections["chapters"]
98
+ association_2 = subject.resource_class.reflections["sequels"]
99
+
100
+ allow(subject).to receive(:associations).and_return([association_1, association_2])
101
+ allow(subject).to receive(:association_attributes).with(association_1).and_return(["a", "b"])
102
+ allow(subject).to receive(:association_attributes).with(association_2).and_return(["c", "d"])
103
+
104
+ expect(subject.associations_attributes).to eq([{"chapters_attributes"=>["a", "b"]}, {"sequels_attributes"=>["c", "d"]}])
105
+ end
106
+ end
107
+
108
+ describe "#association_attributes" do
109
+ it "returns association params with `id` and `_destroy` params and without `foreign_key` param" do
110
+ association = subject.resource_class.reflections["chapters"]
111
+ allow(association).to receive(:foreign_key).and_return("b")
112
+ allow(described_class).to receive(:new).with(association.klass).and_call_original
113
+ allow_any_instance_of(described_class).to receive(:values).and_return(["a", "b", "c"])
114
+ expect(subject.association_attributes(association)).to eq(["a", "c", "id", "_destroy"])
115
+ end
116
+ end
117
+ end