rules_engine 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (288) hide show
  1. data/LICENSE +20 -0
  2. data/README.rdoc +17 -0
  3. data/VERSION +1 -0
  4. data/init.rb +1 -0
  5. data/lib/rules_engine/cache.rb +26 -0
  6. data/lib/rules_engine/discovery.rb +51 -0
  7. data/lib/rules_engine/job_runner.rb +115 -0
  8. data/lib/rules_engine/rule.rb +60 -0
  9. data/lib/rules_engine/rule_outcome.rb +13 -0
  10. data/lib/rules_engine.rb +6 -0
  11. data/rails_generators/USAGE +68 -0
  12. data/rails_generators/blacklist_word.yml +6 -0
  13. data/rails_generators/blacklist_word_manifest.rb +26 -0
  14. data/rails_generators/generator.yml +58 -0
  15. data/rails_generators/generator_manifest.rb +282 -0
  16. data/rails_generators/rules_engine_generator.rb +35 -0
  17. data/rails_generators/simple.yml +6 -0
  18. data/rails_generators/simple_manifest.rb +21 -0
  19. data/rails_generators/template_manifest.rb +13 -0
  20. data/rails_generators/templates/app/controllers/re_jobs_controller.rb +18 -0
  21. data/rails_generators/templates/app/controllers/re_pipeline_jobs_controller.rb +17 -0
  22. data/rails_generators/templates/app/controllers/re_pipelines_controller.rb +143 -0
  23. data/rails_generators/templates/app/controllers/re_rules_controller.rb +140 -0
  24. data/rails_generators/templates/app/helpers/re_pipeline_helper.rb +29 -0
  25. data/rails_generators/templates/app/models/re_job.rb +123 -0
  26. data/rails_generators/templates/app/models/re_job_audit.rb +21 -0
  27. data/rails_generators/templates/app/models/re_pipeline.rb +69 -0
  28. data/rails_generators/templates/app/models/re_pipeline_activated.rb +26 -0
  29. data/rails_generators/templates/app/models/re_pipeline_activated_observer.rb +11 -0
  30. data/rails_generators/templates/app/models/re_pipeline_base.rb +68 -0
  31. data/rails_generators/templates/app/models/re_rule.rb +78 -0
  32. data/rails_generators/templates/app/models/re_rule_outcome.rb +40 -0
  33. data/rails_generators/templates/app/rules/blacklist_word.rb +89 -0
  34. data/rails_generators/templates/app/rules/simple.rb +44 -0
  35. data/rails_generators/templates/app/rules/template.rb +51 -0
  36. data/rails_generators/templates/app/views/layouts/_blockUI.html.erb +3 -0
  37. data/rails_generators/templates/app/views/re_jobs/_empty.html.erb +11 -0
  38. data/rails_generators/templates/app/views/re_jobs/_index.html.erb +66 -0
  39. data/rails_generators/templates/app/views/re_jobs/_show.html.erb +43 -0
  40. data/rails_generators/templates/app/views/re_jobs/index.html.erb +21 -0
  41. data/rails_generators/templates/app/views/re_jobs/index.js.erb +9 -0
  42. data/rails_generators/templates/app/views/re_jobs/show.html.erb +12 -0
  43. data/rails_generators/templates/app/views/re_jobs/show.js.erb +1 -0
  44. data/rails_generators/templates/app/views/re_pipeline_jobs/_empty.html.erb +11 -0
  45. data/rails_generators/templates/app/views/re_pipeline_jobs/_index.html.erb +41 -0
  46. data/rails_generators/templates/app/views/re_pipeline_jobs/index.html.erb +21 -0
  47. data/rails_generators/templates/app/views/re_pipeline_jobs/index.js.erb +10 -0
  48. data/rails_generators/templates/app/views/re_pipelines/_change.html.erb +46 -0
  49. data/rails_generators/templates/app/views/re_pipelines/_change_actions.html.erb +34 -0
  50. data/rails_generators/templates/app/views/re_pipelines/_confirm.html.erb +40 -0
  51. data/rails_generators/templates/app/views/re_pipelines/_edit.html.erb +21 -0
  52. data/rails_generators/templates/app/views/re_pipelines/_empty.html.erb +13 -0
  53. data/rails_generators/templates/app/views/re_pipelines/_index.html.erb +58 -0
  54. data/rails_generators/templates/app/views/re_pipelines/_new.html.erb +18 -0
  55. data/rails_generators/templates/app/views/re_pipelines/_show.html.erb +32 -0
  56. data/rails_generators/templates/app/views/re_pipelines/_show_actions.html.erb +3 -0
  57. data/rails_generators/templates/app/views/re_pipelines/change.html.erb +37 -0
  58. data/rails_generators/templates/app/views/re_pipelines/create.js.erb +8 -0
  59. data/rails_generators/templates/app/views/re_pipelines/edit.html.erb +11 -0
  60. data/rails_generators/templates/app/views/re_pipelines/edit.js.erb +5 -0
  61. data/rails_generators/templates/app/views/re_pipelines/index.html.erb +14 -0
  62. data/rails_generators/templates/app/views/re_pipelines/new.html.erb +9 -0
  63. data/rails_generators/templates/app/views/re_pipelines/new.js.erb +5 -0
  64. data/rails_generators/templates/app/views/re_pipelines/show.html.erb +41 -0
  65. data/rails_generators/templates/app/views/re_pipelines/update.js.erb +13 -0
  66. data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_edit.html.erb +7 -0
  67. data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_help.html.erb +2 -0
  68. data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_new.html.erb +7 -0
  69. data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_pipeline.html.erb +18 -0
  70. data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_script.html.erb +26 -0
  71. data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_title.html.erb +6 -0
  72. data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_word.html.erb +12 -0
  73. data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_words.html.erb +16 -0
  74. data/rails_generators/templates/app/views/re_rule_definitions/simple/_edit.html.erb +6 -0
  75. data/rails_generators/templates/app/views/re_rule_definitions/simple/_help.html.erb +2 -0
  76. data/rails_generators/templates/app/views/re_rule_definitions/simple/_new.html.erb +6 -0
  77. data/rails_generators/templates/app/views/re_rule_definitions/template/_edit.html.erb +6 -0
  78. data/rails_generators/templates/app/views/re_rule_definitions/template/_help.html.erb +2 -0
  79. data/rails_generators/templates/app/views/re_rule_definitions/template/_new.html.erb +6 -0
  80. data/rails_generators/templates/app/views/re_rules/_change.html.erb +57 -0
  81. data/rails_generators/templates/app/views/re_rules/_edit.html.erb +25 -0
  82. data/rails_generators/templates/app/views/re_rules/_empty.html.erb +12 -0
  83. data/rails_generators/templates/app/views/re_rules/_empty.js.erb +7 -0
  84. data/rails_generators/templates/app/views/re_rules/_error.html.erb +3 -0
  85. data/rails_generators/templates/app/views/re_rules/_help.html.erb +13 -0
  86. data/rails_generators/templates/app/views/re_rules/_index.html.erb +38 -0
  87. data/rails_generators/templates/app/views/re_rules/_menu.html.erb +41 -0
  88. data/rails_generators/templates/app/views/re_rules/_new.html.erb +26 -0
  89. data/rails_generators/templates/app/views/re_rules/_show.html.erb +43 -0
  90. data/rails_generators/templates/app/views/re_rules/destroy.js.erb +13 -0
  91. data/rails_generators/templates/app/views/re_rules/edit.html.erb +11 -0
  92. data/rails_generators/templates/app/views/re_rules/edit.js.erb +5 -0
  93. data/rails_generators/templates/app/views/re_rules/error.html.erb +11 -0
  94. data/rails_generators/templates/app/views/re_rules/error.js.erb +3 -0
  95. data/rails_generators/templates/app/views/re_rules/help.html.erb +11 -0
  96. data/rails_generators/templates/app/views/re_rules/help.js.erb +2 -0
  97. data/rails_generators/templates/app/views/re_rules/new.html.erb +11 -0
  98. data/rails_generators/templates/app/views/re_rules/new.js.erb +5 -0
  99. data/rails_generators/templates/app/views/re_rules/update.js.erb +20 -0
  100. data/rails_generators/templates/db/migrate/20100308225008_create_re_pipelines.rb +74 -0
  101. data/rails_generators/templates/lib/tasks/re_runner.rake +12 -0
  102. data/rails_generators/templates/public/images/re_job/error-14.png +0 -0
  103. data/rails_generators/templates/public/images/re_job/error-18.png +0 -0
  104. data/rails_generators/templates/public/images/re_job/error-25.png +0 -0
  105. data/rails_generators/templates/public/images/re_job/error-48.png +0 -0
  106. data/rails_generators/templates/public/images/re_job/goto-16.png +0 -0
  107. data/rails_generators/templates/public/images/re_job/info-14.png +0 -0
  108. data/rails_generators/templates/public/images/re_job/info-18.png +0 -0
  109. data/rails_generators/templates/public/images/re_job/info-25.png +0 -0
  110. data/rails_generators/templates/public/images/re_job/info-48.png +0 -0
  111. data/rails_generators/templates/public/images/re_job/list-14.png +0 -0
  112. data/rails_generators/templates/public/images/re_job/list-18.png +0 -0
  113. data/rails_generators/templates/public/images/re_job/list-25.png +0 -0
  114. data/rails_generators/templates/public/images/re_job/list-48.png +0 -0
  115. data/rails_generators/templates/public/images/re_job/loadingAnimation.gif +0 -0
  116. data/rails_generators/templates/public/images/re_job/next-disabled-14.png +0 -0
  117. data/rails_generators/templates/public/images/re_job/next-disabled-18.png +0 -0
  118. data/rails_generators/templates/public/images/re_job/next-disabled-25.png +0 -0
  119. data/rails_generators/templates/public/images/re_job/next-disabled-48.png +0 -0
  120. data/rails_generators/templates/public/images/re_job/next-enabled-14.png +0 -0
  121. data/rails_generators/templates/public/images/re_job/next-enabled-18.png +0 -0
  122. data/rails_generators/templates/public/images/re_job/next-enabled-25.png +0 -0
  123. data/rails_generators/templates/public/images/re_job/next-enabled-48.png +0 -0
  124. data/rails_generators/templates/public/images/re_job/prev-disabled-14.png +0 -0
  125. data/rails_generators/templates/public/images/re_job/prev-disabled-18.png +0 -0
  126. data/rails_generators/templates/public/images/re_job/prev-disabled-25.png +0 -0
  127. data/rails_generators/templates/public/images/re_job/prev-disabled-48.png +0 -0
  128. data/rails_generators/templates/public/images/re_job/prev-enabled-14.png +0 -0
  129. data/rails_generators/templates/public/images/re_job/prev-enabled-18.png +0 -0
  130. data/rails_generators/templates/public/images/re_job/prev-enabled-25.png +0 -0
  131. data/rails_generators/templates/public/images/re_job/prev-enabled-48.png +0 -0
  132. data/rails_generators/templates/public/images/re_job/success-14.png +0 -0
  133. data/rails_generators/templates/public/images/re_job/success-18.png +0 -0
  134. data/rails_generators/templates/public/images/re_job/success-25.png +0 -0
  135. data/rails_generators/templates/public/images/re_job/success-48.png +0 -0
  136. data/rails_generators/templates/public/images/re_pipeline/__destroy-14.png +0 -0
  137. data/rails_generators/templates/public/images/re_pipeline/__destroy-18.png +0 -0
  138. data/rails_generators/templates/public/images/re_pipeline/__destroy-25.png +0 -0
  139. data/rails_generators/templates/public/images/re_pipeline/__destroy-48.png +0 -0
  140. data/rails_generators/templates/public/images/re_pipeline/activate-14.png +0 -0
  141. data/rails_generators/templates/public/images/re_pipeline/activate-18.png +0 -0
  142. data/rails_generators/templates/public/images/re_pipeline/activate-25.png +0 -0
  143. data/rails_generators/templates/public/images/re_pipeline/activate-48.png +0 -0
  144. data/rails_generators/templates/public/images/re_pipeline/alert-14.png +0 -0
  145. data/rails_generators/templates/public/images/re_pipeline/alert-18.png +0 -0
  146. data/rails_generators/templates/public/images/re_pipeline/alert-25.png +0 -0
  147. data/rails_generators/templates/public/images/re_pipeline/alert-48.png +0 -0
  148. data/rails_generators/templates/public/images/re_pipeline/change-14.png +0 -0
  149. data/rails_generators/templates/public/images/re_pipeline/change-18.png +0 -0
  150. data/rails_generators/templates/public/images/re_pipeline/change-25.png +0 -0
  151. data/rails_generators/templates/public/images/re_pipeline/change-48.png +0 -0
  152. data/rails_generators/templates/public/images/re_pipeline/changed-14.png +0 -0
  153. data/rails_generators/templates/public/images/re_pipeline/changed-18.png +0 -0
  154. data/rails_generators/templates/public/images/re_pipeline/changed-25.png +0 -0
  155. data/rails_generators/templates/public/images/re_pipeline/changed-48.png +0 -0
  156. data/rails_generators/templates/public/images/re_pipeline/current-14.png +0 -0
  157. data/rails_generators/templates/public/images/re_pipeline/current-18.png +0 -0
  158. data/rails_generators/templates/public/images/re_pipeline/current-25.png +0 -0
  159. data/rails_generators/templates/public/images/re_pipeline/current-48.png +0 -0
  160. data/rails_generators/templates/public/images/re_pipeline/deactivate-14.png +0 -0
  161. data/rails_generators/templates/public/images/re_pipeline/deactivate-18.png +0 -0
  162. data/rails_generators/templates/public/images/re_pipeline/deactivate-25.png +0 -0
  163. data/rails_generators/templates/public/images/re_pipeline/deactivate-48.png +0 -0
  164. data/rails_generators/templates/public/images/re_pipeline/destroy-14.png +0 -0
  165. data/rails_generators/templates/public/images/re_pipeline/destroy-18.png +0 -0
  166. data/rails_generators/templates/public/images/re_pipeline/destroy-25.png +0 -0
  167. data/rails_generators/templates/public/images/re_pipeline/destroy-48.png +0 -0
  168. data/rails_generators/templates/public/images/re_pipeline/draft-14.png +0 -0
  169. data/rails_generators/templates/public/images/re_pipeline/draft-18.png +0 -0
  170. data/rails_generators/templates/public/images/re_pipeline/draft-25.png +0 -0
  171. data/rails_generators/templates/public/images/re_pipeline/draft-48.png +0 -0
  172. data/rails_generators/templates/public/images/re_pipeline/edit-14.png +0 -0
  173. data/rails_generators/templates/public/images/re_pipeline/edit-18.png +0 -0
  174. data/rails_generators/templates/public/images/re_pipeline/edit-25.png +0 -0
  175. data/rails_generators/templates/public/images/re_pipeline/edit-48.png +0 -0
  176. data/rails_generators/templates/public/images/re_pipeline/list-14.png +0 -0
  177. data/rails_generators/templates/public/images/re_pipeline/list-18.png +0 -0
  178. data/rails_generators/templates/public/images/re_pipeline/list-25.png +0 -0
  179. data/rails_generators/templates/public/images/re_pipeline/list-48.png +0 -0
  180. data/rails_generators/templates/public/images/re_pipeline/list-down.png +0 -0
  181. data/rails_generators/templates/public/images/re_pipeline/list-right.png +0 -0
  182. data/rails_generators/templates/public/images/re_pipeline/new-14.png +0 -0
  183. data/rails_generators/templates/public/images/re_pipeline/new-18.png +0 -0
  184. data/rails_generators/templates/public/images/re_pipeline/new-25.png +0 -0
  185. data/rails_generators/templates/public/images/re_pipeline/new-48.png +0 -0
  186. data/rails_generators/templates/public/images/re_pipeline/revert-14.png +0 -0
  187. data/rails_generators/templates/public/images/re_pipeline/revert-18.png +0 -0
  188. data/rails_generators/templates/public/images/re_pipeline/revert-25.png +0 -0
  189. data/rails_generators/templates/public/images/re_pipeline/revert-48.png +0 -0
  190. data/rails_generators/templates/public/images/re_pipeline/show-14.png +0 -0
  191. data/rails_generators/templates/public/images/re_pipeline/show-18.png +0 -0
  192. data/rails_generators/templates/public/images/re_pipeline/show-25.png +0 -0
  193. data/rails_generators/templates/public/images/re_pipeline/show-48.png +0 -0
  194. data/rails_generators/templates/public/images/re_pipeline/verify-14.png +0 -0
  195. data/rails_generators/templates/public/images/re_pipeline/verify-18.png +0 -0
  196. data/rails_generators/templates/public/images/re_pipeline/verify-25.png +0 -0
  197. data/rails_generators/templates/public/images/re_pipeline/verify-48.png +0 -0
  198. data/rails_generators/templates/public/images/re_rule/__destroy-14.png +0 -0
  199. data/rails_generators/templates/public/images/re_rule/__destroy-18.png +0 -0
  200. data/rails_generators/templates/public/images/re_rule/__destroy-25.png +0 -0
  201. data/rails_generators/templates/public/images/re_rule/__destroy-48.png +0 -0
  202. data/rails_generators/templates/public/images/re_rule/destroy-14.png +0 -0
  203. data/rails_generators/templates/public/images/re_rule/destroy-18.png +0 -0
  204. data/rails_generators/templates/public/images/re_rule/destroy-25.png +0 -0
  205. data/rails_generators/templates/public/images/re_rule/destroy-48.png +0 -0
  206. data/rails_generators/templates/public/images/re_rule/edit-14.png +0 -0
  207. data/rails_generators/templates/public/images/re_rule/edit-18.png +0 -0
  208. data/rails_generators/templates/public/images/re_rule/edit-25.png +0 -0
  209. data/rails_generators/templates/public/images/re_rule/edit-48.png +0 -0
  210. data/rails_generators/templates/public/images/re_rule/goto-pipeline-14.png +0 -0
  211. data/rails_generators/templates/public/images/re_rule/goto-pipeline-18.png +0 -0
  212. data/rails_generators/templates/public/images/re_rule/move-down-14.png +0 -0
  213. data/rails_generators/templates/public/images/re_rule/move-down-18.png +0 -0
  214. data/rails_generators/templates/public/images/re_rule/move-down-25.png +0 -0
  215. data/rails_generators/templates/public/images/re_rule/move-down-48.png +0 -0
  216. data/rails_generators/templates/public/images/re_rule/move-down-off-14.png +0 -0
  217. data/rails_generators/templates/public/images/re_rule/move-down-off-18.png +0 -0
  218. data/rails_generators/templates/public/images/re_rule/move-down-off-25.png +0 -0
  219. data/rails_generators/templates/public/images/re_rule/move-down-off-48.png +0 -0
  220. data/rails_generators/templates/public/images/re_rule/move-up-14.png +0 -0
  221. data/rails_generators/templates/public/images/re_rule/move-up-18.png +0 -0
  222. data/rails_generators/templates/public/images/re_rule/move-up-25.png +0 -0
  223. data/rails_generators/templates/public/images/re_rule/move-up-48.png +0 -0
  224. data/rails_generators/templates/public/images/re_rule/move-up-off-14.png +0 -0
  225. data/rails_generators/templates/public/images/re_rule/move-up-off-18.png +0 -0
  226. data/rails_generators/templates/public/images/re_rule/move-up-off-25.png +0 -0
  227. data/rails_generators/templates/public/images/re_rule/move-up-off-48.png +0 -0
  228. data/rails_generators/templates/public/images/re_rule/next-change-14.png +0 -0
  229. data/rails_generators/templates/public/images/re_rule/next-change-18.png +0 -0
  230. data/rails_generators/templates/public/images/re_rule/next-change-25.png +0 -0
  231. data/rails_generators/templates/public/images/re_rule/next-change-48.png +0 -0
  232. data/rails_generators/templates/public/images/re_rule/next-show-14.png +0 -0
  233. data/rails_generators/templates/public/images/re_rule/next-show-18.png +0 -0
  234. data/rails_generators/templates/public/images/re_rule/next-show-25.png +0 -0
  235. data/rails_generators/templates/public/images/re_rule/next-show-48.png +0 -0
  236. data/rails_generators/templates/public/images/re_rule/stop-failure-14.png +0 -0
  237. data/rails_generators/templates/public/images/re_rule/stop-failure-18.png +0 -0
  238. data/rails_generators/templates/public/images/re_rule/stop-failure-25.png +0 -0
  239. data/rails_generators/templates/public/images/re_rule/stop-failure-48.png +0 -0
  240. data/rails_generators/templates/public/images/re_rule/stop-success-14.png +0 -0
  241. data/rails_generators/templates/public/images/re_rule/stop-success-18.png +0 -0
  242. data/rails_generators/templates/public/images/re_rule/stop-success-25.png +0 -0
  243. data/rails_generators/templates/public/images/re_rule/stop-success-48.png +0 -0
  244. data/rails_generators/templates/public/images/re_rule/valid-14.png +0 -0
  245. data/rails_generators/templates/public/images/re_rule/valid-18.png +0 -0
  246. data/rails_generators/templates/public/images/re_rule/valid-25.png +0 -0
  247. data/rails_generators/templates/public/images/re_rule/valid-48.png +0 -0
  248. data/rails_generators/templates/public/images/re_rule/verify-14.png +0 -0
  249. data/rails_generators/templates/public/images/re_rule/verify-18.png +0 -0
  250. data/rails_generators/templates/public/images/re_rule/verify-25.png +0 -0
  251. data/rails_generators/templates/public/images/re_rule/verify-48.png +0 -0
  252. data/rails_generators/templates/public/images/re_rule_class/add-14.png +0 -0
  253. data/rails_generators/templates/public/images/re_rule_class/add-18.png +0 -0
  254. data/rails_generators/templates/public/images/re_rule_class/add-25.png +0 -0
  255. data/rails_generators/templates/public/images/re_rule_class/add-48.png +0 -0
  256. data/rails_generators/templates/public/images/re_rule_class/help-14.png +0 -0
  257. data/rails_generators/templates/public/images/re_rule_class/help-18.png +0 -0
  258. data/rails_generators/templates/public/images/re_rule_class/help-25.png +0 -0
  259. data/rails_generators/templates/public/images/re_rule_class/help-48.png +0 -0
  260. data/rails_generators/templates/public/images/re_rule_class/list-down.png +0 -0
  261. data/rails_generators/templates/public/images/re_rule_class/list-right.png +0 -0
  262. data/rails_generators/templates/public/images/re_rule_class/new-14.png +0 -0
  263. data/rails_generators/templates/public/images/re_rule_class/new-18.png +0 -0
  264. data/rails_generators/templates/public/images/re_rule_class/new-25.png +0 -0
  265. data/rails_generators/templates/public/images/re_rule_class/new-48.png +0 -0
  266. data/rails_generators/templates/public/javascripts/re_jobs.js +59 -0
  267. data/rails_generators/templates/public/javascripts/re_pipeline.js +54 -0
  268. data/rails_generators/templates/public/javascripts/re_pipeline_change.js +205 -0
  269. data/rails_generators/templates/public/javascripts/re_pipeline_index.js +24 -0
  270. data/rails_generators/templates/public/javascripts/re_pipeline_jobs.js +61 -0
  271. data/rails_generators/templates/public/javascripts/re_pipeline_new.js +34 -0
  272. data/rails_generators/templates/public/stylesheets/re_pipeline/accept.png +0 -0
  273. data/rails_generators/templates/public/stylesheets/re_pipeline/exclamation.png +0 -0
  274. data/rails_generators/templates/public/stylesheets/re_pipeline.css +509 -0
  275. data/rails_generators/templates/spec/controllers/re_pipelines_controller_spec.rb +111 -0
  276. data/rails_generators/templates/spec/models/re_job_audit_spec.rb +24 -0
  277. data/rails_generators/templates/spec/models/re_job_spec.rb +18 -0
  278. data/rails_generators/templates/spec/models/re_pipeline_activated_spec.rb +6 -0
  279. data/rails_generators/templates/spec/models/re_pipeline_base_spec.rb +157 -0
  280. data/rails_generators/templates/spec/models/re_pipeline_spec.rb +166 -0
  281. data/rails_generators/templates/spec/models/re_rule_outcome_spec.rb +97 -0
  282. data/rails_generators/templates/spec/models/re_rule_spec.rb +171 -0
  283. data/rails_generators/templates/spec/support/blueprint_re_pipelines.rb +11 -0
  284. data/spec/rules_engine_spec.rb +7 -0
  285. data/spec/spec.opts +1 -0
  286. data/spec/spec_helper.rb +9 -0
  287. data/tasks/rspec.rake +18 -0
  288. 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
@@ -0,0 +1,13 @@
1
+ module RulesEngine
2
+ class RuleOutcome
3
+
4
+ OUTCOME_NEXT = 0
5
+ OUTCOME_STOP_SUCCESS = 1
6
+ OUTCOME_STOP_FAILURE = 2
7
+ OUTCOME_START_PIPELINE = 3
8
+
9
+ attr_accessor :outcome
10
+ attr_accessor :pipeline_code
11
+
12
+ end
13
+ end
@@ -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,6 @@
1
+ directories :
2
+ - app/views/re_rule_definitions/blacklist_word
3
+
4
+
5
+ files :
6
+ - app/rules/blacklist_word.rb
@@ -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
+