twitter4r 0.2.3 → 0.2.4
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.
- data/lib/twitter/core.rb +1 -0
- data/lib/twitter/ext/stdlib.rb +6 -2
- data/lib/twitter/meta.rb +1 -1
- data/lib/twitter/rails.rb +89 -0
- data/lib/twitter/version.rb +1 -1
- data/spec/twitter/client/base_spec.rb +3 -3
- data/spec/twitter/config_spec.rb +2 -2
- data/spec/twitter/meta_spec.rb +1 -1
- data/spec/twitter/rails_spec.rb +110 -0
- metadata +26 -25
- data/spec/spec_helper.rb +0 -133
data/lib/twitter/core.rb
CHANGED
data/lib/twitter/ext/stdlib.rb
CHANGED
@@ -21,12 +21,16 @@ end
|
|
21
21
|
# Extension to Time that outputs RFC2822 compliant string on #to_s
|
22
22
|
class Time
|
23
23
|
alias :old_to_s :to_s
|
24
|
+
|
24
25
|
# Returns RFC2822 compliant string for <tt>Time</tt> object.
|
25
26
|
# For example,
|
26
27
|
# # Tony Blair's last day in office (hopefully)
|
27
28
|
# best_day_ever = Time.local(2007, 6, 27)
|
28
29
|
# best_day_ever.to_s # => "Wed, 27 Jun 2007 00:00:00 +0100"
|
29
|
-
|
30
|
-
|
30
|
+
# You can also pass in an option <tt>format</tt> argument that
|
31
|
+
# corresponds to acceptable values according to ActiveSupport's
|
32
|
+
# +Time#to_formatted_s+ method.
|
33
|
+
def to_s(format = nil)
|
34
|
+
format ? self.to_formatted_s(format) : self.rfc2822
|
31
35
|
end
|
32
36
|
end
|
data/lib/twitter/meta.rb
CHANGED
@@ -0,0 +1,89 @@
|
|
1
|
+
# File that contains extensions to the Twitter4R library directly related to providing
|
2
|
+
# seamless Rails integration.
|
3
|
+
|
4
|
+
require 'active_support'
|
5
|
+
#require 'active_support/core_ext'
|
6
|
+
require 'active_record/xml_serialization'
|
7
|
+
|
8
|
+
# Extend +String+ with +#xmlize+ method for convenience.
|
9
|
+
class String
|
10
|
+
def xmlize
|
11
|
+
# Forget module/namespace for now as this is totally broken in Rails 1.2.x
|
12
|
+
# (search for namespaced models on the Rails Trac site)
|
13
|
+
cls = self.split('::').pop
|
14
|
+
cls.dasherize.downcase
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# Parent mixin module that defines +InstanceMethods+ for Twitter4R model classes.
|
19
|
+
#
|
20
|
+
# Defines/overrides the following methods for:
|
21
|
+
# * Twitter::RailsPatch::InstanceMethods#to_param
|
22
|
+
# * Twitter::RailsPatch::InstanceMethods#to_xml
|
23
|
+
# * Twitter::RailsPatch::InstanceMethods#to_json
|
24
|
+
module Twitter::RailsPatch
|
25
|
+
class << self
|
26
|
+
def included(base)
|
27
|
+
base.send(:include, InstanceMethods)
|
28
|
+
base.extend ClassMethods
|
29
|
+
end
|
30
|
+
|
31
|
+
module ClassMethods
|
32
|
+
# Dummy method to satisfy ActiveRecord's XmlSerializer.
|
33
|
+
def inheritance_column
|
34
|
+
nil
|
35
|
+
end
|
36
|
+
|
37
|
+
# Returns Hash of name-column pairs
|
38
|
+
def columns_hash
|
39
|
+
{}
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
module InstanceMethods
|
44
|
+
# Returns an Array of attribute names of the model
|
45
|
+
def attribute_names
|
46
|
+
self.class.class_eval("@@ATTRIBUTES").collect {|att| att.to_s }
|
47
|
+
end
|
48
|
+
|
49
|
+
# Override default +#to_param+ implementation.
|
50
|
+
def to_param
|
51
|
+
self.id.to_s
|
52
|
+
end
|
53
|
+
|
54
|
+
# Returns XML representation of model.
|
55
|
+
def to_xml(options = {})
|
56
|
+
ActiveRecord::XmlSerializer.new(self, options.merge(:root => self.class.name.xmlize)).to_s
|
57
|
+
end
|
58
|
+
|
59
|
+
# Returns JSON representation of model.
|
60
|
+
#
|
61
|
+
# The current implementation basically ignoring +options+, so reopen and override
|
62
|
+
# this implementation or live with it for the moment:)
|
63
|
+
def to_json(options = {})
|
64
|
+
JSON.unparse(self.to_hash)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
class Twitter::User
|
71
|
+
include Twitter::RailsPatch
|
72
|
+
end
|
73
|
+
|
74
|
+
class Twitter::Status
|
75
|
+
include Twitter::RailsPatch
|
76
|
+
end
|
77
|
+
|
78
|
+
class Twitter::Message
|
79
|
+
include Twitter::RailsPatch
|
80
|
+
end
|
81
|
+
|
82
|
+
class Twitter::RESTError
|
83
|
+
include Twitter::RailsPatch
|
84
|
+
alias :id :code
|
85
|
+
def to_hash
|
86
|
+
{ :code => @code, :message => @message, :uri => @uri }
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
data/lib/twitter/version.rb
CHANGED
@@ -35,13 +35,13 @@ describe Twitter::Client, "#http_header" do
|
|
35
35
|
'User-Agent' => "Twitter4R v#{Twitter::Version.to_version} [#{@user_agent}]",
|
36
36
|
}
|
37
37
|
@twitter = client_context
|
38
|
-
#
|
38
|
+
# reset @@http_header class variable in Twitter::Client class
|
39
39
|
Twitter::Client.class_eval("@@http_header = nil")
|
40
40
|
end
|
41
41
|
|
42
42
|
it "should always return expected HTTP headers" do
|
43
43
|
headers = @twitter.send(:http_header)
|
44
|
-
headers.should
|
44
|
+
headers.should === @expected_headers
|
45
45
|
end
|
46
46
|
|
47
47
|
it "should cache HTTP headers Hash in class variable after first invocation" do
|
@@ -50,7 +50,7 @@ describe Twitter::Client, "#http_header" do
|
|
50
50
|
@twitter.send(:http_header)
|
51
51
|
cache = Twitter::Client.class_eval("@@http_header")
|
52
52
|
cache.should_not be_nil
|
53
|
-
cache.should
|
53
|
+
cache.should === @expected_headers
|
54
54
|
end
|
55
55
|
|
56
56
|
after(:each) do
|
data/spec/twitter/config_spec.rb
CHANGED
@@ -55,8 +55,8 @@ describe Twitter::Config, "#eql?" do
|
|
55
55
|
:proxy_host => @proxy_host,
|
56
56
|
:proxy_port => @proxy_port,
|
57
57
|
}
|
58
|
-
@obj =
|
59
|
-
@other =
|
58
|
+
@obj = Twitter::Config.new(attrs)
|
59
|
+
@other = Twitter::Config.new(attrs)
|
60
60
|
|
61
61
|
@different = stubbed_twitter_config(Twitter::Config.new, attrs.merge(:proxy_host => 'different.proxy'))
|
62
62
|
@same = @obj
|
data/spec/twitter/meta_spec.rb
CHANGED
@@ -0,0 +1,110 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
+
|
3
|
+
describe String, "representing a class name" do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@class_name = Twitter::User.class.name
|
7
|
+
@xmlized_name = @class_name.downcase # simple case for the moment...since Rails' support for namespaced models sucks!
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should be downcased (minus module namespaces) when xmlized" do
|
11
|
+
@class_name.xmlize.should eql(@xmlized_name)
|
12
|
+
end
|
13
|
+
|
14
|
+
after(:each) do
|
15
|
+
nilize(@class_name, @xmlized_name)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "Rails model extensions for model classes", :shared => true do
|
20
|
+
|
21
|
+
before(:each) do
|
22
|
+
@id = 3242334
|
23
|
+
@id_s = @id.to_s
|
24
|
+
@model = model(@id)
|
25
|
+
@model_hash = @model.to_hash
|
26
|
+
@json = JSON.unparse(@model_hash)
|
27
|
+
@serializer = ActiveRecord::XmlSerializer.new(@model, {:root => @model.class.name.downcase})
|
28
|
+
@xml = @serializer.to_s
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should invoke #to_param as expected" do
|
32
|
+
@model.should_receive(:id).and_return(@id)
|
33
|
+
@model.to_param
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should return string representation for id for #to_param" do
|
37
|
+
@model.to_param.class.should eql(String)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should return output from JSON.unparse for #to_json" do
|
41
|
+
@model.should_receive(:to_hash).and_return(@model_hash)
|
42
|
+
JSON.should_receive(:unparse).and_return(@json)
|
43
|
+
@model.to_json
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should return XmlSerializer string output for #to_xml" do
|
47
|
+
ActiveRecord::XmlSerializer.should_receive(:new).and_return(@serializer)
|
48
|
+
@serializer.should_receive(:to_s).and_return(@xml)
|
49
|
+
@model.to_xml
|
50
|
+
end
|
51
|
+
|
52
|
+
after(:each) do
|
53
|
+
nilize(@id, @model)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe Twitter::User, "Rails extensions" do
|
58
|
+
|
59
|
+
def model(id)
|
60
|
+
Twitter::User.new(:id => id)
|
61
|
+
end
|
62
|
+
|
63
|
+
it_should_behave_like "Rails model extensions for model classes"
|
64
|
+
end
|
65
|
+
|
66
|
+
describe Twitter::Status, "Rails extensions" do
|
67
|
+
|
68
|
+
def model(id)
|
69
|
+
Twitter::Status.new(:id => id)
|
70
|
+
end
|
71
|
+
|
72
|
+
it_should_behave_like "Rails model extensions for model classes"
|
73
|
+
end
|
74
|
+
|
75
|
+
describe Twitter::Message, "Rails extensions" do
|
76
|
+
|
77
|
+
def model(id)
|
78
|
+
Twitter::Message.new(:id => id)
|
79
|
+
end
|
80
|
+
|
81
|
+
it_should_behave_like "Rails model extensions for model classes"
|
82
|
+
end
|
83
|
+
|
84
|
+
describe Twitter::RESTError, "Rails extensions" do
|
85
|
+
|
86
|
+
before(:each) do
|
87
|
+
@attributes = { :code => 200, :message => 'Success', :uri => 'http://twitter.com/statuses' }
|
88
|
+
@model = Twitter::RESTError.new(@attributes)
|
89
|
+
@json = "JSON" # doesn't really matter what the value is
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should return a Hash of attribute name-value pairs for #to_hash" do
|
93
|
+
@model.to_hash.should === @attributes
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should invoke XmlSerializer for #to_xml" do
|
97
|
+
|
98
|
+
@model.to_xml
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should return expected JSON for #to_json" do
|
102
|
+
@model.to_hash
|
103
|
+
JSON.should_receive(:unparse).and_return(@json)
|
104
|
+
@model.to_json
|
105
|
+
end
|
106
|
+
|
107
|
+
after(:each) do
|
108
|
+
nilize(@attributes, @model)
|
109
|
+
end
|
110
|
+
end
|
metadata
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.
|
2
|
+
rubygems_version: 0.9.4
|
3
3
|
specification_version: 1
|
4
4
|
name: twitter4r
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.2.
|
7
|
-
date: 2007-07-
|
6
|
+
version: 0.2.4
|
7
|
+
date: 2007-07-25 00:00:00 -05:00
|
8
8
|
summary: A clean Twitter client API in pure Ruby. Will include Twitter add-ons also in Ruby.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -30,38 +30,39 @@ authors:
|
|
30
30
|
- Susan Potter
|
31
31
|
files:
|
32
32
|
- lib/twitter.rb
|
33
|
+
- lib/twitter/ext/stdlib.rb
|
34
|
+
- lib/twitter/console.rb
|
35
|
+
- lib/twitter/ext.rb
|
36
|
+
- lib/twitter/rails.rb
|
37
|
+
- lib/twitter/meta.rb
|
38
|
+
- lib/twitter/client.rb
|
39
|
+
- lib/twitter/client/status.rb
|
40
|
+
- lib/twitter/client/friendship.rb
|
41
|
+
- lib/twitter/client/user.rb
|
42
|
+
- lib/twitter/client/timeline.rb
|
43
|
+
- lib/twitter/client/messaging.rb
|
44
|
+
- lib/twitter/client/base.rb
|
33
45
|
- lib/twitter/config.rb
|
46
|
+
- lib/twitter/model.rb
|
34
47
|
- lib/twitter/extras.rb
|
35
48
|
- lib/twitter/version.rb
|
36
|
-
- lib/twitter/client.rb
|
37
|
-
- lib/twitter/model.rb
|
38
|
-
- lib/twitter/meta.rb
|
39
|
-
- lib/twitter/ext.rb
|
40
49
|
- lib/twitter/core.rb
|
41
|
-
-
|
42
|
-
-
|
43
|
-
- lib/twitter/client/base.rb
|
44
|
-
- lib/twitter/client/status.rb
|
45
|
-
- lib/twitter/client/messaging.rb
|
46
|
-
- lib/twitter/client/timeline.rb
|
47
|
-
- lib/twitter/client/friendship.rb
|
48
|
-
- lib/twitter/ext/stdlib.rb
|
49
|
-
- spec/spec_helper.rb
|
50
|
-
- spec/twitter/model_spec.rb
|
51
|
-
- spec/twitter/core_spec.rb
|
50
|
+
- spec/twitter/meta_spec.rb
|
51
|
+
- spec/twitter/ext/stdlib_spec.rb
|
52
52
|
- spec/twitter/client_spec.rb
|
53
|
-
- spec/twitter/extras_spec.rb
|
54
53
|
- spec/twitter/version_spec.rb
|
55
54
|
- spec/twitter/console_spec.rb
|
56
|
-
- spec/twitter/meta_spec.rb
|
57
|
-
- spec/twitter/config_spec.rb
|
58
|
-
- spec/twitter/client/timeline_spec.rb
|
59
55
|
- spec/twitter/client/base_spec.rb
|
60
|
-
- spec/twitter/client/
|
56
|
+
- spec/twitter/client/user_spec.rb
|
61
57
|
- spec/twitter/client/friendship_spec.rb
|
62
58
|
- spec/twitter/client/messaging_spec.rb
|
63
|
-
- spec/twitter/client/
|
64
|
-
- spec/twitter/
|
59
|
+
- spec/twitter/client/timeline_spec.rb
|
60
|
+
- spec/twitter/client/status_spec.rb
|
61
|
+
- spec/twitter/extras_spec.rb
|
62
|
+
- spec/twitter/core_spec.rb
|
63
|
+
- spec/twitter/rails_spec.rb
|
64
|
+
- spec/twitter/config_spec.rb
|
65
|
+
- spec/twitter/model_spec.rb
|
65
66
|
test_files: []
|
66
67
|
|
67
68
|
rdoc_options: []
|
data/spec/spec_helper.rb
DELETED
@@ -1,133 +0,0 @@
|
|
1
|
-
require 'spec'
|
2
|
-
require 'twitter'
|
3
|
-
require 'twitter/console'
|
4
|
-
require 'twitter/extras'
|
5
|
-
|
6
|
-
# Add helper methods here if relevant to multiple _spec.rb files
|
7
|
-
|
8
|
-
# Spec helper that sets attribute <tt>att</tt> for given objects <tt>obj</tt>
|
9
|
-
# and <tt>other</tt> to given <tt>value</tt>.
|
10
|
-
def equalizer(obj, other, att, value)
|
11
|
-
setter = "#{att}="
|
12
|
-
obj.send(setter, value)
|
13
|
-
other.send(setter, value)
|
14
|
-
end
|
15
|
-
|
16
|
-
# Spec helper that nil-izes objects passed in
|
17
|
-
def nilize(*objects)
|
18
|
-
objects.each {|obj| obj = nil }
|
19
|
-
end
|
20
|
-
|
21
|
-
# Returns default <tt>client</tt> context object
|
22
|
-
def client_context(file = 'config/twitter.yml')
|
23
|
-
Twitter::Client.from_config(file)
|
24
|
-
end
|
25
|
-
|
26
|
-
# Spec helper that returns a mocked <tt>Twitter::Config</tt> object
|
27
|
-
# with stubbed attributes and <tt>attrs</tt> for overriding attribute
|
28
|
-
# values.
|
29
|
-
def stubbed_twitter_config(config, attrs = {})
|
30
|
-
opts = {
|
31
|
-
:protocol => :ssl,
|
32
|
-
:host => 'twitter.com',
|
33
|
-
:port => 443,
|
34
|
-
:proxy_host => 'proxy.host',
|
35
|
-
:proxy_port => 8080,
|
36
|
-
}.merge(attrs)
|
37
|
-
config.stub!(:protocol).and_return(opts[:protocol])
|
38
|
-
config.stub!(:host).and_return(opts[:host])
|
39
|
-
config.stub!(:port).and_return(opts[:port])
|
40
|
-
config.stub!(:proxy_host).and_return(opts[:proxy_host])
|
41
|
-
config.stub!(:proxy_port).and_return(opts[:proxy_port])
|
42
|
-
config
|
43
|
-
end
|
44
|
-
|
45
|
-
def mas_twitter_config(attrs = {})
|
46
|
-
config = mock(Twitter::Config)
|
47
|
-
stubbed_twitter_conf(config, attrs)
|
48
|
-
end
|
49
|
-
|
50
|
-
# Spec helper that returns the project root directory as absolute path string
|
51
|
-
def project_root_dir
|
52
|
-
File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
53
|
-
end
|
54
|
-
|
55
|
-
# Spec helper that returns stubbed <tt>Net::HTTP</tt> object
|
56
|
-
# with given <tt>response</tt> and <tt>obj_stubs</tt>.
|
57
|
-
# The <tt>host</tt> and <tt>port</tt> are used to initialize
|
58
|
-
# the Net::HTTP object.
|
59
|
-
def stubbed_net_http(response, obj_stubs = {}, host = 'twitter.com', port = 80)
|
60
|
-
http = Net::HTTP.new(host, port)
|
61
|
-
Net::HTTP.stub!(:new).and_return(http)
|
62
|
-
http.stub!(:request).and_return(response)
|
63
|
-
http
|
64
|
-
end
|
65
|
-
|
66
|
-
# Spec helper that returns a mocked <tt>Net::HTTP</tt> object and
|
67
|
-
# stubs out the <tt>request</tt> method to return the given
|
68
|
-
# <tt>response</tt>
|
69
|
-
def mas_net_http(response, obj_stubs = {})
|
70
|
-
http = mock(Net::HTTP, obj_stubs)
|
71
|
-
Net::HTTP.stub!(:new).and_return(http)
|
72
|
-
http.stub!(:request).and_return(response)
|
73
|
-
http.stub!(:start).and_yield(http)
|
74
|
-
http.stub!(:use_ssl=)
|
75
|
-
http.stub!(:verify_mode=)
|
76
|
-
http
|
77
|
-
end
|
78
|
-
|
79
|
-
# Spec helper that returns a mocked <tt>Net::HTTP::Get</tt> object and
|
80
|
-
# stubs relevant class methods and given <tt>obj_stubs</tt>
|
81
|
-
# for endo-specing
|
82
|
-
def mas_net_http_get(obj_stubs = {})
|
83
|
-
request = Spec::Mocks::Mock.new(Net::HTTP::Get)
|
84
|
-
Net::HTTP::Get.stub!(:new).and_return(request)
|
85
|
-
obj_stubs.each do |method, value|
|
86
|
-
request.stub!(method).and_return(value)
|
87
|
-
end
|
88
|
-
request
|
89
|
-
end
|
90
|
-
|
91
|
-
# Spec helper that returns a mocked <tt>Net::HTTP::Post</tt> object and
|
92
|
-
# stubs relevant class methods and given <tt>obj_stubs</tt>
|
93
|
-
# for endo-specing
|
94
|
-
def mas_net_http_post(obj_stubs = {})
|
95
|
-
request = Spec::Mocks::Mock.new(Net::HTTP::Post)
|
96
|
-
Net::HTTP::Post.stub!(:new).and_return(request)
|
97
|
-
obj_stubs.each do |method, value|
|
98
|
-
request.stub!(method).and_return(value)
|
99
|
-
end
|
100
|
-
request
|
101
|
-
end
|
102
|
-
|
103
|
-
# Spec helper that returns a mocked <tt>Net::HTTPResponse</tt> object and
|
104
|
-
# stubs given <tt>obj_stubs</tt> for endo-specing.
|
105
|
-
#
|
106
|
-
def mas_net_http_response(status = :success,
|
107
|
-
body = '',
|
108
|
-
obj_stubs = {})
|
109
|
-
response = Spec::Mocks::Mock.new(Net::HTTPResponse)
|
110
|
-
response.stub!(:body).and_return(body)
|
111
|
-
case status
|
112
|
-
when :success || 200
|
113
|
-
_create_http_response(response, "200", "OK")
|
114
|
-
when :created || 201
|
115
|
-
_create_http_response(response, "201", "Created")
|
116
|
-
when :redirect || 301
|
117
|
-
_create_http_response(response, "301", "Redirect")
|
118
|
-
when :not_authorized || 403
|
119
|
-
_create_http_response(response, "403", "Not Authorized")
|
120
|
-
when :file_not_found || 404
|
121
|
-
_create_http_response(response, "404", "File Not Found")
|
122
|
-
when :server_error || 500
|
123
|
-
_create_http_response(response, "500", "Server Error")
|
124
|
-
end
|
125
|
-
response
|
126
|
-
end
|
127
|
-
|
128
|
-
# Local helper method to DRY up code.
|
129
|
-
def _create_http_response(mock_response, code, message)
|
130
|
-
mock_response.stub!(:code).and_return(code)
|
131
|
-
mock_response.stub!(:message).and_return(message)
|
132
|
-
mock_response.stub!(:is_a?).and_return(true) if ["200", "201"].member?(code)
|
133
|
-
end
|