croudia 0.0.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +2 -0
  3. data/README.md +31 -14
  4. data/Rakefile +11 -11
  5. data/croudia.gemspec +10 -8
  6. data/lib/croudia/api/favorites.rb +43 -0
  7. data/lib/croudia/api/oauth.rb +32 -0
  8. data/lib/croudia/api/statuses.rb +55 -0
  9. data/lib/croudia/api/timelines.rb +57 -0
  10. data/lib/croudia/base.rb +44 -0
  11. data/lib/croudia/client.rb +64 -0
  12. data/lib/croudia/configurable.rb +39 -0
  13. data/lib/croudia/creatable.rb +9 -0
  14. data/lib/croudia/default.rb +63 -0
  15. data/lib/croudia/ext/openssl.rb +19 -0
  16. data/lib/croudia/identity.rb +22 -39
  17. data/lib/croudia/status.rb +26 -0
  18. data/lib/croudia/user.rb +12 -43
  19. data/lib/croudia/version.rb +1 -1
  20. data/lib/croudia.rb +21 -12
  21. data/spec/croudia/api/favorites_spec.rb +35 -0
  22. data/spec/croudia/api/oauth_spec.rb +53 -0
  23. data/spec/croudia/api/statuses_spec.rb +73 -0
  24. data/spec/croudia/api/timelines_spec.rb +93 -0
  25. data/spec/croudia/base_spec.rb +27 -0
  26. data/spec/croudia/client_spec.rb +115 -0
  27. data/spec/croudia/identity_spec.rb +29 -65
  28. data/spec/croudia/status_spec.rb +30 -0
  29. data/spec/croudia/user_spec.rb +30 -43
  30. data/spec/croudia_spec.rb +48 -49
  31. data/spec/fixtures/access_token.json +6 -0
  32. data/spec/fixtures/status.json +1 -0
  33. data/spec/fixtures/timeline.json +1 -0
  34. data/spec/helper.rb +49 -32
  35. metadata +80 -84
  36. data/lib/croudia/api.rb +0 -5
  37. data/lib/croudia/error.rb +0 -5
  38. data/lib/croudia/scraper/friendships.rb +0 -72
  39. data/lib/croudia/scraper/login.rb +0 -42
  40. data/lib/croudia/scraper/parser/users.rb +0 -59
  41. data/lib/croudia/scraper/parser/voices.rb +0 -32
  42. data/lib/croudia/scraper/parser.rb +0 -13
  43. data/lib/croudia/scraper/users.rb +0 -20
  44. data/lib/croudia/scraper/voices.rb +0 -59
  45. data/lib/croudia/scraper.rb +0 -63
  46. data/lib/croudia/voice.rb +0 -21
  47. data/spec/croudia/api_spec.rb +0 -7
  48. data/spec/croudia/error_spec.rb +0 -13
  49. data/spec/croudia/scraper/friendships_spec.rb +0 -115
  50. data/spec/croudia/scraper/login_spec.rb +0 -137
  51. data/spec/croudia/scraper/parser/users_spec.rb +0 -292
  52. data/spec/croudia/scraper/parser/voices_spec.rb +0 -119
  53. data/spec/croudia/scraper/users_spec.rb +0 -78
  54. data/spec/croudia/scraper/voices_spec.rb +0 -178
  55. data/spec/croudia/scraper_spec.rb +0 -120
  56. data/spec/croudia/version_spec.rb +0 -7
  57. data/spec/croudia/voice_spec.rb +0 -16
  58. data/spec/fixtures/follow_request.html +0 -69
  59. data/spec/fixtures/follower_wktk.html +0 -89
  60. data/spec/fixtures/following_wktk.html +0 -89
  61. data/spec/fixtures/user_wktk1.html +0 -72
  62. data/spec/fixtures/user_wktk2.html +0 -75
  63. data/spec/fixtures/user_wktk3.html +0 -83
  64. data/spec/fixtures/voices_reply_list.html +0 -55
  65. data/spec/fixtures/voices_timeline.html +0 -60
  66. data/spec/fixtures/voices_written.html +0 -20
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fb3a0686cfdaa7c6f90d6e512c28a40f6367a6cb
4
+ data.tar.gz: 8350f383e5f846169b696c6653afd805f6498c16
5
+ SHA512:
6
+ metadata.gz: 1fe3050abdbbd48263071db6435d669386ee2b846739d07db79498525653934aeaff6d24b3aa9ec95b089773affbad8cd0150af9002882fda7b2372a8d577372
7
+ data.tar.gz: f2f081a62a57f4e20267c9d141eac2138ecc95067240b88466d6b5584ce65ed3c7bdb252c1d70ccd00a0587c424ca9b88767e5e4e35955f3ffb13dd40adb36f6
data/.gitignore CHANGED
@@ -2,6 +2,7 @@
2
2
  *.rbc
3
3
  .bundle
4
4
  .config
5
+ .env
5
6
  .yardoc
6
7
  Gemfile.lock
7
8
  InstalledFiles
@@ -15,3 +16,4 @@ spec/reports
15
16
  test/tmp
16
17
  test/version_tmp
17
18
  tmp
19
+ vendor/bundle
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Croudia
2
2
 
3
- A Mechanize-based scraper for [Croudia](https://croudia.com)
3
+ A Ruby Wapper for the [Croudia](https://croudia.com) API
4
4
 
5
5
  ## Installation
6
6
 
@@ -18,24 +18,41 @@ Or install it yourself as:
18
18
 
19
19
  ## Usage
20
20
 
21
- ```ruby
22
- require 'croudia'
21
+ ### Getting an access token
23
22
 
24
- # Create a new instance
25
- croudia = Croudia.new('username', 'password')
23
+ ``` ruby
24
+ require "croudia"
26
25
 
27
- # Same as above
28
- croudia = Croudia.new
29
- croudia.login('username', 'password')
26
+ # Initialize a new instance
27
+ croudia = Croudia::Client.new(
28
+ client_id: "client_id",
29
+ client_secret: "client_secret"
30
+ )
30
31
 
31
- # Update status
32
- croudia.update('Hello!')
32
+ # Get URL
33
+ url = croudia.authorize_url
33
34
 
34
- # Follow @wktk
35
- croudia.follow('wktk')
35
+ # Or add scope query in URL
36
+ url = croudia.authrorize_url(scope: "scope_value")
36
37
 
37
- # Get the home timeline
38
- croudia.timeline
38
+ # Retrieve an access token
39
+ access_token = croudia.get_access_token("code param returned by user")
40
+ #=> { "access_token" => " ... ", "refresh_token" => " ... ", ... }
41
+ ```
42
+
43
+ ### Using the API
44
+
45
+ ``` ruby
46
+ require "croudia"
47
+
48
+ # Create an instance
49
+ croudia = Croudia::Client.new(access_token: "access_token")
50
+
51
+ # Get home_timeline
52
+ home_timeline = croudia.home_timeline
53
+
54
+ # Post a status
55
+ posted_status = croudia.update("Hello!")
39
56
  ```
40
57
 
41
58
  ## Contributing
data/Rakefile CHANGED
@@ -1,11 +1,11 @@
1
- #!/usr/bin/env rake
2
-
3
- require 'bundler/gem_tasks'
4
- require 'rspec/core/rake_task'
5
-
6
- RSpec::Core::RakeTask.new(:spec) do |spec|
7
- spec.pattern = 'spec/**/*_spec.rb'
8
- spec.rspec_opts = ['-cfs']
9
- end
10
-
11
- task :default => :spec
1
+ #!/usr/bin/env rake
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
5
+
6
+ RSpec::Core::RakeTask.new(:spec) do |spec|
7
+ spec.pattern = 'spec/**/*_spec.rb'
8
+ spec.rspec_opts = ['-cfs']
9
+ end
10
+
11
+ task :default => :spec
data/croudia.gemspec CHANGED
@@ -3,9 +3,9 @@ require File.expand_path('../lib/croudia/version', __FILE__)
3
3
 
4
4
  Gem::Specification.new do |gem|
5
5
  gem.authors = ['wktk']
6
- gem.email = ['wktk@wktk.in']
7
- gem.description = 'A Mechanize-based scraper for Croudia'
8
- gem.summary = 'Croudia scraper'
6
+ gem.email = ['mail@wktk.jp']
7
+ gem.description = 'Ruby Wrapper for the Croudia API'
8
+ gem.summary = 'Croudia API'
9
9
  gem.homepage = 'https://github.com/wktk/croudia-gem'
10
10
 
11
11
  gem.files = `git ls-files`.split($\)
@@ -15,9 +15,11 @@ Gem::Specification.new do |gem|
15
15
  gem.require_paths = ['lib']
16
16
  gem.version = Croudia::VERSION
17
17
 
18
- gem.add_dependency 'mechanize', '~> 2.5.1'
19
- gem.add_development_dependency 'rake', '~> 0.9.2.2'
20
- gem.add_development_dependency 'rdoc', '~> 3.12'
21
- gem.add_development_dependency 'rspec', '~> 2.12.0'
22
- gem.add_development_dependency 'webmock', '~> 1.8.7'
18
+ gem.add_dependency 'faraday', '~> 0.8.7'
19
+ gem.add_dependency 'faraday_middleware', '~> 0.9.0'
20
+ gem.add_dependency 'hashie', '~> 2.0.5'
21
+ gem.add_development_dependency 'rake', '~> 10.1.0'
22
+ gem.add_development_dependency 'rdoc', '~> 4.0.1'
23
+ gem.add_development_dependency 'rspec', '~> 2.14.0'
24
+ gem.add_development_dependency 'webmock', '~> 1.13.0'
23
25
  end
@@ -0,0 +1,43 @@
1
+ require 'croudia/status'
2
+
3
+ module Croudia
4
+ module API
5
+ module Favorites
6
+ # Favorite a status
7
+ #
8
+ # @param status_id [String, Integer, Croudia::Status]
9
+ # @param params [Hash]
10
+ # @return [Croudia::Status] Favorited status
11
+ def favorite(status_id, params={})
12
+ case status_id
13
+ when String, Integer
14
+ when Croudia::Status
15
+ status_id = status_id.id_str
16
+ else
17
+ raise ArgumentError, 'status_id is invalid'
18
+ end
19
+
20
+ resp = post("/favorites/create/#{status_id}.json", params)
21
+ Croudia::Status.new(resp)
22
+ end
23
+
24
+ # Unfavorite a status
25
+ #
26
+ # @param status_id [String, Integer, Croudia::Status]
27
+ # @param params [Hash]
28
+ # @return [Croudia::Status] Unfavorited status
29
+ def unfavorite(status_id, params={})
30
+ case status_id
31
+ when String, Integer
32
+ when Croudia::Status
33
+ status_id = status_id.id_str
34
+ else
35
+ raise ArgumentError, 'status_id is invalid'
36
+ end
37
+
38
+ resp = delete("/favorites/destroy/#{status_id}.json", params)
39
+ Croudia::Status.new(resp)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,32 @@
1
+ module Croudia
2
+ module API
3
+ module OAuth
4
+ # Authorize URL
5
+ #
6
+ # @return authorize_url [String]
7
+ def authorize_url(params={})
8
+ params[:client_id] ||= @client_id
9
+ params[:response_type] ||= 'code'
10
+ connection.build_url('/oauth/authorize', params).to_s.sub(/^https/, 'http')
11
+ end
12
+
13
+ # Retrieve access_token
14
+ #
15
+ # @param code [String] Authorize code passed from user
16
+ # @params params [Hash] Additional params
17
+ # @return access_token [Hash]
18
+ def get_access_token(code, params={})
19
+ case code
20
+ when String, Integer
21
+ params[:code] ||= code
22
+ when Hash
23
+ params = code.merge(params)
24
+ end
25
+ params[:client_id] ||= @client_id
26
+ params[:client_secret] ||= @client_secret
27
+ params[:grant_type] ||= 'authorization_code'
28
+ post('/oauth/token', params)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,55 @@
1
+ require 'croudia/status'
2
+
3
+ module Croudia
4
+ module API
5
+ module Statuses
6
+ # Update status
7
+ #
8
+ # @param status [String] Status text
9
+ # @param params [Hash] Additional params
10
+ # @return status [Croudia::Status] Posted status
11
+ def update(status, params={})
12
+ case status
13
+ when String
14
+ params[:status] ||= status
15
+ when Hash
16
+ params = status.merge(params)
17
+ end
18
+
19
+ resp = post('/statuses/update.json', params)
20
+ Croudia::Status.new(resp)
21
+ end
22
+
23
+ # Destroy a status
24
+ #
25
+ # @param status_id [String, Integer, Croudia::Status] Status to delete
26
+ # @param params [Hash]
27
+ # @return [Croudia::Status] Deleted status
28
+ def destroy_status(status_id, params={})
29
+ case status_id
30
+ when String, Integer
31
+ when Croudia::Status
32
+ status_id = status_id.id_str
33
+ end
34
+
35
+ post("/statuses/destroy/#{status_id}.json", params)
36
+ end
37
+
38
+ # Retrieve a status
39
+ #
40
+ # @param status_id [String, Integer, Croudia::Status]
41
+ # @param params [Hash]
42
+ # @return [Croudia::Status]
43
+ def status(status_id, params={})
44
+ case status_id
45
+ when String, Integer
46
+ when Croudia::Status
47
+ status_id = status_id.id_str
48
+ end
49
+
50
+ resp = get("/statuses/show/#{status_id}.json", params)
51
+ Croudia::Status.new(resp)
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,57 @@
1
+ require 'croudia/status'
2
+
3
+ module Croudia
4
+ module API
5
+ module Timelines
6
+ # Public Timeline
7
+ #
8
+ # @param params [Hash] Additional params
9
+ # @return [Array<Croudia::Status>]
10
+ def public_timeline(params={})
11
+ resp = get('/statuses/public_timeline.json', params)
12
+ objectify_statuses(resp)
13
+ end
14
+
15
+ # Home Timeline
16
+ #
17
+ # @params params [Hash]
18
+ # @return [Array<Croudia::Status>]
19
+ def home_timeline(params={})
20
+ resp = get('/statuses/home_timeline.json', params)
21
+ objectify_statuses(resp)
22
+ end
23
+
24
+ # User Timeline
25
+ #
26
+ # @param user [String, Integer, Croudia::User]
27
+ # @param params [Hash]
28
+ # @return [Array<Croudia::Status>
29
+ def user_timeline(user, params={})
30
+ case user
31
+ when String
32
+ params[:screen_name] ||= user
33
+ when Integer
34
+ params[:user_id] ||= user
35
+ when Croudia::User
36
+ params[:user_id] ||= user.id_str
37
+ when Hash
38
+ params = user.merge(params)
39
+ end
40
+
41
+ resp = get('/statuses/user_timeline.json', params)
42
+ objectify_statuses(resp)
43
+ end
44
+
45
+ def mentions(params={})
46
+ resp = get('/statuses/mentions.json', params)
47
+ objectify_statuses(resp)
48
+ end
49
+ alias mentions_timeline mentions
50
+
51
+ private
52
+ def objectify_statuses(statuses)
53
+ statuses.map { |status| Croudia::Status.new(status) }
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,44 @@
1
+ module Croudia
2
+ class Base
3
+ class << self
4
+ def attr_reader(*attrs)
5
+ mod = Module.new do
6
+ attrs.each do |attr|
7
+ define_method(attr) do
8
+ @attrs[attr.to_sym]
9
+ end
10
+ define_method("#{attr}?") do
11
+ !!@attrs[attr.to_sym]
12
+ end
13
+ end
14
+ end
15
+ const_set(:Attributes, mod)
16
+ include mod
17
+ end
18
+ end
19
+
20
+ # Initialize a new object
21
+ #
22
+ # @param attrs [Hash]
23
+ # @return [Croudia::Base]
24
+ def initialize(attrs = {})
25
+ @attrs = attrs || {}
26
+ end
27
+
28
+ # Fetch an attribute
29
+ #
30
+ # @param name [String, Symobol]
31
+ def [](name)
32
+ __send__(name.to_sym)
33
+ rescue NoMethodError
34
+ nil
35
+ end
36
+
37
+ # @return [Hash]
38
+ def attrs
39
+ @attrs
40
+ end
41
+ alias to_h attrs
42
+ alias to_hash attrs
43
+ end
44
+ end
@@ -0,0 +1,64 @@
1
+ require 'croudia/api/favorites'
2
+ require 'croudia/api/oauth'
3
+ require 'croudia/api/statuses'
4
+ require 'croudia/api/timelines'
5
+ require 'croudia/configurable'
6
+ require 'croudia/ext/openssl'
7
+ require 'croudia/version'
8
+ require 'faraday'
9
+
10
+ module Croudia
11
+ class Client
12
+ include Croudia::API::Favorites
13
+ include Croudia::API::OAuth
14
+ include Croudia::API::Statuses
15
+ include Croudia::API::Timelines
16
+ include Croudia::Configurable
17
+
18
+ # Initialize a new Client object
19
+ #
20
+ # @param options [Hash]
21
+ # @return [Croudia::Client]
22
+ def initialize(options={})
23
+ Croudia::Configurable.keys.each do |key|
24
+ instance_variable_set(:"@#{key}", options[key] || Croudia.instance_variable_get(:"@#{key}"))
25
+ end
26
+ end
27
+
28
+ # Perform an HTTP DELETE request
29
+ def delete(path, params={})
30
+ request(:delete, path, params)
31
+ end
32
+
33
+ # Perform an HTTP GET request
34
+ def get(path, params={})
35
+ request(:get, path, params)
36
+ end
37
+
38
+ # Perform an HTTP POST request
39
+ def post(path, params={})
40
+ request(:post, path, params)
41
+ end
42
+
43
+ # Perform an HTTP PUT request
44
+ def put(path, params={})
45
+ request(:put, path, params)
46
+ end
47
+
48
+ private
49
+
50
+ def request(method, path, params={})
51
+ connection.send(method.to_sym, path, params) do |request|
52
+ request.headers[:authorization] = "Bearer #{@access_token}" if @access_token
53
+ request.headers[:content_type] = 'application/x-www-form-urlencoded; charset=utf-8'
54
+ end.body
55
+ end
56
+
57
+ # Return a Faraday::Connection objet
58
+ #
59
+ # @return [Faraday::Connection]
60
+ def connection
61
+ @connection ||= Faraday.new(@endpoint, @connection_options.merge(builder: @middleware))
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,39 @@
1
+ require 'croudia/default'
2
+
3
+ module Croudia
4
+ module Configurable
5
+ attr_writer :client_secret, :access_token
6
+ attr_accessor :client_id, :endpoint, :connection_options, :middleware
7
+
8
+ class << self
9
+ def keys
10
+ @keys ||= [
11
+ :endpoint,
12
+ :connection_options,
13
+ :middleware,
14
+ :client_id,
15
+ :client_secret,
16
+ :access_token,
17
+ ]
18
+ end
19
+ end
20
+
21
+ def configure
22
+ yield self
23
+ self
24
+ end
25
+
26
+ def reset!
27
+ Croudia::Configurable.keys.each do |key|
28
+ instance_variable_set(:"@#{key}", Croudia::Default.options[key])
29
+ end
30
+ end
31
+ alias setup reset!
32
+
33
+ def options
34
+ Hash[Croudia::Configurable.keys.map do |key|
35
+ [key, instance_variable_get(:"@#{key}")]
36
+ end]
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,9 @@
1
+ require 'time'
2
+
3
+ module Croudia
4
+ module Creatable
5
+ def created_at
6
+ @created_at ||= Time.parse(@attrs[:created_at])
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,63 @@
1
+ require 'faraday'
2
+ require 'faraday_middleware'
3
+ require 'croudia/configurable'
4
+
5
+ module Croudia
6
+ module Default
7
+ ENDPOINT = 'https://api.croudia.com' unless defined? Croudia::Default::ENDPOINT
8
+ CONNECTION_OPTIONS = {
9
+ headers: {
10
+ accept: 'application/json',
11
+ user_agent: "Croudia Ruby Gem/#{Croudia::VERSION}",
12
+ },
13
+ request: {
14
+ open_timeout: 5,
15
+ timeout: 10,
16
+ },
17
+ ssl: {
18
+ verify: true,
19
+ },
20
+ } unless defined? Croudia::Default::CONNECTION_OPTIONS
21
+ MIDDLEWARE = Faraday::Builder.new do |builder|
22
+ builder.request :url_encoded
23
+
24
+ builder.response :mashify
25
+ builder.response :json
26
+ builder.response :raise_error
27
+
28
+ builder.adapter :net_http
29
+ end unless defined? Croudia::Default::MIDDLEWARE
30
+
31
+ class << self
32
+ def options
33
+ Hash[Croudia::Configurable.keys.map do |key|
34
+ [key, __send__(key)]
35
+ end]
36
+ end
37
+
38
+ def client_id
39
+ ENV['CROUDIA_CLIENT_ID']
40
+ end
41
+
42
+ def client_secret
43
+ ENV['CROUDIA_CLIENT_SECRET']
44
+ end
45
+
46
+ def access_token
47
+ ENV['CROUDIA_ACCESS_TOKEN']
48
+ end
49
+
50
+ def endpoint
51
+ ENDPOINT
52
+ end
53
+
54
+ def connection_options
55
+ CONNECTION_OPTIONS
56
+ end
57
+
58
+ def middleware
59
+ MIDDLEWARE
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,19 @@
1
+ require 'openssl'
2
+
3
+ class OpenSSL::SSL::SSLSocket
4
+ # As of writing, https://api.croudia.com returns a valid cert for
5
+ # "croudia.com", but not for "api.croudia.com". When the original check
6
+ # process fails with "api.croudia.com", recheck as "croudia.com" and catch
7
+ # the error if it looks valid.
8
+ alias_method :croudia_original_pcc, :post_connection_check
9
+
10
+ def post_connection_check(hostname)
11
+ croudia_original_pcc(hostname)
12
+ rescue OpenSSL::SSL::SSLError => e
13
+ if hostname == 'api.croudia.com'
14
+ croudia_original_pcc('croudia.com')
15
+ else
16
+ raise e
17
+ end
18
+ end
19
+ end
@@ -1,39 +1,22 @@
1
- module Croudia
2
- class Identity
3
- attr_reader :id, :time
4
- alias id_str id
5
- alias created_at time
6
-
7
- def initialize(attrs)
8
- attrs.keys.each do |key|
9
- if 'time' == key.to_s && !attrs[key].is_a?(Time)
10
- if /^\d+$/ =~ attrs[key]
11
- attrs[key] = Time.at(attrs[key].to_i)
12
- else
13
- attrs[key] = Time.new(*attrs[key].split(/\D/))
14
- end
15
- elsif /_count$/ =~ key.to_s
16
- attrs[key] = attrs[key].to_i
17
- end
18
-
19
- instance_variable_set(:"@#{key}", attrs[key])
20
- end
21
- end
22
-
23
- def ==(other)
24
- super || self.class == other.class && @id == other.id
25
- end
26
-
27
- def [](name)
28
- instance_variable_get(:"@#{name}")
29
- end
30
-
31
- def id
32
- @id
33
- end
34
-
35
- def method_missing(name, *args)
36
- self[name]
37
- end
38
- end
39
- end
1
+ require 'croudia/base'
2
+
3
+ module Croudia
4
+ class Identity < Croudia::Base
5
+ def initialize(*)
6
+ super
7
+ raise ArgumentError, 'argument must have an :id key' unless id
8
+ @attrs[:id_str] = id.to_s
9
+ end
10
+
11
+ # @param other [Croudia::Identity]
12
+ # @return [Boolean]
13
+ def ==(other)
14
+ super || self.class == other.class && id == other.id
15
+ end
16
+
17
+ # @return [Integer]
18
+ def id
19
+ @attrs[:id]
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,26 @@
1
+ require 'croudia/creatable'
2
+ require 'croudia/identity'
3
+ require 'croudia/user'
4
+
5
+ module Croudia
6
+ class Status < Croudia::Identity
7
+ include Croudia::Creatable
8
+
9
+ attr_reader :favorited, :favorite_count,
10
+ :in_reply_to_screen_name, :in_reply_to_status_id_str,
11
+ :in_reply_to_status_id, :in_reply_to_user_id_str,
12
+ :in_reply_to_user_id, :spread_count,
13
+ :play_spread, :play_spread_status, :reply_status, :source,
14
+ :text, :user
15
+
16
+ def initialize(attrs={})
17
+ user = attrs.delete(:user)
18
+ pss = attrs.delete(:play_spread_status)
19
+ reply_status = attrs.delete(:reply_status)
20
+ super(attrs)
21
+ @attrs[:user] = Croudia::User.new(user) if user
22
+ @attrs[:play_spread_status] = Croudia::Status.new(pss) if pss
23
+ @attrs[:reply_status] = Croudia::Status.new(reply_status) if reply_status
24
+ end
25
+ end
26
+ end