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
data/lib/card/location.rb
CHANGED
@@ -7,19 +7,19 @@ class Card
|
|
7
7
|
|
8
8
|
# TESTME
|
9
9
|
def page_path title, opts={}
|
10
|
-
Rails.logger.warn "Pass only Card::Name to page_path #{title.class}, #{title}" unless Card::Name===title
|
11
|
-
format = opts[:format] ? ".#{opts.delete(:format)}"
|
10
|
+
Rails.logger.warn "Pass only Card::Name to page_path #{title.class}, #{title}" unless Card::Name === title
|
11
|
+
format = opts[:format] ? ".#{opts.delete(:format)}" : ''
|
12
12
|
action = opts[:action] ? "#{opts.delete(:action)}/" : ''
|
13
|
-
query = opts.present? ? "?#{opts.to_param}"
|
13
|
+
query = opts.present? ? "?#{opts.to_param}" : ''
|
14
14
|
card_path "#{action}#{title.to_name.url_key}#{format}#{query}"
|
15
15
|
end
|
16
16
|
|
17
17
|
def card_path rel_path
|
18
|
-
Rails.logger.warn "Pass only strings to card_path: #{rel_path.class}, #{rel_path}" unless String===rel_path
|
18
|
+
Rails.logger.warn "Pass only strings to card_path: #{rel_path.class}, #{rel_path}" unless String === rel_path
|
19
19
|
if rel_path =~ /^\//
|
20
20
|
rel_path
|
21
21
|
else
|
22
|
-
"#{
|
22
|
+
"#{Card.config.relative_url_root}/#{rel_path}"
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
@@ -27,7 +27,7 @@ class Card
|
|
27
27
|
if rel =~ /^https?\:/
|
28
28
|
rel
|
29
29
|
else
|
30
|
-
"#{
|
30
|
+
"#{Card::Env[:protocol]}#{Card::Env[:host]}#{card_path rel}"
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
data/lib/card/mailer.rb
CHANGED
@@ -1,10 +1,8 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
require 'open-uri'
|
3
3
|
|
4
|
-
|
5
4
|
class Card
|
6
5
|
class Mailer < ActionMailer::Base
|
7
|
-
|
8
6
|
@@defaults = Card.config.email_defaults || {}
|
9
7
|
@@defaults.symbolize_keys!
|
10
8
|
@@defaults[:return_path] ||= @@defaults[:from] if @@defaults[:from]
|
@@ -12,7 +10,7 @@ class Card
|
|
12
10
|
default @@defaults
|
13
11
|
|
14
12
|
class << self
|
15
|
-
def new_mail
|
13
|
+
def new_mail *args, &block
|
16
14
|
mail = Mail.new(args, &block)
|
17
15
|
method = Card::Mailer.delivery_method
|
18
16
|
mail.delivery_method(method, Card::Mailer.send(:"#{method}_settings"))
|
@@ -20,18 +18,17 @@ class Card
|
|
20
18
|
mail.raise_delivery_errors = Card::Mailer.raise_delivery_errors
|
21
19
|
mail
|
22
20
|
end
|
23
|
-
|
21
|
+
|
24
22
|
def layout message
|
25
|
-
%
|
23
|
+
%(
|
26
24
|
<!DOCTYPE html>
|
27
25
|
<html>
|
28
26
|
<body>
|
29
27
|
#{message}
|
30
28
|
</body>
|
31
29
|
</html>
|
32
|
-
|
30
|
+
)
|
33
31
|
end
|
34
32
|
end
|
35
33
|
end
|
36
34
|
end
|
37
|
-
|
data/lib/card/migration.rb
CHANGED
@@ -79,7 +79,7 @@ class Card::Migration < ActiveRecord::Migration
|
|
79
79
|
|
80
80
|
def import_json filename, merge_opts={}
|
81
81
|
Card.config.action_mailer.perform_deliveries = false
|
82
|
-
output_file = File.join data_path, "unmerged_#{
|
82
|
+
output_file = File.join data_path, "unmerged_#{filename}"
|
83
83
|
merge_opts[:output_file] ||= output_file
|
84
84
|
Card.merge_list read_json(filename), merge_opts
|
85
85
|
end
|
data/lib/card/name.rb
CHANGED
@@ -38,7 +38,7 @@ class Card
|
|
38
38
|
|
39
39
|
def trait tag_code
|
40
40
|
name = trait_name(tag_code)
|
41
|
-
name ? name.s : (
|
41
|
+
name ? name.s : (raise Card::NotFound, "unknown codename: #{tag_code}")
|
42
42
|
end
|
43
43
|
|
44
44
|
def field tag_name
|
@@ -55,10 +55,8 @@ class Card
|
|
55
55
|
when Symbol
|
56
56
|
trait_name tag_name
|
57
57
|
else
|
58
|
-
if tag_name.to_s[0] == '+'
|
59
|
-
|
60
|
-
end
|
61
|
-
[ self, tag_name ].to_name
|
58
|
+
tag_name = tag_name.to_s[1..-1] if tag_name.to_s[0] == '+'
|
59
|
+
[self, tag_name].to_name
|
62
60
|
end
|
63
61
|
end
|
64
62
|
|
@@ -100,7 +98,6 @@ class Card
|
|
100
98
|
SetPattern.card_keys[tag_name.key]
|
101
99
|
end
|
102
100
|
|
103
|
-
|
104
101
|
def relative?
|
105
102
|
s =~ RELATIVE_REGEXP || starts_with_joint?
|
106
103
|
end
|
data/lib/card/query.rb
CHANGED
@@ -59,16 +59,16 @@ class Card
|
|
59
59
|
ignore: %w( prepend append view params vars size )
|
60
60
|
}.inject({}) { |h, pair| pair[1].each { |v| h[v.to_sym] = pair[0] }; h }
|
61
61
|
|
62
|
-
CONJUNCTIONS = { any: :or, in: :or, or: :or, all: :and, and: :and }
|
62
|
+
CONJUNCTIONS = { any: :or, in: :or, or: :or, all: :and, and: :and }.freeze
|
63
63
|
|
64
64
|
MODIFIERS = %w( conj return sort sort_as group dir limit offset )
|
65
|
-
.inject({}) { |h,v| h[v.to_sym] = nil; h }
|
65
|
+
.inject({}) { |h, v| h[v.to_sym] = nil; h }
|
66
66
|
|
67
|
-
OPERATORS = %w( != = =~ < > in ~ ).inject({}) {|h,v| h[v]=v; h }.merge({
|
67
|
+
OPERATORS = %w( != = =~ < > in ~ ).inject({}) { |h, v| h[v] = v; h }.merge({
|
68
68
|
eq: '=', gt: '>', lt: '<', match: '~', ne: '!=', 'not in' => nil
|
69
69
|
}.stringify_keys)
|
70
70
|
|
71
|
-
DEFAULT_ORDER_DIRS =
|
71
|
+
DEFAULT_ORDER_DIRS = { update: 'desc', relevance: 'desc' }.freeze
|
72
72
|
|
73
73
|
attr_reader :statement, :mods, :conditions, :comment,
|
74
74
|
:subqueries, :superquery
|
@@ -184,7 +184,7 @@ class Card
|
|
184
184
|
when Hash then clause
|
185
185
|
when String then { key: clause.to_name.key }
|
186
186
|
when Integer then { id: clause }
|
187
|
-
else
|
187
|
+
else raise BadQuery, "Invalid query args #{clause.inspect}"
|
188
188
|
end
|
189
189
|
end
|
190
190
|
|
@@ -193,7 +193,7 @@ class Card
|
|
193
193
|
when Integer, Float, Symbol, Hash then val
|
194
194
|
when String, SmartName then normalize_string_value val
|
195
195
|
when Array then val.map { |v| normalize_value v }
|
196
|
-
else
|
196
|
+
else raise BadQuery, "unknown WQL value type: #{val.class}"
|
197
197
|
end
|
198
198
|
end
|
199
199
|
|
@@ -251,7 +251,7 @@ class Card
|
|
251
251
|
when :ref_relational then relate key, val, method: :join_references
|
252
252
|
when :plus_relational then relate_compound key, val
|
253
253
|
when :ignore then # noop
|
254
|
-
else
|
254
|
+
else raise BadQuery, "Invalid attribute #{key}"
|
255
255
|
end
|
256
256
|
end
|
257
257
|
|
@@ -285,7 +285,7 @@ class Card
|
|
285
285
|
|
286
286
|
def all_joins
|
287
287
|
@all_joins ||=
|
288
|
-
(joins + subqueries.
|
288
|
+
(joins + subqueries.select(&:unjoined).map(&:all_joins)).flatten
|
289
289
|
end
|
290
290
|
end
|
291
291
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
class Card
|
3
3
|
class Query
|
4
4
|
module Attributes
|
5
|
-
SORT_JOIN_TO_ITEM_MAP = { left: 'left_id', right: 'right_id' }
|
5
|
+
SORT_JOIN_TO_ITEM_MAP = { left: 'left_id', right: 'right_id' }.freeze
|
6
6
|
|
7
7
|
# ~~~~~~ RELATIONAL
|
8
8
|
|
@@ -133,7 +133,7 @@ class Card
|
|
133
133
|
"replace(#{table_alias}.name,'+',' ')",
|
134
134
|
"#{table_alias}.db_content"
|
135
135
|
].map do |field|
|
136
|
-
%
|
136
|
+
%(#{field} #{cxn.match quote("[[:<:]]#{v}[[:>:]]")})
|
137
137
|
end
|
138
138
|
"(#{name_or_content.join ' OR '})"
|
139
139
|
end
|
@@ -209,7 +209,7 @@ class Card
|
|
209
209
|
# FIXME: - SQL generated before SQL phase
|
210
210
|
cs.joins << Join.new(
|
211
211
|
from: cs,
|
212
|
-
to:
|
212
|
+
to: %w(card_references wr referee_id)
|
213
213
|
)
|
214
214
|
cs.mods[:sort_join_field] = "#{cs.table_alias}.id as sort_join_field"
|
215
215
|
# HACK!
|
@@ -260,13 +260,13 @@ class Card
|
|
260
260
|
def all val
|
261
261
|
conjoin val, :and
|
262
262
|
end
|
263
|
-
alias
|
263
|
+
alias and all
|
264
264
|
|
265
265
|
def any val
|
266
266
|
conjoin val, :or
|
267
267
|
end
|
268
|
-
|
269
|
-
|
268
|
+
alias or any
|
269
|
+
alias in any
|
270
270
|
|
271
271
|
def conjoin val, conj
|
272
272
|
sq = subquery unjoined: true, conj: conj
|
data/lib/card/query/clause.rb
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
|
2
2
|
module Card::Query::Clause
|
3
|
-
# attr_accessor :clause
|
3
|
+
# attr_accessor :clause
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
def safe_sql txt
|
6
|
+
txt = txt.to_s
|
7
|
+
txt =~ /[^\w\*\(\)\s\.\,]/ ? raise("WQL contains disallowed characters: #{txt}") : txt
|
8
|
+
end
|
9
9
|
|
10
|
-
def quote
|
10
|
+
def quote v
|
11
|
+
ActiveRecord::Base.connection.quote(v)
|
12
|
+
end
|
11
13
|
|
12
|
-
def match_prep
|
14
|
+
def match_prep v
|
13
15
|
cxn ||= ActiveRecord::Base.connection
|
14
16
|
[cxn, v]
|
15
17
|
end
|
16
|
-
|
17
|
-
|
18
|
-
end
|
18
|
+
end
|
data/lib/card/query/join.rb
CHANGED
@@ -2,11 +2,11 @@ class Card
|
|
2
2
|
class Query
|
3
3
|
class Join
|
4
4
|
attr_accessor :conditions, :side,
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
:from, :to,
|
6
|
+
:from_table, :to_table,
|
7
|
+
:from_alias, :to_alias,
|
8
|
+
:from_field, :to_field,
|
9
|
+
:superjoin, :subjoins
|
10
10
|
|
11
11
|
def initialize opts={}
|
12
12
|
from_and_to opts
|
@@ -28,7 +28,7 @@ class Card
|
|
28
28
|
[:from, :to].each do |side|
|
29
29
|
object = opts[side]
|
30
30
|
case object
|
31
|
-
when nil
|
31
|
+
when nil then next
|
32
32
|
when Array
|
33
33
|
{ table: object.shift, alias: object.shift, field: object.shift }
|
34
34
|
when Card::Query
|
@@ -36,7 +36,7 @@ class Card
|
|
36
36
|
when Card::Query::Reference
|
37
37
|
{ table: 'card_references', alias: object.table_alias }
|
38
38
|
when Card::Query::Join
|
39
|
-
|
39
|
+
raise 'to: cannot be Join' if side == :to
|
40
40
|
{ table: object.to_table, alias: object.to_alias }
|
41
41
|
else
|
42
42
|
raise "invalid #{side} option: #{object}"
|
@@ -66,8 +66,6 @@ class Card
|
|
66
66
|
@in_left = left? || (!@superjoin.nil? && @superjoin.in_left?)
|
67
67
|
end
|
68
68
|
end
|
69
|
-
|
70
69
|
end
|
71
70
|
end
|
72
71
|
end
|
73
|
-
|
data/lib/card/query/reference.rb
CHANGED
@@ -1,44 +1,44 @@
|
|
1
1
|
class Card::Query
|
2
2
|
class Reference
|
3
|
-
|
4
3
|
DEFINITIONS = {
|
5
4
|
# syntax:
|
6
5
|
# wql query key => [ direction, {reference_type} ]
|
7
|
-
|
8
|
-
|
6
|
+
# direction = :out | :in
|
7
|
+
# reference_type = 'L' | 'I' | 'P'
|
9
8
|
|
10
|
-
refer_to: [
|
11
|
-
link_to: [
|
12
|
-
include: [
|
13
|
-
}
|
9
|
+
refer_to: [:out, 'L', 'I'], referred_to_by: [:in, 'L', 'I'],
|
10
|
+
link_to: [:out, 'L'], linked_to_by: [:in, 'L'],
|
11
|
+
include: [:out, 'I'], included_by: [:in, 'I']
|
12
|
+
}.freeze
|
14
13
|
|
15
14
|
FIELDMAP = {
|
16
|
-
out: [
|
17
|
-
in: [
|
18
|
-
}
|
15
|
+
out: [:referer_id, :referee_id],
|
16
|
+
in: [:referee_id, :referer_id]
|
17
|
+
}.freeze
|
19
18
|
|
20
19
|
attr_accessor :conditions, :cardquery, :infield, :outfield
|
21
20
|
|
22
21
|
def table_alias
|
23
|
-
@table_alias ||= "cr#{@parent.table_id force=true}"
|
22
|
+
@table_alias ||= "cr#{@parent.table_id force = true}"
|
24
23
|
end
|
25
24
|
|
26
|
-
|
27
25
|
def initialize key, val, parent
|
28
|
-
key
|
26
|
+
key = key
|
27
|
+
val = val
|
28
|
+
@parent = parent
|
29
29
|
@conditions = []
|
30
30
|
|
31
|
-
direction, *reftype = DEFINITIONS[
|
32
|
-
@infield, @outfield = FIELDMAP[
|
31
|
+
direction, *reftype = DEFINITIONS[key.to_sym]
|
32
|
+
@infield, @outfield = FIELDMAP[direction]
|
33
33
|
|
34
34
|
if reftype.present?
|
35
|
-
operator = (reftype.size==1 ? '=' : 'IN')
|
35
|
+
operator = (reftype.size == 1 ? '=' : 'IN')
|
36
36
|
quoted_letters = reftype.map { |letter| "'#{letter}'" } * ', '
|
37
37
|
@conditions << "ref_type #{operator} (#{quoted_letters})"
|
38
38
|
end
|
39
39
|
|
40
40
|
if val == '_none'
|
41
|
-
@conditions <<
|
41
|
+
@conditions << 'present = 0'
|
42
42
|
else
|
43
43
|
@cardquery = val
|
44
44
|
end
|
@@ -47,5 +47,3 @@ class Card::Query
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
50
|
-
|
51
|
-
|
@@ -218,8 +218,8 @@ class Card
|
|
218
218
|
|
219
219
|
def safe_sql txt
|
220
220
|
txt = txt.to_s
|
221
|
-
if txt
|
222
|
-
|
221
|
+
if txt =~ /[^\w\*\(\)\s\.\,]/
|
222
|
+
raise "WQL contains disallowed characters: #{txt}"
|
223
223
|
else
|
224
224
|
txt
|
225
225
|
end
|
data/lib/card/query/value.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
class Card
|
2
2
|
class Query
|
3
3
|
class Value
|
4
|
-
|
5
4
|
include Clause
|
6
5
|
|
7
6
|
attr_reader :query, :operator, :value
|
@@ -24,40 +23,40 @@ class Card
|
|
24
23
|
if target = OPERATORS[@operator.to_s]
|
25
24
|
@operator = target
|
26
25
|
else
|
27
|
-
|
26
|
+
raise BadQuery, "Invalid Operator #{@operator}"
|
28
27
|
end
|
29
28
|
end
|
30
29
|
|
31
|
-
|
32
30
|
def sqlize v
|
33
31
|
case v
|
34
|
-
when Query
|
35
|
-
when Array
|
32
|
+
when Query then v.to_sql
|
33
|
+
when Array then '(' + v.flatten.map { |x| sqlize(x) }.join(',') + ')'
|
36
34
|
else quote(v.to_s)
|
37
35
|
end
|
38
36
|
end
|
39
37
|
|
40
38
|
def to_sql field
|
41
|
-
op
|
39
|
+
op = @operator
|
40
|
+
v = @value
|
42
41
|
table = @query.table_alias
|
43
42
|
|
44
43
|
field, v = case field.to_s
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
44
|
+
when 'name'
|
45
|
+
["#{table}.key", [v].flatten.map(&:to_name).map(&:key)]
|
46
|
+
when 'content'
|
47
|
+
["#{table}.db_content", v]
|
48
|
+
else
|
49
|
+
["#{table}.#{safe_sql field}", v]
|
51
50
|
end
|
52
51
|
|
53
|
-
v = v[0] if Array===v && v.length==1 && op != 'in'
|
54
|
-
if op=='~'
|
52
|
+
v = v[0] if Array === v && v.length == 1 && op != 'in'
|
53
|
+
if op == '~'
|
55
54
|
cxn, v = match_prep(v)
|
56
|
-
%
|
55
|
+
%(#{field} #{cxn.match(sqlize(v))})
|
57
56
|
else
|
58
57
|
"#{field} #{op} #{sqlize(v)}"
|
59
58
|
end
|
60
59
|
end
|
61
60
|
end
|
62
61
|
end
|
63
|
-
end
|
62
|
+
end
|
data/lib/card/set.rb
CHANGED
@@ -1,90 +1,90 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
|
3
3
|
class Card
|
4
|
-
|
5
4
|
module Set
|
5
|
+
include Event
|
6
6
|
mattr_accessor :modules, :traits
|
7
7
|
@@modules = { base: [], base_format: {}, nonbase: {}, nonbase_format: {} }
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
9
|
+
# A 'Set' is a group of Cards to which 'Rules' may be applied.
|
10
|
+
# Sets can be as specific as a single card, as general as all cards, or
|
11
|
+
# anywhere in between.
|
12
|
+
#
|
13
|
+
# Rules take two main forms: card rules and code rules.
|
14
|
+
#
|
15
|
+
# 'Card rules' are defined in card content. These are generally configured
|
16
|
+
# via the web interface and are thus documented at http://wagn.org/rules.
|
17
|
+
#
|
18
|
+
# 'Code rules' can be defined in a 'set file' within any 'Mod' (short for
|
19
|
+
# both 'module' and 'modification'). In accordance with Wagn's 'MoVE'
|
20
|
+
# architecture, there are two main kinds of code rules you can create in
|
21
|
+
# set file: Views, and Events.
|
22
|
+
# Events are associated with the Card class, and Views are associated with
|
23
|
+
# a Format class.
|
24
|
+
# You can also use set files to add or override Card and/or Format methods
|
25
|
+
# directly. The majority of Card code is contained in these files.
|
26
|
+
#
|
27
|
+
# (FIXME - define mod, add generator)
|
28
|
+
#
|
29
|
+
# Whenever you fetch or instantiate a card, it will automatically include
|
30
|
+
# all the set modules defined in set files associated with sets of which it
|
31
|
+
# is a member. This entails both simple model methods and 'events', which
|
32
|
+
# are special methods explored in greater detail below.
|
33
|
+
#
|
34
|
+
# For example, say you have a Plaintext card named 'Philipp+address', and
|
35
|
+
# you have set files for the following sets:
|
36
|
+
#
|
37
|
+
# * all cards
|
38
|
+
# * all Plaintext cards
|
39
|
+
# * all cards ending in +address
|
40
|
+
#
|
41
|
+
# When you run this:
|
42
|
+
#
|
43
|
+
# mycard = Card.fetch 'Philipp+address'
|
44
|
+
#
|
45
|
+
# ...then mycard will include the set modules associated with each of those
|
46
|
+
# ets in the above order. (The order is determined by the set pattern;
|
47
|
+
# ee lib/card/set_pattern.rb for more information about set_ptterns and
|
48
|
+
# od/core/set/all/fetch.rb for more about fetching.)
|
49
|
+
#
|
50
|
+
# imilarly, whenever a Format object is instantiated for a card, it
|
51
|
+
# ncludes all views associated with BOTH (a) sets of which the card is a
|
52
|
+
# ember and (b) the current format or its ancestors. More on defining
|
53
|
+
# iews below.
|
54
|
+
#
|
55
|
+
#
|
56
|
+
# In order to have a set file associated with "all cards ending in
|
57
|
+
# +address", you could create a file in
|
58
|
+
# mywagn/mod/mymod/set/right/address.rb.
|
59
|
+
# The recommended mechanism for doing so is running `wagn generate set
|
60
|
+
# modname set_pattern set_anchor`. In the current example, this
|
61
|
+
# would translate to `wagn generate set mymod right address`.
|
62
|
+
# Note that both the set_pattern and the set_anchor must correspond to the
|
63
|
+
# codename of a card in the database to function correctly but you can add
|
64
|
+
# arbitrary subdirectories to organize your code rules. The rule above
|
65
|
+
# for example could be saved in
|
66
|
+
# mywagn/mod/mymod/set/right/address/america/north/canada.rb.
|
67
|
+
#
|
68
|
+
#
|
69
|
+
# When a Card application loads, it uses these files to autogenerate a
|
70
|
+
# tmp_file that uses this set file to create a Card::Set::Right::Address
|
71
|
+
# module which itself is extended with Card::Set. A set file is 'just ruby'
|
72
|
+
# but is generally quite concise because Card uses its file location to
|
73
|
+
# autogenerate ruby module names and then uses Card::Set module to provide
|
74
|
+
# additional API.
|
75
|
+
#
|
76
|
+
#
|
77
|
+
# View definitions
|
78
|
+
#
|
79
|
+
# When you declare:
|
80
|
+
# view :view_name do |args|
|
81
|
+
# #...your code here
|
82
|
+
# end
|
83
|
+
#
|
84
|
+
# Methods are defined on the format
|
85
|
+
#
|
86
|
+
# The external api with checks:
|
87
|
+
# render(:viewname, args)
|
88
88
|
|
89
89
|
module Format
|
90
90
|
mattr_accessor :views
|
@@ -94,12 +94,12 @@ class Card
|
|
94
94
|
view = view.to_viewname.key.to_sym
|
95
95
|
views[self] ||= {}
|
96
96
|
view_block = views[self][view] =
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
97
|
+
if block_given?
|
98
|
+
Card::Format.extract_class_vars view, args[0]
|
99
|
+
block
|
100
|
+
else
|
101
|
+
alias_block view, args
|
102
|
+
end
|
103
103
|
define_method "_view_#{view}", view_block
|
104
104
|
end
|
105
105
|
|
@@ -107,7 +107,7 @@ class Card
|
|
107
107
|
opts = args[0].is_a?(Hash) ? args.shift : { view: args.shift }
|
108
108
|
opts[:mod] ||= self
|
109
109
|
opts[:view] ||= view
|
110
|
-
views[opts[:mod]][opts[:view]] ||
|
110
|
+
views[opts[:mod]][opts[:view]] || raise
|
111
111
|
rescue
|
112
112
|
raise "cannot find #{opts[:view]} view in #{opts[:mod]}; " \
|
113
113
|
"failed to alias #{view} in #{self}"
|
@@ -146,39 +146,16 @@ class Card
|
|
146
146
|
end
|
147
147
|
end
|
148
148
|
|
149
|
-
def
|
150
|
-
perform_later = (opts[:before] == :subsequent) ||
|
151
|
-
(opts[:after] == :subsequent)
|
152
|
-
final_method = "#{event}_without_callbacks" # should be private?
|
153
|
-
opts[:on] = [:create, :update] if opts[:on] == :save
|
154
|
-
|
155
|
-
Card.define_callbacks event
|
156
|
-
|
157
|
-
class_eval do
|
158
|
-
define_method final_method, &final
|
159
|
-
end
|
160
|
-
|
161
|
-
if perform_later
|
162
|
-
defer_method = "#{event}_perform_later"
|
163
|
-
define_event_perform_later_method event, defer_method
|
164
|
-
define_active_job event, final_method, opts[:queue_as]
|
165
|
-
define_event_method event, defer_method, opts
|
166
|
-
else
|
167
|
-
define_event_method event, final_method, opts
|
168
|
-
end
|
169
|
-
set_event_callbacks event, opts
|
170
|
-
end
|
171
|
-
|
172
|
-
def phase_method method, opts={}, &block
|
149
|
+
def stage_method method, opts={}, &block
|
173
150
|
class_eval do
|
174
151
|
define_method "_#{method}", &block
|
175
152
|
define_method method do |*args|
|
176
153
|
error =
|
177
|
-
if !
|
178
|
-
if !
|
154
|
+
if !director.stage_ok? opts
|
155
|
+
if !stage
|
179
156
|
"phase method #{method} called outside of event phases"
|
180
157
|
else
|
181
|
-
"#{opts.inspect} method #{method} called in phase #{
|
158
|
+
"#{opts.inspect} method #{method} called in phase #{stage}"
|
182
159
|
end
|
183
160
|
elsif !on_condition_applies?(opts[:on])
|
184
161
|
"on: #{opts[:on]} method #{method} called on #{@action}"
|
@@ -192,65 +169,6 @@ class Card
|
|
192
169
|
end
|
193
170
|
end
|
194
171
|
|
195
|
-
def define_event_perform_later_method event, method_name
|
196
|
-
class_eval do
|
197
|
-
define_method method_name, proc {
|
198
|
-
s_attr =
|
199
|
-
serializable_attributes.each_with_object({}) do |name, hash|
|
200
|
-
value = instance_variable_get("@#{name}")
|
201
|
-
hash[name] =
|
202
|
-
# ActiveJob doesn't accept symbols as arguments
|
203
|
-
if Symbol === value
|
204
|
-
{ value: value.to_s, symbol: true }
|
205
|
-
else
|
206
|
-
{ value: value }
|
207
|
-
end
|
208
|
-
end
|
209
|
-
Object.const_get(event.to_s.camelize).perform_later(self, s_attr)
|
210
|
-
}
|
211
|
-
end
|
212
|
-
end
|
213
|
-
|
214
|
-
def define_event_method event, call_method, _opts
|
215
|
-
class_eval do
|
216
|
-
define_method event do
|
217
|
-
run_callbacks event do
|
218
|
-
send call_method
|
219
|
-
end
|
220
|
-
end
|
221
|
-
end
|
222
|
-
end
|
223
|
-
|
224
|
-
# creates an Active Job.
|
225
|
-
# The scheduled job gets the card object as argument and all serializable
|
226
|
-
# attributes of the card.
|
227
|
-
# (when the job is executed ActiveJob fetches the card from the database so
|
228
|
-
# all attributes get lost)
|
229
|
-
# @param name [String] the name for the ActiveJob child class
|
230
|
-
# @param final_method [String] the name of the card instance method to be
|
231
|
-
# queued
|
232
|
-
# @option queue [Symbol] (:default) the name of the queue
|
233
|
-
def define_active_job name, final_method, queue=:default
|
234
|
-
class_name = name.to_s.camelize
|
235
|
-
eval %{
|
236
|
-
class ::#{class_name} < ActiveJob::Base
|
237
|
-
queue_as #{queue}
|
238
|
-
end
|
239
|
-
}
|
240
|
-
Object.const_get(class_name).class_eval do
|
241
|
-
define_method :perform, proc { |card, attributes|
|
242
|
-
attributes.each do |attname, args|
|
243
|
-
# symbols are not allowed so all symbols arrive here as strings
|
244
|
-
# convert strings that were symbols before back to symbols
|
245
|
-
value = args[:symbol] ? args[:value].to_sym : args[:value]
|
246
|
-
card.instance_variable_set("@#{attname}", value)
|
247
|
-
end
|
248
|
-
card.include_set_modules
|
249
|
-
card.send final_method
|
250
|
-
}
|
251
|
-
end
|
252
|
-
end
|
253
|
-
|
254
172
|
#
|
255
173
|
# ActiveCard support: accessing plus cards as attributes
|
256
174
|
#
|
@@ -270,21 +188,19 @@ class Card
|
|
270
188
|
end
|
271
189
|
|
272
190
|
def ensure_set &block
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
Module.new
|
280
|
-
end
|
191
|
+
set_module = yield
|
192
|
+
rescue NameError => e
|
193
|
+
if e.message =~ /uninitialized constant (?:Card::Set::)?(.+)$/
|
194
|
+
Regexp.last_match(1).split('::').inject(Card::Set) do |set_mod, module_name|
|
195
|
+
set_mod.const_get_or_set module_name do
|
196
|
+
Module.new
|
281
197
|
end
|
282
198
|
end
|
283
|
-
# try again - there might be another submodule that doesn't exist
|
284
|
-
ensure_set &block
|
285
|
-
else
|
286
|
-
set_module.extend Card::Set
|
287
199
|
end
|
200
|
+
# try again - there might be another submodule that doesn't exist
|
201
|
+
ensure_set &block
|
202
|
+
else
|
203
|
+
set_module.extend Card::Set
|
288
204
|
end
|
289
205
|
# the set loading process has two main phases:
|
290
206
|
|
@@ -323,7 +239,7 @@ class Card
|
|
323
239
|
# -*- encoding : utf-8 -*-
|
324
240
|
class Card; module Set; #{submodules} extend Card::Set
|
325
241
|
# ~~~~~~~~~~~ above autogenerated; below pulled from #{from_file} ~~~~~~~~~~~
|
326
|
-
#{
|
242
|
+
#{File.read from_file}
|
327
243
|
|
328
244
|
# ~~~~~~~~~~~ below autogenerated; above pulled from #{from_file} ~~~~~~~~~~~
|
329
245
|
end;end;#{'end;' * name_parts.size}
|
@@ -351,9 +267,7 @@ EOF
|
|
351
267
|
|
352
268
|
def process_base_module_list list, klass
|
353
269
|
list.each do |mod|
|
354
|
-
if mod.instance_methods.any?
|
355
|
-
klass.send :include, mod
|
356
|
-
end
|
270
|
+
klass.send :include, mod if mod.instance_methods.any?
|
357
271
|
if (class_methods = mod.const_get_if_defined(:ClassMethods))
|
358
272
|
klass.send :extend, class_methods
|
359
273
|
end
|
@@ -376,10 +290,10 @@ EOF
|
|
376
290
|
end
|
377
291
|
|
378
292
|
def register_set_format format_class, mod
|
379
|
-
return if
|
293
|
+
return if abstract_set? # noop; only used by explicit inclusion in
|
380
294
|
# other set modules
|
381
295
|
|
382
|
-
if
|
296
|
+
if all_set?
|
383
297
|
# ready to include in base format classes
|
384
298
|
modules[:base_format][format_class] ||= []
|
385
299
|
modules[:base_format][format_class] << mod
|
@@ -410,23 +324,6 @@ EOF
|
|
410
324
|
|
411
325
|
private
|
412
326
|
|
413
|
-
def set_event_callbacks event, opts
|
414
|
-
[:before, :after, :around].each do |kind|
|
415
|
-
if (object_method = opts.delete(kind))
|
416
|
-
this_set_module = self
|
417
|
-
Card.class_eval do
|
418
|
-
set_callback(
|
419
|
-
object_method, kind, event,
|
420
|
-
prepend: true, if: proc do |c|
|
421
|
-
c.singleton_class.include?(this_set_module) &&
|
422
|
-
c.event_applies?(opts)
|
423
|
-
end
|
424
|
-
)
|
425
|
-
end
|
426
|
-
end
|
427
|
-
end
|
428
|
-
end
|
429
|
-
|
430
327
|
def get_traits mod
|
431
328
|
Card::Set.traits ||= {}
|
432
329
|
Card::Set.traits[mod] || Card::Set.traits[mod] = {}
|
@@ -438,7 +335,7 @@ EOF
|
|
438
335
|
mod_traits = get_traits mod
|
439
336
|
|
440
337
|
new_opts = options[:type] ? { type: options[:type] } : {}
|
441
|
-
new_opts
|
338
|
+
new_opts[:default_content] = options[:default] if options[:default]
|
442
339
|
|
443
340
|
args.each do |trait|
|
444
341
|
define_trait_card trait, new_opts
|