street_easy 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a328e46dc15fb05c26f257422e040fa5dde4aa8d
4
- data.tar.gz: 899fabaa26d9946b0a6edb93d956fe9d3e164417
3
+ metadata.gz: 0f91bc2036044cd7a42439fa7b9a9f2b2c1f93ba
4
+ data.tar.gz: a12321d5522f71e1dc1f61662f275b1a08559c8f
5
5
  SHA512:
6
- metadata.gz: 66ff0e28b4f8a21ab8b2c20507443cb71ae06e30199f1f3d45dfaacd577049ad1a5030dfdb11003c2dbf6b49128f9841f6e25852980f80b7afe75e1ae8dd79f9
7
- data.tar.gz: a87aeda7fb2cb2f0cbaf764a658e2b3b50b15d6a03a076f2bfd9f429d7f10811c2301fa6f0ae7d9211d590a1fce0135f88ebdd45420febde640a141caa67ede1
6
+ metadata.gz: 11d338eb2ffd03abd65f33c8ae2974a55dc89d5a716a4059de4638af018234b2a4d685e978273d6884d5348325779794049abb4690b10a99cac4d455b27a6518
7
+ data.tar.gz: 4dc52e8804cfef54a1f5c9f7796d7ab0e6c4740cfb5904effda95249dd6a753417c123efccd79b1f4fa47e219d305f26ea1fc109550912028f771fd1c9f6fbdf
data/README.md CHANGED
@@ -1,6 +1,11 @@
1
- # StreetEasy
1
+ # StreetEasy API Gem
2
+
3
+ ## Description
4
+
5
+ A little gem tha integrates with the Street Easy API (beta).
6
+
7
+ API Documentation available [here](http://streeteasy.com/api/info).
2
8
 
3
- TODO: Write a gem description
4
9
 
5
10
  ## Installation
6
11
 
@@ -16,13 +21,199 @@ Or install it yourself as:
16
21
 
17
22
  $ gem install street_easy
18
23
 
19
- ## Usage
24
+ ## Set Up
25
+
26
+ First, register for an API key [here](http://streeteasy.com/api/info).
27
+
28
+ Then, place this code somewhere in your ruby environment.
29
+
30
+ require 'street_easy'
31
+
32
+ add your API key to the client:
33
+
34
+ StreetEasy::Client.api_key = 'your_api_key'
35
+
36
+ ## Property
37
+
38
+ The `StreatEasy::Property` object has the following methods:
39
+
40
+ * .rentals
41
+ * .sales
42
+ * .order(order_type)
43
+ * .neighborhoods(list_of_neighborhoods)
44
+ * .options(list_of_options)
45
+ * .limit(int)
46
+ * .all
47
+
48
+
49
+ ### Examples
50
+ * return the `200` `:most_expensive` `rentals` in all of `'nyc'` (note, the API maxes out at 200)
51
+ ```ruby
52
+ properties = StreetEasy::Property.all
53
+ # or
54
+ properties = StreetEasy::Property.rentals.all
55
+ # or
56
+ properties = StreetEasy::Property.rentals.order(:most_expensive).all
57
+ ```
58
+ * return the `200` `:most_expensive` `sales` in all of `'nyc'` (note, the API maxes out at 200)
20
59
 
21
- TODO: Write usage instructions here
60
+ ```ruby
61
+ properties = StreetEasy::Property.sales.all
62
+ #or
63
+ properties = StreetEasy::Property.sales.order(:most_expensive).all
64
+ ```
65
+ * return the `12` `:least_expensive` `rentals` in all of `'nyc'`.
66
+
67
+ ```ruby
68
+ properties = StreetEasy::Property.order(:least_expensive).limit(12)
69
+ ```
70
+
71
+ * return the `30` `:least_expensive` `rentals` in `'soho'`.
72
+ ```ruby
73
+ properties = StreetEasy::Property.neighborhoods('soho').order(:least_expensive).limit(30)
74
+ ```
75
+ * return the `newest` `rentals` in both `'soho'` AND `'murray-hill'` (limit 200)
76
+ ```ruby
77
+ properties = StreetEasy::Property.neighborhoods('soho', 'murray-hill').order(:newest).all
78
+ # or
79
+ properties = StreetEasy::Property.neighborhoods(['soho', 'murray-hill']).order(:newest).all
80
+ ```
81
+
82
+ * return the `30` `:least_expensive` `sales` in `'soho'`, `'murray hill'`, and the `'lower-east-side'`, but only return their `:price`, `:area_name`, `:description`, and `:floorplan`
83
+ ```ruby
84
+ properties = StreetEasy::Property.sales
85
+ .neighborhoods('soho', 'murray-hill', 'lower-east-side')
86
+ .options(:price, :area_name, :description, :floorplan)
87
+ .order(:least_expensive)
88
+ .limit(30)
89
+ ```
90
+
91
+ ### full list of neighborhoods:
92
+ ```ruby
93
+ 'battery-park-city'
94
+ 'chelsea'
95
+ 'west-chelsea'
96
+ 'chinatown'
97
+ 'two-bridges'
98
+ 'civic-center'
99
+ 'east-village'
100
+ 'financial-district'
101
+ 'fulton/seaport'
102
+ 'flatiron'
103
+ 'nomad'
104
+ 'gramercy-park'
105
+ 'greenwich-village'
106
+ 'noho'
107
+ 'little-italy'
108
+ 'lower-east-side'
109
+ 'nolita'
110
+ 'soho'
111
+ 'stuyvesant-town/pcv'
112
+ 'tribeca'
113
+ 'west-village'
114
+ 'all-midtown'
115
+ 'central-park-south'
116
+ 'midtown'
117
+ 'midtown-east'
118
+ 'kips-bay'
119
+ 'murray-hill'
120
+ 'sutton-place'
121
+ 'turtle-bay'
122
+ 'beekman'
123
+ 'midtown-south'
124
+ 'midtown-west'
125
+ 'roosevelt-island'
126
+ 'all-upper-east-side'
127
+ 'carnegie-hill'
128
+ 'lenox-hill'
129
+ 'upper-carnegie-hill'
130
+ 'upper-east-side'
131
+ 'yorkville'
132
+ 'all-upper-west-side'
133
+ 'lincoln-square'
134
+ 'manhattan-valley'
135
+ 'morningside-heights'
136
+ 'upper-west-side'
137
+ 'all-upper-manhattan'
138
+ 'central-harlem'
139
+ 'east-harlem'
140
+ 'hamilton-heights'
141
+ 'inwood'
142
+ 'manhattanville'
143
+ 'washington-heights'
144
+ 'fort-george'
145
+ 'hudson-heights'
146
+ 'west-harlem'
147
+ ```
148
+
149
+
150
+ ### list of .order options
151
+ ```ruby
152
+ :most_expensive # default
153
+ :least_expensive
154
+ :newest
155
+ ```
156
+
157
+ ### list of .option parameters
158
+
159
+ ```ruby
160
+
161
+ # default attributes
162
+ :title
163
+ :area_name
164
+ :price
165
+ :bedrooms
166
+ :bathrooms
167
+ :size_sqft
168
+ :url
169
+ :medium_image_uri
170
+
171
+ # additional attributes
172
+ :source_label
173
+ :clean_address
174
+ :description
175
+ :half_baths
176
+ :rooms_description
177
+ :addr_street
178
+ :addr_unit
179
+ :normalized_addr_unit
180
+ :addr_city
181
+ :addr_lat
182
+ :addr_lon
183
+ :size_sqft_num
184
+ :lot_size
185
+ :size_description
186
+ :ppsf
187
+ :ppsf_num
188
+ :ppsf_description
189
+ :created_at
190
+ :unit_type
191
+ :unit_type_label
192
+ :status
193
+ :price_cur
194
+ :floorplan
195
+ :open_house_start
196
+ :open_house_end
197
+ :sourceid
198
+ ```
22
199
 
23
200
  ## Contributing
24
201
 
25
- 1. Fork it ( https://github.com/[my-github-username]/street_easy/fork )
202
+ PLEASE CONTRIBUTE! This is my first ruby gem, and my first contribution to the open source movement! Therefore, there's a lot of room for improvement :)
203
+
204
+ TODO:
205
+ * tests (oh the travis-ci!)
206
+ * error handling
207
+ * refactor
208
+ * add other classes like `StreetEasy::NeighborhoodData`, `StreetEasy::Geo`, and others.
209
+
210
+ THOUGHTS:
211
+ * extract `StreetEasy::Property` into `StreetEasy::Property::Rental` and `StreetEasy::Property::Sale`?
212
+ * return objects instead of hashes?
213
+ * add a `.first` method? Other methods?
214
+ * don't implement method chaining?
215
+
216
+ 1. Fork it ( https://github.com/cblokker/street_easy/fork )
26
217
  2. Create your feature branch (`git checkout -b my-new-feature`)
27
218
  3. Commit your changes (`git commit -am 'Add some feature'`)
28
219
  4. Push to the branch (`git push origin my-new-feature`)
@@ -0,0 +1,39 @@
1
+ module StreetEasy
2
+ class Client
3
+ BASE_URI = "http://www.streeteasy.com/nyc/api/"
4
+
5
+ def self.api_key
6
+ @api_key
7
+ end
8
+
9
+ def self.api_key=(key)
10
+ @api_key = key
11
+ end
12
+
13
+ def self.construct_url(query)
14
+ uri = URI(
15
+ "#{BASE_URI}" +
16
+ "#{query[:property_type]}/" +
17
+ "search?criteria=" +
18
+ "area=#{query[:neighborhoods]}&" +
19
+ "limit=#{query[:limit]}&" +
20
+ "order=#{query[:order]}&" +
21
+ "key=#{@api_key}&" +
22
+ "format=json"
23
+ )
24
+ end
25
+
26
+ def self.construct_url(query)
27
+ uri = URI(
28
+ "#{BASE_URI}" +
29
+ "#{query[:property_type]}/" +
30
+ "search?criteria=" +
31
+ "area=#{query[:neighborhoods]}&" +
32
+ "limit=#{query[:limit]}&" +
33
+ "order=#{query[:order]}&" +
34
+ "key=#{@api_key}&" +
35
+ "format=json"
36
+ )
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,129 @@
1
+ require 'open-uri'
2
+ require 'json'
3
+
4
+ module StreetEasy
5
+ class Property < Client
6
+ @property_type = 'rentals'
7
+ @options = [
8
+ :title,
9
+ :area_name,
10
+ :price,
11
+ :bedrooms,
12
+ :bathrooms,
13
+ :size_sqft,
14
+ :url
15
+ ]
16
+
17
+
18
+ OPTIONS = [
19
+ :title,
20
+ :area_name,
21
+ :price,
22
+ :bedrooms,
23
+ :bathrooms,
24
+ :size_sqft,
25
+ :url,
26
+ :medium_image_uri,
27
+
28
+ :source_label,
29
+ :clean_address,
30
+ :description,
31
+ :half_baths,
32
+ :rooms_description,
33
+ :addr_street,
34
+ :addr_unit,
35
+ :normalized_addr_unit,
36
+ :addr_city,
37
+ :addr_lat,
38
+ :addr_lon,
39
+ :size_sqft_num,
40
+ :lot_size,
41
+ :size_description,
42
+ :ppsf,
43
+ :ppsf_num,
44
+ :ppsf_description,
45
+ :created_at,
46
+ :unit_type,
47
+ :unit_type_label,
48
+ :status,
49
+ :price_cur,
50
+ :floorplan,
51
+ :open_house_start,
52
+ :open_house_end,
53
+ :sourceid
54
+ ]
55
+
56
+ class << self
57
+ def neighborhoods(*neighborhood)
58
+ @neighborhoods = neighborhood.join(',') if neighborhood.kind_of?(Array)
59
+ @neighborhoods = neighborhood if neighborhood.kind_of?(String)
60
+ self
61
+ end
62
+
63
+ def rentals
64
+ @property_type = 'rentals'
65
+ self
66
+ end
67
+
68
+ def sales
69
+ @property_type = 'sales'
70
+ self
71
+ end
72
+
73
+ def options(*options)
74
+ @options = options.kind_of?(Array) ? options.flatten : options
75
+ self
76
+ end
77
+
78
+ def order(sort_type)
79
+ case sort_type
80
+ when :most_expensive then @sort_type = "price_desc"
81
+ when :least_expensive then @sort_type = "price_asc"
82
+ when :newest then @sort_type = "listed_desc"
83
+ end
84
+ self
85
+ end
86
+
87
+ def limit(limit)
88
+ @limit = limit
89
+ generate_properties
90
+ end
91
+
92
+ def all
93
+ @limit = 200 # the api limit
94
+ generate_properties
95
+ end
96
+
97
+ private
98
+ def generate_properties
99
+ parsed_reply = get_parsed_reply
100
+ properties = []
101
+
102
+ (0..@limit - 1).each do |i|
103
+ break if parsed_reply['listings'][i] == nil
104
+ rental = {}
105
+ OPTIONS.each do |option|
106
+ rental[option] = parsed_reply['listings'][i][option.to_s] if @options.include?(option)
107
+ end
108
+
109
+ properties << rental
110
+ end
111
+
112
+ properties
113
+ end
114
+
115
+
116
+ def get_parsed_reply
117
+ uri = StreetEasy::Client.construct_url({
118
+ property_type: @property_type,
119
+ neighborhoods: @neighborhoods,
120
+ limit: @limit,
121
+ order: @sort_type
122
+ })
123
+
124
+ reply = uri.read
125
+ parsed_reply = JSON.parse(reply)
126
+ end
127
+ end
128
+ end
129
+ end
@@ -1,3 +1,3 @@
1
1
  module StreetEasy
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
File without changes
File without changes
Binary file
data/street_easy.gemspec CHANGED
@@ -9,7 +9,8 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ["Chase Blokker"]
10
10
  spec.email = ["chaseblokker@yahoo.com"]
11
11
  spec.summary = %q{A ruby wrapper for the street easy API}
12
- spec.homepage = "http://rubygems.org/gems/street_easy"
12
+ spec.description = %q{A ruby wrapper for the street easy API}
13
+ spec.homepage = "https://rubygems.org/gems/street_easy"
13
14
  spec.license = "MIT"
14
15
 
15
16
  spec.files = `git ls-files -z`.split("\x0")
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: street_easy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chase Blokker
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-25 00:00:00.000000000 Z
11
+ date: 2014-10-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -52,22 +52,25 @@ dependencies:
52
52
  - - '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
- description:
55
+ description: A ruby wrapper for the street easy API
56
56
  email:
57
57
  - chaseblokker@yahoo.com
58
58
  executables: []
59
59
  extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
- - .gitignore
63
62
  - Gemfile
64
63
  - LICENSE.txt
65
64
  - README.md
66
- - Rakefile
67
65
  - lib/street_easy.rb
66
+ - lib/street_easy/client.rb
67
+ - lib/street_easy/property.rb
68
68
  - lib/street_easy/version.rb
69
+ - spec/spec_helper.rb
70
+ - spec/street_easy_helper.rb
71
+ - street_easy-0.0.1.gem
69
72
  - street_easy.gemspec
70
- homepage: http://rubygems.org/gems/street_easy
73
+ homepage: https://rubygems.org/gems/street_easy
71
74
  licenses:
72
75
  - MIT
73
76
  metadata: {}
@@ -91,4 +94,6 @@ rubygems_version: 2.2.2
91
94
  signing_key:
92
95
  specification_version: 4
93
96
  summary: A ruby wrapper for the street easy API
94
- test_files: []
97
+ test_files:
98
+ - spec/spec_helper.rb
99
+ - spec/street_easy_helper.rb
data/.gitignore DELETED
@@ -1,22 +0,0 @@
1
- *.gem
2
- *.rbc
3
- .bundle
4
- .config
5
- .yardoc
6
- Gemfile.lock
7
- InstalledFiles
8
- _yardoc
9
- coverage
10
- doc/
11
- lib/bundler/man
12
- pkg
13
- rdoc
14
- spec/reports
15
- test/tmp
16
- test/version_tmp
17
- tmp
18
- *.bundle
19
- *.so
20
- *.o
21
- *.a
22
- mkmf.log
data/Rakefile DELETED
@@ -1,15 +0,0 @@
1
- require "bundler/gem_tasks"
2
-
3
- require 'rake/testtask'
4
- Rake::TestTask.new do |test|
5
- test.libs << 'lib' << 'test'
6
- test.ruby_opts << "-rubygems"
7
- test.pattern = 'test/**/*_test.rb'
8
- test.verbose = true
9
- end
10
-
11
- # test/helper.rb
12
- require 'street_easy'
13
- require 'minitest/spec'
14
- require 'minitest/autorun'
15
-