nineflats-api 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,4 +1,53 @@
1
- Read about the API here: http://9flats.github.com/api_docs/
1
+ This gem helps you to use the 9flats.com API in your Ruby code. It always uses the latest API version. The current API version is 1.0.
2
+
3
+ Find the full API documentation here: http://9flats.github.com/api_docs/
4
+
5
+ You can also play around with the API [in your browser](http://nineflats-api-example.heroku.com/).
6
+
7
+ ### Usage
8
+
9
+ Just a few examples:
10
+
11
+ #### Get a place with all its attributes:
12
+
13
+ place = Place.fetch("schner-wohnen-im-belgischen")
14
+ place.name
15
+ place.city
16
+
17
+ #### Get more infos about the place:
18
+
19
+ place.photos
20
+ place.reviews
21
+ place.prices
22
+ place.calendar(2011, 10)
23
+
24
+ Except for the calendar, all data is cached.
25
+
26
+ #### Get info about a user:
27
+
28
+ user = User.fetch("jana-k-1")
29
+ user.name
30
+ user.favorites
31
+
32
+ The user's favorites is an array of places, see above.
33
+
34
+ #### Search for places:
35
+
36
+ The search accepts all search parameters, [see the API documentation](http://9flats.github.com/api_docs/places.html).
37
+
38
+ result = Place.search({:query => "Berlin", :number_of_beds => 4})
39
+
40
+ The result is a Nineflats::PaginatedArray. It contains the places that match the search queries. The default number of places you get is 9. The result also contains information about the search result, like
41
+
42
+ result.total_entries
43
+ result.total_pages
44
+ result.current_page
45
+ result.per_page
46
+
47
+ You can also get the next 9 places:
48
+
49
+ result.next_page
50
+
2
51
 
3
52
  ### How to update this gem
4
53
 
data/lib/nineflats-api.rb CHANGED
@@ -1 +1,2 @@
1
+ require 'oauth'
1
2
  Dir[File.dirname(__FILE__) + "/nineflats-api/**/*.rb"].sort.each { |f| require File.expand_path(f) }
@@ -0,0 +1,52 @@
1
+ require 'nineflats-api/requests'
2
+ module Nineflats
3
+ class Client < Base
4
+ # API_BASE_URI = "api.9flats.com/api/v1"
5
+ # API_BASE_URI = "http://localhost.com:3000/api/v1"
6
+ # WEB_BASE_URI = "http://www.9flats.com"
7
+ WEB_BASE_URI = "http://localhost.com:3000"
8
+
9
+ attr_accessor :request_token
10
+ attr_accessor :access_token
11
+ attr_reader :consumer
12
+
13
+ include Requests
14
+
15
+ def self.connect(api_key, api_secret, options={})
16
+ @@client = Client.new(api_key, api_secret, options)
17
+ if block_given?
18
+ yield @@client
19
+ end
20
+ @@client
21
+ end
22
+
23
+ def self.client
24
+ @@client
25
+ end
26
+
27
+ def self.consumer
28
+ @@client.consumer
29
+ end
30
+
31
+ def request_token(callback_url)
32
+ @consumer.get_request_token({:oauth_callback => callback_url})
33
+ end
34
+
35
+ def exchange_access_token(request_token, verifier)
36
+ request_token.get_access_token(:oauth_verifier => verifier)
37
+ end
38
+
39
+ private
40
+
41
+ def initialize(api_key, api_secret, options={})
42
+ @consumer = ::OAuth::Consumer.new(api_key, api_secret, {
43
+ :site => WEB_BASE_URI,
44
+ :scheme => :header,
45
+ :http_method => :post
46
+ })
47
+ @access_token = options[:access_token]
48
+ # Client.default_options[:simple_oauth] = { :consumer => @consumer, :method => 'HMAC-SHA1' }.merge(options)
49
+ end
50
+
51
+ end
52
+ end
@@ -0,0 +1,48 @@
1
+ module Nineflats
2
+ module QueryStringNormalizer
3
+ def self.normalize(query)
4
+ Array(query).map do |key, value|
5
+ if value.nil?
6
+ key.to_s
7
+ elsif value.is_a?(Array)
8
+ value.map {|v| "#{key}=#{URI.encode(v.to_s, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))}"}
9
+ else
10
+ HashConversions.to_params(key => value)
11
+ end
12
+ end.flatten.sort.join('&')
13
+ end
14
+ end
15
+
16
+ module HashConversions
17
+ def self.to_params(hash)
18
+ params = hash.map { |k,v| normalize_param(k,v) }.join
19
+ params.chop! # trailing &
20
+ params
21
+ end
22
+
23
+ def self.normalize_param(key, value)
24
+ param = ''
25
+ stack = []
26
+
27
+ if value.is_a?(Array)
28
+ param << value.map { |element| normalize_param("#{key}[]", element) }.join
29
+ elsif value.is_a?(Hash)
30
+ stack << [key,value]
31
+ else
32
+ param << "#{key}=#{URI.encode(value.to_s, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))}&"
33
+ end
34
+
35
+ stack.each do |parent, hash|
36
+ hash.each do |key, value|
37
+ if value.is_a?(Hash)
38
+ stack << ["#{parent}[#{key}]", value]
39
+ else
40
+ param << normalize_param("#{parent}[#{key}]", value)
41
+ end
42
+ end
43
+ end
44
+
45
+ param
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,19 @@
1
+ module Nineflats
2
+ module Requests
3
+ def self.included(base)
4
+ base.extend(ClassMethods)
5
+ end
6
+
7
+ module ClassMethods
8
+ def bookings(user_id)
9
+ params = {:client_id => consumer.key}
10
+ if client.access_token
11
+ response = client.access_token.request(:get, "/api/v1/users/#{user_id}/bookings?#{Nineflats::QueryStringNormalizer.normalize(params)}")
12
+ JSON.parse(response.body)
13
+ else
14
+ raise "So what?"
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -29,6 +29,10 @@ module Nineflats
29
29
  end
30
30
  end
31
31
 
32
+ def self.bookings(user_id)
33
+ Client.bookings(user_id)
34
+ end
35
+
32
36
  def self.fetch(slug)
33
37
  User.new(Helpers.get_data(User.api_call(slug)))
34
38
  end
@@ -1,5 +1,5 @@
1
1
  module Nineflats
2
2
  module Api
3
- VERSION = "0.0.4"
3
+ VERSION = "0.0.5"
4
4
  end
5
5
  end
@@ -5,7 +5,7 @@ require "nineflats-api/version"
5
5
  Gem::Specification.new do |s|
6
6
  s.name = "nineflats-api"
7
7
  s.version = Nineflats::Api::VERSION
8
- s.authors = ["Lena Herrmann"]
8
+ s.authors = ["Lena Herrmann", "Thorsten Böttger"]
9
9
  s.email = ["lena@zeromail.org"]
10
10
  s.homepage = "http://9flats.github.com/api_docs/index.html"
11
11
  s.summary = %q{9flats API}
@@ -17,6 +17,7 @@ Gem::Specification.new do |s|
17
17
 
18
18
  s.require_paths = ["lib"]
19
19
 
20
+ s.add_runtime_dependency('oauth')
20
21
  s.add_development_dependency('rake', '~> 0.9.0')
21
22
  s.add_development_dependency('rspec')
22
23
  s.add_development_dependency('fakeweb')
metadata CHANGED
@@ -1,19 +1,32 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nineflats-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Lena Herrmann
9
+ - Thorsten Böttger
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2011-10-17 00:00:00.000000000Z
13
+ date: 2011-11-02 00:00:00.000000000 +01:00
14
+ default_executable:
13
15
  dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: oauth
18
+ requirement: &2152240100 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ! '>='
22
+ - !ruby/object:Gem::Version
23
+ version: '0'
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: *2152240100
14
27
  - !ruby/object:Gem::Dependency
15
28
  name: rake
16
- requirement: &2156944720 !ruby/object:Gem::Requirement
29
+ requirement: &2152239300 !ruby/object:Gem::Requirement
17
30
  none: false
18
31
  requirements:
19
32
  - - ~>
@@ -21,10 +34,10 @@ dependencies:
21
34
  version: 0.9.0
22
35
  type: :development
23
36
  prerelease: false
24
- version_requirements: *2156944720
37
+ version_requirements: *2152239300
25
38
  - !ruby/object:Gem::Dependency
26
39
  name: rspec
27
- requirement: &2156943460 !ruby/object:Gem::Requirement
40
+ requirement: &2152238760 !ruby/object:Gem::Requirement
28
41
  none: false
29
42
  requirements:
30
43
  - - ! '>='
@@ -32,10 +45,10 @@ dependencies:
32
45
  version: '0'
33
46
  type: :development
34
47
  prerelease: false
35
- version_requirements: *2156943460
48
+ version_requirements: *2152238760
36
49
  - !ruby/object:Gem::Dependency
37
50
  name: fakeweb
38
- requirement: &2156942040 !ruby/object:Gem::Requirement
51
+ requirement: &2152238080 !ruby/object:Gem::Requirement
39
52
  none: false
40
53
  requirements:
41
54
  - - ! '>='
@@ -43,7 +56,7 @@ dependencies:
43
56
  version: '0'
44
57
  type: :development
45
58
  prerelease: false
46
- version_requirements: *2156942040
59
+ version_requirements: *2152238080
47
60
  description: Let's you use the 9flats API'
48
61
  email:
49
62
  - lena@zeromail.org
@@ -59,11 +72,14 @@ files:
59
72
  - lib/nineflats-api.rb
60
73
  - lib/nineflats-api/base.rb
61
74
  - lib/nineflats-api/calendar.rb
75
+ - lib/nineflats-api/client.rb
62
76
  - lib/nineflats-api/helpers.rb
63
77
  - lib/nineflats-api/paginated_array.rb
64
78
  - lib/nineflats-api/photo.rb
65
79
  - lib/nineflats-api/place.rb
66
80
  - lib/nineflats-api/prices.rb
81
+ - lib/nineflats-api/query_string_normalizer.rb
82
+ - lib/nineflats-api/requests.rb
67
83
  - lib/nineflats-api/review.rb
68
84
  - lib/nineflats-api/season.rb
69
85
  - lib/nineflats-api/user.rb
@@ -86,6 +102,7 @@ files:
86
102
  - spec/search_spec.rb
87
103
  - spec/spec_helper.rb
88
104
  - spec/user_spec.rb
105
+ has_rdoc: true
89
106
  homepage: http://9flats.github.com/api_docs/index.html
90
107
  licenses: []
91
108
  post_install_message:
@@ -100,7 +117,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
100
117
  version: '0'
101
118
  segments:
102
119
  - 0
103
- hash: -743916347208877967
120
+ hash: -3354025967072406112
104
121
  required_rubygems_version: !ruby/object:Gem::Requirement
105
122
  none: false
106
123
  requirements:
@@ -109,10 +126,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
109
126
  version: '0'
110
127
  segments:
111
128
  - 0
112
- hash: -743916347208877967
129
+ hash: -3354025967072406112
113
130
  requirements: []
114
131
  rubyforge_project:
115
- rubygems_version: 1.8.10
132
+ rubygems_version: 1.6.2
116
133
  signing_key:
117
134
  specification_version: 3
118
135
  summary: 9flats API