twterm 1.3.0 → 2.0.0.beta1

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