twterm 1.3.0 → 2.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +14 -18
  3. data/bin/twterm +1 -1
  4. data/lib/twterm/app.rb +120 -30
  5. data/lib/twterm/client.rb +10 -13
  6. data/lib/twterm/completion_mamanger.rb +11 -6
  7. data/lib/twterm/direct_message.rb +6 -28
  8. data/lib/twterm/direct_message_composer.rb +10 -5
  9. data/lib/twterm/direct_message_manager.rb +5 -6
  10. data/lib/twterm/event/notification/abstract_notification.rb +27 -0
  11. data/lib/twterm/event/notification/error.rb +13 -0
  12. data/lib/twterm/event/notification/info.rb +13 -0
  13. data/lib/twterm/event/notification/success.rb +13 -0
  14. data/lib/twterm/event/notification/warning.rb +13 -0
  15. data/lib/twterm/event_dispatcher.rb +1 -1
  16. data/lib/twterm/extensions/array.rb +5 -0
  17. data/lib/twterm/extensions/enumerator/lazy.rb +3 -0
  18. data/lib/twterm/extensions/string.rb +0 -4
  19. data/lib/twterm/friendship.rb +1 -85
  20. data/lib/twterm/image/between.rb +31 -0
  21. data/lib/twterm/image/blank_line.rb +21 -0
  22. data/lib/twterm/image/bold.rb +31 -0
  23. data/lib/twterm/image/brackets.rb +21 -0
  24. data/lib/twterm/image/color.rb +45 -0
  25. data/lib/twterm/image/empty.rb +21 -0
  26. data/lib/twterm/image/horizontal_sequential_image.rb +48 -0
  27. data/lib/twterm/image/parens.rb +21 -0
  28. data/lib/twterm/image/string_image.rb +38 -0
  29. data/lib/twterm/image/vertical_sequential_image.rb +43 -0
  30. data/lib/twterm/image.rb +107 -0
  31. data/lib/twterm/key_mapper/abstract_key_mapper.rb +51 -0
  32. data/lib/twterm/key_mapper/app_key_mapper.rb +13 -0
  33. data/lib/twterm/key_mapper/cursor_key_mapper.rb +13 -0
  34. data/lib/twterm/key_mapper/general_key_mapper.rb +18 -0
  35. data/lib/twterm/key_mapper/no_such_command.rb +20 -0
  36. data/lib/twterm/key_mapper/no_such_key.rb +16 -0
  37. data/lib/twterm/key_mapper/status_key_mapper.rb +18 -0
  38. data/lib/twterm/key_mapper/tab_key_mapper.rb +31 -0
  39. data/lib/twterm/key_mapper.rb +127 -0
  40. data/lib/twterm/list.rb +0 -31
  41. data/lib/twterm/notifier.rb +7 -7
  42. data/lib/twterm/repository/abstract_entity_repository.rb +41 -0
  43. data/lib/twterm/repository/abstract_expirable_entity_repository.rb +35 -0
  44. data/lib/twterm/repository/abstract_repository.rb +64 -0
  45. data/lib/twterm/repository/direct_message_repository.rb +14 -0
  46. data/lib/twterm/repository/friendship_repository.rb +108 -0
  47. data/lib/twterm/repository/hashtag_repository.rb +39 -0
  48. data/lib/twterm/repository/list_repository.rb +14 -0
  49. data/lib/twterm/repository/status_repository.rb +36 -0
  50. data/lib/twterm/repository/user_repository.rb +22 -0
  51. data/lib/twterm/rest_client.rb +107 -63
  52. data/lib/twterm/screen.rb +21 -15
  53. data/lib/twterm/search_query_window.rb +139 -0
  54. data/lib/twterm/status.rb +14 -108
  55. data/lib/twterm/streaming_client.rb +13 -12
  56. data/lib/twterm/tab/base.rb +48 -8
  57. data/lib/twterm/tab/direct_message/conversation.rb +53 -52
  58. data/lib/twterm/tab/direct_message/conversation_list.rb +46 -45
  59. data/lib/twterm/tab/dumpable.rb +3 -3
  60. data/lib/twterm/tab/key_assignments_cheatsheet.rb +58 -57
  61. data/lib/twterm/tab/loadable.rb +20 -0
  62. data/lib/twterm/tab/new/list.rb +32 -43
  63. data/lib/twterm/tab/new/search.rb +31 -44
  64. data/lib/twterm/tab/new/start.rb +44 -55
  65. data/lib/twterm/tab/new/user.rb +15 -12
  66. data/lib/twterm/tab/rate_limit_status.rb +84 -0
  67. data/lib/twterm/tab/scrollable.rb +39 -19
  68. data/lib/twterm/tab/searchable.rb +133 -0
  69. data/lib/twterm/tab/statuses/base.rb +139 -129
  70. data/lib/twterm/tab/statuses/conversation.rb +26 -15
  71. data/lib/twterm/tab/statuses/favorites.rb +10 -8
  72. data/lib/twterm/tab/statuses/home.rb +10 -9
  73. data/lib/twterm/tab/statuses/list_timeline.rb +12 -8
  74. data/lib/twterm/tab/statuses/mentions.rb +17 -11
  75. data/lib/twterm/tab/statuses/search.rb +8 -5
  76. data/lib/twterm/tab/statuses/user_timeline.rb +11 -8
  77. data/lib/twterm/tab/user_list_management.rb +109 -0
  78. data/lib/twterm/tab/user_tab.rb +125 -126
  79. data/lib/twterm/tab/users/base.rb +39 -41
  80. data/lib/twterm/tab/users/followers.rb +9 -6
  81. data/lib/twterm/tab/users/friends.rb +9 -6
  82. data/lib/twterm/tab_manager.rb +64 -40
  83. data/lib/twterm/tweetbox.rb +18 -13
  84. data/lib/twterm/uri_opener.rb +2 -1
  85. data/lib/twterm/user.rb +2 -110
  86. data/lib/twterm/version.rb +1 -1
  87. data/lib/twterm/view.rb +30 -0
  88. data/lib/twterm.rb +3 -9
  89. data/spec/fixtures/status.json +107 -0
  90. data/spec/fixtures/user.json +102 -0
  91. data/spec/spec_helper.rb +7 -0
  92. data/spec/supports/shared_examples/abstract_key_mapper.rb +17 -0
  93. data/spec/twterm/extension/enumerator/lazy_spec.rb +11 -0
  94. data/spec/twterm/friendship_spec.rb +0 -102
  95. data/spec/twterm/image/blank_line_spec.rb +11 -0
  96. data/spec/twterm/image/brackets_spec.rb +12 -0
  97. data/spec/twterm/image/color_spec.rb +22 -0
  98. data/spec/twterm/image/empry_spec.rb +11 -0
  99. data/spec/twterm/image/horizontal_sequential_image_spec.rb +15 -0
  100. data/spec/twterm/image/parens_spec.rb +12 -0
  101. data/spec/twterm/image/string_image_spec.rb +12 -0
  102. data/spec/twterm/image/vertical_sequential_image_spec.rb +14 -0
  103. data/spec/twterm/image_spec.rb +65 -0
  104. data/spec/twterm/key_mapper/abstract_key_mapper_spec.rb +21 -0
  105. data/spec/twterm/key_mapper/app_key_mapper_spec.rb +7 -0
  106. data/spec/twterm/key_mapper/status_key_mapper_spec.rb +7 -0
  107. data/spec/twterm/key_mapper/tab_key_mapper_spec.rb +7 -0
  108. data/spec/twterm/repository/friendship_repository_spec.rb +108 -0
  109. data/spec/twterm/status_spec.rb +58 -0
  110. data/spec/twterm/user_spec.rb +94 -0
  111. data/twterm.gemspec +13 -10
  112. metadata +129 -35
  113. data/lib/twterm/event/notification.rb +0 -33
  114. data/lib/twterm/extensions/integer.rb +0 -5
  115. data/lib/twterm/filter_query_window.rb +0 -91
  116. data/lib/twterm/filterable_list.rb +0 -41
  117. data/lib/twterm/history/base.rb +0 -21
  118. data/lib/twterm/history/hashtag.rb +0 -13
  119. data/lib/twterm/history/savable.rb +0 -37
  120. data/lib/twterm/history/screen_name.rb +0 -11
  121. data/lib/twterm/promise.rb +0 -143
@@ -0,0 +1,94 @@
1
+ require 'twterm/user'
2
+
3
+ RSpec.describe Twterm::User do
4
+ let(:user) { described_class.new(Twitter::User.new(json)) }
5
+ let(:json) { JSON.parse(fixture('user.json'), symbolize_names: true) }
6
+
7
+ describe '#update!' do
8
+ subject { -> { user.update!(Hashie::Mash.new(params)) } }
9
+
10
+ before do
11
+ user.update!(Hashie::Mash.new(
12
+ name: 'Alice',
13
+ screen_name: 'alice',
14
+ description: 'Hi! I am Alice.',
15
+ location: 'Tokyo',
16
+ website: 'http://example.com',
17
+ protected?: false,
18
+ statuses_count: 0,
19
+ favorites_count: 0,
20
+ friends_count: 0,
21
+ followers_count: 0,
22
+ verified?: false,
23
+ ))
24
+ end
25
+
26
+ context 'when updating name' do
27
+ let(:params) { { name: 'Bob' } }
28
+
29
+ it { is_expected.to change { user.name }.from('Alice').to('Bob') }
30
+ end
31
+
32
+ context 'when updating screen_name' do
33
+ let(:params) { { screen_name: 'bob' } }
34
+
35
+ it { is_expected.to change { user.screen_name }.from('alice').to('bob') }
36
+ end
37
+
38
+ context 'when updating description' do
39
+ let(:params) { { description: 'Hi! I am Bob.' } }
40
+
41
+ it { is_expected.to change { user.description }.from('Hi! I am Alice.').to('Hi! I am Bob.') }
42
+ end
43
+
44
+ context 'when updating location' do
45
+ context 'when location is empty' do
46
+ let(:params) { { location: Twitter::NullObject.new } }
47
+
48
+ it { is_expected.to change { user.location }.from('Tokyo').to('') }
49
+ end
50
+
51
+ context 'when location is present' do
52
+ let(:params) { { location: 'New York' } }
53
+
54
+ it { is_expected.to change { user.location }.from('Tokyo').to('New York') }
55
+ end
56
+ end
57
+
58
+ context 'when updating website' do
59
+ let(:params) { { website: 'https://example.com' } }
60
+
61
+ it { is_expected.to change { user.website }.from('http://example.com').to('https://example.com') }
62
+ end
63
+
64
+ context 'when updating protected' do
65
+ let(:params) { { protected?: true } }
66
+
67
+ it { is_expected.to change { user.protected? }.from(false).to(true) }
68
+ end
69
+
70
+ context 'when updating statuses_count' do
71
+ let(:params) { { statuses_count: 42 } }
72
+
73
+ it { is_expected.to change { user.statuses_count }.from(0).to(42) }
74
+ end
75
+
76
+ context 'when updating favorites_count' do
77
+ let(:params) { { favorites_count: 42 } }
78
+
79
+ it { is_expected.to change { user.favorites_count }.from(0).to(42) }
80
+ end
81
+
82
+ context 'when updating followers_count' do
83
+ let(:params) { { followers_count: 42 } }
84
+
85
+ it { is_expected.to change { user.followers_count }.from(0).to(42) }
86
+ end
87
+
88
+ context 'when updating verified' do
89
+ let(:params) { { verified?: true } }
90
+
91
+ it { is_expected.to change { user.verified? }.from(false).to(true) }
92
+ end
93
+ end
94
+ end
data/twterm.gemspec CHANGED
@@ -8,23 +8,26 @@ Gem::Specification.new do |spec|
8
8
  spec.authors = ['Ryota Kameoka']
9
9
  spec.email = ['kameoka.ryota@gmail.com']
10
10
 
11
- spec.summary = 'A full-featured CLI Twitter client'
12
- spec.description = 'A full-featured CLI Twitter client'
11
+ spec.summary = 'A full-featured TUI Twitter client'
12
+ spec.description = 'A full-featured TUI Twitter client'
13
13
  spec.homepage = 'http://twterm.ryota-ka.me/'
14
14
  spec.license = 'MIT'
15
15
 
16
16
  spec.files = `git ls-files -z`.split("\x0").reject { |i| i == 'Gemfile.lock' }
17
17
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
18
  spec.require_paths = ['lib']
19
- spec.required_ruby_version = '>= 2.0.0'
19
+ spec.required_ruby_version = '>= 2.1.0'
20
20
 
21
- spec.add_dependency 'curses', '>= 1.0.1'
22
- spec.add_dependency 'launchy', '>= 2.4.3'
23
- spec.add_dependency 'oauth', '>= 0.4.7'
24
- spec.add_dependency 'twitter', '~> 6.0.0'
25
- spec.add_dependency 'twitter-text', '1.14.0'
21
+ spec.add_dependency 'curses', '~> 1.2.2'
22
+ spec.add_dependency 'concurrent-ruby', '~> 1.0.5'
23
+ spec.add_dependency 'launchy', '~> 2.4.3'
24
+ spec.add_dependency 'oauth', '~> 0.5.1'
25
+ spec.add_dependency 'toml-rb', '~> 0.3.14'
26
+ spec.add_dependency 'twitter', '~> 6.1.0'
27
+ spec.add_dependency 'twitter-text', '~> 1.14.0'
26
28
 
27
29
  spec.add_development_dependency 'bundler', '~> 1.8'
28
- spec.add_development_dependency 'rake', '~> 10.0'
29
- spec.add_development_dependency 'rspec', '~> 3.2.0'
30
+ spec.add_development_dependency 'hashie', '~> 3.5.6'
31
+ spec.add_development_dependency 'rake', '~> 12.0'
32
+ spec.add_development_dependency 'rspec', '~> 3.5.0'
30
33
  end
metadata CHANGED
@@ -1,83 +1,111 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: twterm
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 2.0.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryota Kameoka
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-31 00:00:00.000000000 Z
11
+ date: 2017-07-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: curses
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.0.1
19
+ version: 1.2.2
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.0.1
26
+ version: 1.2.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: concurrent-ruby
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 1.0.5
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 1.0.5
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: launchy
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
- - - ">="
45
+ - - "~>"
32
46
  - !ruby/object:Gem::Version
33
47
  version: 2.4.3
34
48
  type: :runtime
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
- - - ">="
52
+ - - "~>"
39
53
  - !ruby/object:Gem::Version
40
54
  version: 2.4.3
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: oauth
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
- - - ">="
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.5.1
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.5.1
69
+ - !ruby/object:Gem::Dependency
70
+ name: toml-rb
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
46
74
  - !ruby/object:Gem::Version
47
- version: 0.4.7
75
+ version: 0.3.14
48
76
  type: :runtime
49
77
  prerelease: false
50
78
  version_requirements: !ruby/object:Gem::Requirement
51
79
  requirements:
52
- - - ">="
80
+ - - "~>"
53
81
  - !ruby/object:Gem::Version
54
- version: 0.4.7
82
+ version: 0.3.14
55
83
  - !ruby/object:Gem::Dependency
56
84
  name: twitter
57
85
  requirement: !ruby/object:Gem::Requirement
58
86
  requirements:
59
87
  - - "~>"
60
88
  - !ruby/object:Gem::Version
61
- version: 6.0.0
89
+ version: 6.1.0
62
90
  type: :runtime
63
91
  prerelease: false
64
92
  version_requirements: !ruby/object:Gem::Requirement
65
93
  requirements:
66
94
  - - "~>"
67
95
  - !ruby/object:Gem::Version
68
- version: 6.0.0
96
+ version: 6.1.0
69
97
  - !ruby/object:Gem::Dependency
70
98
  name: twitter-text
71
99
  requirement: !ruby/object:Gem::Requirement
72
100
  requirements:
73
- - - '='
101
+ - - "~>"
74
102
  - !ruby/object:Gem::Version
75
103
  version: 1.14.0
76
104
  type: :runtime
77
105
  prerelease: false
78
106
  version_requirements: !ruby/object:Gem::Requirement
79
107
  requirements:
80
- - - '='
108
+ - - "~>"
81
109
  - !ruby/object:Gem::Version
82
110
  version: 1.14.0
83
111
  - !ruby/object:Gem::Dependency
@@ -94,35 +122,49 @@ dependencies:
94
122
  - - "~>"
95
123
  - !ruby/object:Gem::Version
96
124
  version: '1.8'
125
+ - !ruby/object:Gem::Dependency
126
+ name: hashie
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 3.5.6
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: 3.5.6
97
139
  - !ruby/object:Gem::Dependency
98
140
  name: rake
99
141
  requirement: !ruby/object:Gem::Requirement
100
142
  requirements:
101
143
  - - "~>"
102
144
  - !ruby/object:Gem::Version
103
- version: '10.0'
145
+ version: '12.0'
104
146
  type: :development
105
147
  prerelease: false
106
148
  version_requirements: !ruby/object:Gem::Requirement
107
149
  requirements:
108
150
  - - "~>"
109
151
  - !ruby/object:Gem::Version
110
- version: '10.0'
152
+ version: '12.0'
111
153
  - !ruby/object:Gem::Dependency
112
154
  name: rspec
113
155
  requirement: !ruby/object:Gem::Requirement
114
156
  requirements:
115
157
  - - "~>"
116
158
  - !ruby/object:Gem::Version
117
- version: 3.2.0
159
+ version: 3.5.0
118
160
  type: :development
119
161
  prerelease: false
120
162
  version_requirements: !ruby/object:Gem::Requirement
121
163
  requirements:
122
164
  - - "~>"
123
165
  - !ruby/object:Gem::Version
124
- version: 3.2.0
125
- description: A full-featured CLI Twitter client
166
+ version: 3.5.0
167
+ description: A full-featured TUI Twitter client
126
168
  email:
127
169
  - kameoka.ryota@gmail.com
128
170
  executables:
@@ -152,7 +194,11 @@ files:
152
194
  - lib/twterm/event/direct_message/fetched.rb
153
195
  - lib/twterm/event/favorite.rb
154
196
  - lib/twterm/event/follow.rb
155
- - lib/twterm/event/notification.rb
197
+ - lib/twterm/event/notification/abstract_notification.rb
198
+ - lib/twterm/event/notification/error.rb
199
+ - lib/twterm/event/notification/info.rb
200
+ - lib/twterm/event/notification/success.rb
201
+ - lib/twterm/event/notification/warning.rb
156
202
  - lib/twterm/event/open_uri.rb
157
203
  - lib/twterm/event/screen/resize.rb
158
204
  - lib/twterm/event/status/base.rb
@@ -160,24 +206,47 @@ files:
160
206
  - lib/twterm/event/status/mention.rb
161
207
  - lib/twterm/event/status/timeline.rb
162
208
  - lib/twterm/event_dispatcher.rb
209
+ - lib/twterm/extensions/array.rb
163
210
  - lib/twterm/extensions/curses/window.rb
164
211
  - lib/twterm/extensions/enumerator/lazy.rb
165
- - lib/twterm/extensions/integer.rb
166
212
  - lib/twterm/extensions/string.rb
167
- - lib/twterm/filter_query_window.rb
168
- - lib/twterm/filterable_list.rb
169
213
  - lib/twterm/friendship.rb
170
- - lib/twterm/history/base.rb
171
- - lib/twterm/history/hashtag.rb
172
- - lib/twterm/history/savable.rb
173
- - lib/twterm/history/screen_name.rb
214
+ - lib/twterm/image.rb
215
+ - lib/twterm/image/between.rb
216
+ - lib/twterm/image/blank_line.rb
217
+ - lib/twterm/image/bold.rb
218
+ - lib/twterm/image/brackets.rb
219
+ - lib/twterm/image/color.rb
220
+ - lib/twterm/image/empty.rb
221
+ - lib/twterm/image/horizontal_sequential_image.rb
222
+ - lib/twterm/image/parens.rb
223
+ - lib/twterm/image/string_image.rb
224
+ - lib/twterm/image/vertical_sequential_image.rb
225
+ - lib/twterm/key_mapper.rb
226
+ - lib/twterm/key_mapper/abstract_key_mapper.rb
227
+ - lib/twterm/key_mapper/app_key_mapper.rb
228
+ - lib/twterm/key_mapper/cursor_key_mapper.rb
229
+ - lib/twterm/key_mapper/general_key_mapper.rb
230
+ - lib/twterm/key_mapper/no_such_command.rb
231
+ - lib/twterm/key_mapper/no_such_key.rb
232
+ - lib/twterm/key_mapper/status_key_mapper.rb
233
+ - lib/twterm/key_mapper/tab_key_mapper.rb
174
234
  - lib/twterm/list.rb
175
235
  - lib/twterm/notifier.rb
176
- - lib/twterm/promise.rb
177
236
  - lib/twterm/publisher.rb
237
+ - lib/twterm/repository/abstract_entity_repository.rb
238
+ - lib/twterm/repository/abstract_expirable_entity_repository.rb
239
+ - lib/twterm/repository/abstract_repository.rb
240
+ - lib/twterm/repository/direct_message_repository.rb
241
+ - lib/twterm/repository/friendship_repository.rb
242
+ - lib/twterm/repository/hashtag_repository.rb
243
+ - lib/twterm/repository/list_repository.rb
244
+ - lib/twterm/repository/status_repository.rb
245
+ - lib/twterm/repository/user_repository.rb
178
246
  - lib/twterm/rest_client.rb
179
247
  - lib/twterm/scheduler.rb
180
248
  - lib/twterm/screen.rb
249
+ - lib/twterm/search_query_window.rb
181
250
  - lib/twterm/status.rb
182
251
  - lib/twterm/streaming_client.rb
183
252
  - lib/twterm/subscriber.rb
@@ -188,11 +257,14 @@ files:
188
257
  - lib/twterm/tab/exceptions.rb
189
258
  - lib/twterm/tab/favorites.rb
190
259
  - lib/twterm/tab/key_assignments_cheatsheet.rb
260
+ - lib/twterm/tab/loadable.rb
191
261
  - lib/twterm/tab/new/list.rb
192
262
  - lib/twterm/tab/new/search.rb
193
263
  - lib/twterm/tab/new/start.rb
194
264
  - lib/twterm/tab/new/user.rb
265
+ - lib/twterm/tab/rate_limit_status.rb
195
266
  - lib/twterm/tab/scrollable.rb
267
+ - lib/twterm/tab/searchable.rb
196
268
  - lib/twterm/tab/statuses/base.rb
197
269
  - lib/twterm/tab/statuses/conversation.rb
198
270
  - lib/twterm/tab/statuses/favorites.rb
@@ -201,6 +273,7 @@ files:
201
273
  - lib/twterm/tab/statuses/mentions.rb
202
274
  - lib/twterm/tab/statuses/search.rb
203
275
  - lib/twterm/tab/statuses/user_timeline.rb
276
+ - lib/twterm/tab/user_list_management.rb
204
277
  - lib/twterm/tab/user_tab.rb
205
278
  - lib/twterm/tab/users/base.rb
206
279
  - lib/twterm/tab/users/followers.rb
@@ -211,12 +284,33 @@ files:
211
284
  - lib/twterm/user.rb
212
285
  - lib/twterm/utils.rb
213
286
  - lib/twterm/version.rb
287
+ - lib/twterm/view.rb
288
+ - spec/fixtures/status.json
289
+ - spec/fixtures/user.json
214
290
  - spec/resources/config
215
291
  - spec/spec_helper.rb
292
+ - spec/supports/shared_examples/abstract_key_mapper.rb
216
293
  - spec/twterm/config_spec.rb
217
294
  - spec/twterm/event/screen/resize_spec.rb
218
295
  - spec/twterm/event_dispatcher_spec.rb
296
+ - spec/twterm/extension/enumerator/lazy_spec.rb
219
297
  - spec/twterm/friendship_spec.rb
298
+ - spec/twterm/image/blank_line_spec.rb
299
+ - spec/twterm/image/brackets_spec.rb
300
+ - spec/twterm/image/color_spec.rb
301
+ - spec/twterm/image/empry_spec.rb
302
+ - spec/twterm/image/horizontal_sequential_image_spec.rb
303
+ - spec/twterm/image/parens_spec.rb
304
+ - spec/twterm/image/string_image_spec.rb
305
+ - spec/twterm/image/vertical_sequential_image_spec.rb
306
+ - spec/twterm/image_spec.rb
307
+ - spec/twterm/key_mapper/abstract_key_mapper_spec.rb
308
+ - spec/twterm/key_mapper/app_key_mapper_spec.rb
309
+ - spec/twterm/key_mapper/status_key_mapper_spec.rb
310
+ - spec/twterm/key_mapper/tab_key_mapper_spec.rb
311
+ - spec/twterm/repository/friendship_repository_spec.rb
312
+ - spec/twterm/status_spec.rb
313
+ - spec/twterm/user_spec.rb
220
314
  - twterm.gemspec
221
315
  homepage: http://twterm.ryota-ka.me/
222
316
  licenses:
@@ -230,16 +324,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
230
324
  requirements:
231
325
  - - ">="
232
326
  - !ruby/object:Gem::Version
233
- version: 2.0.0
327
+ version: 2.1.0
234
328
  required_rubygems_version: !ruby/object:Gem::Requirement
235
329
  requirements:
236
- - - ">="
330
+ - - ">"
237
331
  - !ruby/object:Gem::Version
238
- version: '0'
332
+ version: 1.3.1
239
333
  requirements: []
240
334
  rubyforge_project:
241
- rubygems_version: 2.6.8
335
+ rubygems_version: 2.6.11
242
336
  signing_key:
243
337
  specification_version: 4
244
- summary: A full-featured CLI Twitter client
338
+ summary: A full-featured TUI Twitter client
245
339
  test_files: []
@@ -1,33 +0,0 @@
1
- require 'twterm/event/base'
2
-
3
- module Twterm
4
- module Event
5
- class Notification < Base
6
- attr_reader :time
7
-
8
- def initialize(type, message)
9
- super(type, CGI.unescapeHTML(message))
10
-
11
- @time = Time.now
12
- end
13
-
14
- def fields
15
- {
16
- type: Symbol,
17
- message: String
18
- }
19
- end
20
-
21
- def color
22
- case type
23
- when :error
24
- [:white, :red]
25
- when :message
26
- [:white, :blue]
27
- else
28
- [:white, :black]
29
- end
30
- end
31
- end
32
- end
33
- end
@@ -1,5 +0,0 @@
1
- class Integer
2
- def format
3
- to_s.gsub(/(\d)(?=(\d{3})+(?!\d))/, '\1,')
4
- end
5
- end
@@ -1,91 +0,0 @@
1
- require 'twterm/event/screen/resize'
2
- require 'twterm/subscriber'
3
-
4
- module Twterm
5
- class FilterQueryWindow
6
- include Curses
7
- include Singleton
8
- include Subscriber
9
-
10
- def initialize
11
- @window = stdscr.subwin(1, stdscr.maxx, stdscr.maxy - 1, 0)
12
-
13
- subscribe(Event::Screen::Resize, :resize)
14
- end
15
-
16
- def input
17
- clear
18
- stdscr.setpos(stdscr.maxy - 1, 0)
19
- stdscr.addch '/'
20
-
21
- Curses.timeout = 10
22
- raw
23
-
24
- chars = []
25
- str = ''
26
-
27
- loop do
28
- char = getch
29
-
30
- if char.nil?
31
- case chars.first
32
- when 3, 27 # cancel with <C-c> / Esc
33
- str = ''
34
- clear
35
- break
36
- when 4 # cancel with <C-d> when query is empty
37
- if str.empty?
38
- clear
39
- break
40
- end
41
- when 10 # submit with <C-j>
42
- break
43
- when 127 # backspace
44
- if str.empty?
45
- clear
46
- break
47
- end
48
-
49
- str.chop!
50
- chars = []
51
- clear
52
- stdscr.setpos(stdscr.maxy - 1, 0)
53
- stdscr.addstr("/#{str}")
54
- when 0..31
55
- # ignore control codes (\x00 - \x1f)
56
- else
57
- str << chars
58
- .map { |x| x.is_a?(String) ? x.ord : x }
59
- .pack('c*')
60
- .force_encoding('utf-8')
61
- chars = []
62
- end
63
- else
64
- chars << char
65
- end
66
-
67
- stdscr.setpos(stdscr.maxy - 1, 1)
68
- stdscr.addstr(str)
69
- end
70
-
71
- Curses.timeout = -1
72
- cbreak
73
-
74
- str
75
- end
76
-
77
- def clear
78
- stdscr.setpos(stdscr.maxy - 1, 0)
79
- stdscr.addstr(' ' * window.maxx)
80
- end
81
-
82
- private
83
-
84
- attr_reader :window
85
-
86
- def resize(event)
87
- @window.resize(1, stdscr.maxx)
88
- @window.move(stdscr.maxy - 1, 0)
89
- end
90
- end
91
- end
@@ -1,41 +0,0 @@
1
- require 'twterm/event/notification'
2
- require 'twterm/publisher'
3
-
4
- module Twterm
5
- module FilterableList
6
- extend Forwardable
7
-
8
- include Publisher
9
-
10
- def filter
11
- @filter_query = FilterQueryWindow.instance.input
12
-
13
- if filter_query.empty?
14
- reset_filter
15
- elsif items.count == 0
16
- query = filter_query
17
- reset_filter
18
- publish(Event::Notification.new(:error, "No matches found: \"#{query}\""))
19
- else
20
- Notifier.instance.show_message "#{total_item_count} items found: \"#{filter_query}\""
21
- scroller.move_to_top
22
- end
23
-
24
- refresh
25
- end
26
-
27
- def filter_query
28
- @filter_query ||= ''
29
- end
30
-
31
- def items
32
- fail NotImplementedError, 'items method must be implemented'
33
- end
34
-
35
- def reset_filter
36
- FilterQueryWindow.instance.clear
37
- @filter_query = ''
38
- refresh
39
- end
40
- end
41
- end
@@ -1,21 +0,0 @@
1
- module Twterm
2
- module History
3
- module Base
4
- attr_reader :history
5
-
6
- def initialize
7
- @history = []
8
- end
9
-
10
- def add(item)
11
- @history << item
12
- end
13
-
14
- private
15
-
16
- def file
17
- fail NotImplementedError, 'file method must be implemented'
18
- end
19
- end
20
- end
21
- end
@@ -1,13 +0,0 @@
1
- module Twterm
2
- module History
3
- class Hashtag
4
- include Singleton, Savable
5
-
6
- private
7
-
8
- def file
9
- "#{App::DATA_DIR}/hashtags".freeze
10
- end
11
- end
12
- end
13
- end