atig 0.0.1

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 (171) hide show
  1. data/.gitignore +24 -0
  2. data/Gemfile +3 -0
  3. data/README.mkdn +52 -0
  4. data/Rakefile +15 -0
  5. data/atig.gemspec +25 -0
  6. data/bin/atig +74 -0
  7. data/docs/OMakefile +32 -0
  8. data/docs/OMakeroot +45 -0
  9. data/docs/_static/allow.png +0 -0
  10. data/docs/_static/emacs.png +0 -0
  11. data/docs/_static/irc_setting.png +0 -0
  12. data/docs/_static/irssi.png +0 -0
  13. data/docs/_static/limechat.png +0 -0
  14. data/docs/_static/limechat_s.png +0 -0
  15. data/docs/_static/oauth_channel.png +0 -0
  16. data/docs/_static/screenshot.png +0 -0
  17. data/docs/_static/structure.png +0 -0
  18. data/docs/_static/verify.png +0 -0
  19. data/docs/changelog.rst +96 -0
  20. data/docs/commandline_options.rst +21 -0
  21. data/docs/commands.rst +84 -0
  22. data/docs/conf.py +194 -0
  23. data/docs/config.rst +159 -0
  24. data/docs/feature.rst +41 -0
  25. data/docs/graphics.graffle +1995 -0
  26. data/docs/hacking_guide.rst +43 -0
  27. data/docs/index.rst +109 -0
  28. data/docs/irc.rst +31 -0
  29. data/docs/options.rst +75 -0
  30. data/docs/quickstart.rst +89 -0
  31. data/docs/resize.sh +7 -0
  32. data/docs/tiarra.rst +2 -0
  33. data/docs/tig.rst +21 -0
  34. data/lib/atig.rb +19 -0
  35. data/lib/atig/agent.rb +8 -0
  36. data/lib/atig/agent/agent.rb +38 -0
  37. data/lib/atig/agent/clenup.rb +23 -0
  38. data/lib/atig/agent/dm.rb +35 -0
  39. data/lib/atig/agent/following.rb +45 -0
  40. data/lib/atig/agent/full_list.rb +20 -0
  41. data/lib/atig/agent/list.rb +55 -0
  42. data/lib/atig/agent/list_status.rb +46 -0
  43. data/lib/atig/agent/mention.rb +13 -0
  44. data/lib/atig/agent/other_list.rb +18 -0
  45. data/lib/atig/agent/own_list.rb +18 -0
  46. data/lib/atig/agent/stream_follow.rb +38 -0
  47. data/lib/atig/agent/timeline.rb +13 -0
  48. data/lib/atig/agent/user_stream.rb +31 -0
  49. data/lib/atig/basic_twitter.rb +116 -0
  50. data/lib/atig/bitly.rb +52 -0
  51. data/lib/atig/channel.rb +5 -0
  52. data/lib/atig/channel/channel.rb +17 -0
  53. data/lib/atig/channel/dm.rb +14 -0
  54. data/lib/atig/channel/list.rb +76 -0
  55. data/lib/atig/channel/mention.rb +20 -0
  56. data/lib/atig/channel/retweet.rb +28 -0
  57. data/lib/atig/channel/timeline.rb +74 -0
  58. data/lib/atig/command.rb +21 -0
  59. data/lib/atig/command/autofix.rb +58 -0
  60. data/lib/atig/command/command.rb +24 -0
  61. data/lib/atig/command/command_helper.rb +95 -0
  62. data/lib/atig/command/destroy.rb +44 -0
  63. data/lib/atig/command/dm.rb +31 -0
  64. data/lib/atig/command/favorite.rb +27 -0
  65. data/lib/atig/command/info.rb +50 -0
  66. data/lib/atig/command/limit.rb +15 -0
  67. data/lib/atig/command/location.rb +23 -0
  68. data/lib/atig/command/name.rb +18 -0
  69. data/lib/atig/command/option.rb +37 -0
  70. data/lib/atig/command/refresh.rb +18 -0
  71. data/lib/atig/command/reply.rb +37 -0
  72. data/lib/atig/command/retweet.rb +63 -0
  73. data/lib/atig/command/search.rb +51 -0
  74. data/lib/atig/command/spam.rb +26 -0
  75. data/lib/atig/command/status.rb +41 -0
  76. data/lib/atig/command/thread.rb +44 -0
  77. data/lib/atig/command/time.rb +32 -0
  78. data/lib/atig/command/uptime.rb +32 -0
  79. data/lib/atig/command/user.rb +42 -0
  80. data/lib/atig/command/user_info.rb +27 -0
  81. data/lib/atig/command/version.rb +49 -0
  82. data/lib/atig/command/whois.rb +39 -0
  83. data/lib/atig/db/db.rb +60 -0
  84. data/lib/atig/db/followings.rb +131 -0
  85. data/lib/atig/db/listenable.rb +22 -0
  86. data/lib/atig/db/lists.rb +76 -0
  87. data/lib/atig/db/roman.rb +30 -0
  88. data/lib/atig/db/sized_uniq_array.rb +62 -0
  89. data/lib/atig/db/sql.rb +35 -0
  90. data/lib/atig/db/statuses.rb +147 -0
  91. data/lib/atig/db/transaction.rb +47 -0
  92. data/lib/atig/exception_util.rb +26 -0
  93. data/lib/atig/gateway.rb +62 -0
  94. data/lib/atig/gateway/channel.rb +99 -0
  95. data/lib/atig/gateway/session.rb +326 -0
  96. data/lib/atig/http.rb +95 -0
  97. data/lib/atig/ifilter.rb +7 -0
  98. data/lib/atig/ifilter/expand_url.rb +74 -0
  99. data/lib/atig/ifilter/retweet.rb +14 -0
  100. data/lib/atig/ifilter/retweet_time.rb +16 -0
  101. data/lib/atig/ifilter/sanitize.rb +18 -0
  102. data/lib/atig/ifilter/strip.rb +15 -0
  103. data/lib/atig/ifilter/utf7.rb +26 -0
  104. data/lib/atig/ifilter/xid.rb +36 -0
  105. data/lib/atig/levenshtein.rb +49 -0
  106. data/lib/atig/monkey.rb +4 -0
  107. data/lib/atig/oauth-patch.rb +40 -0
  108. data/lib/atig/oauth.rb +55 -0
  109. data/lib/atig/ofilter.rb +4 -0
  110. data/lib/atig/ofilter/escape_url.rb +102 -0
  111. data/lib/atig/ofilter/footer.rb +20 -0
  112. data/lib/atig/ofilter/geo.rb +17 -0
  113. data/lib/atig/ofilter/short_url.rb +47 -0
  114. data/lib/atig/option.rb +90 -0
  115. data/lib/atig/scheduler.rb +79 -0
  116. data/lib/atig/search.rb +22 -0
  117. data/lib/atig/search_twitter.rb +21 -0
  118. data/lib/atig/sized_hash.rb +33 -0
  119. data/lib/atig/stream.rb +66 -0
  120. data/lib/atig/twitter.rb +79 -0
  121. data/lib/atig/twitter_struct.rb +63 -0
  122. data/lib/atig/unu.rb +27 -0
  123. data/lib/atig/update_checker.rb +53 -0
  124. data/lib/atig/url_escape.rb +62 -0
  125. data/lib/atig/util.rb +16 -0
  126. data/lib/atig/version.rb +3 -0
  127. data/lib/memory_profiler.rb +77 -0
  128. data/spec/command/autofix_spec.rb +35 -0
  129. data/spec/command/destroy_spec.rb +98 -0
  130. data/spec/command/dm_spec.rb +28 -0
  131. data/spec/command/favorite_spec.rb +55 -0
  132. data/spec/command/limit_spec.rb +27 -0
  133. data/spec/command/location_spec.rb +25 -0
  134. data/spec/command/name_spec.rb +19 -0
  135. data/spec/command/option_spec.rb +133 -0
  136. data/spec/command/refresh_spec.rb +22 -0
  137. data/spec/command/reply_spec.rb +79 -0
  138. data/spec/command/retweet_spec.rb +66 -0
  139. data/spec/command/spam_spec.rb +27 -0
  140. data/spec/command/status_spec.rb +44 -0
  141. data/spec/command/thread_spec.rb +91 -0
  142. data/spec/command/time_spec.rb +52 -0
  143. data/spec/command/uptime_spec.rb +55 -0
  144. data/spec/command/user_info_spec.rb +42 -0
  145. data/spec/command/user_spec.rb +50 -0
  146. data/spec/command/version_spec.rb +67 -0
  147. data/spec/command/whois_spec.rb +78 -0
  148. data/spec/db/followings_spec.rb +100 -0
  149. data/spec/db/listenable_spec.rb +32 -0
  150. data/spec/db/lists_spec.rb +104 -0
  151. data/spec/db/roman_spec.rb +17 -0
  152. data/spec/db/sized_uniq_array_spec.rb +63 -0
  153. data/spec/db/statuses_spec.rb +180 -0
  154. data/spec/ifilter/expand_url_spec.rb +44 -0
  155. data/spec/ifilter/retweet_spec.rb +28 -0
  156. data/spec/ifilter/retweet_time_spec.rb +25 -0
  157. data/spec/ifilter/sanitize_spec.rb +25 -0
  158. data/spec/ifilter/sid_spec.rb +29 -0
  159. data/spec/ifilter/strip_spec.rb +23 -0
  160. data/spec/ifilter/tid_spec.rb +29 -0
  161. data/spec/ifilter/utf7_spec.rb +30 -0
  162. data/spec/levenshtein_spec.rb +24 -0
  163. data/spec/ofilter/escape_url_spec.rb +50 -0
  164. data/spec/ofilter/footer_spec.rb +32 -0
  165. data/spec/ofilter/geo_spec.rb +33 -0
  166. data/spec/ofilter/short_url_spec.rb +127 -0
  167. data/spec/option_spec.rb +91 -0
  168. data/spec/sized_hash_spec.rb +45 -0
  169. data/spec/spec_helper.rb +35 -0
  170. data/spec/update_checker_spec.rb +55 -0
  171. metadata +326 -0
@@ -0,0 +1,30 @@
1
+ # -*- mode:ruby; coding:utf-8 -*-
2
+
3
+ require File.expand_path( '../../spec_helper', __FILE__ )
4
+ require 'atig/ifilter/utf7'
5
+ require 'atig/twitter_struct'
6
+
7
+ describe Atig::IFilter::Utf7 do
8
+ def filtered(text)
9
+ logger = mock('logger').should_receive(:error).at_most(:once)
10
+ ifilter = Atig::IFilter::Utf7.new(OpenStruct.new(:log=>logger,
11
+ :opts=>OpenStruct.new))
12
+ ifilter.call status(text)
13
+ end
14
+
15
+ it "should be used in Iconv" do
16
+ defined?(::Iconv).should be_true
17
+ end
18
+
19
+ it "should through ASCII" do
20
+ filtered("hello").should be_text("hello")
21
+ end
22
+
23
+ it "should decode +sequence" do
24
+ filtered("1 +- 1 = 2").should be_text("1 + 1 = 2")
25
+ end
26
+
27
+ it "should decode pound sign" do
28
+ filtered("+AKM-1").should be_text("£1")
29
+ end
30
+ end
@@ -0,0 +1,24 @@
1
+ # -*- mode:ruby; coding:utf-8 -*-
2
+
3
+ require File.expand_path( '../spec_helper', __FILE__ )
4
+ require 'atig/levenshtein'
5
+
6
+ target = [Atig::Levenshtein, Atig::Levenshtein::PureRuby]
7
+
8
+ target.each do |m|
9
+ describe m do
10
+ it "should return correct levenshtein distance" do
11
+ [
12
+ ["kitten", "sitting", 3],
13
+ ["foo", "foo", 0],
14
+ ["", "", 0],
15
+ ["foO", "foo", 1],
16
+ ["", "foo", 3],
17
+ ["あああ", "ああい", 1],
18
+ ].each do |a, b, expected|
19
+ m.levenshtein(a.split(//), b.split(//)).should == expected
20
+ m.levenshtein(b.split(//), a.split(//)).should == expected
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,50 @@
1
+ # -*- mode:ruby; coding:utf-8 -*-
2
+
3
+ require File.expand_path( '../../spec_helper', __FILE__ )
4
+ require 'atig/ofilter/escape_url'
5
+
6
+ class Atig::OFilter::EscapeUrl
7
+ def exist_uri?(_); true end
8
+ end
9
+
10
+ describe Atig::OFilter::EscapeUrl do
11
+ before do
12
+ @logger = mock('Logger')
13
+ @logger.should_receive(:info).at_most(:once)
14
+ @logger.should_receive(:error).at_most(:once)
15
+ @logger.should_receive(:debug).at_most(:once)
16
+ end
17
+
18
+ def filtered(text,opt={})
19
+ esc = Atig::OFilter::EscapeUrl.new(OpenStruct.new(:log=>@logger,:opts=>nil))
20
+ esc.call :status => text
21
+ end
22
+
23
+ it "through normal url" do
24
+ filtered("http://example.com").should == { :status => "http://example.com"}
25
+ end
26
+
27
+ it "escape only url" do
28
+ filtered("あああ http://example.com/あああ").should == { :status => "あああ http://example.com/%E3%81%82%E3%81%82%E3%81%82" }
29
+ end
30
+ end
31
+
32
+ if defined? ::Punycode then
33
+ describe Atig::OFilter::EscapeUrl,"when punycode is enabled" do
34
+ before do
35
+ @logger = mock('Logger')
36
+ @logger.should_receive(:info).at_most(:once)
37
+ @logger.should_receive(:error).at_most(:once)
38
+ @logger.should_receive(:debug).at_most(:once)
39
+ end
40
+
41
+ def filtered(text,opt={})
42
+ esc = Atig::OFilter::EscapeUrl.new(OpenStruct.new(:log=>@logger,:opts=>nil))
43
+ esc.call :status => text
44
+ end
45
+
46
+ it "escape international URL" do
47
+ filtered("http://あああ.com").should == {:status => "http://xn--l8jaa.com" }
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,32 @@
1
+ # -*- mode:ruby; coding:utf-8 -*-
2
+
3
+ require File.expand_path( '../../spec_helper', __FILE__ )
4
+ require 'atig/ofilter/footer'
5
+ require 'ostruct'
6
+
7
+ describe Atig::OFilter::Footer do
8
+ before do
9
+ @opts = OpenStruct.new
10
+ @filter = Atig::OFilter::Footer.new(OpenStruct.new(:opts=>@opts))
11
+ end
12
+
13
+ it "should pass through" do
14
+ @filter.call(:status => 'hi').should == {
15
+ :status => "hi"
16
+ }
17
+ end
18
+
19
+ it "should append footer" do
20
+ @opts.footer = '*tw*'
21
+ @filter.call(:status => 'hi').should == {
22
+ :status => "hi *tw*"
23
+ }
24
+ end
25
+
26
+ it "should not append footer" do
27
+ @opts.footer = false
28
+ @filter.call(:status => 'hi').should == {
29
+ :status => "hi"
30
+ }
31
+ end
32
+ end
@@ -0,0 +1,33 @@
1
+ # -*- mode:ruby; coding:utf-8 -*-
2
+
3
+ require File.expand_path( '../../spec_helper', __FILE__ )
4
+ require 'atig/ofilter/geo'
5
+ require 'ostruct'
6
+
7
+ describe Atig::OFilter::Geo,"when disabled" do
8
+ def filtered(text,opt={})
9
+ geo = Atig::OFilter::Geo.new(OpenStruct.new(:opts=>OpenStruct.new(opt)))
10
+ geo.call :status => text
11
+ end
12
+
13
+ it "should through" do
14
+ filtered("hi").should == {
15
+ :status => "hi"
16
+ }
17
+ end
18
+ end
19
+
20
+ describe Atig::OFilter::Geo,"when enabled" do
21
+ def filtered(text,opt={})
22
+ geo = Atig::OFilter::Geo.new(OpenStruct.new(:opts=>OpenStruct.new(opt)))
23
+ geo.call :status => text
24
+ end
25
+
26
+ it "add lat & long" do
27
+ filtered("hi",:ll=>"42.1,43.1").should == {
28
+ :status => "hi",
29
+ :lat => 42.1,
30
+ :long => 43.1
31
+ }
32
+ end
33
+ end
@@ -0,0 +1,127 @@
1
+ # -*- mode:ruby; coding:utf-8 -*-
2
+
3
+ require File.expand_path( '../../spec_helper', __FILE__ )
4
+ require 'atig/ofilter/short_url'
5
+ require 'ostruct'
6
+
7
+ describe Atig::OFilter::ShortUrl,"when no-login bitly" do
8
+ before do
9
+ logger = mock('Logger')
10
+ bitly = mock("Bitly")
11
+ bitly.stub!(:shorten).and_return{|s|
12
+ "[#{s}]"
13
+ }
14
+ Atig::Bitly.should_receive(:no_login).with(logger).and_return(bitly)
15
+ @ofilter = Atig::OFilter::ShortUrl.new(OpenStruct.new(:log=>logger, :opts=>OpenStruct.new('bitlify'=>true)))
16
+ end
17
+
18
+ it "should shorten url by bitly" do
19
+ @ofilter.call({:status => "this is http://example.com/a http://example.com/b"}).should == {
20
+ :status => "this is [http://example.com/a] [http://example.com/b]"
21
+ }
22
+ end
23
+ end
24
+
25
+ describe Atig::OFilter::ShortUrl,"when no-login bitly with size" do
26
+ before do
27
+ logger = mock('Logger')
28
+ bitly = mock("Bitly")
29
+ bitly.stub!(:shorten).and_return{|s|
30
+ "[#{s}]"
31
+ }
32
+ Atig::Bitly.should_receive(:no_login).with(logger).and_return(bitly)
33
+ @ofilter = Atig::OFilter::ShortUrl.new(OpenStruct.new(:log=>logger, :opts=>OpenStruct.new('bitlify'=>13)))
34
+ end
35
+
36
+ it "should only shorten large url" do
37
+ @ofilter.call({:status => "this is http://example.com/a http://a.com"}).should == {
38
+ :status => "this is [http://example.com/a] http://a.com"
39
+ }
40
+ end
41
+ end
42
+
43
+ describe Atig::OFilter::ShortUrl,"when login bitly" do
44
+ before do
45
+ logger = mock('Logger')
46
+ bitly = mock("Bitly")
47
+ bitly.stub!(:shorten).and_return{|s|
48
+ "[#{s}]"
49
+ }
50
+ Atig::Bitly.should_receive(:login).with(logger,"username","api_key").and_return(bitly)
51
+ @ofilter = Atig::OFilter::ShortUrl.new(OpenStruct.new(:log=>logger, :opts=>OpenStruct.new('bitlify'=>'username:api_key')))
52
+ end
53
+
54
+ it "should only shorten large url" do
55
+ @ofilter.call({:status => "this is http://example.com/a http://example.com/b"}).should == {
56
+ :status => "this is [http://example.com/a] [http://example.com/b]"
57
+ }
58
+ end
59
+ end
60
+
61
+ describe Atig::OFilter::ShortUrl,"when login bitly with size" do
62
+ before do
63
+ logger = mock('Logger')
64
+ bitly = mock("Bitly")
65
+ bitly.stub!(:shorten).and_return{|s|
66
+ "[#{s}]"
67
+ }
68
+ Atig::Bitly.should_receive(:login).with(logger,"username","api_key").and_return(bitly)
69
+ @ofilter = Atig::OFilter::ShortUrl.new(OpenStruct.new(:log=>logger, :opts=>OpenStruct.new('bitlify'=>'username:api_key:13')))
70
+ end
71
+
72
+ it "should only shorten large url" do
73
+ @ofilter.call({:status => "this is http://example.com/a http://a.com"}).should == {
74
+ :status => "this is [http://example.com/a] http://a.com"
75
+ }
76
+ end
77
+ end
78
+
79
+ describe Atig::OFilter::ShortUrl,"when unu bitly" do
80
+ before do
81
+ logger = mock('Logger')
82
+ unu = mock("Unu")
83
+ unu.stub!(:shorten).and_return{|s|
84
+ "[#{s}]"
85
+ }
86
+ Atig::Unu.should_receive(:new).with(logger).and_return(unu)
87
+ @ofilter = Atig::OFilter::ShortUrl.new(OpenStruct.new(:log=>logger, :opts=>OpenStruct.new('unuify'=>true)))
88
+ end
89
+
90
+ it "should shorten url by unu" do
91
+ @ofilter.call({:status => "this is http://example.com/a http://example.com/b"}).should == {
92
+ :status => "this is [http://example.com/a] [http://example.com/b]"
93
+ }
94
+ end
95
+ end
96
+
97
+ describe Atig::OFilter::ShortUrl,"when no-login unu with size" do
98
+ before do
99
+ logger = mock('Logger')
100
+ unu = mock("Unu")
101
+ unu.stub!(:shorten).and_return{|s|
102
+ "[#{s}]"
103
+ }
104
+ Atig::Unu.should_receive(:new).with(logger).and_return(unu)
105
+ @ofilter = Atig::OFilter::ShortUrl.new(OpenStruct.new(:log=>logger, :opts=>OpenStruct.new('unuify'=>13)))
106
+ end
107
+
108
+ it "should only shorten large url" do
109
+ @ofilter.call({:status => "this is http://example.com/a http://a.com"}).should == {
110
+ :status => "this is [http://example.com/a] http://a.com"
111
+ }
112
+ end
113
+ end
114
+
115
+ describe Atig::OFilter::ShortUrl,"when nop" do
116
+ before do
117
+ logger = mock('Logger')
118
+
119
+ @ofilter = Atig::OFilter::ShortUrl.new(OpenStruct.new(:log=>logger, :opts=>OpenStruct.new()))
120
+ end
121
+
122
+ it "should only not do anything" do
123
+ @ofilter.call({:status => "this is http://example.com/a http://a.com"}).should == {
124
+ :status => "this is http://example.com/a http://a.com"
125
+ }
126
+ end
127
+ end
@@ -0,0 +1,91 @@
1
+ # -*- mode:ruby; coding:utf-8 -*-
2
+
3
+ require File.expand_path( '../spec_helper', __FILE__ )
4
+ require 'atig/option'
5
+
6
+ describe Atig::Option do
7
+ before do
8
+ @opt = Atig::Option.parse 'a b=1 c=1.2 d=foo'
9
+ end
10
+
11
+ it "should have bool property" do
12
+ @opt.a.should be_true
13
+ end
14
+
15
+ it "should have int property" do
16
+ @opt.b.should == 1
17
+ end
18
+
19
+ it "should have float property" do
20
+ @opt.c.should == 1.2
21
+ end
22
+
23
+ it "should have string property" do
24
+ @opt.d.should == 'foo'
25
+ end
26
+
27
+ it "should not have other property" do
28
+ @opt.e.should == nil
29
+ end
30
+
31
+ it "should update the value" do
32
+ @opt.a = false
33
+ @opt.a.should be_false
34
+ end
35
+
36
+ it "should be accessed by [name]" do
37
+ @opt[:a].should be_true
38
+ @opt['a'].should be_true
39
+ end
40
+
41
+ it "should be updated by [name]=" do
42
+ @opt[:a] = false
43
+
44
+ @opt.a.should be_false
45
+ @opt[:a].should be_false
46
+ @opt['a'].should be_false
47
+ end
48
+
49
+ it "should be updated by [name]=" do
50
+ @opt['a'] = false
51
+
52
+ @opt.a.should be_false
53
+ @opt[:a].should be_false
54
+ @opt['a'].should be_false
55
+ end
56
+
57
+ it "should be created by [name]=" do
58
+ @opt['e'] = false
59
+
60
+ @opt.e.should be_false
61
+ @opt[:e].should be_false
62
+ @opt['e'].should be_false
63
+ end
64
+
65
+ it "should be access to id" do
66
+ @opt.id.should be_nil
67
+ @opt.id = 1
68
+ @opt.id.should == 1
69
+ end
70
+
71
+ it "should have default value" do
72
+ @opt.api_base.should == 'https://api.twitter.com/1/'
73
+ end
74
+
75
+ it "should list up all fields" do
76
+ @opt.fields.map{|x| x.to_s }.sort.should == %w(api_base stream_api_base search_api_base a b c d).sort
77
+
78
+ @opt.e = 1
79
+ @opt.fields.map{|x| x.to_s }.sort.should == %w(api_base search_api_base stream_api_base a b c d e).sort
80
+ end
81
+ end
82
+
83
+ describe Atig::Option,'with not default value' do
84
+ before do
85
+ @opt = Atig::Option.parse 'hoge api_base=twitter.com'
86
+ end
87
+
88
+ it "should be specified value" do
89
+ @opt.api_base.should == 'twitter.com'
90
+ end
91
+ end
@@ -0,0 +1,45 @@
1
+ # -*- mode:ruby; coding:utf-8 -*-
2
+
3
+ require File.expand_path( '../spec_helper', __FILE__ )
4
+ require 'atig/sized_hash'
5
+
6
+ describe Atig::SizedHash do
7
+ before do
8
+ @hash = Atig::SizedHash.new 3
9
+ end
10
+
11
+ it "はkeyとvalueでアクセスできる" do
12
+ @hash[:foo] = :bar
13
+ @hash[:foo].should == :bar
14
+ end
15
+
16
+ it "はサイズが取得できる" do
17
+ @hash.size == 0
18
+
19
+ @hash[:foo] = :bar
20
+ @hash.size == 1
21
+
22
+ @hash[:foo] = :baz
23
+ @hash.size == 1
24
+
25
+ @hash[:xyzzy] = :hoge
26
+ @hash.size == 2
27
+ end
28
+
29
+ it "は古いのが消える" do
30
+ ('a'..'c').each{|c| @hash[c] = 42 }
31
+
32
+ @hash.key?('a').should be_true
33
+
34
+ @hash['d'] = 42
35
+ @hash.key?('a').should be_false
36
+ end
37
+
38
+ it "は使うたびに寿命が伸びる" do
39
+ ('a'..'c').each{|c| @hash[c] = 42 }
40
+ @hash['a']
41
+ @hash['d'] = 42
42
+ @hash.key?('a').should be_true
43
+ @hash.key?('b').should be_false
44
+ end
45
+ end
@@ -0,0 +1,35 @@
1
+ # -*- mode:ruby; coding:utf-8 -*-
2
+ require 'rubygems'
3
+ require 'bundler'
4
+
5
+ Bundler.setup
6
+ Bundler.require :default, :test
7
+
8
+ $:.unshift(File.expand_path( '../lib', File.dirname(__FILE__) ) )
9
+
10
+ require 'atig/monkey'
11
+
12
+ RSpec::Matchers.define :be_text do |text|
13
+ match do |status|
14
+ status.text.should == text
15
+ end
16
+ end
17
+
18
+ def status(text,opt={})
19
+ Atig::TwitterStruct.make(opt.merge('text' => text))
20
+ end
21
+
22
+ def user(id, name)
23
+ user = stub("User-#{name}")
24
+ user.stub!(:id).and_return(id)
25
+ user.stub!(:screen_name).and_return(name)
26
+ user
27
+ end
28
+
29
+ def entry(user,status,name='entry',id=0)
30
+ entry = stub name
31
+ entry.stub!('id').and_return(id)
32
+ entry.stub!('user').and_return(user)
33
+ entry.stub!('status').and_return(status)
34
+ entry
35
+ end