draftcode-termtter 1.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. data/History.txt +4 -0
  2. data/README.rdoc +100 -0
  3. data/Rakefile +55 -0
  4. data/bin/kill_termtter +22 -0
  5. data/bin/termtter +6 -0
  6. data/lib/plugins/addspace.rb +27 -0
  7. data/lib/plugins/april_fool.rb +15 -0
  8. data/lib/plugins/bomb.rb +39 -0
  9. data/lib/plugins/clear.rb +14 -0
  10. data/lib/plugins/command_plus.rb +47 -0
  11. data/lib/plugins/confirm.rb +33 -0
  12. data/lib/plugins/cool.rb +10 -0
  13. data/lib/plugins/countter.rb +23 -0
  14. data/lib/plugins/devel.rb +18 -0
  15. data/lib/plugins/direct_messages.rb +36 -0
  16. data/lib/plugins/en2ja.rb +11 -0
  17. data/lib/plugins/english.rb +25 -0
  18. data/lib/plugins/erb.rb +17 -0
  19. data/lib/plugins/exec.rb +17 -0
  20. data/lib/plugins/exec_and_update.rb +14 -0
  21. data/lib/plugins/expand-tinyurl.rb +34 -0
  22. data/lib/plugins/fib.rb +28 -0
  23. data/lib/plugins/fib_filter.rb +14 -0
  24. data/lib/plugins/filter.rb +69 -0
  25. data/lib/plugins/graduatter.rb +8 -0
  26. data/lib/plugins/grass.rb +27 -0
  27. data/lib/plugins/group.rb +64 -0
  28. data/lib/plugins/growl.rb +52 -0
  29. data/lib/plugins/growl2.rb +143 -0
  30. data/lib/plugins/hatebu.rb +59 -0
  31. data/lib/plugins/hatebu_and_update.rb +58 -0
  32. data/lib/plugins/history.rb +93 -0
  33. data/lib/plugins/ignore.rb +19 -0
  34. data/lib/plugins/keyword.rb +18 -0
  35. data/lib/plugins/l2.rb +25 -0
  36. data/lib/plugins/log.rb +73 -0
  37. data/lib/plugins/me.rb +10 -0
  38. data/lib/plugins/modify_arg_hook_sample.rb +7 -0
  39. data/lib/plugins/msagent.rb +38 -0
  40. data/lib/plugins/multi_reply.rb +27 -0
  41. data/lib/plugins/notify-send.rb +22 -0
  42. data/lib/plugins/notify-send2.rb +52 -0
  43. data/lib/plugins/notify-send3.rb +45 -0
  44. data/lib/plugins/open_url.rb +59 -0
  45. data/lib/plugins/otsune.rb +21 -0
  46. data/lib/plugins/outputz.rb +33 -0
  47. data/lib/plugins/pause.rb +3 -0
  48. data/lib/plugins/post_exec_hook_sample.rb +9 -0
  49. data/lib/plugins/pre_exec_hook_sample.rb +9 -0
  50. data/lib/plugins/primes.rb +30 -0
  51. data/lib/plugins/quicklook.rb +41 -0
  52. data/lib/plugins/random.rb +23 -0
  53. data/lib/plugins/reblog.rb +40 -0
  54. data/lib/plugins/reload.rb +3 -0
  55. data/lib/plugins/reply.rb +8 -0
  56. data/lib/plugins/retweet.rb +46 -0
  57. data/lib/plugins/reverse.rb +13 -0
  58. data/lib/plugins/say.rb +26 -0
  59. data/lib/plugins/scrape.rb +41 -0
  60. data/lib/plugins/screen-notify.rb +20 -0
  61. data/lib/plugins/screen.rb +24 -0
  62. data/lib/plugins/shell.rb +14 -0
  63. data/lib/plugins/sl.rb +48 -0
  64. data/lib/plugins/spam.rb +16 -0
  65. data/lib/plugins/standard_plugins.rb +525 -0
  66. data/lib/plugins/stdout.rb +220 -0
  67. data/lib/plugins/storage.rb +55 -0
  68. data/lib/plugins/storage/DB.rb +37 -0
  69. data/lib/plugins/storage/status.rb +83 -0
  70. data/lib/plugins/storage/status_mook.rb +30 -0
  71. data/lib/plugins/switch_user.rb +22 -0
  72. data/lib/plugins/system_status.rb +33 -0
  73. data/lib/plugins/timer.rb +18 -0
  74. data/lib/plugins/tinyurl.rb +20 -0
  75. data/lib/plugins/translation.rb +38 -0
  76. data/lib/plugins/typable_id.rb +94 -0
  77. data/lib/plugins/update_editor.rb +53 -0
  78. data/lib/plugins/uri-open.rb +66 -0
  79. data/lib/plugins/wassr_post.rb +22 -0
  80. data/lib/plugins/yhara.rb +148 -0
  81. data/lib/plugins/yhara_filter.rb +8 -0
  82. data/lib/plugins/yonda.rb +21 -0
  83. data/lib/termtter.rb +38 -0
  84. data/lib/termtter/api.rb +57 -0
  85. data/lib/termtter/client.rb +324 -0
  86. data/lib/termtter/command.rb +80 -0
  87. data/lib/termtter/config.rb +68 -0
  88. data/lib/termtter/config_setup.rb +38 -0
  89. data/lib/termtter/connection.rb +41 -0
  90. data/lib/termtter/hook.rb +31 -0
  91. data/lib/termtter/optparse.rb +14 -0
  92. data/lib/termtter/system_extensions.rb +115 -0
  93. data/lib/termtter/task.rb +17 -0
  94. data/lib/termtter/task_manager.rb +116 -0
  95. data/lib/termtter/version.rb +4 -0
  96. data/spec/plugins/cool_spec.rb +10 -0
  97. data/spec/plugins/english_spec.rb +19 -0
  98. data/spec/plugins/fib_spec.rb +15 -0
  99. data/spec/plugins/filter_spec.rb +18 -0
  100. data/spec/plugins/pause_spec.rb +8 -0
  101. data/spec/plugins/primes_spec.rb +15 -0
  102. data/spec/plugins/shell_spec.rb +10 -0
  103. data/spec/plugins/sl_spec.rb +8 -0
  104. data/spec/plugins/spam_spec.rb +4 -0
  105. data/spec/plugins/standard_plugins_spec.rb +23 -0
  106. data/spec/plugins/storage/DB_spec.rb +12 -0
  107. data/spec/plugins/storage/status_spec.rb +24 -0
  108. data/spec/spec_helper.rb +7 -0
  109. data/spec/termtter/client_spec.rb +255 -0
  110. data/spec/termtter/command_spec.rb +107 -0
  111. data/spec/termtter/config_spec.rb +111 -0
  112. data/spec/termtter/hook_spec.rb +78 -0
  113. data/spec/termtter/task_manager_spec.rb +78 -0
  114. data/spec/termtter/task_spec.rb +22 -0
  115. data/spec/termtter_spec.rb +29 -0
  116. data/test/friends_timeline.json +5 -0
  117. data/test/search.json +8 -0
  118. metadata +211 -0
@@ -0,0 +1,107 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require File.dirname(__FILE__) + '/../spec_helper'
4
+
5
+ module Termtter
6
+
7
+ describe Command do
8
+
9
+ before do
10
+ params = {
11
+ :name => 'update',
12
+ :aliases => ['u', 'up'],
13
+ :exec_proc => lambda {|arg| arg },
14
+ :completion_proc => lambda {|command, arg| ['complete1', 'complete2'] },
15
+ :help => ['update,u TEXT', 'test command']
16
+ }
17
+ @command = Command.new(params)
18
+ end
19
+
20
+ it 'should return command regex' do
21
+ @command.pattern.should == /^((update|u|up)|(update|u|up)\s+(.*?))\s*$/
22
+ end
23
+
24
+ it 'should be given name as String or Symbol' do
25
+ Command.new(:name => 'foo').name.should == :foo
26
+ Command.new(:name => :foo).name.should == :foo
27
+ end
28
+
29
+ it 'should return name' do
30
+ @command.name.should == :update
31
+ end
32
+
33
+ it 'should return aliases' do
34
+ @command.aliases.should == [:u, :up]
35
+ end
36
+
37
+ it 'should return commands' do
38
+ @command.commands.should == [:update, :u, :up]
39
+ end
40
+
41
+ it 'should return help' do
42
+ @command.help.should == ['update,u TEXT', 'test command']
43
+ end
44
+
45
+ it 'should return candidates for completion' do
46
+ # complement
47
+ [
48
+ ['upd', ['update']],
49
+ [' upd', []],
50
+ [' upd ', []],
51
+ ['update a', ['complete1', 'complete2']],
52
+ [' update ', []],
53
+ ['u foo', ['complete1', 'complete2']],
54
+ ].each do |input, comp|
55
+ @command.complement(input).should == comp
56
+ end
57
+ end
58
+
59
+ it 'should return command_info when call method "match?"' do
60
+ [
61
+ ['update', true],
62
+ ['up', true],
63
+ ['u', true],
64
+ ['update ', true],
65
+ [' update ', false],
66
+ ['update foo', true],
67
+ [' update foo', false],
68
+ [' update foo ', false],
69
+ ['u foo', true],
70
+ ['up foo', true],
71
+ ['upd foo', false],
72
+ ['upd foo', false],
73
+ ].each do |input, result|
74
+ @command.match?(input).should == result
75
+ end
76
+ end
77
+
78
+ it 'should raise ArgumentError when constructor arguments are deficient' do
79
+ lambda { Command.new }.should raise_error(ArgumentError)
80
+ lambda { Command.new(:exec_proc => lambda {|args|}) }.should raise_error(ArgumentError)
81
+ lambda { Command.new(:aliases => ['u']) }.should raise_error(ArgumentError)
82
+ end
83
+
84
+ it 'should call exec_proc when call method "call"' do
85
+ @command.call('foo', 'test', 'foo test').should == 'test'
86
+ @command.call('foo', ' test', 'foo test').should == ' test'
87
+ @command.call('foo', ' test ', 'foo test ').should == ' test '
88
+ @command.call('foo', 'test test', 'foo test test').should == 'test test'
89
+ end
90
+
91
+ it 'should raise ArgumentError at call' do
92
+ lambda { @command.call('foo', nil, 'foo') }.should_not raise_error(ArgumentError)
93
+ lambda { @command.call('foo', 'foo', 'foo') }.should_not raise_error(ArgumentError)
94
+ lambda { @command.call('foo', false, 'foo') }.should raise_error(ArgumentError)
95
+ lambda { @command.call('foo', Array.new, 'foo') }.should raise_error(ArgumentError)
96
+ end
97
+
98
+ it 'split command line' do
99
+ Command.split_command_line('test foo bar').should == ['test', 'foo bar']
100
+ Command.split_command_line('test foo bar').should == ['test', 'foo bar']
101
+ Command.split_command_line('test foo bar').should == ['test', 'foo bar']
102
+ Command.split_command_line(' test foo bar').should == ['test', 'foo bar']
103
+ Command.split_command_line(' test foo bar ').should == ['test', 'foo bar']
104
+ end
105
+ end
106
+ end
107
+
@@ -0,0 +1,111 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require File.dirname(__FILE__) + '/../spec_helper'
4
+
5
+ module Termtter
6
+ describe Config do
7
+ before do
8
+ @config = Config.new
9
+ end
10
+
11
+ it 'should be able to store value to new storage' do
12
+ @config.new_storage = :value
13
+ @config.new_storage.should == :value
14
+ end
15
+
16
+ it 'should be able to make subb.key and store value' do
17
+ @config.subb.key = :value
18
+ @config.subb.key.should == :value
19
+ end
20
+
21
+ it 'should be able to make multiple storage' do
22
+ @config.subb.more.for.test = 'value'
23
+ @config.subb.more.for.test.should == 'value'
24
+ end
25
+
26
+ it 'should be able to change value in storage' do
27
+ @config.storage = :value1
28
+ @config.storage = :value2
29
+ @config.storage.should == :value2
30
+ end
31
+
32
+ it 'should be able to store any data' do
33
+ [
34
+ ['string', 'value' ],
35
+ ['symbol', :value ],
36
+ ['arrry', [:a, :b] ],
37
+ ['hashes', {:a => :b}],
38
+ ['integer', 1 ],
39
+ ['float', 1.5 ],
40
+ ['regexp', /regexp/ ],
41
+ ].each do |type, value|
42
+ @config.__send__("#{type}=", value)
43
+ @config.__send__(type).should == value
44
+ end
45
+ end
46
+
47
+ it 'should raise error when add by prohibited name' do
48
+ lambda {
49
+ @config.set_default('sub.aaa', :value)
50
+ @config.sub.aaa
51
+ }.should raise_error
52
+ end
53
+
54
+ it 'should raise error when add subb-storage to existed key' do
55
+ @config.subb = 'original value'
56
+ lambda {
57
+ @config.subb.key = 'invalid subbstitution'
58
+ }.should raise_error(
59
+ NoMethodError,
60
+ %r[undefined method `key=' for "original value":String]
61
+ )
62
+ end
63
+
64
+ it 'should set intermediate defult configs' do
65
+ @config.set_default 'subb.more', 'value'
66
+ @config.subb.class.should == Config
67
+ @config.subb.more.should == 'value'
68
+
69
+ @config.proxy.set_default(:port, 'value')
70
+ @config.proxy.port.should == 'value'
71
+ end
72
+
73
+ # FIXME: not work
74
+ # it 'should have :undefined value in un-assigned key' do
75
+ # @config.aaaa.should == :undefined
76
+ # end
77
+
78
+ it 'should be empty when something is assigned' do
79
+ @config.empty?.should be_true
80
+
81
+ @config.aaa = 1
82
+ @config.empty?.should be_false
83
+
84
+ @config.bbb.empty?.should be_true
85
+ end
86
+
87
+ it 'should be empty when assigned nil' do
88
+ @config.bbb = nil
89
+ @config.empty?.should be_false
90
+ end
91
+
92
+ it 'should be empty when set_defaulted' do
93
+ @config.set_default('aaa', 1)
94
+ @config.empty?.should be_false
95
+ end
96
+
97
+ it 'should use in expression' do
98
+ @config.set_default(:ssb, 'hoge')
99
+ lambda {
100
+ res = @config.ssb + ' piyo'
101
+ res.should == 'hoge piyo'
102
+ }.should_not raise_error
103
+ end
104
+
105
+ it 'should not change value when call set_default twice' do
106
+ @config.plugins.set_default :only, 'before_value'
107
+ @config.plugins.set_default :only, 'after_value'
108
+ @config.plugins.only.should == 'before_value'
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,78 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require File.dirname(__FILE__) + '/../spec_helper'
4
+
5
+ module Termtter
6
+ describe Hook do
7
+ before do
8
+ end
9
+
10
+ it 'should match' do
11
+ hook = Hook.new(
12
+ :name => :spam,
13
+ :points => ['foo'],
14
+ :exec_proc => lambda{|cmd, arg|
15
+ }
16
+ )
17
+ hook.match?('foo').should == true
18
+ hook.match?('bar').should == false
19
+ hook.match?(:foo).should == true
20
+ hook.match?(:bar).should == false
21
+ end
22
+
23
+ it 'should match when multi points' do
24
+ hook = Hook.new(
25
+ :name => :spam,
26
+ :points => ['foo', 'bar'],
27
+ :exec_proc => lambda{|cmd, arg|
28
+ }
29
+ )
30
+ hook.match?('foo').should == true
31
+ hook.match?('bar').should == true
32
+ hook.match?(:foo).should == true
33
+ hook.match?(:bar).should == true
34
+ end
35
+
36
+ it 'should match when multi points' do
37
+ hook = Hook.new(
38
+ :name => :spam,
39
+ :points => ['foo', /bar/],
40
+ :exec_proc => lambda{|cmd, arg|
41
+ }
42
+ )
43
+ hook.match?('foo').should == true
44
+ hook.match?('bar').should == true
45
+ hook.match?('_bar_').should == true
46
+ hook.match?(:foo).should == true
47
+ hook.match?(:_bar_).should == true
48
+ end
49
+
50
+ it 'should match when multi points' do
51
+ hook = Hook.new(
52
+ :name => :spam,
53
+ :points => ['foo', /^bar/],
54
+ :exec_proc => lambda{|cmd, arg|
55
+ }
56
+ )
57
+ hook.match?('bar').should == true
58
+ hook.match?('bar_').should == true
59
+ hook.match?('_bar_').should == false
60
+ hook.match?(:'bar').should == true
61
+ hook.match?(:'bar_').should == true
62
+ hook.match?(:'_bar_').should == false
63
+ end
64
+
65
+ it 'call hook proc' do
66
+ proc_args = nil
67
+ hook = Hook.new(
68
+ :name => :spam,
69
+ :points => ['foo'],
70
+ :exec_proc => lambda{|*args|
71
+ proc_args = args
72
+ }
73
+ )
74
+ hook.call('foo', 'bar')
75
+ proc_args.should == ['foo', 'bar']
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,78 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require File.dirname(__FILE__) + '/../spec_helper'
4
+ require 'termtter/task'
5
+ require 'termtter/task_manager'
6
+
7
+ module Termtter
8
+ describe TaskManager do
9
+ before do
10
+ @task_manager = TaskManager.new
11
+ end
12
+
13
+ it 'should able to add tasks' do
14
+ @task_manager.add_task() {}
15
+ @task_manager.add_task(:after => 10) {}
16
+ @task_manager.instance_eval('@tasks').size.should == 2
17
+ end
18
+
19
+ it 'should return due_tasks' do
20
+ time_now = Time.now
21
+ Time.stub!(:now).and_return(time_now)
22
+
23
+ @task_manager.add_task() {}
24
+ @task_manager.add_task(:after => 10) {}
25
+
26
+ due_tasks = @task_manager.instance_eval('pull_due_tasks')
27
+ due_tasks.size.should == 1
28
+ end
29
+
30
+ it 'should run tasks' do
31
+ time_now = Time.now
32
+ Time.stub!(:now).and_return(time_now)
33
+
34
+ task1_called = false
35
+ task2_called = false
36
+ @task_manager.add_task() {task1_called = true}
37
+ @task_manager.add_task(:after => 10) {task2_called = true}
38
+
39
+ task1_called.should == false
40
+ task2_called.should == false
41
+ @task_manager.instance_eval('@tasks').size.should == 2
42
+
43
+ @task_manager.step
44
+ task1_called.should == true
45
+ task2_called.should == false
46
+ @task_manager.instance_eval('@tasks').size.should == 1
47
+
48
+ Time.stub!(:now).and_return(time_now + 10)
49
+ @task_manager.step
50
+ task2_called.should == true
51
+ @task_manager.instance_eval('@tasks').size.should == 0
52
+ end
53
+
54
+ it 'should run repeat tasks' do
55
+ time_now = Time.now
56
+ Time.stub!(:now).and_return(time_now)
57
+
58
+ called_count = 0
59
+ @task_manager.add_task(:interval => 10) {called_count += 1}
60
+ @task_manager.step
61
+
62
+ called_count.should == 1
63
+ @task_manager.instance_eval('@tasks').size.should == 1
64
+
65
+ Time.stub!(:now).and_return(time_now + 10)
66
+ @task_manager.step
67
+ called_count.should == 2
68
+ @task_manager.instance_eval('@tasks').size.should == 1
69
+ end
70
+
71
+ it 'should add task with :name' do
72
+ @task_manager.add_task(:name => 'foo')
73
+ @task_manager.get_task('foo').name.should == 'foo'
74
+ @task_manager.delete_task('foo')
75
+ @task_manager.get_task('foo').should == nil
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,22 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require File.dirname(__FILE__) + '/../spec_helper'
4
+ require 'termtter/task'
5
+
6
+ module Termtter
7
+ describe Task do
8
+
9
+ it 'should be instantiate' do
10
+ time_now = Time.now
11
+ Time.stub!(:now).and_return(time_now)
12
+
13
+ task = Task.new() do
14
+ end
15
+ task.exec_at.should == time_now
16
+
17
+ task = Task.new(:after => 10) do
18
+ end
19
+ task.exec_at.should == (time_now + 10)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,29 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require File.dirname(__FILE__) + '/spec_helper'
4
+
5
+ describe Termtter, 'when plugin is called (without init option)' do
6
+ it 'should require global plugin if exist' do
7
+ should_receive(:load).with('plugins/aaa.rb')
8
+ plugin 'aaa'
9
+ end
10
+
11
+ it 'should require user plugin if not exist' do
12
+ should_receive(:load).with('plugins/aaa.rb')
13
+ plugin 'aaa'
14
+ end
15
+
16
+ it 'should handle_error if there are no plugins in global or user' do
17
+ Termtter::Client.should_receive(:handle_error)
18
+ plugin 'not-exist-plugin-hehehehehehe'
19
+ end
20
+ end
21
+
22
+ describe Termtter, 'when plugin is called (with init option)' do
23
+ it 'init option will become config' do
24
+ should_receive(:load)
25
+
26
+ plugin 'aaa', :bbb => :ccc
27
+ config.plugins.aaa.bbb.should == :ccc
28
+ end
29
+ end
@@ -0,0 +1,5 @@
1
+ [
2
+ {"in_reply_to_user_id":null,"truncated":false,"created_at":"Sat Jan 03 12:13:45 +0000 2009","user":{"description":"test2 xxxx","followers_count":102,"profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/000\/102.png","url":"http:\/\/twitter.com/test2","name":"Test User 2","protected":false,"screen_name":"test2","location":"Tokyo2","id":102},"favorited":false,"in_reply_to_screen_name":null,"text":"texttext 2","id":10002,"in_reply_to_status_id":null,"source":"<a href=\"http:\/\/ssss2\">ssss2<\/a>"},
3
+ {"in_reply_to_user_id":null,"truncated":false,"created_at":"Sat Jan 03 12:13:45 +0000 2009","user":{"description":"test1 xxxx","followers_count":101,"profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/000\/101.png","url":"http:\/\/twitter.com/test1","name":"Test User 1","protected":false,"screen_name":"test1","location":"Tokyo1","id":101},"favorited":false,"in_reply_to_screen_name":null,"text":"texttext 1","id":10001,"in_reply_to_status_id":null,"source":"<a href=\"http:\/\/ssss1\">ssss1<\/a>"},
4
+ {"in_reply_to_user_id":null,"truncated":false,"created_at":"Sat Jan 03 12:13:45 +0000 2009","user":{"description":"test0 xxxx","followers_count":100,"profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/000\/100.png","url":"http:\/\/twitter.com/test0","name":"Test User 0","protected":false,"screen_name":"test0","location":"Tokyo0","id":100},"favorited":false,"in_reply_to_screen_name":null,"text":"texttext 0","id":10000,"in_reply_to_status_id":null,"source":"<a href=\"http:\/\/ssss0\">ssss0<\/a>"}
5
+ ]
data/test/search.json ADDED
@@ -0,0 +1,8 @@
1
+ {
2
+ "results":[
3
+ {"text":"texttext 2","to_user_id":202,"to_user":"to_user2","from_user":"test2","id":10002,"from_user_id":102,"iso_language_code":"en","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/xxx\/102.jpg","created_at":"Sat, 03 Jan 2009 12:49:09 +0000"},
4
+ {"text":"texttext 1","to_user_id":101,"to_user":"to_user1","from_user":"test1","id":10001,"from_user_id":101,"iso_language_code":"en","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/xxx\/101.jpg","created_at":"Sat, 03 Jan 2009 12:49:09 +0000"},
5
+ {"text":"texttext 0","to_user_id":100,"to_user":"to_user0","from_user":"test0","id":10000,"from_user_id":100,"iso_language_code":"en","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/xxx\/100.jpg","created_at":"Sat, 03 Jan 2009 12:49:09 +0000"}
6
+ ],
7
+ "since_id":0,"max_id":1093328763,"refresh_url":"?since_id=1093328763&q=ruby","results_per_page":15,"next_page":"?page=2&max_id=1093328763&q=ruby","completed_in":0.019603,"page":1,"query":"ruby"
8
+ }