card 1.17.4 → 1.18.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 +24 -25
- data/config/initializers/01_init_ruby_extensions.rb +0 -4
- data/config/initializers/inflections.rb +1 -1
- data/config/initializers/notification.rb +2 -2
- data/db/migrate/20110511221913_require_earlier_migrations.rb +3 -3
- data/db/migrate/20120105203350_require_1_8_migrations.rb +3 -3
- data/db/migrate/20121111025347_require_1_10_migrations.rb +3 -3
- data/db/migrate/20130106052640_table_cleanup.rb +4 -4
- data/db/migrate/20130411210957_update_codenames.rb +2 -2
- data/db/migrate/20141001105348_move_revisions_to_actions.rb +4 -4
- data/db/migrate/20141121172918_rename_card_migration_table.rb +2 -2
- data/db/migrate/20141208132159_remove_present_from_reference_table.rb +2 -2
- data/db/migrate/20141216053032_better_index_names.rb +9 -9
- data/db/migrate_core_cards/20120611203506_rails_inflection_updates.rb +29 -32
- data/db/migrate_core_cards/20130411191151_renaming_for_menu.rb +3 -4
- data/db/migrate_core_cards/20130411211600_delete_old_related_tab_cards.rb +1 -1
- data/db/migrate_core_cards/20130419215612_import_help_text.rb +1 -2
- data/db/migrate_core_cards/20130823192433_add_style_cards.rb +3 -3
- data/db/migrate_core_cards/20130910183318_move_styles_to_content.rb +2 -3
- data/db/migrate_core_cards/20130920214038_jsonize_tinymce.rb +2 -2
- data/db/migrate_core_cards/20130920291703_update_stylesheets.rb +1 -2
- data/db/migrate_core_cards/20130927191728_account_events.rb +5 -6
- data/db/migrate_core_cards/20131016172445_common_css_patch.rb +2 -3
- data/db/migrate_core_cards/20140110193325_reset_account_request_type.rb +0 -1
- data/db/migrate_core_cards/20140307231621_user_data_to_cards.rb +23 -32
- data/db/migrate_core_cards/20140317035504_account_requests_to_signups.rb +1 -7
- data/db/migrate_core_cards/20140512155840_add_script_cards.rb +21 -24
- data/db/migrate_core_cards/20140629222005_add_email_cards.rb +17 -22
- data/db/migrate_core_cards/20140725180118_config_card_updates.rb +2 -2
- data/db/migrate_core_cards/20141111083921_delete_machine_output.rb +1 -3
- data/db/migrate_core_cards/20141115034214_config_descriptions_etc.rb +2 -2
- data/db/migrate_core_cards/20141119001955_make_symlinks_relative.rb +3 -3
- data/db/migrate_core_cards/20141120120605_fix_notification_html_message.rb +1 -1
- data/db/migrate_core_cards/20141204061304_watchers_to_following.rb +8 -12
- data/db/migrate_core_cards/20141208162106_add_ace_script.rb +2 -3
- data/db/migrate_core_cards/20141216155251_add_more_following_cards.rb +10 -10
- data/db/migrate_core_cards/20150202143810_import_bootstrap_layout.rb +10 -12
- data/db/migrate_core_cards/20150220134731_following_to_follow_rule.rb +4 -4
- data/db/migrate_core_cards/20150317162412_bootstrap_themes.rb +3 -3
- data/db/migrate_core_cards/20150326205655_bootswatch_themes.rb +7 -7
- data/db/migrate_core_cards/20150429090551_search_card_context.rb +18 -20
- data/db/migrate_core_cards/20150508212032_menu_compatibility.rb +3 -7
- data/db/migrate_core_cards/20150510031118_fix_skin_images.rb +2 -3
- data/db/migrate_core_cards/20150528084659_add_session_cardtype.rb +3 -3
- data/db/migrate_core_cards/20150601133433_add_recent_setting_session_card.rb +4 -4
- data/db/migrate_core_cards/20150610171702_add_debugger_session_card.rb +4 -4
- data/db/migrate_core_cards/20150610180019_add_recaptcha_key_and_admin_info_cards.rb +5 -11
- data/db/migrate_core_cards/20150724123438_update_file_and_image_cards.rb +29 -35
- data/db/migrate_core_cards/20150824135418_update_file_history.rb +10 -14
- data/db/migrate_core_cards/20150903130006_attachment_upload_cards.rb +1 -1
- data/db/schema.rb +92 -94
- data/db/seed/new/card_actions.yml +461 -469
- data/db/seed/new/card_acts.yml +154 -172
- data/db/seed/new/card_changes.yml +4076 -4031
- data/db/seed/new/card_references.yml +1584 -1927
- data/db/seed/new/cards.yml +2095 -2112
- data/db/seed/test/fixtures/card_actions.yml +1497 -1505
- data/db/seed/test/fixtures/card_acts.yml +454 -472
- data/db/seed/test/fixtures/card_changes.yml +7309 -7263
- data/db/seed/test/fixtures/card_references.yml +2263 -2613
- data/db/seed/test/fixtures/cards.yml +3298 -3316
- data/db/seed/test/seed.rb +3 -0
- data/lib/card.rb +17 -9
- data/lib/card/active_record_ext.rb +6 -8
- data/lib/card/active_record_helper.rb +42 -32
- data/lib/card/auth.rb +3 -3
- data/lib/card/cache.rb +4 -4
- data/lib/card/cache/persistent.rb +9 -5
- data/lib/card/cache/temporary.rb +5 -5
- data/lib/card/chunk.rb +1 -1
- data/lib/card/codename.rb +3 -2
- data/lib/card/content.rb +62 -57
- data/lib/card/core_ext.rb +20 -30
- data/lib/card/diff.rb +88 -76
- data/lib/card/director_register.rb +66 -0
- data/lib/card/env.rb +14 -17
- data/lib/card/exceptions.rb +7 -9
- data/lib/card/format.rb +18 -367
- data/lib/card/format/nest.rb +183 -0
- data/lib/card/format/permission.rb +63 -0
- data/lib/card/format/render.rb +140 -0
- data/lib/card/loader.rb +17 -26
- data/lib/card/location.rb +6 -6
- data/lib/card/mailer.rb +4 -7
- data/lib/card/migration.rb +1 -1
- data/lib/card/name.rb +3 -6
- data/lib/card/query.rb +8 -8
- data/lib/card/query/attributes.rb +6 -6
- data/lib/card/query/clause.rb +10 -10
- data/lib/card/query/join.rb +7 -9
- data/lib/card/query/reference.rb +17 -19
- data/lib/card/query/sql_statement.rb +2 -2
- data/lib/card/query/value.rb +15 -16
- data/lib/card/set.rb +106 -209
- data/lib/card/set/event.rb +126 -0
- data/lib/card/set_pattern.rb +42 -29
- data/lib/card/simplecov_helper.rb +19 -19
- data/lib/card/spec_helper.rb +40 -16
- data/lib/card/stage.rb +72 -0
- data/lib/card/stage_director.rb +231 -0
- data/lib/card/subcards.rb +56 -24
- data/lib/card/subdirector_array.rb +31 -0
- data/lib/card/success.rb +15 -18
- data/lib/card/version.rb +1 -2
- data/lib/card/view_cache.rb +4 -4
- data/lib/card/view_name.rb +10 -8
- data/lib/cardio.rb +1 -1
- data/lib/generators/card.rb +2 -4
- data/lib/generators/card/format/format_generator.rb +4 -4
- data/lib/generators/card/migration/migration_generator.rb +6 -6
- data/lib/generators/card/set/set_generator.rb +5 -6
- data/mod/01_core/chunk/include.rb +2 -1
- data/mod/01_core/chunk/link.rb +2 -2
- data/mod/01_core/chunk/literal.rb +6 -9
- data/mod/01_core/chunk/query_reference.rb +1 -1
- data/mod/01_core/chunk/reference.rb +2 -2
- data/mod/01_core/chunk/uri.rb +52 -63
- data/mod/01_core/format/html_format.rb +8 -12
- data/mod/01_core/format/text_format.rb +1 -1
- data/mod/01_core/set/all/actify.rb +96 -0
- data/mod/01_core/set/all/active_card.rb +7 -7
- data/mod/01_core/set/all/collection.rb +19 -20
- data/mod/01_core/set/all/content.rb +9 -7
- data/mod/01_core/set/all/erb.rb +5 -5
- data/mod/01_core/set/all/event.rb +60 -0
- data/mod/01_core/set/all/fetch.rb +13 -19
- data/mod/01_core/set/all/haml.rb +1 -1
- data/mod/01_core/set/all/initialize.rb +35 -41
- data/mod/01_core/set/all/location_history.rb +3 -5
- data/mod/01_core/set/all/name.rb +19 -68
- data/mod/01_core/set/all/name_validations.rb +56 -0
- data/mod/01_core/set/all/pattern.rb +2 -2
- data/mod/01_core/set/all/permissions.rb +14 -20
- data/mod/01_core/set/all/phases.rb +9 -200
- data/mod/01_core/set/all/references.rb +10 -10
- data/mod/01_core/set/all/rules.rb +3 -4
- data/mod/01_core/set/all/stages.rb +24 -0
- data/mod/01_core/set/all/states.rb +4 -4
- data/mod/01_core/set/all/subcards.rb +16 -26
- data/mod/01_core/set/all/templating.rb +1 -3
- data/mod/01_core/set/all/tracked_attributes.rb +47 -48
- data/mod/01_core/set/all/trash.rb +10 -10
- data/mod/01_core/set/all/type.rb +9 -8
- data/mod/01_core/set/all/utils.rb +10 -14
- data/mod/01_core/set/all/view_cache.rb +2 -2
- data/mod/01_core/set_pattern/01_all.rb +3 -3
- data/mod/01_core/set_pattern/02_all_plus.rb +3 -3
- data/mod/01_core/set_pattern/03_type.rb +2 -2
- data/mod/01_core/set_pattern/04_star.rb +3 -3
- data/mod/01_core/set_pattern/05_rstar.rb +3 -3
- data/mod/01_core/set_pattern/06_right.rb +2 -2
- data/mod/01_core/set_pattern/07_type_plus_right.rb +2 -2
- data/mod/01_core/set_pattern/08_self.rb +1 -1
- data/mod/01_core/spec/chunk/literal_spec.rb +7 -8
- data/mod/01_core/spec/chunk/uri_spec.rb +140 -142
- data/mod/01_core/spec/format/html_format_spec.rb +72 -57
- data/mod/01_core/spec/set/all/collection_spec.rb +63 -43
- data/mod/01_core/spec/set/all/content_spec.rb +4 -4
- data/mod/01_core/spec/set/all/fetch_spec.rb +12 -3
- data/mod/01_core/spec/set/all/name_spec.rb +3 -4
- data/mod/01_core/spec/set/all/pattern_spec.rb +32 -35
- data/mod/01_core/spec/set/all/permissions_spec.rb +17 -5
- data/mod/01_core/spec/set/all/phases_spec.rb +0 -1
- data/mod/01_core/spec/set/all/references_spec.rb +1 -1
- data/mod/01_core/spec/set/all/rules2_spec.rb +79 -91
- data/mod/01_core/spec/set/all/rules_spec.rb +63 -56
- data/mod/01_core/spec/set/all/templating_spec.rb +0 -1
- data/mod/01_core/spec/set/all/tracked_attributes_spec.rb +4 -5
- data/mod/01_core/spec/set/all/trash_spec.rb +23 -1
- data/mod/01_core/spec/set/all/type_spec.rb +2 -5
- data/mod/01_history/lib/card/action.rb +8 -10
- data/mod/01_history/set/all/actions.rb +2 -4
- data/mod/01_history/set/all/content_history.rb +38 -32
- data/mod/01_history/set/all/history.rb +20 -17
- data/mod/02_basic_types/format/rss_format.rb +0 -1
- data/mod/02_basic_types/set/all/all_css.rb +9 -13
- data/mod/02_basic_types/set/all/all_csv.rb +14 -17
- data/mod/02_basic_types/set/all/all_js.rb +3 -4
- data/mod/02_basic_types/set/all/base.rb +2 -2
- data/mod/02_basic_types/set/all/file.rb +2 -5
- data/mod/02_basic_types/set/all/json.rb +19 -18
- data/mod/02_basic_types/set/all/rss.rb +3 -3
- data/mod/02_basic_types/set/all/text.rb +1 -3
- data/mod/02_basic_types/set/type/html.rb +4 -8
- data/mod/02_basic_types/set/type/plain_text.rb +2 -3
- data/mod/02_basic_types/set/type/pointer.rb +82 -92
- data/mod/02_basic_types/spec/set/all/all_css_spec.rb +2 -2
- data/mod/02_basic_types/spec/set/all/all_csv_spec.rb +6 -4
- data/mod/02_basic_types/spec/set/all/base_spec.rb +6 -6
- data/mod/02_basic_types/spec/set/all/json_spec.rb +8 -8
- data/mod/02_basic_types/spec/set/type/plain_text_spec.rb +3 -3
- data/mod/02_basic_types/spec/set/type/pointer_spec.rb +29 -32
- data/mod/03_machines/lib/card/machine.rb +95 -81
- data/mod/03_machines/lib/card/machine_input.rb +35 -34
- data/mod/03_machines/set/right/machine_input.rb +1 -1
- data/mod/03_machines/set/self/script_ace.rb +2 -3
- data/mod/03_machines/set/self/script_card_menu.rb +2 -3
- data/mod/03_machines/set/self/script_jquery_helper.rb +2 -2
- data/mod/03_machines/set/self/script_slot.rb +2 -2
- data/mod/03_machines/set/self/style_bootstrap_compatible.rb +1 -1
- data/mod/03_machines/set/self/style_cards.rb +1 -1
- data/mod/03_machines/set/self/style_jquery_ui_smoothness.rb +0 -1
- data/mod/03_machines/set/type/coffee_script.rb +9 -13
- data/mod/03_machines/set/type/css.rb +12 -13
- data/mod/03_machines/set/type/java_script.rb +6 -8
- data/mod/03_machines/set/type/scss.rb +4 -5
- data/mod/03_machines/set/type/skin.rb +3 -6
- data/mod/03_machines/spec/lib/shared_machine_examples.rb +31 -38
- data/mod/03_machines/spec/lib/shared_machine_input_examples.rb +7 -8
- data/mod/03_machines/spec/set/type/coffeescript_spec.rb +19 -13
- data/mod/03_machines/spec/set/type/css_spec.rb +22 -16
- data/mod/03_machines/spec/set/type/scss_spec.rb +28 -21
- data/mod/03_machines/spec/set/type/skin_spec.rb +28 -30
- data/mod/04_settings/lib/card/setting.rb +4 -4
- data/mod/04_settings/set/abstract/permission.rb +30 -37
- data/mod/04_settings/set/right/add_help.rb +3 -3
- data/mod/04_settings/set/right/script.rb +4 -5
- data/mod/04_settings/set/right/structure.rb +3 -4
- data/mod/04_settings/set/right/style.rb +3 -3
- data/mod/04_settings/set/self/add_help.rb +1 -1
- data/mod/04_settings/set/self/input.rb +1 -1
- data/mod/04_settings/set/self/on_create.rb +1 -1
- data/mod/04_settings/set/self/options.rb +1 -1
- data/mod/04_settings/set/self/options_label.rb +1 -1
- data/mod/04_settings/set/type/setting.rb +29 -44
- data/mod/04_settings/spec/set/right/comment_spec.rb +9 -12
- data/mod/04_settings/spec/set/right/script_spec.rb +7 -7
- data/mod/04_settings/spec/set/right/structure_spec.rb +13 -12
- data/mod/04_settings/spec/set/right/style_spec.rb +13 -13
- data/mod/04_settings/spec/set/type/setting_spec.rb +1 -1
- data/mod/05_email/format/email_html_format.rb +1 -1
- data/mod/05_email/format/email_text_format.rb +2 -2
- data/mod/05_email/lib/card/follow_option.rb +12 -15
- data/mod/05_email/set/all/email_html.rb +2 -3
- data/mod/05_email/set/all/email_text.rb +3 -3
- data/mod/05_email/set/all/follow.rb +14 -22
- data/mod/05_email/set/all/notify.rb +11 -11
- data/mod/05_email/set/all/observer.rb +7 -8
- data/mod/05_email/set/right/bcc.rb +4 -9
- data/mod/05_email/set/right/follow.rb +26 -39
- data/mod/05_email/set/right/follow_fields.rb +2 -2
- data/mod/05_email/set/right/followers.rb +3 -1
- data/mod/05_email/set/right/following.rb +13 -16
- data/mod/05_email/set/self/always.rb +1 -2
- data/mod/05_email/set/self/created.rb +4 -6
- data/mod/05_email/set/self/edited.rb +3 -7
- data/mod/05_email/set/self/follow_defaults.rb +11 -12
- data/mod/05_email/set/self/never.rb +2 -4
- data/mod/05_email/set/type/email_template.rb +40 -27
- data/mod/05_email/set/type_plus_right/user/follow.rb +159 -157
- data/mod/05_email/spec/set/all/follow_spec.rb +28 -37
- data/mod/05_email/spec/set/all/notify_spec.rb +21 -26
- data/mod/05_email/spec/set/all/observer_spec.rb +58 -37
- data/mod/05_email/spec/set/right/followers_spec.rb +9 -14
- data/mod/05_email/spec/set/right/following_spec.rb +1 -1
- data/mod/05_email/spec/set/self/follow_defaults_spec.rb +1 -1
- data/mod/05_standard/lib/carrier_wave/cardmount.rb +9 -9
- data/mod/05_standard/lib/file_uploader.rb +8 -13
- data/mod/05_standard/lib/image_uploader.rb +8 -9
- data/mod/05_standard/set/abstract/attachment.rb +26 -43
- data/mod/05_standard/set/all/account.rb +2 -2
- data/mod/05_standard/set/all/comment.rb +11 -13
- data/mod/05_standard/set/all/error.rb +18 -18
- data/mod/05_standard/set/all/event_viz.rb +16 -29
- data/mod/05_standard/set/all/links.rb +35 -34
- data/mod/05_standard/set/all/list_changes.rb +10 -12
- data/mod/05_standard/set/all/rich_html/content.rb +13 -13
- data/mod/05_standard/set/all/rich_html/editing.rb +5 -5
- data/mod/05_standard/set/all/rich_html/form.rb +22 -26
- data/mod/05_standard/set/all/rich_html/header.rb +18 -25
- data/mod/05_standard/set/all/rich_html/menu.rb +20 -22
- data/mod/05_standard/set/all/rich_html/modal.rb +3 -3
- data/mod/05_standard/set/all/rich_html/toolbar.rb +49 -58
- data/mod/05_standard/set/all/rich_html/wrapper.rb +40 -41
- data/mod/05_standard/set/right/account.rb +26 -14
- data/mod/05_standard/set/right/email.rb +2 -2
- data/mod/05_standard/set/right/password.rb +6 -5
- data/mod/05_standard/set/right/salt.rb +2 -2
- data/mod/05_standard/set/right/stats.rb +17 -20
- data/mod/05_standard/set/right/token.rb +1 -1
- data/mod/05_standard/set/right/when_created.rb +1 -1
- data/mod/05_standard/set/right/when_last_edited.rb +1 -1
- data/mod/05_standard/set/rstar/rules.rb +3 -3
- data/mod/05_standard/set/rstar/rules_editor.rb +39 -39
- data/mod/05_standard/set/self/account_links.rb +21 -22
- data/mod/05_standard/set/self/admin_info.rb +5 -5
- data/mod/05_standard/set/self/alerts.rb +1 -1
- data/mod/05_standard/set/self/all.rb +1 -1
- data/mod/05_standard/set/self/foot.rb +1 -1
- data/mod/05_standard/set/self/head.rb +19 -22
- data/mod/05_standard/set/self/navbox.rb +3 -7
- data/mod/05_standard/set/self/now.rb +1 -1
- data/mod/05_standard/set/self/recent.rb +19 -25
- data/mod/05_standard/set/self/search.rb +2 -4
- data/mod/05_standard/set/self/signin.rb +6 -6
- data/mod/05_standard/set/self/stats.rb +31 -38
- data/mod/05_standard/set/self/version.rb +1 -2
- data/mod/05_standard/set/type/basic.rb +15 -17
- data/mod/05_standard/set/type/cardtype.rb +3 -3
- data/mod/05_standard/set/type/date.rb +1 -2
- data/mod/05_standard/set/type/file.rb +22 -33
- data/mod/05_standard/set/type/image.rb +30 -23
- data/mod/05_standard/set/type/layout_type.rb +4 -4
- data/mod/05_standard/set/type/list.rb +32 -38
- data/mod/05_standard/set/type/listed_by.rb +11 -13
- data/mod/05_standard/set/type/number.rb +5 -6
- data/mod/05_standard/set/type/phrase.rb +1 -1
- data/mod/05_standard/set/type/search_type.rb +25 -23
- data/mod/05_standard/set/type/session.rb +2 -3
- data/mod/05_standard/set/type/set.rb +46 -51
- data/mod/05_standard/set/type/signup.rb +18 -19
- data/mod/05_standard/set/type/toggle.rb +5 -5
- data/mod/05_standard/set/type/user.rb +6 -6
- data/mod/05_standard/spec/chunk/include_spec.rb +115 -98
- data/mod/05_standard/spec/chunk/link_spec.rb +58 -31
- data/mod/05_standard/spec/chunk/query_reference_spec.rb +12 -14
- data/mod/05_standard/spec/set/all/email_html_spec.rb +3 -3
- data/mod/05_standard/spec/set/all/error_spec.rb +3 -3
- data/mod/05_standard/spec/set/all/history_spec.rb +52 -38
- data/mod/05_standard/spec/set/all/links_spec.rb +2 -2
- data/mod/05_standard/spec/set/all/rich_html/editing_spec.rb +0 -1
- data/mod/05_standard/spec/set/all/rich_html/form_spec.rb +11 -11
- data/mod/05_standard/spec/set/all/rich_html/wrapper_spec.rb +4 -4
- data/mod/05_standard/spec/set/right/email_spec.rb +1 -4
- data/mod/05_standard/spec/set/right/password_spec.rb +4 -7
- data/mod/05_standard/spec/set/right/stats_spec.rb +2 -3
- data/mod/05_standard/spec/set/right/when_created_spec.rb +1 -1
- data/mod/05_standard/spec/set/right/when_last_edited_spec.rb +1 -1
- data/mod/05_standard/spec/set/rstar/rules_spec.rb +6 -6
- data/mod/05_standard/spec/set/self/all_spec.rb +11 -13
- data/mod/05_standard/spec/set/self/head_spec.rb +1 -3
- data/mod/05_standard/spec/set/self/navbox_spec.rb +1 -1
- data/mod/05_standard/spec/set/self/now_spec.rb +2 -2
- data/mod/05_standard/spec/set/self/signin_spec.rb +1 -1
- data/mod/05_standard/spec/set/self/stats_spec.rb +1 -1
- data/mod/05_standard/spec/set/self/version_spec.rb +2 -2
- data/mod/05_standard/spec/set/type/cardtype_spec.rb +3 -4
- data/mod/05_standard/spec/set/type/date_spec.rb +1 -1
- data/mod/05_standard/spec/set/type/email_template_spec.rb +5 -5
- data/mod/05_standard/spec/set/type/file_spec.rb +50 -28
- data/mod/05_standard/spec/set/type/html_spec.rb +12 -7
- data/mod/05_standard/spec/set/type/image_spec.rb +55 -45
- data/mod/05_standard/spec/set/type/layout_type_spec.rb +2 -2
- data/mod/05_standard/spec/set/type/listed_by_spec.rb +2 -2
- data/mod/05_standard/spec/set/type/number_spec.rb +1 -1
- data/mod/05_standard/spec/set/type/phrase_spec.rb +1 -1
- data/mod/05_standard/spec/set/type/search_type_spec.rb +15 -16
- data/mod/05_standard/spec/set/type/set_spec.rb +16 -17
- data/mod/05_standard/spec/set/type/signup_spec.rb +7 -5
- data/mod/05_standard/spec/set/type/toggle_spec.rb +4 -4
- data/mod/05_standard/spec/set/type/uri_spec.rb +11 -11
- data/mod/05_standard/spec/set/type/user_spec.rb +0 -1
- data/mod/06_bootstrap/set/all/bootstrap/form.rb +9 -10
- data/mod/06_bootstrap/set/all/bootstrap/helper.rb +22 -27
- data/mod/06_bootstrap/set/all/bootstrap/wrapper.rb +1 -2
- data/mod/06_bootstrap/set/all/rich_bootstrap.rb +1 -3
- data/mod/06_bootstrap/set/self/bootstrap_cards.rb +2 -2
- data/mod/06_bootstrap/set/self/bootstrap_js.rb +2 -2
- data/mod/06_bootstrap/set/self/bootswatch_shared.rb +19 -19
- data/mod/06_bootstrap/set/self/smartmenu_css.rb +2 -2
- data/mod/06_bootstrap/set/self/smartmenu_js.rb +3 -3
- data/mod/06_bootstrap/spec/set/all/bootstrap/form_spec.rb +5 -5
- data/spec/lib/card/action_spec.rb +4 -4
- data/spec/lib/card/cache_spec.rb +3 -5
- data/spec/lib/card/chunk_spec.rb +6 -8
- data/spec/lib/card/codename_spec.rb +4 -6
- data/spec/lib/card/content_spec.rb +12 -17
- data/spec/lib/card/diff_spec.rb +59 -61
- data/spec/lib/card/format_spec.rb +55 -34
- data/spec/lib/card/loader_spec.rb +35 -37
- data/spec/lib/card/name_spec.rb +159 -145
- data/spec/lib/card/query_spec.rb +4 -4
- data/spec/lib/card/reference_spec.rb +24 -24
- data/spec/lib/card/set_pattern_spec.rb +3 -3
- data/spec/lib/card/stage_director_spec.rb +218 -0
- data/spec/lib/card/subcards_spec.rb +12 -16
- data/spec/lib/card/success_spec.rb +16 -18
- data/spec/lib/card/view_cache_spec.rb +1 -1
- data/spec/mailers/mailer_spec.rb +3 -5
- data/spec/models/card/cardtype_spec.rb +40 -51
- data/spec/models/card/create_spec.rb +58 -39
- data/spec/models/card/trash_spec.rb +23 -32
- data/spec/models/card/type_transition_spec.rb +41 -32
- data/spec/models/card/validation_spec.rb +13 -15
- data/spec/models/card_spec.rb +48 -59
- data/spec/spec_helper.rb +26 -31
- metadata +16 -2
@@ -0,0 +1,183 @@
|
|
1
|
+
class Card
|
2
|
+
class Format
|
3
|
+
module Nest
|
4
|
+
def subformat subcard
|
5
|
+
subcard = Card.fetch(subcard, new: {}) if subcard.is_a?(String)
|
6
|
+
self.class.new subcard,
|
7
|
+
parent: self, depth: @depth + 1, root: @root,
|
8
|
+
# FIXME: - the following four should not be hard-coded
|
9
|
+
# here. need a generalized mechanism
|
10
|
+
# for attribute inheritance
|
11
|
+
context_names: @context_names, mode: @mode,
|
12
|
+
mainline: @mainline, form: @form
|
13
|
+
end
|
14
|
+
|
15
|
+
def with_nest_mode mode
|
16
|
+
if (switch_mode = INCLUSION_MODES[mode]) && @mode != switch_mode
|
17
|
+
old_mode = @mode
|
18
|
+
@mode = switch_mode
|
19
|
+
@nest_defaults = nil
|
20
|
+
end
|
21
|
+
result = yield
|
22
|
+
if old_mode
|
23
|
+
@nest_defaults = nil
|
24
|
+
@mode = old_mode
|
25
|
+
end
|
26
|
+
result
|
27
|
+
end
|
28
|
+
|
29
|
+
def prepare_nest opts
|
30
|
+
@char_count ||= 0
|
31
|
+
opts ||= {}
|
32
|
+
|
33
|
+
case
|
34
|
+
when opts.key?(:comment)
|
35
|
+
# commented nest
|
36
|
+
opts[:comment]
|
37
|
+
when @mode == :closed && @char_count > Card.config.max_char_count
|
38
|
+
# move on; content out of view
|
39
|
+
''
|
40
|
+
when opts[:inc_name] == '_main' && show_layout? && @depth == 0
|
41
|
+
# the main card within a layout
|
42
|
+
expand_main opts
|
43
|
+
else
|
44
|
+
# standard nest
|
45
|
+
result = nest fetch_nested_card(opts), opts
|
46
|
+
@char_count += result.length if @mode == :closed && result
|
47
|
+
result
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def nest nested_card, opts={}
|
52
|
+
# ActiveSupport::Notifications.instrument('card', message:
|
53
|
+
# "nest: #{nested_card.name}, #{opts}") do
|
54
|
+
opts.delete_if { |_k, v| v.nil? }
|
55
|
+
opts.reverse_merge! nest_defaults(nested_card)
|
56
|
+
|
57
|
+
sub = nil
|
58
|
+
if opts[:inc_name] =~ /^_(self)?$/
|
59
|
+
sub = self
|
60
|
+
else
|
61
|
+
sub = subformat nested_card
|
62
|
+
sub.nest_opts = opts[:items] ? opts[:items].clone : {}
|
63
|
+
end
|
64
|
+
|
65
|
+
view = canonicalize_view opts.delete :view
|
66
|
+
opts[:home_view] = [:closed, :edit].member?(view) ? :open : view
|
67
|
+
# FIXME: special views should be represented in view definitions
|
68
|
+
|
69
|
+
view =
|
70
|
+
case @mode
|
71
|
+
when :edit then
|
72
|
+
view_in_edit_mode(view, nested_card)
|
73
|
+
when :template then
|
74
|
+
:template_rule
|
75
|
+
when :closed then
|
76
|
+
view_in_closed_mode(view, nested_card)
|
77
|
+
else
|
78
|
+
view
|
79
|
+
end
|
80
|
+
|
81
|
+
sub.optional_render view, opts
|
82
|
+
# end
|
83
|
+
end
|
84
|
+
|
85
|
+
def get_nest_content cardname
|
86
|
+
content = params[cardname.to_s.tr('+', '_')]
|
87
|
+
|
88
|
+
# CLEANME This is a hack so plus cards re-populate on failed signups
|
89
|
+
p = params['subcards']
|
90
|
+
if p && (card_params = p[cardname.to_s])
|
91
|
+
content = card_params['content']
|
92
|
+
end
|
93
|
+
content if content.present? # returns nil for empty string
|
94
|
+
end
|
95
|
+
|
96
|
+
def fetch_nested_card options
|
97
|
+
Card.fetch options[:inc_name], new: nest_new_args(options)
|
98
|
+
end
|
99
|
+
|
100
|
+
def nest_new_args options
|
101
|
+
args = { name: options[:inc_name], type: options[:type], supercard: card }
|
102
|
+
args.delete(:supercard) if options[:inc_name].strip.blank?
|
103
|
+
# special case. gets absolutized incorrectly. fix in smartname?
|
104
|
+
if options[:inc_name] =~ /^_main\+/
|
105
|
+
# FIXME: this is a rather hacky (and untested) way to get @superleft
|
106
|
+
# to work on new cards named _main+whatever
|
107
|
+
args[:name] = args[:name].gsub(/^_main\+/, '+')
|
108
|
+
args[:supercard] = root.card
|
109
|
+
end
|
110
|
+
if (content = get_nest_content options[:inc_name])
|
111
|
+
args[:content] = content
|
112
|
+
end
|
113
|
+
args
|
114
|
+
end
|
115
|
+
|
116
|
+
def wrap_main content
|
117
|
+
content # no wrapping in base format
|
118
|
+
end
|
119
|
+
|
120
|
+
def nest_defaults nested_card
|
121
|
+
@nest_defaults ||= begin
|
122
|
+
defaults = get_nest_defaults(nested_card).clone
|
123
|
+
defaults.merge! @nest_opts if @nest_opts
|
124
|
+
defaults
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def get_nest_defaults _nested_card
|
129
|
+
{ view: :name }
|
130
|
+
end
|
131
|
+
|
132
|
+
protected
|
133
|
+
|
134
|
+
def expand_main opts
|
135
|
+
opts.merge! root.main_opts if root.main_opts
|
136
|
+
legacy_main_opts_tweaks! opts
|
137
|
+
|
138
|
+
with_nest_mode :normal do
|
139
|
+
@mainline = true
|
140
|
+
result = wrap_main nest(root.card, opts)
|
141
|
+
@mainline = false
|
142
|
+
result
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def legacy_main_opts_tweaks! opts
|
147
|
+
if (val = params[:size]) && val.present?
|
148
|
+
opts[:size] = val.to_sym
|
149
|
+
end
|
150
|
+
|
151
|
+
if (val = params[:item]) && val.present?
|
152
|
+
opts[:items] = (opts[:items] || {}).reverse_merge view: val.to_sym
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
def view_in_edit_mode homeview, nested_card
|
157
|
+
not_in_form =
|
158
|
+
Card::Format.perms[homeview] == :none || # view configured not to keep
|
159
|
+
# in form
|
160
|
+
nested_card.structure || # not yet nesting structures
|
161
|
+
nested_card.key.blank? # eg {{_self|type}} on new cards
|
162
|
+
|
163
|
+
not_in_form ? :blank : :edit_in_form
|
164
|
+
end
|
165
|
+
|
166
|
+
def view_in_closed_mode homeview, nested_card
|
167
|
+
approved_view = Card::Format.closed[homeview]
|
168
|
+
case
|
169
|
+
when approved_view == true then
|
170
|
+
homeview
|
171
|
+
when Card::Format.error_code[homeview] then
|
172
|
+
homeview
|
173
|
+
when approved_view then
|
174
|
+
approved_view
|
175
|
+
when !nested_card.known? then
|
176
|
+
:closed_missing
|
177
|
+
else
|
178
|
+
:closed_content
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
class Card
|
2
|
+
class Format
|
3
|
+
module Permission
|
4
|
+
def ok_view view, args={}
|
5
|
+
return view if args.delete :skip_permissions
|
6
|
+
approved_view = approved_view view, args
|
7
|
+
args[:denied_view] = view if approved_view != view
|
8
|
+
if focal? && (error_code = Card::Format.error_code[approved_view])
|
9
|
+
root.error_status = error_code
|
10
|
+
end
|
11
|
+
approved_view
|
12
|
+
end
|
13
|
+
|
14
|
+
def approved_view view, args={}
|
15
|
+
case
|
16
|
+
when @depth >= Card.config.max_depth
|
17
|
+
# prevent recursion. @depth tracks subformats
|
18
|
+
:too_deep
|
19
|
+
when Card::Format.perms[view] == :none
|
20
|
+
# permission skipping specified in view definition
|
21
|
+
view
|
22
|
+
when args.delete(:skip_permissions)
|
23
|
+
# permission skipping specified in args
|
24
|
+
view
|
25
|
+
when !card.known? && !tagged(view, :unknown_ok)
|
26
|
+
# handle unknown cards (where view not exempt)
|
27
|
+
view_for_unknown view, args
|
28
|
+
else
|
29
|
+
# run explicit permission checks
|
30
|
+
permitted_view view, args
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def permitted_view view, args
|
35
|
+
perms_required = Card::Format.perms[view] || :read
|
36
|
+
args[:denied_task] =
|
37
|
+
if perms_required.is_a? Proc
|
38
|
+
:read unless perms_required.call(self) # read isn't quite right
|
39
|
+
else
|
40
|
+
[perms_required].flatten.find { |task| !ok? task }
|
41
|
+
end
|
42
|
+
|
43
|
+
if args[:denied_task]
|
44
|
+
Card::Format.denial[view] || :denial
|
45
|
+
else
|
46
|
+
view
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def view_for_unknown _view, _args
|
51
|
+
# note: overridden in HTML
|
52
|
+
focal? ? :not_found : :missing
|
53
|
+
end
|
54
|
+
|
55
|
+
def ok? task
|
56
|
+
task = :create if task == :update && card.new_card?
|
57
|
+
@ok ||= {}
|
58
|
+
@ok[task] = card.ok? task if @ok[task].nil?
|
59
|
+
@ok[task]
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,140 @@
|
|
1
|
+
class Card
|
2
|
+
class Format
|
3
|
+
module Render
|
4
|
+
def page view, slot_opts
|
5
|
+
@card.run_callbacks :show_page do
|
6
|
+
show view, slot_opts
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def render view, args={}
|
11
|
+
view = canonicalize_view view
|
12
|
+
return if hidden_view? view, args
|
13
|
+
view = ok_view view, args
|
14
|
+
current_view(view) do
|
15
|
+
args = default_render_args view, args
|
16
|
+
with_nest_mode view do
|
17
|
+
Card::ViewCache.fetch(self, view, args) do
|
18
|
+
method = view_method view, args
|
19
|
+
method.arity == 0 ? method.call : method.call(args)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
rescue => e
|
24
|
+
rescue_view e, view
|
25
|
+
end
|
26
|
+
|
27
|
+
def view_method view, args
|
28
|
+
method "_view_#{view}"
|
29
|
+
rescue
|
30
|
+
args[:unsupported_view] = view
|
31
|
+
method '_view_unsupported_view'
|
32
|
+
end
|
33
|
+
|
34
|
+
def canonicalize_view view
|
35
|
+
return if view.blank?
|
36
|
+
view_key = view.to_viewname.key.to_sym
|
37
|
+
DEPRECATED_VIEWS[view_key] || view_key
|
38
|
+
end
|
39
|
+
|
40
|
+
def default_item_view
|
41
|
+
:name
|
42
|
+
end
|
43
|
+
|
44
|
+
def hidden_view? view, args
|
45
|
+
args.delete(:optional) && !show_view?(view, args)
|
46
|
+
end
|
47
|
+
|
48
|
+
def show_view? view, args
|
49
|
+
default = args.delete(:default_visibility) || :show # FIXME: - ugly
|
50
|
+
api_option = args["optional_#{view}".to_sym]
|
51
|
+
case api_option
|
52
|
+
# permanent visibility specified in code
|
53
|
+
when :always then true
|
54
|
+
when :never then false
|
55
|
+
else
|
56
|
+
# wagneer can override code settings
|
57
|
+
contextual_setting = nest_arg_visibility(view, args) || api_option
|
58
|
+
case contextual_setting
|
59
|
+
when :show then true
|
60
|
+
when :hide then false
|
61
|
+
else
|
62
|
+
default == :show
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def nest_arg_visibility view, args
|
68
|
+
[:show, :hide].each do |setting|
|
69
|
+
return setting if parse_view_visibility(args[setting]).member?(view)
|
70
|
+
end
|
71
|
+
false
|
72
|
+
end
|
73
|
+
|
74
|
+
def parse_view_visibility val
|
75
|
+
case val
|
76
|
+
when NilClass then
|
77
|
+
[]
|
78
|
+
when Array then
|
79
|
+
val
|
80
|
+
when String then
|
81
|
+
val.split(/[\s,]+/)
|
82
|
+
else
|
83
|
+
raise Card::Error, "bad show/hide argument: #{val}"
|
84
|
+
end.map { |view| canonicalize_view view }
|
85
|
+
end
|
86
|
+
|
87
|
+
def default_render_args view, a=nil
|
88
|
+
args =
|
89
|
+
case a
|
90
|
+
when nil then
|
91
|
+
{}
|
92
|
+
when Hash then
|
93
|
+
a.clone
|
94
|
+
when Array then
|
95
|
+
a[0].merge a[1]
|
96
|
+
else
|
97
|
+
raise Card::Error, "bad render args: #{a}"
|
98
|
+
end
|
99
|
+
|
100
|
+
default_method = "default_#{view}_args"
|
101
|
+
send default_method, args if respond_to?(default_method)
|
102
|
+
args
|
103
|
+
end
|
104
|
+
|
105
|
+
def rescue_view e, view
|
106
|
+
raise e if Rails.env =~ /^cucumber|test$/
|
107
|
+
Rails.logger.info "\nError rendering #{error_cardname} / #{view}: "\
|
108
|
+
"#{e.class} : #{e.message}"
|
109
|
+
Card::Error.current = e
|
110
|
+
card.notable_exception_raised
|
111
|
+
raise e if (debug = Card[:debugger]) && debug.content == 'on'
|
112
|
+
rendering_error e, view
|
113
|
+
end
|
114
|
+
|
115
|
+
def current_view view
|
116
|
+
old_view = @current_view
|
117
|
+
@current_view = view
|
118
|
+
yield
|
119
|
+
ensure
|
120
|
+
@current_view = old_view
|
121
|
+
end
|
122
|
+
|
123
|
+
def error_cardname
|
124
|
+
card && card.name.present? ? card.name : 'unknown card'
|
125
|
+
end
|
126
|
+
|
127
|
+
def rendering_error _exception, view
|
128
|
+
"Error rendering: #{error_cardname} (#{view} view)"
|
129
|
+
end
|
130
|
+
|
131
|
+
def add_class options, klass
|
132
|
+
options[:class] = [options[:class], klass].flatten.compact * ' '
|
133
|
+
end
|
134
|
+
|
135
|
+
def unique_id
|
136
|
+
"#{card.key}-#{Time.now.to_i}-#{rand(3)}"
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
data/lib/card/loader.rb
CHANGED
@@ -21,9 +21,7 @@ class Card
|
|
21
21
|
load_formats
|
22
22
|
load_sets
|
23
23
|
|
24
|
-
if ENV['RAILS_ENV'] == 'development'
|
25
|
-
update_machine_output_hack
|
26
|
-
end
|
24
|
+
update_machine_output_hack if ENV['RAILS_ENV'] == 'development'
|
27
25
|
end
|
28
26
|
|
29
27
|
def update_machine_output_hack
|
@@ -51,7 +49,7 @@ class Card
|
|
51
49
|
return unless (mtime_output = style.machine_output_card.updated_at)
|
52
50
|
style.machine_input_card.item_cards.each do |i_card|
|
53
51
|
next unless i_card.codename
|
54
|
-
|
52
|
+
%w(03_machines 06_bootstrap).each do |mod|
|
55
53
|
style_dir = "#{Cardio.gem_root}/mod/#{mod}/lib/stylesheets"
|
56
54
|
file_path = "#{style_dir}/#{i_card.codename}.scss"
|
57
55
|
next unless File.exist? file_path
|
@@ -73,11 +71,11 @@ class Card
|
|
73
71
|
def load_layouts
|
74
72
|
mod_dirs.inject({}) do |hash, mod|
|
75
73
|
dirname = "#{mod}/layout"
|
76
|
-
if File.
|
74
|
+
if File.exist? dirname
|
77
75
|
Dir.foreach(dirname) do |filename|
|
78
76
|
next if filename =~ /^\./
|
79
77
|
hash[filename.gsub /\.html$/, ''] =
|
80
|
-
File.read([dirname, filename]
|
78
|
+
File.read([dirname, filename].join('/'))
|
81
79
|
end
|
82
80
|
end
|
83
81
|
hash
|
@@ -97,9 +95,7 @@ class Card
|
|
97
95
|
private
|
98
96
|
|
99
97
|
def load_set_patterns
|
100
|
-
if rewrite_tmp_files?
|
101
|
-
generate_set_pattern_tmp_files
|
102
|
-
end
|
98
|
+
generate_set_pattern_tmp_files if rewrite_tmp_files?
|
103
99
|
load_dir "#{Card.paths['tmp/set_pattern'].first}/*.rb"
|
104
100
|
end
|
105
101
|
|
@@ -108,15 +104,14 @@ class Card
|
|
108
104
|
seq = 100
|
109
105
|
mod_dirs.each do |mod|
|
110
106
|
dirname = "#{mod}/set_pattern"
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
end
|
107
|
+
next unless Dir.exist? dirname
|
108
|
+
Dir.entries(dirname).sort.each do |filename|
|
109
|
+
m = filename.match(/^(\d+_)?([^\.]*).rb/)
|
110
|
+
key = m && m[2]
|
111
|
+
next unless key
|
112
|
+
filename = [dirname, filename].join('/')
|
113
|
+
SetPattern.write_tmp_file key, filename, seq
|
114
|
+
seq += 1
|
120
115
|
end
|
121
116
|
end
|
122
117
|
end
|
@@ -146,19 +141,17 @@ class Card
|
|
146
141
|
tmp_filename = "#{mod_tmp_dir}/#{rel_filename}"
|
147
142
|
Set.write_tmp_file abs_filename, tmp_filename, rel_filename
|
148
143
|
end
|
149
|
-
seq
|
144
|
+
seq += 1
|
150
145
|
end
|
151
146
|
end
|
152
147
|
|
153
148
|
def load_tmp_set_modules
|
154
149
|
patterns = Card.set_patterns.reverse.map(&:pattern_code)
|
155
|
-
|
150
|
+
.unshift 'abstract'
|
156
151
|
Dir.glob("#{Card.paths['tmp/set'].first}/*").sort.each do |tmp_mod|
|
157
152
|
patterns.each do |pattern|
|
158
153
|
pattern_dir = "#{tmp_mod}/#{pattern}"
|
159
|
-
if Dir.
|
160
|
-
load_dir "#{pattern_dir}/**/*.rb"
|
161
|
-
end
|
154
|
+
load_dir "#{pattern_dir}/**/*.rb" if Dir.exist? pattern_dir
|
162
155
|
end
|
163
156
|
end
|
164
157
|
end
|
@@ -173,9 +166,7 @@ class Card
|
|
173
166
|
def prepare_tmp_dir path
|
174
167
|
return unless rewrite_tmp_files?
|
175
168
|
p = Card.paths[path]
|
176
|
-
if p.existent.first
|
177
|
-
FileUtils.rm_rf p.first, secure: true
|
178
|
-
end
|
169
|
+
FileUtils.rm_rf p.first, secure: true if p.existent.first
|
179
170
|
Dir.mkdir p.first
|
180
171
|
end
|
181
172
|
|