craigler 1.3.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.
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
@@ -0,0 +1,5 @@
1
+ *.sw?
2
+ .DS_Store
3
+ coverage
4
+ rdoc
5
+ pkg
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ (MIT License)
2
+
3
+ Copyright (c) 2009 Devin Christensen
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,165 @@
1
+ = Craigler
2
+
3
+ Search API for craigslist
4
+
5
+ == SYNOPSIS:
6
+ I couldn't decide which API I liked best, so you have two choices.
7
+
8
+ Craigler.search(:motorcycles, :in => [:utah, :nevada, :arizona], :for => 'Boulevard M50') do |item|
9
+ puts item.title
10
+ puts item.url
11
+ puts item.time
12
+ end
13
+
14
+ or
15
+
16
+ Craigler.find('Boulevard M50', :in => :california, :only => :motorcycles) do |item|
17
+ puts item.title
18
+ puts item.url
19
+ puts item.time
20
+ end
21
+
22
+ You can also create a search object to fetch the results later. When no location or category is given Craigler searches <tt>:all_for_sale_or_wanted</tt> <tt>:in => :anywhere</tt>
23
+
24
+ search = Craigler::Search.new('Yamaha')
25
+ search.results()
26
+
27
+ Note that additional calls to <tt>search.results()</tt> will always return the same result set unless refresh is forced
28
+ search.results(:refresh => true)
29
+
30
+ See Craigler::Search for a list of all available options
31
+
32
+ === Supported Categories
33
+ <tt>:all_for_sale_or_wanted</tt>, <tt>:art_and_crafts</tt>, <tt>:auto_parts</tt>, <tt>:baby_and_kid_stuff</tt>, <tt>:barter</tt>, <tt>:bicycles</tt>, <tt>:boats</tt>, <tt>:books</tt>, <tt>:business</tt>, <tt>:cars_and_trucks</tt>, <tt>:clothing</tt>, <tt>:collectibles</tt>, <tt>:community</tt>, <tt>:computers_and_tech</tt>, <tt>:electronics</tt>, <tt>:event</tt>, <tt>:farm_and_garden</tt>, <tt>:free_stuff</tt>, <tt>:furniture</tt>, <tt>:games_and_toys</tt>, <tt>:garage_sales</tt>, <tt>:general</tt>, <tt>:gigs</tt>, <tt>:household</tt>, <tt>:housing</tt>, <tt>:items_wanted</tt>, <tt>:jewelry</tt>, <tt>:jobs</tt>, <tt>:materials</tt>, <tt>:media</tt>, <tt>:motorcycles</tt>, <tt>:musical_instruments</tt>, <tt>:personals</tt>, <tt>:photo_and_video</tt>, <tt>:recreational_vehicles</tt>, <tt>:resume</tt>, <tt>:services_offered</tt>, <tt>:sporting_goods</tt>, <tt>:tickets</tt>, <tt>:tools</tt>
34
+
35
+ === Supported Locations
36
+ ==== States
37
+ <tt>:alaska</tt>, <tt>:arizona</tt>, <tt>:arkansas</tt>, <tt>:california</tt>, <tt>:colorado</tt>, <tt>:connecticut</tt>, <tt>:delaware</tt>, <tt>:dc</tt>, <tt>:florida</tt>, <tt>:georgia</tt>, <tt>:hawaii</tt>, <tt>:idaho</tt>, <tt>:illinois</tt>, <tt>:indiana</tt>, <tt>:iowa</tt>, <tt>:kansas</tt>, <tt>:kentucky</tt>, <tt>:louisiana</tt>, <tt>:maine</tt>, <tt>:maryland</tt>, <tt>:mass</tt>, <tt>:michigan</tt>, <tt>:minnesota</tt>, <tt>:mississippi</tt>, <tt>:missouri</tt>, <tt>:montana</tt>, <tt>:nebraska</tt>, <tt>:nevada</tt>, <tt>:n_hampshire</tt>, <tt>:new_jersey</tt>, <tt>:new_mexico</tt>, <tt>:new_york</tt>, <tt>:n_carolina</tt>, <tt>:north_dakota</tt>, <tt>:ohio</tt>, <tt>:oklahoma</tt>, <tt>:oregon</tt>, <tt>:pennsylvania</tt>, <tt>:rhode_island</tt>, <tt>:s_carolina</tt>, <tt>:south_dakota</tt>, <tt>:tennessee</tt>, <tt>:texas</tt>, <tt>:utah</tt>, <tt>:vermont</tt>, <tt>:virginia</tt>, <tt>:washington</tt>, <tt>:west_virginia</tt> <tt>:wisconsin</tt>, <tt>:wyoming</tt>
38
+ ==== Cities
39
+ ===== Alabama
40
+ <tt>:auburn</tt>,<tt>:bham</tt>,<tt>:columbusga</tt>,<tt>:dothan</tt>,<tt>:shoals</tt>,<tt>:gadsden</tt>,<tt>:huntsville</tt>,<tt>:mobile</tt>,<tt>:montgomery</tt>,<tt>:tuscaloosa</tt>,
41
+ ===== Alaska
42
+ <tt>:anchorage</tt>,
43
+ ===== Arizona
44
+ <tt>:flagstaff</tt>,<tt>:mohave</tt>,<tt>:phoenix</tt>,<tt>:prescott</tt>,<tt>:sierravista</tt>,<tt>:tucson</tt>,<tt>:yuma</tt>,
45
+ ===== Arkansas
46
+ <tt>:fayar</tt>,<tt>:fortsmith</tt>,<tt>:jonesboro</tt>,<tt>:littlerock</tt>,<tt>:memphis</tt>,<tt>:texarkana</tt>,
47
+ ===== California
48
+ <tt>:sfbay</tt>,<tt>:bakersfield</tt>,<tt>:chico</tt>,<tt>:fresno</tt>,<tt>:goldcountry</tt>,<tt>:humboldt</tt>,<tt>:imperial</tt>,<tt>:inlandempire</tt>,
49
+ <tt>:losangeles</tt>,<tt>:mendocino</tt>,<tt>:merced</tt>,<tt>:modesto</tt>,<tt>:monterey</tt>,<tt>:orangecounty</tt>,<tt>:palmsprings</tt>,<tt>:redding</tt>,
50
+ <tt>:reno</tt>,<tt>:sacramento</tt>,<tt>:sandiego</tt>,<tt>:slo</tt>,<tt>:santabarbara</tt>,<tt>:stockton</tt>,<tt>:ventura</tt>,<tt>:visalia</tt>,<tt>:yubasutter</tt>,
51
+ ===== Colorado
52
+ <tt>:boulder</tt>,<tt>:cosprings</tt>,<tt>:denver</tt>,<tt>:fortcollins</tt>,<tt>:pueblo</tt>,<tt>:rockies</tt>,<tt>:westslope</tt>,
53
+ ===== Connecticut
54
+ <tt>:newlondon</tt>,<tt>:hartford</tt>,<tt>:newhaven</tt>,<tt>:nwct</tt>,
55
+ ===== Delaware
56
+ <tt>:delaware</tt>,
57
+ ===== Dc
58
+ <tt>:washingtondc</tt>,
59
+ ===== Florida
60
+ <tt>:daytona</tt>,<tt>:keys</tt>,<tt>:fortmyers</tt>,<tt>:gainesville</tt>,<tt>:jacksonville</tt>,<tt>:lakeland</tt>,<tt>:ocala</tt>,<tt>:orlando</tt>,
61
+ <tt>:panamacity</tt>,<tt>:pensacola</tt>,<tt>:sarasota</tt>,<tt>:miami</tt>,<tt>:spacecoast</tt>,<tt>:staugustine</tt>,<tt>:tallahassee</tt>,<tt>:tampa</tt>,<tt>:treasure</tt>,
62
+ ===== Georgia
63
+ <tt>:athensga</tt>,<tt>:atlanta</tt>,<tt>:augusta</tt>,<tt>:brunswick</tt>,<tt>:columbusga</tt>,<tt>:macon</tt>,<tt>:savannah</tt>,<tt>:valdosta</tt>,
64
+ ===== Hawaii
65
+ <tt>:honolulu</tt>,
66
+ ===== Idaho
67
+ <tt>:boise</tt>,<tt>:eastidaho</tt>,<tt>:pullman</tt>,<tt>:spokane</tt>,<tt>:twinfalls</tt>,
68
+ ===== Illinois
69
+ <tt>:bn</tt>,<tt>:carbondale</tt>,<tt>:chambana</tt>,<tt>:chicago</tt>,<tt>:decatur</tt>,<tt>:peoria</tt>,<tt>:quadcities</tt>,<tt>:rockford</tt>,<tt>:springfieldil</tt>,<tt>:stlouis</tt>,
70
+ ===== Indiana
71
+ <tt>:bloomington</tt>,<tt>:evansville</tt>,<tt>:fortwayne</tt>,<tt>:indianapolis</tt>,<tt>:tippecanoe</tt>,<tt>:muncie</tt>,<tt>:southbend</tt>,<tt>:terrahaute</tt>,
72
+ ===== Iowa
73
+ <tt>:ames</tt>,<tt>:cedarrapids</tt>,<tt>:desmoines</tt>,<tt>:dubuque</tt>,<tt>:iowacity</tt>,<tt>:omaha</tt>,<tt>:quadcities</tt>,<tt>:siouxcity</tt>,<tt>:waterloo</tt>,
74
+ ===== Kansas
75
+ <tt>:kansascity</tt>,<tt>:lawrence</tt>,<tt>:ksu</tt>,<tt>:topeka</tt>,<tt>:wichita</tt>,
76
+ ===== Kentucky
77
+ <tt>:bgky</tt>,<tt>:cincinnati</tt>,<tt>:huntington</tt>,<tt>:lexington</tt>,<tt>:louisville</tt>,<tt>:westky</tt>,
78
+ ===== Louisiana
79
+ <tt>:batonrouge</tt>,<tt>:lafayette</tt>,<tt>:lakecharles</tt>,<tt>:monroe</tt>,<tt>:neworleans</tt>,<tt>:shreveport</tt>,
80
+ ===== Maine
81
+ <tt>:maine</tt>,
82
+ ===== Maryland
83
+ <tt>:annapolis</tt>,<tt>:baltimore</tt>,<tt>:easternshore</tt>,<tt>:smd</tt>,<tt>:westmd</tt>,
84
+ ===== Mass
85
+ <tt>:boston</tt>,<tt>:capecod</tt>,<tt>:southcoast</tt>,<tt>:westernmass</tt>,<tt>:worcester</tt>,
86
+ ===== Michigan
87
+ <tt>:annarbor</tt>,<tt>:centralmich</tt>,<tt>:detroit</tt>,<tt>:flint</tt>,<tt>:grandrapids</tt>,<tt>:jxn</tt>,<tt>:kalamazoo</tt>,<tt>:lansing</tt>,
88
+ <tt>:muskegon</tt>,<tt>:nmi</tt>,<tt>:porthuron</tt>,<tt>:saginaw</tt>,<tt>:southbend</tt>,<tt>:swmi</tt>,<tt>:up</tt>,
89
+ ===== Minnesota
90
+ <tt>:duluth</tt>,<tt>:fargo</tt>,<tt>:mankato</tt>,<tt>:minneapolis</tt>,<tt>:rmn</tt>,<tt>:stcloud</tt>,
91
+ ===== Mississippi
92
+ <tt>:gulfport</tt>,<tt>:hattiesburg</tt>,<tt>:jackson</tt>,<tt>:memphis</tt>,<tt>:northmiss</tt>,
93
+ ===== Missouri
94
+ <tt>:columbiamo</tt>,<tt>:joplin</tt>,<tt>:kansascity</tt>,<tt>:semo</tt>,<tt>:springfield</tt>,<tt>:stlouis</tt>,
95
+ ===== Montana
96
+ <tt>:montana</tt>,
97
+ ===== Nebraska
98
+ <tt>:grandisland</tt>,<tt>:lincoln</tt>,<tt>:omaha</tt>,<tt>:siouxcity</tt>,
99
+ ===== Nevada
100
+ <tt>:lasvegas</tt>,<tt>:reno</tt>,
101
+ ===== N hampshire
102
+ <tt>:nh</tt>,
103
+ ===== New jersey
104
+ <tt>:cnj</tt>,<tt>:jerseyshore</tt>,<tt>:newjersey</tt>,<tt>:southjersey</tt>,
105
+ ===== New mexico
106
+ <tt>:albuquerque</tt>,<tt>:farmington</tt>,<tt>:lascruces</tt>,<tt>:roswell</tt>,<tt>:santafe</tt>,
107
+ ===== New york
108
+ <tt>:albany</tt>,<tt>:binghamton</tt>,<tt>:buffalo</tt>,<tt>:catskills</tt>,<tt>:chautauqua</tt>,<tt>:elmira</tt>,<tt>:hudsonvalley</tt>,<tt>:ithaca</tt>,
109
+ <tt>:longisland</tt>,<tt>:newyork</tt>,<tt>:plattsburgh</tt>,<tt>:rochester</tt>,<tt>:syracuse</tt>,<tt>:utica</tt>,<tt>:watertown</tt>,
110
+ ===== N carolina
111
+ <tt>:asheville</tt>,<tt>:boone</tt>,<tt>:charlotte</tt>,<tt>:eastnc</tt>,<tt>:fayetteville</tt>,<tt>:greensboro</tt>,<tt>:hickory</tt>,<tt>:outerbanks</tt>,
112
+ <tt>:raleigh</tt>,<tt>:wilmington</tt>,<tt>:winstonsalem</tt>,
113
+ ===== North dakota
114
+ <tt>:fargo</tt>,<tt>:nd</tt>,
115
+ ===== Ohio
116
+ <tt>:akroncanton</tt>,<tt>:athensohio</tt>,<tt>:cincinnati</tt>,<tt>:cleveland</tt>,<tt>:columbus</tt>,<tt>:dayton</tt>,<tt>:huntington</tt>,<tt>:limaohio</tt>,
117
+ <tt>:mansfield</tt>,<tt>:parkersburg</tt>,<tt>:sandusky</tt>,<tt>:toledo</tt>,<tt>:wheeling</tt>,<tt>:youngstown</tt>,
118
+ ===== Oklahoma
119
+ <tt>:fortsmith</tt>,<tt>:lawton</tt>,<tt>:oklahomacity</tt>,<tt>:stillwater</tt>,<tt>:tulsa</tt>,
120
+ ===== Oregon
121
+ <tt>:bend</tt>,<tt>:corvallis</tt>,<tt>:eastoregon</tt>,<tt>:eugene</tt>,<tt>:medford</tt>,<tt>:oregoncoast</tt>,<tt>:portland</tt>,<tt>:roseburg</tt>,<tt>:salem</tt>,
122
+ ===== Pennsylvania
123
+ <tt>:altoona</tt>,<tt>:erie</tt>,<tt>:harrisburg</tt>,<tt>:lancaster</tt>,<tt>:allentown</tt>,<tt>:philadelphia</tt>,<tt>:pittsburgh</tt>,<tt>:poconos</tt>,
124
+ <tt>:reading</tt>,<tt>:scranton</tt>,<tt>:pennstate</tt>,<tt>:williamsport</tt>,<tt>:york</tt>,
125
+ ===== Rhode island
126
+ <tt>:providence</tt>,
127
+ ===== S carolina
128
+ <tt>:charleston</tt>,<tt>:columbia</tt>,<tt>:florencesc</tt>,<tt>:greenville</tt>,<tt>:hiltonhead</tt>,<tt>:myrtlebeach</tt>,
129
+ ===== South dakota
130
+ <tt>:sd</tt>,
131
+ ===== Tennessee
132
+ <tt>:chattanooga</tt>,<tt>:clarksville</tt>,<tt>:jacksontn</tt>,<tt>:knoxville</tt>,<tt>:memphis</tt>,<tt>:nashville</tt>,<tt>:tricities</tt>,
133
+ ===== Texas
134
+ <tt>:abilene</tt>,<tt>:amarillo</tt>,<tt>:austin</tt>,<tt>:beaumont</tt>,<tt>:brownsville</tt>,<tt>:collegestation</tt>,<tt>:corpuschristi</tt>,<tt>:dallas</tt>,
135
+ <tt>:elpaso</tt>,<tt>:galveston</tt>,<tt>:houston</tt>,<tt>:killeen</tt>,<tt>:laredo</tt>,<tt>:lubbock</tt>,<tt>:mcallen</tt>,<tt>:odessa</tt>,<tt>:sanantonio</tt>,
136
+ <tt>:sanmarcos</tt>,<tt>:texarkana</tt>,<tt>:easttexas</tt>,<tt>:victoriatx</tt>,<tt>:waco</tt>,<tt>:wichitafalls</tt>,
137
+ ===== Utah
138
+ <tt>:logan</tt>,<tt>:ogden</tt>,<tt>:provo</tt>,<tt>:saltlakecity</tt>,<tt>:stgeorge</tt>,
139
+ ===== Vermont
140
+ <tt>:burlington</tt>,
141
+ ===== Virginia
142
+ <tt>:blacksburg</tt>,<tt>:charlottesville</tt>,<tt>:danville</tt>,<tt>:easternshore</tt>,<tt>:fredericksburg</tt>,<tt>:norfolk</tt>,<tt>:harrisonburg</tt>,
143
+ <tt>:lynchburg</tt>,<tt>:richmond</tt>,<tt>:roanoke</tt>,
144
+ ===== Washington
145
+ <tt>:bellingham</tt>,<tt>:kpr</tt>,<tt>:olympic</tt>,<tt>:pullman</tt>,<tt>:seattle</tt>,<tt>:skagit</tt>,<tt>:spokane</tt>,<tt>:wenatchee</tt>,<tt>:yakima</tt>,
146
+ ===== West virginia
147
+ <tt>:charlestonwv</tt>,<tt>:huntington</tt>,<tt>:martinsburg</tt>,<tt>:morgantown</tt>,<tt>:parkersburg</tt>,<tt>:wv</tt>,<tt>:wheeling</tt>,
148
+ ===== Wisconsin
149
+ <tt>:appleton</tt>,<tt>:duluth</tt>,<tt>:eauclaire</tt>,<tt>:greenbay</tt>,<tt>:janesville</tt>,<tt>:racine</tt>,<tt>:lacrosse</tt>,<tt>:madison</tt>,
150
+ <tt>:milwaukee</tt>,<tt>:sheboygan</tt>,<tt>:wausau</tt>
151
+
152
+
153
+ Or use <tt>:in => :anywhere</tt> to search all supported locations.
154
+
155
+ == REQUIREMENTS:
156
+
157
+ * Hpricot
158
+
159
+ == INSTALL:
160
+
161
+ * sudo gem install quixoten-craigler
162
+
163
+ == Copyright
164
+
165
+ Copyright (c) 2009 Devin Christensen. See LICENSE for details.
@@ -0,0 +1,58 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "craigler"
8
+ gem.summary = %Q{Search API for craigslist}
9
+ gem.email = "quixoten@gmail.com"
10
+ gem.homepage = "http://github.com/threetrieslater/craigler"
11
+ gem.authors = ["Devin Christensen"]
12
+ gem.add_development_dependency "shoulda", ">= 2.10.3"
13
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
14
+ end
15
+
16
+ rescue LoadError
17
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
18
+ end
19
+
20
+ require 'rake/testtask'
21
+ Rake::TestTask.new(:test) do |test|
22
+ test.libs << 'lib' << 'test'
23
+ test.pattern = 'test/**/*_test.rb'
24
+ test.verbose = true
25
+ end
26
+
27
+ begin
28
+ require 'rcov/rcovtask'
29
+ Rcov::RcovTask.new do |test|
30
+ test.libs << 'test'
31
+ test.pattern = 'test/**/*_test.rb'
32
+ test.verbose = true
33
+ end
34
+ rescue LoadError
35
+ task :rcov do
36
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
37
+ end
38
+ end
39
+
40
+
41
+ task :default => :test
42
+
43
+ require 'rake/rdoctask'
44
+ Rake::RDocTask.new do |rdoc|
45
+ if File.exist?('VERSION.yml')
46
+ config = YAML.load(File.read('VERSION.yml'))
47
+ version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
48
+ else
49
+ version = ""
50
+ end
51
+
52
+ rdoc.rdoc_dir = 'rdoc'
53
+ rdoc.title = "Craigler #{version}"
54
+ rdoc.rdoc_files.include('lib/**/*.rb')
55
+ rdoc.rdoc_files.include('README.rdoc', 'LICENSE')
56
+ rdoc.main = 'README.rdoc'
57
+ end
58
+
@@ -0,0 +1,5 @@
1
+ ---
2
+ :minor: 3
3
+ :patch: 0
4
+ :major: 1
5
+ :build:
@@ -0,0 +1,57 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{craigler}
8
+ s.version = "1.3.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Devin Christensen"]
12
+ s.date = %q{2010-09-05}
13
+ s.email = %q{quixoten@gmail.com}
14
+ s.extra_rdoc_files = [
15
+ "LICENSE",
16
+ "README.rdoc"
17
+ ]
18
+ s.files = [
19
+ ".document",
20
+ ".gitignore",
21
+ "LICENSE",
22
+ "README.rdoc",
23
+ "Rakefile",
24
+ "VERSION.yml",
25
+ "craigler.gemspec",
26
+ "lib/craigler.rb",
27
+ "lib/craigler/constants.rb",
28
+ "lib/craigler/search.rb",
29
+ "test/craigler_search_test.rb",
30
+ "test/craigler_test.rb",
31
+ "test/test_helper.rb"
32
+ ]
33
+ s.homepage = %q{http://github.com/threetrieslater/craigler}
34
+ s.rdoc_options = ["--charset=UTF-8"]
35
+ s.require_paths = ["lib"]
36
+ s.rubygems_version = %q{1.3.7}
37
+ s.summary = %q{Search API for craigslist}
38
+ s.test_files = [
39
+ "test/craigler_search_test.rb",
40
+ "test/craigler_test.rb",
41
+ "test/test_helper.rb"
42
+ ]
43
+
44
+ if s.respond_to? :specification_version then
45
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
46
+ s.specification_version = 3
47
+
48
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
49
+ s.add_development_dependency(%q<shoulda>, [">= 2.10.3"])
50
+ else
51
+ s.add_dependency(%q<shoulda>, [">= 2.10.3"])
52
+ end
53
+ else
54
+ s.add_dependency(%q<shoulda>, [">= 2.10.3"])
55
+ end
56
+ end
57
+
@@ -0,0 +1,36 @@
1
+ require 'open-uri'
2
+ require 'Hpricot'
3
+
4
+ require 'craigler/constants'
5
+ require 'craigler/search'
6
+
7
+ module Craigler
8
+
9
+ # :stopdoc:
10
+ class CraiglerError < StandardError; end
11
+ class InvalidCategory < CraiglerError; end
12
+ class InvalidSearchTerm < CraiglerError; end
13
+ class InvalidLocation < CraiglerError; end
14
+ # :startdoc:
15
+
16
+ class << self
17
+ # Interface to Search that may or may not be more readable
18
+ #
19
+ # Supports all options of Search#new except <tt>:only</tt>, as it's supplied through the <tt>category</tt> parameter
20
+ def search(category, options = {})
21
+ options = options.merge({ :only => category })
22
+ results = Search.new(options.delete(:for), options).results()
23
+ results.each {|result| yield(result) } if block_given?
24
+ results
25
+ end
26
+
27
+ # Interface to Search that somewhat mimics ActiveRecord#find
28
+ #
29
+ # Supports all the options of Search#new
30
+ def find(search_term, options = {})
31
+ results = Search.new(search_term, options).results()
32
+ results.each {|result| yield(result) } if block_given?
33
+ results
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,501 @@
1
+ module Craigler
2
+
3
+ # :stopdoc:
4
+ RESULTS_PER_PAGE = 25
5
+
6
+ LOCATIONS = {
7
+ :alabama => ['http://auburn.craigslist.org/','http://bham.craigslist.org/','http://columbusga.craigslist.org/','http://dothan.craigslist.org/','http://shoals.craigslist.org/','http://gadsden.craigslist.org/','http://huntsville.craigslist.org/','http://mobile.craigslist.org/','http://montgomery.craigslist.org/','http://tuscaloosa.craigslist.org/'],
8
+ :alaska => ['http://anchorage.craigslist.org/'],
9
+ :arizona => ['http://flagstaff.craigslist.org/','http://mohave.craigslist.org/','http://phoenix.craigslist.org/','http://prescott.craigslist.org/','http://sierravista.craigslist.org/','http://tucson.craigslist.org/','http://yuma.craigslist.org/'],
10
+ :arkansas => ['http://fayar.craigslist.org/','http://fortsmith.craigslist.org/','http://jonesboro.craigslist.org/','http://littlerock.craigslist.org/','http://memphis.craigslist.org/','http://texarkana.craigslist.org/'],
11
+ :california => ['http://sfbay.craigslist.org/','http://bakersfield.craigslist.org/','http://chico.craigslist.org/','http://fresno.craigslist.org/','http://goldcountry.craigslist.org/','http://humboldt.craigslist.org/','http://imperial.craigslist.org/','http://inlandempire.craigslist.org/','http://losangeles.craigslist.org/','http://mendocino.craigslist.org/','http://merced.craigslist.org/','http://modesto.craigslist.org/','http://monterey.craigslist.org/','http://orangecounty.craigslist.org/','http://palmsprings.craigslist.org/','http://redding.craigslist.org/','http://reno.craigslist.org/','http://sacramento.craigslist.org/','http://sandiego.craigslist.org/','http://slo.craigslist.org/','http://santabarbara.craigslist.org/','http://stockton.craigslist.org/','http://ventura.craigslist.org/','http://visalia.craigslist.org/','http://yubasutter.craigslist.org/'],
12
+ :colorado => ['http://boulder.craigslist.org/','http://cosprings.craigslist.org/','http://denver.craigslist.org/','http://fortcollins.craigslist.org/','http://pueblo.craigslist.org/','http://rockies.craigslist.org/','http://westslope.craigslist.org/'],
13
+ :connecticut => ['http://newlondon.craigslist.org/','http://hartford.craigslist.org/','http://newhaven.craigslist.org/','http://nwct.craigslist.org/'],
14
+ :delaware => ['http://delaware.craigslist.org/'],
15
+ :dc => ['http://washingtondc.craigslist.org/'],
16
+ :florida => ['http://daytona.craigslist.org/','http://keys.craigslist.org/','http://fortmyers.craigslist.org/','http://gainesville.craigslist.org/','http://jacksonville.craigslist.org/','http://lakeland.craigslist.org/','http://ocala.craigslist.org/','http://orlando.craigslist.org/','http://panamacity.craigslist.org/','http://pensacola.craigslist.org/','http://sarasota.craigslist.org/','http://miami.craigslist.org/','http://spacecoast.craigslist.org/','http://staugustine.craigslist.org/','http://tallahassee.craigslist.org/','http://tampa.craigslist.org/','http://treasure.craigslist.org/'],
17
+ :georgia => ['http://athensga.craigslist.org/','http://atlanta.craigslist.org/','http://augusta.craigslist.org/','http://brunswick.craigslist.org/','http://columbusga.craigslist.org/','http://macon.craigslist.org/','http://savannah.craigslist.org/','http://valdosta.craigslist.org/'],
18
+ :hawaii => ['http://honolulu.craigslist.org/'],
19
+ :idaho => ['http://boise.craigslist.org/','http://eastidaho.craigslist.org/','http://pullman.craigslist.org/','http://spokane.craigslist.org/','http://twinfalls.craigslist.org/'],
20
+ :illinois => ['http://bn.craigslist.org/','http://carbondale.craigslist.org/','http://chambana.craigslist.org/','http://chicago.craigslist.org/','http://decatur.craigslist.org/','http://peoria.craigslist.org/','http://quadcities.craigslist.org/','http://rockford.craigslist.org/','http://springfieldil.craigslist.org/','http://stlouis.craigslist.org/'],
21
+ :indiana => ['http://bloomington.craigslist.org/','http://evansville.craigslist.org/','http://fortwayne.craigslist.org/','http://indianapolis.craigslist.org/','http://tippecanoe.craigslist.org/','http://muncie.craigslist.org/','http://southbend.craigslist.org/','http://terrahaute.craigslist.org/'],
22
+ :iowa => ['http://ames.craigslist.org/','http://cedarrapids.craigslist.org/','http://desmoines.craigslist.org/','http://dubuque.craigslist.org/','http://iowacity.craigslist.org/','http://omaha.craigslist.org/','http://quadcities.craigslist.org/','http://siouxcity.craigslist.org/','http://waterloo.craigslist.org/'],
23
+ :kansas => ['http://kansascity.craigslist.org/','http://lawrence.craigslist.org/','http://ksu.craigslist.org/','http://topeka.craigslist.org/','http://wichita.craigslist.org/'],
24
+ :kentucky => ['http://bgky.craigslist.org/','http://cincinnati.craigslist.org/','http://huntington.craigslist.org/','http://lexington.craigslist.org/','http://louisville.craigslist.org/','http://westky.craigslist.org/'],
25
+ :louisiana => ['http://batonrouge.craigslist.org/','http://lafayette.craigslist.org/','http://lakecharles.craigslist.org/','http://monroe.craigslist.org/','http://neworleans.craigslist.org/','http://shreveport.craigslist.org/'],
26
+ :maine => ['http://maine.craigslist.org/'],
27
+ :maryland => ['http://annapolis.craigslist.org/','http://baltimore.craigslist.org/','http://easternshore.craigslist.org/','http://smd.craigslist.org/','http://westmd.craigslist.org/'],
28
+ :mass => ['http://boston.craigslist.org/','http://capecod.craigslist.org/','http://southcoast.craigslist.org/','http://westernmass.craigslist.org/','http://worcester.craigslist.org/'],
29
+ :michigan => ['http://annarbor.craigslist.org/','http://centralmich.craigslist.org/','http://detroit.craigslist.org/','http://flint.craigslist.org/','http://grandrapids.craigslist.org/','http://jxn.craigslist.org/','http://kalamazoo.craigslist.org/','http://lansing.craigslist.org/','http://muskegon.craigslist.org/','http://nmi.craigslist.org/','http://porthuron.craigslist.org/','http://saginaw.craigslist.org/','http://southbend.craigslist.org/','http://swmi.craigslist.org/','http://up.craigslist.org/'],
30
+ :minnesota => ['http://duluth.craigslist.org/','http://fargo.craigslist.org/','http://mankato.craigslist.org/','http://minneapolis.craigslist.org/','http://rmn.craigslist.org/','http://stcloud.craigslist.org/'],
31
+ :mississippi => ['http://gulfport.craigslist.org/','http://hattiesburg.craigslist.org/','http://jackson.craigslist.org/','http://memphis.craigslist.org/','http://northmiss.craigslist.org/'],
32
+ :missouri => ['http://columbiamo.craigslist.org/','http://joplin.craigslist.org/','http://kansascity.craigslist.org/','http://semo.craigslist.org/','http://springfield.craigslist.org/','http://stlouis.craigslist.org/'],
33
+ :montana => ['http://montana.craigslist.org/'],
34
+ :nebraska => ['http://grandisland.craigslist.org/','http://lincoln.craigslist.org/','http://omaha.craigslist.org/','http://siouxcity.craigslist.org/'],
35
+ :nevada => ['http://lasvegas.craigslist.org/','http://reno.craigslist.org/'],
36
+ :n_hampshire => ['http://nh.craigslist.org/'],
37
+ :new_jersey => ['http://cnj.craigslist.org/','http://jerseyshore.craigslist.org/','http://newjersey.craigslist.org/','http://southjersey.craigslist.org/'],
38
+ :new_mexico => ['http://albuquerque.craigslist.org/','http://farmington.craigslist.org/','http://lascruces.craigslist.org/','http://roswell.craigslist.org/','http://santafe.craigslist.org/'],
39
+ :new_york => ['http://albany.craigslist.org/','http://binghamton.craigslist.org/','http://buffalo.craigslist.org/','http://catskills.craigslist.org/','http://chautauqua.craigslist.org/','http://elmira.craigslist.org/','http://hudsonvalley.craigslist.org/','http://ithaca.craigslist.org/','http://longisland.craigslist.org/','http://newyork.craigslist.org/','http://plattsburgh.craigslist.org/','http://rochester.craigslist.org/','http://syracuse.craigslist.org/','http://utica.craigslist.org/','http://watertown.craigslist.org/'],
40
+ :n_carolina => ['http://asheville.craigslist.org/','http://boone.craigslist.org/','http://charlotte.craigslist.org/','http://eastnc.craigslist.org/','http://fayetteville.craigslist.org/','http://greensboro.craigslist.org/','http://hickory.craigslist.org/','http://outerbanks.craigslist.org/','http://raleigh.craigslist.org/','http://wilmington.craigslist.org/','http://winstonsalem.craigslist.org/'],
41
+ :north_dakota => ['http://fargo.craigslist.org/','http://nd.craigslist.org/'],
42
+ :ohio => ['http://akroncanton.craigslist.org/','http://athensohio.craigslist.org/','http://cincinnati.craigslist.org/','http://cleveland.craigslist.org/','http://columbus.craigslist.org/','http://dayton.craigslist.org/','http://huntington.craigslist.org/','http://limaohio.craigslist.org/','http://mansfield.craigslist.org/','http://parkersburg.craigslist.org/','http://sandusky.craigslist.org/','http://toledo.craigslist.org/','http://wheeling.craigslist.org/','http://youngstown.craigslist.org/'],
43
+ :oklahoma => ['http://fortsmith.craigslist.org/','http://lawton.craigslist.org/','http://oklahomacity.craigslist.org/','http://stillwater.craigslist.org/','http://tulsa.craigslist.org/'],
44
+ :oregon => ['http://bend.craigslist.org/','http://corvallis.craigslist.org/','http://eastoregon.craigslist.org/','http://eugene.craigslist.org/','http://medford.craigslist.org/','http://oregoncoast.craigslist.org/','http://portland.craigslist.org/','http://roseburg.craigslist.org/','http://salem.craigslist.org/'],
45
+ :pennsylvania => ['http://altoona.craigslist.org/','http://erie.craigslist.org/','http://harrisburg.craigslist.org/','http://lancaster.craigslist.org/','http://allentown.craigslist.org/','http://philadelphia.craigslist.org/','http://pittsburgh.craigslist.org/','http://poconos.craigslist.org/','http://reading.craigslist.org/','http://scranton.craigslist.org/','http://pennstate.craigslist.org/','http://williamsport.craigslist.org/','http://york.craigslist.org/'],
46
+ :rhode_island => ['http://providence.craigslist.org/'],
47
+ :s_carolina => ['http://charleston.craigslist.org/','http://columbia.craigslist.org/','http://florencesc.craigslist.org/','http://greenville.craigslist.org/','http://hiltonhead.craigslist.org/','http://myrtlebeach.craigslist.org/'],
48
+ :south_dakota => ['http://sd.craigslist.org/'],
49
+ :tennessee => ['http://chattanooga.craigslist.org/','http://clarksville.craigslist.org/','http://jacksontn.craigslist.org/','http://knoxville.craigslist.org/','http://memphis.craigslist.org/','http://nashville.craigslist.org/','http://tricities.craigslist.org/'],
50
+ :texas => ['http://abilene.craigslist.org/','http://amarillo.craigslist.org/','http://austin.craigslist.org/','http://beaumont.craigslist.org/','http://brownsville.craigslist.org/','http://collegestation.craigslist.org/','http://corpuschristi.craigslist.org/','http://dallas.craigslist.org/','http://elpaso.craigslist.org/','http://galveston.craigslist.org/','http://houston.craigslist.org/','http://killeen.craigslist.org/','http://laredo.craigslist.org/','http://lubbock.craigslist.org/','http://mcallen.craigslist.org/','http://odessa.craigslist.org/','http://sanantonio.craigslist.org/','http://sanmarcos.craigslist.org/','http://texarkana.craigslist.org/','http://easttexas.craigslist.org/','http://victoriatx.craigslist.org/','http://waco.craigslist.org/','http://wichitafalls.craigslist.org/'],
51
+ :utah => ['http://logan.craigslist.org/','http://ogden.craigslist.org/','http://provo.craigslist.org/','http://saltlakecity.craigslist.org/','http://stgeorge.craigslist.org/'],
52
+ :vermont => ['http://burlington.craigslist.org/'],
53
+ :virginia => ['http://blacksburg.craigslist.org/','http://charlottesville.craigslist.org/','http://danville.craigslist.org/','http://easternshore.craigslist.org/','http://fredericksburg.craigslist.org/','http://norfolk.craigslist.org/','http://harrisonburg.craigslist.org/','http://lynchburg.craigslist.org/','http://richmond.craigslist.org/','http://roanoke.craigslist.org/'],
54
+ :washington => ['http://bellingham.craigslist.org/','http://kpr.craigslist.org/','http://olympic.craigslist.org/','http://pullman.craigslist.org/','http://seattle.craigslist.org/','http://skagit.craigslist.org/','http://spokane.craigslist.org/','http://wenatchee.craigslist.org/','http://yakima.craigslist.org/'],
55
+ :west_virginia => ['http://charlestonwv.craigslist.org/','http://huntington.craigslist.org/','http://martinsburg.craigslist.org/','http://morgantown.craigslist.org/','http://parkersburg.craigslist.org/','http://wv.craigslist.org/','http://wheeling.craigslist.org/'],
56
+ :wisconsin => ['http://appleton.craigslist.org/','http://duluth.craigslist.org/','http://eauclaire.craigslist.org/','http://greenbay.craigslist.org/','http://janesville.craigslist.org/','http://racine.craigslist.org/','http://lacrosse.craigslist.org/','http://madison.craigslist.org/','http://milwaukee.craigslist.org/','http://sheboygan.craigslist.org/','http://wausau.craigslist.org/'],
57
+ :wyoming => ['http://wyoming.craigslist.org/'],
58
+ # Alabama
59
+ :auburn => ['http://auburn.craigslist.org/'],
60
+ :bham => ['http://bham.craigslist.org/'],
61
+ :columbusga => ['http://columbusga.craigslist.org/'],
62
+ :dothan => ['http://dothan.craigslist.org/'],
63
+ :shoals => ['http://shoals.craigslist.org/'],
64
+ :gadsden => ['http://gadsden.craigslist.org/'],
65
+ :huntsville => ['http://huntsville.craigslist.org/'],
66
+ :mobile => ['http://mobile.craigslist.org/'],
67
+ :montgomery => ['http://montgomery.craigslist.org/'],
68
+ :tuscaloosa => ['http://tuscaloosa.craigslist.org/'],
69
+ # Alaska =
70
+ :anchorage => ['http://anchorage.craigslist.org/'],
71
+ # Arizona =
72
+ :flagstaff => ['http://flagstaff.craigslist.org/'],
73
+ :mohave => ['http://mohave.craigslist.org/'],
74
+ :phoenix => ['http://phoenix.craigslist.org/'],
75
+ :prescott => ['http://prescott.craigslist.org/'],
76
+ :sierravista => ['http://sierravista.craigslist.org/'],
77
+ :tucson => ['http://tucson.craigslist.org/'],
78
+ :yuma => ['http://yuma.craigslist.org/'],
79
+ # Arkansas =
80
+ :fayar => ['http://fayar.craigslist.org/'],
81
+ :fortsmith => ['http://fortsmith.craigslist.org/'],
82
+ :jonesboro => ['http://jonesboro.craigslist.org/'],
83
+ :littlerock => ['http://littlerock.craigslist.org/'],
84
+ :memphis => ['http://memphis.craigslist.org/'],
85
+ :texarkana => ['http://texarkana.craigslist.org/'],
86
+ # California =
87
+ :sfbay => ['http://sfbay.craigslist.org/'],
88
+ :bakersfield => ['http://bakersfield.craigslist.org/'],
89
+ :chico => ['http://chico.craigslist.org/'],
90
+ :fresno => ['http://fresno.craigslist.org/'],
91
+ :goldcountry => ['http://goldcountry.craigslist.org/'],
92
+ :humboldt => ['http://humboldt.craigslist.org/'],
93
+ :imperial => ['http://imperial.craigslist.org/'],
94
+ :inlandempire => ['http://inlandempire.craigslist.org/'],
95
+ :losangeles => ['http://losangeles.craigslist.org/'],
96
+ :mendocino => ['http://mendocino.craigslist.org/'],
97
+ :merced => ['http://merced.craigslist.org/'],
98
+ :modesto => ['http://modesto.craigslist.org/'],
99
+ :monterey => ['http://monterey.craigslist.org/'],
100
+ :orangecounty => ['http://orangecounty.craigslist.org/'],
101
+ :palmsprings => ['http://palmsprings.craigslist.org/'],
102
+ :redding => ['http://redding.craigslist.org/'],
103
+ :reno => ['http://reno.craigslist.org/'],
104
+ :sacramento => ['http://sacramento.craigslist.org/'],
105
+ :sandiego => ['http://sandiego.craigslist.org/'],
106
+ :slo => ['http://slo.craigslist.org/'],
107
+ :santabarbara => ['http://santabarbara.craigslist.org/'],
108
+ :stockton => ['http://stockton.craigslist.org/'],
109
+ :ventura => ['http://ventura.craigslist.org/'],
110
+ :visalia => ['http://visalia.craigslist.org/'],
111
+ :yubasutter => ['http://yubasutter.craigslist.org/'],
112
+ # Colorado =
113
+ :boulder => ['http://boulder.craigslist.org/'],
114
+ :cosprings => ['http://cosprings.craigslist.org/'],
115
+ :denver => ['http://denver.craigslist.org/'],
116
+ :fortcollins => ['http://fortcollins.craigslist.org/'],
117
+ :pueblo => ['http://pueblo.craigslist.org/'],
118
+ :rockies => ['http://rockies.craigslist.org/'],
119
+ :westslope => ['http://westslope.craigslist.org/'],
120
+ # Connecticut =
121
+ :newlondon => ['http://newlondon.craigslist.org/'],
122
+ :hartford => ['http://hartford.craigslist.org/'],
123
+ :newhaven => ['http://newhaven.craigslist.org/'],
124
+ :nwct => ['http://nwct.craigslist.org/'],
125
+ # Delaware =
126
+ :delaware => ['http://delaware.craigslist.org/'],
127
+ # Dc =
128
+ :washingtondc => ['http://washingtondc.craigslist.org/'],
129
+ # Florida =
130
+ :daytona => ['http://daytona.craigslist.org/'],
131
+ :keys => ['http://keys.craigslist.org/'],
132
+ :fortmyers => ['http://fortmyers.craigslist.org/'],
133
+ :gainesville => ['http://gainesville.craigslist.org/'],
134
+ :jacksonville => ['http://jacksonville.craigslist.org/'],
135
+ :lakeland => ['http://lakeland.craigslist.org/'],
136
+ :ocala => ['http://ocala.craigslist.org/'],
137
+ :orlando => ['http://orlando.craigslist.org/'],
138
+ :panamacity => ['http://panamacity.craigslist.org/'],
139
+ :pensacola => ['http://pensacola.craigslist.org/'],
140
+ :sarasota => ['http://sarasota.craigslist.org/'],
141
+ :miami => ['http://miami.craigslist.org/'],
142
+ :spacecoast => ['http://spacecoast.craigslist.org/'],
143
+ :staugustine => ['http://staugustine.craigslist.org/'],
144
+ :tallahassee => ['http://tallahassee.craigslist.org/'],
145
+ :tampa => ['http://tampa.craigslist.org/'],
146
+ :treasure => ['http://treasure.craigslist.org/'],
147
+ # Georgia =
148
+ :athensga => ['http://athensga.craigslist.org/'],
149
+ :atlanta => ['http://atlanta.craigslist.org/'],
150
+ :augusta => ['http://augusta.craigslist.org/'],
151
+ :brunswick => ['http://brunswick.craigslist.org/'],
152
+ :columbusga => ['http://columbusga.craigslist.org/'],
153
+ :macon => ['http://macon.craigslist.org/'],
154
+ :savannah => ['http://savannah.craigslist.org/'],
155
+ :valdosta => ['http://valdosta.craigslist.org/'],
156
+ # Hawaii =
157
+ :honolulu => ['http://honolulu.craigslist.org/'],
158
+ # Idaho =
159
+ :boise => ['http://boise.craigslist.org/'],
160
+ :eastidaho => ['http://eastidaho.craigslist.org/'],
161
+ :pullman => ['http://pullman.craigslist.org/'],
162
+ :spokane => ['http://spokane.craigslist.org/'],
163
+ :twinfalls => ['http://twinfalls.craigslist.org/'],
164
+ # Illinois =
165
+ :bn => ['http://bn.craigslist.org/'],
166
+ :carbondale => ['http://carbondale.craigslist.org/'],
167
+ :chambana => ['http://chambana.craigslist.org/'],
168
+ :chicago => ['http://chicago.craigslist.org/'],
169
+ :decatur => ['http://decatur.craigslist.org/'],
170
+ :peoria => ['http://peoria.craigslist.org/'],
171
+ :quadcities => ['http://quadcities.craigslist.org/'],
172
+ :rockford => ['http://rockford.craigslist.org/'],
173
+ :springfieldil => ['http://springfieldil.craigslist.org/'],
174
+ :stlouis => ['http://stlouis.craigslist.org/'],
175
+ # Indiana =
176
+ :bloomington => ['http://bloomington.craigslist.org/'],
177
+ :evansville => ['http://evansville.craigslist.org/'],
178
+ :fortwayne => ['http://fortwayne.craigslist.org/'],
179
+ :indianapolis => ['http://indianapolis.craigslist.org/'],
180
+ :tippecanoe => ['http://tippecanoe.craigslist.org/'],
181
+ :muncie => ['http://muncie.craigslist.org/'],
182
+ :southbend => ['http://southbend.craigslist.org/'],
183
+ :terrahaute => ['http://terrahaute.craigslist.org/'],
184
+ # Iowa =
185
+ :ames => ['http://ames.craigslist.org/'],
186
+ :cedarrapids => ['http://cedarrapids.craigslist.org/'],
187
+ :desmoines => ['http://desmoines.craigslist.org/'],
188
+ :dubuque => ['http://dubuque.craigslist.org/'],
189
+ :iowacity => ['http://iowacity.craigslist.org/'],
190
+ :omaha => ['http://omaha.craigslist.org/'],
191
+ :quadcities => ['http://quadcities.craigslist.org/'],
192
+ :siouxcity => ['http://siouxcity.craigslist.org/'],
193
+ :waterloo => ['http://waterloo.craigslist.org/'],
194
+ # Kansas =
195
+ :kansascity => ['http://kansascity.craigslist.org/'],
196
+ :lawrence => ['http://lawrence.craigslist.org/'],
197
+ :ksu => ['http://ksu.craigslist.org/'],
198
+ :topeka => ['http://topeka.craigslist.org/'],
199
+ :wichita => ['http://wichita.craigslist.org/'],
200
+ # Kentucky =
201
+ :bgky => ['http://bgky.craigslist.org/'],
202
+ :cincinnati => ['http://cincinnati.craigslist.org/'],
203
+ :huntington => ['http://huntington.craigslist.org/'],
204
+ :lexington => ['http://lexington.craigslist.org/'],
205
+ :louisville => ['http://louisville.craigslist.org/'],
206
+ :westky => ['http://westky.craigslist.org/'],
207
+ # Louisiana =
208
+ :batonrouge => ['http://batonrouge.craigslist.org/'],
209
+ :lafayette => ['http://lafayette.craigslist.org/'],
210
+ :lakecharles => ['http://lakecharles.craigslist.org/'],
211
+ :monroe => ['http://monroe.craigslist.org/'],
212
+ :neworleans => ['http://neworleans.craigslist.org/'],
213
+ :shreveport => ['http://shreveport.craigslist.org/'],
214
+ # Maine =
215
+ :maine => ['http://maine.craigslist.org/'],
216
+ # Maryland =
217
+ :annapolis => ['http://annapolis.craigslist.org/'],
218
+ :baltimore => ['http://baltimore.craigslist.org/'],
219
+ :easternshore => ['http://easternshore.craigslist.org/'],
220
+ :smd => ['http://smd.craigslist.org/'],
221
+ :westmd => ['http://westmd.craigslist.org/'],
222
+ # Mass =
223
+ :boston => ['http://boston.craigslist.org/'],
224
+ :capecod => ['http://capecod.craigslist.org/'],
225
+ :southcoast => ['http://southcoast.craigslist.org/'],
226
+ :westernmass => ['http://westernmass.craigslist.org/'],
227
+ :worcester => ['http://worcester.craigslist.org/'],
228
+ # Michigan =
229
+ :annarbor => ['http://annarbor.craigslist.org/'],
230
+ :centralmich => ['http://centralmich.craigslist.org/'],
231
+ :detroit => ['http://detroit.craigslist.org/'],
232
+ :flint => ['http://flint.craigslist.org/'],
233
+ :grandrapids => ['http://grandrapids.craigslist.org/'],
234
+ :jxn => ['http://jxn.craigslist.org/'],
235
+ :kalamazoo => ['http://kalamazoo.craigslist.org/'],
236
+ :lansing => ['http://lansing.craigslist.org/'],
237
+ :muskegon => ['http://muskegon.craigslist.org/'],
238
+ :nmi => ['http://nmi.craigslist.org/'],
239
+ :porthuron => ['http://porthuron.craigslist.org/'],
240
+ :saginaw => ['http://saginaw.craigslist.org/'],
241
+ :southbend => ['http://southbend.craigslist.org/'],
242
+ :swmi => ['http://swmi.craigslist.org/'],
243
+ :up => ['http://up.craigslist.org/'],
244
+ # Minnesota =
245
+ :duluth => ['http://duluth.craigslist.org/'],
246
+ :fargo => ['http://fargo.craigslist.org/'],
247
+ :mankato => ['http://mankato.craigslist.org/'],
248
+ :minneapolis => ['http://minneapolis.craigslist.org/'],
249
+ :rmn => ['http://rmn.craigslist.org/'],
250
+ :stcloud => ['http://stcloud.craigslist.org/'],
251
+ # Mississippi =
252
+ :gulfport => ['http://gulfport.craigslist.org/'],
253
+ :hattiesburg => ['http://hattiesburg.craigslist.org/'],
254
+ :jackson => ['http://jackson.craigslist.org/'],
255
+ :memphis => ['http://memphis.craigslist.org/'],
256
+ :northmiss => ['http://northmiss.craigslist.org/'],
257
+ # Missouri =
258
+ :columbiamo => ['http://columbiamo.craigslist.org/'],
259
+ :joplin => ['http://joplin.craigslist.org/'],
260
+ :kansascity => ['http://kansascity.craigslist.org/'],
261
+ :semo => ['http://semo.craigslist.org/'],
262
+ :springfield => ['http://springfield.craigslist.org/'],
263
+ :stlouis => ['http://stlouis.craigslist.org/'],
264
+ # Montana =
265
+ :montana => ['http://montana.craigslist.org/'],
266
+ # Nebraska =
267
+ :grandisland => ['http://grandisland.craigslist.org/'],
268
+ :lincoln => ['http://lincoln.craigslist.org/'],
269
+ :omaha => ['http://omaha.craigslist.org/'],
270
+ :siouxcity => ['http://siouxcity.craigslist.org/'],
271
+ # Nevada =
272
+ :lasvegas => ['http://lasvegas.craigslist.org/'],
273
+ :reno => ['http://reno.craigslist.org/'],
274
+ # N hampshire =
275
+ :nh => ['http://nh.craigslist.org/'],
276
+ # New jersey =
277
+ :cnj => ['http://cnj.craigslist.org/'],
278
+ :jerseyshore => ['http://jerseyshore.craigslist.org/'],
279
+ :newjersey => ['http://newjersey.craigslist.org/'],
280
+ :southjersey => ['http://southjersey.craigslist.org/'],
281
+ # New mexico =
282
+ :albuquerque => ['http://albuquerque.craigslist.org/'],
283
+ :farmington => ['http://farmington.craigslist.org/'],
284
+ :lascruces => ['http://lascruces.craigslist.org/'],
285
+ :roswell => ['http://roswell.craigslist.org/'],
286
+ :santafe => ['http://santafe.craigslist.org/'],
287
+ # New york =
288
+ :albany => ['http://albany.craigslist.org/'],
289
+ :binghamton => ['http://binghamton.craigslist.org/'],
290
+ :buffalo => ['http://buffalo.craigslist.org/'],
291
+ :catskills => ['http://catskills.craigslist.org/'],
292
+ :chautauqua => ['http://chautauqua.craigslist.org/'],
293
+ :elmira => ['http://elmira.craigslist.org/'],
294
+ :hudsonvalley => ['http://hudsonvalley.craigslist.org/'],
295
+ :ithaca => ['http://ithaca.craigslist.org/'],
296
+ :longisland => ['http://longisland.craigslist.org/'],
297
+ :newyork => ['http://newyork.craigslist.org/'],
298
+ :plattsburgh => ['http://plattsburgh.craigslist.org/'],
299
+ :rochester => ['http://rochester.craigslist.org/'],
300
+ :syracuse => ['http://syracuse.craigslist.org/'],
301
+ :utica => ['http://utica.craigslist.org/'],
302
+ :watertown => ['http://watertown.craigslist.org/'],
303
+ # N carolina =
304
+ :asheville => ['http://asheville.craigslist.org/'],
305
+ :boone => ['http://boone.craigslist.org/'],
306
+ :charlotte => ['http://charlotte.craigslist.org/'],
307
+ :eastnc => ['http://eastnc.craigslist.org/'],
308
+ :fayetteville => ['http://fayetteville.craigslist.org/'],
309
+ :greensboro => ['http://greensboro.craigslist.org/'],
310
+ :hickory => ['http://hickory.craigslist.org/'],
311
+ :outerbanks => ['http://outerbanks.craigslist.org/'],
312
+ :raleigh => ['http://raleigh.craigslist.org/'],
313
+ :wilmington => ['http://wilmington.craigslist.org/'],
314
+ :winstonsalem => ['http://winstonsalem.craigslist.org/'],
315
+ # North dakota =
316
+ :fargo => ['http://fargo.craigslist.org/'],
317
+ :nd => ['http://nd.craigslist.org/'],
318
+ # Ohio =
319
+ :akroncanton => ['http://akroncanton.craigslist.org/'],
320
+ :athensohio => ['http://athensohio.craigslist.org/'],
321
+ :cincinnati => ['http://cincinnati.craigslist.org/'],
322
+ :cleveland => ['http://cleveland.craigslist.org/'],
323
+ :columbus => ['http://columbus.craigslist.org/'],
324
+ :dayton => ['http://dayton.craigslist.org/'],
325
+ :huntington => ['http://huntington.craigslist.org/'],
326
+ :limaohio => ['http://limaohio.craigslist.org/'],
327
+ :mansfield => ['http://mansfield.craigslist.org/'],
328
+ :parkersburg => ['http://parkersburg.craigslist.org/'],
329
+ :sandusky => ['http://sandusky.craigslist.org/'],
330
+ :toledo => ['http://toledo.craigslist.org/'],
331
+ :wheeling => ['http://wheeling.craigslist.org/'],
332
+ :youngstown => ['http://youngstown.craigslist.org/'],
333
+ # Oklahoma =
334
+ :fortsmith => ['http://fortsmith.craigslist.org/'],
335
+ :lawton => ['http://lawton.craigslist.org/'],
336
+ :oklahomacity => ['http://oklahomacity.craigslist.org/'],
337
+ :stillwater => ['http://stillwater.craigslist.org/'],
338
+ :tulsa => ['http://tulsa.craigslist.org/'],
339
+ # Oregon =
340
+ :bend => ['http://bend.craigslist.org/'],
341
+ :corvallis => ['http://corvallis.craigslist.org/'],
342
+ :eastoregon => ['http://eastoregon.craigslist.org/'],
343
+ :eugene => ['http://eugene.craigslist.org/'],
344
+ :medford => ['http://medford.craigslist.org/'],
345
+ :oregoncoast => ['http://oregoncoast.craigslist.org/'],
346
+ :portland => ['http://portland.craigslist.org/'],
347
+ :roseburg => ['http://roseburg.craigslist.org/'],
348
+ :salem => ['http://salem.craigslist.org/'],
349
+ # Pennsylvania =
350
+ :altoona => ['http://altoona.craigslist.org/'],
351
+ :erie => ['http://erie.craigslist.org/'],
352
+ :harrisburg => ['http://harrisburg.craigslist.org/'],
353
+ :lancaster => ['http://lancaster.craigslist.org/'],
354
+ :allentown => ['http://allentown.craigslist.org/'],
355
+ :philadelphia => ['http://philadelphia.craigslist.org/'],
356
+ :pittsburgh => ['http://pittsburgh.craigslist.org/'],
357
+ :poconos => ['http://poconos.craigslist.org/'],
358
+ :reading => ['http://reading.craigslist.org/'],
359
+ :scranton => ['http://scranton.craigslist.org/'],
360
+ :pennstate => ['http://pennstate.craigslist.org/'],
361
+ :williamsport => ['http://williamsport.craigslist.org/'],
362
+ :york => ['http://york.craigslist.org/'],
363
+ # Rhode island =
364
+ :providence => ['http://providence.craigslist.org/'],
365
+ # S carolina =
366
+ :charleston => ['http://charleston.craigslist.org/'],
367
+ :columbia => ['http://columbia.craigslist.org/'],
368
+ :florencesc => ['http://florencesc.craigslist.org/'],
369
+ :greenville => ['http://greenville.craigslist.org/'],
370
+ :hiltonhead => ['http://hiltonhead.craigslist.org/'],
371
+ :myrtlebeach => ['http://myrtlebeach.craigslist.org/'],
372
+ # South dakota =
373
+ :sd => ['http://sd.craigslist.org/'],
374
+ # Tennessee =
375
+ :chattanooga => ['http://chattanooga.craigslist.org/'],
376
+ :clarksville => ['http://clarksville.craigslist.org/'],
377
+ :jacksontn => ['http://jacksontn.craigslist.org/'],
378
+ :knoxville => ['http://knoxville.craigslist.org/'],
379
+ :memphis => ['http://memphis.craigslist.org/'],
380
+ :nashville => ['http://nashville.craigslist.org/'],
381
+ :tricities => ['http://tricities.craigslist.org/'],
382
+ # Texas =
383
+ :abilene => ['http://abilene.craigslist.org/'],
384
+ :amarillo => ['http://amarillo.craigslist.org/'],
385
+ :austin => ['http://austin.craigslist.org/'],
386
+ :beaumont => ['http://beaumont.craigslist.org/'],
387
+ :brownsville => ['http://brownsville.craigslist.org/'],
388
+ :collegestation => ['http://collegestation.craigslist.org/'],
389
+ :corpuschristi => ['http://corpuschristi.craigslist.org/'],
390
+ :dallas => ['http://dallas.craigslist.org/'],
391
+ :elpaso => ['http://elpaso.craigslist.org/'],
392
+ :galveston => ['http://galveston.craigslist.org/'],
393
+ :houston => ['http://houston.craigslist.org/'],
394
+ :killeen => ['http://killeen.craigslist.org/'],
395
+ :laredo => ['http://laredo.craigslist.org/'],
396
+ :lubbock => ['http://lubbock.craigslist.org/'],
397
+ :mcallen => ['http://mcallen.craigslist.org/'],
398
+ :odessa => ['http://odessa.craigslist.org/'],
399
+ :sanantonio => ['http://sanantonio.craigslist.org/'],
400
+ :sanmarcos => ['http://sanmarcos.craigslist.org/'],
401
+ :texarkana => ['http://texarkana.craigslist.org/'],
402
+ :easttexas => ['http://easttexas.craigslist.org/'],
403
+ :victoriatx => ['http://victoriatx.craigslist.org/'],
404
+ :waco => ['http://waco.craigslist.org/'],
405
+ :wichitafalls => ['http://wichitafalls.craigslist.org/'],
406
+ # Utah =
407
+ :logan => ['http://logan.craigslist.org/'],
408
+ :ogden => ['http://ogden.craigslist.org/'],
409
+ :provo => ['http://provo.craigslist.org/'],
410
+ :saltlakecity => ['http://saltlakecity.craigslist.org/'],
411
+ :stgeorge => ['http://stgeorge.craigslist.org/'],
412
+ # Vermont =
413
+ :burlington => ['http://burlington.craigslist.org/'],
414
+ # Virginia =
415
+ :blacksburg => ['http://blacksburg.craigslist.org/'],
416
+ :charlottesville => ['http://charlottesville.craigslist.org/'],
417
+ :danville => ['http://danville.craigslist.org/'],
418
+ :easternshore => ['http://easternshore.craigslist.org/'],
419
+ :fredericksburg => ['http://fredericksburg.craigslist.org/'],
420
+ :norfolk => ['http://norfolk.craigslist.org/'],
421
+ :harrisonburg => ['http://harrisonburg.craigslist.org/'],
422
+ :lynchburg => ['http://lynchburg.craigslist.org/'],
423
+ :richmond => ['http://richmond.craigslist.org/'],
424
+ :roanoke => ['http://roanoke.craigslist.org/'],
425
+ # Washington =
426
+ :bellingham => ['http://bellingham.craigslist.org/'],
427
+ :kpr => ['http://kpr.craigslist.org/'],
428
+ :olympic => ['http://olympic.craigslist.org/'],
429
+ :pullman => ['http://pullman.craigslist.org/'],
430
+ :seattle => ['http://seattle.craigslist.org/'],
431
+ :skagit => ['http://skagit.craigslist.org/'],
432
+ :spokane => ['http://spokane.craigslist.org/'],
433
+ :wenatchee => ['http://wenatchee.craigslist.org/'],
434
+ :yakima => ['http://yakima.craigslist.org/'],
435
+ # West virginia =
436
+ :charlestonwv => ['http://charlestonwv.craigslist.org/'],
437
+ :huntington => ['http://huntington.craigslist.org/'],
438
+ :martinsburg => ['http://martinsburg.craigslist.org/'],
439
+ :morgantown => ['http://morgantown.craigslist.org/'],
440
+ :parkersburg => ['http://parkersburg.craigslist.org/'],
441
+ :wv => ['http://wv.craigslist.org/'],
442
+ :wheeling => ['http://wheeling.craigslist.org/'],
443
+ # Wisconsin =
444
+ :appleton => ['http://appleton.craigslist.org/'],
445
+ :duluth => ['http://duluth.craigslist.org/'],
446
+ :eauclaire => ['http://eauclaire.craigslist.org/'],
447
+ :greenbay => ['http://greenbay.craigslist.org/'],
448
+ :janesville => ['http://janesville.craigslist.org/'],
449
+ :racine => ['http://racine.craigslist.org/'],
450
+ :lacrosse => ['http://lacrosse.craigslist.org/'],
451
+ :madison => ['http://madison.craigslist.org/'],
452
+ :milwaukee => ['http://milwaukee.craigslist.org/'],
453
+ :sheboygan => ['http://sheboygan.craigslist.org/'],
454
+ :wausau => ['http://wausau.craigslist.org/']
455
+ }
456
+
457
+ CATEGORIES = {
458
+ :community => 'ccc',
459
+ :event => 'eee',
460
+ :all_for_sale_or_wanted => 'sss',
461
+ :art_and_crafts => 'art',
462
+ :auto_parts => 'pts',
463
+ :baby_and_kid_stuff => 'bab',
464
+ :barter => 'bar',
465
+ :bicycles => 'bik',
466
+ :boats => 'boa',
467
+ :books => 'bks',
468
+ :business => 'bfs',
469
+ :cars_and_trucks => 'cta',
470
+ :media => 'emd',
471
+ :clothing => 'clo',
472
+ :collectibles => 'clt',
473
+ :computers_and_tech => 'sys',
474
+ :electronics => 'ele',
475
+ :farm_and_garden => 'grd',
476
+ :free_stuff => 'zip',
477
+ :furniture => 'fua',
478
+ :games_and_toys => 'tag',
479
+ :garage_sales => 'gms',
480
+ :general => 'for',
481
+ :household => 'hsh',
482
+ :items_wanted => 'wan',
483
+ :jewelry => 'jwl',
484
+ :materials => 'mat',
485
+ :motorcycles => 'mcy',
486
+ :musical_instruments => 'msg',
487
+ :photo_and_video => 'pho',
488
+ :recreational_vehicles => 'rvs',
489
+ :sporting_goods => 'spo',
490
+ :tickets => 'tix',
491
+ :tools => 'tls',
492
+ :gigs => 'ggg',
493
+ :housing => 'hhh',
494
+ :jobs => 'jjj',
495
+ :personals => 'ppp',
496
+ :resume => 'res',
497
+ :services_offered => 'bbb'
498
+ }
499
+
500
+ # :startdoc:
501
+ end
@@ -0,0 +1,94 @@
1
+ require 'erb'
2
+
3
+ module Craigler
4
+ class Search
5
+ include ERB::Util
6
+
7
+ attr_reader :search_term, :categories, :locations, :page_limit
8
+
9
+ # Creates a wrapper object for a craigslist search
10
+ #
11
+ # === Options
12
+ # [:in]
13
+ # Specifies the location(s) to search in. Defaults to <tt>:anywhere</tt>.
14
+ # [:only]
15
+ # Specifies the category or categories to search in. Defaults to <tt>:all_for_sale_or_wanted</tt>
16
+ # [:page_limit]
17
+ # Maximum number of pages to fetch results from. Defaults to <tt>4</tt>.
18
+ # <b>Note:</b> A location may, and often does, have more than one searchable
19
+ # url assciated with it, e.g., {California}[http://geo.craigslist.org/iso/us/ca]. Because
20
+ # <tt>:page_limit</tt> is applied seperately to each url within the location, searching <tt>:in => :california</tt>
21
+ # with a <tt>:page_limit => 4</tt> could potentially make up to 100 page requests.
22
+ def initialize(search_term, options = {})
23
+ raise InvalidSearchTerm if search_term.nil? || search_term == ''
24
+
25
+ options = {:in => :anywhere, :only => :all_for_sale_or_wanted, :page_limit => 4}.merge(options)
26
+ options[:in] = LOCATIONS.keys if options[:in] == :anywhere
27
+ @locations = (options[:in].is_a?(Array) ? options[:in] : [options[:in]]).collect(&:to_sym)
28
+ @categories = (options[:only].is_a?(Array) ? options[:only] : [options[:only]]).collect(&:to_sym)
29
+ @page_limit = options[:page_limit]
30
+ @search_term = search_term
31
+ @results = nil
32
+
33
+ _validate_locations()
34
+ _validate_categories()
35
+ end
36
+
37
+ # Returns the results of the search. If this is the first time
38
+ # calling #results then they will be fetched over the internet and cached in the search object.
39
+ #
40
+ # === Options
41
+ # [:refresh]
42
+ # Set to <tt>true</tt> to force an update across the internet.
43
+ def results(options = {})
44
+ options = { :refresh => false }.merge(options)
45
+ return @results unless @results.nil? || options[:refresh]
46
+
47
+ @results = []
48
+ last_page = @page_limit - 1 # pages start at 0
49
+
50
+ _for_each_locations_search_url() do |location, url|
51
+ (0..last_page).each do |page|
52
+ results = _extract_items_from_url(location, "#{url}&s=#{page*25}")
53
+ @results.push(*results)
54
+ break if results.size < RESULTS_PER_PAGE
55
+ end
56
+ end
57
+
58
+ results
59
+ end
60
+
61
+ protected
62
+ def _validate_locations # :nodoc:
63
+ @locations.each() do |location|
64
+ raise InvalidLocation.new(":anywhere not expected as part of an array") if location == :anywhere
65
+ raise InvalidLocation.new(":#{location} is not a valid location") unless LOCATIONS.key?(location)
66
+ end
67
+ end
68
+
69
+ def _validate_categories # :nodoc:
70
+ @categories.each() do |category|
71
+ raise InvalidCategory unless CATEGORIES.key?(category)
72
+ end
73
+ end
74
+
75
+ def _for_each_locations_search_url # :nodoc:
76
+ @locations.each do |location|
77
+ LOCATIONS[location].each do |url|
78
+ @categories.each do |category|
79
+ yield(location, "#{url}search/#{CATEGORIES[category]}?query=#{url_encode(@search_term)}&format=rss")
80
+ end
81
+ end
82
+ end
83
+ end
84
+
85
+ def _extract_items_from_url(location, url) # :nodoc:
86
+ (Hpricot(open(url))/'item').collect { |item| {
87
+ :url => item['rdf:about'],
88
+ :title => (item%'title').inner_text,
89
+ :location => location.to_s,
90
+ :published_at => Time.parse((item%'dc:date').inner_text)
91
+ }}
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,70 @@
1
+ require 'test_helper'
2
+
3
+ class CraiglerSearchTest < Test::Unit::TestCase
4
+ context "creating a search" do
5
+ should "require a valid category" do
6
+ assert_raises(Craigler::InvalidCategory) do
7
+ Craigler::Search.new('Yamaha Radian', :only => :invalid)
8
+ end
9
+ end
10
+
11
+ should "require a search term" do
12
+ assert_raises(Craigler::InvalidSearchTerm) do
13
+ Craigler::Search.new(nil)
14
+ end
15
+
16
+ assert_raises(ArgumentError) do
17
+ Craigler::Search.new()
18
+ end
19
+ end
20
+
21
+ should "not require a location" do
22
+ assert_nothing_raised() do
23
+ Craigler::Search.new('Yamaha Roadstar Warrior', :only => :motorcycles)
24
+ end
25
+ end
26
+
27
+ should "not require a category" do
28
+ assert_nothing_raised() do
29
+ Craigler::Search.new('Honda Shadow', :in => :utah)
30
+ end
31
+ end
32
+
33
+ should "use a default category of :all_for_sale_or_wanted" do
34
+ search = Craigler::Search.new('Buell', :in => :utah)
35
+ assert(search.categories == [:all_for_sale_or_wanted],
36
+ "category was [:#{search.categories.join(", :")}] but should have been [:all_for_sale_or_wanted]")
37
+ end
38
+
39
+ should "require that the location is valid" do
40
+ assert_raises(Craigler::InvalidLocation) do
41
+ Craigler::Search.new('Honda Nighthawk', :in => :invalid)
42
+ end
43
+ end
44
+
45
+ should "accept multiple locations" do
46
+ assert_nothing_raised() do
47
+ Craigler::Search.new('Suzuki Boulevard M50', :in => [:utah, :nevada])
48
+ end
49
+ end
50
+
51
+ should "allow us to limit the number of pages searched" do
52
+ one_page_count = Craigler::Search.new('Honda', :in => :utah, :page_limit => 1).results.size
53
+ two_page_count = Craigler::Search.new('Honda', :in => :utah, :page_limit => 2).results.size
54
+ assert(one_page_count < two_page_count, "#{one_page_count} is not less than #{two_page_count}")
55
+ end
56
+ end
57
+
58
+ context "fetching search results" do
59
+ setup do
60
+ @search = Craigler::Search.new('Honda', :in => :utah, :only => :motorcycles, :page_limit => 1)
61
+ end
62
+
63
+ should "return an array of hashes" do
64
+ results = @search.results()
65
+ assert(results.is_a?(Array), "Array exptected but was #{results.class}")
66
+ assert(results.size > 0, "No results were returned")
67
+ assert(results.inject(true) {|t,r| t && r.is_a?(Hash)})
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,33 @@
1
+ require 'test_helper'
2
+
3
+ class CraiglerTest < Test::Unit::TestCase
4
+ context "Search interface" do
5
+ should "respond to search" do
6
+ assert_respond_to(Craigler, :search)
7
+ end
8
+
9
+ should "yield results to a block if given" do
10
+ yielded = false
11
+ Craigler::search(:motorcycles, :in => :utah, :for => 'Yamaha', :page_limit => 1) do
12
+ yielded = true; break;
13
+ end
14
+
15
+ assert(yielded, "results were never yielded to the block")
16
+ end
17
+ end
18
+
19
+ context "Find interface" do
20
+ should "respond to find" do
21
+ assert_respond_to(Craigler, :find)
22
+ end
23
+
24
+ should "yield results to a block if given" do
25
+ yielded = false
26
+ Craigler::find('Yamaha', :in => :utah, :only => :motorcycles, :page_limit => 1) do
27
+ yielded = true; break;
28
+ end
29
+
30
+ assert(yielded, "results were never yielded to the block")
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,16 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'shoulda'
4
+
5
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
7
+
8
+ require 'craigler'
9
+
10
+ module Craigler
11
+ class Search
12
+ def open(*args)
13
+ @@results_page ||= Kernel::open("http://saltlakecity.craigslist.org/search/sss?query=Honda&format=rss&s=0").read()
14
+ end
15
+ end
16
+ end
metadata ADDED
@@ -0,0 +1,97 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: craigler
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease: false
6
+ segments:
7
+ - 1
8
+ - 3
9
+ - 0
10
+ version: 1.3.0
11
+ platform: ruby
12
+ authors:
13
+ - Devin Christensen
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-09-05 00:00:00 -06:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: shoulda
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 33
30
+ segments:
31
+ - 2
32
+ - 10
33
+ - 3
34
+ version: 2.10.3
35
+ type: :development
36
+ version_requirements: *id001
37
+ description:
38
+ email: quixoten@gmail.com
39
+ executables: []
40
+
41
+ extensions: []
42
+
43
+ extra_rdoc_files:
44
+ - LICENSE
45
+ - README.rdoc
46
+ files:
47
+ - .document
48
+ - .gitignore
49
+ - LICENSE
50
+ - README.rdoc
51
+ - Rakefile
52
+ - VERSION.yml
53
+ - craigler.gemspec
54
+ - lib/craigler.rb
55
+ - lib/craigler/constants.rb
56
+ - lib/craigler/search.rb
57
+ - test/craigler_search_test.rb
58
+ - test/craigler_test.rb
59
+ - test/test_helper.rb
60
+ has_rdoc: true
61
+ homepage: http://github.com/threetrieslater/craigler
62
+ licenses: []
63
+
64
+ post_install_message:
65
+ rdoc_options:
66
+ - --charset=UTF-8
67
+ require_paths:
68
+ - lib
69
+ required_ruby_version: !ruby/object:Gem::Requirement
70
+ none: false
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ hash: 3
75
+ segments:
76
+ - 0
77
+ version: "0"
78
+ required_rubygems_version: !ruby/object:Gem::Requirement
79
+ none: false
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ hash: 3
84
+ segments:
85
+ - 0
86
+ version: "0"
87
+ requirements: []
88
+
89
+ rubyforge_project:
90
+ rubygems_version: 1.3.7
91
+ signing_key:
92
+ specification_version: 3
93
+ summary: Search API for craigslist
94
+ test_files:
95
+ - test/craigler_search_test.rb
96
+ - test/craigler_test.rb
97
+ - test/test_helper.rb