erp_rules 3.0.0 → 3.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. data/app/models/customer_txn_context.rb +11 -0
  2. data/app/models/environment_txn_context.rb +11 -0
  3. data/app/models/search_txn_context.rb +11 -0
  4. data/lib/erp_rules/engine.rb +14 -0
  5. data/lib/erp_rules/extensions/active_record/acts_as_business_rule.rb +30 -0
  6. data/lib/erp_rules/extensions/active_record/acts_as_search_filter.rb +28 -0
  7. data/lib/erp_rules/extensions/active_record/has_rule_context.rb +31 -0
  8. data/lib/erp_rules/extensions.rb +3 -0
  9. data/lib/erp_rules/rules_engine/context.rb +59 -31
  10. data/lib/erp_rules/rules_engine/context_builder.rb +70 -0
  11. data/lib/erp_rules/rules_engine/pricing_engine.rb +18 -0
  12. data/lib/erp_rules/rules_engine/ruleby/engine.rb +24 -0
  13. data/lib/erp_rules/rules_engine/rules_facade.rb +42 -42
  14. data/lib/erp_rules/rules_engine.rb +4 -1
  15. data/lib/erp_rules/search/search_base.rb +64 -0
  16. data/lib/erp_rules/version.rb +7 -1
  17. data/lib/erp_rules.rb +6 -0
  18. data/spec/dummy/Rakefile +7 -0
  19. data/spec/dummy/app/assets/javascripts/application.js +9 -0
  20. data/spec/dummy/app/assets/stylesheets/application.css +7 -0
  21. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  22. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  23. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  24. data/spec/dummy/config/application.rb +44 -0
  25. data/spec/dummy/config/boot.rb +10 -0
  26. data/spec/dummy/config/database.yml +8 -0
  27. data/spec/dummy/config/environment.rb +5 -0
  28. data/spec/dummy/config/environments/spec.rb +27 -0
  29. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  30. data/spec/dummy/config/initializers/inflections.rb +10 -0
  31. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  32. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  33. data/spec/dummy/config/initializers/session_store.rb +8 -0
  34. data/spec/dummy/config/initializers/wrap_parameters.rb +12 -0
  35. data/spec/dummy/config/locales/en.yml +5 -0
  36. data/spec/dummy/config/routes.rb +3 -0
  37. data/spec/dummy/config.ru +4 -0
  38. data/spec/dummy/public/404.html +26 -0
  39. data/spec/dummy/public/422.html +26 -0
  40. data/spec/dummy/public/500.html +26 -0
  41. data/spec/dummy/public/favicon.ico +0 -0
  42. data/spec/dummy/script/rails +6 -0
  43. data/spec/lib/erp_rules/extensions/active_record/acts_as_business_rule_spec.rb +20 -0
  44. data/spec/lib/erp_rules/extensions/active_record/acts_as_search_filter_spec.rb +12 -0
  45. data/spec/lib/erp_rules/extensions/active_record/has_rule_context_spec.rb +29 -0
  46. data/spec/lib/erp_rules/rules_engine/context_builder_spec.rb +5 -0
  47. data/spec/lib/erp_rules/rules_engine/context_spec.rb +64 -0
  48. data/spec/lib/erp_rules/rules_engine/ruleby/engine_spec.rb +26 -0
  49. data/spec/lib/erp_rules/rules_engine/rules_facade_spec.rb +29 -0
  50. data/spec/spec_helper.rb +60 -0
  51. metadata +104 -16
@@ -0,0 +1,11 @@
1
+ class CustomerTxnContext < ActiveRecord::Base
2
+
3
+ has_one :base_txn_context, :as => :txn_context_record
4
+
5
+ def after_create
6
+ base_txn_context = BaseTxnContext.new
7
+ base_txn_context.txn_context_record = self
8
+ base_txn_context.save
9
+ end
10
+
11
+ end
@@ -0,0 +1,11 @@
1
+ class EnvironmentTxnContext < ActiveRecord::Base
2
+
3
+ has_one :base_txn_context, :as => :txn_context_record
4
+
5
+ def after_create
6
+ base_txn_context = BaseTxnContext.new
7
+ base_txn_context.txn_context_record = self
8
+ base_txn_context.save
9
+ end
10
+
11
+ end
@@ -0,0 +1,11 @@
1
+ class SearchTxnContext < ActiveRecord::Base
2
+
3
+ has_one :base_txn_context, :as => :txn_context_record
4
+
5
+ def after_create
6
+ base_txn_context = BaseTxnContext.new
7
+ base_txn_context.txn_context_record = self
8
+ base_txn_context.save
9
+ end
10
+
11
+ end
@@ -1,5 +1,19 @@
1
1
  module ErpRules
2
+ require "erp_base_erp_svcs"
2
3
  class Engine < Rails::Engine
3
4
  isolate_namespace ErpRules
5
+
6
+ ActiveSupport.on_load :active_record do
7
+ include ErpRules::Extensions::ActiveRecord::HasRuleContext
8
+ include ErpRules::Extensions::ActiveRecord::ActsAsBusinessRule
9
+ include ErpRules::Extensions::ActiveRecord::ActsAsSearchFilter
10
+ end
11
+
12
+ #TODO
13
+ #this will be removed once rails 3.2 adds the ability to set the order of engine loading
14
+ engine = self
15
+ config.to_prepare do
16
+ ErpBaseErpSvcs.register_compass_ae_engine(engine)
17
+ end
4
18
  end
5
19
  end
@@ -0,0 +1,30 @@
1
+ module ErpRules
2
+ module Extensions
3
+ module ActiveRecord
4
+ module ActsAsBusinessRule
5
+ def self.included(base)
6
+ base.extend(ClassMethods)
7
+ end
8
+
9
+ module ClassMethods
10
+ def acts_as_business_rule
11
+ extend ActsAsBusinessRule::SingletonMethods
12
+ include ActsAsBusinessRule::InstanceMethods
13
+ end
14
+ end
15
+
16
+ module InstanceMethods
17
+ def is_match? ctx
18
+ end
19
+
20
+ end
21
+
22
+ module SingletonMethods
23
+ def get_matches! ctx
24
+ end
25
+ end
26
+
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,28 @@
1
+ module ErpRules
2
+ module Extensions
3
+ module ActiveRecord
4
+ module ActsAsSearchFilter
5
+
6
+ def self.included(base)
7
+ base.extend(ClassMethods)
8
+ end
9
+
10
+ module ClassMethods
11
+ def acts_as_search_filter
12
+ extend ActsAsSearchFilter::SingletonMethods
13
+ include ActsAsSearchFilter::InstanceMethods
14
+ end
15
+ end
16
+
17
+ module InstanceMethods
18
+ end
19
+
20
+ module SingletonMethods
21
+ def get_search_filters ctx
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+
@@ -0,0 +1,31 @@
1
+ module ErpRules
2
+ module Extensions
3
+ module ActiveRecord
4
+ #this module will be mixed into models in order
5
+ #to construct their execution context
6
+ module HasRuleContext
7
+ def self.included(base)
8
+ base.extend(ClassMethods)
9
+ end
10
+
11
+ module ClassMethods
12
+ def has_rule_context
13
+ extend HasRuleContext::SingletonMethods
14
+ include HasRuleContext::InstanceMethods
15
+ end
16
+ end
17
+
18
+ module InstanceMethods
19
+
20
+ def get_context()
21
+ #self.find_by_internal_identifier(iid)
22
+ attributes
23
+ end
24
+ end
25
+
26
+ module SingletonMethods
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,3 @@
1
+ require 'erp_rules/extensions/active_record/has_rule_context'
2
+ require 'erp_rules/extensions/active_record/acts_as_business_rule'
3
+ require 'erp_rules/extensions/active_record/acts_as_search_filter'
@@ -1,37 +1,65 @@
1
+ require 'ostruct'
2
+
1
3
  module ErpRules
2
- module RulesEngine
3
- class Context
4
- attr_accessor :values_hash
4
+ module RulesEngine
5
+ ##
6
+ #OpenStruct is part of ruby stdlib
7
+ #This class adds methods to allow hash-like
8
+ #behavior
9
+ class Context < OpenStruct
10
+
11
+ def initialize(hash=nil)
12
+ if hash
13
+ hash.each do |k,v|
14
+ if v.class == Hash
15
+ result = ErpRules::RulesEngine::Context.new(v)
16
+ hash[k] = result
17
+ elsif v.class == Array
18
+ v.map! do |item|
19
+ #ostruct requires objects passed to it on the constructr
20
+ #to support #each
21
+ if item.is_a? Enumerable
22
+ ErpRules::RulesEngine::Context.new(item)
23
+ else
24
+ item
25
+ end
26
+ end
27
+ #end Array case
28
+ end
29
+ end
30
+ end
31
+ super(hash)
32
+ end
5
33
 
6
- def initialize
7
- self.values_hash = {}
8
- end
34
+ def [](key)
35
+ send(key)
36
+ end
9
37
 
10
- def [](key)
11
- self.values_hash[key]
12
- end
38
+ ##
39
+ #This will set a method on the struct
40
+ #using array syntax.
41
+ #Trying to set the argument in eval led to an error,
42
+ #hence the 'send' call following it.
43
+ def []=(key, *args)
44
+ arg = args[0]
45
+ eval("#{key} = nil", binding)
13
46
 
14
- def []=(key, *args)
15
- self.values_hash[key] = args[0]
16
- end
47
+ if arg.class == Hash
48
+ send("#{key}=", ErpRules::RulesEngine::Context.new(arg))
49
+ else
50
+ send("#{key}=", arg)
51
+ end
52
+ end
17
53
 
18
- def method_missing(name, *args)
19
- setter = nil
20
- if(name.to_s.include?('='))
21
- name = name.to_s.split('=')[0]
22
- setter = true
23
- name = name.to_sym
24
- end
54
+ #need this method in order to mimic []= behavior
55
+ #using the method/attr syntax of OpenStruct
56
+ def method_missing(mid, *args)
57
+ if args[0].class == Hash
58
+ args[0] = ErpRules::RulesEngine::Context.new(args[0])
59
+ end
60
+ super(mid, *args)
61
+ end
25
62
 
26
- if setter
27
- self.values_hash[name] = args[0]
28
- return self
29
- elsif self.values_hash.has_key?(name)
30
- return self.values_hash[name]
31
- else
32
- super
33
- end
34
- end
35
- end
36
- end
37
- end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,70 @@
1
+ module ErpRules
2
+ module RulesEngine
3
+ class ContextBuilder
4
+
5
+ @facts = nil
6
+ @execution_context = nil
7
+
8
+ def initialize(facts)
9
+ @facts = facts
10
+ end
11
+
12
+ def build_execution_context(options={})
13
+ if options[:only].blank?
14
+ execution_context = {
15
+ :environment_context => self.environment_context(),
16
+ :search_context => self.search_context(),
17
+ :customer_context => self.customer_context()
18
+ }
19
+ else
20
+ execution_context = {}
21
+ options[:only].each do |context|
22
+ execution_context[context] = self.send(context)
23
+ end
24
+ end
25
+
26
+ ErpRules::RulesEngine::Context.new execution_context
27
+ end
28
+
29
+ def persist_context(txn_type, txn_sub_type)
30
+ unless @execution_context.nil?
31
+ search_txn = SearchTxn.new
32
+ search_txn.biz_txn_event = BizTxnEvent.new
33
+ search_txn.biz_txn_event.biz_txn_type = BizTxnType.find_by_type_and_subtype(txn_type,txn_sub_type)
34
+ search_txn.biz_txn_event.description = "#{txn_type} , #{txn_sub_type}"
35
+
36
+ build_and_save_context(SearchTxnContext, @execution_context[:search].to_json, search_txn.biz_txn_event) unless @execution_context[:search].nil?
37
+ build_and_save_context(CustomerTxnContext, @execution_context[:customer].to_json, search_txn.biz_txn_event) unless @execution_context[:customer].nil?
38
+ build_and_save_context(EnvironmentTxnContext, @execution_context[:environment].to_json, search_txn.biz_txn_event) unless @execution_context[:environment].nil?
39
+ end
40
+ end
41
+
42
+ def search_context()
43
+ logger.warn "ContextBuilder.search_context() is an abstract method"
44
+ end
45
+
46
+ def customer_context()
47
+ end
48
+
49
+ def environment_context()
50
+ env_txn_context = {
51
+ :time => @facts[:time],
52
+ :user_agent => @facts[:user_agent],
53
+ :url => @facts[:url],
54
+ :remote_ip => @facts[:remote_ip]
55
+ }
56
+ env_txn_context
57
+ end
58
+
59
+ def build_and_save_context(context_klass, json, biz_txn_event)
60
+ txn_context = context_klass.new
61
+ txn_context.base_txn_context = BaseTxnContext.new
62
+ txn_context.base_txn_context.biz_txn_event = biz_txn_event
63
+ txn_context.context = json
64
+ txn_context.save
65
+ end
66
+
67
+ end
68
+ end
69
+ end
70
+
@@ -0,0 +1,18 @@
1
+ module ErpRules
2
+ module RulesEngine
3
+ class PricingEngine
4
+
5
+ def initialize()
6
+ end
7
+
8
+ def price_products(execution_context)
9
+ execution_context[:product_context][:products].each do |product|
10
+ pricing_plan = PricingPlan.find_by_internal_identifier('default')
11
+ product[:price] = pricing_plan.get_price()
12
+ end
13
+
14
+ execution_context
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,24 @@
1
+ require 'ruleby'
2
+ module ErpRules
3
+ module RulesEngine
4
+ module Ruleby
5
+ #Adapter to invoke the Ruleby engine with a rulebook.
6
+ #Intended to be used with the RulesFacade class
7
+ class Engine
8
+ extend ::Ruleby
9
+
10
+ def self.invoke(rule_book, context)
11
+ engine :engine do |e|
12
+ rule_book.new(e).rules
13
+
14
+ e.assert context
15
+ e.match
16
+ e.retract context
17
+ end
18
+ context
19
+ end
20
+
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1,48 +1,48 @@
1
1
  module ErpRules
2
- module RulesEngine
3
- class RulesFacade
2
+ module RulesEngine
3
+ class RulesFacade
4
4
 
5
- # get the configured rule engine and invoke
6
- def invoke(ruleset, context, rules_engine_klass)
7
- t_start= Time.new
8
- #get the directives
9
- directivesMap=context[:directives]
10
- # here we add in any global directives
11
- directivesMap=Hash.new if(directivesMap==nil)
12
- # suppress execution context return
13
- #(we do this for performance reasons since the execution ctx isnt altered
14
- directivesMap[:suppress_execution_context_return]=true
5
+ # get the configured rule engine and invoke
6
+ def invoke(ruleset, context, rules_engine_klass)
7
+ t_start= Time.new
8
+ #get the directives
9
+ directivesMap=context[:directives]
10
+ # here we add in any global directives
11
+ directivesMap=Hash.new if(directivesMap==nil)
12
+ # suppress execution context return
13
+ #(we do this for performance reasons since the execution ctx isnt altered
14
+ directivesMap[:suppress_execution_context_return]=true
15
15
 
16
- # add the directives map to the context
17
- context[:directives]=directivesMap;
18
- ## now we invoke the rule facade
19
- Rails.logger.debug("Invoking RulesFacade")
20
- Rails.logger.debug("Ruleset:#{ruleset}")
21
- Rails.logger.debug("context:#{context}")
22
- #get the name of the rule engine
23
- Rails.logger.debug("RULE CLASS : #{rules_engine_klass}")
16
+ # add the directives map to the context
17
+ context[:directives]=directivesMap;
18
+ ## now we invoke the rule facade
19
+ Rails.logger.debug("Invoking RulesFacade")
20
+ Rails.logger.debug("Ruleset:#{ruleset}")
21
+ Rails.logger.debug("context:#{context}")
22
+ #get the name of the rule engine
23
+ Rails.logger.debug("RULE CLASS : #{rules_engine_klass}")
24
24
 
25
- #we will use eval instead of Kernel.const_get since the rule engines
26
- # should be namespaced
27
- klass = (rules_engine_klass.is_a?(String)) ? eval(rules_engine_klass) : rules_engine_klass
28
- # create an instance of its singleton
29
- rule_engine = klass
30
-
31
- #invoke the rule engine
32
- result=rule_engine.invoke(ruleset,context)
33
- Rails.logger.debug("\n------------------------------------------------------------------------------------------")
34
- Rails.logger.debug("RULE ENGINE :#{rule_engine}")
35
- Rails.logger.debug("\n------------------------------------------------------------------------------------------")
36
- Rails.logger.debug("INVOKE RESULTS:"+result.to_yaml)
37
- Rails.logger.debug("\n------------------------------------------------------------------------------------------")
38
-
39
- Rails.logger.debug("\n------------------------------------------------------------------------------------------")
40
- t_end=Time.new
41
- Rails.logger.debug("Rule invocation time:#{(t_end.to_f-t_start.to_f)} sec")
42
- Rails.logger.debug("\n------------------------------------------------------------------------------------------")
25
+ #we will use eval instead of Kernel.const_get since the rule engines
26
+ # should be namespaced
27
+ klass = (rules_engine_klass.is_a?(String)) ? eval(rules_engine_klass) : rules_engine_klass
28
+ # create an instance of its singleton
29
+ rule_engine = klass
43
30
 
44
- result
45
- end
46
- end
47
- end
31
+ #invoke the rule engine
32
+ result=rule_engine.invoke(ruleset,context)
33
+ Rails.logger.debug("\n------------------------------------------------------------------------------------------")
34
+ Rails.logger.debug("RULE ENGINE :#{rule_engine}")
35
+ Rails.logger.debug("\n------------------------------------------------------------------------------------------")
36
+ Rails.logger.debug("INVOKE RESULTS:"+result.to_yaml)
37
+ Rails.logger.debug("\n------------------------------------------------------------------------------------------")
38
+
39
+ Rails.logger.debug("\n------------------------------------------------------------------------------------------")
40
+ t_end=Time.new
41
+ Rails.logger.debug("Rule invocation time:#{(t_end.to_f-t_start.to_f)} sec")
42
+ Rails.logger.debug("\n------------------------------------------------------------------------------------------")
43
+
44
+ result
45
+ end
46
+ end
47
+ end
48
48
  end
@@ -1,2 +1,5 @@
1
1
  require 'erp_rules/rules_engine/context'
2
- require 'erp_rules/rules_engine/rules_facade'
2
+ require 'erp_rules/rules_engine/rules_facade'
3
+ require 'erp_rules/rules_engine/context_builder'
4
+ require 'erp_rules/rules_engine/pricing_engine'
5
+ require 'erp_rules/rules_engine/rules_facade'
@@ -0,0 +1,64 @@
1
+ module ErpRules
2
+ module Search
3
+ class SearchBase
4
+
5
+ def search facts
6
+ return process_search_facts(facts)
7
+ end
8
+
9
+ #This is the vertical search method that will need to be implemented
10
+ #in the sub-class
11
+ def do_search ctx
12
+ raise "do_search needs to be implemented in the subclass"
13
+ end
14
+
15
+ #Perform any processing the facts passed by a search controller
16
+ def pre_process_facts facts
17
+ raise "pre_process_facts needs to be implemented in the subclass"
18
+ end
19
+
20
+ #This must return an object (class, hash, whatever) that is used by the
21
+ #rules engine as a sort of rule book.
22
+ def generate_rules ctx
23
+ raise "generate_rules must be implemented in the subclass"
24
+ end
25
+
26
+ def process_search_facts(facts, search_rules_klass, context_builder_klass=ErpRules::RulesEngine::ContextBuilder)
27
+
28
+ # breaking out Orange Lake search logic into a subclass
29
+ # this creates a requirement that this class be extended with a subclass containing pre_process_facts method
30
+ facts = pre_process_facts(facts)
31
+
32
+ # build the execution context for the rules engine
33
+ search_execution_context = create_search_execution_context(facts,
34
+ {:persistant => Constants::SEARCH_TXN_PERSISTANT,
35
+ :context_builder_klass => context_builder_klass})
36
+
37
+ ruleset = generate_rules ctx
38
+ #execute the reservation_search rules and get back some search filtering criteria
39
+ filters = ErpRules::RulesEngine::RulesFacade.new.invoke(ruleset, search_execution_context, search_rules_klass)
40
+
41
+ # breaking out Orange Lake search logic into a subclass
42
+ # this creates a requirement that this class be extended with a subclass containing vertical_search method
43
+ res_search_results, message = do_search(facts, filters)
44
+
45
+ return res_search_results, message
46
+ end
47
+
48
+ def create_search_execution_context(facts, options={})
49
+ options[:persistant] = false if options[:persistant].nil?
50
+
51
+ # Get execution context
52
+ context_builder = options[:context_builder_klass].new(facts)
53
+ execution_context = context_builder.build_execution_context()
54
+
55
+ # If persistant, save to database
56
+ if options[:persistant]
57
+ context_builder.persist_context(self.class.to_s, facts[:search_params][:search_type])
58
+ end
59
+
60
+ return execution_context
61
+ end
62
+ end
63
+ end
64
+ end
@@ -1,3 +1,9 @@
1
1
  module ErpRules
2
- VERSION = "3.0.0"
2
+ module VERSION #:nodoc:
3
+ MAJOR = 3
4
+ MINOR = 0
5
+ TINY = 1
6
+
7
+ STRING = [MAJOR, MINOR, TINY].compact.join('.')
8
+ end
3
9
  end
data/lib/erp_rules.rb CHANGED
@@ -1,5 +1,11 @@
1
+ require "erp_rules/version"
2
+ require 'erp_rules/rules_engine/context_builder'
3
+ require 'erp_rules/rules_engine/rules_facade'
4
+ require 'erp_rules/rules_engine/ruleby/engine'
1
5
  require 'erp_rules/rules_engine'
6
+ require "erp_rules/extensions"
2
7
  require "erp_rules/engine"
8
+ require "erp_base_erp_svcs"
3
9
 
4
10
  module ErpRules
5
11
  end
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env rake
2
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
3
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
4
+
5
+ require File.expand_path('../config/application', __FILE__)
6
+
7
+ Dummy::Application.load_tasks
@@ -0,0 +1,9 @@
1
+ // This is a manifest file that'll be compiled into including all the files listed below.
2
+ // Add new JavaScript/Coffee code in separate files in this directory and they'll automatically
3
+ // be included in the compiled file accessible from http://example.com/assets/application.js
4
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
5
+ // the compiled file.
6
+ //
7
+ //= require jquery
8
+ //= require jquery_ujs
9
+ //= require_tree .
@@ -0,0 +1,7 @@
1
+ /*
2
+ * This is a manifest file that'll automatically include all the stylesheets available in this directory
3
+ * and any sub-directories. You're free to add application-wide styles to this file and they'll appear at
4
+ * the top of the compiled file, but it's generally better to create a new file per style scope.
5
+ *= require_self
6
+ *= require_tree .
7
+ */
@@ -0,0 +1,3 @@
1
+ class ApplicationController < ActionController::Base
2
+ protect_from_forgery
3
+ end
@@ -0,0 +1,2 @@
1
+ module ApplicationHelper
2
+ end
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Dummy</title>
5
+ <%= stylesheet_link_tag "application" %>
6
+ <%= javascript_include_tag "application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
@@ -0,0 +1,44 @@
1
+ require File.expand_path('../boot', __FILE__)
2
+
3
+ require 'rails/all'
4
+
5
+ Bundler.require
6
+ require "erp_rules"
7
+ require "erp_tech_svcs"
8
+ require "erp_base_erp_svcs"
9
+
10
+ module Dummy
11
+ class Application < Rails::Application
12
+ # Settings in config/environments/* take precedence over those specified here.
13
+ # Application configuration should go into files in config/initializers
14
+ # -- all .rb files in that directory are automatically loaded.
15
+
16
+ # Custom directories with classes and modules you want to be autoloadable.
17
+ # config.autoload_paths += %W(#{config.root}/extras)
18
+
19
+ # Only load the plugins named here, in the order given (default is alphabetical).
20
+ # :all can be used as a placeholder for all plugins not explicitly named.
21
+ # config.plugins = [ :exception_notification, :ssl_requirement, :all ]
22
+
23
+ # Activate observers that should always be running.
24
+ # config.active_record.observers = :cacher, :garbage_collector, :forum_observer
25
+
26
+ # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
27
+ # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
28
+ # config.time_zone = 'Central Time (US & Canada)'
29
+
30
+ # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
31
+ # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
32
+ # config.i18n.default_locale = :de
33
+
34
+ # Configure the default encoding used in templates for Ruby 1.9.
35
+ config.encoding = "utf-8"
36
+
37
+ # Configure sensitive parameters which will be filtered from the log file.
38
+ config.filter_parameters += [:password]
39
+
40
+ # Enable the asset pipeline
41
+ config.assets.enabled = true
42
+ end
43
+ end
44
+
@@ -0,0 +1,10 @@
1
+ require 'rubygems'
2
+ gemfile = File.expand_path('../../../../Gemfile', __FILE__)
3
+
4
+ if File.exist?(gemfile)
5
+ ENV['BUNDLE_GEMFILE'] = gemfile
6
+ require 'bundler'
7
+ Bundler.setup
8
+ end
9
+
10
+ $:.unshift File.expand_path('../../../../lib', __FILE__)