card 1.19.6 → 1.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (298) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/card.gemspec +8 -7
  4. data/config/initializers/01_core_extensions/array.rb +4 -0
  5. data/config/initializers/01_core_extensions/persistent_identifiers.rb +12 -0
  6. data/config/initializers/02_patches/better_errors.rb +56 -0
  7. data/config/initializers/core_extensions.rb +13 -18
  8. data/config/initializers/patches.rb +8 -0
  9. data/config/locales/de.yml +0 -2
  10. data/db/migrate_core_cards/20150202143810_import_bootstrap_layout.rb +22 -12
  11. data/db/migrate_core_cards/20161102202156_tweak_recaptcha_setting_cards.rb +17 -0
  12. data/db/migrate_core_cards/20161103154836_update_keys.rb +46 -0
  13. data/lib/card.rb +1 -8
  14. data/lib/card/act_manager.rb +4 -0
  15. data/lib/card/auth/permissions.rb +5 -3
  16. data/lib/card/cache.rb +1 -20
  17. data/lib/card/cache/persistent.rb +6 -0
  18. data/lib/card/content/chunk.rb +4 -3
  19. data/lib/card/content/diff.rb +2 -2
  20. data/lib/card/content/diff/result.rb +11 -0
  21. data/lib/card/env/success.rb +4 -0
  22. data/lib/card/error.rb +2 -0
  23. data/lib/card/format.rb +14 -17
  24. data/lib/card/format/content.rb +16 -8
  25. data/lib/card/format/error.rb +3 -5
  26. data/lib/card/format/names.rb +22 -16
  27. data/lib/card/format/nest.rb +67 -61
  28. data/lib/card/format/nest/fetch.rb +40 -33
  29. data/lib/card/format/nest/main.rb +39 -19
  30. data/lib/card/format/nest/subformat.rb +3 -16
  31. data/lib/card/format/nest/view.rb +23 -32
  32. data/lib/card/format/permission.rb +49 -34
  33. data/lib/card/format/registration.rb +12 -6
  34. data/lib/card/format/render.rb +62 -73
  35. data/lib/card/migration.rb +14 -10
  36. data/lib/card/migration/import.rb +20 -19
  37. data/lib/card/migration/import/import_data.rb +50 -59
  38. data/lib/card/migration/import/import_data/card_attributes.rb +56 -0
  39. data/lib/card/migration/import/import_data/card_content.rb +33 -0
  40. data/lib/card/migration/import/merger.rb +47 -0
  41. data/lib/card/mod/loader.rb +4 -4
  42. data/lib/card/model/save_helper.rb +49 -10
  43. data/lib/card/name.rb +16 -52
  44. data/lib/card/name/fields_and_traits.rb +67 -0
  45. data/lib/card/name/variants.rb +17 -0
  46. data/lib/card/query.rb +6 -2
  47. data/lib/card/query/attributes.rb +1 -1
  48. data/lib/card/query/interpretation.rb +3 -3
  49. data/lib/card/set/event.rb +2 -1
  50. data/lib/card/set/format.rb +18 -7
  51. data/lib/card/set_pattern.rb +17 -13
  52. data/lib/card/tasks/card.rake +1 -1
  53. data/lib/card/view.rb +55 -0
  54. data/lib/card/view/cache.rb +90 -0
  55. data/lib/card/view/fetch.rb +109 -0
  56. data/lib/card/view/options.rb +164 -0
  57. data/lib/card/view/stub.rb +30 -0
  58. data/lib/card/view/visibility.rb +95 -0
  59. data/lib/cardio.rb +3 -2
  60. data/lib/cardio/schema.rb +21 -8
  61. data/lib/generators/card.rb +16 -2
  62. data/lib/generators/card/format/format_generator.rb +10 -9
  63. data/lib/generators/card/migration/migration_generator.rb +10 -5
  64. data/lib/generators/card/set/USAGE +1 -1
  65. data/lib/generators/card/set/set_generator.rb +11 -9
  66. data/mod/account/set/right/account.rb +38 -40
  67. data/mod/account/set/right/token.rb +2 -1
  68. data/mod/account/set/self/account_links.rb +34 -54
  69. data/mod/account/set/self/signin.rb +107 -93
  70. data/mod/account/set/type/signup.rb +33 -32
  71. data/mod/account/set/type/user.rb +28 -21
  72. data/mod/account/spec/set/all/account_spec.rb +9 -9
  73. data/mod/account/spec/set/right/account_spec.rb +23 -14
  74. data/mod/account/spec/set/right/email_spec.rb +6 -6
  75. data/mod/account/spec/set/right/password_spec.rb +4 -4
  76. data/mod/account/spec/set/right/token_spec.rb +3 -3
  77. data/mod/account/spec/set/self/account_links_spec.rb +3 -3
  78. data/mod/account/spec/set/self/signin_spec.rb +2 -2
  79. data/mod/account/spec/set/type/signup_spec.rb +7 -8
  80. data/mod/ace_editor/set/abstract/ace_editor.rb +1 -4
  81. data/mod/admin/set/self/admin.rb +2 -2
  82. data/mod/admin/set/self/admin_info.rb +1 -1
  83. data/mod/admin/set/self/recaptcha_private_key.rb +3 -0
  84. data/mod/admin/set/self/recaptcha_proxy.rb +3 -0
  85. data/mod/admin/set/self/recaptcha_public_key.rb +3 -0
  86. data/mod/admin/set/self/trash.rb +4 -4
  87. data/mod/admin/spec/set/self/admin_spec.rb +4 -4
  88. data/mod/admin/spec/set/self/version_spec.rb +1 -1
  89. data/mod/basic_formats/set/all/all_css.rb +3 -3
  90. data/mod/basic_formats/set/all/all_csv.rb +6 -6
  91. data/mod/basic_formats/set/all/all_js.rb +4 -0
  92. data/mod/basic_formats/set/all/base.rb +40 -62
  93. data/mod/basic_formats/set/all/json.rb +34 -39
  94. data/mod/basic_formats/set/all/rss.rb +6 -6
  95. data/mod/basic_formats/set/all/text.rb +3 -2
  96. data/mod/basic_formats/set/self/01_head/javascript.rb +2 -2
  97. data/mod/basic_formats/set/self/head.rb +6 -10
  98. data/mod/basic_formats/spec/set/all/all_css_spec.rb +1 -1
  99. data/mod/basic_formats/spec/set/all/all_csv_spec.rb +1 -1
  100. data/mod/basic_formats/spec/set/all/base_spec.rb +8 -5
  101. data/mod/basic_formats/spec/set/all/json_spec.rb +2 -2
  102. data/mod/basic_formats/spec/set/all/rss_spec.rb +4 -4
  103. data/mod/basic_types/set/type/plain_text.rb +3 -5
  104. data/mod/basic_types/spec/set/type/plain_text_spec.rb +2 -2
  105. data/mod/bootstrap/lib/bootstrap.rb +16 -0
  106. data/mod/bootstrap/lib/bootstrap/basic_tags.rb +26 -0
  107. data/mod/bootstrap/lib/bootstrap/component.rb +133 -0
  108. data/mod/bootstrap/lib/bootstrap/component/form.rb +31 -0
  109. data/mod/bootstrap/lib/bootstrap/component/horizontal_form.rb +38 -0
  110. data/mod/bootstrap/lib/bootstrap/component/layout.rb +83 -0
  111. data/mod/bootstrap/lib/bootstrap/component/panel.rb +9 -0
  112. data/mod/bootstrap/lib/bootstrap/component_loader.rb +30 -0
  113. data/mod/bootstrap/lib/bootstrap/delegate.rb +16 -0
  114. data/mod/bootstrap/lib/bootstrapper.rb +16 -0
  115. data/mod/bootstrap/lib/stylesheets/bootstrap/_tables.scss +55 -52
  116. data/mod/bootstrap/lib/stylesheets/bootstrap/mixins/_table-row.scss +12 -12
  117. data/mod/bootstrap/lib/stylesheets/bootstrap_cards.scss +12 -0
  118. data/mod/bootstrap/set/all/bootstrap/accordion.rb +63 -0
  119. data/mod/bootstrap/set/all/bootstrap/helper.rb +7 -140
  120. data/mod/bootstrap/set/all/bootstrap/navbar.rb +74 -0
  121. data/mod/bootstrap/set/all/bootstrap/table.rb +76 -46
  122. data/mod/bootstrap/set/all/bootstrap/tabs.rb +58 -23
  123. data/mod/bootstrap/set/all/bootstrap/wrapper.rb +14 -8
  124. data/mod/bootstrap/set/all/rich_bootstrap.rb +5 -3
  125. data/mod/bootstrap/spec/set/all/bootstrap/bootstrap_builder_spec.rb +31 -0
  126. data/mod/bootstrap/spec/set/all/bootstrap/bootstrap_spec.rb +20 -0
  127. data/mod/bootstrap/spec/set/all/bootstrap/form_spec.rb +59 -1
  128. data/mod/bootstrap/spec/set/all/bootstrap/layout_spec.rb +104 -15
  129. data/mod/carrierwave/set/abstract/attachment.rb +4 -3
  130. data/mod/carrierwave/set/abstract/attachment/paths.rb +1 -1
  131. data/mod/carrierwave/set/abstract/attachment/storage_type.rb +5 -11
  132. data/mod/carrierwave/set/type/file.rb +39 -32
  133. data/mod/carrierwave/set/type/image.rb +59 -34
  134. data/mod/carrierwave/spec/set/type/image_spec.rb +3 -3
  135. data/mod/core/chunk/link.rb +5 -0
  136. data/mod/core/chunk/{include.rb → nest.rb} +8 -29
  137. data/mod/core/chunk/reference.rb +5 -6
  138. data/mod/core/chunk/view_stub.rb +42 -0
  139. data/mod/core/format/html_format.rb +23 -26
  140. data/mod/core/set/abstract/code_file.rb +1 -1
  141. data/mod/core/set/all/actify.rb +1 -1
  142. data/mod/core/set/all/active_card.rb +0 -1
  143. data/mod/core/set/all/{tracked_attributes.rb → assign_attributes.rb} +55 -24
  144. data/mod/core/set/all/collection.rb +136 -122
  145. data/mod/core/set/all/content.rb +8 -0
  146. data/mod/core/set/all/event.rb +5 -2
  147. data/mod/core/set/all/export.rb +7 -7
  148. data/mod/core/set/all/fetch.rb +90 -26
  149. data/mod/core/set/all/initialize.rb +17 -6
  150. data/mod/core/set/all/name.rb +2 -3
  151. data/mod/core/set/all/permissions.rb +19 -11
  152. data/mod/core/set/all/states.rb +12 -2
  153. data/mod/core/set/all/trash.rb +1 -1
  154. data/mod/core/set/all/type.rb +2 -0
  155. data/mod/core/set/all/utils.rb +4 -3
  156. data/mod/core/spec/chunk/literal_spec.rb +2 -2
  157. data/mod/core/spec/chunk/uri_spec.rb +17 -17
  158. data/mod/core/spec/format/html_format_spec.rb +11 -13
  159. data/mod/core/spec/set/all/attribute_tracking_spec.rb +2 -2
  160. data/mod/core/spec/set/all/collection_spec.rb +21 -24
  161. data/mod/core/spec/set/all/content_spec.rb +1 -1
  162. data/mod/core/spec/set/all/export_spec.rb +3 -3
  163. data/mod/core/spec/set/all/fetch_spec.rb +5 -5
  164. data/mod/core/spec/set/all/initialize_spec.rb +4 -4
  165. data/mod/core/spec/set/all/name_spec.rb +6 -6
  166. data/mod/core/spec/set/all/permissions_spec.rb +10 -10
  167. data/mod/core/spec/set/all/references_spec.rb +1 -1
  168. data/mod/core/spec/set/all/rules2_spec.rb +24 -24
  169. data/mod/core/spec/set/all/rules_spec.rb +1 -1
  170. data/mod/core/spec/set/all/templating_spec.rb +8 -8
  171. data/mod/core/spec/set/all/tracked_attributes_spec.rb +6 -6
  172. data/mod/core/spec/set/all/type_spec.rb +5 -5
  173. data/mod/developer/spec/set/all/event_viz_spec.rb +1 -1
  174. data/mod/developer/spec/set/right/debug_spec.rb +1 -1
  175. data/mod/email/set/all/email_html.rb +2 -2
  176. data/mod/email/set/all/notify.rb +8 -3
  177. data/mod/email/set/right/bcc.rb +3 -3
  178. data/mod/email/set/right/follow.rb +5 -5
  179. data/mod/email/set/right/following.rb +1 -1
  180. data/mod/email/set/self/follow_defaults.rb +27 -16
  181. data/mod/email/set/type/email_template.rb +1 -1
  182. data/mod/email/set/type_plus_right/user/follow.rb +10 -9
  183. data/mod/history/lib/card/act.rb +4 -0
  184. data/mod/history/lib/card/act/act_renderer.rb +194 -0
  185. data/mod/history/lib/card/act/act_renderer/absolute_act_renderer.rb +25 -0
  186. data/mod/history/lib/card/act/act_renderer/relative_act_renderer.rb +41 -0
  187. data/mod/history/lib/card/action.rb +1 -0
  188. data/mod/history/lib/card/action/action_renderer.rb +92 -0
  189. data/mod/history/lib/card/action/differ.rb +6 -1
  190. data/mod/history/set/all/act_view.rb +64 -0
  191. data/mod/history/set/all/action_view.rb +65 -0
  192. data/mod/history/set/all/content_history.rb +44 -37
  193. data/mod/history/set/all/history.rb +49 -263
  194. data/mod/machines/lib/stylesheets/style_cards.scss +30 -115
  195. data/mod/machines/set/abstract/script.rb +42 -7
  196. data/mod/machines/set/right/machine_input.rb +4 -0
  197. data/mod/machines/set/type/coffee_script.rb +8 -22
  198. data/mod/machines/set/type/css.rb +2 -2
  199. data/mod/machines/set/type/java_script.rb +4 -24
  200. data/mod/machines/set/type/scss.rb +1 -1
  201. data/mod/machines/spec/set/type/css_spec.rb +1 -1
  202. data/mod/machines/spec/set/type/scss_spec.rb +3 -3
  203. data/mod/machines/spec/set/type/skin_spec.rb +7 -7
  204. data/mod/pointer/set/abstract/01_pointer.rb +44 -46
  205. data/mod/pointer/set/abstract/01_pointer/edit.rb +13 -13
  206. data/mod/pointer/set/right/options.rb +4 -0
  207. data/mod/pointer/spec/set/type/pointer_spec.rb +7 -7
  208. data/mod/prosemirror_editor/set/abstract/prosemirror_editor.rb +3 -3
  209. data/mod/settings/set/abstract/permission.rb +25 -18
  210. data/mod/settings/set/right/add_help.rb +3 -3
  211. data/mod/settings/set/right/structure.rb +10 -16
  212. data/mod/settings/spec/set/right/comment_spec.rb +3 -3
  213. data/mod/settings/spec/set/right/create_spec.rb +1 -1
  214. data/mod/settings/spec/set/right/style_spec.rb +1 -1
  215. data/mod/settings/spec/set/type/setting_spec.rb +1 -1
  216. data/mod/solid_cache/set/abstract/solid_cache.rb +4 -4
  217. data/mod/solid_cache/set/right/solid_cache.rb +9 -10
  218. data/mod/standard/set/abstract/01_search_params.rb +41 -0
  219. data/mod/standard/set/abstract/search.rb +132 -0
  220. data/mod/standard/set/abstract/search/paging.rb +81 -0
  221. data/mod/standard/set/abstract/search/paging/paging_links.rb +90 -0
  222. data/mod/standard/set/abstract/wql_search.rb +67 -0
  223. data/mod/standard/set/all/error.rb +89 -82
  224. data/mod/standard/set/all/links.rb +1 -1
  225. data/mod/standard/set/all/rich_html/content.rb +125 -141
  226. data/mod/standard/set/all/rich_html/editing.rb +115 -178
  227. data/mod/standard/set/all/rich_html/form.rb +111 -131
  228. data/mod/standard/set/all/rich_html/header.rb +57 -39
  229. data/mod/standard/set/all/rich_html/menu.rb +94 -94
  230. data/mod/standard/set/all/rich_html/modal.rb +5 -10
  231. data/mod/standard/set/all/rich_html/new.rb +103 -0
  232. data/mod/standard/set/all/rich_html/toolbar.rb +54 -74
  233. data/mod/standard/set/all/rich_html/wrapper.rb +111 -138
  234. data/mod/standard/set/rstar/rules.rb +27 -38
  235. data/mod/standard/set/rstar/rules_editor.rb +298 -277
  236. data/mod/standard/set/self/navbox.rb +20 -15
  237. data/mod/standard/set/self/recent.rb +25 -17
  238. data/mod/standard/set/self/search.rb +25 -4
  239. data/mod/standard/set/type/cardtype.rb +11 -9
  240. data/mod/standard/set/type/date.rb +1 -1
  241. data/mod/standard/set/type/number.rb +1 -1
  242. data/mod/standard/set/type/phrase.rb +1 -1
  243. data/mod/standard/set/type/search_type.rb +17 -282
  244. data/mod/standard/set/type/session.rb +1 -1
  245. data/mod/standard/set/type/set.rb +155 -131
  246. data/mod/standard/set/type/toggle.rb +1 -1
  247. data/mod/standard/set/type/uri.rb +4 -4
  248. data/mod/standard/spec/chunk/include_spec.rb +13 -31
  249. data/mod/standard/spec/chunk/link_spec.rb +1 -1
  250. data/mod/standard/spec/set/all/error_spec.rb +1 -1
  251. data/mod/standard/spec/set/all/history_spec.rb +2 -2
  252. data/mod/standard/spec/set/all/rich_html/form_spec.rb +4 -4
  253. data/mod/standard/spec/set/all/rich_html/toolbar_spec.rb +22 -0
  254. data/mod/standard/spec/set/all/rich_html/wrapper_spec.rb +3 -2
  255. data/mod/standard/spec/set/right/when_created_spec.rb +1 -1
  256. data/mod/standard/spec/set/right/when_last_edited_spec.rb +1 -1
  257. data/mod/standard/spec/set/rstar/rules_spec.rb +2 -3
  258. data/mod/standard/spec/set/self/head_spec.rb +2 -2
  259. data/mod/standard/spec/set/self/navbox_spec.rb +1 -1
  260. data/mod/standard/spec/set/self/now_spec.rb +1 -1
  261. data/mod/standard/spec/set/type/date_spec.rb +1 -1
  262. data/mod/standard/spec/set/type/email_template_spec.rb +1 -1
  263. data/mod/standard/spec/set/type/layout_type_spec.rb +1 -1
  264. data/mod/standard/spec/set/type/number_spec.rb +1 -1
  265. data/mod/standard/spec/set/type/phrase_spec.rb +1 -1
  266. data/mod/standard/spec/set/type/search_type_spec.rb +2 -2
  267. data/mod/standard/spec/set/type/set_spec.rb +2 -2
  268. data/mod/standard/spec/set/type/toggle_spec.rb +2 -2
  269. data/mod/standard/spec/set/type/uri_spec.rb +3 -1
  270. data/mod/tinymce_editor/set/abstract/tinymce_editor.rb +1 -1
  271. data/spec/config/initializers/core_extensions_spec.rb +40 -10
  272. data/spec/lib/card/auth_spec.rb +8 -8
  273. data/spec/lib/card/cache_spec.rb +3 -3
  274. data/spec/lib/card/chunk_spec.rb +4 -4
  275. data/spec/lib/card/codename_spec.rb +2 -2
  276. data/spec/lib/card/content_spec.rb +23 -23
  277. data/spec/lib/card/diff_spec.rb +1 -1
  278. data/spec/lib/card/format_spec.rb +19 -24
  279. data/spec/lib/card/loader_spec.rb +4 -4
  280. data/spec/lib/card/name_spec.rb +16 -16
  281. data/spec/lib/card/query_spec.rb +80 -80
  282. data/spec/lib/card/reference_spec.rb +5 -5
  283. data/spec/lib/card/set_spec.rb +6 -6
  284. data/spec/lib/card/subcards_spec.rb +14 -0
  285. data/spec/lib/card/view_cache_spec.rb +5 -5
  286. data/spec/models/card/cardtype_spec.rb +15 -15
  287. data/spec/models/card/create_spec.rb +2 -2
  288. data/spec/models/card/trash_spec.rb +24 -24
  289. data/spec/models/card/type_transition_spec.rb +8 -8
  290. data/spec/models/card/validation_spec.rb +5 -5
  291. data/spec/models/card_spec.rb +14 -14
  292. data/spec/spec_helper.rb +6 -2
  293. data/spec/support/card_spec_helper.rb +21 -11
  294. data/spec/support/helper/card_helper.rb +11 -4
  295. metadata +73 -15
  296. data/lib/card/cache/view_cache.rb +0 -103
  297. data/mod/bootstrap/set/all/bootstrap/layout.rb +0 -58
  298. data/mod/core/set/all/view_cache.rb +0 -9
@@ -11,16 +11,27 @@ module ClassMethods
11
11
  end
12
12
 
13
13
  def initialize args={}
14
- args["name"] = args["name"].to_s
15
- args["db_content"] = args.delete("content") if args["content"]
16
- @supercard = args.delete "supercard" # must come before name =
14
+ args["name"] = initial_name args["name"]
15
+ args["db_content"] = args.delete "content" if args["content"]
16
+ @supercard = args.delete "supercard" # must come before name=
17
+
18
+ handle_skip_args args do
19
+ super args # ActiveRecord #initialize
20
+ end
21
+ self
22
+ end
23
+
24
+ def handle_skip_args args
17
25
  skip_modules = args.delete "skip_modules"
18
26
  skip_type_lookup = args["skip_type_lookup"]
19
-
20
- super args # ActiveRecord #initialize
27
+ yield
21
28
  self.type_id = get_type_id_from_structure if !type_id && !skip_type_lookup
22
29
  include_set_modules unless skip_modules
23
- self
30
+ end
31
+
32
+ def initial_name name
33
+ name = Card.compose_mark name if name.is_a? Array
34
+ name.to_s
24
35
  end
25
36
 
26
37
  def include_set_modules
@@ -71,7 +71,7 @@ def cardname
71
71
  end
72
72
 
73
73
  def autoname name
74
- if Card.exists? name
74
+ if Card.exists?(name) || ActManager.include?(name)
75
75
  autoname name.next
76
76
  else
77
77
  name
@@ -213,8 +213,7 @@ event :set_autoname, :prepare_to_validate, on: :create do
213
213
  end
214
214
 
215
215
  event :set_name, :store, changed: :name do
216
- Card.expire name
217
- Card.expire name_was
216
+ expire
218
217
  end
219
218
 
220
219
  event :set_left_and_right, :store,
@@ -46,17 +46,21 @@ def ok! action, opts={}
46
46
  end
47
47
 
48
48
  def who_can action
49
- # warn "who_can[#{name}] #{(prc=permission_rule_card(action)).inspect},
50
- # #{prc.first.item_cards.map(&:id)}" if action == :update
51
49
  permission_rule_card(action).item_cards.map(&:id)
52
50
  end
53
51
 
52
+ def anyone_can? action
53
+ who_can(action).include? Card::AnyoneID
54
+ end
55
+
54
56
  def permission_rule_id_and_class action
55
57
  direct_rule_id = rule_card_id action
56
58
  require_permission_rule! direct_rule_id, action
57
59
  direct_rule = Card.fetch direct_rule_id, skip_modules: true
58
- [applicable_permission_rule_id(direct_rule, action),
59
- direct_rule.rule_class_name]
60
+ [
61
+ applicable_permission_rule_id(direct_rule, action),
62
+ direct_rule.rule_class_name
63
+ ]
60
64
  end
61
65
 
62
66
  def applicable_permission_rule_id direct_rule, action
@@ -210,8 +214,7 @@ event :update_read_rule do
210
214
  self.read_rule_class = rclass
211
215
  Card.where(id: id).update_all read_rule_id: rcard_id,
212
216
  read_rule_class: rclass
213
- expire_hard
214
-
217
+ expire :hard
215
218
  update_field_read_rules
216
219
  end
217
220
  end
@@ -245,14 +248,19 @@ def track_permission_errors
245
248
  end
246
249
 
247
250
  def recaptcha_on?
248
- have_recaptcha_keys? &&
249
- Env[:controller] &&
250
- !Auth.signed_in? &&
251
- !Auth.needs_setup? &&
252
- !Auth.always_ok? &&
251
+ consider_recaptcha? &&
252
+ have_recaptcha_keys? &&
253
+ Env[:controller] &&
254
+ !Auth.signed_in? &&
255
+ !Auth.needs_setup? &&
256
+ !Auth.always_ok? &&
253
257
  Card.toggle(rule(:captcha))
254
258
  end
255
259
 
260
+ def consider_recaptcha?
261
+ true
262
+ end
263
+
256
264
  def have_recaptcha_keys?
257
265
  @@have_recaptcha_keys =
258
266
  if defined?(@@have_recaptcha_keys)
@@ -1,6 +1,16 @@
1
+ def state
2
+ case
3
+ when !known? then :unknown
4
+ when !ok?(:read) then :unknown # anti-fishing
5
+ when real? then :real
6
+ when virtual? then :virtual
7
+ else :wtf
8
+ end
9
+ end
10
+
1
11
  def new_card?
2
- new_record? || # not yet in db (from ActiveRecord)
3
- !!@from_trash # in process of restoration from trash, not yet "re-created"
12
+ new_record? || # not yet in db (from ActiveRecord)
13
+ !@from_trash.nil? # in process of restoration from trash
4
14
  end
5
15
  alias_method :new?, :new_card?
6
16
 
@@ -32,7 +32,7 @@ module ClassMethods
32
32
  if Card.exists?(file_id) # double check!
33
33
  raise Card::Error, "Narrowly averted deleting current file"
34
34
  end
35
- FileUtils.rm_rf "#{dir}/#{file_id}", secure: true
35
+ ::FileUtils.rm_rf "#{dir}/#{file_id}", secure: true
36
36
  end
37
37
  end
38
38
 
@@ -18,6 +18,8 @@ def type_name
18
18
  type_card.try :name
19
19
  end
20
20
 
21
+ alias_method :type, :type_name
22
+
21
23
  def type_name_or_default
22
24
  type_card.try(:name) || Card.quick_fetch(Card.default_type_id).name
23
25
  end
@@ -10,10 +10,11 @@ module ClassMethods
10
10
  def merge_list attribs, opts={}
11
11
  unmerged = []
12
12
  attribs.each do |row|
13
- result = begin
14
- merge row["name"], row, opts
13
+ if merge row["name"], row, opts
14
+ Rails.logger.info "merged #{row['name']}"
15
+ else
16
+ unmerged.push row
15
17
  end
16
- unmerged.push row unless result == true
17
18
  end
18
19
 
19
20
  if unmerged.empty?
@@ -1,12 +1,12 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
 
3
3
  describe Card::Content::Chunk::EscapedLiteral, "literal chunk tests" do
4
- it "should handle escaped link" do
4
+ it "handles escaped link" do
5
5
  expect(render_content('write this: \[[text]]'))
6
6
  .to eq("write this: <span>[</span>[text]]")
7
7
  end
8
8
 
9
- it "should handle escaped nest" do
9
+ it "handles escaped nest" do
10
10
  expect(render_content('write this: \{{cardname}}'))
11
11
  .to eq("write this: <span>{</span>{cardname}}")
12
12
  end
@@ -1,7 +1,7 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
 
3
3
  describe Card::Content::Chunk::URI, "URI chunk tests" do
4
- it "should test_non_matches" do
4
+ it "test_non_matches" do
5
5
  no_match_uri "There is no URI here"
6
6
  no_match_uri "One gemstone is the garnet:reddish in colour, like ruby"
7
7
  end
@@ -45,7 +45,7 @@ describe Card::Content::Chunk::URI, "URI chunk tests" do
45
45
  text: "example.com",
46
46
  link_text: "http://example.com"
47
47
  end
48
- it 'should match "unusual" base domain (was a bug in an early version)' do
48
+ it 'matches "unusual" base domain (was a bug in an early version)' do
49
49
  match_http_uri "http://example.com.au/",
50
50
  host: "example.com.au"
51
51
  end
@@ -104,24 +104,24 @@ describe Card::Content::Chunk::URI, "URI chunk tests" do
104
104
  link_text: "irc://irc.freenode.net#recentchangescamp"
105
105
  end
106
106
 
107
- it "should see HTTPS" do
107
+ it "sees HTTPS" do
108
108
  match_uri "https://www.example.com",
109
109
  scheme: "https", host: "www.example.com", port: 443,
110
110
  path: "", query: nil
111
111
  end
112
- it "should see FTP" do
112
+ it "sees FTP" do
113
113
  match_uri "ftp://www.example.com",
114
114
  scheme: "ftp", host: "www.example.com", port: 21,
115
115
  path: "", query: nil
116
116
  end
117
- it "should handle mailto:" do
117
+ it "handles mailto:" do
118
118
  match_uri "mailto:jdoe123@example.com",
119
119
  scheme: "mailto", host: nil, port: nil,
120
120
  path: nil, query: nil,
121
121
  to: "jdoe123@example.com"
122
122
  end
123
123
 
124
- it "should run more basic cases" do
124
+ it "runs more basic cases" do
125
125
  # from *css (with () around the URI)
126
126
  # so, now this doesn't even match because I fixed the suspiciou* stuff
127
127
  no_match_uri(
@@ -147,23 +147,23 @@ describe Card::Content::Chunk::URI, "URI chunk tests" do
147
147
  path: "/default.aspx", query: "scid=kb;en-us;234562"
148
148
  end
149
149
 
150
- it "should test_email_uri" do
150
+ it "test_email_uri" do
151
151
  match_uri "mail@example.com",
152
152
  to: "mail@example.com", host: nil,
153
153
  text: "mail@example.com",
154
154
  link_text: "mailto:mail@example.com"
155
155
  end
156
156
 
157
- it "should test_non_email" do
157
+ it "test_non_email" do
158
158
  # The @ is part of the normal text, but 'example.com' is marked up.
159
159
  match_uri "Not an email: @example.com", uri: "http://example.com"
160
160
  end
161
161
 
162
- it "should test_textile_image" do
162
+ it "test_textile_image" do
163
163
  no_match_uri "This !http://hobix.com/sample.jpg! is a Textile image link."
164
164
  end
165
165
 
166
- it "should test_textile_link" do
166
+ it "test_textile_link" do
167
167
  no_match_uri(
168
168
  'This "hobix (hobix)":http://hobix.com/sample.jpg is a Textile link.'
169
169
  )
@@ -172,12 +172,12 @@ describe Card::Content::Chunk::URI, "URI chunk tests" do
172
172
  link_text: "http://hobix.com/sample.jpg"
173
173
  end
174
174
 
175
- it "should test_inline_html" do
175
+ it "test_inline_html" do
176
176
  no_match_uri "<img src='http://hobix.com/sample.jpg'/>"
177
177
  no_match_uri '<IMG SRC="http://hobix.com/sample.jpg">'
178
178
  end
179
179
 
180
- it "should test_non_uri" do
180
+ it "test_non_uri" do
181
181
  # "so" is a valid country code; "libproxy.so" is a valid url
182
182
  match_uri "libproxy.so", host: "libproxy.so",
183
183
  text: "libproxy.so",
@@ -195,7 +195,7 @@ describe Card::Content::Chunk::URI, "URI chunk tests" do
195
195
  no_match_uri "file.ps"
196
196
  end
197
197
 
198
- it "should test_uri_in_text" do
198
+ it "test_uri_in_text" do
199
199
  match_uri "Go to: http://www.example.com/",
200
200
  host: "www.example.com", path: "/"
201
201
  match_uri "http://www.example.com/ is a link.", host: "www.example.com"
@@ -208,7 +208,7 @@ describe Card::Content::Chunk::URI, "URI chunk tests" do
208
208
  no_match_uri '"link":http://fake.link.com.'
209
209
  end
210
210
 
211
- it "should test_uri_in_parentheses" do
211
+ it "test_uri_in_parentheses" do
212
212
  match_uri "URI (http://brackets.com.de) in brackets",
213
213
  host: "brackets.com.de"
214
214
  match_uri "because (as shown at research.net) the results",
@@ -218,7 +218,7 @@ describe Card::Content::Chunk::URI, "URI chunk tests" do
218
218
  query: "WhatIsWiki"
219
219
  end
220
220
 
221
- it "should test_uri_list_item" do
221
+ it "test_uri_list_item" do
222
222
  match_chunk(
223
223
  Card::Content::Chunk::URI,
224
224
  "* http://www.btinternet.com/~mail2minh/SonyEricssonP80xPlatform.sis",
@@ -226,7 +226,7 @@ describe Card::Content::Chunk::URI, "URI chunk tests" do
226
226
  )
227
227
  end
228
228
 
229
- it "should test_interesting_uri_with__comma" do
229
+ it "test_interesting_uri_with__comma" do
230
230
  # Counter-intuitively, this URL matches, but the query part includes the
231
231
  # trailing comma.
232
232
  # It has no way to know that the query does not include the comma.
@@ -241,7 +241,7 @@ describe Card::Content::Chunk::URI, "URI chunk tests" do
241
241
  end
242
242
 
243
243
  describe Card::Content::Chunk::URI, "URI chunk tests" do
244
- it "should test_local_urls" do
244
+ it "test_local_urls" do
245
245
  # normal
246
246
  match_http_uri "http://perforce:8001/toto.html",
247
247
  host: "perforce", port: 8001
@@ -3,18 +3,16 @@
3
3
  describe Card::Format::HtmlFormat do
4
4
  describe "views" do
5
5
  it "content" do
6
- result = render_card(:content, name: "A+B")
7
6
  assert_view_select(
8
- result,
9
- 'div[class="card-slot content-view card-content ALL ALL_PLUS ' \
10
- 'TYPE-basic RIGHT-b TYPE_PLUS_RIGHT-basic-b SELF-a-b"]'
7
+ render_card(:content, name: "A+B"),
8
+ 'div[class="card-slot content-view ALL ALL_PLUS TYPE-basic '\
9
+ 'RIGHT-b TYPE_PLUS_RIGHT-basic-b SELF-a-b card-content"]'
11
10
  )
12
11
  end
13
12
 
14
13
  it "nests in multi edit" do
15
14
  c = Card.new name: "ABook", type: "Book"
16
- rendered = c.format.render(:edit)
17
-
15
+ rendered = c.format.render :edit
18
16
  assert_view_select rendered, "fieldset" do
19
17
  assert_select 'div[class~="prosemirror-editor"]' do
20
18
  assert_select "input[name=?]", "card[subcards][+illustrator][content]"
@@ -65,8 +63,8 @@ describe Card::Format::HtmlFormat do
65
63
  it "renders card content" do
66
64
  assert_view_select(
67
65
  @simple_page,
68
- 'div[class="card-body panel-body card-content ALL ALL_PLUS ' \
69
- 'TYPE-basic RIGHT-b TYPE_PLUS_RIGHT-basic-b SELF-a-b"]',
66
+ 'div[class="card-body card-content ALL ALL_PLUS ' \
67
+ 'TYPE-basic RIGHT-b TYPE_PLUS_RIGHT-basic-b SELF-a-b panel-body"]',
70
68
  "AlphaBeta"
71
69
  )
72
70
  end
@@ -93,14 +91,14 @@ describe Card::Format::HtmlFormat do
93
91
  # warn "lay #{@layout_card.inspect}, #{@main_card.inspect}"
94
92
  end
95
93
 
96
- # it "should default to core view when in layout mode" do
94
+ # it "defaults to core view when in layout mode" do
97
95
  # @layout_card.content = "Hi {{A}}"
98
96
  # Card::Auth.as_bot { @layout_card.save }
99
97
  #
100
98
  # expect(@main_card.format.render(:layout)).to match('Hi Alpha')
101
99
  # end
102
100
 
103
- # it "should default to open view for main card" do
101
+ # it "defaults to open view for main card" do
104
102
  # @layout_card.content='Open up {{_main}}'
105
103
  # Card::Auth.as_bot { @layout_card.save }
106
104
  #
@@ -119,7 +117,7 @@ describe Card::Format::HtmlFormat do
119
117
  expect(result).not_to match(/card-header/)
120
118
  end
121
119
 
122
- it "shouldn't recurse" do
120
+ it "does not recurse" do
123
121
  @layout_card.content = "Mainly {{_main|core}}"
124
122
  Card::Auth.as_bot { @layout_card.save }
125
123
 
@@ -141,8 +139,8 @@ describe Card::Format::HtmlFormat do
141
139
  Card.create name: "outer space", content: "{{_main|name}}"
142
140
  end
143
141
 
144
- expect(@layout_card.format.render(:layout)).to eq(
145
- "Joe User\n" \
142
+ expect(@main_card.format.render(:layout)).to eq(
143
+ '<div id="main">Joe User</div>' + "\n" \
146
144
  '<div class="modal fade" role="dialog" id="modal-main-slot">' \
147
145
  '<div class="modal-dialog"><div class="modal-content">' \
148
146
  "</div></div></div>"
@@ -8,11 +8,11 @@
8
8
  # end
9
9
  # end
10
10
  #
11
- # it "should have updates" do
11
+ # it "has updates" do
12
12
  # described_class::Updates.should === @c.updates
13
13
  # end
14
14
  #
15
- # it "should track changes" do
15
+ # it "tracks changes" do
16
16
  # @c.name.should == 'New Card'
17
17
  # @c.name = 'Old Card'
18
18
  # @c.name.should == 'Old Card'
@@ -72,29 +72,6 @@ describe Card::Set::All::Collection do
72
72
  end
73
73
  end
74
74
 
75
- describe "#map_nests" do
76
- before do
77
- Card::Auth.as_bot do
78
- @list = Card.create!(
79
- name: "mixed list",
80
- content: "[[A]]\n{{B}}\n[[C|link C]]\n{{D|name;title:nest D}}"
81
- )
82
- end
83
- end
84
- it "handles links and nest arguments" do
85
- result = @list.format.map_references_with_args do |name, args|
86
- [name, args]
87
- end
88
- expect(result).to eq [
89
- ["A", { view: :closed }],
90
- ["B", { view: :closed, inc_name: "B", inc_syntax: "B" }],
91
- ["C", { view: :closed, title: "link C" }],
92
- ["D", { view: "name", title: "nest D", inc_name: "D",
93
- inc_syntax: "D|name;title:nest D" }]
94
- ]
95
- end
96
- end
97
-
98
75
  describe "tabs view" do
99
76
  it "renders tab panel" do
100
77
  tabs = render_card :tabs, content: "[[A]]\n[[B]]\n[[C]]", type: "pointer"
@@ -138,6 +115,26 @@ describe Card::Set::All::Collection do
138
115
  assert_select %(li > a[data-toggle="tab"][data-url="#{path}"])
139
116
  end
140
117
  end
118
+
119
+ it "handles contextual titles" do
120
+ create name: "tabs card", type: "pointer",
121
+ content: "[[A+B]]\n[[One+Two+Three]]\n[[Four+One+Five]]"
122
+ tabs = render_content "{{tabs card|tabs|closed;title:_left}}"
123
+ assert_view_select tabs, "div[role=tabpanel]" do
124
+ assert_select 'li > a[data-toggle="tab"]', "A"
125
+ assert_select 'li > a[data-toggle="tab"]', "One+Two"
126
+ end
127
+ end
128
+
129
+ it "handles contextual titles" do
130
+ create name: "tabs card", content: "[[A+B]]\n[[One+Two+Three]]\n[[Four+One+Five]]", type: "pointer"
131
+ tabs = render_content "{{tabs card|tabs|closed;title:_left;show:title_link}}"
132
+ assert_view_select tabs, "div[role=tabpanel]" do
133
+ assert_select 'li > a[data-toggle="tab"]', "A"
134
+ assert_select 'li > a[data-toggle="tab"]', "One+Two"
135
+ end
136
+ end
137
+
141
138
  it "handles nests as items" do
142
139
  tabs = render_card :tabs, name: "tab_test", type_id: Card::PlainTextID,
143
140
  content: "{{A|type;title:my tab title}}"
@@ -150,7 +147,7 @@ describe Card::Set::All::Collection do
150
147
 
151
148
  it "works with search cards" do
152
149
  Card.create type: "Search", name: "Asearch", content: '{"type":"User"}'
153
- tabs = render_content("{{Asearch|tabs;item:name}}")
150
+ tabs = render_content("{{Asearch|tabs|name}}")
154
151
  assert_view_select tabs, "div[role=tabpanel]" do
155
152
  assert_select(
156
153
  'li > a[data-toggle=tab][href="#asearch-joe_admin"] span.card-title',