croudia 0.0.2 → 1.0.0

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 (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