fbo 0.0.3 → 0.1.0

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 (95) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -5
  3. data/Gemfile +0 -2
  4. data/Rakefile +8 -1
  5. data/fbo.gemspec +14 -9
  6. data/lib/fbo.rb +7 -38
  7. data/lib/fbo/chunked_file.rb +74 -0
  8. data/lib/fbo/dump.treetop +324 -0
  9. data/lib/fbo/file.rb +17 -1
  10. data/lib/fbo/interpreter.rb +87 -0
  11. data/lib/fbo/node_extensions.rb +173 -0
  12. data/lib/fbo/parser.rb +43 -46
  13. data/lib/fbo/remote_file.rb +4 -4
  14. data/lib/fbo/version.rb +1 -1
  15. data/spec/fbo/chunked_file_spec.rb +22 -0
  16. data/spec/fbo/file_spec.rb +26 -9
  17. data/spec/fbo/interpreter_spec.rb +73 -0
  18. data/spec/fbo/parser_spec.rb +36 -38
  19. data/spec/fbo/remote_file_spec.rb +28 -24
  20. data/spec/fixtures/.keep +0 -0
  21. data/spec/fixtures/FBOFeed20130331 +52 -5529
  22. data/spec/fixtures/FBOFeed20131003 +35126 -0
  23. data/spec/spec_helper.rb +14 -16
  24. metadata +70 -108
  25. data/.rspec +0 -2
  26. data/Gemfile.lock +0 -27
  27. data/lib/fbo/notice.rb +0 -9
  28. data/lib/fbo/notices.rb +0 -6
  29. data/lib/fbo/notices/amendment.rb +0 -13
  30. data/lib/fbo/notices/archive.rb +0 -8
  31. data/lib/fbo/notices/award.rb +0 -14
  32. data/lib/fbo/notices/combined_solicitation.rb +0 -14
  33. data/lib/fbo/notices/fair_opportunity.rb +0 -15
  34. data/lib/fbo/notices/foreign_standard.rb +0 -13
  35. data/lib/fbo/notices/intent_to_bundle.rb +0 -13
  36. data/lib/fbo/notices/justification_approval.rb +0 -18
  37. data/lib/fbo/notices/modification.rb +0 -14
  38. data/lib/fbo/notices/presolicitation.rb +0 -14
  39. data/lib/fbo/notices/sale_of_surplus.rb +0 -13
  40. data/lib/fbo/notices/sources_sought.rb +0 -13
  41. data/lib/fbo/notices/special_notice.rb +0 -13
  42. data/lib/fbo/notices/unarchive.rb +0 -9
  43. data/lib/fbo/notices/unknown.rb +0 -7
  44. data/lib/fbo/parser/amendment_handler.rb +0 -58
  45. data/lib/fbo/parser/archive_handler.rb +0 -41
  46. data/lib/fbo/parser/award_handler.rb +0 -62
  47. data/lib/fbo/parser/combined_solicitation_handler.rb +0 -57
  48. data/lib/fbo/parser/fair_opportunity_handler.rb +0 -61
  49. data/lib/fbo/parser/foreign_standard_handler.rb +0 -57
  50. data/lib/fbo/parser/handler_selector.rb +0 -37
  51. data/lib/fbo/parser/intent_to_bundle_handler.rb +0 -56
  52. data/lib/fbo/parser/justification_approval_handler.rb +0 -60
  53. data/lib/fbo/parser/modification_handler.rb +0 -66
  54. data/lib/fbo/parser/notice_handler.rb +0 -27
  55. data/lib/fbo/parser/parser_helper.rb +0 -315
  56. data/lib/fbo/parser/presolicitation_handler.rb +0 -57
  57. data/lib/fbo/parser/sale_of_surplus_handler.rb +0 -57
  58. data/lib/fbo/parser/sources_sought_handler.rb +0 -57
  59. data/lib/fbo/parser/special_notice_handler.rb +0 -57
  60. data/lib/fbo/parser/unarchive_handler.rb +0 -42
  61. data/lib/fbo/parser/unknown_handler.rb +0 -20
  62. data/spec/fbo/parser/amendment_handler_spec.rb +0 -51
  63. data/spec/fbo/parser/archive_handler_spec.rb +0 -36
  64. data/spec/fbo/parser/award_handler_spec.rb +0 -56
  65. data/spec/fbo/parser/combined_solicitation_handler_spec.rb +0 -51
  66. data/spec/fbo/parser/fair_opportunity_handler_spec.rb +0 -56
  67. data/spec/fbo/parser/foreign_standard_handler_spec.rb +0 -51
  68. data/spec/fbo/parser/handler_selector_spec.rb +0 -40
  69. data/spec/fbo/parser/intent_to_bundle_handler_spec.rb +0 -52
  70. data/spec/fbo/parser/justification_approval_handler_spec.rb +0 -53
  71. data/spec/fbo/parser/modification_handler_spec.rb +0 -52
  72. data/spec/fbo/parser/presolicitation_handler_spec.rb +0 -51
  73. data/spec/fbo/parser/sale_of_surplus_handler_spec.rb +0 -53
  74. data/spec/fbo/parser/sources_sought_handler_spec.rb +0 -51
  75. data/spec/fbo/parser/special_notice_handler_spec.rb +0 -53
  76. data/spec/fbo/parser/unarchive_handler_spec.rb +0 -37
  77. data/spec/fbo/parser/unknown_handler_spec.rb +0 -24
  78. data/spec/fixtures/FBOFeed20130404 +0 -45653
  79. data/spec/fixtures/FBOFeed20130406 +0 -10152
  80. data/spec/fixtures/FBOFeed20130407 +0 -6610
  81. data/spec/fixtures/notices/amdcss +0 -26
  82. data/spec/fixtures/notices/archive +0 -10
  83. data/spec/fixtures/notices/award +0 -31
  84. data/spec/fixtures/notices/combine +0 -29
  85. data/spec/fixtures/notices/fairopp +0 -29
  86. data/spec/fixtures/notices/fstd +0 -24
  87. data/spec/fixtures/notices/itb +0 -19
  88. data/spec/fixtures/notices/ja +0 -30
  89. data/spec/fixtures/notices/mod +0 -28
  90. data/spec/fixtures/notices/notanotice +0 -7
  91. data/spec/fixtures/notices/presol +0 -25
  92. data/spec/fixtures/notices/snote +0 -26
  93. data/spec/fixtures/notices/srcsgt +0 -27
  94. data/spec/fixtures/notices/ssale +0 -24
  95. data/spec/fixtures/notices/unarchive +0 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b0c4e53ddeb9ea9df943ef8af9ca33a4e1f99bbc
4
- data.tar.gz: bc42c21126580a453a02996fa1799375d7057339
3
+ metadata.gz: f7da92f700f183764c8e4964b1b3f8c68f2cea39
4
+ data.tar.gz: cc5fb5d1eeef566f49ca7481aba104f977ead804
5
5
  SHA512:
6
- metadata.gz: 02ea8f7e4d11ba748b01abbe212952c958cb8e20f95b690dfd4b1da657e7bbdb6f744728395b8c2a3c523b8208d5f2560ff57811e3cc92dd2f27b2654d6dada7
7
- data.tar.gz: 02ec6b226bbf7c58391fb0073c28bedb6635ad96dc73676f4c353511e585d6554cf27f3226a05c7e6cf6ac7f7c748c8e70703a4728e4e03d4b9fe3c30600e468
6
+ metadata.gz: 81cefd851decaefb1e611a0ca7509e9ced5e942eaab3797fa268117d23f5d4eb2b08682a27811699b9ed3fbc4786e4deec0a5c67d445f2a7a7108204c42a139d
7
+ data.tar.gz: 1ebca32362436a4b6737c00eb05c04c3f1cba34d777d45f5dc1458c36ea8acbba3469afc524d28e3b0a116528c75e8e1326b7132a6796d381d2bc5f45c140fb3
data/.gitignore CHANGED
@@ -5,8 +5,9 @@
5
5
 
6
6
  # Bundler artifacts
7
7
  .bundle
8
- bundler_stubs/
9
- vendor/
8
+ bin/
9
+ Gemfile.lock
10
+ vendor/bundle
10
11
 
11
12
  # Ruby / Rails operational files
12
13
  .rvmrc
@@ -18,9 +19,6 @@ vendor/
18
19
  *.swo
19
20
  tmp
20
21
 
21
- # Reporting directory
22
- /reports/
23
-
24
22
  # Rubygems artifacts
25
23
  *.gem
26
24
 
data/Gemfile CHANGED
@@ -2,5 +2,3 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in fbo.gemspec
4
4
  gemspec
5
-
6
- gem 'rspec'
data/Rakefile CHANGED
@@ -1 +1,8 @@
1
- require "bundler/gem_tasks"
1
+ require 'bundler/gem_tasks'
2
+
3
+ require 'rake/testtask'
4
+
5
+ Rake::TestTask.new do |t|
6
+ t.libs += %w( spec test )
7
+ t.pattern = '{spec,test}/**/*_{spec,test}.rb'
8
+ end
data/fbo.gemspec CHANGED
@@ -4,11 +4,11 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'fbo/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
- spec.name = "fbo"
7
+ spec.name = 'fbo'
8
8
  spec.version = FBO::VERSION
9
- spec.authors = ["Chris Kottom"]
10
- spec.email = ["chris@chriskottom.com"]
11
- spec.summary = "Parse and process FBO bulk listings"
9
+ spec.authors = ['Chris Kottom']
10
+ spec.email = ['chris@chriskottom.com']
11
+ spec.summary = 'Parse and process FBO bulk listings'
12
12
  spec.description = <<-EOF
13
13
  The FBO gem manages the process of downloading and parsing file-based notice
14
14
  information from the Federal Business Opportunities (https://www.fbo.gov/)
@@ -17,14 +17,19 @@ Gem::Specification.new do |spec|
17
17
  concerning the offer and disposition of federal government contracts and
18
18
  tenders.
19
19
  EOF
20
- spec.homepage = ""
21
- spec.license = "MIT"
20
+ spec.homepage = ''
21
+ spec.license = 'MIT'
22
22
 
23
23
  spec.files = `git ls-files`.split($/)
24
24
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
25
25
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
26
- spec.require_paths = ["lib"]
26
+ spec.require_paths = ['lib']
27
27
 
28
- spec.add_development_dependency "bundler", "~> 1.3"
29
- spec.add_development_dependency "rake"
28
+ spec.add_runtime_dependency 'treetop'
29
+
30
+ spec.add_development_dependency 'bundler', '~> 1.3'
31
+ spec.add_development_dependency 'rake'
32
+ spec.add_development_dependency 'minitest', '~> 4.7.5'
33
+ spec.add_development_dependency 'mocha'
34
+ spec.add_development_dependency 'turn'
30
35
  end
data/lib/fbo.rb CHANGED
@@ -1,42 +1,11 @@
1
- require_relative "fbo/version"
1
+ require 'fbo/version'
2
2
 
3
- require_relative "fbo/file"
4
- require_relative "fbo/remote_file"
5
- require_relative "fbo/notice"
6
- require_relative "fbo/notices/amendment"
7
- require_relative "fbo/notices/archive"
8
- require_relative "fbo/notices/award"
9
- require_relative "fbo/notices/combined_solicitation"
10
- require_relative "fbo/notices/fair_opportunity"
11
- require_relative "fbo/notices/foreign_standard"
12
- require_relative "fbo/notices/intent_to_bundle"
13
- require_relative "fbo/notices/justification_approval"
14
- require_relative "fbo/notices/modification"
15
- require_relative "fbo/notices/presolicitation"
16
- require_relative "fbo/notices/sale_of_surplus"
17
- require_relative "fbo/notices/sources_sought"
18
- require_relative "fbo/notices/special_notice"
19
- require_relative "fbo/notices/unarchive"
20
- require_relative "fbo/notices/unknown"
21
- require_relative "fbo/parser"
22
- require_relative "fbo/parser/handler_selector"
23
- require_relative "fbo/parser/notice_handler"
24
- require_relative "fbo/parser/parser_helper"
25
- require_relative "fbo/parser/amendment_handler"
26
- require_relative "fbo/parser/archive_handler"
27
- require_relative "fbo/parser/award_handler"
28
- require_relative "fbo/parser/combined_solicitation_handler"
29
- require_relative "fbo/parser/fair_opportunity_handler"
30
- require_relative "fbo/parser/foreign_standard_handler"
31
- require_relative "fbo/parser/intent_to_bundle_handler"
32
- require_relative "fbo/parser/justification_approval_handler"
33
- require_relative "fbo/parser/modification_handler"
34
- require_relative "fbo/parser/presolicitation_handler"
35
- require_relative "fbo/parser/sale_of_surplus_handler"
36
- require_relative "fbo/parser/sources_sought_handler"
37
- require_relative "fbo/parser/special_notice_handler"
38
- require_relative "fbo/parser/unarchive_handler"
39
- require_relative "fbo/parser/unknown_handler"
3
+ require 'fbo/file'
4
+ require 'fbo/chunked_file'
5
+ require 'fbo/remote_file'
6
+ require 'fbo/parser'
7
+ require 'fbo/node_extensions'
8
+ require 'fbo/interpreter'
40
9
 
41
10
  module FBO
42
11
  end
@@ -0,0 +1,74 @@
1
+ require 'forwardable'
2
+
3
+ module FBO
4
+ class ChunkedFile
5
+ extend Forwardable
6
+
7
+ attr_reader :file, :chunk_size
8
+ def_delegators :@file, :readline, :read, :eof?
9
+
10
+
11
+ DEFAULT_CHUNK_SIZE = 250 * 1024 # 250KB
12
+ NOTICE_TAG_NAMES = %w( PRESOL COMBINE AMDCSS MOD AWARD JA ITB FAIROPP FSTD) +
13
+ %w( SRCSGT SNOTE SSALE EPSUPLOAD DELETE ARCHIVE UNARCHIVE )
14
+ NOTICE_CLOSE_REGEXP = /<\/(#{ NOTICE_TAG_NAMES.join('|') })>$/
15
+
16
+
17
+ def initialize(file, chunk_size = DEFAULT_CHUNK_SIZE)
18
+ @file = file
19
+ @chunk_size = chunk_size
20
+ end
21
+
22
+ def contents
23
+ if @contents.nil?
24
+ @contents = []
25
+ while !eof?
26
+ @contents << next_chunk
27
+ end
28
+ @contents.compact!
29
+ end
30
+ @contents
31
+ end
32
+
33
+
34
+ private
35
+
36
+ def next_chunk
37
+ return nil if eof?
38
+
39
+ chunk, line = "", ""
40
+
41
+ # Run up the chunk to about #chunk_size.
42
+ begin
43
+ line = gets
44
+ break unless line
45
+ chunk += line
46
+ end while (chunk.bytesize < @chunk_size)
47
+
48
+ # Add lines up to the end of a notice.
49
+ if line && line !~ NOTICE_CLOSE_REGEXP
50
+ begin
51
+ line = gets
52
+ break unless line
53
+ chunk += line
54
+ break if line =~ NOTICE_CLOSE_REGEXP
55
+ end while (true)
56
+ end
57
+
58
+ return chunk.strip
59
+ end
60
+
61
+ def gets
62
+ line = file.gets
63
+ return unless line
64
+ cleanup_data(line)
65
+ end
66
+
67
+ def cleanup_data(data)
68
+ data.encode('UTF-16le', :invalid => :replace, :replace => '')
69
+ .encode('UTF-8')
70
+ .gsub(/\r\n/, "\n")
71
+ .gsub(/^M/, "")
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,324 @@
1
+ module FBO
2
+ grammar Dump
3
+
4
+ # Non-domain structural elements
5
+ #
6
+ rule dumpfile
7
+ notice* <DumpNode>
8
+ end
9
+
10
+ rule notice
11
+ presol / combine / amdcss / mod / award / ja / itb / fairopp / srcsgt /
12
+ fstd / snote / ssale / epsupload / delete / archive / unarchive
13
+ end
14
+
15
+ rule body
16
+ body_tag? body_tag? body_tag? body_tag? body_tag? body_tag? body_tag?
17
+ body_tag? body_tag? body_tag? body_tag? body_tag? body_tag? body_tag?
18
+ body_tag? body_tag? body_tag? body_tag? body_tag? body_tag? body_tag?
19
+ body_tag? body_tag? body_tag? body_tag? body_tag? body_tag? body_tag?
20
+ body_tag? body_tag? body_tag? body_tag? body_tag? body_tag? body_tag?
21
+ body_tag? body_tag? body_tag? body_tag? body_tag? body_tag? body_tag?
22
+ body_tag? body_tag? body_tag? body_tag? body_tag? body_tag? body_tag?
23
+ body_tag? body_tag? body_tag? body_tag? body_tag? body_tag? body_tag?
24
+ body_tag? body_tag? body_tag? body_tag? body_tag? body_tag? body_tag?
25
+ body_tag? body_tag? body_tag? body_tag? body_tag? body_tag? body_tag?
26
+ <BodyNode>
27
+ end
28
+
29
+ rule tag_open
30
+ '<' tag_name '>'
31
+ end
32
+
33
+ rule tag_close
34
+ '</' ( notice_tag_name / 'FILELIST' / 'FILE' ) '>'
35
+ end
36
+
37
+ rule end_of_tag
38
+ space? &( tag_open / tag_close / end_of_buffer )
39
+ end
40
+
41
+ rule tag_content
42
+ ( !end_of_tag ( . / "\n" ) )* <TagContentNode>
43
+ end
44
+
45
+ rule space
46
+ [ \t\n\r]+
47
+ end
48
+
49
+ rule end_of_buffer
50
+ !.
51
+ end
52
+
53
+
54
+ # Domain constants
55
+ #
56
+ rule notice_tag_name
57
+ 'PRESOL' / 'COMBINE' / 'AMDCSS' / 'MOD' / 'AWARD' / 'JA' / 'ITB' /
58
+ 'FAIROPP' / 'SRCSGT' / 'FSTD' / 'SNOTE' / 'SSALE' / 'EPSUPLOAD' /
59
+ 'DELETE' / 'ARCHIVE' / 'UNARCHIVE'
60
+ end
61
+
62
+ rule body_tag_name
63
+ 'DATE' / 'YEAR' / 'CBAC' / 'PASSWORD' / 'ZIP' / 'CLASSCOD' / 'NAICS' /
64
+ 'OFFADD' / 'CONTACT' / 'SUBJECT' / 'DESC' / 'SOLNBR' / 'NTYPE' /
65
+ 'RESPDATE' / 'ARCHDATE' / 'LINK' / 'URL' / 'EMAIL' / 'ADDRESS' /
66
+ 'FILELIST' / 'FILE' / 'URL' / 'MIMETYPE' / 'SETASIDE' / 'POPADDRESS' /
67
+ 'POPZIP' / 'POPCOUNTRY' / 'CORRECTION' / 'AWDNBR' / 'AWDAMT' / 'LINENBR' /
68
+ 'AWDDATE' / 'AWARDEEDUNS' / 'AWARDEE_DUNS' / 'AWARDEE' / 'STAUTH' /
69
+ 'MODNBR' / 'USERID' / 'PROJID' / 'UPLOADTYPE' / 'DONBR' / 'FOJA' /
70
+ 'RESPONSEDATE' / 'AGENCY' / 'LOCATION' / 'OFFICE'
71
+ end
72
+
73
+ rule tag_name
74
+ body_tag_name / notice_tag_name
75
+ end
76
+
77
+
78
+ # Notice types
79
+ #
80
+ rule presol
81
+ '<PRESOL>' space? body '</PRESOL>' space? <PresolicitationNode>
82
+ end
83
+
84
+ rule combine
85
+ '<COMBINE>' space? body '</COMBINE>' space? <CombinedSolicitationNode>
86
+ end
87
+
88
+ rule amdcss
89
+ '<AMDCSS>' space? body '</AMDCSS>' space? <AmendmentNode>
90
+ end
91
+
92
+ rule mod
93
+ '<MOD>' space? body '</MOD>' space? <ModificationNode>
94
+ end
95
+
96
+ rule award
97
+ '<AWARD>' space? body '</AWARD>' space? <AwardNode>
98
+ end
99
+
100
+ rule ja
101
+ '<JA>' space? body '</JA>' space? <JustificationAndApprovalNode>
102
+ end
103
+
104
+ rule itb
105
+ '<ITB>' space? body '</ITB>' space? <IntentToBundleNode>
106
+ end
107
+
108
+ rule fairopp
109
+ '<FAIROPP>' space? body '</FAIROPP>' space? <FairOpportunityNode>
110
+ end
111
+
112
+ rule srcsgt
113
+ '<SRCSGT>' space? body '</SRCSGT>' space? <SourcesSoughtNode>
114
+ end
115
+
116
+ rule fstd
117
+ '<FSTD>' space? body '</FSTD>' space? <ForeignStandardNode>
118
+ end
119
+
120
+ rule snote
121
+ '<SNOTE>' space? body '</SNOTE>' space? <SpecialNoticeNode>
122
+ end
123
+
124
+ rule ssale
125
+ '<SSALE>' space? body '</SSALE>' space? <SaleOfSurplusNode>
126
+ end
127
+
128
+ rule epsupload
129
+ '<EPSUPLOAD>' space? body '</EPSUPLOAD>' space? <DocumentUploadNode>
130
+ end
131
+
132
+ rule delete
133
+ '<DELETE>' space? body '</DELETE>' space? <DocumentDeletingNode>
134
+ end
135
+
136
+ rule archive
137
+ '<ARCHIVE>' space? body '</ARCHIVE>' space? <DocumentArchivalNode>
138
+ end
139
+
140
+ rule unarchive
141
+ '<UNARCHIVE>' space? body '</UNARCHIVE>' space? <DocumentUnarchivalNode>
142
+ end
143
+
144
+
145
+ # Body tags
146
+ #
147
+ rule body_tag
148
+ date / year / zip / agency / office / location / classcod / naics /
149
+ offadd / subject / solnbr / respdate / contact / desc / link / url /
150
+ setaside / popcountry / popzip / popaddress / archdate / ntype / awdnbr /
151
+ awdamt / linenbr / awardee / awardee_duns / awddate / email /
152
+ email_address / stauth / foja / donbr / cbac / password / projid /
153
+ uploadtype / filelist / file / mimetype / correction
154
+ end
155
+
156
+ rule date
157
+ '<DATE>' space? tag_content end_of_tag <DateNode>
158
+ end
159
+
160
+ rule year
161
+ '<YEAR>' space? tag_content end_of_tag <YearNode>
162
+ end
163
+
164
+ rule cbac
165
+ ( '<CBAC>' / '<USERID>' ) space? tag_content end_of_tag <CBACNode>
166
+ end
167
+
168
+ rule password
169
+ '<PASSWORD>' space? tag_content end_of_tag <PasswordNode>
170
+ end
171
+
172
+ rule zip
173
+ '<ZIP>' space? tag_content end_of_tag <ZipNode>
174
+ end
175
+
176
+ rule agency
177
+ '<AGENCY>' space? tag_content end_of_tag <AgencyNode>
178
+ end
179
+
180
+ rule office
181
+ '<OFFICE>' space? tag_content end_of_tag <OfficeNode>
182
+ end
183
+
184
+ rule location
185
+ '<LOCATION>' space? tag_content end_of_tag <LocationNode>
186
+ end
187
+
188
+ rule classcod
189
+ '<CLASSCOD>' space? tag_content end_of_tag <ClassificationCodeNode>
190
+ end
191
+
192
+ rule naics
193
+ '<NAICS>' space? tag_content end_of_tag <NaicsCodeNode>
194
+ end
195
+
196
+ rule offadd
197
+ '<OFFADD>' space? tag_content end_of_tag <OfficeAddressNode>
198
+ end
199
+
200
+ rule subject
201
+ '<SUBJECT>' space? tag_content end_of_tag <SubjectNode>
202
+ end
203
+
204
+ rule solnbr
205
+ '<SOLNBR>' space? tag_content end_of_tag <SolicitationNumberNode>
206
+ end
207
+
208
+ rule respdate
209
+ ( '<RESPDATE>' / '<RESPONSEDATE>' ) space? tag_content end_of_tag <ResponseDateNode>
210
+ end
211
+
212
+ rule archdate
213
+ '<ARCHDATE>' space? tag_content end_of_tag <ArchiveDateNode>
214
+ end
215
+
216
+ rule contact
217
+ '<CONTACT>' space? tag_content end_of_tag <ContactNode>
218
+ end
219
+
220
+ rule desc
221
+ '<DESC>' space? tag_content end_of_tag <DescriptionNode>
222
+ end
223
+
224
+ rule link
225
+ '<LINK>' space? url? desc? url? <LinkNode>
226
+ end
227
+
228
+ rule url
229
+ '<URL>' space? tag_content end_of_tag <UrlNode>
230
+ end
231
+
232
+ rule setaside
233
+ '<SETASIDE>' space? tag_content end_of_tag <SetAsideNode>
234
+ end
235
+
236
+ rule popcountry
237
+ '<POPCOUNTRY>' space? tag_content end_of_tag <PopCountryNode>
238
+ end
239
+
240
+ rule popzip
241
+ '<POPZIP>' space? tag_content end_of_tag <PopZipNode>
242
+ end
243
+
244
+ rule popaddress
245
+ '<POPADDRESS>' space? tag_content end_of_tag <PopAddressNode>
246
+ end
247
+
248
+ rule ntype
249
+ '<NTYPE>' space? tag_content end_of_tag <NoticeTypeNode>
250
+ end
251
+
252
+ rule awdnbr
253
+ '<AWDNBR>' space? tag_content end_of_tag <AwardNumberNode>
254
+ end
255
+
256
+ rule awdamt
257
+ '<AWDAMT>' space? tag_content end_of_tag <AwardAmountNode>
258
+ end
259
+
260
+ rule awddate
261
+ '<AWDDATE>' space? tag_content end_of_tag <AwardDateNode>
262
+ end
263
+
264
+ rule linenbr
265
+ '<LINENBR>' space? tag_content end_of_tag <LineNumberNode>
266
+ end
267
+
268
+ rule awardee
269
+ '<AWARDEE>' space? tag_content end_of_tag <AwardeeNode>
270
+ end
271
+
272
+ rule awardee_duns
273
+ ( '<AWARDEEDUNS>' / '<AWARDEE_DUNS>' ) space? tag_content end_of_tag <AwardeeDunsNode>
274
+ end
275
+
276
+ rule email_address
277
+ ( '<EMAIL>' / '<ADDRESS>' ) space? tag_content end_of_tag <EmailAddressNode>
278
+ end
279
+
280
+ rule email
281
+ '<EMAIL>' space? email_address? desc? email_address? <EmailNode>
282
+ end
283
+
284
+ rule stauth
285
+ '<STAUTH>' space? tag_content end_of_tag <StatutoryAuthorityNode>
286
+ end
287
+
288
+ rule foja
289
+ '<FOJA>' space? tag_content end_of_tag <JustificationAuthorityNode>
290
+ end
291
+
292
+ rule donbr
293
+ '<DONBR>' space? tag_content end_of_tag <DeliveryOrderNumberNode>
294
+ end
295
+
296
+ rule projid
297
+ '<PROJID>' space? tag_content end_of_tag <ProjectIDNode>
298
+ end
299
+
300
+ rule uploadtype
301
+ '<UPLOADTYPE>' space? tag_content end_of_tag <UploadTypeNode>
302
+ end
303
+
304
+ rule filelist
305
+ '<FILELIST>' space? file? space? file? space? '</FILELIST>' space? <FileListNode>
306
+ end
307
+
308
+ rule file
309
+ '<FILE>' space? url? desc? mimetype? url? desc? url? mimetype? desc? space? '</FILE>' <FileNode>
310
+ end
311
+
312
+ rule mimetype
313
+ '<MIMETYPE>' space? tag_content end_of_tag <MimeTypeNode>
314
+ end
315
+
316
+ rule correction
317
+ '<CORRECTION>' space? tag_content end_of_tag <CorrectionNode>
318
+ end
319
+
320
+ rule modnbr
321
+ '<MODNBR>' space? tag_content end_of_tag <ModificationNumberNode>
322
+ end
323
+ end
324
+ end