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.
Files changed (389) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/card.gemspec +24 -25
  4. data/config/initializers/01_init_ruby_extensions.rb +0 -4
  5. data/config/initializers/inflections.rb +1 -1
  6. data/config/initializers/notification.rb +2 -2
  7. data/db/migrate/20110511221913_require_earlier_migrations.rb +3 -3
  8. data/db/migrate/20120105203350_require_1_8_migrations.rb +3 -3
  9. data/db/migrate/20121111025347_require_1_10_migrations.rb +3 -3
  10. data/db/migrate/20130106052640_table_cleanup.rb +4 -4
  11. data/db/migrate/20130411210957_update_codenames.rb +2 -2
  12. data/db/migrate/20141001105348_move_revisions_to_actions.rb +4 -4
  13. data/db/migrate/20141121172918_rename_card_migration_table.rb +2 -2
  14. data/db/migrate/20141208132159_remove_present_from_reference_table.rb +2 -2
  15. data/db/migrate/20141216053032_better_index_names.rb +9 -9
  16. data/db/migrate_core_cards/20120611203506_rails_inflection_updates.rb +29 -32
  17. data/db/migrate_core_cards/20130411191151_renaming_for_menu.rb +3 -4
  18. data/db/migrate_core_cards/20130411211600_delete_old_related_tab_cards.rb +1 -1
  19. data/db/migrate_core_cards/20130419215612_import_help_text.rb +1 -2
  20. data/db/migrate_core_cards/20130823192433_add_style_cards.rb +3 -3
  21. data/db/migrate_core_cards/20130910183318_move_styles_to_content.rb +2 -3
  22. data/db/migrate_core_cards/20130920214038_jsonize_tinymce.rb +2 -2
  23. data/db/migrate_core_cards/20130920291703_update_stylesheets.rb +1 -2
  24. data/db/migrate_core_cards/20130927191728_account_events.rb +5 -6
  25. data/db/migrate_core_cards/20131016172445_common_css_patch.rb +2 -3
  26. data/db/migrate_core_cards/20140110193325_reset_account_request_type.rb +0 -1
  27. data/db/migrate_core_cards/20140307231621_user_data_to_cards.rb +23 -32
  28. data/db/migrate_core_cards/20140317035504_account_requests_to_signups.rb +1 -7
  29. data/db/migrate_core_cards/20140512155840_add_script_cards.rb +21 -24
  30. data/db/migrate_core_cards/20140629222005_add_email_cards.rb +17 -22
  31. data/db/migrate_core_cards/20140725180118_config_card_updates.rb +2 -2
  32. data/db/migrate_core_cards/20141111083921_delete_machine_output.rb +1 -3
  33. data/db/migrate_core_cards/20141115034214_config_descriptions_etc.rb +2 -2
  34. data/db/migrate_core_cards/20141119001955_make_symlinks_relative.rb +3 -3
  35. data/db/migrate_core_cards/20141120120605_fix_notification_html_message.rb +1 -1
  36. data/db/migrate_core_cards/20141204061304_watchers_to_following.rb +8 -12
  37. data/db/migrate_core_cards/20141208162106_add_ace_script.rb +2 -3
  38. data/db/migrate_core_cards/20141216155251_add_more_following_cards.rb +10 -10
  39. data/db/migrate_core_cards/20150202143810_import_bootstrap_layout.rb +10 -12
  40. data/db/migrate_core_cards/20150220134731_following_to_follow_rule.rb +4 -4
  41. data/db/migrate_core_cards/20150317162412_bootstrap_themes.rb +3 -3
  42. data/db/migrate_core_cards/20150326205655_bootswatch_themes.rb +7 -7
  43. data/db/migrate_core_cards/20150429090551_search_card_context.rb +18 -20
  44. data/db/migrate_core_cards/20150508212032_menu_compatibility.rb +3 -7
  45. data/db/migrate_core_cards/20150510031118_fix_skin_images.rb +2 -3
  46. data/db/migrate_core_cards/20150528084659_add_session_cardtype.rb +3 -3
  47. data/db/migrate_core_cards/20150601133433_add_recent_setting_session_card.rb +4 -4
  48. data/db/migrate_core_cards/20150610171702_add_debugger_session_card.rb +4 -4
  49. data/db/migrate_core_cards/20150610180019_add_recaptcha_key_and_admin_info_cards.rb +5 -11
  50. data/db/migrate_core_cards/20150724123438_update_file_and_image_cards.rb +29 -35
  51. data/db/migrate_core_cards/20150824135418_update_file_history.rb +10 -14
  52. data/db/migrate_core_cards/20150903130006_attachment_upload_cards.rb +1 -1
  53. data/db/schema.rb +92 -94
  54. data/db/seed/new/card_actions.yml +461 -469
  55. data/db/seed/new/card_acts.yml +154 -172
  56. data/db/seed/new/card_changes.yml +4076 -4031
  57. data/db/seed/new/card_references.yml +1584 -1927
  58. data/db/seed/new/cards.yml +2095 -2112
  59. data/db/seed/test/fixtures/card_actions.yml +1497 -1505
  60. data/db/seed/test/fixtures/card_acts.yml +454 -472
  61. data/db/seed/test/fixtures/card_changes.yml +7309 -7263
  62. data/db/seed/test/fixtures/card_references.yml +2263 -2613
  63. data/db/seed/test/fixtures/cards.yml +3298 -3316
  64. data/db/seed/test/seed.rb +3 -0
  65. data/lib/card.rb +17 -9
  66. data/lib/card/active_record_ext.rb +6 -8
  67. data/lib/card/active_record_helper.rb +42 -32
  68. data/lib/card/auth.rb +3 -3
  69. data/lib/card/cache.rb +4 -4
  70. data/lib/card/cache/persistent.rb +9 -5
  71. data/lib/card/cache/temporary.rb +5 -5
  72. data/lib/card/chunk.rb +1 -1
  73. data/lib/card/codename.rb +3 -2
  74. data/lib/card/content.rb +62 -57
  75. data/lib/card/core_ext.rb +20 -30
  76. data/lib/card/diff.rb +88 -76
  77. data/lib/card/director_register.rb +66 -0
  78. data/lib/card/env.rb +14 -17
  79. data/lib/card/exceptions.rb +7 -9
  80. data/lib/card/format.rb +18 -367
  81. data/lib/card/format/nest.rb +183 -0
  82. data/lib/card/format/permission.rb +63 -0
  83. data/lib/card/format/render.rb +140 -0
  84. data/lib/card/loader.rb +17 -26
  85. data/lib/card/location.rb +6 -6
  86. data/lib/card/mailer.rb +4 -7
  87. data/lib/card/migration.rb +1 -1
  88. data/lib/card/name.rb +3 -6
  89. data/lib/card/query.rb +8 -8
  90. data/lib/card/query/attributes.rb +6 -6
  91. data/lib/card/query/clause.rb +10 -10
  92. data/lib/card/query/join.rb +7 -9
  93. data/lib/card/query/reference.rb +17 -19
  94. data/lib/card/query/sql_statement.rb +2 -2
  95. data/lib/card/query/value.rb +15 -16
  96. data/lib/card/set.rb +106 -209
  97. data/lib/card/set/event.rb +126 -0
  98. data/lib/card/set_pattern.rb +42 -29
  99. data/lib/card/simplecov_helper.rb +19 -19
  100. data/lib/card/spec_helper.rb +40 -16
  101. data/lib/card/stage.rb +72 -0
  102. data/lib/card/stage_director.rb +231 -0
  103. data/lib/card/subcards.rb +56 -24
  104. data/lib/card/subdirector_array.rb +31 -0
  105. data/lib/card/success.rb +15 -18
  106. data/lib/card/version.rb +1 -2
  107. data/lib/card/view_cache.rb +4 -4
  108. data/lib/card/view_name.rb +10 -8
  109. data/lib/cardio.rb +1 -1
  110. data/lib/generators/card.rb +2 -4
  111. data/lib/generators/card/format/format_generator.rb +4 -4
  112. data/lib/generators/card/migration/migration_generator.rb +6 -6
  113. data/lib/generators/card/set/set_generator.rb +5 -6
  114. data/mod/01_core/chunk/include.rb +2 -1
  115. data/mod/01_core/chunk/link.rb +2 -2
  116. data/mod/01_core/chunk/literal.rb +6 -9
  117. data/mod/01_core/chunk/query_reference.rb +1 -1
  118. data/mod/01_core/chunk/reference.rb +2 -2
  119. data/mod/01_core/chunk/uri.rb +52 -63
  120. data/mod/01_core/format/html_format.rb +8 -12
  121. data/mod/01_core/format/text_format.rb +1 -1
  122. data/mod/01_core/set/all/actify.rb +96 -0
  123. data/mod/01_core/set/all/active_card.rb +7 -7
  124. data/mod/01_core/set/all/collection.rb +19 -20
  125. data/mod/01_core/set/all/content.rb +9 -7
  126. data/mod/01_core/set/all/erb.rb +5 -5
  127. data/mod/01_core/set/all/event.rb +60 -0
  128. data/mod/01_core/set/all/fetch.rb +13 -19
  129. data/mod/01_core/set/all/haml.rb +1 -1
  130. data/mod/01_core/set/all/initialize.rb +35 -41
  131. data/mod/01_core/set/all/location_history.rb +3 -5
  132. data/mod/01_core/set/all/name.rb +19 -68
  133. data/mod/01_core/set/all/name_validations.rb +56 -0
  134. data/mod/01_core/set/all/pattern.rb +2 -2
  135. data/mod/01_core/set/all/permissions.rb +14 -20
  136. data/mod/01_core/set/all/phases.rb +9 -200
  137. data/mod/01_core/set/all/references.rb +10 -10
  138. data/mod/01_core/set/all/rules.rb +3 -4
  139. data/mod/01_core/set/all/stages.rb +24 -0
  140. data/mod/01_core/set/all/states.rb +4 -4
  141. data/mod/01_core/set/all/subcards.rb +16 -26
  142. data/mod/01_core/set/all/templating.rb +1 -3
  143. data/mod/01_core/set/all/tracked_attributes.rb +47 -48
  144. data/mod/01_core/set/all/trash.rb +10 -10
  145. data/mod/01_core/set/all/type.rb +9 -8
  146. data/mod/01_core/set/all/utils.rb +10 -14
  147. data/mod/01_core/set/all/view_cache.rb +2 -2
  148. data/mod/01_core/set_pattern/01_all.rb +3 -3
  149. data/mod/01_core/set_pattern/02_all_plus.rb +3 -3
  150. data/mod/01_core/set_pattern/03_type.rb +2 -2
  151. data/mod/01_core/set_pattern/04_star.rb +3 -3
  152. data/mod/01_core/set_pattern/05_rstar.rb +3 -3
  153. data/mod/01_core/set_pattern/06_right.rb +2 -2
  154. data/mod/01_core/set_pattern/07_type_plus_right.rb +2 -2
  155. data/mod/01_core/set_pattern/08_self.rb +1 -1
  156. data/mod/01_core/spec/chunk/literal_spec.rb +7 -8
  157. data/mod/01_core/spec/chunk/uri_spec.rb +140 -142
  158. data/mod/01_core/spec/format/html_format_spec.rb +72 -57
  159. data/mod/01_core/spec/set/all/collection_spec.rb +63 -43
  160. data/mod/01_core/spec/set/all/content_spec.rb +4 -4
  161. data/mod/01_core/spec/set/all/fetch_spec.rb +12 -3
  162. data/mod/01_core/spec/set/all/name_spec.rb +3 -4
  163. data/mod/01_core/spec/set/all/pattern_spec.rb +32 -35
  164. data/mod/01_core/spec/set/all/permissions_spec.rb +17 -5
  165. data/mod/01_core/spec/set/all/phases_spec.rb +0 -1
  166. data/mod/01_core/spec/set/all/references_spec.rb +1 -1
  167. data/mod/01_core/spec/set/all/rules2_spec.rb +79 -91
  168. data/mod/01_core/spec/set/all/rules_spec.rb +63 -56
  169. data/mod/01_core/spec/set/all/templating_spec.rb +0 -1
  170. data/mod/01_core/spec/set/all/tracked_attributes_spec.rb +4 -5
  171. data/mod/01_core/spec/set/all/trash_spec.rb +23 -1
  172. data/mod/01_core/spec/set/all/type_spec.rb +2 -5
  173. data/mod/01_history/lib/card/action.rb +8 -10
  174. data/mod/01_history/set/all/actions.rb +2 -4
  175. data/mod/01_history/set/all/content_history.rb +38 -32
  176. data/mod/01_history/set/all/history.rb +20 -17
  177. data/mod/02_basic_types/format/rss_format.rb +0 -1
  178. data/mod/02_basic_types/set/all/all_css.rb +9 -13
  179. data/mod/02_basic_types/set/all/all_csv.rb +14 -17
  180. data/mod/02_basic_types/set/all/all_js.rb +3 -4
  181. data/mod/02_basic_types/set/all/base.rb +2 -2
  182. data/mod/02_basic_types/set/all/file.rb +2 -5
  183. data/mod/02_basic_types/set/all/json.rb +19 -18
  184. data/mod/02_basic_types/set/all/rss.rb +3 -3
  185. data/mod/02_basic_types/set/all/text.rb +1 -3
  186. data/mod/02_basic_types/set/type/html.rb +4 -8
  187. data/mod/02_basic_types/set/type/plain_text.rb +2 -3
  188. data/mod/02_basic_types/set/type/pointer.rb +82 -92
  189. data/mod/02_basic_types/spec/set/all/all_css_spec.rb +2 -2
  190. data/mod/02_basic_types/spec/set/all/all_csv_spec.rb +6 -4
  191. data/mod/02_basic_types/spec/set/all/base_spec.rb +6 -6
  192. data/mod/02_basic_types/spec/set/all/json_spec.rb +8 -8
  193. data/mod/02_basic_types/spec/set/type/plain_text_spec.rb +3 -3
  194. data/mod/02_basic_types/spec/set/type/pointer_spec.rb +29 -32
  195. data/mod/03_machines/lib/card/machine.rb +95 -81
  196. data/mod/03_machines/lib/card/machine_input.rb +35 -34
  197. data/mod/03_machines/set/right/machine_input.rb +1 -1
  198. data/mod/03_machines/set/self/script_ace.rb +2 -3
  199. data/mod/03_machines/set/self/script_card_menu.rb +2 -3
  200. data/mod/03_machines/set/self/script_jquery_helper.rb +2 -2
  201. data/mod/03_machines/set/self/script_slot.rb +2 -2
  202. data/mod/03_machines/set/self/style_bootstrap_compatible.rb +1 -1
  203. data/mod/03_machines/set/self/style_cards.rb +1 -1
  204. data/mod/03_machines/set/self/style_jquery_ui_smoothness.rb +0 -1
  205. data/mod/03_machines/set/type/coffee_script.rb +9 -13
  206. data/mod/03_machines/set/type/css.rb +12 -13
  207. data/mod/03_machines/set/type/java_script.rb +6 -8
  208. data/mod/03_machines/set/type/scss.rb +4 -5
  209. data/mod/03_machines/set/type/skin.rb +3 -6
  210. data/mod/03_machines/spec/lib/shared_machine_examples.rb +31 -38
  211. data/mod/03_machines/spec/lib/shared_machine_input_examples.rb +7 -8
  212. data/mod/03_machines/spec/set/type/coffeescript_spec.rb +19 -13
  213. data/mod/03_machines/spec/set/type/css_spec.rb +22 -16
  214. data/mod/03_machines/spec/set/type/scss_spec.rb +28 -21
  215. data/mod/03_machines/spec/set/type/skin_spec.rb +28 -30
  216. data/mod/04_settings/lib/card/setting.rb +4 -4
  217. data/mod/04_settings/set/abstract/permission.rb +30 -37
  218. data/mod/04_settings/set/right/add_help.rb +3 -3
  219. data/mod/04_settings/set/right/script.rb +4 -5
  220. data/mod/04_settings/set/right/structure.rb +3 -4
  221. data/mod/04_settings/set/right/style.rb +3 -3
  222. data/mod/04_settings/set/self/add_help.rb +1 -1
  223. data/mod/04_settings/set/self/input.rb +1 -1
  224. data/mod/04_settings/set/self/on_create.rb +1 -1
  225. data/mod/04_settings/set/self/options.rb +1 -1
  226. data/mod/04_settings/set/self/options_label.rb +1 -1
  227. data/mod/04_settings/set/type/setting.rb +29 -44
  228. data/mod/04_settings/spec/set/right/comment_spec.rb +9 -12
  229. data/mod/04_settings/spec/set/right/script_spec.rb +7 -7
  230. data/mod/04_settings/spec/set/right/structure_spec.rb +13 -12
  231. data/mod/04_settings/spec/set/right/style_spec.rb +13 -13
  232. data/mod/04_settings/spec/set/type/setting_spec.rb +1 -1
  233. data/mod/05_email/format/email_html_format.rb +1 -1
  234. data/mod/05_email/format/email_text_format.rb +2 -2
  235. data/mod/05_email/lib/card/follow_option.rb +12 -15
  236. data/mod/05_email/set/all/email_html.rb +2 -3
  237. data/mod/05_email/set/all/email_text.rb +3 -3
  238. data/mod/05_email/set/all/follow.rb +14 -22
  239. data/mod/05_email/set/all/notify.rb +11 -11
  240. data/mod/05_email/set/all/observer.rb +7 -8
  241. data/mod/05_email/set/right/bcc.rb +4 -9
  242. data/mod/05_email/set/right/follow.rb +26 -39
  243. data/mod/05_email/set/right/follow_fields.rb +2 -2
  244. data/mod/05_email/set/right/followers.rb +3 -1
  245. data/mod/05_email/set/right/following.rb +13 -16
  246. data/mod/05_email/set/self/always.rb +1 -2
  247. data/mod/05_email/set/self/created.rb +4 -6
  248. data/mod/05_email/set/self/edited.rb +3 -7
  249. data/mod/05_email/set/self/follow_defaults.rb +11 -12
  250. data/mod/05_email/set/self/never.rb +2 -4
  251. data/mod/05_email/set/type/email_template.rb +40 -27
  252. data/mod/05_email/set/type_plus_right/user/follow.rb +159 -157
  253. data/mod/05_email/spec/set/all/follow_spec.rb +28 -37
  254. data/mod/05_email/spec/set/all/notify_spec.rb +21 -26
  255. data/mod/05_email/spec/set/all/observer_spec.rb +58 -37
  256. data/mod/05_email/spec/set/right/followers_spec.rb +9 -14
  257. data/mod/05_email/spec/set/right/following_spec.rb +1 -1
  258. data/mod/05_email/spec/set/self/follow_defaults_spec.rb +1 -1
  259. data/mod/05_standard/lib/carrier_wave/cardmount.rb +9 -9
  260. data/mod/05_standard/lib/file_uploader.rb +8 -13
  261. data/mod/05_standard/lib/image_uploader.rb +8 -9
  262. data/mod/05_standard/set/abstract/attachment.rb +26 -43
  263. data/mod/05_standard/set/all/account.rb +2 -2
  264. data/mod/05_standard/set/all/comment.rb +11 -13
  265. data/mod/05_standard/set/all/error.rb +18 -18
  266. data/mod/05_standard/set/all/event_viz.rb +16 -29
  267. data/mod/05_standard/set/all/links.rb +35 -34
  268. data/mod/05_standard/set/all/list_changes.rb +10 -12
  269. data/mod/05_standard/set/all/rich_html/content.rb +13 -13
  270. data/mod/05_standard/set/all/rich_html/editing.rb +5 -5
  271. data/mod/05_standard/set/all/rich_html/form.rb +22 -26
  272. data/mod/05_standard/set/all/rich_html/header.rb +18 -25
  273. data/mod/05_standard/set/all/rich_html/menu.rb +20 -22
  274. data/mod/05_standard/set/all/rich_html/modal.rb +3 -3
  275. data/mod/05_standard/set/all/rich_html/toolbar.rb +49 -58
  276. data/mod/05_standard/set/all/rich_html/wrapper.rb +40 -41
  277. data/mod/05_standard/set/right/account.rb +26 -14
  278. data/mod/05_standard/set/right/email.rb +2 -2
  279. data/mod/05_standard/set/right/password.rb +6 -5
  280. data/mod/05_standard/set/right/salt.rb +2 -2
  281. data/mod/05_standard/set/right/stats.rb +17 -20
  282. data/mod/05_standard/set/right/token.rb +1 -1
  283. data/mod/05_standard/set/right/when_created.rb +1 -1
  284. data/mod/05_standard/set/right/when_last_edited.rb +1 -1
  285. data/mod/05_standard/set/rstar/rules.rb +3 -3
  286. data/mod/05_standard/set/rstar/rules_editor.rb +39 -39
  287. data/mod/05_standard/set/self/account_links.rb +21 -22
  288. data/mod/05_standard/set/self/admin_info.rb +5 -5
  289. data/mod/05_standard/set/self/alerts.rb +1 -1
  290. data/mod/05_standard/set/self/all.rb +1 -1
  291. data/mod/05_standard/set/self/foot.rb +1 -1
  292. data/mod/05_standard/set/self/head.rb +19 -22
  293. data/mod/05_standard/set/self/navbox.rb +3 -7
  294. data/mod/05_standard/set/self/now.rb +1 -1
  295. data/mod/05_standard/set/self/recent.rb +19 -25
  296. data/mod/05_standard/set/self/search.rb +2 -4
  297. data/mod/05_standard/set/self/signin.rb +6 -6
  298. data/mod/05_standard/set/self/stats.rb +31 -38
  299. data/mod/05_standard/set/self/version.rb +1 -2
  300. data/mod/05_standard/set/type/basic.rb +15 -17
  301. data/mod/05_standard/set/type/cardtype.rb +3 -3
  302. data/mod/05_standard/set/type/date.rb +1 -2
  303. data/mod/05_standard/set/type/file.rb +22 -33
  304. data/mod/05_standard/set/type/image.rb +30 -23
  305. data/mod/05_standard/set/type/layout_type.rb +4 -4
  306. data/mod/05_standard/set/type/list.rb +32 -38
  307. data/mod/05_standard/set/type/listed_by.rb +11 -13
  308. data/mod/05_standard/set/type/number.rb +5 -6
  309. data/mod/05_standard/set/type/phrase.rb +1 -1
  310. data/mod/05_standard/set/type/search_type.rb +25 -23
  311. data/mod/05_standard/set/type/session.rb +2 -3
  312. data/mod/05_standard/set/type/set.rb +46 -51
  313. data/mod/05_standard/set/type/signup.rb +18 -19
  314. data/mod/05_standard/set/type/toggle.rb +5 -5
  315. data/mod/05_standard/set/type/user.rb +6 -6
  316. data/mod/05_standard/spec/chunk/include_spec.rb +115 -98
  317. data/mod/05_standard/spec/chunk/link_spec.rb +58 -31
  318. data/mod/05_standard/spec/chunk/query_reference_spec.rb +12 -14
  319. data/mod/05_standard/spec/set/all/email_html_spec.rb +3 -3
  320. data/mod/05_standard/spec/set/all/error_spec.rb +3 -3
  321. data/mod/05_standard/spec/set/all/history_spec.rb +52 -38
  322. data/mod/05_standard/spec/set/all/links_spec.rb +2 -2
  323. data/mod/05_standard/spec/set/all/rich_html/editing_spec.rb +0 -1
  324. data/mod/05_standard/spec/set/all/rich_html/form_spec.rb +11 -11
  325. data/mod/05_standard/spec/set/all/rich_html/wrapper_spec.rb +4 -4
  326. data/mod/05_standard/spec/set/right/email_spec.rb +1 -4
  327. data/mod/05_standard/spec/set/right/password_spec.rb +4 -7
  328. data/mod/05_standard/spec/set/right/stats_spec.rb +2 -3
  329. data/mod/05_standard/spec/set/right/when_created_spec.rb +1 -1
  330. data/mod/05_standard/spec/set/right/when_last_edited_spec.rb +1 -1
  331. data/mod/05_standard/spec/set/rstar/rules_spec.rb +6 -6
  332. data/mod/05_standard/spec/set/self/all_spec.rb +11 -13
  333. data/mod/05_standard/spec/set/self/head_spec.rb +1 -3
  334. data/mod/05_standard/spec/set/self/navbox_spec.rb +1 -1
  335. data/mod/05_standard/spec/set/self/now_spec.rb +2 -2
  336. data/mod/05_standard/spec/set/self/signin_spec.rb +1 -1
  337. data/mod/05_standard/spec/set/self/stats_spec.rb +1 -1
  338. data/mod/05_standard/spec/set/self/version_spec.rb +2 -2
  339. data/mod/05_standard/spec/set/type/cardtype_spec.rb +3 -4
  340. data/mod/05_standard/spec/set/type/date_spec.rb +1 -1
  341. data/mod/05_standard/spec/set/type/email_template_spec.rb +5 -5
  342. data/mod/05_standard/spec/set/type/file_spec.rb +50 -28
  343. data/mod/05_standard/spec/set/type/html_spec.rb +12 -7
  344. data/mod/05_standard/spec/set/type/image_spec.rb +55 -45
  345. data/mod/05_standard/spec/set/type/layout_type_spec.rb +2 -2
  346. data/mod/05_standard/spec/set/type/listed_by_spec.rb +2 -2
  347. data/mod/05_standard/spec/set/type/number_spec.rb +1 -1
  348. data/mod/05_standard/spec/set/type/phrase_spec.rb +1 -1
  349. data/mod/05_standard/spec/set/type/search_type_spec.rb +15 -16
  350. data/mod/05_standard/spec/set/type/set_spec.rb +16 -17
  351. data/mod/05_standard/spec/set/type/signup_spec.rb +7 -5
  352. data/mod/05_standard/spec/set/type/toggle_spec.rb +4 -4
  353. data/mod/05_standard/spec/set/type/uri_spec.rb +11 -11
  354. data/mod/05_standard/spec/set/type/user_spec.rb +0 -1
  355. data/mod/06_bootstrap/set/all/bootstrap/form.rb +9 -10
  356. data/mod/06_bootstrap/set/all/bootstrap/helper.rb +22 -27
  357. data/mod/06_bootstrap/set/all/bootstrap/wrapper.rb +1 -2
  358. data/mod/06_bootstrap/set/all/rich_bootstrap.rb +1 -3
  359. data/mod/06_bootstrap/set/self/bootstrap_cards.rb +2 -2
  360. data/mod/06_bootstrap/set/self/bootstrap_js.rb +2 -2
  361. data/mod/06_bootstrap/set/self/bootswatch_shared.rb +19 -19
  362. data/mod/06_bootstrap/set/self/smartmenu_css.rb +2 -2
  363. data/mod/06_bootstrap/set/self/smartmenu_js.rb +3 -3
  364. data/mod/06_bootstrap/spec/set/all/bootstrap/form_spec.rb +5 -5
  365. data/spec/lib/card/action_spec.rb +4 -4
  366. data/spec/lib/card/cache_spec.rb +3 -5
  367. data/spec/lib/card/chunk_spec.rb +6 -8
  368. data/spec/lib/card/codename_spec.rb +4 -6
  369. data/spec/lib/card/content_spec.rb +12 -17
  370. data/spec/lib/card/diff_spec.rb +59 -61
  371. data/spec/lib/card/format_spec.rb +55 -34
  372. data/spec/lib/card/loader_spec.rb +35 -37
  373. data/spec/lib/card/name_spec.rb +159 -145
  374. data/spec/lib/card/query_spec.rb +4 -4
  375. data/spec/lib/card/reference_spec.rb +24 -24
  376. data/spec/lib/card/set_pattern_spec.rb +3 -3
  377. data/spec/lib/card/stage_director_spec.rb +218 -0
  378. data/spec/lib/card/subcards_spec.rb +12 -16
  379. data/spec/lib/card/success_spec.rb +16 -18
  380. data/spec/lib/card/view_cache_spec.rb +1 -1
  381. data/spec/mailers/mailer_spec.rb +3 -5
  382. data/spec/models/card/cardtype_spec.rb +40 -51
  383. data/spec/models/card/create_spec.rb +58 -39
  384. data/spec/models/card/trash_spec.rb +23 -32
  385. data/spec/models/card/type_transition_spec.rb +41 -32
  386. data/spec/models/card/validation_spec.rb +13 -15
  387. data/spec/models/card_spec.rb +48 -59
  388. data/spec/spec_helper.rb +26 -31
  389. metadata +16 -2
@@ -16,10 +16,8 @@ format :html do
16
16
  end
17
17
 
18
18
  def invite_args args
19
- args.merge!(
20
- title: 'Invite',
21
- buttons: button_tag('Send Invitation', situation: 'primary'),
22
- )
19
+ args[:title] = 'Invite'
20
+ args[:buttons] = button_tag('Send Invitation', situation: 'primary')
23
21
  args[:hidden][:success] = '_self'
24
22
  end
25
23
 
@@ -49,8 +47,8 @@ format :html do
49
47
  headings = []
50
48
  by_anon = card.creator_id == AnonymousID
51
49
  headings << %(
52
- <strong>#{ card.name }</strong> #{ 'was' if !by_anon } signed up on
53
- #{ format_date card.created_at }
50
+ <strong>#{card.name}</strong> #{'was' unless by_anon} signed up on
51
+ #{format_date card.created_at}
54
52
  )
55
53
  if (account = card.account)
56
54
  headings += verification_info account
@@ -59,9 +57,9 @@ format :html do
59
57
  end
60
58
  <<-HTML
61
59
  <div class="invite-links">
62
- #{ headings.map { |h| "<div>#{h}</div>" }.join "\n" }
60
+ #{headings.map { |h| "<div>#{h}</div>" }.join "\n"}
63
61
  </div>
64
- #{ process_content render_raw }
62
+ #{process_content render_raw}
65
63
  HTML
66
64
  end
67
65
 
@@ -70,7 +68,7 @@ format :html do
70
68
  token_action = 'Send'
71
69
  if account.token.present?
72
70
  headings << 'A verification email has been sent ' \
73
- "#{ "to #{account.email}" if account.email_card.ok? :read }"
71
+ "#{"to #{account.email}" if account.email_card.ok? :read}"
74
72
  token_action = 'Resend'
75
73
  end
76
74
  links = verification_links account, token_action
@@ -97,11 +95,11 @@ format :html do
97
95
  end
98
96
  end
99
97
 
100
- event :activate_by_token, before: :approve, on: :update,
101
- when: proc { |c| c.has_token? } do
98
+ event :activate_by_token, :validate, on: :update,
99
+ when: proc { |c| c.has_token? } do
102
100
  abort :failure, 'no field manipulation mid-activation' if subcards.present?
103
101
  # necessary because this performs actions as Wagn Bot
104
- abort :failure, "no account associated with #{name}" if !account
102
+ abort :failure, "no account associated with #{name}" unless account
105
103
 
106
104
  account.validate_token! @env_token
107
105
 
@@ -129,16 +127,16 @@ event :activate_account do
129
127
  account.send_welcome_email
130
128
  end
131
129
 
132
- event :approve_with_token,
133
- on: :update, before: :approve,
130
+ event :approve_with_token, :validate,
131
+ on: :update,
134
132
  when: proc { Env.params[:approve_with_token] } do
135
133
  abort :failure, 'illegal approval' unless account.confirm_ok?
136
134
  account.reset_token
137
135
  account.send_account_verification_email
138
136
  end
139
137
 
140
- event :approve_without_token,
141
- on: :update, before: :approve,
138
+ event :approve_without_token, :validate,
139
+ on: :update,
142
140
  when: proc { Env.params[:approve_without_token] } do
143
141
  abort :failure, 'illegal approval' unless account.confirm_ok?
144
142
  activate_account
@@ -158,12 +156,13 @@ def signed_in_as_me_without_password?
158
156
  Auth.signed_in? && Auth.current_id == id && account.password.blank?
159
157
  end
160
158
 
161
- event :redirect_to_edit_password,
162
- on: :update, after: :store,
159
+ event :redirect_to_edit_password, :finalize,
160
+ on: :update,
163
161
  when: proc { |c| c.signed_in_as_me_without_password? } do
164
162
  Env.params[:success] = account.edit_password_success_args
165
163
  end
166
164
 
167
- event :act_as_current_for_extend_phase, before: :extend, on: :create do
165
+ event :act_as_current_for_integrate_stage, :integrate,
166
+ on: :create do
168
167
  Auth.current_id = id
169
168
  end
@@ -1,12 +1,12 @@
1
1
 
2
- view :core do |args|
2
+ view :core do |_args|
3
3
  case card.raw_content.to_i
4
- when 1; 'yes'
5
- when 0; 'no'
6
- else ; '?'
4
+ when 1 then 'yes'
5
+ when 0 then 'no'
6
+ else; '?'
7
7
  end
8
8
  end
9
9
 
10
- view :editor do |args|
10
+ view :editor do |_args|
11
11
  check_box :content
12
12
  end
@@ -5,7 +5,7 @@ attr_accessor :email
5
5
 
6
6
  format :html do
7
7
  view :setup, tags: :unknown_ok,
8
- perms: lambda { |_r| Auth.needs_setup? } do |args|
8
+ perms: ->(_r) { Auth.needs_setup? } do |args|
9
9
  account = card.fetch trait: :account, new: {}
10
10
  Auth.as_bot do
11
11
  frame_and_form :create, args do
@@ -26,7 +26,7 @@ format :html do
26
26
  help_text: help_text,
27
27
  buttons: setup_button,
28
28
  hidden: {
29
- success: "REDIRECT: #{ Card.path_setting '/' }",
29
+ success: "REDIRECT: #{Card.path_setting '/'}",
30
30
  'card[type_id]' => Card.default_accounted_type_id,
31
31
  'setup' => true
32
32
  }
@@ -58,14 +58,14 @@ event :setup_as_bot, before: :check_permissions, on: :create,
58
58
  # flexibility and security when configuring initial setups
59
59
  end
60
60
 
61
- event :setup_first_user, before: :process_subcards, on: :create,
62
- when: proc { Card::Env.params[:setup] } do
61
+ event :setup_first_user, :prepare_to_store, on: :create,
62
+ when: proc { Card::Env.params[:setup] } do
63
63
  add_subcard 'signup alert email+*to', content: name
64
64
  add_subfield :roles, content: Card[:administrator].name
65
65
  end
66
66
 
67
- event :signin_after_setup, before: :extend, on: :create,
68
- when: proc { Card::Env.params[:setup] } do
67
+ event :signin_after_setup, :integrate, on: :create,
68
+ when: proc { Card::Env.params[:setup] } do
69
69
  Auth.signin id
70
70
  end
71
71
 
@@ -1,186 +1,203 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
 
3
- describe Card::Chunk::Include, "Inclusion" do
4
-
5
- context "syntax parsing" do
3
+ describe Card::Chunk::Include, 'Inclusion' do
4
+ context 'syntax parsing' do
6
5
  before do
7
- @class= Card::Chunk::Include
6
+ @class = Card::Chunk::Include
8
7
  end
9
8
 
10
- it "ignores invisible comments" do
11
- expect(render_content("{{## now you see nothing}}")).to eq('')
9
+ let :instance do
10
+ @class.new(@class.full_match(@chunk), nil)
11
+ end
12
+ let(:options) { instance.options }
13
+ let(:name) { instance.name }
14
+ it 'ignores invisible comments' do
15
+ expect(render_content('{{## now you see nothing}}')).to eq('')
12
16
  end
13
17
 
14
- it "handles visible comments" do
15
- expect(render_content("{{# now you see me}}")).to eq('<!-- # now you see me -->')
16
- expect(render_content("{{# -->}}")).to eq('<!-- # --&gt; -->')
18
+ it 'handles visible comments' do
19
+ expect(render_content('{{# now you see me}}'))
20
+ .to eq('<!-- # now you see me -->')
21
+ expect(render_content('{{# -->}}')).to eq('<!-- # --&gt; -->')
17
22
  end
18
23
 
19
- it "handles empty inclusions" do
20
- instance = @class.new( @class.full_match( '{{ }}' ) , nil )
21
- expect(instance.name).to eq('')
22
- expect(instance.options[:inc_syntax]).to eq(' ')
23
- instance1 = @class.new( @class.full_match( '{{|}}' ) , nil )
24
- expect(instance1.name).to eq('')
25
- expect(instance1.options[:inc_syntax]).to eq('|')
24
+ it 'handles empty nests' do
25
+ @chunk = '{{ }}'
26
+ expect(name).to eq('')
27
+ expect(options[:inc_syntax]).to eq(' ')
28
+ end
26
29
 
30
+ it 'handles empty nests with pipe' do
31
+ @chunk = '{{|}}'
32
+ expect(name).to eq('')
33
+ expect(options[:inc_syntax]).to eq('|')
27
34
  end
28
35
 
29
- it "handles no pipes" do
30
- instance = @class.new( @class.full_match( '{{toy}}') , nil )
31
- expect(instance.name).to eq('toy')
32
- expect(instance.options[:inc_name]).to eq('toy')
33
- expect(instance.options.key?(:view)).to eq(false)
36
+ it 'handles no pipes' do
37
+ @chunk = '{{toy}}'
38
+ expect(name).to eq('toy')
39
+ expect(options[:inc_name]).to eq('toy')
40
+ expect(options.key?(:view)).to eq(false)
34
41
  end
35
42
 
36
- it "strips the name" do
37
- expect(@class.new( @class.full_match( '{{ toy }}') , nil ).name).to eq('toy')
43
+ it 'strips the name' do
44
+ @chunk = '{{ toy }}'
45
+ expect(name).to eq('toy')
38
46
  end
39
47
 
40
48
  it 'strips html tags' do
41
- expect(@class.new( @class.full_match( '{{ <span>toy</span> }}') , nil ).name).to eq('toy')
42
- instance = @class.new( @class.full_match( '{{ <span>toy|open</span> }}') , nil )
43
- expect(instance.name).to eq('toy')
44
- expect(instance.options[:view]).to eq('open')
49
+ @chunk = '{{ <span>toy</span> }}'
50
+ expect(name).to eq('toy')
51
+ end
52
+
53
+ it 'strips html tags with pipe' do
54
+ @chunk = '{{ <span>toy|open</span> }}'
55
+ expect(name).to eq('toy')
56
+ expect(options[:view]).to eq('open')
45
57
  end
46
58
 
47
- it "handles single pipe" do
48
- options = @class.new( @class.full_match('{{toy|view:link;hide:me}}'), nil ).options
59
+ it 'handles single pipe' do
60
+ @chunk = '{{toy|view:link;hide:me}}'
49
61
  expect(options[:inc_name]).to eq('toy')
50
62
  expect(options[:view]).to eq('link')
51
63
  expect(options[:hide]).to eq('me')
52
64
  expect(options.key?(:items)).to eq(false)
53
65
  end
54
66
 
55
- it "handles multiple pipes" do
56
- options = @class.new( @class.full_match('{{box|open|closed}}'), nil ).options
67
+ it 'handles multiple pipes' do
68
+ @chunk = '{{box|open|closed}}'
57
69
  expect(options[:inc_name]).to eq('box')
58
70
  expect(options[:view]).to eq('open')
59
71
  expect(options[:items][:view]).to eq('closed')
60
72
  expect(options[:items].key?(:items)).to eq(false)
61
73
  end
62
74
 
63
- it "handles multiple pipes with blank lists" do
64
- options = @class.new( @class.full_match('{{box||closed}}'), nil ).options
75
+ it 'handles multiple pipes with blank lists' do
76
+ @chunk = '{{box||closed}}'
65
77
  expect(options[:inc_name]).to eq('box')
66
78
  expect(options[:view]).to eq(nil)
67
79
  expect(options[:items][:view]).to eq('closed')
68
80
  end
69
81
 
70
- it "treats :item as view of next level" do
71
- options = @class.new( @class.full_match('{{toy|link;item:name}}'), nil ).options
82
+ it 'treats :item as view of next level' do
83
+ @chunk = '{{toy|link;item:name}}'
72
84
  expect(options[:inc_name]).to eq('toy')
73
85
  expect(options[:view]).to eq('link')
74
86
  expect(options[:items][:view]).to eq('name')
75
87
  end
76
-
77
88
  end
78
89
 
79
- context "rendering" do
80
-
81
- it "handles absolute names" do
82
- alpha = newcard 'Alpha', "Pooey"
83
- beta = newcard 'Beta', "{{Alpha}}"
90
+ context 'rendering' do
91
+ it 'handles absolute names' do
92
+ create! 'Alpha', 'Pooey'
93
+ beta = create! 'Beta', '{{Alpha}}'
84
94
  result = beta.format.render_core
85
- assert_view_select result, 'div[class~="card-content"]', "Pooey"
95
+ assert_view_select result, 'div[class~="card-content"]', 'Pooey'
86
96
  end
87
97
 
88
- it "handles simple relative names" do
89
- alpha = newcard 'Alpha', "{{#{Card::Name.joint}Beta}}"
90
- beta = newcard 'Beta'
91
- alpha_beta = Card.create name: "#{alpha.name}#{Card::Name.joint}Beta", content: "Woot"
92
- assert_view_select alpha.format.render_core, 'div[class~=card-content]', "Woot"
98
+ it 'handles simple relative names' do
99
+ alpha = create! 'Alpha', "{{#{Card::Name.joint}Beta}}"
100
+ create! 'Beta'
101
+ create! "#{alpha.name}#{Card::Name.joint}Beta", 'Woot'
102
+ assert_view_select alpha.format.render_core, 'div[class~=card-content]',
103
+ 'Woot'
93
104
  end
94
105
 
95
- it "should handle complex relative names" do
96
- bob_city = Card.create! name: 'bob+city', content: "Sparta"
97
- Card::Auth.as_bot { address_tmpl = Card.create! name: 'address+*right+*structure', content: "{{_left+city}}" }
98
- bob_address = Card.create! name: 'bob+address'
106
+ it 'handles complex relative names' do
107
+ bob_city = create! 'bob+city', 'Sparta'
108
+ Card::Auth.as_bot do
109
+ create! 'address+*right+*structure', '{{_left+city}}'
110
+ end
111
+ bob_address = create! 'bob+address'
99
112
 
100
- r=bob_address.reload.format.render_core
101
- assert_view_select r, 'div[class~=card-content]', "Sparta"
102
- expect(Card.fetch("bob+address").includees.map(&:name)).to eq([bob_city.name])
113
+ r = bob_address.reload.format.render_core
114
+ assert_view_select r, 'div[class~=card-content]', 'Sparta'
115
+ expect(Card.fetch('bob+address').includees.map(&:name))
116
+ .to eq([bob_city.name])
103
117
  end
104
118
 
105
- it "should handle nesting" do
106
- alpha = newcard 'Alpha', "{{Beta}}"
107
- beta = newcard 'Beta', "{{Delta}}"
108
- delta = newcard 'Delta', "Booya"
109
- r= alpha .format.render_core
110
- #warn "r=#{r}"
119
+ it 'handles nesting' do
120
+ alpha = create! 'Alpha', '{{Beta}}'
121
+ create! 'Beta', '{{Delta}}'
122
+ create! 'Delta', 'Booya'
123
+ r = alpha.format.render_core
111
124
  assert_view_select r, 'div[class~=card-content]'
112
125
  expect(r).to match(/Booya/)
113
126
  end
114
127
 
115
- it "should handle options when nesting" do
128
+ it 'handles options when nesting' do
116
129
  Card.create! type: 'Pointer', name: 'Livable', content: '[[Earth]]'
117
- Card.create! name: 'Earth'
130
+ create! 'Earth'
118
131
 
119
- expect(render_content('{{Livable|core;item:link}}')).to eq(render_content('{{Livable|core|link}}'))
120
- expect(render_content('{{Livable|core;item:name}}')).to eq(render_content('{{Livable|core|name}}'))
132
+ expect(render_content('{{Livable|core;item:link}}'))
133
+ .to eq(render_content('{{Livable|core|link}}'))
134
+ expect(render_content('{{Livable|core;item:name}}'))
135
+ .to eq(render_content('{{Livable|core|name}}'))
121
136
  end
122
137
 
123
- it "should prevent recursion" do
124
- oak = Card.create! name: 'Oak', content: '{{Quentin}}'
125
- qnt = Card.create! name: 'Quentin', content: '{{Admin}}'
138
+ it 'prevents recursion' do
139
+ create! 'Oak', '{{Quentin}}'
140
+ create! 'Quentin', '{{Admin}}'
126
141
  adm = Card['Quentin']
127
- adm.update_attributes content: "{{Oak}}"
142
+ adm.update_attributes content: '{{Oak}}'
128
143
  result = adm.format.render_core
129
144
  expect(result).to match('too deep')
130
145
  end
131
146
 
132
- it "should handle missing cards" do
133
- @a = Card.create name: 'boo', content: "hey {{+there}}"
134
- r=@a.format.render_core
135
- assert_view_select r, 'div[data-card-name="boo+there"][class~="missing-view"]'
147
+ it 'handles missing cards' do
148
+ @a = create! 'boo', 'hey {{+there}}'
149
+ r = @a.format.render_core
150
+ assert_view_select(
151
+ r, 'div[data-card-name="boo+there"][class~="missing-view"]'
152
+ )
136
153
  end
137
154
 
138
- it "should handle structured cards" do
139
- age = newcard('age')
140
- template = Card['*template']
155
+ it 'handles structured cards' do
156
+ create!('age')
157
+ Card['*template']
141
158
  specialtype = Card.create type_code: 'Cardtype', name: 'SpecialType'
142
-
143
- specialtype_template = specialtype.fetch(trait: :type,new: {}).fetch(trait: :structure,new: {})
159
+ specialtype_template = specialtype.fetch(trait: :type, new: {})
160
+ .fetch(trait: :structure, new: {})
144
161
  specialtype_template.content = "{{#{Card::Name.joint}age}}"
145
162
  Card::Auth.as_bot { specialtype_template.save! }
146
- assert_equal "{{#{Card::Name.joint}age}}", specialtype_template.format.render_raw
163
+ assert_equal "{{#{Card::Name.joint}age}}",
164
+ specialtype_template.format.render_raw
147
165
 
148
166
  wooga = Card.create! name: 'Wooga', type: 'SpecialType'
149
- wooga_age = Card.create!( name: "#{wooga.name}#{Card::Name.joint}age", content: "39" )
150
- expect(wooga_age.format.render_core).to eq("39")
151
- #warn "cards #{wooga.inspect}, #{wooga_age.inspect}"
167
+ wooga_age = create! "#{wooga.name}#{Card::Name.joint}age", '39'
168
+ expect(wooga_age.format.render_core).to eq('39')
152
169
  expect(wooga_age.includers.map(&:name)).to eq(['Wooga'])
153
170
  end
154
171
 
155
- it "should handle shading" do
156
- alpha = newcard 'Alpha', "Pooey"
157
- beta = newcard 'Beta', "{{Alpha|shade:off}}"
158
- r=newcard('Bee', "{{Alpha|shade:off}}").format.render_core
172
+ it 'handles shading' do
173
+ create! 'Alpha', 'Pooey'
174
+ create! 'Beta', '{{Alpha|shade:off}}'
175
+ r = create!('Bee', '{{Alpha|shade:off}}').format.render_core
159
176
  assert_view_select r, 'div[style~="shade:off;"]' do
160
- assert_select 'div[class~=card-content]', "Pooey"
177
+ assert_select 'div[class~=card-content]', 'Pooey'
161
178
  end
162
- r=newcard('Cee', "{{Alpha| shade: off }}").format.render_core
179
+ r = create!('Cee', '{{Alpha| shade: off }}').format.render_core
163
180
  assert_view_select r, 'div[style~="shade:off;"]' do
164
- assert_select 'div[class~=card-content]', "Pooey"
181
+ assert_select 'div[class~=card-content]', 'Pooey'
165
182
  end
166
- r=newcard('Dee', "{{Alpha| shade:off }}").format.render_core
183
+ r = create!('Dee', '{{Alpha| shade:off }}').format.render_core
167
184
  assert_view_select r, 'div[style~="shade:off;"]' do
168
- assert_select 'div[class~="card-content"]', "Pooey"
185
+ assert_select 'div[class~="card-content"]', 'Pooey'
169
186
  end
170
- r=newcard('Eee', "{{Alpha| shade:on }}").format.render_core
187
+ r = create!('Eee', '{{Alpha| shade:on }}').format.render_core
171
188
  assert_view_select r, 'div[style~="shade:on;"]' do
172
- assert_select 'div[class~="card-content"]', "Pooey"
189
+ assert_select 'div[class~="card-content"]', 'Pooey'
173
190
  end
174
191
  end
175
192
 
176
- #FIXME - should move code and test to core_ext or some such
193
+ # FIXME: should move code and test to core_ext or some such
177
194
  it 'Hash.new_from_semicolon_attr_list should work' do
178
- expect(Hash.new_from_semicolon_attr_list("")).to eq({})
195
+ expect(Hash.new_from_semicolon_attr_list('')).to eq({})
179
196
  expect(Hash.new_from_semicolon_attr_list(nil)).to eq({})
180
- expect(Hash.new_from_semicolon_attr_list("a:b;c:4" )).to eq({a: 'b', c: '4'})
181
- expect(Hash.new_from_semicolon_attr_list("d:b;e:4; ")).to eq({d: 'b', e: '4'})
197
+ expect(Hash.new_from_semicolon_attr_list('a:b;c:4'))
198
+ .to eq(a: 'b', c: '4')
199
+ expect(Hash.new_from_semicolon_attr_list('d:b;e:4; '))
200
+ .to eq(d: 'b', e: '4')
182
201
  end
183
-
184
202
  end
185
-
186
203
  end