card 1.99.2 → 1.100.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (655) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -0
  3. data/VERSION +1 -1
  4. data/config/initializers/01_core_extensions/module.rb +0 -45
  5. data/config/initializers/01_core_extensions/object.rb +0 -4
  6. data/config/initializers/core_extensions.rb +8 -14
  7. data/db/migrate/20200718051236_compound_names_do_not_store_name_and_key.rb +7 -0
  8. data/db/migrate/20200805200729_add_unique_pair_indeces.rb +9 -0
  9. data/db/migrate_core_cards/20140629222005_add_email_cards.rb +1 -1
  10. data/db/migrate_core_cards/20180712042655_head_rule.rb +1 -1
  11. data/db/migrate_core_cards/20180905061537_migrate_layouts.rb +1 -0
  12. data/db/schema.rb +12 -13
  13. data/db/seed/new/card_actions.yml +768 -768
  14. data/db/seed/new/card_acts.yml +2 -2
  15. data/db/seed/new/cards.yml +2547 -2547
  16. data/db/seed/new/schema_migrations.yml +4 -0
  17. data/db/seed/test/fixtures/card_actions.yml +1709 -1709
  18. data/db/seed/test/fixtures/card_acts.yml +499 -499
  19. data/db/seed/test/fixtures/card_changes.yml +157 -97
  20. data/db/seed/test/fixtures/card_references.yml +1475 -1475
  21. data/db/seed/test/fixtures/cards.yml +4047 -4047
  22. data/db/seed/test/fixtures/schema_migrations.yml +4 -0
  23. data/db/seeds.rb +1 -0
  24. data/db/test_seed.rb +1 -1
  25. data/db/version.txt +1 -1
  26. data/lib/card.rb +25 -57
  27. data/lib/card/auth/current.rb +1 -3
  28. data/lib/card/auth/permissions.rb +6 -10
  29. data/lib/card/cache/prepopulate.rb +9 -6
  30. data/lib/card/codename.rb +16 -13
  31. data/lib/card/content.rb +10 -4
  32. data/lib/card/content/chunk.rb +1 -0
  33. data/lib/card/content/clean.rb +26 -20
  34. data/lib/card/director.rb +231 -0
  35. data/lib/card/director/act_direction.rb +111 -0
  36. data/lib/card/director/card_methods.rb +45 -0
  37. data/lib/card/{act_manager → director}/event_delay.rb +13 -15
  38. data/lib/card/director/phases.rb +55 -0
  39. data/lib/card/director/run.rb +107 -0
  40. data/lib/card/director/stages.rb +85 -0
  41. data/lib/card/director/store.rb +73 -0
  42. data/lib/card/{act_manager → director}/subdirector_array.rb +21 -15
  43. data/lib/card/dirty.rb +37 -2
  44. data/lib/card/env.rb +17 -53
  45. data/lib/card/env/location.rb +16 -2
  46. data/lib/card/env/request_assignments.rb +24 -0
  47. data/lib/card/env/serialization.rb +24 -0
  48. data/lib/card/env/slot_options.rb +30 -0
  49. data/lib/card/env/success.rb +1 -1
  50. data/lib/card/format.rb +5 -1
  51. data/lib/card/format/content.rb +2 -1
  52. data/lib/card/format/error.rb +7 -4
  53. data/lib/card/format/nesting.rb +1 -1
  54. data/lib/card/lexicon.rb +90 -0
  55. data/lib/card/mod.rb +1 -1
  56. data/lib/card/mod/load_strategy/set_tmp_files.rb +1 -1
  57. data/lib/card/mod/loader/set_loader.rb +2 -1
  58. data/lib/card/mod/loader/set_pattern_loader.rb +5 -1
  59. data/lib/card/mod/module_template.rb +2 -2
  60. data/lib/card/model/save_helper.rb +5 -1
  61. data/lib/card/name.rb +8 -3
  62. data/lib/card/query.rb +5 -6
  63. data/lib/card/query/abstract_query.rb +1 -1
  64. data/lib/card/query/card_query/match_attributes.rb +12 -59
  65. data/lib/card/query/card_query/normalization.rb +4 -4
  66. data/lib/card/query/card_query/run.rb +14 -7
  67. data/lib/card/query/card_query/sorting.rb +1 -1
  68. data/lib/card/query/sql_statement.rb +13 -14
  69. data/lib/card/query/value.rb +44 -23
  70. data/lib/card/query/value/match_value.rb +65 -0
  71. data/lib/card/set.rb +1 -1
  72. data/lib/card/set/event.rb +69 -24
  73. data/lib/card/set/event/delayed_event.rb +50 -10
  74. data/lib/card/set/event/options.rb +4 -7
  75. data/lib/card/set/pattern/base.rb +18 -0
  76. data/lib/card/set/trait.rb +2 -6
  77. data/lib/card/subcards.rb +11 -8
  78. data/lib/card/subcards/add.rb +12 -11
  79. data/lib/card/subcards/remove.rb +1 -1
  80. data/lib/card/view.rb +2 -2
  81. data/lib/card/view/cache.rb +3 -3
  82. data/lib/card/view/cache/cache_action.rb +2 -5
  83. data/lib/card/view/cache/stub.rb +7 -1
  84. data/lib/card/view/classy.rb +9 -9
  85. data/lib/card/view/options/voo_api.rb +0 -8
  86. data/lib/cardio.rb +2 -2
  87. data/mod/account/set/abstract/account_field.rb +6 -4
  88. data/mod/account/set/all/account.rb +15 -11
  89. data/mod/account/set/right/account.rb +1 -1
  90. data/mod/account/set/right/email.rb +1 -1
  91. data/mod/account/set/self/signin.rb +1 -1
  92. data/mod/account/set/type/signup.rb +2 -1
  93. data/mod/account/set/type/signup/views.rb +1 -1
  94. data/mod/account/spec/set/right/account_spec.rb +2 -2
  95. data/mod/account/spec/set/type/signup_spec.rb +1 -1
  96. data/mod/admin/set/self/admin.rb +1 -1
  97. data/mod/admin/set/self/admin_info.rb +26 -44
  98. data/mod/basic_formats/set/all/all_csv.rb +2 -6
  99. data/mod/basic_formats/set/all/base.rb +0 -1
  100. data/mod/basic_formats/set/all/head.rb +4 -2
  101. data/mod/basic_formats/set/all/json.rb +1 -1
  102. data/mod/basic_formats/set/all/rss.rb +1 -1
  103. data/mod/basic_formats/set/self/head.rb +1 -1
  104. data/mod/bootstrap/lib/card/lazy_tab.rb +37 -0
  105. data/mod/bootstrap/lib/card/tab.rb +76 -0
  106. data/mod/bootstrap/set/all/bootstrap/dropdown.rb +0 -1
  107. data/mod/bootstrap/set/all/bootstrap/tabs.rb +33 -124
  108. data/mod/bootstrap/set/all/bootstrap/tabs/tab_panel.haml +7 -0
  109. data/mod/carrierwave/set/abstract/attachment.rb +1 -1
  110. data/mod/carrierwave/set/abstract/attachment/cloud.rb +133 -0
  111. data/mod/carrierwave/set/abstract/attachment/coded.rb +22 -0
  112. data/mod/carrierwave/set/abstract/attachment/local.rb +40 -0
  113. data/mod/carrierwave/set/abstract/attachment/storage_type.rb +18 -186
  114. data/mod/carrierwave/set/abstract/attachment/upload_cache.rb +1 -1
  115. data/mod/carrierwave/set/abstract/attachment/web.rb +3 -0
  116. data/mod/carrierwave/set/type/file.rb +12 -11
  117. data/mod/carrierwave/set/type/image.rb +0 -2
  118. data/mod/carrierwave/spec/lib/carrier_wave/file_card_uploader_spec.rb +1 -15
  119. data/mod/carrierwave/spec/set/abstract/attachment/cloud_spec.rb +109 -0
  120. data/mod/carrierwave/spec/set/abstract/attachment/coded_spec.rb +111 -0
  121. data/mod/carrierwave/spec/set/abstract/attachment/web_spec.rb +41 -0
  122. data/mod/carrierwave/spec/set/type/file_spec.rb +11 -349
  123. data/mod/core/chunk/{literal.rb → escaped_literal.rb} +1 -1
  124. data/mod/core/chunk/keep_escaped_literal.rb +26 -0
  125. data/mod/core/chunk/uri.rb +2 -2
  126. data/mod/core/format/html_format.rb +4 -0
  127. data/mod/core/lib/card/fetch.rb +54 -0
  128. data/mod/core/lib/card/fetch/results.rb +125 -0
  129. data/mod/core/lib/card/fetch/retrieve.rb +56 -0
  130. data/mod/core/lib/card/fetch/store.rb +66 -0
  131. data/mod/core/lib/card/rule.rb +227 -0
  132. data/mod/core/set/abstract/code_file.rb +6 -6
  133. data/mod/core/set/abstract/haml_file.rb +4 -0
  134. data/mod/core/set/all/actify.rb +21 -20
  135. data/mod/core/set/all/active_card.rb +0 -28
  136. data/mod/core/set/all/assign_attributes.rb +29 -25
  137. data/mod/core/set/all/cache.rb +21 -28
  138. data/mod/core/set/all/chunk.rb +73 -78
  139. data/mod/core/set/all/codename.rb +2 -1
  140. data/mod/core/set/all/content.rb +5 -2
  141. data/mod/core/set/all/event_conditions.rb +65 -52
  142. data/mod/core/set/all/fetch.rb +10 -42
  143. data/mod/core/set/all/fetch_helper.rb +2 -125
  144. data/mod/core/set/all/initialize.rb +12 -8
  145. data/mod/core/set/all/location_history.rb +1 -1
  146. data/mod/core/set/all/name.rb +92 -90
  147. data/mod/core/set/all/name_events.rb +59 -35
  148. data/mod/core/set/all/pattern.rb +12 -17
  149. data/mod/core/set/all/permissions.rb +37 -46
  150. data/mod/core/set/all/references.rb +25 -32
  151. data/mod/core/set/all/rename.rb +18 -25
  152. data/mod/core/set/all/rules.rb +9 -234
  153. data/mod/core/set/all/states.rb +1 -1
  154. data/mod/core/set/all/subcards.rb +6 -23
  155. data/mod/core/set/all/tabs.rb +4 -3
  156. data/mod/core/set/all/templating.rb +3 -3
  157. data/mod/core/set/all/trash.rb +8 -7
  158. data/mod/core/set/all/type.rb +4 -4
  159. data/mod/core/set/all/update_read_rules.rb +2 -2
  160. data/mod/core/set_pattern/08_type_plus_right.rb +1 -2
  161. data/mod/core/spec/chunk/{literal_spec.rb → escaped_literal_spec.rb} +1 -1
  162. data/mod/core/spec/chunk/keep_escaped_literal_spec.rb +21 -0
  163. data/mod/core/spec/chunk/query_reference_spec.rb +2 -2
  164. data/mod/core/spec/chunk/uri_spec.rb +7 -7
  165. data/mod/core/spec/set/all/actify_spec.rb +7 -199
  166. data/mod/core/spec/set/all/chunk_spec.rb +1 -0
  167. data/mod/core/spec/set/all/event_conditions_spec.rb +6 -4
  168. data/mod/core/spec/set/all/fetch_helper_spec.rb +25 -8
  169. data/mod/core/spec/set/all/name_events_spec.rb +1 -1
  170. data/mod/core/spec/set/all/name_spec.rb +5 -16
  171. data/mod/core/spec/set/all/pattern_spec.rb +1 -1
  172. data/mod/core/spec/set/all/permissions_spec.rb +14 -6
  173. data/mod/core/spec/set/all/references_spec.rb +9 -0
  174. data/mod/core/spec/set/all/rename_spec.rb +13 -3
  175. data/mod/core/spec/set/all/rules_spec.rb +1 -1
  176. data/mod/core/spec/set/all/subcards_spec.rb +106 -0
  177. data/mod/core/spec/set/all/trash_spec.rb +24 -20
  178. data/mod/developer/set/all/event_viz.rb +1 -2
  179. data/mod/developer/set/right/debug.rb +13 -14
  180. data/mod/edit/set/all/bridge.rb +7 -7
  181. data/mod/edit/set/all/bridge/tab_visibility.rb +2 -2
  182. data/mod/edit/set/all/edit_name.rb +5 -37
  183. data/mod/edit/set/all/form.rb +3 -3
  184. data/mod/edit/set/all/form_buttons.rb +1 -1
  185. data/mod/edit/spec/set/all/form_spec.rb +1 -1
  186. data/mod/email/set/type/email_template/email_config.rb +1 -1
  187. data/mod/follow/set/all/follow/followed_by.rb +1 -2
  188. data/mod/follow/set/all/follow/follower_ids.rb +16 -4
  189. data/mod/follow/set/all/notify.rb +4 -7
  190. data/mod/follow/set/right/following.rb +1 -1
  191. data/mod/follow/set/self/edited.rb +1 -1
  192. data/mod/follow/set/type_plus_right/user/follow.rb +4 -7
  193. data/mod/follow/spec/set/all/notify_spec.rb +2 -2
  194. data/mod/google_analytics/set/all/google_analytics.rb +1 -1
  195. data/mod/history/lib/card/act.rb +1 -1
  196. data/mod/history/lib/card/act/act_renderer/relative_act_renderer.rb +3 -2
  197. data/mod/history/lib/card/change.rb +1 -1
  198. data/mod/history/set/all/history.rb +39 -6
  199. data/mod/history/set/all/history/act_listing.rb +1 -1
  200. data/mod/history/set/all/history/acts.rb +0 -4
  201. data/mod/history/set/all/history/events.rb +6 -5
  202. data/mod/history/set/all/history/last.rb +2 -2
  203. data/mod/history/set/all/history/revision.rb +1 -0
  204. data/mod/history/spec/set/all/history/revision_spec.rb +7 -3
  205. data/mod/machines/file/all_script_machine_output/file.js +69 -38415
  206. data/mod/machines/file/all_style_machine_output/file.css +4 -4
  207. data/mod/machines/file/script_html5shiv_printshiv_machine_output/file.js +1 -1
  208. data/mod/machines/lib/javascript/decko/bridge.js.coffee +3 -0
  209. data/mod/machines/lib/javascript/decko/filter_items.js.coffee +4 -4
  210. data/mod/machines/lib/javascript/decko/navbox.js.coffee +1 -0
  211. data/mod/machines/lib/javascript/decko/nest_editor_name.js.coffee +1 -1
  212. data/mod/machines/lib/javascript/decko/selectable_filtered_content.js.coffee +12 -0
  213. data/mod/machines/lib/javascript/decko/slotter.js.coffee +16 -3
  214. data/mod/machines/lib/stylesheets/style_cards.scss +1 -1
  215. data/mod/machines/lib/stylesheets/style_jquery_ui_smoothness.css +13 -13
  216. data/mod/machines/set/abstract/machine.rb +2 -2
  217. data/mod/machines/set/abstract/machine/output_cache.rb +1 -1
  218. data/mod/machines/set/abstract/machine/output_update.rb +15 -6
  219. data/mod/machines/set/all/reset_machines.rb +2 -2
  220. data/mod/machines/set/self/script_decko.rb +1 -1
  221. data/mod/machines/spec/set/type/coffeescript_spec.rb +19 -19
  222. data/mod/navbar/set/right/enabled_roles.rb +1 -1
  223. data/mod/navbar/set/self/account_links.rb +2 -2
  224. data/mod/navbar/set/self/navbox.rb +24 -20
  225. data/mod/pointer/lib/javascript/script_pointer_list_editor.js.coffee +7 -0
  226. data/mod/pointer/set/abstract/00_paging_params.rb +1 -3
  227. data/mod/pointer/set/abstract/02_pointer/events.rb +2 -1
  228. data/mod/pointer/set/abstract/02_pointer/html_views/filter.rb +1 -3
  229. data/mod/pointer/set/abstract/02_pointer/item_api.rb +7 -6
  230. data/mod/pointer/set/abstract/02_pointer/options_api.rb +1 -1
  231. data/mod/pointer/set/type/nest_list.rb +40 -0
  232. data/mod/pointer/set/type/nest_list/nest_list_input.haml +28 -0
  233. data/mod/pointer/spec/set/abstract/paging_params_spec.rb +1 -1
  234. data/mod/pointer/spec/set/abstract/pointer/html_views_spec.rb +3 -4
  235. data/mod/pointer/spec/set/type/mirror_list_spec.rb +6 -3
  236. data/mod/recaptcha/config/initializers/recaptcha.rb +54 -0
  237. data/mod/recaptcha/set/all/recaptcha.rb +1 -1
  238. data/mod/recaptcha/set/self/admin_info.rb +32 -0
  239. data/mod/{admin → recaptcha}/set/self/recaptcha_proxy.rb +0 -0
  240. data/mod/{admin → recaptcha}/set/self/recaptcha_secret_key.rb +0 -0
  241. data/mod/{admin → recaptcha}/set/self/recaptcha_settings.rb +0 -0
  242. data/mod/{admin → recaptcha}/set/self/recaptcha_site_key.rb +0 -0
  243. data/mod/rules/set/rule/editor.rb +2 -2
  244. data/mod/rules/set/rule/html_views.rb +1 -1
  245. data/mod/rules/set/rule/rules.rb +1 -2
  246. data/mod/rules/set/type/set.rb +1 -1
  247. data/mod/rules/spec/set/type/set_spec.rb +1 -1
  248. data/mod/search/lib/card/filter_query.rb +1 -2
  249. data/mod/search/set/abstract/00_filter_helper.rb +3 -5
  250. data/mod/search/set/abstract/02_search_params.rb +1 -1
  251. data/mod/search/set/abstract/03_filter.rb +2 -0
  252. data/mod/search/set/abstract/03_filter/filter_form.rb +1 -1
  253. data/mod/search/set/abstract/03_filter/form_helper.rb +4 -16
  254. data/mod/search/set/abstract/03_filter/selectable_filtered_content.haml +2 -0
  255. data/mod/search/set/self/search.rb +1 -1
  256. data/mod/search/template/abstract/search/checkbox_item.haml +2 -3
  257. data/mod/settings/set/abstract/permission.rb +2 -2
  258. data/mod/settings/set/right/read.rb +53 -43
  259. data/mod/settings/set/right/structure.rb +1 -1
  260. data/mod/settings/set/right/style.rb +1 -1
  261. data/mod/settings/set/type/setting.rb +5 -5
  262. data/mod/solid_cache/set/abstract/solid_cache.rb +1 -1
  263. data/mod/standard/set/all/comment.rb +1 -1
  264. data/mod/standard/set/all/list_changes.rb +2 -3
  265. data/mod/standard/set/all/path.rb +2 -1
  266. data/mod/standard/set/all/rich_html/content.rb +1 -1
  267. data/mod/standard/set/all/rich_html/error.rb +1 -1
  268. data/mod/standard/set/all/rich_html/menu.rb +1 -1
  269. data/mod/standard/set/all/rich_html/modal.rb +2 -2
  270. data/mod/standard/set/all/rich_html/show.rb +8 -0
  271. data/mod/standard/set/type/cardtype.rb +1 -3
  272. data/mod/standard/spec/set/all/history_spec.rb +20 -3
  273. data/mod/standard/spec/set/type/phrase_spec.rb +1 -1
  274. data/mod/tinymce_editor/public/assets/tinymce/skins/ui/oxide-dark/content.mobile.min.css +7 -0
  275. data/mod/tinymce_editor/public/assets/tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff +0 -0
  276. data/mod/tinymce_editor/public/assets/tinymce/skins/ui/oxide-dark/skin.mobile.min.css +7 -0
  277. data/mod/tinymce_editor/set/all/reference_editor/nest_editor.rb +6 -8
  278. data/mod/tinymce_editor/set/all/reference_editor/nest_editor/nest_parser.rb +4 -2
  279. data/mod/tinymce_editor/set/all/reference_editor/nest_image.rb +1 -1
  280. data/mod/virtual/lib/card/virtual.rb +3 -3
  281. data/tmpsets/set/mod001-utility/abstract/bs_badge.rb +3 -2
  282. data/tmpsets/set/mod001-utility/abstract/filterable.rb +8 -11
  283. data/tmpsets/set/mod001-utility/abstract/filterable_bar.rb +20 -0
  284. data/tmpsets/set/mod002-admin/self/admin_info.rb +26 -77
  285. data/tmpsets/set/mod002-admin/self/debugger.rb +12 -0
  286. data/tmpsets/set/mod002-admin/self/trash.rb +1 -1
  287. data/tmpsets/set/mod002-admin/self/version.rb +2 -2
  288. data/tmpsets/set/mod003-core/abstract/code_file.rb +1 -1
  289. data/tmpsets/set/mod003-core/abstract/haml_file.rb +4 -0
  290. data/tmpsets/set/mod003-core/all/abort.rb +1 -0
  291. data/tmpsets/set/mod003-core/all/actify.rb +16 -2
  292. data/tmpsets/set/mod003-core/all/assign_attributes.rb +29 -25
  293. data/tmpsets/set/mod003-core/all/cache.rb +21 -28
  294. data/tmpsets/set/mod003-core/all/chunk.rb +73 -78
  295. data/tmpsets/set/mod003-core/all/codename.rb +3 -1
  296. data/tmpsets/set/mod003-core/all/content.rb +64 -2
  297. data/tmpsets/set/mod003-core/all/event_conditions.rb +76 -37
  298. data/tmpsets/set/mod003-core/all/fetch.rb +20 -48
  299. data/tmpsets/set/mod003-core/all/fetch_helper.rb +6 -124
  300. data/tmpsets/set/mod003-core/all/initialize.rb +46 -16
  301. data/tmpsets/set/mod003-core/all/item.rb +16 -6
  302. data/tmpsets/set/mod003-core/all/location_history.rb +1 -1
  303. data/tmpsets/set/mod003-core/all/name.rb +93 -85
  304. data/tmpsets/set/mod003-core/all/name_events.rb +61 -36
  305. data/tmpsets/set/mod003-core/all/pattern.rb +16 -17
  306. data/tmpsets/set/mod003-core/all/permissions.rb +51 -90
  307. data/tmpsets/set/mod003-core/all/phases.rb +0 -4
  308. data/tmpsets/set/mod003-core/all/references.rb +34 -35
  309. data/tmpsets/set/mod003-core/all/rename.rb +20 -25
  310. data/tmpsets/set/mod003-core/all/rules.rb +8 -238
  311. data/tmpsets/set/mod003-core/all/states.rb +5 -3
  312. data/tmpsets/set/mod003-core/all/subcards.rb +27 -4
  313. data/tmpsets/set/mod003-core/all/tabs.rb +4 -3
  314. data/tmpsets/set/mod003-core/all/templating.rb +3 -3
  315. data/tmpsets/set/mod003-core/all/trash.rb +6 -6
  316. data/tmpsets/set/mod003-core/all/type.rb +5 -5
  317. data/tmpsets/set/mod003-core/all/update_read_rules.rb +2 -20
  318. data/tmpsets/set/mod004-virtual/abstract/virtual_cache.rb +1 -1
  319. data/tmpsets/set/mod005-history/all/history.rb +40 -7
  320. data/tmpsets/set/mod005-history/all/history/act_listing.rb +1 -1
  321. data/tmpsets/set/mod005-history/all/history/acts.rb +1 -5
  322. data/tmpsets/set/mod005-history/all/history/events.rb +1 -0
  323. data/tmpsets/set/mod005-history/all/history/last.rb +2 -2
  324. data/tmpsets/set/mod005-history/all/history/revision.rb +1 -0
  325. data/tmpsets/set/mod005-history/all/history_bridge.rb +4 -4
  326. data/tmpsets/set/mod006-basic_formats/all/all_css.rb +1 -1
  327. data/tmpsets/set/mod006-basic_formats/all/all_csv.rb +3 -7
  328. data/tmpsets/set/mod006-basic_formats/all/base.rb +19 -61
  329. data/tmpsets/set/mod006-basic_formats/all/head.rb +4 -2
  330. data/tmpsets/set/mod006-basic_formats/all/json.rb +1 -1
  331. data/tmpsets/set/mod006-basic_formats/all/rss.rb +1 -1
  332. data/tmpsets/set/mod006-basic_formats/self/head.rb +2 -2
  333. data/tmpsets/set/mod007-item/all/bar.rb +33 -43
  334. data/tmpsets/set/mod008-pointer/abstract/00_paging_params.rb +11 -6
  335. data/tmpsets/set/mod008-pointer/abstract/01_paging.rb +0 -1
  336. data/tmpsets/set/mod008-pointer/abstract/02_pointer.rb +1 -1
  337. data/tmpsets/set/mod008-pointer/abstract/02_pointer/events.rb +32 -11
  338. data/tmpsets/set/mod008-pointer/abstract/02_pointer/html_views.rb +26 -9
  339. data/tmpsets/set/mod008-pointer/abstract/02_pointer/html_views/filter.rb +2 -4
  340. data/tmpsets/set/mod008-pointer/abstract/02_pointer/item_api.rb +52 -31
  341. data/tmpsets/set/mod008-pointer/abstract/02_pointer/options_api.rb +7 -14
  342. data/tmpsets/set/mod008-pointer/abstract/id_pointer.rb +30 -0
  343. data/tmpsets/set/mod008-pointer/right/{options.rb → content_options.rb} +4 -4
  344. data/tmpsets/set/mod008-pointer/type/link_list.rb +49 -0
  345. data/tmpsets/set/mod008-pointer/type/list.rb +25 -0
  346. data/tmpsets/set/{mod021-standard/type/listed_by.rb → mod008-pointer/type/mirror_list.rb} +13 -12
  347. data/tmpsets/set/{mod021-standard/type/list.rb → mod008-pointer/type/mirrored_list.rb} +9 -9
  348. data/tmpsets/set/mod008-pointer/type/nest_list.rb +49 -0
  349. data/tmpsets/set/mod009-ace_editor/self/ace.rb +16 -0
  350. data/tmpsets/set/mod011-tinymce_editor/all/reference_editor.rb +32 -0
  351. data/tmpsets/set/mod011-tinymce_editor/all/reference_editor/link_editor.rb +42 -0
  352. data/tmpsets/set/mod011-tinymce_editor/all/reference_editor/link_editor/link_parser.rb +43 -0
  353. data/tmpsets/set/mod011-tinymce_editor/all/reference_editor/nest_editor.rb +181 -0
  354. data/tmpsets/set/{mod023-edit/all → mod011-tinymce_editor/all/reference_editor}/nest_editor/nest_parser.rb +14 -6
  355. data/tmpsets/set/mod011-tinymce_editor/all/reference_editor/nest_image.rb +79 -0
  356. data/tmpsets/set/mod011-tinymce_editor/self/tiny_mce.rb +16 -0
  357. data/tmpsets/set/mod012-solid_cache/abstract/solid_cache.rb +1 -1
  358. data/tmpsets/set/mod012-solid_cache/right/solid_cache.rb +3 -3
  359. data/tmpsets/set/mod013-basic_types/type/html.rb +7 -3
  360. data/tmpsets/set/mod013-basic_types/type/json.rb +5 -1
  361. data/tmpsets/set/mod013-basic_types/type/plain_text.rb +1 -1
  362. data/tmpsets/set/mod014-machines/abstract/machine.rb +4 -4
  363. data/tmpsets/set/mod014-machines/abstract/machine/output_update.rb +15 -6
  364. data/tmpsets/set/mod014-machines/abstract/script.rb +1 -1
  365. data/tmpsets/set/mod014-machines/self/script_decko.rb +4 -3
  366. data/tmpsets/set/mod014-machines/type/css.rb +1 -1
  367. data/tmpsets/set/mod015-settings/abstract/permission.rb +6 -2
  368. data/tmpsets/set/mod015-settings/all/supports_content_options.rb +16 -0
  369. data/tmpsets/set/mod015-settings/right/content_option_view.rb +19 -0
  370. data/tmpsets/set/mod015-settings/right/content_options.rb +27 -0
  371. data/tmpsets/set/mod015-settings/right/default.rb +18 -2
  372. data/tmpsets/set/mod015-settings/right/guide.rb +17 -0
  373. data/tmpsets/set/mod015-settings/right/help.rb +2 -1
  374. data/tmpsets/set/mod015-settings/right/input_type.rb +44 -0
  375. data/tmpsets/set/mod015-settings/right/read.rb +53 -43
  376. data/tmpsets/set/mod015-settings/right/script.rb +6 -0
  377. data/tmpsets/set/mod015-settings/right/structure.rb +7 -1
  378. data/tmpsets/set/mod015-settings/right/style.rb +2 -2
  379. data/tmpsets/set/mod015-settings/self/autoname.rb +3 -1
  380. data/tmpsets/set/mod015-settings/self/captcha.rb +4 -1
  381. data/tmpsets/set/mod015-settings/self/content_option_view.rb +19 -0
  382. data/tmpsets/set/mod015-settings/self/content_options.rb +19 -0
  383. data/tmpsets/set/mod015-settings/self/create.rb +2 -1
  384. data/tmpsets/set/mod015-settings/self/default.rb +1 -1
  385. data/tmpsets/set/mod015-settings/self/delete.rb +2 -1
  386. data/tmpsets/set/mod015-settings/self/{add_help.rb → guide.rb} +6 -5
  387. data/tmpsets/set/mod015-settings/self/head.rb +3 -1
  388. data/tmpsets/set/mod015-settings/self/help.rb +3 -1
  389. data/tmpsets/set/mod015-settings/self/input_type.rb +22 -0
  390. data/tmpsets/set/mod015-settings/self/layout.rb +3 -1
  391. data/tmpsets/set/mod015-settings/self/on_create.rb +2 -1
  392. data/tmpsets/set/mod015-settings/self/on_delete.rb +2 -1
  393. data/tmpsets/set/mod015-settings/self/on_update.rb +2 -1
  394. data/tmpsets/set/mod015-settings/self/read.rb +2 -1
  395. data/tmpsets/set/mod015-settings/self/structure.rb +3 -1
  396. data/tmpsets/set/mod015-settings/self/style.rb +3 -1
  397. data/tmpsets/set/mod015-settings/self/table_of_contents.rb +4 -1
  398. data/tmpsets/set/mod015-settings/self/thanks.rb +3 -1
  399. data/tmpsets/set/mod015-settings/self/update.rb +2 -1
  400. data/tmpsets/set/mod015-settings/type/setting.rb +19 -39
  401. data/tmpsets/set/mod016-email/abstract/test_context.rb +1 -1
  402. data/tmpsets/set/mod016-email/all/email_html.rb +2 -2
  403. data/tmpsets/set/mod016-email/all/email_text.rb +2 -2
  404. data/tmpsets/set/mod016-email/type/email_template/email_config.rb +2 -2
  405. data/tmpsets/set/mod017-follow/all/follow/followed_by.rb +2 -3
  406. data/tmpsets/set/mod017-follow/all/follow/follower_ids.rb +16 -4
  407. data/tmpsets/set/mod017-follow/all/notify.rb +2 -6
  408. data/tmpsets/set/mod017-follow/all/notify/base_views.rb +5 -8
  409. data/tmpsets/set/mod017-follow/right/account.rb +8 -6
  410. data/tmpsets/set/mod017-follow/right/followers.rb +3 -6
  411. data/tmpsets/set/mod017-follow/right/following.rb +2 -2
  412. data/tmpsets/set/mod017-follow/self/edited.rb +1 -1
  413. data/tmpsets/set/mod017-follow/self/follow_defaults.rb +1 -1
  414. data/tmpsets/set/mod017-follow/type/cardtype.rb +6 -0
  415. data/tmpsets/set/mod017-follow/type_plus_right/user/follow.rb +7 -10
  416. data/tmpsets/set/mod018-developer/right/debug.rb +14 -15
  417. data/tmpsets/set/mod019-carrierwave/abstract/attachment.rb +3 -6
  418. data/tmpsets/set/mod019-carrierwave/abstract/attachment/storage_type.rb +1 -2
  419. data/tmpsets/set/mod019-carrierwave/abstract/attachment/upload_cache.rb +1 -2
  420. data/tmpsets/set/mod019-carrierwave/all/file_utils.rb +5 -1
  421. data/tmpsets/set/mod019-carrierwave/self/admin.rb +1 -1
  422. data/tmpsets/set/mod019-carrierwave/self/favicon.rb +5 -0
  423. data/tmpsets/set/mod019-carrierwave/self/new_file.rb +1 -1
  424. data/tmpsets/set/mod019-carrierwave/self/new_image.rb +1 -1
  425. data/tmpsets/set/mod019-carrierwave/type/file.rb +3 -2
  426. data/tmpsets/set/mod019-carrierwave/type/image.rb +2 -72
  427. data/tmpsets/set/mod019-carrierwave/type/image/html_views.rb +78 -0
  428. data/tmpsets/set/mod020-media/abstract/media.rb +26 -0
  429. data/tmpsets/set/mod020-media/self/style_media.rb +15 -0
  430. data/tmpsets/set/mod020-media/type/image.rb +47 -0
  431. data/tmpsets/set/{mod020-search → mod021-search}/abstract/00_filter_helper.rb +5 -7
  432. data/tmpsets/set/{mod020-search → mod021-search}/abstract/02_search_params.rb +1 -1
  433. data/tmpsets/set/mod021-search/abstract/03_filter.rb +32 -0
  434. data/tmpsets/set/{mod020-search/abstract/03_filter.rb → mod021-search/abstract/03_filter/filter_form.rb} +47 -80
  435. data/tmpsets/set/{mod020-search/abstract/01_filter_form_helper.rb → mod021-search/abstract/03_filter/form_helper.rb} +32 -43
  436. data/tmpsets/set/mod021-search/abstract/03_filter/query_construction.rb +45 -0
  437. data/tmpsets/set/{mod020-search → mod021-search}/abstract/04_right_filter_form.rb +6 -2
  438. data/tmpsets/set/{mod020-search → mod021-search}/abstract/search.rb +1 -0
  439. data/tmpsets/set/{mod020-search → mod021-search}/abstract/search/views.rb +2 -2
  440. data/tmpsets/set/{mod020-search → mod021-search}/abstract/wql_search.rb +5 -5
  441. data/tmpsets/set/mod021-search/right/children.rb +13 -0
  442. data/tmpsets/set/mod021-search/right/created.rb +12 -0
  443. data/tmpsets/set/mod021-search/right/edited.rb +12 -0
  444. data/tmpsets/set/mod021-search/right/editors.rb +12 -0
  445. data/tmpsets/set/mod021-search/right/follow.rb +12 -0
  446. data/tmpsets/set/mod021-search/right/linked_to_by.rb +12 -0
  447. data/tmpsets/set/mod021-search/right/links_to.rb +12 -0
  448. data/tmpsets/set/mod021-search/right/mates.rb +12 -0
  449. data/tmpsets/set/mod021-search/right/nested_by.rb +12 -0
  450. data/tmpsets/set/mod021-search/right/nests.rb +12 -0
  451. data/tmpsets/set/mod021-search/right/referred_to_by.rb +12 -0
  452. data/tmpsets/set/mod021-search/right/refers_to.rb +12 -0
  453. data/tmpsets/set/{mod020-search → mod021-search}/self/recent.rb +1 -1
  454. data/tmpsets/set/{mod020-search → mod021-search}/self/search.rb +4 -2
  455. data/tmpsets/set/{mod020-search → mod021-search}/type/search_type.rb +6 -5
  456. data/tmpsets/set/{mod021-standard → mod022-standard}/all/comment.rb +2 -1
  457. data/tmpsets/set/{mod021-standard → mod022-standard}/all/error.rb +2 -2
  458. data/tmpsets/set/{mod021-standard → mod022-standard}/all/links.rb +0 -0
  459. data/tmpsets/set/{mod021-standard → mod022-standard}/all/list_changes.rb +7 -8
  460. data/tmpsets/set/{mod021-standard → mod022-standard}/all/path.rb +7 -7
  461. data/tmpsets/set/{mod021-standard → mod022-standard}/all/rich_html.rb +0 -0
  462. data/tmpsets/set/{mod021-standard → mod022-standard}/all/rich_html/alert.rb +0 -0
  463. data/tmpsets/set/{mod021-standard → mod022-standard}/all/rich_html/content.rb +48 -18
  464. data/tmpsets/set/{mod021-standard → mod022-standard}/all/rich_html/error.rb +21 -28
  465. data/tmpsets/set/{mod021-standard → mod022-standard}/all/rich_html/frame.rb +0 -0
  466. data/tmpsets/set/{mod021-standard → mod022-standard}/all/rich_html/header.rb +0 -8
  467. data/tmpsets/set/mod022-standard/all/rich_html/html_views/guide.rb +60 -0
  468. data/tmpsets/set/{mod021-standard → mod022-standard}/all/rich_html/html_views/help.rb +28 -6
  469. data/tmpsets/set/{mod021-standard → mod022-standard}/all/rich_html/html_views/info.rb +1 -1
  470. data/tmpsets/set/{mod021-standard → mod022-standard}/all/rich_html/html_views/size.rb +0 -0
  471. data/tmpsets/set/mod022-standard/all/rich_html/menu.rb +138 -0
  472. data/tmpsets/set/{mod021-standard → mod022-standard}/all/rich_html/modal.rb +3 -3
  473. data/tmpsets/set/{mod021-standard → mod022-standard}/all/rich_html/overlay.rb +26 -4
  474. data/tmpsets/set/{mod021-standard → mod022-standard}/all/rich_html/process_layout.rb +0 -0
  475. data/tmpsets/set/{mod021-standard → mod022-standard}/all/rich_html/show.rb +8 -0
  476. data/tmpsets/set/{mod021-standard → mod022-standard}/all/rich_html/title.rb +3 -3
  477. data/tmpsets/set/{mod021-standard → mod022-standard}/all/rich_html/wrapper.rb +0 -0
  478. data/tmpsets/set/{mod021-standard → mod022-standard}/right/discussion.rb +8 -2
  479. data/tmpsets/set/{mod021-standard → mod022-standard}/right/head.rb +4 -0
  480. data/tmpsets/set/mod022-standard/right/type_plus_right.rb +13 -0
  481. data/tmpsets/set/{mod021-standard → mod022-standard}/right/when_created.rb +0 -0
  482. data/tmpsets/set/{mod021-standard → mod022-standard}/right/when_last_edited.rb +0 -0
  483. data/tmpsets/set/{mod021-standard → mod022-standard}/self/alerts.rb +0 -0
  484. data/tmpsets/set/mod022-standard/self/cardtype.rb +51 -0
  485. data/tmpsets/set/{mod021-standard → mod022-standard}/self/codenames.rb +0 -0
  486. data/tmpsets/set/{mod021-standard → mod022-standard}/self/foot.rb +0 -0
  487. data/tmpsets/set/{mod021-standard → mod022-standard}/self/home.rb +0 -0
  488. data/tmpsets/set/{mod021-standard → mod022-standard}/self/now.rb +0 -0
  489. data/tmpsets/set/mod022-standard/self/sidebar.rb +14 -0
  490. data/tmpsets/set/{mod021-standard → mod022-standard}/type/basic.rb +2 -2
  491. data/tmpsets/set/mod022-standard/type/cardtype.rb +136 -0
  492. data/tmpsets/set/{mod021-standard → mod022-standard}/type/layout_type.rb +0 -0
  493. data/tmpsets/set/{mod021-standard → mod022-standard}/type/notification_template.rb +0 -0
  494. data/tmpsets/set/{mod021-standard → mod022-standard}/type/number.rb +1 -1
  495. data/tmpsets/set/{mod021-standard → mod022-standard}/type/phrase.rb +1 -1
  496. data/tmpsets/set/{mod021-standard → mod022-standard}/type/session.rb +37 -9
  497. data/tmpsets/set/{mod021-standard → mod022-standard}/type/toggle.rb +9 -1
  498. data/tmpsets/set/{mod021-standard → mod022-standard}/type/uri.rb +1 -1
  499. data/tmpsets/set/mod023-rules/right/self.rb +12 -0
  500. data/tmpsets/set/{mod022-rules → mod023-rules}/rstar/rule_user.rb +0 -0
  501. data/tmpsets/set/mod023-rules/rule/bar_view.rb +97 -0
  502. data/tmpsets/set/{mod022-rules → mod023-rules}/rule/bridge_rules_editor.rb +5 -10
  503. data/tmpsets/set/mod023-rules/rule/editor.rb +120 -0
  504. data/tmpsets/set/mod023-rules/rule/html_views.rb +22 -0
  505. data/tmpsets/set/mod023-rules/rule/quick_editor.rb +48 -0
  506. data/tmpsets/set/{mod022-rules → mod023-rules}/rule/rule_form.rb +0 -0
  507. data/tmpsets/set/{mod022-rules → mod023-rules}/rule/rule_form/buttons.rb +3 -1
  508. data/tmpsets/set/{mod022-rules → mod023-rules}/rule/rule_form/form_elements.rb +2 -2
  509. data/tmpsets/set/{mod022-rules → mod023-rules}/rule/rule_form/rule_set_radio.rb +3 -6
  510. data/tmpsets/set/{mod022-rules → mod023-rules}/rule/rule_form/set_selection.rb +3 -10
  511. data/tmpsets/set/{mod022-rules → mod023-rules}/rule/rules.rb +9 -1
  512. data/tmpsets/set/{mod022-rules → mod023-rules}/self/script_rules.rb +0 -0
  513. data/tmpsets/set/{mod022-rules → mod023-rules}/type/set.rb +38 -21
  514. data/tmpsets/set/mod023-rules/type/set/html_views.rb +60 -0
  515. data/tmpsets/set/mod023-rules/type/set/html_views/rule_lists.rb +51 -0
  516. data/tmpsets/set/mod023-rules/type/set/html_views/template.rb +21 -0
  517. data/tmpsets/set/{mod022-rules → mod023-rules}/type/set/rules_filter.rb +24 -10
  518. data/tmpsets/set/{mod022-rules → mod023-rules}/type/set/setting_lists.rb +18 -25
  519. data/tmpsets/set/{mod023-edit → mod024-edit}/all/bridge.rb +8 -7
  520. data/tmpsets/set/mod024-edit/all/bridge/bridge_pills.rb +56 -0
  521. data/tmpsets/set/{mod023-edit → mod024-edit}/all/bridge/follow_section.rb +0 -0
  522. data/tmpsets/set/mod024-edit/all/bridge/related_section.rb +43 -0
  523. data/tmpsets/set/mod024-edit/all/bridge/tab_views.rb +50 -0
  524. data/tmpsets/set/{mod023-edit → mod024-edit}/all/bridge/tab_visibility.rb +12 -10
  525. data/tmpsets/set/{mod023-edit → mod024-edit}/all/edit_content.rb +12 -16
  526. data/tmpsets/set/{mod023-edit → mod024-edit}/all/edit_inline.rb +16 -8
  527. data/tmpsets/set/{mod023-edit → mod024-edit}/all/edit_name.rb +10 -44
  528. data/tmpsets/set/mod024-edit/all/edit_type.rb +110 -0
  529. data/tmpsets/set/{mod023-edit → mod024-edit}/all/editing.rb +7 -3
  530. data/tmpsets/set/{mod023-edit → mod024-edit}/all/editor.rb +28 -15
  531. data/tmpsets/set/{mod023-edit → mod024-edit}/all/form.rb +34 -44
  532. data/tmpsets/set/{mod023-edit → mod024-edit}/all/form_buttons.rb +13 -4
  533. data/tmpsets/set/{mod023-edit → mod024-edit}/all/form_elements.rb +1 -0
  534. data/tmpsets/set/{mod023-edit → mod024-edit}/all/formgroup.rb +5 -5
  535. data/tmpsets/set/{mod023-edit → mod024-edit}/all/new.rb +66 -4
  536. data/tmpsets/set/mod024-edit/all/overlay_guide.rb +18 -0
  537. data/tmpsets/set/mod024-edit/all/template_nest.rb +51 -0
  538. data/tmpsets/set/mod024-edit/type/list.rb +24 -0
  539. data/tmpsets/set/mod024-edit/type/plain_text.rb +22 -0
  540. data/tmpsets/set/mod024-edit/type/pointer.rb +20 -0
  541. data/tmpsets/set/{mod024-date → mod025-date}/all/calendar.rb +1 -1
  542. data/tmpsets/set/mod025-date/self/datepicker.rb +15 -0
  543. data/tmpsets/set/{mod024-date → mod025-date}/self/script_datepicker.rb +0 -0
  544. data/tmpsets/set/{mod024-date → mod025-date}/self/script_datepicker_config.rb +0 -0
  545. data/tmpsets/set/{mod024-date → mod025-date}/self/style_datepicker.rb +0 -0
  546. data/tmpsets/set/{mod024-date → mod025-date}/type/date.rb +1 -1
  547. data/tmpsets/set/mod026-account/abstract/account_field.rb +26 -0
  548. data/tmpsets/set/mod026-account/abstract/accountable.rb +58 -0
  549. data/tmpsets/set/mod026-account/all/account.rb +102 -0
  550. data/tmpsets/set/mod026-account/right/account.rb +67 -0
  551. data/tmpsets/set/mod026-account/right/account/events.rb +107 -0
  552. data/tmpsets/set/mod026-account/right/account/views.rb +74 -0
  553. data/tmpsets/set/mod026-account/right/api_key.rb +57 -0
  554. data/tmpsets/set/{mod025-account → mod026-account}/right/email.rb +3 -3
  555. data/tmpsets/set/{mod025-account → mod026-account}/right/password.rb +6 -9
  556. data/tmpsets/set/mod026-account/right/roles.rb +36 -0
  557. data/tmpsets/set/{mod025-account → mod026-account}/right/salt.rb +5 -1
  558. data/tmpsets/set/{mod025-account → mod026-account}/right/status.rb +10 -1
  559. data/tmpsets/set/{mod025-account → mod026-account}/self/signin.rb +5 -5
  560. data/tmpsets/set/mod026-account/type/role.rb +30 -0
  561. data/tmpsets/set/mod026-account/type/signup.rb +63 -0
  562. data/tmpsets/set/mod026-account/type/signup/views.rb +102 -0
  563. data/tmpsets/set/{mod025-account → mod026-account}/type/user.rb +16 -27
  564. data/tmpsets/set/{mod025-account → mod026-account}/type_plus_right/user/email.rb +0 -0
  565. data/tmpsets/set/mod027-navbar/abstract/account_dropdown.rb +34 -0
  566. data/tmpsets/set/mod027-navbar/abstract/pointer/html_views.rb +14 -0
  567. data/tmpsets/set/mod027-navbar/all/navbar_links.rb +67 -0
  568. data/tmpsets/set/mod027-navbar/right/enabled_roles.rb +70 -0
  569. data/tmpsets/set/{mod025-account → mod027-navbar}/self/account_links.rb +37 -20
  570. data/tmpsets/set/mod027-navbar/self/dropdown_divider.rb +18 -0
  571. data/tmpsets/set/mod027-navbar/self/navbox.rb +45 -0
  572. data/tmpsets/set/mod027-navbar/type/html.rb +23 -0
  573. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/abstract/bootstrap_code_file.rb +0 -0
  574. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/abstract/bootswatch_theme.rb +2 -2
  575. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/abstract/bootswatch_theme/html_views.rb +2 -2
  576. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/all/bootstrap/accordion.rb +0 -0
  577. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/all/bootstrap/dropdown.rb +1 -2
  578. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/all/bootstrap/form.rb +0 -0
  579. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/all/bootstrap/helper.rb +9 -4
  580. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/all/bootstrap/icon.rb +0 -0
  581. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/all/bootstrap/navbar.rb +0 -0
  582. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/all/bootstrap/table.rb +0 -0
  583. data/tmpsets/set/mod028-bootstrap/all/bootstrap/tabs.rb +49 -0
  584. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/all/bootstrap/wrapper.rb +0 -0
  585. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/all/rich_bootstrap.rb +0 -0
  586. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/self/bootstrap_core.rb +0 -0
  587. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/self/bootstrap_functions.rb +0 -0
  588. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/self/font_awesome.rb +0 -0
  589. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/self/material_icons.rb +0 -0
  590. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/self/script_bootstrap.rb +0 -0
  591. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/self/script_load_select2.rb +0 -0
  592. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/self/script_select2.rb +0 -0
  593. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/self/smartmenu_css.rb +0 -0
  594. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/self/smartmenu_js.rb +0 -0
  595. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/self/style_bootstrap_cards.rb +0 -0
  596. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/self/style_bootstrap_colorpicker.rb +0 -0
  597. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/self/style_select2.rb +0 -0
  598. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/self/style_select2_bootstrap.rb +0 -0
  599. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/type/bootswatch_skin.rb +0 -0
  600. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/type/customized_bootswatch_skin.rb +6 -5
  601. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/type/customized_bootswatch_skin/html_views.rb +1 -2
  602. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/type_plus_right/customized_bootswatch_skin/colors.rb +1 -1
  603. data/tmpsets/set/{mod027-google_analytics → mod029-google_analytics}/all/google_analytics.rb +1 -1
  604. data/tmpsets/set/{mod028-recaptcha → mod030-recaptcha}/all/recaptcha.rb +5 -10
  605. data/tmpsets/set/mod030-recaptcha/self/admin_info.rb +41 -0
  606. data/tmpsets/set/{mod002-admin → mod030-recaptcha}/self/recaptcha_proxy.rb +2 -2
  607. data/tmpsets/set/{mod002-admin → mod030-recaptcha}/self/recaptcha_secret_key.rb +2 -2
  608. data/tmpsets/set/mod030-recaptcha/self/recaptcha_settings.rb +53 -0
  609. data/tmpsets/set/{mod002-admin → mod030-recaptcha}/self/recaptcha_site_key.rb +2 -2
  610. data/tmpsets/set/mod031-markdown/type/markdown.rb +26 -0
  611. data/tmpsets/set_pattern/100-all.rb +2 -1
  612. data/tmpsets/set_pattern/101-all_plus.rb +2 -1
  613. data/tmpsets/set_pattern/102-type.rb +8 -1
  614. data/tmpsets/set_pattern/103-star.rb +2 -1
  615. data/tmpsets/set_pattern/104-rstar.rb +2 -1
  616. data/tmpsets/set_pattern/105-rule.rb +2 -1
  617. data/tmpsets/set_pattern/106-right.rb +6 -1
  618. data/tmpsets/set_pattern/107-type_plus_right.rb +7 -3
  619. data/tmpsets/set_pattern/108-self.rb +6 -1
  620. metadata +264 -173
  621. data/config/initializers/recaptcha.rb +0 -46
  622. data/lib/card/act_manager.rb +0 -188
  623. data/lib/card/act_manager/stage.rb +0 -56
  624. data/lib/card/act_manager/stage_director.rb +0 -323
  625. data/lib/card/act_manager/stage_director/phases.rb +0 -37
  626. data/lib/card/tasks/card/seed.rake +0 -0
  627. data/mod/core/set/all/erb.rb +0 -11
  628. data/mod/core/set/all/phases.rb +0 -12
  629. data/mod/core/set/all/stages.rb +0 -17
  630. data/mod/core/spec/set/all/phases_spec.rb +0 -5
  631. data/tmpsets/set/mod001-utility/abstract/media.rb +0 -42
  632. data/tmpsets/set/mod015-settings/right/add_help.rb +0 -10
  633. data/tmpsets/set/mod015-settings/self/accountable.rb +0 -12
  634. data/tmpsets/set/mod015-settings/self/input.rb +0 -12
  635. data/tmpsets/set/mod015-settings/self/options.rb +0 -13
  636. data/tmpsets/set/mod015-settings/self/options_label.rb +0 -13
  637. data/tmpsets/set/mod020-search/self/navbox.rb +0 -41
  638. data/tmpsets/set/mod021-standard/all/rich_html/menu.rb +0 -75
  639. data/tmpsets/set/mod021-standard/type/cardtype.rb +0 -104
  640. data/tmpsets/set/mod022-rules/rule/editor.rb +0 -193
  641. data/tmpsets/set/mod022-rules/rule/table.rb +0 -36
  642. data/tmpsets/set/mod022-rules/rule/table_row.rb +0 -72
  643. data/tmpsets/set/mod022-rules/type/set/html_views.rb +0 -78
  644. data/tmpsets/set/mod022-rules/type/set/html_views/nest_rules.rb +0 -23
  645. data/tmpsets/set/mod022-rules/type/set/html_views/rules_bridge.rb +0 -30
  646. data/tmpsets/set/mod022-rules/type/set/html_views/template.rb +0 -52
  647. data/tmpsets/set/mod023-edit/all/bridge/tab_views.rb +0 -84
  648. data/tmpsets/set/mod023-edit/all/edit_type.rb +0 -37
  649. data/tmpsets/set/mod023-edit/all/nest_editor.rb +0 -115
  650. data/tmpsets/set/mod023-edit/all/nest_image.rb +0 -46
  651. data/tmpsets/set/mod025-account/all/account.rb +0 -78
  652. data/tmpsets/set/mod025-account/right/account.rb +0 -199
  653. data/tmpsets/set/mod025-account/right/token.rb +0 -63
  654. data/tmpsets/set/mod025-account/type/signup.rb +0 -191
  655. data/tmpsets/set/mod026-bootstrap/all/bootstrap/tabs.rb +0 -140
@@ -23,22 +23,17 @@ end
23
23
  # options.
24
24
 
25
25
  def ok? action
26
- @action_ok = true
27
- send "ok_to_#{action}"
28
- @action_ok
29
- end
30
-
31
- def ok_with_fetch? action, opts={}
32
- trait = opts.delete :trait
33
- card = trait.nil? ? self : fetch(trait, opts)
34
- card&.ok_without_fetch? action
26
+ @ok ||= {}
27
+ aok = @ok[Auth.as_id] ||= {}
28
+ if (cached = aok[action])
29
+ cached
30
+ else
31
+ aok[action] = send "ok_to_#{action}"
32
+ end
35
33
  end
36
34
 
37
- # note: method is chained so that we can return the instance variable @action_ok
38
- alias_method_chain :ok?, :fetch
39
-
40
- def ok! action, opts={}
41
- raise Card::Error::PermissionDenied, self unless ok? action, opts
35
+ def ok! action
36
+ raise Card::Error::PermissionDenied, self unless ok? action
42
37
  end
43
38
 
44
39
  def who_can action
@@ -46,36 +41,27 @@ def who_can action
46
41
  end
47
42
 
48
43
  def anyone_can? action
49
- who_can(action).include? Card::AnyoneID
44
+ who_can(action).include? AnyoneID
50
45
  end
51
46
 
52
47
  def direct_rule_card action
53
48
  direct_rule_id = rule_card_id action
54
49
  require_permission_rule! direct_rule_id, action
55
- Card.fetch direct_rule_id, skip_modules: true
50
+ Card.quick_fetch direct_rule_id
56
51
  end
57
52
 
58
53
  def permission_rule_id action
59
- direct_rule = direct_rule_card action
60
- applicable_permission_rule_id direct_rule, action
61
- end
62
-
63
- def permission_rule_id_and_class action
64
- direct_rule = direct_rule_card action
65
- [
66
- applicable_permission_rule_id(direct_rule, action),
67
- direct_rule.rule_class_name
68
- ]
69
- end
70
-
71
- def applicable_permission_rule_id direct_rule, action
72
- if junction? && direct_rule.db_content =~ /^\[?\[?_left\]?\]?$/
54
+ if junction? && rule(action).match?(/^\[?\[?_left\]?\]?$/)
73
55
  left_permission_rule_id action
74
56
  else
75
- direct_rule.id
57
+ rule_card_id(action)
76
58
  end
77
59
  end
78
60
 
61
+ def permission_rule_id_and_class action
62
+ [permission_rule_id(action), direct_rule_card(action).rule_class_name]
63
+ end
64
+
79
65
  def left_permission_rule_id action
80
66
  lcard = left_or_new(skip_virtual: true, skip_modules: true)
81
67
  if action == :create && lcard.real? && lcard.action != :create
@@ -97,7 +83,7 @@ def require_permission_rule! rule_id, action
97
83
  end
98
84
 
99
85
  def rule_class_name
100
- trunk.type_id == Card::SetID ? name.trunk_name.tag : nil
86
+ trunk.type_id == SetID ? name.trunk_name.tag : nil
101
87
  end
102
88
 
103
89
  def you_cant what
@@ -106,7 +92,7 @@ end
106
92
 
107
93
  def deny_because why
108
94
  @permission_errors << why if @permission_errors
109
- @action_ok = false
95
+ false
110
96
  end
111
97
 
112
98
  def permitted? action
@@ -118,16 +104,19 @@ end
118
104
 
119
105
  def permit action, verb=nil
120
106
  # not called by ok_to_read
121
- deny_because "Currently in read-only mode" if Card.config.read_only
107
+ if Card.config.read_only
108
+ deny_because "Currently in read-only mode"
109
+ return false
110
+ end
122
111
 
123
- return if permitted? action
112
+ return true if permitted? action
124
113
  verb ||= action.to_s
125
114
  deny_because you_cant("#{verb} #{name.present? ? name : 'this'}")
126
115
  end
127
116
 
128
117
  def ok_to_create
129
- permit :create
130
- return if !@action_ok || !junction?
118
+ return false unless permit :create
119
+ return true if simple?
131
120
 
132
121
  %i[left right].each do |side|
133
122
  # left is supercard; create permissions will get checked there.
@@ -137,23 +126,25 @@ def ok_to_create
137
126
  next unless part_card && part_card.new_card?
138
127
  unless part_card.ok? :create
139
128
  deny_because you_cant("create #{part_card.name}")
129
+ return false
140
130
  end
141
131
  end
132
+ true
142
133
  end
143
134
 
144
135
  def ok_to_read
145
- return if Auth.always_ok?
146
- @read_rule_id ||= permission_rule_id(:read)
147
- return if Auth.as_card.read_rules.member? @read_rule_id
136
+ return true if Auth.always_ok?
137
+
138
+ self.read_rule_id ||= permission_rule_id :read
139
+ return true if Auth.as_card.read_rules_hash[read_rule_id]
140
+
148
141
  deny_because you_cant "read this"
149
142
  end
150
143
 
151
144
  def ok_to_update
152
- permit :update
153
- if @action_ok && type_id_changed? && !permitted?(:create)
154
- deny_because you_cant("change to this type (need create permission)")
155
- end
156
- ok_to_read if @action_ok
145
+ return false unless permit(:update)
146
+ return true unless type_id_changed? && !permitted?(:create)
147
+ deny_because you_cant("change to this type (need create permission)")
157
148
  end
158
149
 
159
150
  def ok_to_delete
@@ -230,7 +221,7 @@ event :check_permissions, :validate do
230
221
  end
231
222
 
232
223
  def action_for_permission_check
233
- commenting? ? :update : @action
224
+ commenting? ? :update : action
234
225
  end
235
226
 
236
227
  def track_permission_errors
@@ -41,12 +41,6 @@ def name_referers
41
41
  Card.joins(:references_out).where card_references: { referee_key: key }
42
42
  end
43
43
 
44
- # cards that refer to self or any descendant
45
- def family_referers
46
- @family_referers ||= ([self] + descendants).map(&:referers).flatten.uniq
47
- # TODO: make this more efficient using partial references!
48
- end
49
-
50
44
  # replace references in card content
51
45
  def replace_reference_syntax old_name, new_name
52
46
  obj_content = Card::Content.new content, self
@@ -86,7 +80,7 @@ end
86
80
 
87
81
  # interpretation phase helps to prevent duplicate references
88
82
  # results in hash like:
89
- # { referee1_key: [referee1_id, referee1_type1, referee1_type2],
83
+ # { referee1_key: [referee1_id, referee1_type2],
90
84
  # referee2_key...
91
85
  # }
92
86
  def interpret_reference ref_hash, referee_name, ref_type
@@ -95,7 +89,7 @@ def interpret_reference ref_hash, referee_name, ref_type
95
89
  referee_key = referee_name.key
96
90
  return if referee_key == key # don't create self reference
97
91
 
98
- referee_id = Card.fetch_id(referee_name)
92
+ referee_id = Card::Lexicon.id referee_name
99
93
  ref_hash[referee_key] ||= [referee_id]
100
94
  ref_hash[referee_key] << ref_type
101
95
 
@@ -106,6 +100,7 @@ end
106
100
  # For example a link to virual card [[A+*self]] won't have a referee_id,
107
101
  # but when A's name is changed we have to find and update that link.
108
102
  def interpret_partial_references ref_hash, referee_name
103
+ return if referee_name.simple?
109
104
  [referee_name.left, referee_name.right].each do |sidename|
110
105
  interpret_reference ref_hash, sidename, PARTIAL_REF_CODE
111
106
  end
@@ -131,7 +126,7 @@ end
131
126
  # the reference name and reference type
132
127
  def each_reference_out
133
128
  content_object.find_chunks(Card::Content::Chunk::Reference).each do |chunk|
134
- yield(chunk.referee_name, chunk.reference_code)
129
+ yield chunk.referee_name, chunk.reference_code
135
130
  end
136
131
  end
137
132
 
@@ -145,36 +140,17 @@ end
145
140
 
146
141
  protected
147
142
 
148
- # test for updating referer content & preload referer list
143
+ # test for updating referer content
149
144
  event :prepare_referer_update, :validate, on: :update, changed: :name do
150
145
  self.update_referers = ![nil, false, "false"].member?(update_referers)
151
- family_referers
152
- end
153
-
154
- # when name changes, update references to card
155
- event :refresh_references_in, :finalize, on: :save, after: :name_change_finalized do
156
- Card::Reference.unmap_referees id if @action == :update && !update_referers
157
- Card::Reference.map_referees key, id
158
- end
159
-
160
- # when content changes, update references to other cards
161
- event :refresh_references_out, :finalize, on: :save, changed: :content do
162
- update_references_out
163
- end
164
-
165
- # clean up reference table when card is deleted
166
- event :clear_references, :finalize, on: :delete do
167
- delete_references_out
168
- Card::Reference.unmap_referees id
169
146
  end
170
147
 
171
148
  # on rename, update names in cards that refer to self by name (as directed)
172
- event :update_referer_content, :finalize,
173
- on: :update, after: :name_change_finalized, when: :update_referers do
149
+ event :update_referer_content, :finalize, on: :update, when: :update_referers do
174
150
  referers.each do |card|
175
151
  next if card.structure
176
152
  card.skip_event! :validate_renaming, :check_permissions
177
- card.content = card.replace_reference_syntax name_before_last_save, name
153
+ card.content = card.replace_reference_syntax name_before_act, name
178
154
  attach_subcard card
179
155
  end
180
156
  end
@@ -184,10 +160,27 @@ end
184
160
  # eg. A links to X+Y. if X+Y is renamed and we're not updating the link in A,
185
161
  # then we need to be sure that A has a partial reference
186
162
  event :update_referer_references_out, :finalize,
187
- on: :update, after: :name_change_finalized, when: :not_update_referers do
163
+ on: :update, when: :not_update_referers do
188
164
  referers.map(&:update_references_out)
189
165
  end
190
166
 
167
+ # when name changes, update references to card
168
+ event :refresh_references_in, :finalize, on: :save do
169
+ Card::Reference.unmap_referees id if action == :update && !update_referers
170
+ Card::Reference.map_referees key, id
171
+ end
172
+
173
+ # when content changes, update references to other cards
174
+ event :refresh_references_out, :finalize, on: :save, changed: :content do
175
+ update_references_out
176
+ end
177
+
178
+ # clean up reference table when card is deleted
179
+ event :clear_references, :finalize, on: :delete do
180
+ delete_references_out
181
+ Card::Reference.unmap_referees id
182
+ end
183
+
191
184
  def not_update_referers
192
185
  !update_referers
193
186
  end
@@ -6,35 +6,28 @@ event :rename_in_trash, after: :expire_old_name, on: :update do
6
6
  existing_card.save!
7
7
  end
8
8
 
9
- def suspend_name name
10
- # move the current card out of the way, in case the new name will require
11
- # re-creating a card with the current name, ie. A -> A+B
12
- Card.expire name
13
- tmp_name = "tmp:" + UUID.new.generate
14
- Card.where(id: id).update_all(name: tmp_name, key: tmp_name)
15
- end
16
-
17
9
  event :validate_renaming, :validate, on: :update, changed: :name, skip: :allowed do
18
10
  return if name_before_act&.to_name == name # just changing to new variant
19
- errors.add :content, tr(:cannot_change_content) if db_content_is_changing?
20
- errors.add :type, tr(:cannot_change_type) if type_id_is_changing?
11
+ errors.add :content, tr(:cannot_change_content) if content_is_changing?
12
+ errors.add :type, tr(:cannot_change_type) if type_is_changing?
13
+ detect_illegal_compound_names
21
14
  end
22
15
 
23
- event :cascade_name_changes, :finalize, on: :update, changed: :name,
24
- before: :name_change_finalized do
25
- @descendants = nil # reset
16
+ event :cascade_name_changes, :finalize, on: :update, changed: :name do
17
+ each_descendant do |d|
18
+ d.action = :update
19
+ update_referers ? d.update_referers : d.update_referer_references_out
20
+ d.refresh_references_in
21
+ d.refresh_references_out
22
+ d.expire
23
+ end
24
+ end
26
25
 
27
- children.each do |child|
28
- Rails.logger.debug "cascading name: #{child.name}"
29
- newname = child.name.swap name_before_last_save, name
30
- # not sure if this is still needed since we attach the children as subcards
31
- # (it used to be resolved right here without adding subcards)
32
- ActManager.expirees << child.name
33
- child.skip_event! :check_permissions
26
+ def changed_from_simple_to_compound?
27
+ name.compound? && name_before_act.to_name.simple?
28
+ end
34
29
 
35
- # superleft has to be the first argument. Otherwise the call of `name=` in
36
- # `assign_attributes` can cause problems because `left` doesn't find the new left.
37
- attach_subcard child.name, superleft: self, name: newname,
38
- update_referers: update_referers
39
- end
30
+ def detect_illegal_compound_names
31
+ return unless changed_from_simple_to_compound? && child_ids(:right).present?
32
+ errors.add :name, "illegal name change; existing names end in +#{name_before_act}"
40
33
  end
@@ -1,60 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
- RULE_SQL = %(
4
- SELECT
5
- rules.id AS rule_id,
6
- settings.id AS setting_id,
7
- sets.id AS set_id,
8
- sets.left_id AS anchor_id,
9
- sets.right_id AS set_tag_id
10
- FROM cards rules
11
- JOIN cards sets ON rules.left_id = sets.id
12
- JOIN cards settings ON rules.right_id = settings.id
13
- WHERE sets.type_id = #{Card::SetID}
14
- AND settings.type_id = #{Card::SettingID}
15
- AND (settings.codename != 'follow' OR rules.db_content != '')
16
- AND rules.trash is false
17
- AND sets.trash is false
18
- AND settings.trash is false;
19
- ).freeze
20
-
21
- # FIXME: "follow" hardcoded above
22
-
23
- READ_RULE_SQL = %(
24
- SELECT
25
- refs.referee_id AS party_id,
26
- read_rules.id AS read_rule_id
27
- FROM cards read_rules
28
- JOIN card_references refs ON refs.referer_id = read_rules.id
29
- JOIN cards sets ON read_rules.left_id = sets.id
30
- WHERE read_rules.right_id = #{Card::ReadID}
31
- AND sets.type_id = #{Card::SetID}
32
- AND read_rules.trash is false
33
- AND sets.trash is false;
34
- ).freeze
35
-
36
- PREFERENCE_SQL = %(
37
- SELECT
38
- preferences.id AS rule_id,
39
- settings.id AS setting_id,
40
- sets.id AS set_id,
41
- sets.left_id AS anchor_id,
42
- sets.right_id AS set_tag_id,
43
- users.id AS user_id
44
- FROM cards preferences
45
- JOIN cards user_sets ON preferences.left_id = user_sets.id
46
- JOIN cards settings ON preferences.right_id = settings.id
47
- JOIN cards users ON user_sets.right_id = users.id
48
- JOIN cards sets ON user_sets.left_id = sets.id
49
- WHERE sets.type_id = #{Card::SetID}
50
- AND settings.type_id = #{Card::SettingID}
51
- AND (%s or users.codename = 'all')
52
- AND sets.trash is false
53
- AND settings.trash is false
54
- AND users.trash is false
55
- AND user_sets.trash is false
56
- AND preferences.trash is false;
57
- ).freeze
58
1
 
59
2
  def is_rule?
60
3
  is_standard_rule? || is_preference?
@@ -62,20 +5,20 @@ end
62
5
 
63
6
  def is_standard_rule?
64
7
  (r = right(skip_modules: true)) &&
65
- r.type_id == Card::SettingID &&
8
+ r.type_id == SettingID &&
66
9
  (l = left(skip_modules: true)) &&
67
- l.type_id == Card::SetID
10
+ l.type_id == SetID
68
11
  end
69
12
 
70
13
  # TODO: abstract so account doesn't have to have User type.
71
14
  def is_preference?
72
15
  name.parts.length > 2 &&
73
16
  (r = right(skip_modules: true)) &&
74
- r.type_id == Card::SettingID &&
17
+ r.type_id == SettingID &&
75
18
  (set = self[0..-3, skip_modules: true]) &&
76
- set.type_id == Card::SetID &&
19
+ set.type_id == SetID &&
77
20
  (user = self[-2, skip_modules: true]) &&
78
- (user.type_id == Card::UserID || user.codename == :all)
21
+ (user.type_id == UserID || user.codename == :all)
79
22
  end
80
23
 
81
24
  def rule setting_code, options={}
@@ -96,8 +39,9 @@ def rule_card_id setting_code, options={}
96
39
  end
97
40
 
98
41
  rule_set_keys.each do |rule_set_key|
99
- rule_id = self.class.rule_cache["#{rule_set_key}+#{setting_code}"]
100
- rule_id ||= fallback && self.class.rule_cache["#{rule_set_key}+#{fallback}"]
42
+ rule_cache = Card::Rule.rule_cache
43
+ rule_id = rule_cache["#{rule_set_key}+#{setting_code}"]
44
+ rule_id ||= fallback && rule_cache["#{rule_set_key}+#{fallback}"]
101
45
  return rule_id if rule_id
102
46
  end
103
47
  nil
@@ -106,7 +50,7 @@ end
106
50
  def preference_card_id_lookups setting_code, options={}
107
51
  user_id = options[:user_id] || options[:user]&.id || Auth.current_id
108
52
  return unless user_id
109
- ["#{setting_code}+#{Card::AllID}", "#{setting_code}+#{user_id}"]
53
+ ["#{setting_code}+#{AllID}", "#{setting_code}+#{user_id}"]
110
54
  end
111
55
 
112
56
  def related_sets with_self=false
@@ -120,172 +64,3 @@ def related_sets with_self=false
120
64
  end
121
65
  sets
122
66
  end
123
-
124
- module ClassMethods
125
- # User-specific rule use the pattern
126
- # user+set+setting
127
- def preference_sql user_id=nil
128
- user_restriction =
129
- if user_id
130
- "users.id = #{user_id}"
131
- else
132
- "users.type_id = #{Card::UserID}"
133
- end
134
- PREFERENCE_SQL % user_restriction
135
- end
136
-
137
- def global_setting name
138
- Auth.as_bot do
139
- (card = Card[name]) && !card.db_content.strip.empty? && card.db_content
140
- end
141
- end
142
-
143
- def toggle val
144
- val.to_s.strip == "1"
145
- end
146
-
147
- def rule_cache_key row
148
- return false unless (setting_code = Card::Codename[row["setting_id"].to_i])
149
-
150
- anchor_id = row["anchor_id"]
151
- set_class_id = anchor_id.nil? ? row["set_id"] : row["set_tag_id"]
152
- return false unless (set_class_code = Card::Codename[set_class_id.to_i])
153
-
154
- [anchor_id, set_class_code, setting_code].compact.map(&:to_s) * "+"
155
- end
156
-
157
- def interpret_simple_rules
158
- ActiveRecord::Base.connection.select_all(RULE_SQL).each do |row|
159
- next unless (key = rule_cache_key row)
160
- @rule_hash[key] = row["rule_id"].to_i
161
- end
162
- end
163
-
164
- def interpret_preferences
165
- ActiveRecord::Base.connection.select_all(preference_sql).each do |row|
166
- next unless (key = rule_cache_key row) && (user_id = row["user_id"])
167
- add_preference_hash_values key, row["rule_id"].to_i, user_id.to_i
168
- end
169
- end
170
-
171
- def add_preference_hash_values key, rule_id, user_id
172
- @rule_hash[preference_key(key, user_id)] = rule_id
173
- @user_ids_hash[key] ||= []
174
- @user_ids_hash[key] << user_id
175
- @rule_keys_hash[user_id] ||= []
176
- @rule_keys_hash[user_id] << key
177
- end
178
-
179
- def cached_rule_keys_for user_id
180
- rule_keys_cache[user_id] || []
181
- end
182
-
183
- def all_user_ids_with_rule_for set_card, setting_code
184
- key =
185
- if (l = set_card.left) && (r = set_card.right)
186
- set_class_code = Card::Codename[r.id]
187
- "#{l.id}+#{set_class_code}+#{setting_code}"
188
- else
189
- set_class_code = Card::Codename[set_card.id]
190
- "#{set_class_code}+#{setting_code}"
191
- end
192
- user_ids = user_ids_cache[key] || []
193
- if user_ids.include? Card::AllID # rule for all -> return all user ids
194
- Card.where(type_id: Card::UserID).pluck(:id)
195
- else
196
- user_ids
197
- end
198
- end
199
-
200
- def preference_names user_name, setting_code
201
- Card.search(
202
- { right: { codename: setting_code },
203
- left: {
204
- left: { type_id: Card::SetID }, right: user_name
205
- },
206
- return: :name }, "preference cards for user: #{user_name}"
207
- )
208
- end
209
-
210
- def preference_cards user_name, setting_code
211
- preference_names(user_name, setting_code).map { |name| Card.fetch name }
212
- end
213
-
214
- def rule_cache
215
- Card.cache.read("RULES") || begin
216
- @rule_hash = {}
217
- @user_ids_hash = {}
218
- @rule_keys_hash = {}
219
-
220
- interpret_simple_rules
221
- interpret_preferences
222
-
223
- write_user_ids_cache @user_ids_hash
224
- write_rule_keys_cache @rule_keys_hash
225
- write_rule_cache @rule_hash
226
- end
227
- end
228
-
229
- def preference_key key, user_id
230
- "#{key}+#{user_id}"
231
- end
232
-
233
- # all users that have a user-specific rule for a given rule key
234
- def user_ids_cache
235
- Card.cache.read("USER_IDS") || begin
236
- clear_rule_cache
237
- rule_cache
238
- @user_ids_hash
239
- end
240
- end
241
-
242
- # all keys of user-specific rules for a given user
243
- def rule_keys_cache
244
- Card.cache.read("RULE_KEYS") || begin
245
- clear_rule_cache
246
- rule_cache
247
- @rule_keys_hash
248
- end
249
- end
250
-
251
- def clear_rule_cache
252
- write_rule_cache nil
253
- write_user_ids_cache nil
254
- write_rule_keys_cache nil
255
- end
256
-
257
- def clear_preference_cache
258
- # FIXME: too entwined!
259
- clear_rule_cache
260
- end
261
-
262
- def write_rule_cache hash
263
- Card.cache.write "RULES", hash
264
- end
265
-
266
- def write_user_ids_cache hash
267
- Card.cache.write "USER_IDS", hash
268
- end
269
-
270
- def write_rule_keys_cache hash
271
- Card.cache.write "RULE_KEYS", hash
272
- end
273
-
274
- def read_rule_cache
275
- Card.cache.read("READRULES") || begin
276
- hash = {}
277
- Card.connection.select_all(
278
- Card::Set::All::Rules::READ_RULE_SQL
279
- ).each do |row|
280
- party_id = row["party_id"].to_i
281
- hash[party_id] ||= []
282
- hash[party_id] << row["read_rule_id"].to_i
283
- end
284
- Card.cache.write "READRULES", hash
285
- end
286
- end
287
-
288
- def clear_read_rule_cache
289
- Card.cache.write "READRULES", nil
290
- end
291
- end