rules_engine 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +20 -0
- data/README.rdoc +17 -0
- data/VERSION +1 -0
- data/init.rb +1 -0
- data/lib/rules_engine/cache.rb +26 -0
- data/lib/rules_engine/discovery.rb +51 -0
- data/lib/rules_engine/job_runner.rb +115 -0
- data/lib/rules_engine/rule.rb +60 -0
- data/lib/rules_engine/rule_outcome.rb +13 -0
- data/lib/rules_engine.rb +6 -0
- data/rails_generators/USAGE +68 -0
- data/rails_generators/blacklist_word.yml +6 -0
- data/rails_generators/blacklist_word_manifest.rb +26 -0
- data/rails_generators/generator.yml +58 -0
- data/rails_generators/generator_manifest.rb +282 -0
- data/rails_generators/rules_engine_generator.rb +35 -0
- data/rails_generators/simple.yml +6 -0
- data/rails_generators/simple_manifest.rb +21 -0
- data/rails_generators/template_manifest.rb +13 -0
- data/rails_generators/templates/app/controllers/re_jobs_controller.rb +18 -0
- data/rails_generators/templates/app/controllers/re_pipeline_jobs_controller.rb +17 -0
- data/rails_generators/templates/app/controllers/re_pipelines_controller.rb +143 -0
- data/rails_generators/templates/app/controllers/re_rules_controller.rb +140 -0
- data/rails_generators/templates/app/helpers/re_pipeline_helper.rb +29 -0
- data/rails_generators/templates/app/models/re_job.rb +123 -0
- data/rails_generators/templates/app/models/re_job_audit.rb +21 -0
- data/rails_generators/templates/app/models/re_pipeline.rb +69 -0
- data/rails_generators/templates/app/models/re_pipeline_activated.rb +26 -0
- data/rails_generators/templates/app/models/re_pipeline_activated_observer.rb +11 -0
- data/rails_generators/templates/app/models/re_pipeline_base.rb +68 -0
- data/rails_generators/templates/app/models/re_rule.rb +78 -0
- data/rails_generators/templates/app/models/re_rule_outcome.rb +40 -0
- data/rails_generators/templates/app/rules/blacklist_word.rb +89 -0
- data/rails_generators/templates/app/rules/simple.rb +44 -0
- data/rails_generators/templates/app/rules/template.rb +51 -0
- data/rails_generators/templates/app/views/layouts/_blockUI.html.erb +3 -0
- data/rails_generators/templates/app/views/re_jobs/_empty.html.erb +11 -0
- data/rails_generators/templates/app/views/re_jobs/_index.html.erb +66 -0
- data/rails_generators/templates/app/views/re_jobs/_show.html.erb +43 -0
- data/rails_generators/templates/app/views/re_jobs/index.html.erb +21 -0
- data/rails_generators/templates/app/views/re_jobs/index.js.erb +9 -0
- data/rails_generators/templates/app/views/re_jobs/show.html.erb +12 -0
- data/rails_generators/templates/app/views/re_jobs/show.js.erb +1 -0
- data/rails_generators/templates/app/views/re_pipeline_jobs/_empty.html.erb +11 -0
- data/rails_generators/templates/app/views/re_pipeline_jobs/_index.html.erb +41 -0
- data/rails_generators/templates/app/views/re_pipeline_jobs/index.html.erb +21 -0
- data/rails_generators/templates/app/views/re_pipeline_jobs/index.js.erb +10 -0
- data/rails_generators/templates/app/views/re_pipelines/_change.html.erb +46 -0
- data/rails_generators/templates/app/views/re_pipelines/_change_actions.html.erb +34 -0
- data/rails_generators/templates/app/views/re_pipelines/_confirm.html.erb +40 -0
- data/rails_generators/templates/app/views/re_pipelines/_edit.html.erb +21 -0
- data/rails_generators/templates/app/views/re_pipelines/_empty.html.erb +13 -0
- data/rails_generators/templates/app/views/re_pipelines/_index.html.erb +58 -0
- data/rails_generators/templates/app/views/re_pipelines/_new.html.erb +18 -0
- data/rails_generators/templates/app/views/re_pipelines/_show.html.erb +32 -0
- data/rails_generators/templates/app/views/re_pipelines/_show_actions.html.erb +3 -0
- data/rails_generators/templates/app/views/re_pipelines/change.html.erb +37 -0
- data/rails_generators/templates/app/views/re_pipelines/create.js.erb +8 -0
- data/rails_generators/templates/app/views/re_pipelines/edit.html.erb +11 -0
- data/rails_generators/templates/app/views/re_pipelines/edit.js.erb +5 -0
- data/rails_generators/templates/app/views/re_pipelines/index.html.erb +14 -0
- data/rails_generators/templates/app/views/re_pipelines/new.html.erb +9 -0
- data/rails_generators/templates/app/views/re_pipelines/new.js.erb +5 -0
- data/rails_generators/templates/app/views/re_pipelines/show.html.erb +41 -0
- data/rails_generators/templates/app/views/re_pipelines/update.js.erb +13 -0
- data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_edit.html.erb +7 -0
- data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_help.html.erb +2 -0
- data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_new.html.erb +7 -0
- data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_pipeline.html.erb +18 -0
- data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_script.html.erb +26 -0
- data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_title.html.erb +6 -0
- data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_word.html.erb +12 -0
- data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_words.html.erb +16 -0
- data/rails_generators/templates/app/views/re_rule_definitions/simple/_edit.html.erb +6 -0
- data/rails_generators/templates/app/views/re_rule_definitions/simple/_help.html.erb +2 -0
- data/rails_generators/templates/app/views/re_rule_definitions/simple/_new.html.erb +6 -0
- data/rails_generators/templates/app/views/re_rule_definitions/template/_edit.html.erb +6 -0
- data/rails_generators/templates/app/views/re_rule_definitions/template/_help.html.erb +2 -0
- data/rails_generators/templates/app/views/re_rule_definitions/template/_new.html.erb +6 -0
- data/rails_generators/templates/app/views/re_rules/_change.html.erb +57 -0
- data/rails_generators/templates/app/views/re_rules/_edit.html.erb +25 -0
- data/rails_generators/templates/app/views/re_rules/_empty.html.erb +12 -0
- data/rails_generators/templates/app/views/re_rules/_empty.js.erb +7 -0
- data/rails_generators/templates/app/views/re_rules/_error.html.erb +3 -0
- data/rails_generators/templates/app/views/re_rules/_help.html.erb +13 -0
- data/rails_generators/templates/app/views/re_rules/_index.html.erb +38 -0
- data/rails_generators/templates/app/views/re_rules/_menu.html.erb +41 -0
- data/rails_generators/templates/app/views/re_rules/_new.html.erb +26 -0
- data/rails_generators/templates/app/views/re_rules/_show.html.erb +43 -0
- data/rails_generators/templates/app/views/re_rules/destroy.js.erb +13 -0
- data/rails_generators/templates/app/views/re_rules/edit.html.erb +11 -0
- data/rails_generators/templates/app/views/re_rules/edit.js.erb +5 -0
- data/rails_generators/templates/app/views/re_rules/error.html.erb +11 -0
- data/rails_generators/templates/app/views/re_rules/error.js.erb +3 -0
- data/rails_generators/templates/app/views/re_rules/help.html.erb +11 -0
- data/rails_generators/templates/app/views/re_rules/help.js.erb +2 -0
- data/rails_generators/templates/app/views/re_rules/new.html.erb +11 -0
- data/rails_generators/templates/app/views/re_rules/new.js.erb +5 -0
- data/rails_generators/templates/app/views/re_rules/update.js.erb +20 -0
- data/rails_generators/templates/db/migrate/20100308225008_create_re_pipelines.rb +74 -0
- data/rails_generators/templates/lib/tasks/re_runner.rake +12 -0
- data/rails_generators/templates/public/images/re_job/error-14.png +0 -0
- data/rails_generators/templates/public/images/re_job/error-18.png +0 -0
- data/rails_generators/templates/public/images/re_job/error-25.png +0 -0
- data/rails_generators/templates/public/images/re_job/error-48.png +0 -0
- data/rails_generators/templates/public/images/re_job/goto-16.png +0 -0
- data/rails_generators/templates/public/images/re_job/info-14.png +0 -0
- data/rails_generators/templates/public/images/re_job/info-18.png +0 -0
- data/rails_generators/templates/public/images/re_job/info-25.png +0 -0
- data/rails_generators/templates/public/images/re_job/info-48.png +0 -0
- data/rails_generators/templates/public/images/re_job/list-14.png +0 -0
- data/rails_generators/templates/public/images/re_job/list-18.png +0 -0
- data/rails_generators/templates/public/images/re_job/list-25.png +0 -0
- data/rails_generators/templates/public/images/re_job/list-48.png +0 -0
- data/rails_generators/templates/public/images/re_job/loadingAnimation.gif +0 -0
- data/rails_generators/templates/public/images/re_job/next-disabled-14.png +0 -0
- data/rails_generators/templates/public/images/re_job/next-disabled-18.png +0 -0
- data/rails_generators/templates/public/images/re_job/next-disabled-25.png +0 -0
- data/rails_generators/templates/public/images/re_job/next-disabled-48.png +0 -0
- data/rails_generators/templates/public/images/re_job/next-enabled-14.png +0 -0
- data/rails_generators/templates/public/images/re_job/next-enabled-18.png +0 -0
- data/rails_generators/templates/public/images/re_job/next-enabled-25.png +0 -0
- data/rails_generators/templates/public/images/re_job/next-enabled-48.png +0 -0
- data/rails_generators/templates/public/images/re_job/prev-disabled-14.png +0 -0
- data/rails_generators/templates/public/images/re_job/prev-disabled-18.png +0 -0
- data/rails_generators/templates/public/images/re_job/prev-disabled-25.png +0 -0
- data/rails_generators/templates/public/images/re_job/prev-disabled-48.png +0 -0
- data/rails_generators/templates/public/images/re_job/prev-enabled-14.png +0 -0
- data/rails_generators/templates/public/images/re_job/prev-enabled-18.png +0 -0
- data/rails_generators/templates/public/images/re_job/prev-enabled-25.png +0 -0
- data/rails_generators/templates/public/images/re_job/prev-enabled-48.png +0 -0
- data/rails_generators/templates/public/images/re_job/success-14.png +0 -0
- data/rails_generators/templates/public/images/re_job/success-18.png +0 -0
- data/rails_generators/templates/public/images/re_job/success-25.png +0 -0
- data/rails_generators/templates/public/images/re_job/success-48.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/__destroy-14.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/__destroy-18.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/__destroy-25.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/__destroy-48.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/activate-14.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/activate-18.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/activate-25.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/activate-48.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/alert-14.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/alert-18.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/alert-25.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/alert-48.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/change-14.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/change-18.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/change-25.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/change-48.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/changed-14.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/changed-18.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/changed-25.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/changed-48.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/current-14.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/current-18.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/current-25.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/current-48.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/deactivate-14.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/deactivate-18.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/deactivate-25.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/deactivate-48.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/destroy-14.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/destroy-18.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/destroy-25.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/destroy-48.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/draft-14.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/draft-18.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/draft-25.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/draft-48.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/edit-14.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/edit-18.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/edit-25.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/edit-48.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/list-14.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/list-18.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/list-25.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/list-48.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/list-down.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/list-right.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/new-14.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/new-18.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/new-25.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/new-48.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/revert-14.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/revert-18.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/revert-25.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/revert-48.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/show-14.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/show-18.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/show-25.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/show-48.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/verify-14.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/verify-18.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/verify-25.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/verify-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule/__destroy-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule/__destroy-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule/__destroy-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule/__destroy-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule/destroy-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule/destroy-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule/destroy-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule/destroy-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule/edit-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule/edit-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule/edit-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule/edit-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule/goto-pipeline-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule/goto-pipeline-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-down-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-down-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-down-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-down-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-down-off-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-down-off-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-down-off-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-down-off-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-up-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-up-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-up-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-up-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-up-off-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-up-off-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-up-off-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-up-off-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule/next-change-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule/next-change-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule/next-change-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule/next-change-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule/next-show-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule/next-show-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule/next-show-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule/next-show-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule/stop-failure-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule/stop-failure-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule/stop-failure-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule/stop-failure-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule/stop-success-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule/stop-success-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule/stop-success-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule/stop-success-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule/valid-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule/valid-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule/valid-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule/valid-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule/verify-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule/verify-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule/verify-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule/verify-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule_class/add-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule_class/add-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule_class/add-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule_class/add-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule_class/help-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule_class/help-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule_class/help-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule_class/help-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule_class/list-down.png +0 -0
- data/rails_generators/templates/public/images/re_rule_class/list-right.png +0 -0
- data/rails_generators/templates/public/images/re_rule_class/new-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule_class/new-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule_class/new-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule_class/new-48.png +0 -0
- data/rails_generators/templates/public/javascripts/re_jobs.js +59 -0
- data/rails_generators/templates/public/javascripts/re_pipeline.js +54 -0
- data/rails_generators/templates/public/javascripts/re_pipeline_change.js +205 -0
- data/rails_generators/templates/public/javascripts/re_pipeline_index.js +24 -0
- data/rails_generators/templates/public/javascripts/re_pipeline_jobs.js +61 -0
- data/rails_generators/templates/public/javascripts/re_pipeline_new.js +34 -0
- data/rails_generators/templates/public/stylesheets/re_pipeline/accept.png +0 -0
- data/rails_generators/templates/public/stylesheets/re_pipeline/exclamation.png +0 -0
- data/rails_generators/templates/public/stylesheets/re_pipeline.css +509 -0
- data/rails_generators/templates/spec/controllers/re_pipelines_controller_spec.rb +111 -0
- data/rails_generators/templates/spec/models/re_job_audit_spec.rb +24 -0
- data/rails_generators/templates/spec/models/re_job_spec.rb +18 -0
- data/rails_generators/templates/spec/models/re_pipeline_activated_spec.rb +6 -0
- data/rails_generators/templates/spec/models/re_pipeline_base_spec.rb +157 -0
- data/rails_generators/templates/spec/models/re_pipeline_spec.rb +166 -0
- data/rails_generators/templates/spec/models/re_rule_outcome_spec.rb +97 -0
- data/rails_generators/templates/spec/models/re_rule_spec.rb +171 -0
- data/rails_generators/templates/spec/support/blueprint_re_pipelines.rb +11 -0
- data/spec/rules_engine_spec.rb +7 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +9 -0
- data/tasks/rspec.rake +18 -0
- metadata +363 -0
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Chris Douglas
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
= dougo_rules_engine
|
2
|
+
|
3
|
+
Description goes here.
|
4
|
+
|
5
|
+
== Note on Patches/Pull Requests
|
6
|
+
|
7
|
+
* Fork the project.
|
8
|
+
* Make your feature addition or bug fix.
|
9
|
+
* Add tests for it. This is important so I don't break it in a
|
10
|
+
future version unintentionally.
|
11
|
+
* Commit, do not mess with rakefile, version, or history.
|
12
|
+
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
13
|
+
* Send me a pull request. Bonus points for topic branches.
|
14
|
+
|
15
|
+
== Copyright
|
16
|
+
|
17
|
+
Copyright (c) 2010 Chris Douglas. See LICENSE for details.
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.1
|
data/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/lib/rules_engine")
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module RulesEngine
|
2
|
+
module Cache
|
3
|
+
# Configuration examples (MemoryStore is the default):
|
4
|
+
#
|
5
|
+
# RulesEngine::SelectorCache.cache_store = :memory_store
|
6
|
+
# RulesEngine::SelectorCache.cache_store = :file_store, "/path/to/cache/directory"
|
7
|
+
# RulesEngine::SelectorCache.cache_store = :drb_store, "druby://localhost:9192"
|
8
|
+
# RulesEngine::SelectorCache.cache_store = :mem_cache_store, "localhost"
|
9
|
+
# RulesEngine::SelectorCache.cache_store = MyOwnStore.new("parameter")
|
10
|
+
|
11
|
+
class << self
|
12
|
+
def perform_caching?
|
13
|
+
!@cache_store.nil?
|
14
|
+
end
|
15
|
+
|
16
|
+
def cache_store=(store_option)
|
17
|
+
@cache_store = ActiveSupport::Cache.lookup_store(store_option)
|
18
|
+
end
|
19
|
+
|
20
|
+
def cache_store
|
21
|
+
@cache_store
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module RulesEngine
|
2
|
+
##################################################################
|
3
|
+
class Discovery
|
4
|
+
|
5
|
+
RULES_PATH = File.expand_path(File.join(RAILS_ROOT, '/app/rules'))
|
6
|
+
@rule_classes = nil
|
7
|
+
@rule_groups = nil
|
8
|
+
|
9
|
+
class << self
|
10
|
+
def discover!
|
11
|
+
@rule_classes = []
|
12
|
+
@rule_groups = {}
|
13
|
+
|
14
|
+
Dir.glob("#{ RULES_PATH }/**/*.rb").each do |rule|
|
15
|
+
require rule
|
16
|
+
|
17
|
+
rule_class = Kernel.const_get(File.basename(rule, '.rb').classify)
|
18
|
+
@rule_classes << rule_class
|
19
|
+
|
20
|
+
group = rule_class.options[:group]
|
21
|
+
@rule_groups[group] = [] unless @rule_groups.include?(group)
|
22
|
+
@rule_groups[group] << rule_class
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
@rule_classes.sort! { |left, right| return left.to_s < right.to_s}
|
27
|
+
@rule_groups.each { |group, rule_classes| rule_classes.sort! { |left, right| return left.to_s < right.to_s} }
|
28
|
+
@rule_groups.each { |key, value| value.sort }
|
29
|
+
end
|
30
|
+
|
31
|
+
def rule_classes
|
32
|
+
throw Exception.new("RulesEngine::Discovery.discover! required in environment.rb") if @rule_classes.nil?
|
33
|
+
@rule_classes
|
34
|
+
end
|
35
|
+
|
36
|
+
def rule_groups
|
37
|
+
throw Exception.new("RulesEngine::Discovery.discover! required in environment.rb") if @rule_classes.nil?
|
38
|
+
@rule_groups
|
39
|
+
end
|
40
|
+
|
41
|
+
def rule_class(rule_class)
|
42
|
+
throw Exception.new("RulesEngine::Discovery.discover! required in environment.rb") if @rule_classes.nil?
|
43
|
+
@rule_classes.each do |rule|
|
44
|
+
return rule if rule.rule_class == rule_class
|
45
|
+
end
|
46
|
+
nil
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
@@ -0,0 +1,115 @@
|
|
1
|
+
module RulesEngine
|
2
|
+
class JobRunner
|
3
|
+
|
4
|
+
@@max_rules = 500
|
5
|
+
|
6
|
+
def self.create_job()
|
7
|
+
ReJob.create(:job_status => ReJob::JOB_STATUS_NONE).id
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.run_pipleine(re_job_id, pipeline_code, data = {})
|
11
|
+
rule_count = 0
|
12
|
+
done = false
|
13
|
+
error = false
|
14
|
+
|
15
|
+
re_job = ReJob.find_by_id(re_job_id)
|
16
|
+
re_job.update_attributes(:job_status => ReJob::JOB_STATUS_RUNNING) unless re_job.nil?
|
17
|
+
|
18
|
+
while (!done && rule_count < @@max_rules)
|
19
|
+
rule_count += 1
|
20
|
+
|
21
|
+
activated_pipeline = RePipelineActivated.find_by_code(pipeline_code)
|
22
|
+
unless activated_pipeline
|
23
|
+
audit_pipeline(re_job_id, nil, ReJobAudit::AUDIT_PIPELINE_END, false, "Pipleine #{pipeline_code} not found")
|
24
|
+
error = done = true
|
25
|
+
next
|
26
|
+
end
|
27
|
+
re_pipeline_id = activated_pipeline.re_pipeline.id
|
28
|
+
|
29
|
+
audit_pipeline(re_job_id, re_pipeline_id, ReJobAudit::AUDIT_PIPELINE_START, true, "Pipleine #{pipeline_code} started")
|
30
|
+
|
31
|
+
activated_pipeline.re_rules.each do | re_rule |
|
32
|
+
rule_class = RulesEngine::Discovery.rule_class(re_rule.rule_class)
|
33
|
+
unless rule_class
|
34
|
+
audit_pipeline(re_job_id, re_pipeline_id, ReJobAudit::AUDIT_PIPELINE_END, false, "Rule #{re_rule.rule_class} not found")
|
35
|
+
error = done = true
|
36
|
+
break
|
37
|
+
end
|
38
|
+
|
39
|
+
rule = rule_class.new
|
40
|
+
unless rule.load(re_rule)
|
41
|
+
audit_pipeline(re_job_id, re_pipeline_id, ReJobAudit::AUDIT_PIPELINE_END, false, "Rule #{re_rule.rule_class} cannot load")
|
42
|
+
error = done = true
|
43
|
+
break
|
44
|
+
end
|
45
|
+
|
46
|
+
audit_pipeline(re_job_id, re_pipeline_id, ReJobAudit::AUDIT_PIPELINE_INFO, true, "Rule #{re_rule.title} starting")
|
47
|
+
rule_outcome = rule.process(re_job_id, data)
|
48
|
+
audit_pipeline(re_job_id, re_pipeline_id, ReJobAudit::AUDIT_PIPELINE_INFO, true, "Rule #{re_rule.title} finished")
|
49
|
+
|
50
|
+
if !rule_outcome.nil? && rule_outcome.outcome == RulesEngine::RuleOutcome::OUTCOME_STOP_SUCCESS
|
51
|
+
audit_pipeline(re_job_id, re_pipeline_id, ReJobAudit::AUDIT_PIPELINE_END, true, "Pipeline #{pipeline_code} complete")
|
52
|
+
done = true
|
53
|
+
break
|
54
|
+
end
|
55
|
+
|
56
|
+
if !rule_outcome.nil? && rule_outcome.outcome == RulesEngine::RuleOutcome::OUTCOME_STOP_FAILURE
|
57
|
+
audit_pipeline(re_job_id, re_pipeline_id, ReJobAudit::AUDIT_PIPELINE_END, false, "Pipeline #{pipeline_code} complete")
|
58
|
+
error = done = true
|
59
|
+
break
|
60
|
+
end
|
61
|
+
|
62
|
+
if !rule_outcome.nil? && rule_outcome.outcome == RulesEngine::RuleOutcome::OUTCOME_START_PIPELINE
|
63
|
+
audit_pipeline(re_job_id, re_pipeline_id, ReJobAudit::AUDIT_PIPELINE_END, true, "Pipeline #{pipeline_code} complete")
|
64
|
+
pipeline_code = rule_outcome.pipeline_code
|
65
|
+
break
|
66
|
+
end
|
67
|
+
|
68
|
+
if activated_pipeline.re_rules[-1] == re_rule
|
69
|
+
audit_pipeline(re_job_id, re_pipeline_id, ReJobAudit::AUDIT_PIPELINE_END, true, "Pipeline #{pipeline_code} complete")
|
70
|
+
done = true
|
71
|
+
break
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
if rule_count >= @@max_rules
|
77
|
+
audit_pipeline(re_job_id, re_pipeline_id, ReJobAudit::AUDIT_PIPELINE_END, false, "Maximum pipeline depth #{@@max_rules} exceeded")
|
78
|
+
error = true
|
79
|
+
end
|
80
|
+
|
81
|
+
re_job.update_attributes(:job_status => error ? ReJob::JOB_STATUS_FAILED : ReJob::JOB_STATUS_SUCCESS) unless re_job.nil?
|
82
|
+
|
83
|
+
error
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.audit_pipeline(re_job_id, re_pipeline_id, code, success, message)
|
87
|
+
ReJobAudit.create({
|
88
|
+
:re_job_id => re_job_id,
|
89
|
+
:re_pipeline_id => re_pipeline_id,
|
90
|
+
:re_rule_id => nil,
|
91
|
+
:audit_date => Time.now,
|
92
|
+
:audit_code => code,
|
93
|
+
:audit_success => success,
|
94
|
+
:audit_data => message
|
95
|
+
});
|
96
|
+
|
97
|
+
puts "#{'*' * 5} #{re_job_id}, #{re_pipeline_id}, #{code} #{success}, #{message}"
|
98
|
+
end
|
99
|
+
|
100
|
+
def self.audit_rule(re_job_id, re_pipeline_id, re_rule_id, code, success, message)
|
101
|
+
ReJobAudit.create({
|
102
|
+
:re_job_id => re_job_id,
|
103
|
+
:re_pipeline_id => re_pipeline_id,
|
104
|
+
:re_rule_id => re_rule_id,
|
105
|
+
:audit_date => Time.now,
|
106
|
+
:audit_code => code,
|
107
|
+
:audit_success => success,
|
108
|
+
:audit_data => message
|
109
|
+
});
|
110
|
+
|
111
|
+
puts "#{'*' * 10} #{re_job_id}, #{re_pipeline_id}, #{re_rule_id}, #{rule_title}, #{success}, #{message}"
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module RulesEngine
|
2
|
+
class Rule
|
3
|
+
class_inheritable_accessor :options
|
4
|
+
@@options = {}
|
5
|
+
|
6
|
+
def self.inherited(base)
|
7
|
+
base.extend(ClassMethods)
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
def rule_class
|
12
|
+
self.to_s
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
##################################################################
|
17
|
+
def attributes=(params)
|
18
|
+
end
|
19
|
+
|
20
|
+
def valid?
|
21
|
+
true
|
22
|
+
end
|
23
|
+
|
24
|
+
def errors
|
25
|
+
@errors ||= []
|
26
|
+
return @errors
|
27
|
+
end
|
28
|
+
|
29
|
+
def load(re_rule)
|
30
|
+
true
|
31
|
+
end
|
32
|
+
|
33
|
+
def save(re_rule)
|
34
|
+
re_rule.rule_class = self.class.rule_class
|
35
|
+
true
|
36
|
+
end
|
37
|
+
|
38
|
+
def after_create(re_rule)
|
39
|
+
end
|
40
|
+
|
41
|
+
def after_update(re_rule)
|
42
|
+
end
|
43
|
+
|
44
|
+
def before_destroy(re_rule)
|
45
|
+
end
|
46
|
+
|
47
|
+
##################################################################
|
48
|
+
# return an RulesEngine::RuleOutcome object to define what to do next
|
49
|
+
# or nil to continue to the next rule
|
50
|
+
def process(job_id, data)
|
51
|
+
rule_outcome = RulesEngine::RuleOutcome.new
|
52
|
+
|
53
|
+
rule_outcome.outcome = RulesEngine::RuleOutcome::OUTCOME_NEXT
|
54
|
+
# rule_outcome.pipeline_code =
|
55
|
+
|
56
|
+
rule_outcome
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
data/lib/rules_engine.rb
ADDED
@@ -0,0 +1,6 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/rules_engine/discovery")
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + "/rules_engine/rule")
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + "/rules_engine/cache")
|
4
|
+
require File.expand_path(File.dirname(__FILE__) + "/rules_engine/job_runner")
|
5
|
+
|
6
|
+
|
@@ -0,0 +1,68 @@
|
|
1
|
+
sudo gem install dougo_view_helpers dougo_model_helpers dougo_user_helpers
|
2
|
+
sudo gem install will_paginate acts_as_list
|
3
|
+
|
4
|
+
Download and Install 'jquery.autocomplete.pack.js' into the public/javascripts directory
|
5
|
+
Download and Install 'jquery.blockUI.js' into the public/javascripts directory
|
6
|
+
Download and Install 'thickbox.js' into the public/javascripts directory
|
7
|
+
|
8
|
+
*** RUN ./script/generate dougo_view_helpers
|
9
|
+
*** RUN ./script/generate dougo_user_helpers
|
10
|
+
- FOLLOW INSTRUCTIONS
|
11
|
+
|
12
|
+
*** EDIT config/environment.rb
|
13
|
+
|
14
|
+
Rails::Initializer.run do |config|
|
15
|
+
...
|
16
|
+
config.gem 'rules_engine'
|
17
|
+
config.gem 'acts_as_list'
|
18
|
+
...
|
19
|
+
|
20
|
+
config.active_record.observers = :re_pipeline_activated_observer
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
RulesEngine::Discovery.discover!
|
25
|
+
|
26
|
+
ActionController::Base.define_access_level(:editor, 10)
|
27
|
+
ActionController::Base.define_access_level(:reader, 9)
|
28
|
+
|
29
|
+
*** EDIT config/environments/production.rb
|
30
|
+
*** EDIT config/environments/development.rb
|
31
|
+
*** EDIT config/environments/test.rb
|
32
|
+
|
33
|
+
RulesEngine::Cache.cache_store = :mem_cache_store, "localhost:11210"
|
34
|
+
# RulesEngine::Cache.cache_store = :mem_cache_store, "localhost:11210"
|
35
|
+
# RulesEngine::Cache.cache_store = :memory_store
|
36
|
+
# RulesEngine::Cache.cache_store = :file_store, "/path/to/cache/directory"
|
37
|
+
# RulesEngine::Cache.cache_store = :drb_store, "druby://localhost:9192"
|
38
|
+
# RulesEngine::Cache.cache_store = :mem_cache_store, "localhost"
|
39
|
+
# RulesEngine::Cache.cache_store = MyOwnStore.new("parameter")
|
40
|
+
|
41
|
+
|
42
|
+
*** EDIT config/routes.rb
|
43
|
+
|
44
|
+
ActionController::Routing::Routes.draw do |map|
|
45
|
+
...
|
46
|
+
map.resources :re_pipelines, :collection => {:lookup => :get}, :member => {:change => :get, :activate => :put, :deactivate => :put, :revert => :put} do |re_pipeline|
|
47
|
+
re_pipeline.resources :re_rules, :collection => {:help => :get, :error => :get}, :member => {:move_up => :put, :move_down => :put}
|
48
|
+
re_pipeline.resources :re_jobs, :controller => :re_pipeline_jobs, :only => [:index]
|
49
|
+
end
|
50
|
+
|
51
|
+
map.resources :re_jobs, :only => [:index, :show]
|
52
|
+
...
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
*** EDIT application.html.erb
|
57
|
+
<%= javascript_include_tag ... , 'jquery.blockUI', 'jquery.autocomplete.pack', 'thickbox', 're_pipeline', :cache => true %>
|
58
|
+
<%= stylesheet_link_tag ... , 'thickbox', 'jquery.autocomplete', 're_pipeline', :cache => true %>
|
59
|
+
...
|
60
|
+
</head>
|
61
|
+
<body>
|
62
|
+
...
|
63
|
+
<%= render :partial => '/layouts/blockUI' %>
|
64
|
+
</body>
|
65
|
+
|
66
|
+
*** RUN rake db:migrate
|
67
|
+
|
68
|
+
restart app and goto http://localhost:3000/re_pipelines
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class BlacklistWordManifest
|
2
|
+
def self.populate_record(m)
|
3
|
+
|
4
|
+
%w(
|
5
|
+
app/rules
|
6
|
+
app/views/re_rule_definitions/blacklist_word
|
7
|
+
).each do |dirname|
|
8
|
+
m.directory dirname
|
9
|
+
end
|
10
|
+
|
11
|
+
%w(
|
12
|
+
app/rules/blacklist_word.rb
|
13
|
+
app/views/re_rule_definitions/blacklist_word/_pipeline.html.erb
|
14
|
+
app/views/re_rule_definitions/blacklist_word/_title.html.erb
|
15
|
+
app/views/re_rule_definitions/blacklist_word/_new.html.erb
|
16
|
+
app/views/re_rule_definitions/blacklist_word/_help.html.erb
|
17
|
+
app/views/re_rule_definitions/blacklist_word/_word.html.erb
|
18
|
+
app/views/re_rule_definitions/blacklist_word/_script.html.erb
|
19
|
+
app/views/re_rule_definitions/blacklist_word/_edit.html.erb
|
20
|
+
app/views/re_rule_definitions/blacklist_word/_words.html.erb
|
21
|
+
).each do |filename|
|
22
|
+
m.file filename, filename
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
directories :
|
2
|
+
- app/views/re_pipelines
|
3
|
+
- app/views/re_rules
|
4
|
+
- app/views/re_jobs
|
5
|
+
- app/views/re_pipeline_jobs
|
6
|
+
- public/stylesheets/re_pipeline
|
7
|
+
- public/images/re_pipeline
|
8
|
+
- public/images/re_rule
|
9
|
+
- public/images/re_rule_class
|
10
|
+
- public/images/re_job
|
11
|
+
|
12
|
+
|
13
|
+
files :
|
14
|
+
- app/controllers/re_pipelines_controller.rb
|
15
|
+
- app/controllers/re_rules_controller.rb
|
16
|
+
- app/controllers/re_jobs_controller.rb
|
17
|
+
- app/controllers/re_pipeline_jobs_controller.rb
|
18
|
+
|
19
|
+
- app/helpers/re_pipeline_helper.rb
|
20
|
+
|
21
|
+
- app/models/re_pipeline.rb
|
22
|
+
- app/models/re_pipeline_activated.rb
|
23
|
+
- app/models/re_pipeline_activated_observer.rb
|
24
|
+
- app/models/re_pipeline_base.rb
|
25
|
+
- app/models/re_rule.rb
|
26
|
+
- app/models/re_rule_outcome.rb
|
27
|
+
- app/models/re_job.rb
|
28
|
+
- app/models/re_job_audit.rb
|
29
|
+
|
30
|
+
- app/views/layouts/_blockUI.html.erb
|
31
|
+
|
32
|
+
- db/migrate/20100308225008_create_re_pipelines.rb
|
33
|
+
|
34
|
+
- lib/tasks/re_runner.rake
|
35
|
+
|
36
|
+
- public/javascripts/re_pipeline.js
|
37
|
+
- public/javascripts/re_pipeline_change.js
|
38
|
+
- public/javascripts/re_pipeline_index.js
|
39
|
+
- public/javascripts/re_pipeline_new.js
|
40
|
+
- public/javascripts/re_pipeline_jobs.js
|
41
|
+
- public/javascripts/re_jobs.js
|
42
|
+
|
43
|
+
- public/stylesheets/re_pipeline.css
|
44
|
+
- public/stylesheets/re_pipeline/accept.png
|
45
|
+
- public/stylesheets/re_pipeline/exclamation.png
|
46
|
+
|
47
|
+
- spec/controllers/re_pipelines_controller_spec.rb
|
48
|
+
|
49
|
+
- spec/models/re_pipeline_base_spec.rb
|
50
|
+
- spec/models/re_pipeline_spec.rb
|
51
|
+
- spec/models/re_pipeline_activated_spec.rb
|
52
|
+
- spec/models/re_rule_spec.rb
|
53
|
+
- spec/models/re_rule_outcome_spec.rb
|
54
|
+
- spec/models/re_job_spec.rb
|
55
|
+
- spec/models/re_job_audit_spec.rb
|
56
|
+
|
57
|
+
- spec/support/blueprint_re_pipelines.rb
|
58
|
+
|