GooglePlus 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/.document +5 -0
  2. data/Gemfile +23 -0
  3. data/Gemfile.lock +56 -0
  4. data/LICENSE.txt +20 -0
  5. data/README.rdoc +19 -0
  6. data/Rakefile +46 -0
  7. data/VERSION +1 -0
  8. data/lib/GooglePlus.rb +26 -0
  9. data/lib/google_plus/api.rb +27 -0
  10. data/lib/google_plus/authenticatable.rb +25 -0
  11. data/lib/google_plus/base.rb +39 -0
  12. data/lib/google_plus/client.rb +29 -0
  13. data/lib/google_plus/client/activity.rb +10 -0
  14. data/lib/google_plus/client/comments.rb +10 -0
  15. data/lib/google_plus/client/users.rb +22 -0
  16. data/lib/google_plus/config.rb +103 -0
  17. data/lib/google_plus/configuration.rb +21 -0
  18. data/lib/google_plus/connection.rb +44 -0
  19. data/lib/google_plus/core_ext/hash.rb +66 -0
  20. data/lib/google_plus/creatable.rb +15 -0
  21. data/lib/google_plus/cursor.rb +45 -0
  22. data/lib/google_plus/direct_message.rb +28 -0
  23. data/lib/google_plus/error.rb +38 -0
  24. data/lib/google_plus/error/bad_gateway.rb +0 -0
  25. data/lib/google_plus/error/bad_request.rb +0 -0
  26. data/lib/google_plus/error/client_error.rb +8 -0
  27. data/lib/google_plus/error/enhance_your_calm.rb +0 -0
  28. data/lib/google_plus/error/forbidden.rb +8 -0
  29. data/lib/google_plus/error/internal_server_error.rb +0 -0
  30. data/lib/google_plus/error/not_acceptable.rb +0 -0
  31. data/lib/google_plus/error/not_found.rb +0 -0
  32. data/lib/google_plus/error/service_unavailable.rb +0 -0
  33. data/lib/google_plus/error/unauthorized.rb +8 -0
  34. data/lib/google_plus/geo_factory.rb +23 -0
  35. data/lib/google_plus/metadata.rb +8 -0
  36. data/lib/google_plus/request.rb +37 -0
  37. data/lib/google_plus/request/gateway.rb +21 -0
  38. data/lib/google_plus/request/multipart_with_file.rb +38 -0
  39. data/lib/google_plus/request/oauth.rb +27 -0
  40. data/lib/google_plus/request/phoenix.rb +23 -0
  41. data/lib/google_plus/response/parse_json.rb +24 -0
  42. data/lib/google_plus/response/raise_client_error.rb +54 -0
  43. data/lib/google_plus/response/raise_server_error.rb +30 -0
  44. data/lib/google_plus/size.rb +17 -0
  45. data/lib/google_plus/status.rb +87 -0
  46. data/lib/google_plus/user.rb +65 -0
  47. data/lib/google_plus/version.rb +31 -0
  48. data/test/helper.rb +19 -0
  49. data/test/test_GooglePlus.rb +14 -0
  50. metadata +255 -0
@@ -0,0 +1,21 @@
1
+ require 'active_support/core_ext/enumerable'
2
+ require 'google_plus/base'
3
+ require 'google_plus/size'
4
+
5
+ module GooglePlus
6
+ class Configuration < GooglePlus::Base
7
+ lazy_attr_reader :characters_reserved_per_media, :max_media_per_upload,
8
+ :non_username_paths, :photo_size_limit, :short_url_length, :short_url_length_https
9
+
10
+ # Returns an array of photo sizes
11
+ #
12
+ # @return [Array<GooglePlus::Size>]
13
+ def photo_sizes
14
+ @photo_sizes ||= Array(@attrs['photo_sizes']).each_with_object({}) do |(key, value), object|
15
+ object[key] = GooglePlus::Size.new(value)
16
+ end
17
+ end
18
+
19
+ end
20
+ end
21
+
@@ -0,0 +1,44 @@
1
+ require 'faraday'
2
+ require 'google_plus/request/gateway'
3
+ require 'google_plus/request/multipart_with_file'
4
+ require 'google_plus/request/phoenix'
5
+ require 'google_plus/request/oauth'
6
+ require 'google_plus/response/parse_json'
7
+ require 'google_plus/response/raise_client_error'
8
+ require 'google_plus/response/raise_server_error'
9
+
10
+ module GooglePlus
11
+ module Connection
12
+ private
13
+
14
+ # Returns a Faraday::Connection object
15
+ #
16
+ # @return [Faraday::Connection]
17
+ def connection(options={})
18
+ merged_options = connection_options.merge({
19
+ :headers => {
20
+ :accept => 'application/json',
21
+ :user_agent => user_agent,
22
+ },
23
+ :proxy => proxy,
24
+ :ssl => {:verify => false},
25
+ :url => options.fetch(:endpoint, api_endpoint),
26
+ })
27
+
28
+ Faraday.new(merged_options) do |builder|
29
+ builder.use GooglePlus::Request::Phoenix if options[:phoenix]
30
+ builder.use GooglePlus::Request::MultipartWithFile
31
+ builder.use GooglePlus::Request::GooglePlusOAuth, credentials if credentials?
32
+ builder.use Faraday::Request::Multipart
33
+ builder.use Faraday::Request::UrlEncoded
34
+ builder.use GooglePlus::Request::Gateway, gateway if gateway
35
+ builder.use GooglePlus::Response::RaiseClientError
36
+ builder.use GooglePlus::Response::ParseJson unless options[:raw]
37
+ builder.use GooglePlus::Response::RaiseServerError
38
+ builder.adapter(adapter)
39
+ end
40
+ end
41
+
42
+ end
43
+ end
44
+
@@ -0,0 +1,66 @@
1
+ class Hash
2
+
3
+ # Take a single user ID or screen name and merge it into the hash with the correct key
4
+ #
5
+ # @param user_id_or_screen_name [Integer, String] A Twitter user ID or screen_name.
6
+ # @return [Hash]
7
+ def merge_user!(user_id_or_screen_name)
8
+ case user_id_or_screen_name
9
+ when Integer
10
+ self[:user_id] = user_id_or_screen_name
11
+ when String
12
+ self[:screen_name] = user_id_or_screen_name
13
+ end
14
+ self
15
+ end
16
+
17
+ # Take a multiple user IDs and screen names and merge them into the hash with the correct keys
18
+ #
19
+ # @param users_id_or_screen_names [Array] An array of Twitter user IDs or screen_names.
20
+ # @return [Hash]
21
+ def merge_users!(user_ids_or_screen_names)
22
+ user_ids, screen_names = [], []
23
+ user_ids_or_screen_names.flatten.each do |user_id_or_screen_name|
24
+ case user_id_or_screen_name
25
+ when Integer
26
+ user_ids << user_id_or_screen_name
27
+ when String
28
+ screen_names << user_id_or_screen_name
29
+ end
30
+ end
31
+ self[:user_id] = user_ids.join(',') unless user_ids.empty?
32
+ self[:screen_name] = screen_names.join(',') unless screen_names.empty?
33
+ self
34
+ end
35
+
36
+ # Take a single owner ID or owner screen name and merge it into the hash with the correct key
37
+ # (for Twitter API endpoints that want :owner_id and :owner_screen_name)
38
+ #
39
+ # @param owner_id_or_owner_screen_name [Integer, String] A Twitter user ID or screen_name.
40
+ # @return [Hash]
41
+ def merge_owner!(owner_id_or_owner_screen_name)
42
+ case owner_id_or_owner_screen_name
43
+ when Integer
44
+ self[:owner_id] = owner_id_or_owner_screen_name
45
+ when String
46
+ self[:owner_screen_name] = owner_id_or_owner_screen_name
47
+ end
48
+ self
49
+ end
50
+
51
+ # Take a single list ID or slug and merge it into the hash with the correct key
52
+ #
53
+ # @param list_id_or_slug [Integer, String] A Twitter list ID or slug.
54
+ # @return [Hash]
55
+ def merge_list!(list_id_or_screen_name)
56
+ case list_id_or_screen_name
57
+ when Integer
58
+ self[:list_id] = list_id_or_screen_name
59
+ when String
60
+ self[:slug] = list_id_or_screen_name
61
+ end
62
+ self
63
+ end
64
+
65
+ end
66
+
@@ -0,0 +1,15 @@
1
+ require 'time'
2
+
3
+ module GooglePlus
4
+ module Creatable
5
+
6
+ # Time when the object was created on GooglePlus
7
+ #
8
+ # @return [Time]
9
+ def created_at
10
+ @created_at ||= Time.parse(@attrs['created_at']) unless @attrs['created_at'].nil?
11
+ end
12
+
13
+ end
14
+ end
15
+
@@ -0,0 +1,45 @@
1
+ require 'active_support/core_ext/kernel/singleton_class'
2
+ require 'google_plus/base'
3
+
4
+ module GooglePlus
5
+ class Cursor < GooglePlus::Base
6
+ attr_reader :collection
7
+ lazy_attr_reader :next_cursor, :previous_cursor
8
+ alias :next :next_cursor
9
+ alias :previous :previous_cursor
10
+
11
+ # Initializes a new Cursor object
12
+ #
13
+ # @param attrs [Hash]
14
+ # @params method [String, Symbol] The name of the method to return the collection
15
+ # @params klass [Class] The class to instantiate object in the collection
16
+ # @return [GooglePlus::Cursor]
17
+ def initialize(attrs, method, klass=nil)
18
+ super(attrs)
19
+ @collection = Array(attrs[method.to_s]).map do |item|
20
+ if klass
21
+ klass.new(item)
22
+ else
23
+ item
24
+ end
25
+ end
26
+ singleton_class.class_eval do
27
+ alias_method method.to_sym, :collection
28
+ end
29
+ end
30
+
31
+ # @return [Boolean]
32
+ def first?
33
+ previous_cursor.zero?
34
+ end
35
+ alias :first :first?
36
+
37
+ # @return [Boolean]
38
+ def last?
39
+ next_cursor.zero?
40
+ end
41
+ alias :last :last?
42
+
43
+ end
44
+ end
45
+
@@ -0,0 +1,28 @@
1
+ require 'google_plus/base'
2
+ #require 'google_plus/creatable'
3
+ #require 'google_plus/user'
4
+
5
+ module GooglePlus
6
+ class DirectMessage < GooglePlus::Base
7
+ include GooglePlus::Creatable
8
+ lazy_attr_reader :id, :text
9
+
10
+ # @param other [Twiter::DirectMessage]
11
+ # @return [Boolean]
12
+ def ==(other)
13
+ super || (other.class == self.class && other.id == self.id)
14
+ end
15
+
16
+ # @return [GooglePlus::User]
17
+ def recipient
18
+ @recipient ||= GooglePlus::User.new(@attrs['recipient']) unless @attrs['recipient'].nil?
19
+ end
20
+
21
+ # @return [GooglePlus::User]
22
+ def sender
23
+ @sender ||= GooglePlus::User.new(@attrs['sender']) unless @attrs['sender'].nil?
24
+ end
25
+
26
+ end
27
+ end
28
+
@@ -0,0 +1,38 @@
1
+ module GooglePlus
2
+ # Custom error class for rescuing from all GooglePlus errors
3
+ class Error < StandardError
4
+ attr_reader :http_headers
5
+
6
+ # Initializes a new Error object
7
+ #
8
+ # @param message [String]
9
+ # @param http_headers [Hash]
10
+ # @return [Twitter::Error]
11
+ def initialize(message, http_headers)
12
+ @http_headers = Hash[http_headers]
13
+ super(message)
14
+ end
15
+
16
+ # @return [Time]
17
+ def ratelimit_reset
18
+ Time.at(@http_headers.values_at('x-ratelimit-reset', 'X-RateLimit-Reset').detect{|value| value}.to_i)
19
+ end
20
+
21
+ # @return [Integer]
22
+ def ratelimit_limit
23
+ @http_headers.values_at('x-ratelimit-limit', 'X-RateLimit-Limit').detect{|value| value}.to_i
24
+ end
25
+
26
+ # @return [Integer]
27
+ def ratelimit_remaining
28
+ @http_headers.values_at('x-ratelimit-remaining', 'X-RateLimit-Remaining').detect{|value| value}.to_i
29
+ end
30
+
31
+ # @return [Integer]
32
+ def retry_after
33
+ [(ratelimit_reset - Time.now).ceil, 0].max
34
+ end
35
+
36
+ end
37
+ end
38
+
File without changes
File without changes
@@ -0,0 +1,8 @@
1
+ require 'google_plus/error'
2
+
3
+ module GooglePlus
4
+ # Raised when GooglePlus returns a 4xx HTTP status code
5
+ class Error::ClientError < GooglePlus::Error
6
+ end
7
+ end
8
+
File without changes
@@ -0,0 +1,8 @@
1
+ require 'google_plus/error/client_error'
2
+
3
+ module GooglePlus
4
+ # Raised when Twitter returns the HTTP status code 403
5
+ class Error::Forbidden < GooglePlus::Error::ClientError
6
+ end
7
+ end
8
+
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,8 @@
1
+ require 'google_plus/error/client_error'
2
+
3
+ module GooglePlus
4
+ # Raised when GooglePlus returns the HTTP status code 401
5
+ class Error::Unauthorized < GooglePlus::Error::ClientError
6
+ end
7
+ end
8
+
@@ -0,0 +1,23 @@
1
+ require 'google_plus/point'
2
+ require 'google_plus/polygon'
3
+
4
+ module GooglePlus
5
+ class GeoFactory
6
+
7
+ # Instantiates a new geo object
8
+ #
9
+ # @param attrs [Hash]
10
+ # @raise [ArgumentError] Error raised when supplied argument is missing a type key.
11
+ # @return [GooglePlus::Point, GooglePlus::Polygon]
12
+ def self.new(geo={})
13
+ type = geo['type']
14
+ if type
15
+ GooglePlus.const_get(type.capitalize.to_sym).new(geo)
16
+ else
17
+ raise ArgumentError, "argument must have a type key"
18
+ end
19
+ end
20
+
21
+ end
22
+ end
23
+
@@ -0,0 +1,8 @@
1
+ require 'google_plus/base'
2
+
3
+ module GooglePlus
4
+ class Metadata < GooglePlus::Base
5
+ lazy_attr_reader :result_type
6
+ end
7
+ end
8
+
@@ -0,0 +1,37 @@
1
+ module GooglePlus
2
+ # Defines HTTP request methods
3
+ module Request
4
+ # Perform an HTTP DELETE request
5
+ def delete(path, params={}, options={})
6
+ request(:delete, path, params, options)
7
+ end
8
+
9
+ # Perform an HTTP GET request
10
+ def get(path, params={}, options={})
11
+ request(:get, path, params, options)
12
+ end
13
+
14
+ # Perform an HTTP POST request
15
+ def post(path, params={}, options={})
16
+ request(:post, path, params, options)
17
+ end
18
+
19
+ private
20
+
21
+ # Perform an HTTP request
22
+ def request(method, path, params, options)
23
+ response = connection(options).send(method) do |request|
24
+ case method.to_sym
25
+ when :delete, :get
26
+ request.url(path, params)
27
+ when :post
28
+ request.path = path
29
+ request.body = params unless params.empty?
30
+ end
31
+ end
32
+ options[:raw] ? response : response.body
33
+ end
34
+
35
+ end
36
+ end
37
+
@@ -0,0 +1,21 @@
1
+ require 'faraday'
2
+
3
+ module GooglePlus
4
+ module Request
5
+ class Gateway < Faraday::Middleware
6
+
7
+ def call(env)
8
+ url = env[:url].dup
9
+ url.host = @gateway
10
+ env[:url] = url
11
+ @app.call(env)
12
+ end
13
+
14
+ def initialize(app, gateway)
15
+ @app, @gateway = app, gateway
16
+ end
17
+
18
+ end
19
+ end
20
+ end
21
+
@@ -0,0 +1,38 @@
1
+ require 'faraday'
2
+
3
+ module GooglePlus
4
+ module Request
5
+ class MultipartWithFile < Faraday::Middleware
6
+
7
+ def call(env)
8
+ if env[:body].is_a?(Hash)
9
+ env[:body].each do |key, value|
10
+ if value.is_a?(File)
11
+ env[:body][key] = Faraday::UploadIO.new(value, mime_type(value.path), value.path)
12
+ elsif value.is_a?(Hash) && (value['io'].is_a?(IO) || value['io'].is_a?(StringIO))
13
+ env[:body][key] = Faraday::UploadIO.new(value['io'], mime_type('.'+value['type']), '')
14
+ end
15
+ end
16
+ end
17
+ @app.call(env)
18
+ end
19
+
20
+ private
21
+
22
+ def mime_type(path)
23
+ case path
24
+ when /\.jpe?g/i
25
+ 'image/jpeg'
26
+ when /\.gif$/i
27
+ 'image/gif'
28
+ when /\.png$/i
29
+ 'image/png'
30
+ else
31
+ 'application/octet-stream'
32
+ end
33
+ end
34
+
35
+ end
36
+ end
37
+ end
38
+