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
@@ -4,7 +4,14 @@ require_dependency "card/env"
4
4
  require "smart_name"
5
5
 
6
6
  class Card
7
+ # The SmartName class provides generalized of Card naming patterns
8
+ # (compound names, key-based variants, etc)
9
+ #
10
+ # Card::Name adds support for deeper card integration
7
11
  class Name < SmartName
12
+ include FieldsAndTraits
13
+ include Variants
14
+
8
15
  RELATIVE_REGEXP = /\b_(left|right|whole|self|user|main|\d+|L*R?)\b/
9
16
 
10
17
  self.params = Card::Env # yuck!
@@ -33,54 +40,10 @@ class Card
33
40
  right && "*" == right[0, 1]
34
41
  end
35
42
 
36
- def trait_name? *traitlist
37
- junction? && begin
38
- right_key = right_name.key
39
- traitlist.find do |codename|
40
- (card_id = Card::Codename[codename]) &&
41
- (card = Card.quick_fetch card_id) &&
42
- card.key == right_key
43
- end.present?
44
- end
45
- end
46
-
47
- def trait_name tag_code
48
- (card_id = Card::Codename[tag_code]) &&
49
- (card = Card.quick_fetch card_id) &&
50
- [self, card.cardname].to_name
51
- end
52
-
53
- def trait tag_code
54
- if (name = trait_name tag_code)
55
- name.s
56
- else
57
- raise Card::Error::NotFound, "unknown codename: #{tag_code}"
58
- end
59
- end
60
-
61
- def field tag_name
62
- field_name(tag_name).s
63
- end
64
-
65
43
  def code
66
44
  Card::Codename[Card.fetch_id self]
67
45
  end
68
46
 
69
- # returns full name for a field
70
- def field_name tag_name
71
- case tag_name
72
- when Symbol
73
- trait_name tag_name
74
- else
75
- tag_name = tag_name.to_s[1..-1] if tag_name.to_s[0] == "+"
76
- [self, tag_name].to_name
77
- end
78
- end
79
-
80
- def relative_field_name tag_name
81
- field_name(tag_name).relative_name(self)
82
- end
83
-
84
47
  def relative_name context_name
85
48
  to_show(*context_name.to_name.parts).to_name
86
49
  end
@@ -99,14 +62,6 @@ class Card
99
62
  end
100
63
  end
101
64
 
102
- def field_of? context_name
103
- if context_name.present?
104
- child_of?(context_name) && relative_name(context_name).length == 2
105
- else
106
- s.match(/^\s*\+[^+]+$/)
107
- end
108
- end
109
-
110
65
  def setting?
111
66
  Set::Type::Setting.member_names[key]
112
67
  end
@@ -119,6 +74,10 @@ class Card
119
74
  s =~ RELATIVE_REGEXP || starts_with_joint?
120
75
  end
121
76
 
77
+ def simple_relative?
78
+ relative? && stripped.to_name.starts_with_joint?
79
+ end
80
+
122
81
  def absolute?
123
82
  !relative?
124
83
  end
@@ -134,5 +93,10 @@ class Card
134
93
  def to_sym
135
94
  s.to_sym
136
95
  end
96
+
97
+ # processes contextual title argument used in nests like "title: _left"
98
+ def title title_directive, context_names
99
+ title_directive.to_name.to_absolute_name(self).to_show(*context_names)
100
+ end
137
101
  end
138
102
  end
@@ -0,0 +1,67 @@
1
+ class Card
2
+ class Name
3
+ # Name-based "Fields" are compound names in which the right name is treated
4
+ # as an attribute of the left. (Eg MyName+address)
5
+ #
6
+ # "Traits" are the subset of fields in which the right name corresponds to a
7
+ # card with a codename
8
+ module FieldsAndTraits
9
+ # @return [String]
10
+ def field tag_name
11
+ field_name(tag_name).s
12
+ end
13
+
14
+ # @return [Card::Name]
15
+ def field_name tag_name
16
+ case tag_name
17
+ when Symbol
18
+ trait_name tag_name
19
+ else
20
+ tag_name = tag_name.to_s[1..-1] if tag_name.to_s[0] == "+"
21
+ [self, tag_name].to_name
22
+ end
23
+ end
24
+
25
+ # @return [True/False]
26
+ def field_of? context_name
27
+ if context_name.present?
28
+ child_of?(context_name) && relative_name(context_name).length == 2
29
+ else
30
+ s.match(/^\s*\+[^+]+$/).present?
31
+ end
32
+ end
33
+
34
+ def relative_field_name tag_name
35
+ field_name(tag_name).relative_name self
36
+ end
37
+
38
+ # @return [String]
39
+ def trait tag_code
40
+ name = trait_name tag_code
41
+ raise Card::Error::NotFound, "unknown codename: #{tag_code}" unless name
42
+ name.s
43
+ end
44
+
45
+ # @return [Card::Name]
46
+ def trait_name tag_code
47
+ return unless (card_id = Card::Codename[tag_code])
48
+ [self, Card.quick_fetch(card_id).name].to_name
49
+ end
50
+
51
+ # @return [True/False]
52
+ def trait_name? *traitlist
53
+ junction? && begin
54
+ right_key = right_name.key
55
+ traitlist.find do |codename|
56
+ (card_id = Card::Codename[codename]) &&
57
+ (card = Card.quick_fetch card_id) &&
58
+ card.key == right_key
59
+ end.present?
60
+ end
61
+ end
62
+
63
+
64
+
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,17 @@
1
+ class Card
2
+ class Name
3
+ module Variants
4
+ @@variant_methods = [:capitalize, :singularize, :pluralize, :titleize,
5
+ :downcase, :upcase, :swapcase, :reverse, :succ]
6
+ @@variant_aliases = { capitalized: :capitalize, singular: :singularize,
7
+ plural: :pluralize, title: :titleize }
8
+
9
+ def vary variants
10
+ variants.to_s.split(/[\s,]+/).inject(self.s) do |name, variant|
11
+ variant = @@variant_aliases[variant.to_sym] || variant.to_sym
12
+ @@variant_methods.include?(variant) ? name.send(variant) : name
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -81,7 +81,7 @@ class Card
81
81
  DEFAULT_ORDER_DIRS = { update: "desc", relevance: "desc" }.freeze
82
82
 
83
83
  attr_reader :statement, :mods, :conditions, :comment,
84
- :subqueries, :superquery
84
+ :subqueries, :superquery, :vars
85
85
  attr_accessor :joins, :table_seq, :unjoined, :conditions_on_join
86
86
 
87
87
  # Query Execution
@@ -121,7 +121,7 @@ class Card
121
121
  # run the current query
122
122
  # @return array of card objects by default
123
123
  def run
124
- retrn = statement[:return].present? ? statement[:return].to_s : "card"
124
+ retrn ||= statement[:return].present? ? statement[:return].to_s : "card"
125
125
  if retrn == "card"
126
126
  get_results("name").map do |name|
127
127
  Card.fetch name, new: {}
@@ -180,5 +180,9 @@ class Card
180
180
  @context = @superquery ? @superquery.context : ""
181
181
  end
182
182
  end
183
+
184
+ def limit
185
+ @mods[:limit].to_i
186
+ end
183
187
  end
184
188
  end
@@ -8,7 +8,7 @@ class Card
8
8
  # FIXME: - move this check to set mods!
9
9
 
10
10
  subquery(
11
- c.get_query.merge(unjoined: true, context: c.name)
11
+ c.wql_hash.merge(unjoined: true, context: c.name)
12
12
  )
13
13
  else
14
14
  raise Card::Error::BadQuery,
@@ -49,9 +49,9 @@ class Card
49
49
 
50
50
  def clause_to_hash clause
51
51
  case clause
52
- when Hash then clause
53
- when String then { key: clause.to_name.key }
54
- when Integer then { id: clause }
52
+ when Hash then clause
53
+ when String, SmartName then { key: clause.to_name.key }
54
+ when Integer then { id: clause }
55
55
  else raise Card::Error::BadQuery, "Invalid query args #{clause.inspect}"
56
56
  end
57
57
  end
@@ -33,7 +33,8 @@ class Card
33
33
 
34
34
  def log_event_call event
35
35
  Rails.logger.debug "#{name}: #{event}"
36
- # puts "#{Card::DirectorRegister.to_s}".green
36
+ # puts "#{name}: #{event}"
37
+ # puts "#{Card::ActManager.to_s}".green
37
38
  end
38
39
 
39
40
  module Set
@@ -85,16 +85,27 @@ class Card
85
85
  def view view, *args, &block
86
86
  view = view.to_viewname.key.to_sym
87
87
  views[self] ||= {}
88
- view_block = views[self][view] =
89
- if block_given?
90
- Card::Format.extract_class_vars view, args[0]
91
- block
92
- else
93
- lookup_alias_block view, args
94
- end
88
+ interpret_view_opts view, args[0] if block_given?
89
+ view_block = views[self][view] = view_block view, args, &block
95
90
  define_method "_view_#{view}", view_block
96
91
  end
97
92
 
93
+ def interpret_view_opts view, opts
94
+ return unless opts.present?
95
+ Card::Format.interpret_view_opts view, opts
96
+ extract_view_cache_rules view, opts.delete(:cache)
97
+ end
98
+
99
+ def extract_view_cache_rules view, cache_rule
100
+ return unless cache_rule
101
+ methodname = Card::Format.view_cache_setting_method view
102
+ define_method(methodname) { cache_rule }
103
+ end
104
+
105
+ def view_block view, args, &block
106
+ block_given? ? block : lookup_alias_block(view, args)
107
+ end
108
+
98
109
  def lookup_alias_block view, args
99
110
  opts = args[0].is_a?(Hash) ? args.shift : { view: args.shift }
100
111
  opts[:mod] ||= self
@@ -169,13 +169,12 @@ EOF
169
169
  end
170
170
 
171
171
  def lookup_module_list modules_hash
172
- if module_key
173
- modules_hash[module_key]
174
- else
175
- inherited_key && modules_hash[inherited_key]
176
- end
172
+ lookup_key = module_key || inherited_key
173
+ modules_hash[lookup_key] if lookup_key
177
174
  end
178
175
 
176
+ private
177
+
179
178
  def inherited_key
180
179
  if defined?(@inherited_key)
181
180
  @inherited_key
@@ -188,15 +187,20 @@ EOF
188
187
  return unless @inherit_card
189
188
  card = @inherit_card
190
189
  @inherit_card = nil
190
+ return unless (type_code = default_type_code card)
191
+ mod_key = "Type::#{type_code.to_s.camelize}"
192
+ mod_key if mods_exist_for_key? mod_key
193
+ end
194
+
195
+ def default_type_code card
196
+ default_rule = card.rule_card :default
197
+ default_rule && default_rule.type_code
198
+ end
191
199
 
192
- (default_rule = card.rule_card(:default)) &&
193
- (type_code = default_rule.type_code) &&
194
- # default_rule.cardname.size > 2 and
195
- # default_rule.left.right.codename == self.class.pattern_code
196
- (mod_key = "Type::#{type_code.to_s.camelize}") &&
197
- (Card::Set.modules[:nonbase_format].values +
198
- [Card::Set.modules[:nonbase]]).any? { |hash| hash[mod_key] } &&
199
- mod_key
200
+ def mods_exist_for_key? mod_key
201
+ list_of_hashes = Card::Set.modules[:nonbase_format].values
202
+ list_of_hashes << Card::Set.modules[:nonbase]
203
+ list_of_hashes.any? { |h| h[mod_key] }
200
204
  end
201
205
  end
202
206
  end
@@ -7,7 +7,7 @@ namespace :card do
7
7
 
8
8
  desc "merge all import card data into the the database"
9
9
  task merge_all: :environment do
10
- Card::Migration::Import.merge true
10
+ Card::Migration::Import.merge all: true
11
11
  end
12
12
 
13
13
  desc "add card to import data"
@@ -0,0 +1,55 @@
1
+ require_dependency "card/view/visibility"
2
+ require_dependency "card/view/fetch"
3
+ require_dependency "card/view/cache"
4
+ require_dependency "card/view/stub"
5
+ require_dependency "card/view/options"
6
+
7
+ class Card
8
+ class View
9
+ include Visibility
10
+ include Fetch
11
+ include Cache
12
+ include Stub
13
+ include Options
14
+ extend Cache::ClassMethods
15
+
16
+ attr_reader :format, :parent, :card
17
+ attr_accessor :unsupported_view
18
+
19
+ def self.canonicalize view
20
+ return if view.blank? # error?
21
+ view.to_viewname.key.to_sym
22
+ end
23
+
24
+ def initialize format, view, raw_options={}, parent=nil
25
+ @format = format
26
+ @raw_view = view
27
+ @raw_options = raw_options
28
+ @parent = parent
29
+
30
+ @card = @format.card
31
+ normalize_options
32
+ end
33
+
34
+ # handle rendering, including optional visibility, permissions, and caching
35
+ def process
36
+ process_live_options
37
+ process_visibility_options
38
+ return if optional? && hide?(requested_view)
39
+ fetch { yield ok_view, foreign_live_options }
40
+ end
41
+
42
+ # the view to "attempt". Typically the same as @raw_view, but @raw_view is
43
+ # often overridden for the main view (top view of the main card on a page)
44
+ def requested_view
45
+ @requested_view ||= View.canonicalize live_options[:view]
46
+ end
47
+
48
+ # the final view. can be different from @requested_view when there are
49
+ # issues with permissions, recursions, unknown cards, etc.
50
+ def ok_view
51
+ @ok_view ||= format.ok_view requested_view,
52
+ normalized_options[:skip_perms]
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,90 @@
1
+ class Card
2
+ class View
3
+ # cache mechanics for view caching
4
+ module Cache
5
+ # adds tracking, mapping, and stub handling to standard cache fetching
6
+ def cache_fetch
7
+ cached_view = caching do
8
+ self.class.cache.fetch cache_key do
9
+ card.register_view_cache_key cache_key
10
+ yield
11
+ end
12
+ end
13
+
14
+ caching? ? cached_view : format.stub_render(cached_view)
15
+ end
16
+
17
+ # tracks that a cache fetch is in progress
18
+ def caching
19
+ self.class.caching(self) { yield }
20
+ end
21
+
22
+ # answers: should this cache fetch depend on one already in progress?
23
+ # Note that f you create a brand new format object (ie, not a subformat)
24
+ # midrender, (eg card.format...), it needs to be treated as unrelated to
25
+ # any caching in progress.
26
+ def caching?
27
+ deep_root? ? false : self.class.caching?
28
+ end
29
+
30
+ # neither view nor format has a parent
31
+ def deep_root?
32
+ !parent && !format.parent
33
+ end
34
+
35
+ def root
36
+ @root = parent ? parent.root : self
37
+ end
38
+
39
+ def cache_key
40
+ @cache_key ||= [
41
+ card.key, format.class, format.mode, options_for_cache_key
42
+ ].map(&:to_s).join "-"
43
+ end
44
+
45
+ def options_for_cache_key
46
+ hash_for_cache_key(live_options) + hash_for_cache_key(viz_hash)
47
+ end
48
+
49
+ def hash_for_cache_key hash
50
+ hash.keys.sort.map do |key|
51
+ option_for_cache_key key, hash[key]
52
+ end.join ";"
53
+ end
54
+
55
+ def option_for_cache_key key, value
56
+ string_value =
57
+ case value
58
+ when Hash then "{#{hash_for_cache_key value}}"
59
+ when Array then
60
+ # TODO: needs better handling of edit_structure
61
+ # currently we pass complete structure as nested array
62
+ value.map do |item|
63
+ item.is_a?(Array) ? item.join(":") : item.to_s
64
+ end.sort.join ","
65
+ else value.to_s
66
+ end
67
+ "#{key}:#{string_value}"
68
+ end
69
+
70
+ # cache-related Card::View class methods
71
+ module ClassMethods
72
+ def cache
73
+ Card::Cache[Card::View]
74
+ end
75
+
76
+ def caching?
77
+ @caching
78
+ end
79
+
80
+ def caching voo
81
+ old_caching = @caching
82
+ @caching = voo
83
+ yield
84
+ ensure
85
+ @caching = old_caching
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end