parse_decision 0.0.5

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