parse_decision 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.rspec +2 -0
  4. data/Gemfile +6 -0
  5. data/LICENSE +22 -0
  6. data/README.md +71 -0
  7. data/bin/parse_decision +126 -0
  8. data/lib/parse_decision/config.rb +90 -0
  9. data/lib/parse_decision/controller.rb +142 -0
  10. data/lib/parse_decision/parsedecisiontask.rb +31 -0
  11. data/lib/parse_decision/parser.rb +194 -0
  12. data/lib/parse_decision/pd_context.rb +148 -0
  13. data/lib/parse_decision/plugin/application.rb +48 -0
  14. data/lib/parse_decision/plugin/plugin.rb +56 -0
  15. data/lib/parse_decision/plugin/ppm_xpath.rb +70 -0
  16. data/lib/parse_decision/plugin/pre_decision_guideline.rb +177 -0
  17. data/lib/parse_decision/plugin/product.rb +176 -0
  18. data/lib/parse_decision/plugin/product_xpath.rb +52 -0
  19. data/lib/parse_decision/plugin/web_product.rb +179 -0
  20. data/lib/parse_decision/plugin.rb +50 -0
  21. data/lib/parse_decision/version.rb +5 -0
  22. data/lib/parse_decision.rb +59 -0
  23. data/parse_decision.gemspec +27 -0
  24. data/rakefile.rb +58 -0
  25. data/spec/context_spec.rb +21 -0
  26. data/spec/data/multiproduct.decision.txt +1481 -0
  27. data/spec/data/prod.decision.txt +3957 -0
  28. data/spec/data/reference/multiproduct/001-APP.xml +1 -0
  29. data/spec/data/reference/multiproduct/001-Mod-Forbear-PRODUCT.xml +357 -0
  30. data/spec/data/reference/multiproduct/001-Mod-Forgive-PRODUCT.xml +361 -0
  31. data/spec/data/reference/multiproduct/001-Mod-RateTerm-PRODUCT.xml +353 -0
  32. data/spec/data/reference/multiproduct/001-Mod-SAM-PRODUCT.xml +365 -0
  33. data/spec/data/reference/product/001-APP.xml +1 -0
  34. data/spec/data/reference/product/001-Validation-Rules.xml +536 -0
  35. data/spec/data/reference/product/002-APP.xml +1 -0
  36. data/spec/data/reference/product/002-FAPIILoanModification-PRODUCT.xml +1770 -0
  37. data/spec/data/reference/web/001-APP.xml +1 -0
  38. data/spec/data/reference/web/001-Product01-PRODUCT.xml +1088 -0
  39. data/spec/data/reference/web/002-APP.xml +1 -0
  40. data/spec/data/reference/web/002-Product01-PRODUCT.xml +15 -0
  41. data/spec/data/reference/workflow/001-APP.xml +1 -0
  42. data/spec/data/reference/workflow/001-WF-DataClearing-Pre-Rules.xml +37 -0
  43. data/spec/data/reference/workflow-2/001-APP.xml +1 -0
  44. data/spec/data/reference/workflow-2/001-WF-ProdSel-Post-Rules.xml +699 -0
  45. data/spec/data/test.rb +13 -0
  46. data/spec/data/validation.decision.txt +1199 -0
  47. data/spec/data/web.decision.txt +1128 -0
  48. data/spec/data/wf.decision.txt +43 -0
  49. data/spec/data/wf2.decision.txt +705 -0
  50. data/spec/parser_spec.rb +308 -0
  51. data/spec/plugin_app_spec.rb +40 -0
  52. data/spec/plugin_ppmxpath_spec.rb +74 -0
  53. data/spec/plugin_predecision_spec.rb +81 -0
  54. data/spec/plugin_product_spec.rb +117 -0
  55. data/spec/plugin_productxpath_spec.rb +76 -0
  56. data/spec/plugin_spec.rb +54 -0
  57. data/spec/spec_helper.rb +81 -0
  58. data/test/data/2.2.decision-multiple.txt +1391 -0
  59. data/test/data/2.2.decision.txt +1128 -0
  60. data/test/data/2.decision.txt +1481 -0
  61. data/test/plugins/test_plugin_predecisionguideline.rb +120 -0
  62. data/test/plugins/test_plugin_product.rb +120 -0
  63. data/test/test_config.rb +90 -0
  64. data/test/test_context.rb +103 -0
  65. data/test/test_parse_webdecision.rb +121 -0
  66. data/test/test_parser.rb +69 -0
  67. data/test/test_parser_parse.rb +110 -0
  68. metadata +225 -0
@@ -0,0 +1,176 @@
1
+ ##############################################################################
2
+ # File:: plugin.rb
3
+ # Purpose:: Plugin objects for ParseDecision utility
4
+ #
5
+ # Author:: Jeff McAffee 04/17/2010
6
+ # Copyright:: Copyright (c) 2010, kTech Systems LLC. All rights reserved.
7
+ # Website:: http://ktechsystems.com
8
+ ##############################################################################
9
+
10
+ ##############################################################################
11
+ module ParseDecision
12
+
13
+ ##############################################################################
14
+ module Plugin
15
+
16
+ ## #######################################################################
17
+ # Product info plugin
18
+ class Product < Plugin
19
+ attr_reader :data
20
+
21
+ def initialize()
22
+ $LOG.debug "Product::initialize"
23
+ @fnameTemplate = "@INDEX@-@PROD@-PRODUCT.xml"
24
+ @searchStr1 = "<PRODUCTS><PRODUCT"
25
+ @searchStr2 = "<PARAMS><_DATA_SET"
26
+
27
+ @ruleStartStr = "<Rules>"
28
+ @gdlStartStr = "<Decision GuidelineId"
29
+ @stopStr = "</Decision>"
30
+
31
+ @data = []
32
+ @openTag = "<@TAG@_DATA>\n"
33
+ @closeTag = "</@TAG@_DATA>\n"
34
+ @openTag = "<PRODUCT_DATA>\n"
35
+ @closeTag = "</PRODUCT_DATA>\n"
36
+ @lineCount = 0
37
+ @chunkSize = 1000
38
+ @product = ""
39
+
40
+ set_outfile( "" )
41
+ end
42
+
43
+ def set_outfile( outfile )
44
+ @outfile = outfile
45
+ end
46
+
47
+ def execute(context, ln)
48
+ #$LOG.debug "Product::execute"
49
+
50
+ case context.state
51
+ when :app
52
+ return accept_as_product_data context, ln
53
+
54
+ when :productXml
55
+ return accept_product_ppms context, ln
56
+
57
+ when :productPpms
58
+ return accept_product_rules context, ln
59
+
60
+ when :productRules
61
+ return process_product_rules context, ln
62
+
63
+ else
64
+ return false
65
+
66
+ end # case
67
+ end
68
+
69
+ def accept_as_product_data(context, ln)
70
+ if ln.include?(@searchStr1)
71
+ context.state = :productXml
72
+ @data.clear
73
+ set_outfile( "" )
74
+
75
+ # Generate the name of the output file
76
+ match = ln.match /\sName="([^"]+)/
77
+ product = "UnkProduct"
78
+ if(match && match.length > 1)
79
+ product = match[1]
80
+ end
81
+ @product = context.createValidName(product)
82
+ set_outfile( apply_templates(@fnameTemplate, {"@INDEX@"=>context.indexStr, "@PROD@"=>@product}) )
83
+
84
+ @data << ln
85
+
86
+ create_data_file context
87
+
88
+ @data.clear
89
+ return true
90
+ end
91
+
92
+ return false
93
+ end
94
+
95
+ def create_data_file(context)
96
+ puts "Creating product file: #{@outfile}" if context.verbose
97
+ File.open(context.outputPath(@outfile), "w") do |f|
98
+ write_to_file(f,@openTag)
99
+
100
+ # Write the product PPM's Xpath (which was stored in the context)
101
+ write_to_file(f,context[:productXpath] ) if ! context[:productXpath].nil?
102
+
103
+ write_to_file(f,@data)
104
+ end
105
+ end
106
+
107
+ def accept_product_ppms(context, ln)
108
+ if ln.include?(@searchStr2)
109
+ context.state = :productPpms
110
+
111
+ # XML Tidy doesn't like underscores at the beginning attribute names, take care of it here.
112
+ ln.gsub!(/_DATA_SET/, "DATA_SET")
113
+ ln.gsub!(/_Name/, "Name")
114
+ ln.gsub!(/_Value/, "Value")
115
+
116
+ @data << ln
117
+ return true
118
+ end
119
+ end
120
+
121
+ def accept_product_rules(context, ln)
122
+ if( ln.include?(@ruleStartStr) || ln.include?(@gdlStartStr) )
123
+ context.state = :productRules
124
+
125
+ @data << ln
126
+ return true
127
+ end
128
+ end
129
+
130
+ def process_product_rules(context, ln)
131
+ if !ln.include?(@stopStr)
132
+ @data << ln
133
+ @lineCount += 1
134
+
135
+ write_data_chunk context
136
+
137
+ return true
138
+ else
139
+
140
+ @data << ln
141
+ @lineCount += 1
142
+
143
+ close_out_data_file context
144
+ context.state = :app
145
+
146
+ return true
147
+ end
148
+ end
149
+
150
+ def write_data_chunk(context)
151
+ if(@lineCount > @chunkSize)
152
+ puts "Writing rule data chunk." if context.verbose
153
+ File.open(context.outputPath(@outfile), "a") do |f|
154
+ write_to_file(f,@data)
155
+ end
156
+ @lineCount = 0
157
+ @data.clear
158
+ end
159
+ end
160
+
161
+ def close_out_data_file(context)
162
+ puts "Closing product file #{@outfile}." if context.verbose
163
+ File.open(context.outputPath(@outfile), "a") do |f|
164
+ write_to_file(f,@data)
165
+ write_to_file(f,@closeTag) # apply_template(@closeTag, "@TAG@", context.createValidName(@product))
166
+ end
167
+ @lineCount = 0
168
+ @data.clear
169
+ end
170
+
171
+ end # class Product
172
+
173
+
174
+ end # module Plugin
175
+
176
+ end # module ParseDecision
@@ -0,0 +1,52 @@
1
+ ##############################################################################
2
+ # File:: plugin.rb
3
+ # Purpose:: Plugin objects for ParseDecision utility
4
+ #
5
+ # Author:: Jeff McAffee 04/17/2010
6
+ # Copyright:: Copyright (c) 2010, kTech Systems LLC. All rights reserved.
7
+ # Website:: http://ktechsystems.com
8
+ ##############################################################################
9
+
10
+ ##############################################################################
11
+ module ParseDecision
12
+
13
+ ##############################################################################
14
+ module Plugin
15
+
16
+ ## #######################################################################
17
+ # Product XPath plugin
18
+ class ProductXpath < Plugin
19
+ def initialize()
20
+ $LOG.debug "ProductXpath::initialize"
21
+ @searchStr1 = "*PRODUCT XPATH xml*"
22
+ @searchStr2 = "<PPXPATH>"
23
+ end
24
+
25
+ def execute(context, ln)
26
+ #$LOG.debug "ProductXpath::execute"
27
+ if((context.state == :app) && ln.include?(@searchStr1))
28
+ context.state = :productXpath
29
+ return true
30
+ end
31
+
32
+ if((context.state == :productXpath) && ln.include?(@searchStr2))
33
+ context.state = :app
34
+ # We just store the product xpath in the context so it can
35
+ # be incorporated into the product rules file later.
36
+ context[:productXpath] = ln
37
+ return true
38
+ end
39
+
40
+ if(context.state == :productXpath)
41
+ # Probably a blank line. Claim it so we don't waste anyone else's time.
42
+ return true
43
+ end
44
+
45
+ return false
46
+ end
47
+ end # class ProductXpath
48
+
49
+
50
+ end # module Plugin
51
+
52
+ end # module ParseDecision
@@ -0,0 +1,179 @@
1
+ ##############################################################################
2
+ # File:: plugin.rb
3
+ # Purpose:: Plugin objects for ParseDecision utility
4
+ #
5
+ # Author:: Jeff McAffee 04/17/2010
6
+ # Copyright:: Copyright (c) 2010, kTech Systems LLC. All rights reserved.
7
+ # Website:: http://ktechsystems.com
8
+ ##############################################################################
9
+
10
+ ##############################################################################
11
+ module ParseDecision
12
+
13
+ ##############################################################################
14
+ module Plugin
15
+
16
+ ## #######################################################################
17
+ # Product info plugin - specific to webdecisions
18
+ class WebProduct < Plugin
19
+ attr_reader :data
20
+
21
+ def initialize()
22
+ $LOG.debug "WebProduct::initialize"
23
+ @fnameTemplate = "@INDEX@-@PROD@-PRODUCT.xml"
24
+
25
+ @ruleStartStr = "<Rules>"
26
+ @gdlStartStr = "<Decision GuidelineId"
27
+ @stopStr = "</Decision>"
28
+
29
+ @openProgramNameDpm = '>'
30
+ @closeProgramNameDpm = '</DPM>'
31
+
32
+
33
+ @data = []
34
+ @outfile = ""
35
+ @openTag = "<@TAG@_DATA>\n"
36
+ @closeTag = "</@TAG@_DATA>\n"
37
+ @openTag = "<PRODUCT_DATA>\n"
38
+ @closeTag = "</PRODUCT_DATA>\n"
39
+ @lineCount = 0
40
+ @chunkSize = 1000
41
+ @product = ""
42
+ @productIndex = 1
43
+ @appIndex = "00"
44
+
45
+ end
46
+
47
+ def productIndexStr()
48
+ return "%02d" % @productIndex
49
+ end
50
+
51
+
52
+ def execute(context, ln)
53
+ #$LOG.debug "WebProduct::execute"
54
+ if((context.state == :app) && ln.include?(@ruleStartStr))
55
+ context.state = :gdlRules
56
+ @data.clear
57
+ @outfile = ""
58
+ context["programNameFound"] = false
59
+ context["productName"] = ""
60
+
61
+ if(!@appIndex.eql?(context.indexStr))
62
+ @productIndex = 1
63
+ @appIndex = context.indexStr
64
+ end
65
+
66
+ product = "Product" + productIndexStr()
67
+ @productIndex += 1
68
+ @product = context.createValidName(product)
69
+ @outfile = apply_templates(@fnameTemplate, {"@INDEX@"=>context.indexStr, "@PROD@"=>@product})
70
+ puts "" if context.verbose
71
+ puts "- + - + - + -" if context.verbose
72
+ puts "" if context.verbose
73
+ puts "Creating product file: #{@outfile}" if context.verbose
74
+ @data << ln
75
+ File.open(context.outputPath(@outfile), "w") do |f|
76
+ write_to_file(f,@openTag) # apply_template(@openTag, "@TAG@", context.createValidName(@product))
77
+ write_to_file(f,context[:productXpath]) if ! context[:productXpath].nil?
78
+ write_to_file(f,@data)
79
+ end
80
+ @data.clear
81
+ return true
82
+ end
83
+
84
+ if((context.state == :gdlRules))
85
+ context.state = :productRules
86
+
87
+ @data << ln
88
+ return true
89
+ end
90
+
91
+ if((context.state == :productRules) && !ln.include?(@stopStr))
92
+ if(ln.include?("----")) # Skip comment lines (they are not valid XML).
93
+ commentLine = ln.slice(0,4)
94
+ return true if(commentLine.include?("----"))
95
+ end
96
+
97
+ @data << ln
98
+ @lineCount += 1
99
+
100
+ if(!context["programNameFound"])
101
+ if(ln.include?('Name="Program Name"'))
102
+ productName = getSubString(ln, @openProgramNameDpm, @closeProgramNameDpm)
103
+ context["programNameFound"] = true
104
+ context["productName"] = productName
105
+ puts "........Program Name DPM found: #{productName}" if context.verbose
106
+
107
+ end # if ln.include?
108
+ end # if !context["programNameFound"]
109
+
110
+ if(@lineCount > @chunkSize)
111
+ puts "Writing rule data chunk." if context.verbose
112
+ File.open(context.outputPath(@outfile), "a") do |f|
113
+ write_to_file(f,@data)
114
+ end
115
+ @lineCount = 0
116
+ @data.clear
117
+ end
118
+ return true
119
+ end
120
+
121
+ if((context.state == :productRules) && ln.include?(@stopStr))
122
+ @data << ln
123
+ @lineCount += 1
124
+
125
+ puts "Closing product file." if context.verbose
126
+ File.open(context.outputPath(@outfile), "a") do |f|
127
+ write_to_file(f,@data)
128
+ write_to_file(f,@closeTag) # apply_template(@closeTag, "@TAG@", context.createValidName(@product))
129
+ end
130
+ @lineCount = 0
131
+ @data.clear
132
+ context.state = :app
133
+ #@productIndex = 1
134
+
135
+ if(context["programNameFound"])
136
+ pname = context.createValidName(context["productName"])
137
+ newFileName = apply_templates(@fnameTemplate, {"@INDEX@"=>context.indexStr, "@PROD@"=>pname})
138
+
139
+ renameFile(context, @outfile, newFileName)
140
+ end # if context["programNameFound"]
141
+
142
+ context["programNameFound"] = false
143
+
144
+ return true
145
+ end
146
+
147
+ return false
148
+ end
149
+
150
+
151
+ def getSubString(haystack, startDelim, stopDelim)
152
+ #$LOG.debug "WebProduct::getSubString( #{haystack}, #{startDelim}, #{stopDelim} )"
153
+ #puts "WebProduct::getSubString()" # #{haystack}, #{startDelim}, #{stopDelim} )"
154
+ #puts " haystack: #{haystack}"
155
+ #puts " startDelim: #{startDelim}"
156
+ #puts " stopDelim: #{stopDelim}"
157
+
158
+ start = haystack.index(startDelim)
159
+ #puts " start: " + (start.nil? ? "nil" : "#{start}")
160
+ return if start.nil?
161
+
162
+ start += startDelim.size
163
+ stop = haystack.rindex(stopDelim)
164
+
165
+ res = haystack[start,(stop - start)]
166
+ end # getSubString
167
+
168
+
169
+ def renameFile(context, srcFileName, destFileName)
170
+ puts "Renaming #{srcFileName} => #{destFileName}" if context.verbose
171
+ FileUtils.mv(context.outputPath(srcFileName), context.outputPath(destFileName))
172
+ end # renameFile
173
+
174
+
175
+ end # class WebProduct
176
+
177
+ end # module Plugin
178
+
179
+ end # module ParseDecision
@@ -0,0 +1,50 @@
1
+ ##############################################################################
2
+ # File:: plugin.rb
3
+ # Purpose:: Plugin objects for ParseDecision utility
4
+ #
5
+ # Author:: Jeff McAffee 04/17/2010
6
+ # Copyright:: Copyright (c) 2010, kTech Systems LLC. All rights reserved.
7
+ # Website:: http://ktechsystems.com
8
+ ##############################################################################
9
+
10
+ #############################################################
11
+ # Stage Change Flow
12
+ #
13
+ # default mode:
14
+ # :app
15
+ # :appPpmXpath
16
+ # :preDecisionGdl
17
+ # :productXpath
18
+ # :productXml
19
+ # :productPpms
20
+ # :productRules
21
+ #
22
+ # webdecision mode:
23
+ # :app
24
+ # :gdlRules
25
+ # :productRules
26
+ # :decisionResponse
27
+ # :preDecisionGdl
28
+ #
29
+ #
30
+ #
31
+ #
32
+ #############################################################
33
+
34
+
35
+ ##############################################################################
36
+ module ParseDecision
37
+
38
+ ##############################################################################
39
+ module Plugin
40
+
41
+ end # module Plugin
42
+ end # module ParseDecision
43
+
44
+ require_relative 'plugin/plugin'
45
+ require_relative 'plugin/application'
46
+ require_relative 'plugin/ppm_xpath'
47
+ require_relative 'plugin/pre_decision_guideline'
48
+ require_relative 'plugin/product'
49
+ require_relative 'plugin/product_xpath'
50
+ require_relative 'plugin/web_product'
@@ -0,0 +1,5 @@
1
+ module ParseDecision
2
+ VERSION = "0.0.5" unless constants.include?("VERSION")
3
+ APPNAME = "ParseDecision" unless constants.include?("APPNAME")
4
+ COPYRIGHT = "Copyright (c) 2014, kTech Systems LLC. All rights reserved" unless constants.include?("COPYRIGHT")
5
+ end
@@ -0,0 +1,59 @@
1
+ ##############################################################################
2
+ # File:: parse_decision.rb
3
+ # Purpose:: Include file for ParseDecision library
4
+ #
5
+ # Author:: Jeff McAffee 03/12/2010
6
+ # Copyright:: Copyright (c) 2010, kTech Systems LLC. All rights reserved.
7
+ # Website:: http://ktechsystems.com
8
+ ##############################################################################
9
+
10
+ require 'find'
11
+ require 'logger'
12
+ require 'bundler/setup'
13
+
14
+
15
+ if(!$LOG)
16
+ $LOG = Logger.new(STDERR)
17
+ $LOG.level = Logger::ERROR
18
+ end
19
+
20
+ if ENV["DEBUG"] == '1'
21
+ puts "LOGGING: ON due to DEBUG=1"
22
+ $LOG.level = Logger::DEBUG
23
+ end
24
+
25
+ $LOGGING = false
26
+ # Uncomment line below to force logging:
27
+ #$LOGGING = true # TODO: Change this flag to false when releasing production build.
28
+
29
+ require "#{File.join( File.dirname(__FILE__), 'parse_decision','version')}"
30
+ require "#{File.join( File.dirname(__FILE__), 'parse_decision','config')}"
31
+
32
+ logcfg = ParseDecision::Config.new.load
33
+ if(logcfg.key?(:logging) && (true == logcfg[:logging]) )
34
+ $LOGGING = true
35
+ end
36
+
37
+ if($LOGGING)
38
+ # Create a new log file each time:
39
+ file = File.open('parse_decision.log', File::WRONLY | File::APPEND | File::CREAT | File::TRUNC)
40
+ $LOG = Logger.new(file)
41
+ $LOG.level = Logger::DEBUG
42
+ #$LOG.level = Logger::INFO
43
+ else
44
+ if(File.exists?('parse_decision.log'))
45
+ FileUtils.rm('parse_decision.log')
46
+ end
47
+ end
48
+ $LOG.info "**********************************************************************"
49
+ $LOG.info "Logging started for ParseDecision library."
50
+ $LOG.info "**********************************************************************"
51
+
52
+
53
+ class_files = File.join( File.dirname(__FILE__), 'parse_decision', '*.rb')
54
+ $: << File.join( File.dirname(__FILE__), 'parse_decision') # Add directory to the include file array.
55
+ Dir.glob(class_files) do | class_file |
56
+ require class_file[/\w+\.rb$/]
57
+ end
58
+
59
+
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'parse_decision/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.platform = Gem::Platform::RUBY
8
+ spec.name = "parse_decision"
9
+ spec.version = ParseDecision::VERSION
10
+ spec.authors = ["Jeff McAffee"]
11
+ spec.email = ["jeff@ktechsystems.com"]
12
+ spec.description = %q{AMS Decision Log Parser}
13
+ spec.summary = %q{AMS Decision Log Parser}
14
+ spec.homepage = "https://github.com/jmcaffee/parse_decision"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files`.split($/)
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.3"
23
+ spec.add_development_dependency "rake"
24
+ spec.add_development_dependency "rspec-given"
25
+ spec.add_development_dependency "pry"
26
+ spec.add_runtime_dependency "ktcommon"
27
+ end
data/rakefile.rb ADDED
@@ -0,0 +1,58 @@
1
+ ######################################################################################
2
+ # File:: rakefile
3
+ # Purpose:: Build tasks for ParseDecision application
4
+ #
5
+ # Author:: Jeff McAffee 03/12/2010
6
+ # Copyright:: Copyright (c) 2010, kTech Systems LLC. All rights reserved.
7
+ # Website:: http://ktechsystems.com
8
+ ######################################################################################
9
+
10
+ require 'bundler/gem_tasks'
11
+ require 'psych'
12
+ gem 'rdoc', '>= 3.9.4'
13
+
14
+ require 'rake'
15
+ require 'rake/clean'
16
+ require 'rdoc/task'
17
+
18
+
19
+ # Set the project name
20
+ PROJNAME = "ParseDecision"
21
+
22
+
23
+ #############################################################################
24
+ RDoc::Task.new(:rdoc) do |rdoc|
25
+ files = ['README.rdoc', 'docs/**/*.rdoc', 'lib/**/*.rb', 'bin/**/*']
26
+ rdoc.rdoc_files.add( files )
27
+ # Page to start on
28
+ rdoc.main = "README.md"
29
+ #puts "PWD: #{FileUtils.pwd}"
30
+ rdoc.title = "#{PROJNAME} Documentation"
31
+ rdoc.rdoc_dir = 'doc' # rdoc output folder
32
+ rdoc.options << '--line-numbers' << '--all'
33
+ end
34
+
35
+
36
+
37
+ #############################################################################
38
+ desc "Run all tests"
39
+ task :test => [:init] do
40
+ unless File.directory?('test')
41
+ $stderr.puts 'no test in this package'
42
+ return
43
+ end
44
+ $stderr.puts 'Running tests...'
45
+ TESTDIR = "test"
46
+ begin
47
+ require 'test/unit'
48
+ rescue LoadError
49
+ $stderr.puts 'test/unit cannot loaded. You need Ruby 1.8 or later to invoke this task.'
50
+ end
51
+
52
+ $LOAD_PATH.unshift("./")
53
+ $LOAD_PATH.unshift(TESTDIR)
54
+ Dir[File.join(TESTDIR, "*.rb")].each {|file| require File.basename(file) }
55
+ require 'minitest/autorun'
56
+ end
57
+
58
+
@@ -0,0 +1,21 @@
1
+ require "spec_helper"
2
+
3
+ describe ParseDecision::PDContext do
4
+
5
+ let(:context) { ParseDecision::PDContext.new }
6
+
7
+ it "throws an exception if invalid target state is requested" do
8
+ expect { context.state = :notAValidState }.to raise_error("Invalid target state: notAValidState")
9
+ end
10
+
11
+ Given(:target_dir) { 'spec/data' }
12
+ Given(:target_file) { 'testfile.txt' }
13
+
14
+ context "#src_file sets the source dir and file" do
15
+ When { context.src_file = File.join(target_dir, target_file) }
16
+
17
+ Then { context.srcdir.should eq target_dir }
18
+ Then { context.file.should eq target_file }
19
+ end
20
+
21
+ end # describe ParseDecision::PDContext