twterm 2.5.1 → 2.10.0

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 (67) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +62 -0
  3. data/.gitignore +1 -0
  4. data/Makefile +21 -0
  5. data/README.md +52 -6
  6. data/bin/twterm +1 -3
  7. data/default.nix +21 -0
  8. data/gemset.nix +4981 -0
  9. data/lib/twterm/app.rb +13 -26
  10. data/lib/twterm/client.rb +1 -6
  11. data/lib/twterm/color_manager.rb +8 -9
  12. data/lib/twterm/image.rb +31 -0
  13. data/lib/twterm/image/attr.rb +42 -0
  14. data/lib/twterm/image/bold.rb +7 -21
  15. data/lib/twterm/image/color.rb +9 -15
  16. data/lib/twterm/image/dim.rb +13 -0
  17. data/lib/twterm/image/underlined.rb +17 -0
  18. data/lib/twterm/image_builder/user_name_image_builder.rb +1 -0
  19. data/lib/twterm/key_mapper.rb +6 -8
  20. data/lib/twterm/key_mapper/abstract_key_mapper.rb +2 -2
  21. data/lib/twterm/list.rb +36 -1
  22. data/lib/twterm/message_window.rb +4 -13
  23. data/lib/twterm/persistable_configuration_proxy.rb +6 -6
  24. data/lib/twterm/preferences.rb +8 -1
  25. data/lib/twterm/rest_client.rb +0 -33
  26. data/lib/twterm/screen.rb +103 -25
  27. data/lib/twterm/search_query_window.rb +5 -13
  28. data/lib/twterm/status.rb +10 -0
  29. data/lib/twterm/tab/abstract_tab.rb +30 -16
  30. data/lib/twterm/tab/new/index.rb +0 -10
  31. data/lib/twterm/tab/new/search.rb +2 -2
  32. data/lib/twterm/tab/new/user.rb +2 -2
  33. data/lib/twterm/tab/preferences/control.rb +77 -0
  34. data/lib/twterm/tab/preferences/index.rb +6 -0
  35. data/lib/twterm/tab/scrollable.rb +1 -1
  36. data/lib/twterm/tab/searchable.rb +6 -4
  37. data/lib/twterm/tab/status_tab.rb +10 -0
  38. data/lib/twterm/tab/statuses/abstract_statuses_tab.rb +11 -6
  39. data/lib/twterm/tab/statuses/home.rb +0 -3
  40. data/lib/twterm/tab/statuses/mentions.rb +1 -0
  41. data/lib/twterm/tab/user_tab.rb +0 -9
  42. data/lib/twterm/tab_manager.rb +77 -10
  43. data/lib/twterm/tweetbox.rb +2 -3
  44. data/lib/twterm/user.rb +1 -0
  45. data/lib/twterm/version.rb +1 -1
  46. data/nix/Gemfile +3 -0
  47. data/nix/Gemfile.lock +77 -0
  48. data/nix/gemset.nix +325 -0
  49. data/shell.nix +40 -0
  50. data/spec/twterm/image/bold_spec.rb +30 -0
  51. data/spec/twterm/image/color_spec.rb +16 -0
  52. data/spec/twterm/image/dim_spec.rb +30 -0
  53. data/twterm.gemspec +13 -13
  54. metadata +46 -46
  55. data/.travis.yml +0 -12
  56. data/lib/twterm/direct_message.rb +0 -60
  57. data/lib/twterm/direct_message_composer.rb +0 -80
  58. data/lib/twterm/direct_message_manager.rb +0 -51
  59. data/lib/twterm/event/direct_message/fetched.rb +0 -10
  60. data/lib/twterm/event/notification/direct_message.rb +0 -30
  61. data/lib/twterm/event/screen/resize.rb +0 -13
  62. data/lib/twterm/event/status/timeline.rb +0 -10
  63. data/lib/twterm/repository/direct_message_repository.rb +0 -14
  64. data/lib/twterm/streaming_client.rb +0 -146
  65. data/lib/twterm/tab/direct_message/conversation.rb +0 -104
  66. data/lib/twterm/tab/direct_message/conversation_list.rb +0 -100
  67. data/spec/twterm/event/screen/resize_spec.rb +0 -11
@@ -1,4 +1,5 @@
1
1
  require 'twterm/tab/statuses/abstract_statuses_tab'
2
+ require 'twterm/event/status/mention'
2
3
 
3
4
  module Twterm
4
5
  module Tab
@@ -53,7 +53,6 @@ module Twterm
53
53
  :profile_image,
54
54
  (:profile_background_image unless user.profile_background_image.nil?),
55
55
  :manage_lists,
56
- (:compose_direct_message unless myself?),
57
56
  (:open_website unless user.website.nil?),
58
57
  (:toggle_follow unless myself?),
59
58
  (:toggle_mute unless myself?),
@@ -96,10 +95,6 @@ module Twterm
96
95
  app.friendship_repository.blocking?(client.user_id, user_id)
97
96
  end
98
97
 
99
- def compose_direct_message
100
- app.direct_message_composer.compose(user)
101
- end
102
-
103
98
  def follow
104
99
  client.follow(user_id).then do |users|
105
100
  render
@@ -176,8 +171,6 @@ module Twterm
176
171
 
177
172
  def perform_selected_action
178
173
  case scroller.current_item
179
- when :compose_direct_message
180
- compose_direct_message
181
174
  when :manage_lists
182
175
  open_list_management_tab
183
176
  when :open_in_browser
@@ -294,8 +287,6 @@ module Twterm
294
287
  curr = scroller.current_index?(i)
295
288
  Image.cursor(1, curr) - Image.whitespace -
296
289
  case item
297
- when :compose_direct_message
298
- Image.string('Compose direct message')
299
290
  when :toggle_block
300
291
  if blocking?
301
292
  Image.string('Unblock this user')
@@ -1,4 +1,3 @@
1
- require 'twterm/event/screen/resize'
2
1
  require 'twterm/publisher'
3
2
  require 'twterm/subscriber'
4
3
  require 'twterm/utils'
@@ -6,7 +5,6 @@ require 'twterm/view'
6
5
 
7
6
  module Twterm
8
7
  class TabManager
9
- include Curses
10
8
  include Publisher
11
9
  include Subscriber
12
10
  include Utils
@@ -69,16 +67,70 @@ module Twterm
69
67
  end
70
68
  end
71
69
 
72
- def initialize(app, client)
70
+ # Returns if the given coordinate is enclosed by the window
71
+ #
72
+ # @param x [Integer]
73
+ # @param y [Integer]
74
+ # @return [Boolean]
75
+ def enclose?(x, y)
76
+ left = @window.begx
77
+ top = @window.begy
78
+ right = left + @window.maxx
79
+ bottom = top + @window.maxy
80
+
81
+ left <= x && x < right && top <= y && y < bottom
82
+ end
83
+
84
+ # @param app [Twterm::App]
85
+ # @param client [Twterm::Client]
86
+ # @param window [Curses::Window]
87
+ def initialize(app, client, window)
73
88
  @app, @client = app, client
74
89
 
75
90
  @tabs = []
76
91
  @index = 0
77
92
  @history = []
78
93
 
79
- @window = stdscr.subwin(3, stdscr.maxx, 0, 0)
94
+ @window = window
95
+ end
96
+
97
+ # Open the clicked tab
98
+ #
99
+ # @param x [Integer]
100
+ # @param _y [Integer]
101
+ #
102
+ # @return [nil]
103
+ def handle_left_click(x, _y)
104
+ n = find_tab_index_on_x(x)
105
+ return if n.nil?
106
+
107
+ show_nth_tab(n)
108
+
109
+ nil
110
+ end
111
+
112
+ # Open next tab
113
+ #
114
+ # @param _x [Integer]
115
+ # @param _y [Integer]
116
+ #
117
+ # @return [nil]
118
+ def handle_scroll_down(_x, _y)
119
+ show_next
80
120
 
81
- subscribe(Event::Screen::Resize, :resize)
121
+ nil
122
+ end
123
+
124
+ # Open previous tab
125
+ #
126
+ # @param _x [Integer]
127
+ # @param _y [Integer]
128
+ #
129
+ # @return [nil]
130
+ def handle_scroll_up(_x, _y)
131
+ show_previous
132
+
133
+ nil
82
134
  end
83
135
 
84
136
  def open_my_profile
@@ -120,10 +172,10 @@ module Twterm
120
172
 
121
173
  image = @tabs
122
174
  .map { |t| [t, Image.string(t.title)] }
123
- .map { |t, r| t.equal?(current_tab) ? !r : r }
175
+ .map { |t, r| t.equal?(current_tab) ? !r._ : r }
124
176
  .reduce(pipe) { |acc, x| acc - wss - x - wss - pipe }
125
177
 
126
- View.new(@window, image).at(1, 1)
178
+ View.new(@window, image)
127
179
  end
128
180
 
129
181
  def respond_to_key(key)
@@ -195,9 +247,24 @@ module Twterm
195
247
 
196
248
  attr_reader :app, :client
197
249
 
198
- def resize(_event)
199
- @window.resize(3, stdscr.maxx)
200
- @window.move(0, 0)
250
+ # @param x [Integer]
251
+ #
252
+ # @return [Integer, nil]
253
+ def find_tab_index_on_x(x)
254
+ pos = 0
255
+
256
+ @tabs.each.with_index do |tab, index|
257
+ title = tab.title
258
+ len = title.length
259
+ left = pos + 1
260
+ right = left + len + 4 # each tab has 2 whitespaces on the both side
261
+
262
+ return index if left <= x && x < right
263
+
264
+ pos = right
265
+ end
266
+
267
+ nil
201
268
  end
202
269
  end
203
270
  end
@@ -16,7 +16,6 @@ module Twterm
16
16
  end
17
17
 
18
18
  include Readline
19
- include Curses
20
19
  include Publisher
21
20
 
22
21
  def initialize(app, client)
@@ -104,7 +103,7 @@ module Twterm
104
103
  end
105
104
 
106
105
  def ask_and_post(leading_text, prompt, postprocessor, options = {})
107
- close_screen
106
+ Curses.close_screen
108
107
  puts "\e[H\e[2J#{leading_text}\n\n"
109
108
  ask(prompt, postprocessor) { |text| client.post(postprocessor.call(text), options) }
110
109
  end
@@ -120,7 +119,7 @@ module Twterm
120
119
  end
121
120
 
122
121
  def reset
123
- reset_prog_mode
122
+ Curses.reset_prog_mode
124
123
  sleep 0.1
125
124
  publish(Event::Screen::Refresh.new)
126
125
  end
data/lib/twterm/user.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  module Twterm
2
+ # A Twitter user
2
3
  class User
3
4
  attr_reader :description, :favorites_count, :followers_count,
4
5
  :friends_count, :id, :location, :name, :protected, :profile_image,
@@ -1,3 +1,3 @@
1
1
  module Twterm
2
- VERSION = '2.5.1'
2
+ VERSION = '2.10.0'
3
3
  end
data/nix/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'twterm', '2.9.0'
data/nix/Gemfile.lock ADDED
@@ -0,0 +1,77 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ addressable (2.7.0)
5
+ public_suffix (>= 2.0.2, < 5.0)
6
+ buftok (0.2.0)
7
+ citrus (3.0.2)
8
+ concurrent-ruby (1.1.8)
9
+ curses (1.4.0)
10
+ domain_name (0.5.20190701)
11
+ unf (>= 0.0.5, < 1.0.0)
12
+ equalizer (0.0.11)
13
+ ffi (1.14.2)
14
+ ffi-compiler (1.0.1)
15
+ ffi (>= 1.0.0)
16
+ rake
17
+ http (4.4.1)
18
+ addressable (~> 2.3)
19
+ http-cookie (~> 1.0)
20
+ http-form_data (~> 2.2)
21
+ http-parser (~> 1.2.0)
22
+ http-cookie (1.0.3)
23
+ domain_name (~> 0.5)
24
+ http-form_data (2.3.0)
25
+ http-parser (1.2.3)
26
+ ffi-compiler (>= 1.0, < 2.0)
27
+ http_parser.rb (0.6.0)
28
+ idn-ruby (0.1.0)
29
+ launchy (2.5.0)
30
+ addressable (~> 2.7)
31
+ memoizable (0.4.2)
32
+ thread_safe (~> 0.3, >= 0.3.1)
33
+ multipart-post (2.1.1)
34
+ naught (1.1.0)
35
+ oauth (0.5.5)
36
+ public_suffix (4.0.6)
37
+ rake (13.0.3)
38
+ simple_oauth (0.3.1)
39
+ terminal-notifier (2.0.0)
40
+ thread_safe (0.3.6)
41
+ toml-rb (2.0.1)
42
+ citrus (~> 3.0, > 3.0)
43
+ twitter (7.0.0)
44
+ addressable (~> 2.3)
45
+ buftok (~> 0.2.0)
46
+ equalizer (~> 0.0.11)
47
+ http (~> 4.0)
48
+ http-form_data (~> 2.0)
49
+ http_parser.rb (~> 0.6.0)
50
+ memoizable (~> 0.4.0)
51
+ multipart-post (~> 2.0)
52
+ naught (~> 1.0)
53
+ simple_oauth (~> 0.3.0)
54
+ twitter-text (3.1.0)
55
+ idn-ruby
56
+ unf (~> 0.1.0)
57
+ twterm (2.9.0)
58
+ concurrent-ruby (~> 1.1.7)
59
+ curses (~> 1.4.0)
60
+ launchy (~> 2.5.0)
61
+ oauth (~> 0.5.1)
62
+ terminal-notifier (~> 2.0.0)
63
+ toml-rb (~> 2.0.1)
64
+ twitter (~> 7.0.0)
65
+ twitter-text (~> 3.1.0)
66
+ unf (0.1.4)
67
+ unf_ext
68
+ unf_ext (0.0.7.7)
69
+
70
+ PLATFORMS
71
+ ruby
72
+
73
+ DEPENDENCIES
74
+ twterm (= 2.9.0)
75
+
76
+ BUNDLED WITH
77
+ 2.1.4
data/nix/gemset.nix ADDED
@@ -0,0 +1,325 @@
1
+ {
2
+ addressable = {
3
+ dependencies = ["public_suffix"];
4
+ groups = ["default"];
5
+ platforms = [];
6
+ source = {
7
+ remotes = ["https://rubygems.org"];
8
+ sha256 = "1fvchp2rhp2rmigx7qglf69xvjqvzq7x0g49naliw29r2bz656sy";
9
+ type = "gem";
10
+ };
11
+ version = "2.7.0";
12
+ };
13
+ buftok = {
14
+ groups = ["default"];
15
+ platforms = [];
16
+ source = {
17
+ remotes = ["https://rubygems.org"];
18
+ sha256 = "1rzsy1vy50v55x9z0nivf23y0r9jkmq6i130xa75pq9i8qrn1mxs";
19
+ type = "gem";
20
+ };
21
+ version = "0.2.0";
22
+ };
23
+ citrus = {
24
+ groups = ["default"];
25
+ platforms = [];
26
+ source = {
27
+ remotes = ["https://rubygems.org"];
28
+ sha256 = "0l7nhk3gkm1hdchkzzhg2f70m47pc0afxfpl6mkiibc9qcpl3hjf";
29
+ type = "gem";
30
+ };
31
+ version = "3.0.2";
32
+ };
33
+ concurrent-ruby = {
34
+ groups = ["default"];
35
+ platforms = [];
36
+ source = {
37
+ remotes = ["https://rubygems.org"];
38
+ sha256 = "0mr23wq0szj52xnj0zcn1k0c7j4v79wlwbijkpfcscqww3l6jlg3";
39
+ type = "gem";
40
+ };
41
+ version = "1.1.8";
42
+ };
43
+ curses = {
44
+ groups = ["default"];
45
+ platforms = [];
46
+ source = {
47
+ remotes = ["https://rubygems.org"];
48
+ sha256 = "0i4j6j18ih6lx7gk9jg2p7q8iswc897mgzn5m62jbf0zv0f7mkji";
49
+ type = "gem";
50
+ };
51
+ version = "1.4.0";
52
+ };
53
+ domain_name = {
54
+ dependencies = ["unf"];
55
+ groups = ["default"];
56
+ platforms = [];
57
+ source = {
58
+ remotes = ["https://rubygems.org"];
59
+ sha256 = "0lcqjsmixjp52bnlgzh4lg9ppsk52x9hpwdjd53k8jnbah2602h0";
60
+ type = "gem";
61
+ };
62
+ version = "0.5.20190701";
63
+ };
64
+ equalizer = {
65
+ groups = ["default"];
66
+ platforms = [];
67
+ source = {
68
+ remotes = ["https://rubygems.org"];
69
+ sha256 = "1kjmx3fygx8njxfrwcmn7clfhjhb6bvv3scy2lyyi0wqyi3brra4";
70
+ type = "gem";
71
+ };
72
+ version = "0.0.11";
73
+ };
74
+ ffi = {
75
+ groups = ["default"];
76
+ platforms = [];
77
+ source = {
78
+ remotes = ["https://rubygems.org"];
79
+ sha256 = "15hgiy09i8ywjihyzyvjvk42ivi3kmy6dm21s5sgg9j7y3h3zkkx";
80
+ type = "gem";
81
+ };
82
+ version = "1.14.2";
83
+ };
84
+ ffi-compiler = {
85
+ dependencies = ["ffi" "rake"];
86
+ groups = ["default"];
87
+ platforms = [];
88
+ source = {
89
+ remotes = ["https://rubygems.org"];
90
+ sha256 = "0c2caqm9wqnbidcb8dj4wd3s902z15qmgxplwyfyqbwa0ydki7q1";
91
+ type = "gem";
92
+ };
93
+ version = "1.0.1";
94
+ };
95
+ http = {
96
+ dependencies = ["addressable" "http-cookie" "http-form_data" "http-parser"];
97
+ groups = ["default"];
98
+ platforms = [];
99
+ source = {
100
+ remotes = ["https://rubygems.org"];
101
+ sha256 = "0z8vmvnkrllkpzsxi94284di9r63g9v561a16an35izwak8g245y";
102
+ type = "gem";
103
+ };
104
+ version = "4.4.1";
105
+ };
106
+ http-cookie = {
107
+ dependencies = ["domain_name"];
108
+ groups = ["default"];
109
+ platforms = [];
110
+ source = {
111
+ remotes = ["https://rubygems.org"];
112
+ sha256 = "004cgs4xg5n6byjs7qld0xhsjq3n6ydfh897myr2mibvh6fjc49g";
113
+ type = "gem";
114
+ };
115
+ version = "1.0.3";
116
+ };
117
+ http-form_data = {
118
+ groups = ["default"];
119
+ platforms = [];
120
+ source = {
121
+ remotes = ["https://rubygems.org"];
122
+ sha256 = "1wx591jdhy84901pklh1n9sgh74gnvq1qyqxwchni1yrc49ynknc";
123
+ type = "gem";
124
+ };
125
+ version = "2.3.0";
126
+ };
127
+ http-parser = {
128
+ dependencies = ["ffi-compiler"];
129
+ groups = ["default"];
130
+ platforms = [];
131
+ source = {
132
+ remotes = ["https://rubygems.org"];
133
+ sha256 = "18qqvckvqjffh88hfib6c8pl9qwk9gp89w89hl3f2s1x8hgyqka1";
134
+ type = "gem";
135
+ };
136
+ version = "1.2.3";
137
+ };
138
+ "http_parser.rb" = {
139
+ groups = ["default"];
140
+ platforms = [];
141
+ source = {
142
+ remotes = ["https://rubygems.org"];
143
+ sha256 = "15nidriy0v5yqfjsgsra51wmknxci2n2grliz78sf9pga3n0l7gi";
144
+ type = "gem";
145
+ };
146
+ version = "0.6.0";
147
+ };
148
+ idn-ruby = {
149
+ groups = ["default"];
150
+ platforms = [];
151
+ source = {
152
+ remotes = ["https://rubygems.org"];
153
+ sha256 = "07vblcyk3g72sbq12xz7xj28snpxnh3sbcnxy8bglqbfqqhvmawr";
154
+ type = "gem";
155
+ };
156
+ version = "0.1.0";
157
+ };
158
+ launchy = {
159
+ dependencies = ["addressable"];
160
+ groups = ["default"];
161
+ platforms = [];
162
+ source = {
163
+ remotes = ["https://rubygems.org"];
164
+ sha256 = "1xdyvr5j0gjj7b10kgvh8ylxnwk3wx19my42wqn9h82r4p246hlm";
165
+ type = "gem";
166
+ };
167
+ version = "2.5.0";
168
+ };
169
+ memoizable = {
170
+ dependencies = ["thread_safe"];
171
+ groups = ["default"];
172
+ platforms = [];
173
+ source = {
174
+ remotes = ["https://rubygems.org"];
175
+ sha256 = "0v42bvghsvfpzybfazl14qhkrjvx0xlmxz0wwqc960ga1wld5x5c";
176
+ type = "gem";
177
+ };
178
+ version = "0.4.2";
179
+ };
180
+ multipart-post = {
181
+ groups = ["default"];
182
+ platforms = [];
183
+ source = {
184
+ remotes = ["https://rubygems.org"];
185
+ sha256 = "1zgw9zlwh2a6i1yvhhc4a84ry1hv824d6g2iw2chs3k5aylpmpfj";
186
+ type = "gem";
187
+ };
188
+ version = "2.1.1";
189
+ };
190
+ naught = {
191
+ groups = ["default"];
192
+ platforms = [];
193
+ source = {
194
+ remotes = ["https://rubygems.org"];
195
+ sha256 = "1wwjx35zgbc0nplp8a866iafk4zsrbhwwz4pav5gydr2wm26nksg";
196
+ type = "gem";
197
+ };
198
+ version = "1.1.0";
199
+ };
200
+ oauth = {
201
+ groups = ["default"];
202
+ platforms = [];
203
+ source = {
204
+ remotes = ["https://rubygems.org"];
205
+ sha256 = "1m08365nyp0fgw2iyzj8q8qy8zml0c1hw2dd8cp82pp6656ahbh3";
206
+ type = "gem";
207
+ };
208
+ version = "0.5.5";
209
+ };
210
+ public_suffix = {
211
+ groups = ["default"];
212
+ platforms = [];
213
+ source = {
214
+ remotes = ["https://rubygems.org"];
215
+ sha256 = "1xqcgkl7bwws1qrlnmxgh8g4g9m10vg60bhlw40fplninb3ng6d9";
216
+ type = "gem";
217
+ };
218
+ version = "4.0.6";
219
+ };
220
+ rake = {
221
+ groups = ["default"];
222
+ platforms = [];
223
+ source = {
224
+ remotes = ["https://rubygems.org"];
225
+ sha256 = "1iik52mf9ky4cgs38fp2m8r6skdkq1yz23vh18lk95fhbcxb6a67";
226
+ type = "gem";
227
+ };
228
+ version = "13.0.3";
229
+ };
230
+ simple_oauth = {
231
+ groups = ["default"];
232
+ platforms = [];
233
+ source = {
234
+ remotes = ["https://rubygems.org"];
235
+ sha256 = "0dw9ii6m7wckml100xhjc6vxpjcry174lbi9jz5v7ibjr3i94y8l";
236
+ type = "gem";
237
+ };
238
+ version = "0.3.1";
239
+ };
240
+ terminal-notifier = {
241
+ groups = ["default"];
242
+ platforms = [];
243
+ source = {
244
+ remotes = ["https://rubygems.org"];
245
+ sha256 = "1slc0y8pjpw30hy21v8ypafi8r7z9jlj4bjbgz03b65b28i2n3bs";
246
+ type = "gem";
247
+ };
248
+ version = "2.0.0";
249
+ };
250
+ thread_safe = {
251
+ groups = ["default"];
252
+ platforms = [];
253
+ source = {
254
+ remotes = ["https://rubygems.org"];
255
+ sha256 = "0nmhcgq6cgz44srylra07bmaw99f5271l0dpsvl5f75m44l0gmwy";
256
+ type = "gem";
257
+ };
258
+ version = "0.3.6";
259
+ };
260
+ toml-rb = {
261
+ dependencies = ["citrus"];
262
+ groups = ["default"];
263
+ platforms = [];
264
+ source = {
265
+ remotes = ["https://rubygems.org"];
266
+ sha256 = "0x5j95w28vj85bzw98g1dyd4gm7xpli2fdvwwrgwlay7gb3wc5jh";
267
+ type = "gem";
268
+ };
269
+ version = "2.0.1";
270
+ };
271
+ twitter = {
272
+ dependencies = ["addressable" "buftok" "equalizer" "http" "http-form_data" "http_parser.rb" "memoizable" "multipart-post" "naught" "simple_oauth"];
273
+ groups = ["default"];
274
+ platforms = [];
275
+ source = {
276
+ remotes = ["https://rubygems.org"];
277
+ sha256 = "13dmkjgsnym1avym9f7y2i2h3mlk8crqvc87drrzr4f0sf9l8g2y";
278
+ type = "gem";
279
+ };
280
+ version = "7.0.0";
281
+ };
282
+ twitter-text = {
283
+ dependencies = ["idn-ruby" "unf"];
284
+ groups = ["default"];
285
+ platforms = [];
286
+ source = {
287
+ remotes = ["https://rubygems.org"];
288
+ sha256 = "1dnmp0bj3l01nbb52zby2c7hrazcdwfg846knkrjdfl0yfmv793z";
289
+ type = "gem";
290
+ };
291
+ version = "3.1.0";
292
+ };
293
+ twterm = {
294
+ dependencies = ["concurrent-ruby" "curses" "launchy" "oauth" "terminal-notifier" "toml-rb" "twitter" "twitter-text"];
295
+ groups = ["default"];
296
+ platforms = [];
297
+ source = {
298
+ remotes = ["https://rubygems.org"];
299
+ sha256 = "16jbad4d5g8xf5gphlzf1ip7yih1xdvj2aqn9sb3xhy2vssb5y0c";
300
+ type = "gem";
301
+ };
302
+ version = "2.9.0";
303
+ };
304
+ unf = {
305
+ dependencies = ["unf_ext"];
306
+ groups = ["default"];
307
+ platforms = [];
308
+ source = {
309
+ remotes = ["https://rubygems.org"];
310
+ sha256 = "0bh2cf73i2ffh4fcpdn9ir4mhq8zi50ik0zqa1braahzadx536a9";
311
+ type = "gem";
312
+ };
313
+ version = "0.1.4";
314
+ };
315
+ unf_ext = {
316
+ groups = ["default"];
317
+ platforms = [];
318
+ source = {
319
+ remotes = ["https://rubygems.org"];
320
+ sha256 = "0wc47r23h063l8ysws8sy24gzh74mks81cak3lkzlrw4qkqb3sg4";
321
+ type = "gem";
322
+ };
323
+ version = "0.0.7.7";
324
+ };
325
+ }