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
@@ -11,7 +11,7 @@ shared_examples_for 'machine input' do
11
11
  f.putty
12
12
  f
13
13
  end
14
- let!(:more_input) do
14
+ let(:more_input) do
15
15
  moreinput = create_another_machine_input_card
16
16
  moreinput
17
17
  end
@@ -22,8 +22,8 @@ shared_examples_for 'machine input' do
22
22
  Card::Auth.as_bot do
23
23
  input.delete!
24
24
  end
25
- f = Card.gimme machine.name
26
- expect(f.machine_input_card.item_cards).to eq([])
25
+ ca = Card.gimme machine.name
26
+ expect(ca.machine_input_card.item_cards).to eq([])
27
27
  end
28
28
 
29
29
  it 'updates output of machine card' do
@@ -44,7 +44,7 @@ shared_examples_for 'machine input' do
44
44
  context 'when updated' do
45
45
  it 'updates output of related machine card' do
46
46
  input.putty content: card_content[:changed_in]
47
- updated_machine = Card.gimme machine.cardname
47
+ updated_machine = Card.gimme machine.cardname
48
48
  path = updated_machine.machine_output_path
49
49
  expect(File.read path).to eq(card_content[:changed_out])
50
50
  end
@@ -52,14 +52,13 @@ shared_examples_for 'machine input' do
52
52
 
53
53
  context 'when added' do
54
54
  it 'updates output of related machine card' do
55
- if machine.kind_of? Card::Set::Type::Pointer
55
+ if machine.is_a? Card::Set::Type::Pointer
56
56
  machine << more_input
57
57
  machine.putty
58
- updated_machine = Card.gimme machine.cardname
58
+ updated_machine = Card.gimme machine.cardname
59
59
  path = updated_machine.machine_output_path
60
- expect(File.read path).to eq( ([card_content[:out]]*2).join("\n"))
60
+ expect(File.read path).to eq(([card_content[:out]] * 2).join("\n"))
61
61
  end
62
62
  end
63
63
  end
64
64
  end
65
-
@@ -1,29 +1,35 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
 
3
-
4
3
  describe Card::Set::Type::CoffeeScript do
5
4
  let(:coffee) { 'alert "Hi" ' }
6
5
  let(:compressed_coffee) { '(function(){alert("Hi")}).call(this);' }
7
6
  let(:changed_coffee) { 'alert "Hello" ' }
8
7
  let(:compressed_changed_coffee) { '(function(){alert("Hello")}).call(this);' }
9
8
 
10
-
11
9
  it_should_behave_like 'content machine', that_produces_js do
12
- let(:machine_card) { Card.gimme! "test coffeescript", type: Card::CoffeeScriptID, content: coffee}
10
+ let(:machine_card) do
11
+ Card.gimme! 'coffee machine', type: Card::CoffeeScriptID,
12
+ content: coffee
13
+ end
13
14
  let(:card_content) do
14
- { in: coffee, out: compressed_coffee,
15
- changed_in: changed_coffee, changed_out: compressed_changed_coffee }
15
+ { in: coffee, out: compressed_coffee,
16
+ changed_in: changed_coffee, changed_out: compressed_changed_coffee }
16
17
  end
17
18
  end
18
19
 
19
- it_behaves_like "machine input" do
20
- let(:create_machine_input_card) { Card.gimme! "test coffeescript", type: :coffee_script, content: coffee }
21
- let(:create_another_machine_input_card) { Card.gimme! "more coffee", type: :coffee_script, content: coffee }
22
- let(:create_machine_card) { Card.gimme! "script with coffee+*script", type: :pointer }
20
+ it_behaves_like 'machine input' do
21
+ let(:create_machine_input_card) do
22
+ Card.gimme! 'coffee input', type: :coffee_script, content: coffee
23
+ end
24
+ let(:create_another_machine_input_card) do
25
+ Card.gimme! 'more coffee input', type: :coffee_script, content: coffee
26
+ end
27
+ let(:create_machine_card) do
28
+ Card.gimme! 'coffee machine+*script', type: :pointer
29
+ end
23
30
  let(:card_content) do
24
- { in: coffee, out: compressed_coffee,
25
- changed_in: changed_coffee, changed_out: compressed_changed_coffee }
31
+ { in: coffee, out: compressed_coffee,
32
+ changed_in: changed_coffee, changed_out: compressed_changed_coffee }
26
33
  end
27
34
  end
28
-
29
- end
35
+ end
@@ -1,34 +1,40 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
 
3
3
  describe Card::Set::Type::Css do
4
- let(:css) { '#box { display: block }' }
5
- let(:compressed_css) { "#box{display:block}\n" }
6
- let(:changed_css) { '#box { display: inline }' }
4
+ let(:css) { '#box { display: block }' }
5
+ let(:compressed_css) { "#box{display:block}\n" }
6
+ let(:changed_css) { '#box { display: inline }' }
7
7
  let(:compressed_changed_css) { "#box{display:inline}\n" }
8
8
 
9
- it "should highlight code" do
9
+ it 'should highlight code' do
10
10
  Card::Auth.as_bot do
11
- css_card = Card.create! name: 'tmp css', type_code: 'css', content: "p { border: 1px solid black; }"
11
+ css_card = Card.create! name: 'tmp css', type_code: 'css',
12
+ content: 'p { border: 1px solid black; }'
12
13
  assert_view_select css_card.format.render_core, 'div[class=CodeRay]'
13
14
  end
14
15
  end
15
16
 
16
-
17
- it_behaves_like "machine input" do
18
- let(:create_machine_input_card) { Card.gimme! "test css", type: :css, content: css }
19
- let(:create_another_machine_input_card) { Card.gimme! "more test css", type: :css, content: css }
20
- let(:create_machine_card) { Card.gimme! "style with css+*style", type: :pointer }
17
+ it_behaves_like 'machine input' do
18
+ let(:create_machine_input_card) do
19
+ Card.gimme! 'test css', type: :css, content: css
20
+ end
21
+ let(:create_another_machine_input_card) do
22
+ Card.gimme! 'more test css', type: :css, content: css
23
+ end
24
+ let(:create_machine_card) do
25
+ Card.gimme! 'style with css+*style', type: :pointer
26
+ end
21
27
  let(:card_content) do
22
- { in: css, out: compressed_css,
23
- changed_in: changed_css, changed_out: compressed_changed_css }
28
+ { in: css, out: compressed_css,
29
+ changed_in: changed_css, changed_out: compressed_changed_css }
24
30
  end
25
31
  end
26
32
 
27
33
  it_behaves_like 'content machine', that_produces_css do
28
- let(:machine_card) { Card.gimme! "test css", type: :css, content: css }
34
+ let(:machine_card) { Card.gimme! 'test css', type: :css, content: css }
29
35
  let(:card_content) do
30
- { in: css, out: compressed_css,
31
- changed_in: changed_css, changed_out: compressed_changed_css }
36
+ { in: css, out: compressed_css,
37
+ changed_in: changed_css, changed_out: compressed_changed_css }
32
38
  end
33
39
  end
34
- end
40
+ end
@@ -1,43 +1,50 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
 
3
3
  describe Card::Set::Type::Scss do
4
- let(:scss) {
5
- %{
4
+ let(:scss) do
5
+ <<-SCSS
6
6
  $link_color: #abcdef;
7
7
  a { color: $link_color; }
8
- }
9
- }
10
- let(:compressed_css) { "a{color:#abcdef}\n" }
11
- let(:changed_scss) {
12
- %{
8
+ SCSS
9
+ end
10
+ let(:compressed_css) { "a{color:#abcdef}\n" }
11
+ let(:changed_scss) do
12
+ <<-SCSS
13
13
  $link_color: #fedcba;
14
14
  a { color: $link_color; }
15
- }
16
- }
17
- let(:compressed_changed_css) { "a{color:#fedcba}\n" }
15
+ SCSS
16
+ end
17
+ let(:compressed_changed_css) { "a{color:#fedcba}\n" }
18
18
  before do
19
19
  @scss_card = Card[:style_cards]
20
20
  end
21
21
 
22
22
  it 'should highlight code in html' do
23
- assert_view_select @scss_card.format(:html).render_core, 'div[class=CodeRay]'
23
+ assert_view_select @scss_card.format(:html).render_core,
24
+ 'div[class=CodeRay]'
24
25
  end
25
26
 
26
27
  it 'should not highlight code in css' do
27
28
  expect(@scss_card.format(:css).render_core).not_to match(/CodeRay/)
28
29
  end
29
30
 
30
- it_should_behave_like "machine input" do
31
- let(:create_machine_input_card) { Card.gimme! "test scss", type: :scss, content: scss }
32
- let(:create_another_machine_input_card) { Card.gimme! "more scss", type: :scss, content: scss }
33
- let(:create_machine_card) { Card.gimme! "style with scss+*style", type: :pointer }
31
+ it_should_behave_like 'machine input' do
32
+ let(:create_machine_input_card) do
33
+ Card.gimme! 'test scss', type: :scss, content: scss
34
+ end
35
+ let(:create_another_machine_input_card) do
36
+ Card.gimme! 'more scss', type: :scss, content: scss
37
+ end
38
+ let(:create_machine_card) do
39
+ Card.gimme! 'style with scss+*style', type: :pointer
40
+ end
34
41
  let(:card_content) do
35
- { in: scss, out: compressed_css,
36
- changed_in: changed_scss, changed_out: compressed_changed_css }
42
+ { in: scss, out: compressed_css,
43
+ changed_in: changed_scss, changed_out: compressed_changed_css }
37
44
  end
38
45
  end
39
46
 
40
- it "should process links and inclusions but not urls" do
47
+ it 'should process links and nests but not urls' do
41
48
  Card::Auth.as_bot do
42
49
  scss = ".TYPE-X.no-citations {\n color: #BA5B5B;\n}\n"
43
50
  card = Card.create! name: 'minimal css', type: 'scss', content: scss
@@ -46,10 +53,10 @@ describe Card::Set::Type::Scss do
46
53
  end
47
54
 
48
55
  it_should_behave_like 'content machine', that_produces_css do
49
- let(:machine_card) { Card.gimme! "test scss", type: :scss, content: scss }
56
+ let(:machine_card) { Card.gimme! 'test scss', type: :scss, content: scss }
50
57
  let(:card_content) do
51
- { in: scss, out: compressed_css,
52
- changed_in: changed_scss, changed_out: compressed_changed_css }
58
+ { in: scss, out: compressed_css,
59
+ changed_in: changed_scss, changed_out: compressed_changed_css }
53
60
  end
54
61
  end
55
62
  end
@@ -1,56 +1,56 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
 
3
3
  describe Card::Set::Type::Skin do
4
- let(:css) { "#box { display: block }" }
4
+ let(:css) { '#box { display: block }' }
5
5
  let(:compressed_css) { "#box{display:block}\n" }
6
- let(:changed_css) { "#box { display: inline }" }
6
+ let(:changed_css) { '#box { display: inline }' }
7
7
  let(:compressed_changed_css) { "#box{display:inline}\n" }
8
8
  let(:new_css) { "#box{display: none }\n" }
9
9
  let(:compressed_new_css) { "#box{display:none}\n" }
10
10
 
11
11
  it_should_behave_like 'pointer machine', that_produces_css do
12
- let(:machine_card) { Card.gimme! "test skin machine", type: :skin, content: ''}
13
- let(:machine_input_card) { Card.gimme! "test skin supplier", type: :css, content: css }
14
- let(:another_machine_input_card) { Card.gimme! "more css", type: :css, content: new_css }
12
+ let(:machine_card) { Card.gimme! 'test skin machine', type: :skin, content: '' }
13
+ let(:machine_input_card) { Card.gimme! 'test skin supplier', type: :css, content: css }
14
+ let(:another_machine_input_card) { Card.gimme! 'more css', type: :css, content: new_css }
15
15
  let(:expected_input_items) { nil }
16
16
  let(:input_type) { :css }
17
17
  let(:card_content) do
18
- { in: css, out: compressed_css,
19
- changed_in: changed_css, changed_out: compressed_changed_css,
20
- new_in: new_css, new_out: compressed_new_css }
18
+ { in: css, out: compressed_css,
19
+ changed_in: changed_css, changed_out: compressed_changed_css,
20
+ new_in: new_css, new_out: compressed_new_css }
21
21
  end
22
22
  end
23
23
 
24
- it_behaves_like "machine input" do
25
- let(:create_machine_input_card) { Card.gimme! "test skin input", type: :css, content: css }
26
- let(:create_another_machine_input_card) { Card.gimme! "more skin input", type: :css, content: css }
27
- let(:create_machine_card) { Card.gimme! "style with skin machine+*style", type: :pointer }
24
+ it_behaves_like 'machine input' do
25
+ let(:create_machine_input_card) { Card.gimme! 'test skin input', type: :css, content: css }
26
+ let(:create_another_machine_input_card) { Card.gimme! 'more skin input', type: :css, content: css }
27
+ let(:create_machine_card) { Card.gimme! 'style with skin machine+*style', type: :pointer }
28
28
  let(:card_content) do
29
- { in: css, out: compressed_css,
30
- changed_in: changed_css, changed_out: compressed_changed_css
31
- }
29
+ { in: css, out: compressed_css,
30
+ changed_in: changed_css, changed_out: compressed_changed_css
31
+ }
32
32
  end
33
33
  end
34
34
 
35
35
  context 'when item added' do
36
36
  it 'updates output of related machine card' do
37
- #item = Card.gimme! "skin item", type: :css, content: css
38
- skin = Card.gimme! "test skin supplier", type: :skin, content: ''
39
- machine = Card.gimme! "style with skin machine+*style", type: :pointer, content: '[[test skin supplier]]'
40
- item = Card.gimme! "skin item", type: :css, content: css
37
+ # item = Card.gimme! "skin item", type: :css, content: css
38
+ skin = Card.gimme! 'test skin supplier', type: :skin, content: ''
39
+ machine = Card.gimme! 'style with skin machine+*style', type: :pointer, content: '[[test skin supplier]]'
40
+ item = Card.gimme! 'skin item', type: :css, content: css
41
41
  skin << item
42
42
  skin.putty
43
- updated_machine = Card.gimme machine.cardname
43
+ updated_machine = Card.gimme machine.cardname
44
44
  path = updated_machine.machine_output_path
45
- expect(File.read path).to eq( compressed_css )
45
+ expect(File.read path).to eq(compressed_css)
46
46
  end
47
47
  end
48
48
 
49
49
  context 'when item changed' do
50
50
  it 'updates output of related machine card' do
51
- skin = Card.gimme! "test skin supplier", type: :skin, content: ''
52
- machine = Card.gimme! "style with skin machine+*style", type: :pointer, content: '[[test skin supplier]]'
53
- item = Card.gimme! "skin item", type: :css, content: css
51
+ skin = Card.gimme! 'test skin supplier', type: :skin, content: ''
52
+ machine = Card.gimme! 'style with skin machine+*style', type: :pointer, content: '[[test skin supplier]]'
53
+ item = Card.gimme! 'skin item', type: :css, content: css
54
54
  skin << item
55
55
  skin.putty
56
56
  Card::Auth.as_bot do
@@ -58,13 +58,11 @@ describe Card::Set::Type::Skin do
58
58
  { get: machine.machine_output_url }
59
59
  item.update_attributes content: new_css
60
60
  end
61
- updated_machine = Card.gimme machine.cardname
61
+ updated_machine = Card.gimme machine.cardname
62
62
  path = updated_machine.machine_output_path
63
- expect(File.read path).to eq( compressed_new_css )
64
- expect(updated_machine.machine_input_card.content).to include("[[skin item]]")
65
- expect(Card.search(link_to: "skin item")).to include(updated_machine.machine_input_card)
63
+ expect(File.read path).to eq(compressed_new_css)
64
+ expect(updated_machine.machine_input_card.content).to include('[[skin item]]')
65
+ expect(Card.search(link_to: 'skin item')).to include(updated_machine.machine_input_card)
66
66
  end
67
67
  end
68
-
69
-
70
68
  end
@@ -27,8 +27,8 @@ class Card
27
27
  config: 'Config'
28
28
  }
29
29
  @@groups = @@group_names.keys.each_with_object({}) do |key, groups|
30
- groups[key] = []
31
- end
30
+ groups[key] = []
31
+ end
32
32
  @@user_specific = ::Set.new
33
33
 
34
34
  def self.user_specific? codename
@@ -55,8 +55,8 @@ class Card
55
55
  self.restricted_to_type =
56
56
  if opts[:restricted_to_type]
57
57
  type_ids = [opts[:restricted_to_type]].flatten.map do |cardtype|
58
- to_type_id(cardtype)
59
- end
58
+ to_type_id(cardtype)
59
+ end
60
60
  ::Set.new(type_ids)
61
61
  end
62
62
  return unless opts[:user_specific]
@@ -5,7 +5,7 @@ end
5
5
 
6
6
  format :html do
7
7
  view :pointer_core do |args| # view: :core, mod: Type::Pointer::HtmlFormat
8
- %{<div class="pointer-list">#{render_pointer_items args}</div>}
8
+ %(<div class="pointer-list">#{render_pointer_items args}</div>)
9
9
  end
10
10
 
11
11
  view :core do |args|
@@ -31,71 +31,64 @@ format :html do
31
31
  end
32
32
 
33
33
  inheritable = not_set ? false : set_card.inheritable?
34
- inheriting = inheritable && card.content=='_left'
34
+ inheriting = inheritable && card.content == '_left'
35
35
 
36
36
  item_names = inheriting ? [] : card.item_names
37
37
 
38
- %{
39
- #{ hidden_field :content, class: 'card-content' }
38
+ %(
39
+ #{hidden_field :content, class: 'card-content'}
40
40
  <div class="perm-editor">
41
41
 
42
- #{ if inheritable; %{
42
+ #{if inheritable; %(
43
43
  <div class="perm-inheritance perm-section">
44
- #{ check_box_tag 'inherit', 'inherit', inheriting }
44
+ #{check_box_tag 'inherit', 'inherit', inheriting}
45
45
  <label>
46
- #{ core_inherit_content args.merge(target: 'wagn_role') }
47
- #{ content_tag( :a, title: "use left's #{card.cardname.tag} rule") { '?' } }
46
+ #{core_inherit_content args.merge(target: 'wagn_role')}
47
+ #{content_tag(:a, title: "use left's #{card.cardname.tag} rule") { '?' }}
48
48
  </label>
49
49
  </div>
50
- } end }
50
+ ) end}
51
51
 
52
52
  <div class="perm-group perm-vals perm-section">
53
53
  <h5>Groups</h5>
54
- #{
55
- group_options.map do |option|
54
+ #{group_options.map do |option|
56
55
  checked = !!item_names.delete(option.name)
57
- %{
56
+ %(
58
57
  <div class="group-option">
59
- #{ check_box_tag( "#{option.key}-perm-checkbox", option.name, checked, class: 'perm-checkbox-button' ) }
60
- <label>#{ card_link option.name, target: 'wagn_role' }</label>
58
+ #{check_box_tag("#{option.key}-perm-checkbox", option.name, checked, class: 'perm-checkbox-button')}
59
+ <label>#{card_link option.name, target: 'wagn_role'}</label>
61
60
  </div>
62
- }
63
- end * "\n"
64
- }
61
+ )
62
+ end * "\n"}
65
63
  </div>
66
64
 
67
65
  <div class="perm-indiv perm-vals perm-section">
68
66
  <h5>Individuals</h5>
69
- #{ _render_list item_list: item_names, extra_css_class: 'perm-indiv-ul' }
67
+ #{_render_list item_list: item_names, extra_css_class: 'perm-indiv-ul'}
70
68
  </div>
71
69
 
72
70
  </div>
73
- }
71
+ )
74
72
  end
75
73
 
76
-
77
-
78
-
79
74
  private
80
75
 
81
76
  def core_inherit_content args={}
82
77
  sc = args[:set_context]
83
78
  text = if sc && sc.tag_name.key == Card[:self].key
84
- begin
85
- task = card.tag.codename
86
- ancestor = Card[sc.trunk_name.trunk_name]
87
- links = ancestor.who_can( task.to_sym ).map do |card_id|
88
- card_link Card[card_id].name, target: args[:target]
89
- end*", "
90
- "Inherit ( #{links} )"
91
- rescue
92
- 'Inherit'
93
- end
94
- else
95
- 'Inherit from left card'
79
+ begin
80
+ task = card.tag.codename
81
+ ancestor = Card[sc.trunk_name.trunk_name]
82
+ links = ancestor.who_can(task.to_sym).map do |card_id|
83
+ card_link Card[card_id].name, target: args[:target]
84
+ end * ', '
85
+ "Inherit ( #{links} )"
86
+ rescue
87
+ 'Inherit'
88
+ end
89
+ else
90
+ 'Inherit from left card'
96
91
  end
97
- %{<span class="inherit-perm">#{text}</span>}
92
+ %(<span class="inherit-perm">#{text}</span>)
98
93
  end
99
94
  end
100
-
101
-