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.
- 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
|
|