GooglePlus 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.
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
+