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.
- checksums.yaml +4 -4
- data/.gitignore +3 -5
- data/Gemfile +0 -2
- data/Rakefile +8 -1
- data/fbo.gemspec +14 -9
- data/lib/fbo.rb +7 -38
- data/lib/fbo/chunked_file.rb +74 -0
- data/lib/fbo/dump.treetop +324 -0
- data/lib/fbo/file.rb +17 -1
- data/lib/fbo/interpreter.rb +87 -0
- data/lib/fbo/node_extensions.rb +173 -0
- data/lib/fbo/parser.rb +43 -46
- data/lib/fbo/remote_file.rb +4 -4
- data/lib/fbo/version.rb +1 -1
- data/spec/fbo/chunked_file_spec.rb +22 -0
- data/spec/fbo/file_spec.rb +26 -9
- data/spec/fbo/interpreter_spec.rb +73 -0
- data/spec/fbo/parser_spec.rb +36 -38
- data/spec/fbo/remote_file_spec.rb +28 -24
- data/spec/fixtures/.keep +0 -0
- data/spec/fixtures/FBOFeed20130331 +52 -5529
- data/spec/fixtures/FBOFeed20131003 +35126 -0
- data/spec/spec_helper.rb +14 -16
- metadata +70 -108
- data/.rspec +0 -2
- data/Gemfile.lock +0 -27
- data/lib/fbo/notice.rb +0 -9
- data/lib/fbo/notices.rb +0 -6
- data/lib/fbo/notices/amendment.rb +0 -13
- data/lib/fbo/notices/archive.rb +0 -8
- data/lib/fbo/notices/award.rb +0 -14
- data/lib/fbo/notices/combined_solicitation.rb +0 -14
- data/lib/fbo/notices/fair_opportunity.rb +0 -15
- data/lib/fbo/notices/foreign_standard.rb +0 -13
- data/lib/fbo/notices/intent_to_bundle.rb +0 -13
- data/lib/fbo/notices/justification_approval.rb +0 -18
- data/lib/fbo/notices/modification.rb +0 -14
- data/lib/fbo/notices/presolicitation.rb +0 -14
- data/lib/fbo/notices/sale_of_surplus.rb +0 -13
- data/lib/fbo/notices/sources_sought.rb +0 -13
- data/lib/fbo/notices/special_notice.rb +0 -13
- data/lib/fbo/notices/unarchive.rb +0 -9
- data/lib/fbo/notices/unknown.rb +0 -7
- data/lib/fbo/parser/amendment_handler.rb +0 -58
- data/lib/fbo/parser/archive_handler.rb +0 -41
- data/lib/fbo/parser/award_handler.rb +0 -62
- data/lib/fbo/parser/combined_solicitation_handler.rb +0 -57
- data/lib/fbo/parser/fair_opportunity_handler.rb +0 -61
- data/lib/fbo/parser/foreign_standard_handler.rb +0 -57
- data/lib/fbo/parser/handler_selector.rb +0 -37
- data/lib/fbo/parser/intent_to_bundle_handler.rb +0 -56
- data/lib/fbo/parser/justification_approval_handler.rb +0 -60
- data/lib/fbo/parser/modification_handler.rb +0 -66
- data/lib/fbo/parser/notice_handler.rb +0 -27
- data/lib/fbo/parser/parser_helper.rb +0 -315
- data/lib/fbo/parser/presolicitation_handler.rb +0 -57
- data/lib/fbo/parser/sale_of_surplus_handler.rb +0 -57
- data/lib/fbo/parser/sources_sought_handler.rb +0 -57
- data/lib/fbo/parser/special_notice_handler.rb +0 -57
- data/lib/fbo/parser/unarchive_handler.rb +0 -42
- data/lib/fbo/parser/unknown_handler.rb +0 -20
- data/spec/fbo/parser/amendment_handler_spec.rb +0 -51
- data/spec/fbo/parser/archive_handler_spec.rb +0 -36
- data/spec/fbo/parser/award_handler_spec.rb +0 -56
- data/spec/fbo/parser/combined_solicitation_handler_spec.rb +0 -51
- data/spec/fbo/parser/fair_opportunity_handler_spec.rb +0 -56
- data/spec/fbo/parser/foreign_standard_handler_spec.rb +0 -51
- data/spec/fbo/parser/handler_selector_spec.rb +0 -40
- data/spec/fbo/parser/intent_to_bundle_handler_spec.rb +0 -52
- data/spec/fbo/parser/justification_approval_handler_spec.rb +0 -53
- data/spec/fbo/parser/modification_handler_spec.rb +0 -52
- data/spec/fbo/parser/presolicitation_handler_spec.rb +0 -51
- data/spec/fbo/parser/sale_of_surplus_handler_spec.rb +0 -53
- data/spec/fbo/parser/sources_sought_handler_spec.rb +0 -51
- data/spec/fbo/parser/special_notice_handler_spec.rb +0 -53
- data/spec/fbo/parser/unarchive_handler_spec.rb +0 -37
- data/spec/fbo/parser/unknown_handler_spec.rb +0 -24
- data/spec/fixtures/FBOFeed20130404 +0 -45653
- data/spec/fixtures/FBOFeed20130406 +0 -10152
- data/spec/fixtures/FBOFeed20130407 +0 -6610
- data/spec/fixtures/notices/amdcss +0 -26
- data/spec/fixtures/notices/archive +0 -10
- data/spec/fixtures/notices/award +0 -31
- data/spec/fixtures/notices/combine +0 -29
- data/spec/fixtures/notices/fairopp +0 -29
- data/spec/fixtures/notices/fstd +0 -24
- data/spec/fixtures/notices/itb +0 -19
- data/spec/fixtures/notices/ja +0 -30
- data/spec/fixtures/notices/mod +0 -28
- data/spec/fixtures/notices/notanotice +0 -7
- data/spec/fixtures/notices/presol +0 -25
- data/spec/fixtures/notices/snote +0 -26
- data/spec/fixtures/notices/srcsgt +0 -27
- data/spec/fixtures/notices/ssale +0 -24
- data/spec/fixtures/notices/unarchive +0 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f7da92f700f183764c8e4964b1b3f8c68f2cea39
|
4
|
+
data.tar.gz: cc5fb5d1eeef566f49ca7481aba104f977ead804
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
9
|
-
|
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
data/Rakefile
CHANGED
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 =
|
7
|
+
spec.name = 'fbo'
|
8
8
|
spec.version = FBO::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
11
|
-
spec.summary =
|
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 =
|
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 = [
|
26
|
+
spec.require_paths = ['lib']
|
27
27
|
|
28
|
-
spec.
|
29
|
-
|
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
|
-
|
1
|
+
require 'fbo/version'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
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
|