fech 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 (71) hide show
  1. data/.gitignore +7 -0
  2. data/.rspec +2 -0
  3. data/Gemfile +4 -0
  4. data/Gemfile.lock +49 -0
  5. data/LICENSE +13 -0
  6. data/README.rdoc +178 -0
  7. data/Rakefile +3 -0
  8. data/autotest/discover.rb +1 -0
  9. data/fech.gemspec +32 -0
  10. data/lib/fech.rb +13 -0
  11. data/lib/fech/default_translations.rb +135 -0
  12. data/lib/fech/fech_utils.rb +41 -0
  13. data/lib/fech/filing.rb +248 -0
  14. data/lib/fech/map_generator.rb +187 -0
  15. data/lib/fech/mapped.rb +38 -0
  16. data/lib/fech/mappings.rb +66 -0
  17. data/lib/fech/translator.rb +138 -0
  18. data/lib/fech/version.rb +3 -0
  19. data/sources/F3P.csv +1 -0
  20. data/sources/F3P31.csv +1 -0
  21. data/sources/F3PS.csv +1 -0
  22. data/sources/F3S.csv +1 -0
  23. data/sources/HDR.csv +1 -0
  24. data/sources/SchA.csv +1 -0
  25. data/sources/SchB.csv +1 -0
  26. data/sources/SchC.csv +1 -0
  27. data/sources/SchC1.csv +1 -0
  28. data/sources/SchC2.csv +1 -0
  29. data/sources/SchD.csv +1 -0
  30. data/sources/SchE.csv +1 -0
  31. data/sources/SchF.csv +1 -0
  32. data/sources/TEXT.csv +1 -0
  33. data/sources/headers/3.csv +1 -0
  34. data/sources/headers/5.0.csv +1 -0
  35. data/sources/headers/5.1.csv +1 -0
  36. data/sources/headers/5.2.csv +1 -0
  37. data/sources/headers/5.3.csv +1 -0
  38. data/sources/headers/6.1.csv +1 -0
  39. data/sources/headers/6.2.csv +1 -0
  40. data/sources/headers/6.3.csv +1 -0
  41. data/sources/headers/6.4.csv +1 -0
  42. data/sources/headers/7.0.csv +1 -0
  43. data/sources/headers/ignore.csv +5 -0
  44. data/spec/data/723604.fec +4 -0
  45. data/spec/data/97405.fec +10 -0
  46. data/spec/default_translations_spec.rb +104 -0
  47. data/spec/fech_utils_spec.rb +29 -0
  48. data/spec/filing_spec.rb +251 -0
  49. data/spec/map_generator_spec.rb +49 -0
  50. data/spec/mapped_spec.rb +44 -0
  51. data/spec/mappings_spec.rb +46 -0
  52. data/spec/sources/F3P.csv +1 -0
  53. data/spec/sources/SchA.csv +1 -0
  54. data/spec/sources/SchB.csv +1 -0
  55. data/spec/sources/SchC.csv +1 -0
  56. data/spec/sources/headers/3.csv +1 -0
  57. data/spec/sources/headers/5.0.csv +1 -0
  58. data/spec/sources/headers/5.1.csv +1 -0
  59. data/spec/sources/headers/5.2.csv +1 -0
  60. data/spec/sources/headers/5.3.csv +1 -0
  61. data/spec/sources/headers/6.1.csv +1 -0
  62. data/spec/sources/headers/6.2.csv +1 -0
  63. data/spec/sources/headers/6.3.csv +1 -0
  64. data/spec/sources/headers/6.4.csv +1 -0
  65. data/spec/sources/headers/7.0.csv +1 -0
  66. data/spec/sources/headers/ignore.csv +5 -0
  67. data/spec/sources/sa.csv +1 -0
  68. data/spec/spec_helper.rb +9 -0
  69. data/spec/translator_spec.rb +195 -0
  70. data/tasks/fech.rake +41 -0
  71. metadata +280 -0
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe FechUtils do
4
+
5
+ describe ".regexify" do
6
+
7
+ it "should convert symbols to anchored regular expressions" do
8
+ regex = Fech.regexify(:date_coverage_from)
9
+ regex.should == /^date_coverage_from$/i
10
+ end
11
+
12
+ it "should convert strings to unanchored regular expressions" do
13
+ regex = Fech.regexify("date_coverage_from")
14
+ regex.should == /date_coverage_from/i
15
+ end
16
+
17
+ it "should produce case-insensitive regular expressions" do
18
+ regex = Fech.regexify(:date_coverage_from)
19
+ regex.match("Date_coverage_FROM").size.should == 1
20
+ end
21
+
22
+ it "should return a custom regex if passed a row symbol defined in ROW_TYPES" do
23
+ regex = Fech.regexify(:f3p)
24
+ regex.should == FechUtils::ROW_TYPES[:f3p]
25
+ end
26
+
27
+ end
28
+
29
+ end
@@ -0,0 +1,251 @@
1
+ require 'spec_helper'
2
+
3
+ describe Fech::Filing do
4
+
5
+ before do
6
+ @filing = Fech::Filing.new(723604)
7
+ @filing.stubs(:file_path).returns(File.join(File.dirname(__FILE__), 'data', '723604.fec'))
8
+ end
9
+
10
+ describe "#filing_version" do
11
+
12
+ it "should return the correct filing version" do
13
+ @filing.send(:filing_version).should == "7.0"
14
+ end
15
+
16
+ it "should parse the file only once" do
17
+ @filing.expects(:parse_filing_version).once.returns("7.0")
18
+ @filing.send(:filing_version)
19
+ @filing.send(:filing_version)
20
+ end
21
+
22
+ end
23
+
24
+ describe ".hash_zip" do
25
+
26
+ it "should zip the given keys and values into a hash" do
27
+ @filing = Fech::Filing.new(723604)
28
+ keys = [:one,:three,:two]
29
+ values = [1, 3, 2]
30
+ @filing.hash_zip(keys, values).should == {:one => 1, :two => 2, :three => 3}
31
+ end
32
+
33
+ end
34
+
35
+ describe "#summary" do
36
+
37
+ it "should return the mapped summary row" do
38
+ sum = @filing.summary
39
+ sum.should be_a_kind_of(Hash)
40
+ sum[:form_type].should == "F3PN"
41
+ end
42
+ end
43
+
44
+ describe "#mappings" do
45
+
46
+ it "should create a new Mappings instance with correct version" do
47
+ @filing.send(:mappings).version.should == "7.0"
48
+ end
49
+
50
+ it "should memoize itself" do
51
+ mapping = Fech::Mappings.new
52
+ Fech::Mappings.expects(:new).once.returns(mapping)
53
+ @filing.send(:mappings)
54
+ @filing.send(:mappings)
55
+ end
56
+
57
+ end
58
+
59
+ describe "#rows_like" do
60
+
61
+ it "should return only rows matching the specified regex" do
62
+ @filing.rows_like(/^sa/).size.should == 1
63
+ @filing.rows_like(/^s/).size.should == 2
64
+ @filing.rows_like(/^sc/).size.should == 0
65
+ end
66
+
67
+ it "should return an array if no block is given" do
68
+ @filing.rows_like(/^s/).class.should == Array
69
+ end
70
+
71
+ it "should return empty array if no matches found" do
72
+ @filing.rows_like(/^sc/).should == []
73
+ end
74
+
75
+ it "should yield hashes of row values if passed a block" do
76
+ @filing.rows_like(/^sa/) do |c|
77
+ c.should be_a_kind_of(Hash)
78
+ end
79
+ end
80
+
81
+ it "should allow case-insensitive string input" do
82
+ @filing.rows_like("Sa17a").size.should be > 0
83
+ end
84
+
85
+ end
86
+
87
+ describe "#parse_row?" do
88
+
89
+ before do
90
+ f = open(@filing.file_path, 'r')
91
+ f.readline
92
+ @row = f.readline.split(@filing.delimiter)
93
+ f.close
94
+ end
95
+
96
+ it "should return the mapped row" do
97
+ @filing.send(:parse_row?, @row).should be_a_kind_of(Hash)
98
+ end
99
+
100
+ describe "when :parse_if is specified" do
101
+
102
+ it "should return the mapped row if :parse_if matches row type" do
103
+ @filing.send(:parse_row?, @row, {:parse_if => /^f3p/}).should be_a_kind_of(Hash)
104
+ end
105
+
106
+ it "should return false if row was skipped" do
107
+ @filing.send(:parse_row?, @row, {:parse_if => /^sa/}).should == false
108
+ end
109
+
110
+ end
111
+
112
+ it "should return the raw row data if :raw is true" do
113
+ @filing.send(:parse_row?, @row, {:raw => true}).class.should == Array
114
+ end
115
+
116
+ end
117
+
118
+ describe "#map_for" do
119
+
120
+ it "should return the correct map for given row type" do
121
+ map = @filing.map_for(/sa/)
122
+ map.class.should == Array
123
+ map.first.should == :form_type
124
+ end
125
+
126
+ it "should raise error if no map is found" do
127
+ lambda { @filing.map_for(/sz/) }.should raise_error
128
+ end
129
+
130
+ end
131
+
132
+ describe ".map_for" do
133
+
134
+ it "should return the correct map for given row type" do
135
+ map = Fech::Filing.map_for(/sa/)
136
+ map.class.should == Array
137
+ map.first.should == :form_type
138
+ end
139
+
140
+ it "should raise error if no map is found" do
141
+ lambda { Fech::Filing.map_for(/sz/) }.should raise_error
142
+ end
143
+
144
+ it "should allow choice of version" do
145
+ v7 = Fech::Filing.map_for(/sa/, :version => 7.0)
146
+ v6 = Fech::Filing.map_for(/sa/, :version => 6.1)
147
+ v6.should_not == v7
148
+ end
149
+
150
+ end
151
+
152
+ describe "#map" do
153
+
154
+ before do
155
+ f = open(@filing.file_path, 'r')
156
+ f.readline
157
+ @f3p_row = f.readline.split(@filing.delimiter)
158
+ @sa_row = f.readline.split(@filing.delimiter)
159
+ f.close
160
+ end
161
+
162
+ it "should map the data in row to named values according to row_map" do
163
+ row_map = @filing.send(:mappings).for_row(@sa_row.first)
164
+ mapped = @filing.send(:map, @sa_row)
165
+ mapped.should be_a_kind_of(Hash)
166
+
167
+ mapped[:form_type].should == "SA17A"
168
+ mapped[:contributor_state].should == "SC"
169
+ end
170
+
171
+ it "should perform conversion translations" do
172
+ row_map = @filing.send(:mappings).for_row(@sa_row.first)
173
+ @filing.translate do |t|
174
+ t.convert(:row => @sa_row.first, :field => :contribution_date) do |v|
175
+ Date.parse(v)
176
+ end
177
+ end
178
+ mapped = @filing.send(:map, @sa_row)
179
+ mapped[:contribution_date].should == Date.parse("20110322")
180
+ end
181
+
182
+ it "should perform combination translations" do
183
+ @filing.translate do |t|
184
+ t.combine(:row => @f3p_row.first, :field => :net_individual_contributions) do |row|
185
+ row[:col_a_17_a_iii_individual_contribution_total].to_f - row[:col_a_28_a_individuals].to_f
186
+ end
187
+ end
188
+ mapped = @filing.send(:map, @f3p_row)
189
+ mapped[:net_individual_contributions].should == mapped[:col_a_17_a_iii_individual_contribution_total].to_f - mapped[:col_a_28_a_individuals].to_f
190
+ end
191
+
192
+ it "should return only field asked for if :include was specified" do
193
+ fields = [:form_type, :filer_committee_id_number, :transaction_id]
194
+ mapped = @filing.send(:map, @sa_row, :include => fields)
195
+ fields.each do |field|
196
+ mapped[field].should_not be_nil
197
+ end
198
+ mapped.size.should == 3
199
+ end
200
+
201
+ end
202
+
203
+ describe "amendments" do
204
+
205
+ before do
206
+ @filing = Fech::Filing.new(723604)
207
+ @filing.stubs(:file_path).returns(File.join(File.dirname(__FILE__), 'data', '723604.fec'))
208
+ end
209
+
210
+ describe "for non-amending filings" do
211
+
212
+ describe "#amendment?" do
213
+ it "should return false" do
214
+ @filing.stubs(:header).returns({:report_id => nil})
215
+ @filing.amendment?.should == false
216
+ end
217
+ end
218
+
219
+ end
220
+
221
+ describe "#amends" do
222
+
223
+ it "should return nil for filings without a report_id in HDR" do
224
+ @filing.stubs(:header).returns({:report_id => nil})
225
+ @filing.amends.should == nil
226
+ end
227
+
228
+ it "should return a filing_id for filings with a report_id in HDR" do
229
+ @filing.stubs(:header).returns({:report_id => "723603"})
230
+ @filing.amends.should == "723603"
231
+ end
232
+
233
+ end
234
+
235
+ describe "#amendment?" do
236
+
237
+ it "should return false for filings without a report_id in HDR" do
238
+ @filing.stubs(:header).returns({:report_id => nil})
239
+ @filing.amendment?.should == false
240
+ end
241
+
242
+ it "should return true for filings with a report_id in HDR" do
243
+ @filing.stubs(:header).returns({:report_id => "723603"})
244
+ @filing.amendment?.should == true
245
+ end
246
+
247
+ end
248
+
249
+ end
250
+
251
+ end
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+
3
+ describe Fech::MapGenerator do
4
+
5
+ describe ".generate_row_map_from_file" do
6
+
7
+ before do
8
+ @mg = Fech::MapGenerator.new
9
+ @row = "sa"
10
+ @source_dir = File.join(File.dirname(__FILE__), 'sources', @row + '.csv')
11
+ Fech::MapGenerator.stubs(:row_map_file).returns(@source_dir)
12
+ end
13
+
14
+ it "should not raise error on bad data" do
15
+ lambda {
16
+ Fech::MapGenerator.generate_row_map_from_file(@source_dir, @row)
17
+ }.should_not raise_error
18
+ end
19
+
20
+ it "should skip rows without a canonical name" do
21
+ row_map = Fech::MapGenerator.generate_row_map_from_file(@source_dir, @row)
22
+ row_map["^7"].should == [:form_type, :date_coverage_from, :aggregate]
23
+ end
24
+
25
+ it "should skip columns without a version_type header" do
26
+ row_map = Fech::MapGenerator.generate_row_map_from_file(@source_dir, @row)
27
+ row_map.keys.should =~ ["^7", "^6", "^[2-5]"]
28
+ end
29
+
30
+ it "should not add items where there is no index" do
31
+ row_map = Fech::MapGenerator.generate_row_map_from_file(@source_dir, @row)
32
+ row_map["^6"][1].should be_nil
33
+ end
34
+
35
+ end
36
+
37
+ describe ".convert_header_file_to_row_files" do
38
+ before do
39
+ @source_dir = File.join(File.dirname(__FILE__), 'sources')
40
+ end
41
+ it "should not raise error" do
42
+ Fech::MapGenerator.convert_header_file_to_row_files(@source_dir)
43
+ lambda {
44
+ Fech::MapGenerator.convert_header_file_to_row_files(@source_dir)
45
+ }.should_not raise_error
46
+ end
47
+ end
48
+
49
+ end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ describe Fech::Mapped do
4
+
5
+ before do
6
+ @f = Fech::Filing.new(723604)
7
+ @f.stubs(:file_path).returns(File.join(File.dirname(__FILE__), 'data', '723604.fec'))
8
+ end
9
+
10
+ describe "@filing" do
11
+
12
+ it "should get set to the calling filing" do
13
+ header = @f.header
14
+ header.should be_a_kind_of Fech::Mapped
15
+ header.filing.should == @f
16
+ end
17
+
18
+ end
19
+
20
+ describe "[]" do
21
+
22
+ it "should obey aliases in the filing's translator" do
23
+ @f.translate do |t|
24
+ t.alias :version, :fec_version, "hdr"
25
+ end
26
+
27
+ header = @f.header
28
+ header[:version].should == header[:fec_version]
29
+ end
30
+
31
+ it "should detect the most recent alias first" do
32
+ @f.translate do |t|
33
+ t.alias :version, :fec_version, "hdr"
34
+ t.alias :version, :report_id, "hdr"
35
+ end
36
+
37
+ header = @f.header
38
+ header[:version].should_not == header[:fec_version]
39
+ header[:version].should == header[:report_id]
40
+ end
41
+
42
+ end
43
+
44
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe Fech::Mappings do
4
+
5
+ describe "#for_row" do
6
+
7
+ before do
8
+ @mappings = Fech::Mappings.new
9
+ end
10
+
11
+ it "should return the correct row_map" do
12
+ @mappings.for_row("sa").should == @mappings.map["^sa"]["^7.0|6.4"]
13
+ @mappings.for_row("f3p31").should_not == @mappings.for_row("f3p")
14
+ end
15
+
16
+ it "should use a greedy match on the row type, matching most complete available option" do
17
+ @mappings.for_row("f3p31").should == @mappings.map[FechUtils::ROW_TYPES[:f3p31].source]["^7.0|6.4|6.3|6.2|6.1"]
18
+ @mappings.for_row("f3p").should == @mappings.map[FechUtils::ROW_TYPES[:f3p].source]["^7.0"]
19
+ end
20
+
21
+ end
22
+
23
+ describe ".key_by_regex" do
24
+
25
+ before do
26
+ @hash = {
27
+ "^foo$" => :foo,
28
+ "bar" => :bar
29
+ }
30
+ end
31
+
32
+ it "should match a key by regexp" do
33
+ Fech::Mappings.key_by_regex(@hash, "foo").should == :foo
34
+ Fech::Mappings.key_by_regex(@hash, "bar").should == :bar
35
+ Fech::Mappings.key_by_regex(@hash, "foobar").should == :bar
36
+ end
37
+
38
+ it "raise error if key not found" do
39
+ expect {
40
+ Fech::Mappings.key_by_regex(@hash, "oof")
41
+ }.to raise_error
42
+ end
43
+
44
+ end
45
+
46
+ end
@@ -0,0 +1 @@
1
+ canonical,^7.0,,^6.4|6.3|6.2|6.1,,^5.3|5.2,,^5.1|5.0|3,
@@ -0,0 +1 @@
1
+ canonical,^7.0|6.4,,^6.3|6.2,,^6.1,,^5.3,,^5.2,,^5.1,,^5.0,,^3,
@@ -0,0 +1 @@
1
+ canonical,^7.0|6.4,,^6.3|6.2,,^6.1,,^5.3,,^5.2|5.1,,^5.0,,^3,
@@ -0,0 +1 @@
1
+ canonical,^7.0|6.4|6.3|6.2,,^6.1,,^5.3,,^5.2|5.1,,^5.0|3,
@@ -0,0 +1 @@
1
+ Header,Record Type,EF Type,FEC Ver,Soft Name,Soft Ver,Name Delim,Rpt ID,Rpt Number,HDRcomment ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
@@ -0,0 +1 @@
1
+ F1,FORM TYPE,FILER FEC CMTE ID ,,COMMITTEE NAME,STREET 1,STREET 2,CITY,STATE,ZIP,,DATE (Submitted),,CHG OF COMMITTEE NAME,CHG OF ADDRESS,,5. COMMITTEE TYPE,,5. FEC CANDIDATE ID NUMBER,5. CANDIDATE NAME,5. CAN/OFFICE ,5. CAN/STATE,5. CAN/DIST,5. PARTY CODE,5. PARTY TYPE,,6. FEC COMMITTEE ID NUMBER,6. COMMITTEE NAME (Affiliated),6. STREET 1,6. STREET 2,6. CITY,6. STATE,6. ZIP,6. RELATIONSHIP (w/ Above Cmte),6. ORGANIZATION TYPE,,7. IND/NAME (Custodian Name),7. STREET 1,7. STREET 2,7. CITY,7. STATE,7. ZIP,7. TITLE,7. TELEPHONE,,8. IND/NAME (Treasurer),8. STREET 1,8. STREET 2,8. CITY,8. STATE,8. ZIP,8. TITLE,8. TELEPHONE,,8. IND/NAME (Designated Agent),8. STREET 1,8. STREET 2,8. CITY,8. STATE,8. ZIP,8. TITLE,8. TELEPHONE,,9. IND/NAME (Bank/Depository),9. STREET 1,9. STREET 2,9. CITY,9. STATE,9. ZIP,,NAME/TREASURER (as signed),DATE (Signed),,COMMITTEE EMAIL,COMMITTEE WEB URL,,COMMITTEE FAX NUMBER,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
@@ -0,0 +1 @@
1
+ F1,FORM TYPE,FILER FEC CMTE ID ,,COMMITTEE NAME,STREET 1,STREET 2,CITY,STATE,ZIP,,DATE (Submitted),,CHG OF COMMITTEE NAME,CHG OF ADDRESS,,5. COMMITTEE TYPE,,5. FEC CANDIDATE ID NUMBER,5. CANDIDATE NAME,5. CAN/OFFICE ,5. CAN/STATE,5. CAN/DIST,5. PARTY CODE,5. PARTY TYPE,,6. FEC COMMITTEE ID NUMBER,6. COMMITTEE NAME (Affiliated),6. STREET 1,6. STREET 2,6. CITY,6. STATE,6. ZIP,6. RELATIONSHIP (w/ Above Cmte),6. ORGANIZATION TYPE,,7. IND/NAME (Custodian Name),7. STREET 1,7. STREET 2,7. CITY,7. STATE,7. ZIP,7. TITLE,7. TELEPHONE,,8. IND/NAME (Treasurer),8. STREET 1,8. STREET 2,8. CITY,8. STATE,8. ZIP,8. TITLE,8. TELEPHONE,,8. IND/NAME (Designated Agent),8. STREET 1,8. STREET 2,8. CITY,8. STATE,8. ZIP,8. TITLE,8. TELEPHONE,,9. IND/NAME (Bank/Depository),9. STREET 1,9. STREET 2,9. CITY,9. STATE,9. ZIP,,NAME/TREASURER (as signed),DATE (Signed),,COMMITTEE EMAIL,COMMITTEE WEB URL,,COMMITTEE FAX NUMBER,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
@@ -0,0 +1 @@
1
+ F1,FORM TYPE,FILER FEC CMTE ID ,COMMITTEE NAME,STREET 1,STREET 2,CITY,STATE,ZIP,DATE (Submitted),CHG OF COMMITTEE NAME,CHG OF ADDRESS,5. COMMITTEE TYPE,5. FEC CANDIDATE ID NUMBER,5. CANDIDATE NAME,5. CAN/OFFICE ,5. CAN/STATE,5. CAN/DIST,5. PARTY CODE,5. PARTY TYPE,6. FEC COMMITTEE ID NUMBER,6. COMMITTEE NAME (Affiliated),6. STREET 1,6. STREET 2,6. CITY,6. STATE,6. ZIP,6. RELATIONSHIP (w/ Above Cmte),6. ORGANIZATION TYPE,7. IND/NAME (Custodian Name),7. STREET 1,7. STREET 2,7. CITY,7. STATE,7. ZIP,7. TITLE,7. TELEPHONE,8. IND/NAME (Treasurer),8. STREET 1,8. STREET 2,8. CITY,8. STATE,8. ZIP,8. TITLE,8. TELEPHONE,8. IND/NAME (Designated Agent),8. STREET 1,8. STREET 2,8. CITY,8. STATE,8. ZIP,8. TITLE,8. TELEPHONE,9. IND/NAME (Bank/Depository),9. STREET 1,9. STREET 2,9. CITY,9. STATE,9. ZIP,NAME/TREASURER (as signed),DATE (Signed),COMMITTEE EMAIL,COMMITTEE WEB URL,COMMITTEE FAX NUMBER,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
@@ -0,0 +1 @@
1
+ F1,FORM TYPE,FILER FEC CMTE ID ,,COMMITTEE NAME,STREET 1,STREET 2,CITY,STATE,ZIP,,DATE (Submitted),,CHG OF COMMITTEE NAME,CHG OF ADDRESS,,5. COMMITTEE TYPE,,5. FEC CANDIDATE ID NUMBER,5. CANDIDATE NAME,5. CAN/OFFICE ,5. CAN/STATE,5. CAN/DIST,5. PARTY CODE,5. PARTY TYPE,,6. FEC COMMITTEE ID NUMBER,6. COMMITTEE NAME (Affiliated),6. STREET 1,6. STREET 2,6. CITY,6. STATE,6. ZIP,6. RELATIONSHIP (w/ Above Cmte),6. ORGANIZATION TYPE,,7. IND/NAME (Custodian Name),7. STREET 1,7. STREET 2,7. CITY,7. STATE,7. ZIP,7. TITLE,7. TELEPHONE,,8. IND/NAME (Treasurer),8. STREET 1,8. STREET 2,8. CITY,8. STATE,8. ZIP,8. TITLE,8. TELEPHONE,,8. IND/NAME (Designated Agent),8. STREET 1,8. STREET 2,8. CITY,8. STATE,8. ZIP,8. TITLE,8. TELEPHONE,,9. IND/NAME (Bank/Depository),9. STREET 1,9. STREET 2,9. CITY,9. STATE,9. ZIP,,NAME/TREASURER (as signed),DATE (Signed),,COMMITTEE EMAIL,COMMITTEE WEB URL,,COMMITTEE FAX NUMBER,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,