rules 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +40 -3
- data/db/migrate/20120831163952_create_rules.rb +1 -2
- data/lib/assets/javascripts/rules/active_admin.js +21 -0
- data/lib/rules.rb +11 -0
- data/lib/rules/config.rb +20 -0
- data/lib/rules/engine.rb +1 -0
- data/lib/rules/evaluators/definitions.rb +4 -2
- data/lib/rules/evaluators/evaluator.rb +8 -2
- data/lib/rules/extensions/active_admin/dsl.rb +32 -31
- data/lib/rules/extensions/active_model/absence_validator.rb +5 -0
- data/lib/rules/extensions/active_model/parameter_key_validator.rb +7 -0
- data/lib/rules/has_rules.rb +1 -1
- data/lib/rules/parameters.rb +1 -1
- data/lib/rules/parameters/attribute.rb +5 -8
- data/lib/rules/parameters/constant.rb +1 -14
- data/lib/rules/parameters/constant_definitions.rb +14 -15
- data/lib/rules/parameters/parameter.rb +39 -13
- data/lib/rules/rule.rb +85 -52
- data/lib/rules/rule_set.rb +53 -50
- data/lib/rules/version.rb +1 -1
- data/spec/dummy/app/assets/images/edit_example.png +0 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/migrate/{20120831163952_create_rules.rb → 20121029183622_create_rules.rules.rb} +2 -2
- data/spec/dummy/db/migrate/{20120831173835_create_rule_sets.rb → 20121029183623_create_rule_sets.rules.rb} +1 -0
- data/spec/dummy/db/schema.rb +74 -75
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +8405 -7718
- data/spec/dummy/log/test.log +6158 -282
- data/spec/dummy/script/rails +0 -0
- data/spec/dummy/tmp/cache/assets/C5F/0B0/sprockets%2F7b74141c7941d947343b6d7593e3761e +0 -0
- data/spec/dummy/tmp/cache/assets/C7B/E40/sprockets%2Fc629141780bbee6259a21437c1428a67 +0 -0
- data/spec/dummy/tmp/cache/assets/{C58/950/sprockets%2F615625588c137a1529206d80ee81fe93 → C84/1D0/sprockets%2F649513e42d02d9493f733015c1c8cf58} +0 -0
- data/spec/dummy/tmp/cache/assets/{D0B/EB0/sprockets%2Fa18a9144dadd3f628d2f061f91190d65 → C88/A50/sprockets%2F61269f1f7806037ed104f099517e4b6d} +0 -0
- data/spec/dummy/tmp/cache/assets/{E03/290/sprockets%2Fd469f86939a1cbd52d9b9aaf1db22dae → C9E/670/sprockets%2Ff47927ce03e3b12202e62552e11d911d} +0 -0
- data/spec/dummy/tmp/cache/assets/CAB/910/sprockets%2Fd55a96c4e70110aa337804446dd3983d +0 -0
- data/spec/dummy/tmp/cache/assets/CAE/360/sprockets%2F6039fb610c813f60e634a4782b4aa877 +0 -0
- data/spec/dummy/tmp/cache/assets/CB8/5D0/sprockets%2F5c94c5d562bcb216295496c26397c1d5 +0 -0
- data/spec/dummy/tmp/cache/assets/{CF9/580/sprockets%2F9b6f302133d13906b7d823b4ae14f0aa → CBB/6B0/sprockets%2F81c6f6d9206a39d8743c13c59f461f24} +0 -0
- data/spec/dummy/tmp/cache/assets/{CAD/F70/sprockets%2F5a1855f4cda19a255ffc802226735517 → CBC/7F0/sprockets%2F9c674dfe9e0f6503950e9212602fa198} +0 -0
- data/spec/dummy/tmp/cache/assets/CC4/300/sprockets%2Fc455e0353702d71fea6a99e9988763d2 +0 -0
- data/spec/dummy/tmp/cache/assets/{CA2/8F0/sprockets%2Fa283030e028b24b4ba4084e067888c3e → CCE/540/sprockets%2F7897a2f839c15d27739c478e5098cae3} +0 -0
- data/spec/dummy/tmp/cache/assets/{D11/FD0/sprockets%2Ff7129bbf85d84e8bc056543e20281e3b → CCF/A70/sprockets%2Ff84117614042da23eac1c3c1c95177d5} +0 -0
- data/spec/dummy/tmp/cache/assets/{DCE/350/sprockets%2F812b6c1998c5ad61096ae7b16cdaeeea → CCF/B30/sprockets%2Ff8e4785e47480d99304deb197af77716} +0 -0
- data/spec/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
- data/spec/dummy/tmp/cache/assets/CDB/040/sprockets%2Fc732474e67003a4eb840eb44c5ca9385 +0 -0
- data/spec/dummy/tmp/cache/assets/CE6/210/sprockets%2F65a1063d333cef4cc977b687c063f753 +0 -0
- data/spec/dummy/tmp/cache/assets/{D84/0C0/sprockets%2Fe48907efa9d3370f9a2f687a1a7b8d8d → D03/EA0/sprockets%2F58fba513bbd32d023349c0d57f396c22} +0 -0
- data/spec/dummy/tmp/cache/assets/{DD3/370/sprockets%2Ff23609d51b09058fdd08daeecfd7e5e3 → D1C/C00/sprockets%2Ff3e537b590d1e8c26ba67794ca9a2549} +0 -0
- data/spec/dummy/tmp/cache/assets/{CFE/5D0/sprockets%2F5e63c7f47b86e8916fe1b8f88f470370 → D1E/A20/sprockets%2F448a2575960df5788cb1b6347d9c4bfa} +0 -0
- data/spec/dummy/tmp/cache/assets/{D29/AE0/sprockets%2Fb62ea1b010afb027501b4f18b8dd3689 → D1F/7D0/sprockets%2F39f84da4e78a14f35fc2559b709218cf} +0 -0
- data/spec/dummy/tmp/cache/assets/D30/800/sprockets%2Fb5a31c56ce1b4444a1a1fb826c8881a6 +0 -0
- data/spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/spec/dummy/tmp/cache/assets/{CD0/AC0/sprockets%2F6f2c1b921c2b86e16aee3245772240c1 → D37/3D0/sprockets%2F3f693950778fef29f540ccf486789edb} +0 -0
- data/spec/dummy/tmp/cache/assets/D38/540/sprockets%2F86e1ad844bc9df4491a2a52b870421db +0 -0
- data/spec/dummy/tmp/cache/assets/D45/D90/sprockets%2F786ea0631bc7ab5a84183882f07cff7b +0 -0
- data/spec/dummy/tmp/cache/assets/D48/640/sprockets%2F9f4f18d910b678b1d0777e04cdaf6f24 +0 -0
- data/spec/dummy/tmp/cache/assets/{CB8/A30/sprockets%2Ff35759652c08bb7b3921c434d9ee1654 → D4D/0F0/sprockets%2Fe101ce9532cd7f637a3a889fee74291f} +0 -0
- data/spec/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/spec/dummy/tmp/cache/assets/{D72/9E0/sprockets%2Fdf58dccde6a5e1266ba5c386149108c6 → D52/DA0/sprockets%2F36936870fc1855efeb9d8119eec2ee41} +0 -0
- data/spec/dummy/tmp/cache/assets/{D9E/530/sprockets%2F8dbb0027bd9ce6b96c81b82bdec17814 → D54/0D0/sprockets%2F39d86b7fa34888e64af3993acc6e7c10} +0 -0
- data/spec/dummy/tmp/cache/assets/D59/D70/sprockets%2Fed9f0de1b65ae8d7ef89087c83728461 +0 -0
- data/spec/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/spec/dummy/tmp/cache/assets/{D41/AB0/sprockets%2Fd112ea59edbe4b7335549d814cb1d848 → D64/DB0/sprockets%2F7a3fd8bcc2642600f5ce0d5926e5be10} +0 -0
- data/spec/dummy/tmp/cache/assets/D66/7F0/sprockets%2F71eb5b2174c2bca8ed14955fd01c57a7 +0 -0
- data/spec/dummy/tmp/cache/assets/{D47/050/sprockets%2F237eeefd847c43be2e7810a77e80841b → D6F/450/sprockets%2F02efd499574bb3628cec534aee4b11e6} +0 -0
- data/spec/dummy/tmp/cache/assets/D75/770/sprockets%2Fa0501a374162cf29c8a9c8cecf678cf7 +0 -0
- data/spec/dummy/tmp/cache/assets/{C9B/B40/sprockets%2F29dc70cbda38311141464e041655de41 → D78/D80/sprockets%2F9930fb628d6fe577ab5707632a0dffbc} +0 -0
- data/spec/dummy/tmp/cache/assets/D7D/FA0/sprockets%2F4124a7757f7f9ca6ca072ae8ffd3269f +0 -0
- data/spec/dummy/tmp/cache/assets/D8D/970/sprockets%2Fccea3ce5a756eb6e3c61e246c121a730 +0 -0
- data/spec/dummy/tmp/cache/assets/D93/4C0/sprockets%2F857ecd2092cee11f740b3cf2e373ad2a +0 -0
- data/spec/dummy/tmp/cache/assets/{CE4/D80/sprockets%2Fd7f4b155b13ea1d8578693e62b0e6463 → D98/530/sprockets%2F6d51419c03c562d84be5ebfbe71b5a3e} +0 -0
- data/spec/dummy/tmp/cache/assets/D9A/960/sprockets%2F1b481cb0d9ea61f57a341cdc96fc823e +0 -0
- data/spec/dummy/tmp/cache/assets/DA1/DC0/sprockets%2F76c4315e48dbb2cb7e92dd5b8b7ab185 +0 -0
- data/spec/dummy/tmp/cache/assets/{D24/B00/sprockets%2F671d6f261d89a29e918b1ec7818db6a9 → DA5/DE0/sprockets%2F366c4e5e2d81e438b4e50bec5e4d88da} +0 -0
- data/spec/dummy/tmp/cache/assets/{CAC/4A0/sprockets%2F3d00565c9e04f1bd481d33b4f1985706 → DA9/C90/sprockets%2F5bdea8b6a1c99fff81a38fb37281f137} +0 -0
- data/spec/dummy/tmp/cache/assets/{DAA/990/sprockets%2F8e0ca45c660183bfe809afc1f69bf9a9 → DAB/4B0/sprockets%2F9b48d3d915c5ddf603344e595de1fbee} +0 -0
- data/spec/dummy/tmp/cache/assets/DB0/1D0/sprockets%2Fa89dd6f509b6ff2fc8d458d371da2c29 +0 -0
- data/spec/dummy/tmp/cache/assets/{CB2/140/sprockets%2F035ac84d6c64495d0067b926533f8bc3 → DC8/EB0/sprockets%2F8b8dc54ec9133ff2a2b8fc31b1c6da63} +0 -0
- data/spec/dummy/tmp/cache/assets/{D60/6C0/sprockets%2Fd7ef2595e5c50eb96e9d3c3d8698f481 → DD0/170/sprockets%2Fd9eb23a676ff2da1c29e2cb2f0ff4791} +0 -0
- data/spec/dummy/tmp/cache/assets/{D65/EE0/sprockets%2Fd9062d87143bb5c1d9d73c3ea02d7eb1 → DD5/380/sprockets%2Fb835ac5f9225cbc2e3c2c6669df46cee} +0 -0
- data/spec/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/spec/dummy/tmp/cache/assets/DDE/420/sprockets%2Ffb8b186d5bf0307f86f65fc787d2adeb +0 -0
- data/spec/dummy/tmp/cache/assets/DE6/000/sprockets%2F03f0d1a05d0ee270ce8acacef4233bf8 +0 -0
- data/spec/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/spec/dummy/tmp/cache/assets/{ECA/140/sprockets%2Fd8ebea8564753ddfde91fadbdacc9f5b → E21/900/sprockets%2F4013eebd9f4bf6b2870f0d7adbba4e1d} +0 -0
- data/spec/dummy/tmp/cache/sass/{40a0b76d82cd847e80571abbfe75b703bdb6b77f → 2086f86f19c1c7590bd3622023362d065fe06dd4}/active_admin.css.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{a28435efd4cb26f8ebc9e55bbaf23e3537a13190 → 35fba3f569e02e3ff55b98665f3046be151c4360}/_button.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{a28435efd4cb26f8ebc9e55bbaf23e3537a13190 → 35fba3f569e02e3ff55b98665f3046be151c4360}/_clearfix.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{a28435efd4cb26f8ebc9e55bbaf23e3537a13190 → 35fba3f569e02e3ff55b98665f3046be151c4360}/_font-face.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{a28435efd4cb26f8ebc9e55bbaf23e3537a13190 → 35fba3f569e02e3ff55b98665f3046be151c4360}/_font-family.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{a28435efd4cb26f8ebc9e55bbaf23e3537a13190 → 35fba3f569e02e3ff55b98665f3046be151c4360}/_hide-text.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{a28435efd4cb26f8ebc9e55bbaf23e3537a13190 → 35fba3f569e02e3ff55b98665f3046be151c4360}/_html5-input-types.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{a28435efd4cb26f8ebc9e55bbaf23e3537a13190 → 35fba3f569e02e3ff55b98665f3046be151c4360}/_position.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{a28435efd4cb26f8ebc9e55bbaf23e3537a13190 → 35fba3f569e02e3ff55b98665f3046be151c4360}/_timing-functions.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{ee5b745f862b39ff22bf2068a6582c3ee05d1a79 → 4498c5797b40d28956767b90fa545e9739e43edc}/_dashboard.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{ee5b745f862b39ff22bf2068a6582c3ee05d1a79 → 4498c5797b40d28956767b90fa545e9739e43edc}/_logged_out.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{597823364192c14f6a72ee20d1a1496a722ab1f2 → 4c643142bab3f2738bc6b6f785180a24ac1b79de}/_all.css.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{597823364192c14f6a72ee20d1a1496a722ab1f2 → 4c643142bab3f2738bc6b6f785180a24ac1b79de}/_buttons.css.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{597823364192c14f6a72ee20d1a1496a722ab1f2 → 4c643142bab3f2738bc6b6f785180a24ac1b79de}/_gradients.css.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{597823364192c14f6a72ee20d1a1496a722ab1f2 → 4c643142bab3f2738bc6b6f785180a24ac1b79de}/_icons.css.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{597823364192c14f6a72ee20d1a1496a722ab1f2 → 4c643142bab3f2738bc6b6f785180a24ac1b79de}/_reset.css.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{597823364192c14f6a72ee20d1a1496a722ab1f2 → 4c643142bab3f2738bc6b6f785180a24ac1b79de}/_rounded.css.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{597823364192c14f6a72ee20d1a1496a722ab1f2 → 4c643142bab3f2738bc6b6f785180a24ac1b79de}/_sections.css.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{597823364192c14f6a72ee20d1a1496a722ab1f2 → 4c643142bab3f2738bc6b6f785180a24ac1b79de}/_shadows.css.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{597823364192c14f6a72ee20d1a1496a722ab1f2 → 4c643142bab3f2738bc6b6f785180a24ac1b79de}/_typography.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{597823364192c14f6a72ee20d1a1496a722ab1f2 → 4c643142bab3f2738bc6b6f785180a24ac1b79de}/_utilities.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{597823364192c14f6a72ee20d1a1496a722ab1f2 → 4c643142bab3f2738bc6b6f785180a24ac1b79de}/_variables.css.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_batch_actions.css.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_blank_slates.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_breadcrumbs.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_buttons.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_columns.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_comments.css.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_date_picker.css.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_dropdown_menu.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_flash_messages.css.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_grid.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_links.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_pagination.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_panels.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_popovers.css.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_scopes.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_status_tags.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_table_tools.css.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{7f31076cc0ed50f35bd0098f8e2a34720ee15633 → 5d62cb9b998e0464beef8c02d6cedb219bafb98d}/_tables.css.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{bb2f93296c9b1e89237438ea63572f38aae290c3 → 9f77ade2a538829418bc2e2168a13e3c5e8d566e}/_deprecated-webkit-gradient.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{bb2f93296c9b1e89237438ea63572f38aae290c3 → 9f77ade2a538829418bc2e2168a13e3c5e8d566e}/_flex-grid.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{bb2f93296c9b1e89237438ea63572f38aae290c3 → 9f77ade2a538829418bc2e2168a13e3c5e8d566e}/_grid-width.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{bb2f93296c9b1e89237438ea63572f38aae290c3 → 9f77ade2a538829418bc2e2168a13e3c5e8d566e}/_linear-gradient.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{bb2f93296c9b1e89237438ea63572f38aae290c3 → 9f77ade2a538829418bc2e2168a13e3c5e8d566e}/_modular-scale.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{bb2f93296c9b1e89237438ea63572f38aae290c3 → 9f77ade2a538829418bc2e2168a13e3c5e8d566e}/_radial-gradient.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{bb2f93296c9b1e89237438ea63572f38aae290c3 → 9f77ade2a538829418bc2e2168a13e3c5e8d566e}/_render-gradients.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{bb2f93296c9b1e89237438ea63572f38aae290c3 → 9f77ade2a538829418bc2e2168a13e3c5e8d566e}/_tint-shade.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{bb2f93296c9b1e89237438ea63572f38aae290c3 → 9f77ade2a538829418bc2e2168a13e3c5e8d566e}/_transition-property-name.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{1a9fc2ebd62e6e7cb58441dc0293552ac07c99a9 → a500b9d7e9e6288c20d3d089871d43ac3aee2604}/_bourbon.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_animation.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_appearance.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_background-image.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_background-size.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_background.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_border-image.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_border-radius.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_box-shadow.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_box-sizing.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_columns.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_flex-box.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_inline-block.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_linear-gradient.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_prefixer.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_radial-gradient.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_transform.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_transition.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{da77e6f9a782ec4d4cbe7e3a439e89684c300b51 → b44994b8f6b8597cac35b9d162a52f9cd517eda4}/_user-select.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{6d594ee297c7ebeecae08432451ce722569d1a35 → d39759080a3787a3183222f58ca8294b28eca502}/_footer.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{6d594ee297c7ebeecae08432451ce722569d1a35 → d39759080a3787a3183222f58ca8294b28eca502}/_main_structure.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{6d594ee297c7ebeecae08432451ce722569d1a35 → d39759080a3787a3183222f58ca8294b28eca502}/_title_bar.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{89a136914378618e18c0f75bc8c0f78e84403b0f → ecc4c9317361a12ede9a49c29635837608d17540}/_base.css.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{89a136914378618e18c0f75bc8c0f78e84403b0f → ecc4c9317361a12ede9a49c29635837608d17540}/_forms.css.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{89a136914378618e18c0f75bc8c0f78e84403b0f → ecc4c9317361a12ede9a49c29635837608d17540}/_header.css.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{89a136914378618e18c0f75bc8c0f78e84403b0f → ecc4c9317361a12ede9a49c29635837608d17540}/_mixins.css.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{89a136914378618e18c0f75bc8c0f78e84403b0f → ecc4c9317361a12ede9a49c29635837608d17540}/_typography.css.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/{89a136914378618e18c0f75bc8c0f78e84403b0f → ecc4c9317361a12ede9a49c29635837608d17540}/print.css.scssc +0 -0
- data/spec/rules/evaluators/evaluator_spec.rb +36 -0
- data/spec/rules/parameters/attribute_spec.rb +20 -0
- data/spec/rules/rule_set_spec.rb +21 -11
- data/spec/rules/rule_spec.rb +138 -65
- metadata +262 -289
- data/spec/dummy/db/production.sqlite3 +0 -0
- data/spec/dummy/log/production.log +0 -74
- data/spec/dummy/tmp/cache/assets/C83/FF0/sprockets%2F75b536e9b6927c15b60310fa867e3613 +0 -0
- data/spec/dummy/tmp/cache/assets/C88/FD0/sprockets%2F6c558405457e9b59062515dc86bfa252 +0 -0
- data/spec/dummy/tmp/cache/assets/C99/A50/sprockets%2Ffd135176f584f5f5658ef48f41187352 +0 -0
- data/spec/dummy/tmp/cache/assets/C9F/2F0/sprockets%2Faf814c1513450b5466432d2a565ca5c6 +0 -0
- data/spec/dummy/tmp/cache/assets/CA7/860/sprockets%2F0b1c90a9344b3c3989fc2153d0d63193 +0 -0
- data/spec/dummy/tmp/cache/assets/CAE/DA0/sprockets%2F9a133e6ab132f569c40b5e82188f4290 +0 -0
- data/spec/dummy/tmp/cache/assets/CB2/920/sprockets%2F2db5288c0689b237264d0fb22b74d981 +0 -0
- data/spec/dummy/tmp/cache/assets/CCA/AE0/sprockets%2Ff80b892078268a51ddf973986035bf9d +0 -0
- data/spec/dummy/tmp/cache/assets/CE0/300/sprockets%2F79b0286bc0a316d639ed5f83b1d33763 +0 -0
- data/spec/dummy/tmp/cache/assets/CFD/B50/sprockets%2Fb21fb4d7213b3bf64d6317b3f22584b1 +0 -0
- data/spec/dummy/tmp/cache/assets/CFE/450/sprockets%2F088e843f7fffd845821822c7668a4d7e +0 -0
- data/spec/dummy/tmp/cache/assets/CFE/D50/sprockets%2Fc912074248a7b0bdc219a5eac3c52348 +0 -0
- data/spec/dummy/tmp/cache/assets/D0B/650/sprockets%2Fb66b60c6b42330849f5b7449bbe108bd +0 -0
- data/spec/dummy/tmp/cache/assets/D0E/820/sprockets%2F1611a9cc354f4e02c97d26b3c6ce7466 +0 -0
- data/spec/dummy/tmp/cache/assets/D38/5F0/sprockets%2F0c09a45e38408ec6e0e9caf206d5028d +0 -0
- data/spec/dummy/tmp/cache/assets/D3A/CE0/sprockets%2F238bf80bfbe1e2a5bb9280e62162584f +0 -0
- data/spec/dummy/tmp/cache/assets/D3B/000/sprockets%2F961758db39c6223d18ea6b7aeac400d5 +0 -0
- data/spec/dummy/tmp/cache/assets/D3B/F60/sprockets%2Ffd56cbfde039018718a0933340af6ef2 +0 -0
- data/spec/dummy/tmp/cache/assets/D48/0D0/sprockets%2F1ef4ab19f690478ac62ad77fcb284447 +0 -0
- data/spec/dummy/tmp/cache/assets/D65/B10/sprockets%2Fca02dba972b587d3a69b8c32c7200fc6 +0 -0
- data/spec/dummy/tmp/cache/assets/D66/2A0/sprockets%2F7b7cb56109acc9205fbbb792187ad04b +0 -0
- data/spec/dummy/tmp/cache/assets/D94/FA0/sprockets%2F8b190b3f72af75f09bfab1f354a0c37b +0 -0
- data/spec/dummy/tmp/cache/assets/D98/550/sprockets%2F69a91a7b4aca241c17daf6a78ac6845a +0 -0
- data/spec/dummy/tmp/cache/assets/DC1/C40/sprockets%2Fa8cbeabf3ef2d34b43be61671536f2a2 +0 -0
- data/spec/dummy/tmp/cache/assets/DC7/8B0/sprockets%2Ffad93382facdc50f097e26ebf19010ea +0 -0
- data/spec/dummy/tmp/cache/assets/DD7/6A0/sprockets%2Fd5b1cca8d0835fbe9957aa4ee5f8333e +0 -0
- data/spec/dummy/tmp/cache/assets/DD8/440/sprockets%2F7edf42cfb3ac43c7cd4f63c3980d7c86 +0 -0
- data/spec/dummy/tmp/cache/assets/DF5/270/sprockets%2Fc7f64f609aceac43da16557daacc421f +0 -0
- data/spec/dummy/tmp/cache/assets/DF5/410/sprockets%2Fd6efccfb4bfeb13ed0125e8c53424a65 +0 -0
- data/spec/dummy/tmp/cache/assets/DFF/180/sprockets%2Fdc24014f1fcc77f40c5e7de188ad8ebd +0 -0
- data/spec/dummy/tmp/cache/assets/E07/7C0/sprockets%2Fcc5def6ed69cb6a1b7f6084992ed3ca1 +0 -0
- data/spec/dummy/tmp/pids/server.pid +0 -1
data/spec/dummy/script/rails
CHANGED
File without changes
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
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
|
data/spec/rules/rule_set_spec.rb
CHANGED
@@ -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
|
11
|
-
Rules::RuleSet.attributes[FakeClass].should
|
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(
|
22
|
-
let(:true_rule2) { Rules::Rule.new(
|
23
|
-
let(:false_rule1) { Rules::Rule.new(
|
24
|
-
let(:false_rule2) { Rules::Rule.new(
|
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
|
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
|
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
|
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
|
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
|
64
|
+
rule_set.rules += [false_rule1, false_rule2]
|
55
65
|
rule_set.evaluate.should be_false
|
56
66
|
end
|
57
67
|
end
|
data/spec/rules/rule_spec.rb
CHANGED
@@ -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(:
|
5
|
+
let(:evaluator_key) { 'equals' }
|
6
6
|
let(:lhs) { 'today' }
|
7
|
-
let(:
|
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(
|
12
|
+
rule = Rules::Rule.new(evaluator_key: 'fake')
|
12
13
|
rule.should_not be_valid
|
13
|
-
rule.errors[:
|
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(
|
18
|
+
rule = Rules::Rule.new(evaluator_key: evaluator_key)
|
18
19
|
rule.should_not be_valid
|
19
|
-
rule.errors[:
|
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(
|
24
|
+
rule = Rules::Rule.new(evaluator_key: evaluator_key, lhs_parameter_key: 'fake')
|
24
25
|
rule.should_not be_valid
|
25
|
-
rule.errors[:
|
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(
|
30
|
+
rule = Rules::Rule.new(evaluator_key: evaluator_key, lhs_parameter_key: lhs)
|
30
31
|
rule.should_not be_valid
|
31
|
-
rule.errors[:
|
32
|
+
rule.errors[:rhs_parameter_key].should include("can't be blank")
|
32
33
|
end
|
33
34
|
|
34
|
-
it '
|
35
|
-
rule = Rules::Rule.new(
|
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[:
|
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(
|
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,
|
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(
|
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(
|
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 '#
|
76
|
+
describe '#evaluator' do
|
61
77
|
it 'returns nil if an evaluator does not exist for a key' do
|
62
|
-
rule = Rules::Rule.new(
|
63
|
-
rule.
|
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(
|
68
|
-
rule.
|
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(
|
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(
|
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,
|
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
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
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
|
-
|
122
|
-
|
123
|
-
|
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 '#
|
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(
|
130
|
-
rule.
|
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(
|
135
|
-
rule.
|
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,
|
141
|
-
rule.
|
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(
|
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(
|
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
|
-
|
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(
|
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(
|
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
|
-
|
166
|
-
rule
|
167
|
-
|
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
|
|