rules 0.0.1 → 0.1.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 (201) hide show
  1. data/README.md +40 -3
  2. data/db/migrate/20120831163952_create_rules.rb +1 -2
  3. data/lib/assets/javascripts/rules/active_admin.js +21 -0
  4. data/lib/rules.rb +11 -0
  5. data/lib/rules/config.rb +20 -0
  6. data/lib/rules/engine.rb +1 -0
  7. data/lib/rules/evaluators/definitions.rb +4 -2
  8. data/lib/rules/evaluators/evaluator.rb +8 -2
  9. data/lib/rules/extensions/active_admin/dsl.rb +32 -31
  10. data/lib/rules/extensions/active_model/absence_validator.rb +5 -0
  11. data/lib/rules/extensions/active_model/parameter_key_validator.rb +7 -0
  12. data/lib/rules/has_rules.rb +1 -1
  13. data/lib/rules/parameters.rb +1 -1
  14. data/lib/rules/parameters/attribute.rb +5 -8
  15. data/lib/rules/parameters/constant.rb +1 -14
  16. data/lib/rules/parameters/constant_definitions.rb +14 -15
  17. data/lib/rules/parameters/parameter.rb +39 -13
  18. data/lib/rules/rule.rb +85 -52
  19. data/lib/rules/rule_set.rb +53 -50
  20. data/lib/rules/version.rb +1 -1
  21. data/spec/dummy/app/assets/images/edit_example.png +0 -0
  22. data/spec/dummy/db/development.sqlite3 +0 -0
  23. data/spec/dummy/db/migrate/{20120831163952_create_rules.rb → 20121029183622_create_rules.rules.rb} +2 -2
  24. data/spec/dummy/db/migrate/{20120831173835_create_rule_sets.rb → 20121029183623_create_rule_sets.rules.rb} +1 -0
  25. data/spec/dummy/db/schema.rb +74 -75
  26. data/spec/dummy/db/test.sqlite3 +0 -0
  27. data/spec/dummy/log/development.log +8405 -7718
  28. data/spec/dummy/log/test.log +6158 -282
  29. data/spec/dummy/script/rails +0 -0
  30. data/spec/dummy/tmp/cache/assets/C5F/0B0/sprockets%2F7b74141c7941d947343b6d7593e3761e +0 -0
  31. data/spec/dummy/tmp/cache/assets/C7B/E40/sprockets%2Fc629141780bbee6259a21437c1428a67 +0 -0
  32. data/spec/dummy/tmp/cache/assets/{C58/950/sprockets%2F615625588c137a1529206d80ee81fe93 → C84/1D0/sprockets%2F649513e42d02d9493f733015c1c8cf58} +0 -0
  33. data/spec/dummy/tmp/cache/assets/{D0B/EB0/sprockets%2Fa18a9144dadd3f628d2f061f91190d65 → C88/A50/sprockets%2F61269f1f7806037ed104f099517e4b6d} +0 -0
  34. data/spec/dummy/tmp/cache/assets/{E03/290/sprockets%2Fd469f86939a1cbd52d9b9aaf1db22dae → C9E/670/sprockets%2Ff47927ce03e3b12202e62552e11d911d} +0 -0
  35. data/spec/dummy/tmp/cache/assets/CAB/910/sprockets%2Fd55a96c4e70110aa337804446dd3983d +0 -0
  36. data/spec/dummy/tmp/cache/assets/CAE/360/sprockets%2F6039fb610c813f60e634a4782b4aa877 +0 -0
  37. data/spec/dummy/tmp/cache/assets/CB8/5D0/sprockets%2F5c94c5d562bcb216295496c26397c1d5 +0 -0
  38. data/spec/dummy/tmp/cache/assets/{CF9/580/sprockets%2F9b6f302133d13906b7d823b4ae14f0aa → CBB/6B0/sprockets%2F81c6f6d9206a39d8743c13c59f461f24} +0 -0
  39. data/spec/dummy/tmp/cache/assets/{CAD/F70/sprockets%2F5a1855f4cda19a255ffc802226735517 → CBC/7F0/sprockets%2F9c674dfe9e0f6503950e9212602fa198} +0 -0
  40. data/spec/dummy/tmp/cache/assets/CC4/300/sprockets%2Fc455e0353702d71fea6a99e9988763d2 +0 -0
  41. data/spec/dummy/tmp/cache/assets/{CA2/8F0/sprockets%2Fa283030e028b24b4ba4084e067888c3e → CCE/540/sprockets%2F7897a2f839c15d27739c478e5098cae3} +0 -0
  42. data/spec/dummy/tmp/cache/assets/{D11/FD0/sprockets%2Ff7129bbf85d84e8bc056543e20281e3b → CCF/A70/sprockets%2Ff84117614042da23eac1c3c1c95177d5} +0 -0
  43. data/spec/dummy/tmp/cache/assets/{DCE/350/sprockets%2F812b6c1998c5ad61096ae7b16cdaeeea → CCF/B30/sprockets%2Ff8e4785e47480d99304deb197af77716} +0 -0
  44. data/spec/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
  45. data/spec/dummy/tmp/cache/assets/CDB/040/sprockets%2Fc732474e67003a4eb840eb44c5ca9385 +0 -0
  46. data/spec/dummy/tmp/cache/assets/CE6/210/sprockets%2F65a1063d333cef4cc977b687c063f753 +0 -0
  47. data/spec/dummy/tmp/cache/assets/{D84/0C0/sprockets%2Fe48907efa9d3370f9a2f687a1a7b8d8d → D03/EA0/sprockets%2F58fba513bbd32d023349c0d57f396c22} +0 -0
  48. data/spec/dummy/tmp/cache/assets/{DD3/370/sprockets%2Ff23609d51b09058fdd08daeecfd7e5e3 → D1C/C00/sprockets%2Ff3e537b590d1e8c26ba67794ca9a2549} +0 -0
  49. data/spec/dummy/tmp/cache/assets/{CFE/5D0/sprockets%2F5e63c7f47b86e8916fe1b8f88f470370 → D1E/A20/sprockets%2F448a2575960df5788cb1b6347d9c4bfa} +0 -0
  50. data/spec/dummy/tmp/cache/assets/{D29/AE0/sprockets%2Fb62ea1b010afb027501b4f18b8dd3689 → D1F/7D0/sprockets%2F39f84da4e78a14f35fc2559b709218cf} +0 -0
  51. data/spec/dummy/tmp/cache/assets/D30/800/sprockets%2Fb5a31c56ce1b4444a1a1fb826c8881a6 +0 -0
  52. data/spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  53. data/spec/dummy/tmp/cache/assets/{CD0/AC0/sprockets%2F6f2c1b921c2b86e16aee3245772240c1 → D37/3D0/sprockets%2F3f693950778fef29f540ccf486789edb} +0 -0
  54. data/spec/dummy/tmp/cache/assets/D38/540/sprockets%2F86e1ad844bc9df4491a2a52b870421db +0 -0
  55. data/spec/dummy/tmp/cache/assets/D45/D90/sprockets%2F786ea0631bc7ab5a84183882f07cff7b +0 -0
  56. data/spec/dummy/tmp/cache/assets/D48/640/sprockets%2F9f4f18d910b678b1d0777e04cdaf6f24 +0 -0
  57. data/spec/dummy/tmp/cache/assets/{CB8/A30/sprockets%2Ff35759652c08bb7b3921c434d9ee1654 → D4D/0F0/sprockets%2Fe101ce9532cd7f637a3a889fee74291f} +0 -0
  58. data/spec/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
  59. data/spec/dummy/tmp/cache/assets/{D72/9E0/sprockets%2Fdf58dccde6a5e1266ba5c386149108c6 → D52/DA0/sprockets%2F36936870fc1855efeb9d8119eec2ee41} +0 -0
  60. data/spec/dummy/tmp/cache/assets/{D9E/530/sprockets%2F8dbb0027bd9ce6b96c81b82bdec17814 → D54/0D0/sprockets%2F39d86b7fa34888e64af3993acc6e7c10} +0 -0
  61. data/spec/dummy/tmp/cache/assets/D59/D70/sprockets%2Fed9f0de1b65ae8d7ef89087c83728461 +0 -0
  62. data/spec/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
  63. data/spec/dummy/tmp/cache/assets/{D41/AB0/sprockets%2Fd112ea59edbe4b7335549d814cb1d848 → D64/DB0/sprockets%2F7a3fd8bcc2642600f5ce0d5926e5be10} +0 -0
  64. data/spec/dummy/tmp/cache/assets/D66/7F0/sprockets%2F71eb5b2174c2bca8ed14955fd01c57a7 +0 -0
  65. data/spec/dummy/tmp/cache/assets/{D47/050/sprockets%2F237eeefd847c43be2e7810a77e80841b → D6F/450/sprockets%2F02efd499574bb3628cec534aee4b11e6} +0 -0
  66. data/spec/dummy/tmp/cache/assets/D75/770/sprockets%2Fa0501a374162cf29c8a9c8cecf678cf7 +0 -0
  67. data/spec/dummy/tmp/cache/assets/{C9B/B40/sprockets%2F29dc70cbda38311141464e041655de41 → D78/D80/sprockets%2F9930fb628d6fe577ab5707632a0dffbc} +0 -0
  68. data/spec/dummy/tmp/cache/assets/D7D/FA0/sprockets%2F4124a7757f7f9ca6ca072ae8ffd3269f +0 -0
  69. data/spec/dummy/tmp/cache/assets/D8D/970/sprockets%2Fccea3ce5a756eb6e3c61e246c121a730 +0 -0
  70. data/spec/dummy/tmp/cache/assets/D93/4C0/sprockets%2F857ecd2092cee11f740b3cf2e373ad2a +0 -0
  71. data/spec/dummy/tmp/cache/assets/{CE4/D80/sprockets%2Fd7f4b155b13ea1d8578693e62b0e6463 → D98/530/sprockets%2F6d51419c03c562d84be5ebfbe71b5a3e} +0 -0
  72. data/spec/dummy/tmp/cache/assets/D9A/960/sprockets%2F1b481cb0d9ea61f57a341cdc96fc823e +0 -0
  73. data/spec/dummy/tmp/cache/assets/DA1/DC0/sprockets%2F76c4315e48dbb2cb7e92dd5b8b7ab185 +0 -0
  74. data/spec/dummy/tmp/cache/assets/{D24/B00/sprockets%2F671d6f261d89a29e918b1ec7818db6a9 → DA5/DE0/sprockets%2F366c4e5e2d81e438b4e50bec5e4d88da} +0 -0
  75. data/spec/dummy/tmp/cache/assets/{CAC/4A0/sprockets%2F3d00565c9e04f1bd481d33b4f1985706 → DA9/C90/sprockets%2F5bdea8b6a1c99fff81a38fb37281f137} +0 -0
  76. data/spec/dummy/tmp/cache/assets/{DAA/990/sprockets%2F8e0ca45c660183bfe809afc1f69bf9a9 → DAB/4B0/sprockets%2F9b48d3d915c5ddf603344e595de1fbee} +0 -0
  77. data/spec/dummy/tmp/cache/assets/DB0/1D0/sprockets%2Fa89dd6f509b6ff2fc8d458d371da2c29 +0 -0
  78. data/spec/dummy/tmp/cache/assets/{CB2/140/sprockets%2F035ac84d6c64495d0067b926533f8bc3 → DC8/EB0/sprockets%2F8b8dc54ec9133ff2a2b8fc31b1c6da63} +0 -0
  79. data/spec/dummy/tmp/cache/assets/{D60/6C0/sprockets%2Fd7ef2595e5c50eb96e9d3c3d8698f481 → DD0/170/sprockets%2Fd9eb23a676ff2da1c29e2cb2f0ff4791} +0 -0
  80. data/spec/dummy/tmp/cache/assets/{D65/EE0/sprockets%2Fd9062d87143bb5c1d9d73c3ea02d7eb1 → DD5/380/sprockets%2Fb835ac5f9225cbc2e3c2c6669df46cee} +0 -0
  81. data/spec/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
  82. data/spec/dummy/tmp/cache/assets/DDE/420/sprockets%2Ffb8b186d5bf0307f86f65fc787d2adeb +0 -0
  83. data/spec/dummy/tmp/cache/assets/DE6/000/sprockets%2F03f0d1a05d0ee270ce8acacef4233bf8 +0 -0
  84. data/spec/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
  85. data/spec/dummy/tmp/cache/assets/{ECA/140/sprockets%2Fd8ebea8564753ddfde91fadbdacc9f5b → E21/900/sprockets%2F4013eebd9f4bf6b2870f0d7adbba4e1d} +0 -0
  86. data/spec/dummy/tmp/cache/sass/{40a0b76d82cd847e80571abbfe75b703bdb6b77f → 2086f86f19c1c7590bd3622023362d065fe06dd4}/active_admin.css.scssc +0 -0
  87. data/spec/dummy/tmp/cache/sass/{a28435efd4cb26f8ebc9e55bbaf23e3537a13190 → 35fba3f569e02e3ff55b98665f3046be151c4360}/_button.scssc +0 -0
  88. data/spec/dummy/tmp/cache/sass/{a28435efd4cb26f8ebc9e55bbaf23e3537a13190 → 35fba3f569e02e3ff55b98665f3046be151c4360}/_clearfix.scssc +0 -0
  89. data/spec/dummy/tmp/cache/sass/{a28435efd4cb26f8ebc9e55bbaf23e3537a13190 → 35fba3f569e02e3ff55b98665f3046be151c4360}/_font-face.scssc +0 -0
  90. data/spec/dummy/tmp/cache/sass/{a28435efd4cb26f8ebc9e55bbaf23e3537a13190 → 35fba3f569e02e3ff55b98665f3046be151c4360}/_font-family.scssc +0 -0
  91. data/spec/dummy/tmp/cache/sass/{a28435efd4cb26f8ebc9e55bbaf23e3537a13190 → 35fba3f569e02e3ff55b98665f3046be151c4360}/_hide-text.scssc +0 -0
  92. data/spec/dummy/tmp/cache/sass/{a28435efd4cb26f8ebc9e55bbaf23e3537a13190 → 35fba3f569e02e3ff55b98665f3046be151c4360}/_html5-input-types.scssc +0 -0
  93. data/spec/dummy/tmp/cache/sass/{a28435efd4cb26f8ebc9e55bbaf23e3537a13190 → 35fba3f569e02e3ff55b98665f3046be151c4360}/_position.scssc +0 -0
  94. data/spec/dummy/tmp/cache/sass/{a28435efd4cb26f8ebc9e55bbaf23e3537a13190 → 35fba3f569e02e3ff55b98665f3046be151c4360}/_timing-functions.scssc +0 -0
  95. data/spec/dummy/tmp/cache/sass/{ee5b745f862b39ff22bf2068a6582c3ee05d1a79 → 4498c5797b40d28956767b90fa545e9739e43edc}/_dashboard.scssc +0 -0
  96. data/spec/dummy/tmp/cache/sass/{ee5b745f862b39ff22bf2068a6582c3ee05d1a79 → 4498c5797b40d28956767b90fa545e9739e43edc}/_logged_out.scssc +0 -0
  97. data/spec/dummy/tmp/cache/sass/{597823364192c14f6a72ee20d1a1496a722ab1f2 → 4c643142bab3f2738bc6b6f785180a24ac1b79de}/_all.css.scssc +0 -0
  98. data/spec/dummy/tmp/cache/sass/{597823364192c14f6a72ee20d1a1496a722ab1f2 → 4c643142bab3f2738bc6b6f785180a24ac1b79de}/_buttons.css.scssc +0 -0
  99. data/spec/dummy/tmp/cache/sass/{597823364192c14f6a72ee20d1a1496a722ab1f2 → 4c643142bab3f2738bc6b6f785180a24ac1b79de}/_gradients.css.scssc +0 -0
  100. data/spec/dummy/tmp/cache/sass/{597823364192c14f6a72ee20d1a1496a722ab1f2 → 4c643142bab3f2738bc6b6f785180a24ac1b79de}/_icons.css.scssc +0 -0
  101. data/spec/dummy/tmp/cache/sass/{597823364192c14f6a72ee20d1a1496a722ab1f2 → 4c643142bab3f2738bc6b6f785180a24ac1b79de}/_reset.css.scssc +0 -0
  102. data/spec/dummy/tmp/cache/sass/{597823364192c14f6a72ee20d1a1496a722ab1f2 → 4c643142bab3f2738bc6b6f785180a24ac1b79de}/_rounded.css.scssc +0 -0
  103. data/spec/dummy/tmp/cache/sass/{597823364192c14f6a72ee20d1a1496a722ab1f2 → 4c643142bab3f2738bc6b6f785180a24ac1b79de}/_sections.css.scssc +0 -0
  104. data/spec/dummy/tmp/cache/sass/{597823364192c14f6a72ee20d1a1496a722ab1f2 → 4c643142bab3f2738bc6b6f785180a24ac1b79de}/_shadows.css.scssc +0 -0
  105. data/spec/dummy/tmp/cache/sass/{597823364192c14f6a72ee20d1a1496a722ab1f2 → 4c643142bab3f2738bc6b6f785180a24ac1b79de}/_typography.scssc +0 -0
  106. data/spec/dummy/tmp/cache/sass/{597823364192c14f6a72ee20d1a1496a722ab1f2 → 4c643142bab3f2738bc6b6f785180a24ac1b79de}/_utilities.scssc +0 -0
  107. data/spec/dummy/tmp/cache/sass/{597823364192c14f6a72ee20d1a1496a722ab1f2 → 4c643142bab3f2738bc6b6f785180a24ac1b79de}/_variables.css.scssc +0 -0
  108. data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_batch_actions.css.scssc +0 -0
  109. data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_blank_slates.scssc +0 -0
  110. data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_breadcrumbs.scssc +0 -0
  111. data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_buttons.scssc +0 -0
  112. data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_columns.scssc +0 -0
  113. data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_comments.css.scssc +0 -0
  114. data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_date_picker.css.scssc +0 -0
  115. data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_dropdown_menu.scssc +0 -0
  116. data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_flash_messages.css.scssc +0 -0
  117. data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_grid.scssc +0 -0
  118. data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_links.scssc +0 -0
  119. data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_pagination.scssc +0 -0
  120. data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_panels.scssc +0 -0
  121. data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_popovers.css.scssc +0 -0
  122. data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_scopes.scssc +0 -0
  123. data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_status_tags.scssc +0 -0
  124. data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_table_tools.css.scssc +0 -0
  125. data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_tables.css.scssc +0 -0
  126. data/spec/dummy/tmp/cache/sass/{bb2f93296c9b1e89237438ea63572f38aae290c3 → 9f77ade2a538829418bc2e2168a13e3c5e8d566e}/_deprecated-webkit-gradient.scssc +0 -0
  127. data/spec/dummy/tmp/cache/sass/{bb2f93296c9b1e89237438ea63572f38aae290c3 → 9f77ade2a538829418bc2e2168a13e3c5e8d566e}/_flex-grid.scssc +0 -0
  128. data/spec/dummy/tmp/cache/sass/{bb2f93296c9b1e89237438ea63572f38aae290c3 → 9f77ade2a538829418bc2e2168a13e3c5e8d566e}/_grid-width.scssc +0 -0
  129. data/spec/dummy/tmp/cache/sass/{bb2f93296c9b1e89237438ea63572f38aae290c3 → 9f77ade2a538829418bc2e2168a13e3c5e8d566e}/_linear-gradient.scssc +0 -0
  130. data/spec/dummy/tmp/cache/sass/{bb2f93296c9b1e89237438ea63572f38aae290c3 → 9f77ade2a538829418bc2e2168a13e3c5e8d566e}/_modular-scale.scssc +0 -0
  131. data/spec/dummy/tmp/cache/sass/{bb2f93296c9b1e89237438ea63572f38aae290c3 → 9f77ade2a538829418bc2e2168a13e3c5e8d566e}/_radial-gradient.scssc +0 -0
  132. data/spec/dummy/tmp/cache/sass/{bb2f93296c9b1e89237438ea63572f38aae290c3 → 9f77ade2a538829418bc2e2168a13e3c5e8d566e}/_render-gradients.scssc +0 -0
  133. data/spec/dummy/tmp/cache/sass/{bb2f93296c9b1e89237438ea63572f38aae290c3 → 9f77ade2a538829418bc2e2168a13e3c5e8d566e}/_tint-shade.scssc +0 -0
  134. data/spec/dummy/tmp/cache/sass/{bb2f93296c9b1e89237438ea63572f38aae290c3 → 9f77ade2a538829418bc2e2168a13e3c5e8d566e}/_transition-property-name.scssc +0 -0
  135. data/spec/dummy/tmp/cache/sass/{1a9fc2ebd62e6e7cb58441dc0293552ac07c99a9 → a500b9d7e9e6288c20d3d089871d43ac3aee2604}/_bourbon.scssc +0 -0
  136. data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_animation.scssc +0 -0
  137. data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_appearance.scssc +0 -0
  138. data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_background-image.scssc +0 -0
  139. data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_background-size.scssc +0 -0
  140. data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_background.scssc +0 -0
  141. data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_border-image.scssc +0 -0
  142. data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_border-radius.scssc +0 -0
  143. data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_box-shadow.scssc +0 -0
  144. data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_box-sizing.scssc +0 -0
  145. data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_columns.scssc +0 -0
  146. data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_flex-box.scssc +0 -0
  147. data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_inline-block.scssc +0 -0
  148. data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_linear-gradient.scssc +0 -0
  149. data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_prefixer.scssc +0 -0
  150. data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_radial-gradient.scssc +0 -0
  151. data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_transform.scssc +0 -0
  152. data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_transition.scssc +0 -0
  153. data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_user-select.scssc +0 -0
  154. data/spec/dummy/tmp/cache/sass/{6d594ee297c7ebeecae08432451ce722569d1a35 → d39759080a3787a3183222f58ca8294b28eca502}/_footer.scssc +0 -0
  155. data/spec/dummy/tmp/cache/sass/{6d594ee297c7ebeecae08432451ce722569d1a35 → d39759080a3787a3183222f58ca8294b28eca502}/_main_structure.scssc +0 -0
  156. data/spec/dummy/tmp/cache/sass/{6d594ee297c7ebeecae08432451ce722569d1a35 → d39759080a3787a3183222f58ca8294b28eca502}/_title_bar.scssc +0 -0
  157. data/spec/dummy/tmp/cache/sass/{89a136914378618e18c0f75bc8c0f78e84403b0f → ecc4c9317361a12ede9a49c29635837608d17540}/_base.css.scssc +0 -0
  158. data/spec/dummy/tmp/cache/sass/{89a136914378618e18c0f75bc8c0f78e84403b0f → ecc4c9317361a12ede9a49c29635837608d17540}/_forms.css.scssc +0 -0
  159. data/spec/dummy/tmp/cache/sass/{89a136914378618e18c0f75bc8c0f78e84403b0f → ecc4c9317361a12ede9a49c29635837608d17540}/_header.css.scssc +0 -0
  160. data/spec/dummy/tmp/cache/sass/{89a136914378618e18c0f75bc8c0f78e84403b0f → ecc4c9317361a12ede9a49c29635837608d17540}/_mixins.css.scssc +0 -0
  161. data/spec/dummy/tmp/cache/sass/{89a136914378618e18c0f75bc8c0f78e84403b0f → ecc4c9317361a12ede9a49c29635837608d17540}/_typography.css.scssc +0 -0
  162. data/spec/dummy/tmp/cache/sass/{89a136914378618e18c0f75bc8c0f78e84403b0f → ecc4c9317361a12ede9a49c29635837608d17540}/print.css.scssc +0 -0
  163. data/spec/rules/evaluators/evaluator_spec.rb +36 -0
  164. data/spec/rules/parameters/attribute_spec.rb +20 -0
  165. data/spec/rules/rule_set_spec.rb +21 -11
  166. data/spec/rules/rule_spec.rb +138 -65
  167. metadata +262 -289
  168. data/spec/dummy/db/production.sqlite3 +0 -0
  169. data/spec/dummy/log/production.log +0 -74
  170. data/spec/dummy/tmp/cache/assets/C83/FF0/sprockets%2F75b536e9b6927c15b60310fa867e3613 +0 -0
  171. data/spec/dummy/tmp/cache/assets/C88/FD0/sprockets%2F6c558405457e9b59062515dc86bfa252 +0 -0
  172. data/spec/dummy/tmp/cache/assets/C99/A50/sprockets%2Ffd135176f584f5f5658ef48f41187352 +0 -0
  173. data/spec/dummy/tmp/cache/assets/C9F/2F0/sprockets%2Faf814c1513450b5466432d2a565ca5c6 +0 -0
  174. data/spec/dummy/tmp/cache/assets/CA7/860/sprockets%2F0b1c90a9344b3c3989fc2153d0d63193 +0 -0
  175. data/spec/dummy/tmp/cache/assets/CAE/DA0/sprockets%2F9a133e6ab132f569c40b5e82188f4290 +0 -0
  176. data/spec/dummy/tmp/cache/assets/CB2/920/sprockets%2F2db5288c0689b237264d0fb22b74d981 +0 -0
  177. data/spec/dummy/tmp/cache/assets/CCA/AE0/sprockets%2Ff80b892078268a51ddf973986035bf9d +0 -0
  178. data/spec/dummy/tmp/cache/assets/CE0/300/sprockets%2F79b0286bc0a316d639ed5f83b1d33763 +0 -0
  179. data/spec/dummy/tmp/cache/assets/CFD/B50/sprockets%2Fb21fb4d7213b3bf64d6317b3f22584b1 +0 -0
  180. data/spec/dummy/tmp/cache/assets/CFE/450/sprockets%2F088e843f7fffd845821822c7668a4d7e +0 -0
  181. data/spec/dummy/tmp/cache/assets/CFE/D50/sprockets%2Fc912074248a7b0bdc219a5eac3c52348 +0 -0
  182. data/spec/dummy/tmp/cache/assets/D0B/650/sprockets%2Fb66b60c6b42330849f5b7449bbe108bd +0 -0
  183. data/spec/dummy/tmp/cache/assets/D0E/820/sprockets%2F1611a9cc354f4e02c97d26b3c6ce7466 +0 -0
  184. data/spec/dummy/tmp/cache/assets/D38/5F0/sprockets%2F0c09a45e38408ec6e0e9caf206d5028d +0 -0
  185. data/spec/dummy/tmp/cache/assets/D3A/CE0/sprockets%2F238bf80bfbe1e2a5bb9280e62162584f +0 -0
  186. data/spec/dummy/tmp/cache/assets/D3B/000/sprockets%2F961758db39c6223d18ea6b7aeac400d5 +0 -0
  187. data/spec/dummy/tmp/cache/assets/D3B/F60/sprockets%2Ffd56cbfde039018718a0933340af6ef2 +0 -0
  188. data/spec/dummy/tmp/cache/assets/D48/0D0/sprockets%2F1ef4ab19f690478ac62ad77fcb284447 +0 -0
  189. data/spec/dummy/tmp/cache/assets/D65/B10/sprockets%2Fca02dba972b587d3a69b8c32c7200fc6 +0 -0
  190. data/spec/dummy/tmp/cache/assets/D66/2A0/sprockets%2F7b7cb56109acc9205fbbb792187ad04b +0 -0
  191. data/spec/dummy/tmp/cache/assets/D94/FA0/sprockets%2F8b190b3f72af75f09bfab1f354a0c37b +0 -0
  192. data/spec/dummy/tmp/cache/assets/D98/550/sprockets%2F69a91a7b4aca241c17daf6a78ac6845a +0 -0
  193. data/spec/dummy/tmp/cache/assets/DC1/C40/sprockets%2Fa8cbeabf3ef2d34b43be61671536f2a2 +0 -0
  194. data/spec/dummy/tmp/cache/assets/DC7/8B0/sprockets%2Ffad93382facdc50f097e26ebf19010ea +0 -0
  195. data/spec/dummy/tmp/cache/assets/DD7/6A0/sprockets%2Fd5b1cca8d0835fbe9957aa4ee5f8333e +0 -0
  196. data/spec/dummy/tmp/cache/assets/DD8/440/sprockets%2F7edf42cfb3ac43c7cd4f63c3980d7c86 +0 -0
  197. data/spec/dummy/tmp/cache/assets/DF5/270/sprockets%2Fc7f64f609aceac43da16557daacc421f +0 -0
  198. data/spec/dummy/tmp/cache/assets/DF5/410/sprockets%2Fd6efccfb4bfeb13ed0125e8c53424a65 +0 -0
  199. data/spec/dummy/tmp/cache/assets/DFF/180/sprockets%2Fdc24014f1fcc77f40c5e7de188ad8ebd +0 -0
  200. data/spec/dummy/tmp/cache/assets/E07/7C0/sprockets%2Fcc5def6ed69cb6a1b7f6084992ed3ca1 +0 -0
  201. data/spec/dummy/tmp/pids/server.pid +0 -1
File without changes
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rules::Evaluators::Evaluator do
4
+ describe '#evaluate' do
5
+ let(:evaluator) { Rules::Evaluators::Evaluator.new(:test) }
6
+ let(:lhv) { 'lhv' }
7
+ let(:rhv) { 'rhv' }
8
+
9
+ it 'raises an error if a block is not defined' do
10
+ expect {
11
+ evaluator.evaluate(lhv, rhv)
12
+ }.to raise_error 'Unknown evaluation method'
13
+ end
14
+
15
+ it 'calls the block for the evaluator with the specified' do
16
+ evaluator.evaluation_method = ->(lhv, rhv) { true }
17
+ evaluator.evaluation_method.should_receive(:call).with(lhv, rhv)
18
+ evaluator.evaluate(lhv, rhv)
19
+ end
20
+
21
+ context 'when an error is raised within the evaluator' do
22
+ before { evaluator.evaluation_method = ->(lhv, rhv) { raise 'oh noes' } }
23
+
24
+ it 'returns false by default' do
25
+ evaluator.evaluate(lhv, rhv).should be_false
26
+ end
27
+
28
+ it 'raises the error if the errors_are_false config option is false' do
29
+ Rules.config.stub(errors_are_false?: false)
30
+ expect {
31
+ evaluator.evaluate(lhv, rhv)
32
+ }.to raise_error 'oh noes'
33
+ end
34
+ end
35
+ end
36
+ end
@@ -7,6 +7,26 @@ describe Rules::Parameters::Attribute do
7
7
  end
8
8
  end
9
9
 
10
+ let(:attribute) { Rules::Parameters::Attribute.new(key: 'test_key') }
11
+
10
12
  describe '#evaluate' do
13
+
14
+ it 'retrieves the attribute value from the given hash' do
15
+ attribute.evaluate(key_1: 1, key_2: 'john', test_key: 'carol').should == 'carol'
16
+ end
17
+
18
+ context 'when the attribute is missing' do
19
+ it 'returns nil by default' do
20
+ attribute.evaluate(key_1: 1, key_2: 'john').should be_nil
21
+ end
22
+
23
+ it 'raises an error if set in the configuration settings' do
24
+ Rules.config.stub(missing_attributes_are_nil?: false)
25
+
26
+ expect {
27
+ attribute.evaluate(key_1: 1, key_2: 'john')
28
+ }.to raise_error KeyError
29
+ end
30
+ end
11
31
  end
12
32
  end
@@ -7,32 +7,42 @@ describe Rules::RuleSet do
7
7
  before { stub_const('FakeClass', Class.new) }
8
8
 
9
9
  describe '.set_attributes_for' do
10
- it 'returns nil if there are no attributes for the given class' do
11
- Rules::RuleSet.attributes[FakeClass].should be_nil
10
+ it 'returns an empty hash if there are no attributes for the given class' do
11
+ Rules::RuleSet.attributes[FakeClass].should == {}
12
12
  end
13
13
 
14
14
  it 'stores the list of attributes for the specified class' do
15
15
  Rules::RuleSet.set_attributes_for(FakeClass, attributes)
16
16
  Rules::RuleSet.attributes[FakeClass].should have(2).attributes
17
17
  end
18
+
19
+ it 'appends new attributes when called multiple times' do
20
+ Rules::RuleSet.set_attributes_for(FakeClass, attributes)
21
+ Rules::RuleSet.set_attributes_for(FakeClass, {attribute3: {name: 'name of attribute 3'}})
22
+ Rules::RuleSet.attributes[FakeClass].should have(3).attributes
23
+ end
18
24
  end
19
25
 
20
26
  describe '#evaluate' do
21
- let(:true_rule1) { Rules::Rule.new(lhs_parameter: 'today', evaluator: 'not_nil') }
22
- let(:true_rule2) { Rules::Rule.new(lhs_parameter: nil, evaluator: 'nil') }
23
- let(:false_rule1) { Rules::Rule.new(lhs_parameter: 'today', evaluator: 'nil') }
24
- let(:false_rule2) { Rules::Rule.new(lhs_parameter: nil, evaluator: 'not_nil') }
27
+ let(:true_rule1) { Rules::Rule.new(lhs_parameter_key: 'today', evaluator_key: 'not_nil') }
28
+ let(:true_rule2) { Rules::Rule.new(lhs_parameter_key: nil, evaluator_key: 'nil') }
29
+ let(:false_rule1) { Rules::Rule.new(lhs_parameter_key: 'today', evaluator_key: 'nil') }
30
+ let(:false_rule2) { Rules::Rule.new(lhs_parameter_key: nil, evaluator_key: 'not_nil') }
31
+
32
+ it 'returns true if there are no rules' do
33
+ rule_set.evaluate.should be_true
34
+ end
25
35
 
26
36
  context 'when evaluation logic is all' do
27
37
  before { rule_set.evaluation_logic = 'all' }
28
38
 
29
39
  it 'returns true if all rules are true' do
30
- rule_set.rules << [true_rule1, true_rule2]
40
+ rule_set.rules += [true_rule1, true_rule2]
31
41
  rule_set.evaluate.should be_true
32
42
  end
33
43
 
34
44
  it 'returns false if any rules are false' do
35
- rule_set.rules << [true_rule1, false_rule1]
45
+ rule_set.rules += [true_rule1, false_rule1]
36
46
  rule_set.evaluate.should be_false
37
47
  end
38
48
  end
@@ -41,17 +51,17 @@ describe Rules::RuleSet do
41
51
  before { rule_set.evaluation_logic = 'any' }
42
52
 
43
53
  it 'returns true if all rules are true' do
44
- rule_set.rules << [true_rule1, true_rule2]
54
+ rule_set.rules += [true_rule1, true_rule2]
45
55
  rule_set.evaluate.should be_true
46
56
  end
47
57
 
48
58
  it 'returns true if a single rule is true' do
49
- rule_set.rules << [false_rule1, true_rule1]
59
+ rule_set.rules += [false_rule1, true_rule1]
50
60
  rule_set.evaluate.should be_true
51
61
  end
52
62
 
53
63
  it 'returns false if all rules are false' do
54
- rule_set.rules << [false_rule1, false_rule2]
64
+ rule_set.rules += [false_rule1, false_rule2]
55
65
  rule_set.evaluate.should be_false
56
66
  end
57
67
  end
@@ -2,81 +2,97 @@ require 'spec_helper'
2
2
 
3
3
  describe Rules::Rule do
4
4
  let(:rule_set) { Rules::RuleSet.new }
5
- let(:evaluator) { 'equals' }
5
+ let(:evaluator_key) { 'equals' }
6
6
  let(:lhs) { 'today' }
7
- let(:rhs) { Date.today.to_s }
7
+ let(:rhs_key) { 'today' }
8
+ let(:rhs_raw) { Date.today.to_s }
8
9
 
9
10
  describe 'validations' do
10
11
  it 'requires a valid evaluator' do
11
- rule = Rules::Rule.new(evaluator: 'fake', lhs_parameter: nil, rhs_parameter: nil)
12
+ rule = Rules::Rule.new(evaluator_key: 'fake')
12
13
  rule.should_not be_valid
13
- rule.errors[:evaluator].should include("is not included in the list")
14
+ rule.errors[:evaluator_key].should include("is not included in the list")
14
15
  end
15
16
 
16
17
  it 'requires a lhs parameter' do
17
- rule = Rules::Rule.new(evaluator: evaluator, lhs_parameter: nil, rhs_parameter: nil)
18
+ rule = Rules::Rule.new(evaluator_key: evaluator_key)
18
19
  rule.should_not be_valid
19
- rule.errors[:lhs_parameter].should include("is not included in the list")
20
+ rule.errors[:lhs_parameter_key].should include("is not a valid parameter")
20
21
  end
21
22
 
22
23
  it 'requires a valid lhs parameter' do
23
- rule = Rules::Rule.new(evaluator: evaluator, lhs_parameter: 'fake', rhs_parameter: nil)
24
+ rule = Rules::Rule.new(evaluator_key: evaluator_key, lhs_parameter_key: 'fake')
24
25
  rule.should_not be_valid
25
- rule.errors[:lhs_parameter].should include("is not included in the list")
26
+ rule.errors[:lhs_parameter_key].should include("is not a valid parameter")
26
27
  end
27
28
 
28
29
  it 'requires a rhs parameter if the evaluator requires one' do
29
- rule = Rules::Rule.new(evaluator: evaluator, lhs_parameter: lhs, rhs_parameter: nil)
30
+ rule = Rules::Rule.new(evaluator_key: evaluator_key, lhs_parameter_key: lhs)
30
31
  rule.should_not be_valid
31
- rule.errors[:rhs_parameter].should include("can't be blank")
32
+ rule.errors[:rhs_parameter_key].should include("can't be blank")
32
33
  end
33
34
 
34
- it 'require a blank rhs parameter if the evaluator does not require one' do
35
- rule = Rules::Rule.new(evaluator: 'nil', lhs_parameter: lhs, rhs_parameter: rhs)
35
+ it 'requires a blank rhs parameter if the evaluator does not require one' do
36
+ rule = Rules::Rule.new(evaluator_key: 'nil', lhs_parameter_key: lhs, rhs_parameter_raw: rhs_raw)
36
37
  rule.should_not be_valid
37
- rule.errors[:rhs_parameter].should include("must be blank for this evaluation method")
38
+ rule.errors[:rhs_parameter_raw].should include("must be blank")
39
+ end
40
+
41
+ it 'requires a valid rhs parameter key if provided' do
42
+ rule = Rules::Rule.new(evaluator_key: evaluator_key, lhs_parameter_key: lhs, rhs_parameter_key: 'fake')
43
+ rule.should_not be_valid
44
+ rule.errors[:rhs_parameter_key].should include("is not a valid parameter")
45
+ end
46
+
47
+ it 'requires that only one of the rhs parameter key or raw value are set' do
48
+ rule = Rules::Rule.new(evaluator_key: evaluator_key, lhs_parameter_key: lhs, rhs_parameter_key: rhs_key, rhs_parameter_raw: rhs_raw)
49
+ rule.should_not be_valid
50
+ rule.errors[:rhs_parameter_key].should include("must be blank")
38
51
  end
39
52
 
40
53
  it 'allows a lhs parameter with a valid constant key' do
41
- rule = Rules::Rule.new(evaluator: 'nil', lhs_parameter: 'today')
54
+ rule = Rules::Rule.new(evaluator_key: 'nil', lhs_parameter_key: 'today')
42
55
  rule.should be_valid
43
56
  end
44
57
 
45
58
  it 'allows a lhs parameter with a valid attribute key' do
46
59
  rule_set.stub(attributes: {current_user: 'The current user'})
47
- rule = Rules::Rule.new(rule_set: rule_set, evaluator: 'nil', lhs_parameter: 'current_user')
60
+ rule = Rules::Rule.new(rule_set: rule_set, evaluator_key: 'nil', lhs_parameter_key: 'current_user')
48
61
  rule.should be_valid
49
62
  end
50
63
 
51
64
  it 'is valid for well defined rules' do
52
- rule = Rules::Rule.new(evaluator: evaluator, lhs_parameter: lhs, rhs_parameter: rhs)
65
+ rule = Rules::Rule.new(evaluator_key: evaluator_key, lhs_parameter_key: lhs, rhs_parameter_raw: rhs_raw)
53
66
  rule.should be_valid
54
67
 
55
- rule = Rules::Rule.new(evaluator: 'nil', lhs_parameter: lhs, rhs_parameter: nil)
68
+ rule = Rules::Rule.new(evaluator_key: evaluator_key, lhs_parameter_key: lhs, rhs_parameter_key: rhs_key)
69
+ rule.should be_valid
70
+
71
+ rule = Rules::Rule.new(evaluator_key: 'nil', lhs_parameter_key: lhs)
56
72
  rule.should be_valid
57
73
  end
58
74
  end
59
75
 
60
- describe '#get_evaluator' do
76
+ describe '#evaluator' do
61
77
  it 'returns nil if an evaluator does not exist for a key' do
62
- rule = Rules::Rule.new(evaluator: 'fake')
63
- rule.get_evaluator.should be_nil
78
+ rule = Rules::Rule.new(evaluator_key: 'fake')
79
+ rule.evaluator.should be_nil
64
80
  end
65
81
 
66
82
  it 'returns the evaluator if an evaluator with the key exists' do
67
- rule = Rules::Rule.new(evaluator: evaluator)
68
- rule.get_evaluator.should be_kind_of(Rules::Evaluators::Evaluator)
83
+ rule = Rules::Rule.new(evaluator_key: evaluator_key)
84
+ rule.evaluator.should be_kind_of(Rules::Evaluators::Evaluator)
69
85
  end
70
86
  end
71
87
 
72
88
  describe '#lhs_parameter_value' do
73
89
  it 'returns nil if the parameter key does not have a corresponding attribute' do
74
- rule = Rules::Rule.new(lhs_parameter: 'fake')
90
+ rule = Rules::Rule.new(lhs_parameter_key: 'fake')
75
91
  rule.lhs_parameter_value.should be_nil
76
92
  end
77
93
 
78
94
  it 'returns the evaluated attribute for a constant key' do
79
- rule = Rules::Rule.new(lhs_parameter: 'today')
95
+ rule = Rules::Rule.new(lhs_parameter_key: 'today')
80
96
  rule.lhs_parameter_value.should == Time.now.utc.to_date
81
97
  end
82
98
 
@@ -85,86 +101,143 @@ describe Rules::Rule do
85
101
  current_user_attribute = Rules::Parameters::Attribute.new(key: :current_user, name: 'the current user')
86
102
  rule_set.stub(attributes: {current_user: current_user_attribute})
87
103
 
88
- rule = Rules::Rule.new(rule_set: rule_set, lhs_parameter: 'current_user')
104
+ rule = Rules::Rule.new(rule_set: rule_set, lhs_parameter_key: 'current_user')
89
105
 
90
106
  rule.lhs_parameter_value({
91
107
  current_user: current_user,
92
108
  current_price: 10
93
109
  }).should == current_user
94
110
  end
95
-
96
- it 'raises an error if the necessary attributes are not provided for an attribute' do
97
- current_user_attribute = Rules::Parameters::Attribute.new(key: :current_user, name: 'the current user')
98
- rule_set.stub(attributes: {current_user: current_user_attribute})
99
-
100
- rule = Rules::Rule.new(rule_set: rule_set, lhs_parameter: 'current_user')
101
-
102
- expect {
103
- rule.lhs_parameter_value(current_price: 10)
104
- }.to raise_error KeyError
105
- end
106
111
  end
107
112
 
108
113
  describe '#rhs_parameter_value' do
109
- it 'returns the original value of the lhs parameter does not require a cast' do
110
- rule = Rules::Rule.new(rhs_parameter: 'some string')
111
- rule.rhs_parameter_value.should == 'some string'
112
- end
113
-
114
- it 'raises an error for rhs parameters that can not be cast' do
115
- rule = Rules::Rule.new(lhs_parameter: 'today', rhs_parameter: 'four score and seven years ago')
116
- expect {
117
- rule.rhs_parameter_value
118
- }.to raise_error
114
+ context 'with a raw value' do
115
+ it 'returns the original value of the lhs parameter does not require a cast' do
116
+ rule = Rules::Rule.new(rhs_parameter_raw: 'some string')
117
+ rule.rhs_parameter_value.should == 'some string'
118
+ end
119
+
120
+ it 'raises an error for rhs parameters that can not be cast' do
121
+ rule = Rules::Rule.new(lhs_parameter_key: 'today', rhs_parameter_raw: 'four score and seven years ago')
122
+ expect {
123
+ rule.rhs_parameter_value
124
+ }.to raise_error
125
+ end
126
+
127
+ it 'casts the rhs parameter into the format required by the lhs parameter' do
128
+ rule = Rules::Rule.new(lhs_parameter_key: 'today', rhs_parameter_raw: '2012-01-01')
129
+ rule.rhs_parameter_value.should == Date.parse('2012-01-01')
130
+ end
131
+
132
+ it 'casts the rhs parameter into the format required by the evaluator' do
133
+ rule = Rules::Rule.new(evaluator_key: 'matches', rhs_parameter_raw: 'test$')
134
+ rule.rhs_parameter_value.should == Regexp.new('test$')
135
+ end
119
136
  end
120
137
 
121
- it 'casts the rhs parameter into the format required by the lhs parameter' do
122
- rule = Rules::Rule.new(lhs_parameter: 'today', rhs_parameter: '2012-01-01')
123
- rule.rhs_parameter_value.should == Date.parse('2012-01-01')
138
+ context 'with a parameter key' do
139
+ it 'returns nil if the parameter key does not have a corresponding attribute' do
140
+ rule = Rules::Rule.new(rhs_parameter_key: 'fake')
141
+ rule.rhs_parameter_value.should be_nil
142
+ end
143
+
144
+ it 'returns the evaluated attribute for a constant key' do
145
+ rule = Rules::Rule.new(rhs_parameter_key: 'today')
146
+ rule.rhs_parameter_value.should == Time.now.utc.to_date
147
+ end
148
+
149
+ it 'returns the right value for an attribute' do
150
+ current_user = mock('current user')
151
+ current_user_attribute = Rules::Parameters::Attribute.new(key: :current_user, name: 'the current user')
152
+ rule_set.stub(attributes: {current_user: current_user_attribute})
153
+
154
+ rule = Rules::Rule.new(rule_set: rule_set, rhs_parameter_key: 'current_user')
155
+
156
+ rule.rhs_parameter_value({
157
+ current_user: current_user,
158
+ current_price: 10
159
+ }).should == current_user
160
+ end
124
161
  end
125
162
  end
126
163
 
127
- describe '#lhs_parameter_object' do
164
+ describe '#lhs_parameter' do
128
165
  it 'returns nil if the parameter key does not have a corresponding attribute' do
129
- rule = Rules::Rule.new(lhs_parameter: 'fake')
130
- rule.lhs_parameter_object.should be_nil
166
+ rule = Rules::Rule.new(lhs_parameter_key: 'fake')
167
+ rule.lhs_parameter.should be_nil
131
168
  end
132
169
 
133
170
  it 'returns the constant for the parameter key if defined' do
134
- rule = Rules::Rule.new(lhs_parameter: lhs)
135
- rule.lhs_parameter_object.should be_kind_of(Rules::Parameters::Constant)
171
+ rule = Rules::Rule.new(lhs_parameter_key: lhs)
172
+ rule.lhs_parameter.should be_kind_of(Rules::Parameters::Constant)
136
173
  end
137
174
 
138
175
  it 'returns the attribute for the parameter key if defined' do
139
176
  rule_set.stub(attributes: {current_user: Rules::Parameters::Attribute.new(key: :current_user)})
140
- rule = Rules::Rule.new(rule_set: rule_set, lhs_parameter: 'current_user')
141
- rule.lhs_parameter_object.should be_kind_of(Rules::Parameters::Attribute)
177
+ rule = Rules::Rule.new(rule_set: rule_set, lhs_parameter_key: 'current_user')
178
+ rule.lhs_parameter.should be_kind_of(Rules::Parameters::Attribute)
179
+ end
180
+ end
181
+
182
+ describe '#rhs_parameter' do
183
+ context 'with a raw value' do
184
+ it 'returns the raw value' do
185
+ rule = Rules::Rule.new(rhs_parameter_raw: 'value')
186
+ rule.rhs_parameter.should == 'value'
187
+ end
188
+ end
189
+
190
+ context 'with a parameter key' do
191
+ it 'returns nil if the parameter key does not have a corresponding attribute' do
192
+ rule = Rules::Rule.new(rhs_parameter_key: 'fake')
193
+ rule.rhs_parameter.should be_nil
194
+ end
195
+
196
+ it 'returns the constant for the parameter key if defined' do
197
+ rule = Rules::Rule.new(rhs_parameter_key: rhs_key)
198
+ rule.rhs_parameter.should be_kind_of(Rules::Parameters::Constant)
199
+ end
200
+
201
+ it 'returns the attribute for the parameter key if defined' do
202
+ rule_set.stub(attributes: {current_user: Rules::Parameters::Attribute.new(key: :current_user)})
203
+ rule = Rules::Rule.new(rule_set: rule_set, rhs_parameter_key: 'current_user')
204
+ rule.rhs_parameter.should be_kind_of(Rules::Parameters::Attribute)
205
+ end
142
206
  end
143
207
  end
144
208
 
145
209
  describe '#evaluate' do
210
+ let(:email_attribute) { Rules::Parameters::Attribute.new(key: :email_address) }
211
+ let(:name_attribute) { Rules::Parameters::Attribute.new(key: :name) }
212
+
213
+ before { rule_set.stub(attributes: {email_address: email_attribute, name: name_attribute}) }
214
+
146
215
  it 'returns true for rules that meet the conditions' do
147
- rule = Rules::Rule.new(lhs_parameter: 'today', rhs_parameter: Time.now.utc.to_date, evaluator: 'equals')
216
+ rule = Rules::Rule.new(lhs_parameter_key: 'today', rhs_parameter_raw: Time.now.utc.to_date, evaluator_key: 'equals')
148
217
  rule.evaluate.should be_true
149
218
 
150
- rule = Rules::Rule.new(lhs_parameter: 'today', rhs_parameter: 2.weeks.ago.to_s, evaluator: 'not_equals')
219
+ rule = Rules::Rule.new(lhs_parameter_key: 'today', rhs_parameter_raw: 2.weeks.ago.to_s, evaluator_key: 'not_equals')
151
220
  rule.evaluate.should be_true
152
221
 
153
- rule_set.stub(attributes: {email_address: Rules::Parameters::Attribute.new(key: :email_address)})
154
- rule = Rules::Rule.new(lhs_parameter: :email_address, rhs_parameter: /example.com$/, evaluator: 'matches', rule_set: rule_set)
222
+ rule = Rules::Rule.new(lhs_parameter_key: :email_address, rhs_parameter_raw: /example.com$/, evaluator_key: 'matches', rule_set: rule_set)
155
223
  rule.evaluate(email_address: 'test@example.com').should be_true
224
+
225
+ rule = Rules::Rule.new(lhs_parameter_key: :email_address, rhs_parameter_key: :name, evaluator_key: 'contains', rule_set: rule_set)
226
+ rule.evaluate(email_address: 'sally@example.com', name: 'sally').should be_true
156
227
  end
157
228
 
158
229
  it 'returns false for rules that do not meet the conditions' do
159
- rule = Rules::Rule.new(lhs_parameter: 'today', rhs_parameter: Time.now.utc.to_date, evaluator: 'not_equals')
230
+ rule = Rules::Rule.new(lhs_parameter_key: 'today', rhs_parameter_raw: Time.now.utc.to_date, evaluator_key: 'not_equals')
160
231
  rule.evaluate.should be_false
161
232
 
162
- rule = Rules::Rule.new(lhs_parameter: 'today', rhs_parameter: 2.weeks.ago.to_s, evaluator: 'equals')
233
+ rule = Rules::Rule.new(lhs_parameter_key: 'today', rhs_parameter_raw: 2.weeks.ago.to_s, evaluator_key: 'equals')
163
234
  rule.evaluate.should be_false
164
235
 
165
- rule_set.stub(attributes: {email_address: Rules::Parameters::Attribute.new(key: :email_address)})
166
- rule = Rules::Rule.new(lhs_parameter: :email_address, rhs_parameter: /example.com$/, evaluator: 'not_matches', rule_set: rule_set)
167
- rule.evaluate(email_address: 'test@example.com').should be_false
236
+ rule = Rules::Rule.new(lhs_parameter_key: :email_address, rhs_parameter_raw: /example.com$/, evaluator_key: 'not_matches', rule_set: rule_set)
237
+ rule.evaluate(email_address: 'test@example.com').should be_false
238
+
239
+ rule = Rules::Rule.new(lhs_parameter_key: :email_address, rhs_parameter_key: :name, evaluator_key: 'contains', rule_set: rule_set)
240
+ rule.evaluate(email_address: 'sally@example.com', name: 'terry').should be_false
168
241
  end
169
242
  end
170
243