rules 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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