usaspending 0.1.0 → 0.1.1
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.
- data/lib/usaspending/contract.rb +17 -0
- data/lib/usaspending/procurement.rb +280 -0
- data/usaspending.gemspec +2 -2
- metadata +4 -2
@@ -0,0 +1,17 @@
|
|
1
|
+
module USA
|
2
|
+
|
3
|
+
class Contract < Base
|
4
|
+
|
5
|
+
attr_accessor :transactionnumber, :programsourcedescription, :programsource, :majorfundingagency, :facevalue, :dollarsobligated, :competitioncategory, :vendorname, :typeofspending, :recipientzipcode, :datesigned, :typeoftransaction, :placeofperformancestate, :psccategorycode, :contractpricing, :idvprocurementinstrumentid, :awardtype, :record_count, :recipientstate, :parentrecipientorcompanyname, :idvagency, :fundingagency, :recipientcountyname, :recipientaddressline123, :projectdescription, :principalnaicscode, :modificationnumber, :recipientorcontractorname, :recipientcity, :programsourceagencycode, :programsourceaccountcode, :federalawardid, :fiscalyear, :majoragency, :contractororrecipientid, :recipientcongressionaldistrict, :productorservicecode, :procurementinstrumentid, :placeofperformancecongdistrict, :extentcompeted, :dunsnumber, :recipientname, :principalplacecountyorcity, :placeofperformancezipcode, :contractingagency
|
6
|
+
|
7
|
+
def initialize(params)
|
8
|
+
if params
|
9
|
+
self.set_instance_methods(params)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,280 @@
|
|
1
|
+
module USA
|
2
|
+
|
3
|
+
class Procurement < Base
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@database = 'fpds'
|
7
|
+
@query = {}
|
8
|
+
@errors = {}
|
9
|
+
end
|
10
|
+
|
11
|
+
#returns current database
|
12
|
+
def database
|
13
|
+
@database
|
14
|
+
end
|
15
|
+
|
16
|
+
def errors
|
17
|
+
@errors
|
18
|
+
end
|
19
|
+
|
20
|
+
# city The city within a contractor's address
|
21
|
+
def city(city_value)
|
22
|
+
@query[:city] = city_value unless city_value == ""
|
23
|
+
self
|
24
|
+
end
|
25
|
+
|
26
|
+
#accepts abbreviate country letters and vendor or performance for place of performance, defaults to vendor
|
27
|
+
def country(country_abbr_value, location_type='vendor')
|
28
|
+
require "../lib/codes/countries.rb"
|
29
|
+
if country_codes["#{country_abbr_value}"]
|
30
|
+
location_type != 'vendor' ? @query[:placeOfPerformanceCountryCode] = country_abbr_value : @query[:vendorCountryCode] = country_abbr_value
|
31
|
+
else
|
32
|
+
@errors[:country] = "Couldn't find the country code."
|
33
|
+
end
|
34
|
+
self
|
35
|
+
end
|
36
|
+
|
37
|
+
#accepts abbreviated list of congressional districts and vendor or performance, defaults to vendor
|
38
|
+
def congress_district(congress_value, location_type='vendor')
|
39
|
+
require '../lib/codes/congress_districts.rb'
|
40
|
+
if congress_districts["#{congress_value}"]
|
41
|
+
location_type != 'vendor' ? @query[:pop_cd] = congress_value : @query[:vendor_cd] = congress_value
|
42
|
+
else
|
43
|
+
@errors[:congress_district] = "Couldn't find that congressional district code."
|
44
|
+
end
|
45
|
+
self
|
46
|
+
end
|
47
|
+
|
48
|
+
def piid(piid_value)
|
49
|
+
@query[:PIID] = piid_value
|
50
|
+
self
|
51
|
+
end
|
52
|
+
|
53
|
+
def contract_requirement(description)
|
54
|
+
@query[:descriptionOfContractRequirement] = description
|
55
|
+
self
|
56
|
+
end
|
57
|
+
|
58
|
+
#he contractor duns number.
|
59
|
+
def duns_number(duns_value)
|
60
|
+
@query[:duns_number] = duns_value
|
61
|
+
self
|
62
|
+
end
|
63
|
+
|
64
|
+
#Full text search of program source description.
|
65
|
+
def program_description(description)
|
66
|
+
@query[:program_source_desc] = description
|
67
|
+
self
|
68
|
+
end
|
69
|
+
|
70
|
+
# Determines the Business Fund Indicator:
|
71
|
+
# r = funds provided by Recovery Act
|
72
|
+
def business_fund(fund_value)
|
73
|
+
@query[:busn_indctr] = fund_value
|
74
|
+
self
|
75
|
+
end
|
76
|
+
|
77
|
+
#The program source agency code.
|
78
|
+
def program_code(code_value)
|
79
|
+
@query[:program_source_agency_code] = code_value
|
80
|
+
self
|
81
|
+
end
|
82
|
+
|
83
|
+
#The program source account code.
|
84
|
+
def program_account(account_value)
|
85
|
+
@query[:program_source_account_code] = account_value
|
86
|
+
self
|
87
|
+
end
|
88
|
+
|
89
|
+
#The 4-digit code for a specific governmental agency issuing contracts. See here http://www.usaspending.gov/apidocsmore.html#FPDS_AGENCY.
|
90
|
+
def agency(code)
|
91
|
+
require '../lib/codes/fpds_agencies.rb'
|
92
|
+
if agency_codes["#{code}"]
|
93
|
+
@query[:mod_agency] = code
|
94
|
+
else
|
95
|
+
@errors[:agency] = "Couldn't find that agency specific code."
|
96
|
+
end
|
97
|
+
self
|
98
|
+
end
|
99
|
+
|
100
|
+
#The 2-character code for a major governmental agency issuing contracts. See here http://www.usaspending.gov/apidocsmore.html#FPDS_MAJAGENCY for list.
|
101
|
+
def major_agency(code)
|
102
|
+
require '../lib/codes/fpds_agencies.rb'
|
103
|
+
if major_codes["#{code}"]
|
104
|
+
@query[:maj_agency_cat] = code
|
105
|
+
else
|
106
|
+
@errors[:major_agency] = "Couldn't find that major agency category code."
|
107
|
+
end
|
108
|
+
self
|
109
|
+
end
|
110
|
+
|
111
|
+
# The 2-character code for a major product or service category. See here http://www.usaspending.gov/apidocsmore.html#PSCCAT for list.
|
112
|
+
def product_category(code)
|
113
|
+
require '../lib/codes/products_services.rb'
|
114
|
+
if product_category_codes["#{code}"]
|
115
|
+
@query[:psc_cat] = code
|
116
|
+
else
|
117
|
+
@errors[:product_category] = "Couldn't find that major product category code."
|
118
|
+
end
|
119
|
+
self
|
120
|
+
end
|
121
|
+
|
122
|
+
# The 4-character code for a product or service. See here http://www.usaspending.gov/apidocsmore.html#PSC for list.
|
123
|
+
def product(code)
|
124
|
+
require '../lib/codes/products_services.rb'
|
125
|
+
if product_codes["#{code}"]
|
126
|
+
@query[:psc_sub] = code
|
127
|
+
else
|
128
|
+
@errors[:product] = "Couldn't find that product code."
|
129
|
+
end
|
130
|
+
self
|
131
|
+
end
|
132
|
+
|
133
|
+
# The competition status of a contract. Values are:
|
134
|
+
# everyone or c = Available for everyone for competition
|
135
|
+
# one offer or o = Everyone could compete, but only one bid or offer was recieved
|
136
|
+
# pool p = Competition within a limited pool
|
137
|
+
# no n = Not competed for an allowable reason
|
138
|
+
# groups a = Available only for groups such as disabled persons, prisoners, and regulated utilities
|
139
|
+
# actions f = Actions necessary to continue existing competitive contracts for continuity (until the next one could be competed)
|
140
|
+
# unknown u = Not identified, soon to be addressed
|
141
|
+
# compete_cat
|
142
|
+
|
143
|
+
def competition_status(cat_value)
|
144
|
+
@query[:complete_cat] = case cat_value
|
145
|
+
when "everyone", "c" then "c"
|
146
|
+
when "One offer", "o" then "o"
|
147
|
+
when "pool", "p" then "p"
|
148
|
+
when "no", "n" then "n"
|
149
|
+
when "groups", "a" then "a"
|
150
|
+
when "actions", "f" then "f"
|
151
|
+
else "u"
|
152
|
+
end
|
153
|
+
self
|
154
|
+
end
|
155
|
+
|
156
|
+
# state The state abbreviation within a contractor's address.
|
157
|
+
def state(state_value, location_type='vendor')
|
158
|
+
location_type != 'vendor' ? @query[:stateCode] = state_value : @query[:state] = state_value
|
159
|
+
self
|
160
|
+
end
|
161
|
+
|
162
|
+
# ZIPCode The ZIP code within a contractor's address.
|
163
|
+
def zip(zip_value, location_type='vendor')
|
164
|
+
location_type != 'vendor' ? @query[:placeOfPerformanceZIPCode] = zip_value : @query[:ZIPCode] = zip_value
|
165
|
+
self
|
166
|
+
end
|
167
|
+
|
168
|
+
#Specify a company name
|
169
|
+
def company_name(company_name_value = nil)
|
170
|
+
@query[:company_name] = company_name_value unless company_name_value == ""
|
171
|
+
self
|
172
|
+
end
|
173
|
+
|
174
|
+
# Determines how records are sorted. Valid values are:
|
175
|
+
# name or r = by contractor or recipient name
|
176
|
+
# dollars or f = by dollars of awards (in descending order)
|
177
|
+
# major or g = by major contracting agency
|
178
|
+
# category or p = by Product or Service Category
|
179
|
+
# date or d = by date of award
|
180
|
+
# Defaults to sort by dollars if not provided.
|
181
|
+
def sort_by(sortby_number)
|
182
|
+
@query[:sortby] = case sortby_number
|
183
|
+
when "name", "r" then "r"
|
184
|
+
when "dollars", "f" then "f"
|
185
|
+
when "major agency", "g" then "g"
|
186
|
+
when "category", "p" then "p"
|
187
|
+
when "date", "d" then "d"
|
188
|
+
else "f"
|
189
|
+
end
|
190
|
+
self
|
191
|
+
end
|
192
|
+
|
193
|
+
#specify time frame in years. Requires start value if specified, otherwise, leaving this function will default to all fiscal years
|
194
|
+
#entering a wrong year will default to the current year
|
195
|
+
def years(s_year, end_year = nil )
|
196
|
+
start_year = s_year.to_i
|
197
|
+
end_year = end_year.to_i unless end_year.nil?
|
198
|
+
if end_year
|
199
|
+
if start_year < 2000 || start_year > Time.now.year.to_i + 1
|
200
|
+
@errors[:years] = "Problem with Start Year"
|
201
|
+
else
|
202
|
+
if end_year > start_year && end_year < Time.now.year.to_i + 1
|
203
|
+
@query[:first_year_range] = start_year
|
204
|
+
@query[:last_year_range] = end_year
|
205
|
+
else
|
206
|
+
@errors[:years] = "Problem with End Year"
|
207
|
+
end
|
208
|
+
end
|
209
|
+
elsif start_year < 2000 or start_year > Time.now.year.to_i + 1
|
210
|
+
@errors[:years] = "Problem with Start Year"
|
211
|
+
else
|
212
|
+
@query[:fiscal_year] = start_year
|
213
|
+
end
|
214
|
+
self
|
215
|
+
end
|
216
|
+
|
217
|
+
# Allows you to set the starting position of the records to be retrieved, defaults to 1 if less than 0
|
218
|
+
def start_from(start_number)
|
219
|
+
@query[:records_from] = start_number > 0 ? start_number : 1
|
220
|
+
self
|
221
|
+
end
|
222
|
+
|
223
|
+
#Allows you to set the maximum number of records retrieved to fewer than 1000
|
224
|
+
# defaults to 1000 when over a 1000
|
225
|
+
def max_records(max_number)
|
226
|
+
@query[:max_records] = max_number.to_i < 1000 ? max_number : 1000
|
227
|
+
self
|
228
|
+
end
|
229
|
+
|
230
|
+
def record(record_number)
|
231
|
+
#set the detail to c
|
232
|
+
self.detail("c")
|
233
|
+
@query[:record_id] = record_number
|
234
|
+
self
|
235
|
+
end
|
236
|
+
|
237
|
+
# accepts values b or c, defaults to b
|
238
|
+
def detail(detail_number)
|
239
|
+
if ["b", "c"].include?(detail_number.downcase)
|
240
|
+
detail_value = detail_number
|
241
|
+
else
|
242
|
+
detail_value = "b"
|
243
|
+
end
|
244
|
+
@query[:detail] = detail_value
|
245
|
+
self
|
246
|
+
end
|
247
|
+
|
248
|
+
#return current query
|
249
|
+
def query
|
250
|
+
@query
|
251
|
+
end
|
252
|
+
|
253
|
+
# Clears all the query filters to make a new search
|
254
|
+
def clear
|
255
|
+
@fetch = nil
|
256
|
+
@query = {}
|
257
|
+
self
|
258
|
+
end
|
259
|
+
|
260
|
+
def url
|
261
|
+
construct_url(database, @query)
|
262
|
+
end
|
263
|
+
|
264
|
+
# Fetch the Procurement Search returning parsed xml
|
265
|
+
def fetch
|
266
|
+
get_data(url)
|
267
|
+
end
|
268
|
+
|
269
|
+
# Fetch the Procurement Search returning array of contract objects
|
270
|
+
def fetch_contracts
|
271
|
+
contracts = []
|
272
|
+
self.fetch["result"].first.first[1].each do |contract|
|
273
|
+
contracts << USA::Contract.new(contract)
|
274
|
+
end
|
275
|
+
return contracts
|
276
|
+
end
|
277
|
+
|
278
|
+
end # class Procurement
|
279
|
+
|
280
|
+
end # module USA
|
data/usaspending.gemspec
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "usaspending"
|
3
|
-
s.version = "0.1.
|
3
|
+
s.version = "0.1.1"
|
4
4
|
s.date = "2010-5-17"
|
5
5
|
s.summary = "Ruby gem wrapper for USAspending.gov"
|
6
6
|
s.rubyforge_project = "usaspending"
|
7
7
|
s.email = "melton.dan@gmail.com"
|
8
8
|
s.homepage = "http://github.com/danmelton/usaspending"
|
9
9
|
s.authors = ["Dan Melton"]
|
10
|
-
s.files = ['usaspending.gemspec','README.textile', 'CHANGES.textile', 'lib/usaspending.rb','lib/usaspending/base.rb' ]
|
10
|
+
s.files = ['usaspending.gemspec','README.textile', 'CHANGES.textile', 'lib/usaspending.rb','lib/usaspending/base.rb','lib/usaspending/contract.rb', 'lib/usaspending/procurement.rb' ]
|
11
11
|
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 0.1.
|
8
|
+
- 1
|
9
|
+
version: 0.1.1
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Dan Melton
|
@@ -32,6 +32,8 @@ files:
|
|
32
32
|
- CHANGES.textile
|
33
33
|
- lib/usaspending.rb
|
34
34
|
- lib/usaspending/base.rb
|
35
|
+
- lib/usaspending/contract.rb
|
36
|
+
- lib/usaspending/procurement.rb
|
35
37
|
has_rdoc: true
|
36
38
|
homepage: http://github.com/danmelton/usaspending
|
37
39
|
licenses: []
|