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.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/card.gemspec +8 -7
- data/config/initializers/01_core_extensions/array.rb +4 -0
- data/config/initializers/01_core_extensions/persistent_identifiers.rb +12 -0
- data/config/initializers/02_patches/better_errors.rb +56 -0
- data/config/initializers/core_extensions.rb +13 -18
- data/config/initializers/patches.rb +8 -0
- data/config/locales/de.yml +0 -2
- data/db/migrate_core_cards/20150202143810_import_bootstrap_layout.rb +22 -12
- data/db/migrate_core_cards/20161102202156_tweak_recaptcha_setting_cards.rb +17 -0
- data/db/migrate_core_cards/20161103154836_update_keys.rb +46 -0
- data/lib/card.rb +1 -8
- data/lib/card/act_manager.rb +4 -0
- data/lib/card/auth/permissions.rb +5 -3
- data/lib/card/cache.rb +1 -20
- data/lib/card/cache/persistent.rb +6 -0
- data/lib/card/content/chunk.rb +4 -3
- data/lib/card/content/diff.rb +2 -2
- data/lib/card/content/diff/result.rb +11 -0
- data/lib/card/env/success.rb +4 -0
- data/lib/card/error.rb +2 -0
- data/lib/card/format.rb +14 -17
- data/lib/card/format/content.rb +16 -8
- data/lib/card/format/error.rb +3 -5
- data/lib/card/format/names.rb +22 -16
- data/lib/card/format/nest.rb +67 -61
- data/lib/card/format/nest/fetch.rb +40 -33
- data/lib/card/format/nest/main.rb +39 -19
- data/lib/card/format/nest/subformat.rb +3 -16
- data/lib/card/format/nest/view.rb +23 -32
- data/lib/card/format/permission.rb +49 -34
- data/lib/card/format/registration.rb +12 -6
- data/lib/card/format/render.rb +62 -73
- data/lib/card/migration.rb +14 -10
- data/lib/card/migration/import.rb +20 -19
- data/lib/card/migration/import/import_data.rb +50 -59
- data/lib/card/migration/import/import_data/card_attributes.rb +56 -0
- data/lib/card/migration/import/import_data/card_content.rb +33 -0
- data/lib/card/migration/import/merger.rb +47 -0
- data/lib/card/mod/loader.rb +4 -4
- data/lib/card/model/save_helper.rb +49 -10
- data/lib/card/name.rb +16 -52
- data/lib/card/name/fields_and_traits.rb +67 -0
- data/lib/card/name/variants.rb +17 -0
- data/lib/card/query.rb +6 -2
- data/lib/card/query/attributes.rb +1 -1
- data/lib/card/query/interpretation.rb +3 -3
- data/lib/card/set/event.rb +2 -1
- data/lib/card/set/format.rb +18 -7
- data/lib/card/set_pattern.rb +17 -13
- data/lib/card/tasks/card.rake +1 -1
- data/lib/card/view.rb +55 -0
- data/lib/card/view/cache.rb +90 -0
- data/lib/card/view/fetch.rb +109 -0
- data/lib/card/view/options.rb +164 -0
- data/lib/card/view/stub.rb +30 -0
- data/lib/card/view/visibility.rb +95 -0
- data/lib/cardio.rb +3 -2
- data/lib/cardio/schema.rb +21 -8
- data/lib/generators/card.rb +16 -2
- data/lib/generators/card/format/format_generator.rb +10 -9
- data/lib/generators/card/migration/migration_generator.rb +10 -5
- data/lib/generators/card/set/USAGE +1 -1
- data/lib/generators/card/set/set_generator.rb +11 -9
- data/mod/account/set/right/account.rb +38 -40
- data/mod/account/set/right/token.rb +2 -1
- data/mod/account/set/self/account_links.rb +34 -54
- data/mod/account/set/self/signin.rb +107 -93
- data/mod/account/set/type/signup.rb +33 -32
- data/mod/account/set/type/user.rb +28 -21
- data/mod/account/spec/set/all/account_spec.rb +9 -9
- data/mod/account/spec/set/right/account_spec.rb +23 -14
- data/mod/account/spec/set/right/email_spec.rb +6 -6
- data/mod/account/spec/set/right/password_spec.rb +4 -4
- data/mod/account/spec/set/right/token_spec.rb +3 -3
- data/mod/account/spec/set/self/account_links_spec.rb +3 -3
- data/mod/account/spec/set/self/signin_spec.rb +2 -2
- data/mod/account/spec/set/type/signup_spec.rb +7 -8
- data/mod/ace_editor/set/abstract/ace_editor.rb +1 -4
- data/mod/admin/set/self/admin.rb +2 -2
- data/mod/admin/set/self/admin_info.rb +1 -1
- data/mod/admin/set/self/recaptcha_private_key.rb +3 -0
- data/mod/admin/set/self/recaptcha_proxy.rb +3 -0
- data/mod/admin/set/self/recaptcha_public_key.rb +3 -0
- data/mod/admin/set/self/trash.rb +4 -4
- data/mod/admin/spec/set/self/admin_spec.rb +4 -4
- data/mod/admin/spec/set/self/version_spec.rb +1 -1
- data/mod/basic_formats/set/all/all_css.rb +3 -3
- data/mod/basic_formats/set/all/all_csv.rb +6 -6
- data/mod/basic_formats/set/all/all_js.rb +4 -0
- data/mod/basic_formats/set/all/base.rb +40 -62
- data/mod/basic_formats/set/all/json.rb +34 -39
- data/mod/basic_formats/set/all/rss.rb +6 -6
- data/mod/basic_formats/set/all/text.rb +3 -2
- data/mod/basic_formats/set/self/01_head/javascript.rb +2 -2
- data/mod/basic_formats/set/self/head.rb +6 -10
- data/mod/basic_formats/spec/set/all/all_css_spec.rb +1 -1
- data/mod/basic_formats/spec/set/all/all_csv_spec.rb +1 -1
- data/mod/basic_formats/spec/set/all/base_spec.rb +8 -5
- data/mod/basic_formats/spec/set/all/json_spec.rb +2 -2
- data/mod/basic_formats/spec/set/all/rss_spec.rb +4 -4
- data/mod/basic_types/set/type/plain_text.rb +3 -5
- data/mod/basic_types/spec/set/type/plain_text_spec.rb +2 -2
- data/mod/bootstrap/lib/bootstrap.rb +16 -0
- data/mod/bootstrap/lib/bootstrap/basic_tags.rb +26 -0
- data/mod/bootstrap/lib/bootstrap/component.rb +133 -0
- data/mod/bootstrap/lib/bootstrap/component/form.rb +31 -0
- data/mod/bootstrap/lib/bootstrap/component/horizontal_form.rb +38 -0
- data/mod/bootstrap/lib/bootstrap/component/layout.rb +83 -0
- data/mod/bootstrap/lib/bootstrap/component/panel.rb +9 -0
- data/mod/bootstrap/lib/bootstrap/component_loader.rb +30 -0
- data/mod/bootstrap/lib/bootstrap/delegate.rb +16 -0
- data/mod/bootstrap/lib/bootstrapper.rb +16 -0
- data/mod/bootstrap/lib/stylesheets/bootstrap/_tables.scss +55 -52
- data/mod/bootstrap/lib/stylesheets/bootstrap/mixins/_table-row.scss +12 -12
- data/mod/bootstrap/lib/stylesheets/bootstrap_cards.scss +12 -0
- data/mod/bootstrap/set/all/bootstrap/accordion.rb +63 -0
- data/mod/bootstrap/set/all/bootstrap/helper.rb +7 -140
- data/mod/bootstrap/set/all/bootstrap/navbar.rb +74 -0
- data/mod/bootstrap/set/all/bootstrap/table.rb +76 -46
- data/mod/bootstrap/set/all/bootstrap/tabs.rb +58 -23
- data/mod/bootstrap/set/all/bootstrap/wrapper.rb +14 -8
- data/mod/bootstrap/set/all/rich_bootstrap.rb +5 -3
- data/mod/bootstrap/spec/set/all/bootstrap/bootstrap_builder_spec.rb +31 -0
- data/mod/bootstrap/spec/set/all/bootstrap/bootstrap_spec.rb +20 -0
- data/mod/bootstrap/spec/set/all/bootstrap/form_spec.rb +59 -1
- data/mod/bootstrap/spec/set/all/bootstrap/layout_spec.rb +104 -15
- data/mod/carrierwave/set/abstract/attachment.rb +4 -3
- data/mod/carrierwave/set/abstract/attachment/paths.rb +1 -1
- data/mod/carrierwave/set/abstract/attachment/storage_type.rb +5 -11
- data/mod/carrierwave/set/type/file.rb +39 -32
- data/mod/carrierwave/set/type/image.rb +59 -34
- data/mod/carrierwave/spec/set/type/image_spec.rb +3 -3
- data/mod/core/chunk/link.rb +5 -0
- data/mod/core/chunk/{include.rb → nest.rb} +8 -29
- data/mod/core/chunk/reference.rb +5 -6
- data/mod/core/chunk/view_stub.rb +42 -0
- data/mod/core/format/html_format.rb +23 -26
- data/mod/core/set/abstract/code_file.rb +1 -1
- data/mod/core/set/all/actify.rb +1 -1
- data/mod/core/set/all/active_card.rb +0 -1
- data/mod/core/set/all/{tracked_attributes.rb → assign_attributes.rb} +55 -24
- data/mod/core/set/all/collection.rb +136 -122
- data/mod/core/set/all/content.rb +8 -0
- data/mod/core/set/all/event.rb +5 -2
- data/mod/core/set/all/export.rb +7 -7
- data/mod/core/set/all/fetch.rb +90 -26
- data/mod/core/set/all/initialize.rb +17 -6
- data/mod/core/set/all/name.rb +2 -3
- data/mod/core/set/all/permissions.rb +19 -11
- data/mod/core/set/all/states.rb +12 -2
- data/mod/core/set/all/trash.rb +1 -1
- data/mod/core/set/all/type.rb +2 -0
- data/mod/core/set/all/utils.rb +4 -3
- data/mod/core/spec/chunk/literal_spec.rb +2 -2
- data/mod/core/spec/chunk/uri_spec.rb +17 -17
- data/mod/core/spec/format/html_format_spec.rb +11 -13
- data/mod/core/spec/set/all/attribute_tracking_spec.rb +2 -2
- data/mod/core/spec/set/all/collection_spec.rb +21 -24
- data/mod/core/spec/set/all/content_spec.rb +1 -1
- data/mod/core/spec/set/all/export_spec.rb +3 -3
- data/mod/core/spec/set/all/fetch_spec.rb +5 -5
- data/mod/core/spec/set/all/initialize_spec.rb +4 -4
- data/mod/core/spec/set/all/name_spec.rb +6 -6
- data/mod/core/spec/set/all/permissions_spec.rb +10 -10
- data/mod/core/spec/set/all/references_spec.rb +1 -1
- data/mod/core/spec/set/all/rules2_spec.rb +24 -24
- data/mod/core/spec/set/all/rules_spec.rb +1 -1
- data/mod/core/spec/set/all/templating_spec.rb +8 -8
- data/mod/core/spec/set/all/tracked_attributes_spec.rb +6 -6
- data/mod/core/spec/set/all/type_spec.rb +5 -5
- data/mod/developer/spec/set/all/event_viz_spec.rb +1 -1
- data/mod/developer/spec/set/right/debug_spec.rb +1 -1
- data/mod/email/set/all/email_html.rb +2 -2
- data/mod/email/set/all/notify.rb +8 -3
- data/mod/email/set/right/bcc.rb +3 -3
- data/mod/email/set/right/follow.rb +5 -5
- data/mod/email/set/right/following.rb +1 -1
- data/mod/email/set/self/follow_defaults.rb +27 -16
- data/mod/email/set/type/email_template.rb +1 -1
- data/mod/email/set/type_plus_right/user/follow.rb +10 -9
- data/mod/history/lib/card/act.rb +4 -0
- data/mod/history/lib/card/act/act_renderer.rb +194 -0
- data/mod/history/lib/card/act/act_renderer/absolute_act_renderer.rb +25 -0
- data/mod/history/lib/card/act/act_renderer/relative_act_renderer.rb +41 -0
- data/mod/history/lib/card/action.rb +1 -0
- data/mod/history/lib/card/action/action_renderer.rb +92 -0
- data/mod/history/lib/card/action/differ.rb +6 -1
- data/mod/history/set/all/act_view.rb +64 -0
- data/mod/history/set/all/action_view.rb +65 -0
- data/mod/history/set/all/content_history.rb +44 -37
- data/mod/history/set/all/history.rb +49 -263
- data/mod/machines/lib/stylesheets/style_cards.scss +30 -115
- data/mod/machines/set/abstract/script.rb +42 -7
- data/mod/machines/set/right/machine_input.rb +4 -0
- data/mod/machines/set/type/coffee_script.rb +8 -22
- data/mod/machines/set/type/css.rb +2 -2
- data/mod/machines/set/type/java_script.rb +4 -24
- data/mod/machines/set/type/scss.rb +1 -1
- data/mod/machines/spec/set/type/css_spec.rb +1 -1
- data/mod/machines/spec/set/type/scss_spec.rb +3 -3
- data/mod/machines/spec/set/type/skin_spec.rb +7 -7
- data/mod/pointer/set/abstract/01_pointer.rb +44 -46
- data/mod/pointer/set/abstract/01_pointer/edit.rb +13 -13
- data/mod/pointer/set/right/options.rb +4 -0
- data/mod/pointer/spec/set/type/pointer_spec.rb +7 -7
- data/mod/prosemirror_editor/set/abstract/prosemirror_editor.rb +3 -3
- data/mod/settings/set/abstract/permission.rb +25 -18
- data/mod/settings/set/right/add_help.rb +3 -3
- data/mod/settings/set/right/structure.rb +10 -16
- data/mod/settings/spec/set/right/comment_spec.rb +3 -3
- data/mod/settings/spec/set/right/create_spec.rb +1 -1
- data/mod/settings/spec/set/right/style_spec.rb +1 -1
- data/mod/settings/spec/set/type/setting_spec.rb +1 -1
- data/mod/solid_cache/set/abstract/solid_cache.rb +4 -4
- data/mod/solid_cache/set/right/solid_cache.rb +9 -10
- data/mod/standard/set/abstract/01_search_params.rb +41 -0
- data/mod/standard/set/abstract/search.rb +132 -0
- data/mod/standard/set/abstract/search/paging.rb +81 -0
- data/mod/standard/set/abstract/search/paging/paging_links.rb +90 -0
- data/mod/standard/set/abstract/wql_search.rb +67 -0
- data/mod/standard/set/all/error.rb +89 -82
- data/mod/standard/set/all/links.rb +1 -1
- data/mod/standard/set/all/rich_html/content.rb +125 -141
- data/mod/standard/set/all/rich_html/editing.rb +115 -178
- data/mod/standard/set/all/rich_html/form.rb +111 -131
- data/mod/standard/set/all/rich_html/header.rb +57 -39
- data/mod/standard/set/all/rich_html/menu.rb +94 -94
- data/mod/standard/set/all/rich_html/modal.rb +5 -10
- data/mod/standard/set/all/rich_html/new.rb +103 -0
- data/mod/standard/set/all/rich_html/toolbar.rb +54 -74
- data/mod/standard/set/all/rich_html/wrapper.rb +111 -138
- data/mod/standard/set/rstar/rules.rb +27 -38
- data/mod/standard/set/rstar/rules_editor.rb +298 -277
- data/mod/standard/set/self/navbox.rb +20 -15
- data/mod/standard/set/self/recent.rb +25 -17
- data/mod/standard/set/self/search.rb +25 -4
- data/mod/standard/set/type/cardtype.rb +11 -9
- data/mod/standard/set/type/date.rb +1 -1
- data/mod/standard/set/type/number.rb +1 -1
- data/mod/standard/set/type/phrase.rb +1 -1
- data/mod/standard/set/type/search_type.rb +17 -282
- data/mod/standard/set/type/session.rb +1 -1
- data/mod/standard/set/type/set.rb +155 -131
- data/mod/standard/set/type/toggle.rb +1 -1
- data/mod/standard/set/type/uri.rb +4 -4
- data/mod/standard/spec/chunk/include_spec.rb +13 -31
- data/mod/standard/spec/chunk/link_spec.rb +1 -1
- data/mod/standard/spec/set/all/error_spec.rb +1 -1
- data/mod/standard/spec/set/all/history_spec.rb +2 -2
- data/mod/standard/spec/set/all/rich_html/form_spec.rb +4 -4
- data/mod/standard/spec/set/all/rich_html/toolbar_spec.rb +22 -0
- data/mod/standard/spec/set/all/rich_html/wrapper_spec.rb +3 -2
- data/mod/standard/spec/set/right/when_created_spec.rb +1 -1
- data/mod/standard/spec/set/right/when_last_edited_spec.rb +1 -1
- data/mod/standard/spec/set/rstar/rules_spec.rb +2 -3
- data/mod/standard/spec/set/self/head_spec.rb +2 -2
- data/mod/standard/spec/set/self/navbox_spec.rb +1 -1
- data/mod/standard/spec/set/self/now_spec.rb +1 -1
- data/mod/standard/spec/set/type/date_spec.rb +1 -1
- data/mod/standard/spec/set/type/email_template_spec.rb +1 -1
- data/mod/standard/spec/set/type/layout_type_spec.rb +1 -1
- data/mod/standard/spec/set/type/number_spec.rb +1 -1
- data/mod/standard/spec/set/type/phrase_spec.rb +1 -1
- data/mod/standard/spec/set/type/search_type_spec.rb +2 -2
- data/mod/standard/spec/set/type/set_spec.rb +2 -2
- data/mod/standard/spec/set/type/toggle_spec.rb +2 -2
- data/mod/standard/spec/set/type/uri_spec.rb +3 -1
- data/mod/tinymce_editor/set/abstract/tinymce_editor.rb +1 -1
- data/spec/config/initializers/core_extensions_spec.rb +40 -10
- data/spec/lib/card/auth_spec.rb +8 -8
- data/spec/lib/card/cache_spec.rb +3 -3
- data/spec/lib/card/chunk_spec.rb +4 -4
- data/spec/lib/card/codename_spec.rb +2 -2
- data/spec/lib/card/content_spec.rb +23 -23
- data/spec/lib/card/diff_spec.rb +1 -1
- data/spec/lib/card/format_spec.rb +19 -24
- data/spec/lib/card/loader_spec.rb +4 -4
- data/spec/lib/card/name_spec.rb +16 -16
- data/spec/lib/card/query_spec.rb +80 -80
- data/spec/lib/card/reference_spec.rb +5 -5
- data/spec/lib/card/set_spec.rb +6 -6
- data/spec/lib/card/subcards_spec.rb +14 -0
- data/spec/lib/card/view_cache_spec.rb +5 -5
- data/spec/models/card/cardtype_spec.rb +15 -15
- data/spec/models/card/create_spec.rb +2 -2
- data/spec/models/card/trash_spec.rb +24 -24
- data/spec/models/card/type_transition_spec.rb +8 -8
- data/spec/models/card/validation_spec.rb +5 -5
- data/spec/models/card_spec.rb +14 -14
- data/spec/spec_helper.rb +6 -2
- data/spec/support/card_spec_helper.rb +21 -11
- data/spec/support/helper/card_helper.rb +11 -4
- metadata +73 -15
- data/lib/card/cache/view_cache.rb +0 -103
- data/mod/bootstrap/set/all/bootstrap/layout.rb +0 -58
- data/mod/core/set/all/view_cache.rb +0 -9
data/lib/card/name.rb
CHANGED
@@ -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
|
data/lib/card/query.rb
CHANGED
@@ -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
|
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
|
@@ -49,9 +49,9 @@ class Card
|
|
49
49
|
|
50
50
|
def clause_to_hash clause
|
51
51
|
case clause
|
52
|
-
when Hash
|
53
|
-
when String
|
54
|
-
when Integer
|
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
|
data/lib/card/set/event.rb
CHANGED
data/lib/card/set/format.rb
CHANGED
@@ -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
|
-
|
89
|
-
|
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
|
data/lib/card/set_pattern.rb
CHANGED
@@ -169,13 +169,12 @@ EOF
|
|
169
169
|
end
|
170
170
|
|
171
171
|
def lookup_module_list modules_hash
|
172
|
-
|
173
|
-
|
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
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
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
|
data/lib/card/tasks/card.rake
CHANGED
data/lib/card/view.rb
ADDED
@@ -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
|