brio 0.0.1 → 0.0.3
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.
- data/README.rdoc +116 -3
- data/bin/brio +210 -41
- data/brio.rdoc +0 -4
- data/lib/brio.rb +6 -0
- data/lib/brio/api.rb +9 -10
- data/lib/brio/client.rb +91 -17
- data/lib/brio/format/csv.rb +44 -0
- data/lib/brio/format/pretty.rb +91 -0
- data/lib/brio/resources/post.rb +9 -0
- data/lib/brio/resources/resource.rb +34 -0
- data/lib/brio/resources/user.rb +9 -0
- data/lib/brio/utils.rb +8 -0
- data/lib/brio/version.rb +1 -1
- metadata +107 -21
data/README.rdoc
CHANGED
@@ -1,6 +1,119 @@
|
|
1
|
-
= brio
|
1
|
+
= brio - CLI power tools for appdotnet
|
2
2
|
|
3
|
-
|
3
|
+
brio is a command line application for interfacing with appdotnet social network.
|
4
4
|
|
5
|
-
|
5
|
+
== Instalation
|
6
|
+
You have to make sure that you have ruby installed. Preferably version 1.9.2 or 1.9.3 (the latest stable)
|
7
|
+
|
8
|
+
Once you've verified that Ruby is installed:
|
9
|
+
|
10
|
+
gem install brio
|
11
|
+
|
12
|
+
== Authorization
|
13
|
+
brio needs to be authorized with appdotnet to run. To proceed, type the following command at the prompt and follow the instructions:
|
14
|
+
|
15
|
+
brio authorize
|
16
|
+
|
17
|
+
This command will direct you to a URL where you can sign-in to appdotnet, authorize the application, and then enter the returned auth token back into the terminal.
|
18
|
+
|
19
|
+
== Usage Examples
|
20
|
+
Typing *brio help* will list all the available commands. You can type *brio help COMMAND* to get help for a specific command.
|
21
|
+
|
22
|
+
brio help
|
23
|
+
|
24
|
+
=== Retriving your stream
|
25
|
+
brio stream
|
26
|
+
This will return your personalized stream
|
27
|
+
|
28
|
+
brio stream -g
|
29
|
+
This returns global stream
|
30
|
+
|
31
|
+
By default brio returns 20 posts. appdotnet allows up to max 200 counts. You can set a flag *-c | --count* if you want to customize the number:
|
32
|
+
brio stream -c16
|
33
|
+
|
34
|
+
You can also use them together:
|
35
|
+
brio stream -gc50
|
36
|
+
|
37
|
+
=== Post Methods
|
38
|
+
|
39
|
+
==== Create a post
|
40
|
+
brio post "Hey! I'm posting from the command line!"
|
41
|
+
|
42
|
+
==== Reply to a post
|
43
|
+
brio post reply 12345 "hey, this is a reply!"
|
44
|
+
Note that we provided first the post id you are making a reply to, and then the message
|
45
|
+
|
46
|
+
==== Delete a post
|
47
|
+
brio post delete 1234
|
48
|
+
You can only delete a post that you created
|
49
|
+
|
50
|
+
==== Repost a post
|
51
|
+
brio post repost 1234
|
52
|
+
|
53
|
+
==== Delete a repost
|
54
|
+
brio post repost --rm 1234
|
55
|
+
|
56
|
+
==== Star a post
|
57
|
+
brio post star 1234
|
58
|
+
|
59
|
+
==== Delete a starred post
|
60
|
+
brio post star --rm 1234
|
61
|
+
|
62
|
+
=== Get user infrormation
|
63
|
+
brio whois @username
|
64
|
+
Username can be omitted and it will default to the currently authenticated user - you.
|
65
|
+
|
66
|
+
=== Follow a user
|
67
|
+
brio follow @username
|
68
|
+
|
69
|
+
=== Stop following a user
|
70
|
+
brio unfollow @username
|
71
|
+
|
72
|
+
=== List Methods
|
73
|
+
All the *list* subcommands can take an optional *count* flag. When provided, it will return an arbitrary number of listing. By default, brio returns last 20 items.
|
74
|
+
|
75
|
+
==== Mentions
|
76
|
+
brio list mentions
|
77
|
+
This will list the posts that mention you.
|
78
|
+
|
79
|
+
brio list mentions @username
|
80
|
+
This will list the posts that mention *username*
|
81
|
+
|
82
|
+
brio list mentions -c10 @username
|
83
|
+
List last 10 menitons for *username*
|
84
|
+
|
85
|
+
==== Followers
|
86
|
+
brio list followers @username
|
87
|
+
This will list people that follow *username*
|
88
|
+
You can also omit *username* and brio will list your followers.
|
89
|
+
|
90
|
+
brio list followers -c50
|
91
|
+
List my last 50 followers
|
92
|
+
|
93
|
+
==== Following
|
94
|
+
brio list following
|
95
|
+
List people I follow.
|
96
|
+
|
97
|
+
brio list following @username
|
98
|
+
List people that *username* is following.
|
99
|
+
|
100
|
+
==== Replies
|
101
|
+
brio list replies 1234
|
102
|
+
List replies of a post with id 1234.
|
103
|
+
|
104
|
+
brio list replies 1234 -c12
|
105
|
+
List last 12 replies for a post.
|
106
|
+
|
107
|
+
==== Posts
|
108
|
+
brio list posts @username
|
109
|
+
List posts created by *username*
|
110
|
+
|
111
|
+
brio list posts
|
112
|
+
List posts created by me (the current authenticated user).
|
113
|
+
|
114
|
+
brio list posts -c15
|
115
|
+
List my last 15 posts.
|
116
|
+
|
117
|
+
== Copyright
|
118
|
+
See LICENSE[https://github.com/klaut/brio/blob/master/LICENSE.txt] for details.
|
6
119
|
|
data/bin/brio
CHANGED
@@ -10,19 +10,46 @@ program_desc 'command line client for app.net inspired by t for twitter'
|
|
10
10
|
|
11
11
|
version Brio::VERSION
|
12
12
|
|
13
|
-
|
14
|
-
rcfile = Brio::RCFile.instance
|
15
13
|
client = Brio::Client.new
|
16
14
|
|
17
|
-
|
18
|
-
|
15
|
+
output_formats = {
|
16
|
+
'csv' => Brio::Format::CSV.new,
|
17
|
+
'pretty' => Brio::Format::Pretty.new
|
18
|
+
}
|
19
|
+
|
20
|
+
desc "Read Terms of Service and Privacy Policy."
|
21
|
+
skips_pre
|
22
|
+
command :tos do |c|
|
23
|
+
c.action do |global_options,options,args|
|
24
|
+
formatter = output_formats['pretty']
|
25
|
+
formatter.set_wrap
|
26
|
+
say <<END
|
27
|
+
************* TERMS OF SERVICE ***********
|
28
|
+
|
29
|
+
By using this software you agree that in no event shall the authors or copyright holders be liable for any claim,
|
30
|
+
damages or other liability, whether in an action of contract, tort or otherwise,
|
31
|
+
arising from, out of or in connection with the software or the use or other dealings in the software.
|
32
|
+
|
33
|
+
Ok, in plain wrods this means that I am not responible for anything that happens to you while using this software.
|
34
|
+
|
35
|
+
************* PRIVACY POLICY *************
|
36
|
+
This software does not store any infromation about you that is not essential for running it.
|
37
|
+
It creates a file called .brio.rc that stores your authorization token inside your $HOME directory. And that is it.
|
38
|
+
END
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
desc 'Optional. Format of the output (default: pretty for TTY, csv otherwise)'
|
44
|
+
arg_name 'csv|pretty'
|
45
|
+
flag :format
|
19
46
|
|
20
47
|
desc 'authorize brio with app.net'
|
21
48
|
skips_pre
|
22
49
|
command :authorize do |c|
|
23
50
|
c.action do |global_options,options,args|
|
24
51
|
|
25
|
-
if
|
52
|
+
if client.config.empty?
|
26
53
|
say "Welcome! Before you can use *brio* you need to authorize it with app.net"
|
27
54
|
ask "Press [Enter] to open the app.net site."
|
28
55
|
say ""
|
@@ -30,11 +57,10 @@ command :authorize do |c|
|
|
30
57
|
Launchy.open client.oauth_url
|
31
58
|
token = ask "Enter your oauth token:"
|
32
59
|
|
33
|
-
|
34
|
-
|
35
|
-
say "Authorization successful."
|
60
|
+
client.config['token'] = token
|
61
|
+
say "<%= color('Authorization successful.', :green) %>"
|
36
62
|
else
|
37
|
-
say "You already authorized with app.net"
|
63
|
+
say "<%= color('You already authorized with app.net', :red) %>"
|
38
64
|
end
|
39
65
|
|
40
66
|
end
|
@@ -50,67 +76,202 @@ command :stream do |c|
|
|
50
76
|
c.flag [:c, :count]
|
51
77
|
|
52
78
|
c.action do |global_options,options,args|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
79
|
+
formatter = output_formats[global_options[:format]]
|
80
|
+
formatter.set_wrap
|
81
|
+
params = {count: options[:c].to_i, include_deleted: 0}
|
82
|
+
if options[:global]
|
83
|
+
posts = client.get_post_stream_global params
|
84
|
+
else
|
85
|
+
posts = client.get_post_stream params
|
57
86
|
end
|
87
|
+
formatter.print_posts posts
|
58
88
|
end
|
59
89
|
end
|
60
90
|
|
61
|
-
|
91
|
+
#default_desc "Post a message."
|
92
|
+
desc 'Make a new Post to appdotnet. Delete a post. Reply to a post.. see `brio help post` for more.'
|
62
93
|
arg_name 'message'
|
63
94
|
command :post do |c|
|
95
|
+
c.default_desc "Make a new Post to appdotnet"
|
64
96
|
c.action do |global_options,options,args|
|
65
|
-
|
66
|
-
|
67
|
-
|
97
|
+
if args.empty?
|
98
|
+
message = ask "Whats on your mind:"
|
99
|
+
else
|
100
|
+
message = args[0]
|
101
|
+
end
|
102
|
+
help_now!('message is required') if message.empty?
|
103
|
+
post = client.create_post text: message
|
104
|
+
say "<%= color('#{post.text}', :red) %>" if post.is_a? Brio::Resources::NullResource
|
105
|
+
end
|
106
|
+
|
107
|
+
c.desc 'Reply to a post'
|
108
|
+
c.arg_name 'postID message'
|
109
|
+
c.command :reply do |reply|
|
110
|
+
reply.action do |global_options,options,args|
|
111
|
+
help_now!('postID and message are both required') if args.empty?
|
112
|
+
if args.size == 1
|
113
|
+
message = ask "Your reply:"
|
114
|
+
else
|
115
|
+
message = args[1]
|
116
|
+
end
|
117
|
+
help_now!('postID and message are both required') if message.empty?
|
118
|
+
post = client.create_post reply_to: args[0], text: message
|
119
|
+
say "<%= color('#{post.text}', :red) %>" if post.is_a? Brio::Resources::NullResource
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
c.desc 'Delete a post (only if created by you)'
|
124
|
+
c.arg_name 'postID'
|
125
|
+
c.command :delete do |delete|
|
126
|
+
delete.action do |global_options,options,args|
|
127
|
+
help_now!('postID is required') if args.empty?
|
128
|
+
post = client.delete_post args[0]
|
129
|
+
say "<%= color('#{post.text}', :red) %>" if post.is_a? Brio::Resources::NullResource
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
c.desc 'Delete a starred post or a repost.'
|
134
|
+
c.switch [:rm]
|
135
|
+
|
136
|
+
c.desc 'Repost a post'
|
137
|
+
c.arg_name 'postID'
|
138
|
+
c.command :repost do |repost|
|
139
|
+
repost.action do |global_options,options,args|
|
140
|
+
help_now!('postID is required') if args.empty?
|
141
|
+
if options[:rm]
|
142
|
+
post = client.delete_post_repost args[0]
|
143
|
+
else
|
144
|
+
post = client.create_post_repost args[0]
|
145
|
+
end
|
146
|
+
say "<%= color('#{post.text}', :red) %>" if post.is_a? Brio::Resources::NullResource
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
c.desc 'Star a post'
|
151
|
+
c.arg_name 'postID'
|
152
|
+
c.command :star do |star|
|
153
|
+
star.action do |global_options,options,args|
|
154
|
+
help_now!('postID is required') if args.empty?
|
155
|
+
if options[:rm]
|
156
|
+
post = client.delete_post_star args[0]
|
157
|
+
else
|
158
|
+
post = client.create_post_star args[0]
|
159
|
+
end
|
160
|
+
say "<%= color('#{post.text}', :red) %>" if post.is_a? Brio::Resources::NullResource
|
161
|
+
end
|
68
162
|
end
|
163
|
+
|
69
164
|
end
|
70
165
|
|
71
166
|
desc 'Look up a user. If no argument is provided, it defualts to the current authenticated user'
|
72
167
|
default_value 'me'
|
73
|
-
arg_name 'username'
|
168
|
+
arg_name '@username', :optional
|
74
169
|
command :whois do |c|
|
75
170
|
#do not forget to attach @
|
76
171
|
c.action do |global_options,options,args|
|
77
|
-
|
172
|
+
exit_now!('username must start with @') if !args.empty? and !args[0].start_with?('@')
|
173
|
+
formatter = output_formats[global_options[:format]]
|
174
|
+
formatter.set_wrap
|
175
|
+
user = client.get_user (args[0] || 'me')
|
176
|
+
formatter.print_user user
|
78
177
|
end
|
79
178
|
end
|
80
179
|
|
81
|
-
desc 'List the posts where the user is mentioned. It defualts to the current authenticated user'
|
82
|
-
default_value 'me'
|
83
|
-
arg_name 'username'
|
84
|
-
command :mentions do |c|
|
85
|
-
c.action do |global_options,options,args|
|
86
|
-
puts "mentions command ran"
|
87
|
-
end
|
88
|
-
end
|
89
180
|
|
90
181
|
desc 'Follow a user'
|
91
|
-
arg_name 'username'
|
182
|
+
arg_name '@username', :multiple
|
92
183
|
command :follow do |c|
|
93
184
|
c.action do |global_options,options,args|
|
94
185
|
help_now!('username is required') if args.empty?
|
95
|
-
|
186
|
+
exit_now!('username must start with @') if !args.empty? and !args[0].start_with?('@')
|
187
|
+
user = client.create_user_follow args[0]
|
188
|
+
say "<%= color('#{user.text}', :red) %>" if user.is_a? Brio::Resources::NullResource
|
96
189
|
end
|
97
190
|
end
|
98
191
|
|
99
|
-
desc '
|
100
|
-
|
101
|
-
|
102
|
-
command :following do |c|
|
192
|
+
desc 'Unfollow a user'
|
193
|
+
arg_name '@username', :multiple
|
194
|
+
command :unfollow do |c|
|
103
195
|
c.action do |global_options,options,args|
|
104
|
-
|
196
|
+
help_now!('username is required') if args.empty?
|
197
|
+
exit_now!('username must start with @') if !args.empty? and !args[0].start_with?('@')
|
198
|
+
user = client.delete_user_follow args[0]
|
199
|
+
say "<%= color('#{user.text}', :red) %>" if user.is_a? Brio::Resources::NullResource
|
105
200
|
end
|
106
201
|
end
|
107
202
|
|
108
|
-
desc '
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
c.
|
113
|
-
|
203
|
+
desc 'List various resources. Followers, Mentions, .. run `brio help list` for more.'
|
204
|
+
command :list do |c|
|
205
|
+
c.desc 'The number of listings to return, up to a maximum of 200'
|
206
|
+
c.default_value '20'
|
207
|
+
c.flag [:c, :count]
|
208
|
+
|
209
|
+
c.desc 'List the posts where the user is mentioned. It defualts to the current authenticated user'
|
210
|
+
c.default_value 'me'
|
211
|
+
c.arg_name '@username', :optional
|
212
|
+
c.command :mentions do |m|
|
213
|
+
m.action do |global_options,options,args|
|
214
|
+
exit_now!('username must start with @') if !args.empty? and !args[0].start_with?('@')
|
215
|
+
formatter = output_formats[global_options[:format]]
|
216
|
+
formatter.set_wrap
|
217
|
+
params = {count: options[:c].to_i, include_deleted: 0}
|
218
|
+
posts = client.get_user_mentions args[0], params
|
219
|
+
formatter.print_posts posts
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
c.desc 'List all accounts that a user is following. It defualts to the current authenticated user'
|
224
|
+
c.default_value 'me'
|
225
|
+
c.arg_name '@username', :optional
|
226
|
+
c.command :following do |f|
|
227
|
+
f.action do |global_options,options,args|
|
228
|
+
exit_now!('username must start with @') if !args.empty? and !args[0].start_with?('@')
|
229
|
+
formatter = output_formats[global_options[:format]]
|
230
|
+
formatter.set_wrap
|
231
|
+
params = {count: options[:c].to_i}
|
232
|
+
users = client.get_user_following args[0], params
|
233
|
+
formatter.print_users users
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
c.desc 'list all accounts that are following a user - it defualts to the current authenticated user'
|
238
|
+
c.default_value 'me'
|
239
|
+
c.arg_name '@username', :optional
|
240
|
+
c.command :followers do |f|
|
241
|
+
f.action do |global_options,options,args|
|
242
|
+
exit_now!('username must start with @') if !args.empty? and !args[0].start_with?('@')
|
243
|
+
formatter = output_formats[global_options[:format]]
|
244
|
+
formatter.set_wrap
|
245
|
+
params = {count: options[:c].to_i}
|
246
|
+
users = client.get_user_followers args[0], params
|
247
|
+
formatter.print_users users
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
c.desc 'list replies to a post'
|
252
|
+
c.arg_name 'postID'
|
253
|
+
c.command :replies do |f|
|
254
|
+
f.action do |global_options,options,args|
|
255
|
+
help_now!('postID is required') if args.empty?
|
256
|
+
formatter = output_formats[global_options[:format]]
|
257
|
+
formatter.set_wrap
|
258
|
+
params = {count: options[:c].to_i, include_deleted: 0}
|
259
|
+
posts = client.get_post_replies args[0], params
|
260
|
+
formatter.print_posts posts
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
c.desc 'list posts for a user. Defaults to the current authenticated user'
|
265
|
+
c.arg_name '@username', :optional
|
266
|
+
c.command :posts do |f|
|
267
|
+
f.action do |global_options,options,args|
|
268
|
+
exit_now!('username must start with @') if !args.empty? and !args[0].start_with?('@')
|
269
|
+
formatter = output_formats[global_options[:format]]
|
270
|
+
formatter.set_wrap
|
271
|
+
params = {count: options[:c].to_i, include_deleted: 0}
|
272
|
+
posts = client.get_user_posts args[0], params
|
273
|
+
formatter.print_posts posts
|
274
|
+
end
|
114
275
|
end
|
115
276
|
end
|
116
277
|
|
@@ -120,7 +281,14 @@ pre do |global,command,options,args|
|
|
120
281
|
# chosen command
|
121
282
|
# Use skips_pre before a command to skip this block
|
122
283
|
# on that command only
|
123
|
-
exit_now!('You need to authorize with app.net
|
284
|
+
exit_now!('You need to authorize with app.net. Run `brio authorize` to do so.') if client.config.empty?
|
285
|
+
if global[:format].nil?
|
286
|
+
if STDOUT.tty?
|
287
|
+
global[:format] = 'pretty'
|
288
|
+
else
|
289
|
+
global[:format] = 'csv'
|
290
|
+
end
|
291
|
+
end
|
124
292
|
true
|
125
293
|
end
|
126
294
|
|
@@ -128,6 +296,7 @@ post do |global,command,options,args|
|
|
128
296
|
# Post logic here
|
129
297
|
# Use skips_post before a command to skip this
|
130
298
|
# block on that command only
|
299
|
+
$terminal.wrap_at = :auto
|
131
300
|
end
|
132
301
|
|
133
302
|
on_error do |exception|
|
data/brio.rdoc
CHANGED
data/lib/brio.rb
CHANGED
@@ -1,5 +1,11 @@
|
|
1
|
+
require 'brio/utils.rb'
|
1
2
|
require 'brio/version.rb'
|
2
3
|
require 'brio/rcfile.rb'
|
4
|
+
require 'brio/format/csv.rb'
|
5
|
+
require 'brio/format/pretty.rb'
|
6
|
+
require 'brio/resources/resource.rb'
|
7
|
+
require 'brio/resources/user.rb'
|
8
|
+
require 'brio/resources/post.rb'
|
3
9
|
require 'brio/api.rb'
|
4
10
|
require 'brio/client.rb'
|
5
11
|
|
data/lib/brio/api.rb
CHANGED
@@ -8,8 +8,8 @@ module Brio
|
|
8
8
|
DEFAULT_API_HOST = 'alpha-api.app.net'
|
9
9
|
DEFAULT_PROTOCOL = 'https'
|
10
10
|
|
11
|
-
REDIRECT_URI = '
|
12
|
-
SCOPE = 'stream,email,write_post,follow,messages,export'
|
11
|
+
REDIRECT_URI = 'https://brioapp.herokuapp.com/auth/callback/'
|
12
|
+
SCOPE = 'stream,email,write_post,follow,messages,update_profile,export'
|
13
13
|
RESPONSE_TYPE = 'token'
|
14
14
|
|
15
15
|
|
@@ -18,16 +18,15 @@ module Brio
|
|
18
18
|
"#{protocol}://#{oauth_host}/oauth/authenticate?client_id=#{CLIENT_ID}&response_type=#{RESPONSE_TYPE}&scope=#{SCOPE}&redirect_uri=#{REDIRECT_URI}"
|
19
19
|
end
|
20
20
|
|
21
|
-
|
22
|
-
|
21
|
+
# POSTS
|
22
|
+
def posts_url(id ="")
|
23
|
+
id = "/#{id}" unless id.empty?
|
24
|
+
"/stream/0/posts#{id}"
|
23
25
|
end
|
24
26
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
def posts_url
|
30
|
-
"/stream/0/posts"
|
27
|
+
# USERS
|
28
|
+
def users_url( id = "me")
|
29
|
+
"/stream/0/users/#{id}"
|
31
30
|
end
|
32
31
|
|
33
32
|
private
|
data/lib/brio/client.rb
CHANGED
@@ -1,38 +1,112 @@
|
|
1
|
-
require '
|
2
|
-
require 'json'
|
1
|
+
require 'faraday_middleware'
|
2
|
+
#require 'json'
|
3
|
+
require 'brio/resources/post.rb'
|
3
4
|
|
4
5
|
module Brio
|
5
6
|
|
6
7
|
class Client
|
7
|
-
include
|
8
|
+
include API
|
9
|
+
|
10
|
+
HTTP_VERBS = {
|
11
|
+
create: 'post',
|
12
|
+
delete: 'delete',
|
13
|
+
get: 'get'
|
14
|
+
}
|
15
|
+
|
16
|
+
METHOD_PATTERNS = {
|
17
|
+
users: /(.*)_user(_?(.*))/,
|
18
|
+
posts: /(.*)_post(_?(.*))/
|
19
|
+
}
|
8
20
|
|
9
21
|
def initialize
|
10
|
-
@conn = Faraday.new(:url => base_api_url ) do |faraday|
|
11
|
-
faraday.request :
|
22
|
+
@conn = Faraday.new( :url => base_api_url ) do |faraday|
|
23
|
+
faraday.request :json
|
24
|
+
faraday.response :json, :content_type => /\bjson$/
|
12
25
|
faraday.adapter Faraday.default_adapter
|
13
26
|
end
|
14
|
-
@rc =
|
27
|
+
@rc = RCFile.instance
|
15
28
|
add_oauth_header unless @rc.empty?
|
16
29
|
end
|
17
30
|
|
18
|
-
def
|
19
|
-
|
20
|
-
JSON.parse(r.body)
|
31
|
+
def config
|
32
|
+
@rc
|
21
33
|
end
|
22
34
|
|
23
|
-
def
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
35
|
+
def method_missing(method_name, *args, &block)
|
36
|
+
case
|
37
|
+
when method_name.to_s =~ METHOD_PATTERNS[:users]
|
38
|
+
users HTTP_VERBS[$1.to_sym], args, $3.gsub(/_/, '/')
|
39
|
+
when method_name.to_s =~ METHOD_PATTERNS[:posts]
|
40
|
+
posts HTTP_VERBS[$1.to_sym], args, $3.gsub(/_/, '/')
|
41
|
+
else
|
42
|
+
super
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def respond_to_missing?(method_name, include_private = false)
|
47
|
+
method_name.to_s =~ METHOD_PATTERNS[:users] ||
|
48
|
+
method_name.to_s =~ METHOD_PATTERNS[:posts]
|
29
49
|
end
|
30
50
|
|
51
|
+
|
31
52
|
private
|
32
53
|
def add_oauth_header
|
33
|
-
@conn.authorization :bearer,
|
54
|
+
@conn.authorization :bearer, config['token']
|
55
|
+
end
|
56
|
+
|
57
|
+
# USERS
|
58
|
+
def users( verb, args, to_append='')
|
59
|
+
username = get_id_from_args args
|
60
|
+
username = 'me' if username.empty?
|
61
|
+
params_hash = get_params_from_args args
|
62
|
+
r = @conn.method(verb).call do |req|
|
63
|
+
req.url "#{users_url username}/#{to_append}"
|
64
|
+
req.params = params_hash
|
65
|
+
end
|
66
|
+
case to_append
|
67
|
+
when 'mentions', 'stars', 'posts'
|
68
|
+
Resources::Post.create_from_json r.body
|
69
|
+
else
|
70
|
+
Resources::User.create_from_json r.body
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
#POSTS
|
75
|
+
def posts( verb, args, to_append='')
|
76
|
+
id = get_id_from_args args
|
77
|
+
params_hash = get_params_from_args args
|
78
|
+
r = @conn.method(verb).call do |req|
|
79
|
+
req.url "#{posts_url id}/#{to_append}"
|
80
|
+
if verb.to_s == 'get'
|
81
|
+
req.params = params_hash
|
82
|
+
else
|
83
|
+
req.body = params_hash
|
84
|
+
end
|
85
|
+
end
|
86
|
+
case to_append
|
87
|
+
when 'reposters', 'stars'
|
88
|
+
Resources::User.create_from_json r.body
|
89
|
+
else
|
90
|
+
Resources::Post.create_from_json r.body
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def get_id_from_args( args )
|
95
|
+
if args.first && args.first.is_a?(String)
|
96
|
+
args.first
|
97
|
+
else
|
98
|
+
""
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def get_params_from_args( args )
|
103
|
+
if args.last && args.last.is_a?(Hash)
|
104
|
+
args.last
|
105
|
+
else
|
106
|
+
{}
|
107
|
+
end
|
34
108
|
end
|
35
109
|
|
36
110
|
end
|
37
111
|
|
38
|
-
end
|
112
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Brio
|
2
|
+
module Format
|
3
|
+
require 'csv'
|
4
|
+
require 'time'
|
5
|
+
require 'highline/import'
|
6
|
+
|
7
|
+
class CSV
|
8
|
+
POST_HEADER = ["id", "timestampt", "username", "text", "replies"]
|
9
|
+
USER_HEADER = ["username", "name", "joined", "followers", "following"]
|
10
|
+
|
11
|
+
def print_posts( posts )
|
12
|
+
say POST_HEADER.to_csv
|
13
|
+
posts.each do |post|
|
14
|
+
print_post post
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def print_post( post )
|
19
|
+
say [post.id, csv_formatted_time(post.created_at), post.user.username, post.text, post.num_replies].to_csv
|
20
|
+
end
|
21
|
+
|
22
|
+
def print_users( users )
|
23
|
+
say USER_HEADER.to_csv
|
24
|
+
users.each do |u|
|
25
|
+
print_user u
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def print_user( user )
|
30
|
+
say [user.username, user.name, csv_formatted_time(user.created_at), user.counts.followers, user.counts.following].to_csv
|
31
|
+
end
|
32
|
+
|
33
|
+
def set_wrap
|
34
|
+
$terminal.wrap_at = :auto
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
def csv_formatted_time( timestr )
|
39
|
+
Time.parse( timestr ).utc.strftime("%Y-%m-%d %H:%M:%S %z")
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
module Brio
|
2
|
+
module Format
|
3
|
+
require 'time'
|
4
|
+
require 'highline/import'
|
5
|
+
|
6
|
+
class Pretty
|
7
|
+
attr_accessor :wrap
|
8
|
+
|
9
|
+
HighLine.color_scheme = HighLine::ColorScheme.new do |cs|
|
10
|
+
cs[:username] = [ :red ]
|
11
|
+
cs[:end_line] = [ :yellow] #:rgb_aaaaaa
|
12
|
+
cs[:mention] = [ :black, :on_white ]
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
set_wrap
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
def print_posts( posts )
|
21
|
+
posts.each do |post|
|
22
|
+
print_post post
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def print_post( post )
|
27
|
+
say "<%= color(\"#{post.user.username}\", :username) %>"
|
28
|
+
if post.text
|
29
|
+
say "." * @wrap
|
30
|
+
say "#{post.text.strip}"
|
31
|
+
say "." * @wrap
|
32
|
+
end
|
33
|
+
say "<%= color('<id: #{post.id} | #{pretty_format_time(post.created_at)}#{reply_status post}> <replies #{post.num_replies}>', :end_line) %>"
|
34
|
+
say "\n"
|
35
|
+
end
|
36
|
+
|
37
|
+
def print_users( users )
|
38
|
+
users.each do |u|
|
39
|
+
print_user u
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def print_user( user )
|
44
|
+
say "\n"
|
45
|
+
say "<%= color(\"#{user.name}\", :username) %> [#{user.username}]"
|
46
|
+
if user.description.has_key? 'text'
|
47
|
+
say "." * @wrap
|
48
|
+
say "#{user.description.text.strip}"
|
49
|
+
say "." * @wrap
|
50
|
+
end
|
51
|
+
say "<%= color('<followers: #{user.counts.followers} | following: #{user.counts.following} | since: #{pretty_format_time(user.created_at, %{%b %e %Y})}> #{connection_stats user}', :end_line) %>"
|
52
|
+
say "\n"
|
53
|
+
end
|
54
|
+
|
55
|
+
def set_wrap
|
56
|
+
if $terminal.output_cols < 100
|
57
|
+
@wrap = $terminal.output_cols
|
58
|
+
else
|
59
|
+
@wrap = 100
|
60
|
+
end
|
61
|
+
$terminal.wrap_at = @wrap
|
62
|
+
end
|
63
|
+
|
64
|
+
def connection_stats( user )
|
65
|
+
"<follows you: #{truth_to_tick_char user.follows_you} | you follow: #{truth_to_tick_char user.you_follow}>"
|
66
|
+
end
|
67
|
+
|
68
|
+
def reply_status( post )
|
69
|
+
if post.reply_to
|
70
|
+
" | in reply to: #{post.reply_to}"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
def pretty_format_time( timestr, format = "%b %e %H:%M" )
|
76
|
+
time = Time.parse( timestr ).utc.getlocal
|
77
|
+
time.strftime(format)
|
78
|
+
end
|
79
|
+
|
80
|
+
def truth_to_tick_char( truth_str )
|
81
|
+
if truth_str
|
82
|
+
"\u2714"
|
83
|
+
else
|
84
|
+
"\u2717"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Brio
|
2
|
+
module Resources
|
3
|
+
|
4
|
+
class Resource
|
5
|
+
def initialize( attr_hash={} )
|
6
|
+
attr_hash.map do |(k,v)|
|
7
|
+
writer_m = "#{k}="
|
8
|
+
public_send("#{k}=", v) if respond_to? writer_m
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.create_from_json( json )
|
13
|
+
if json['data']
|
14
|
+
if json['data'].kind_of? Array
|
15
|
+
json['data'].map{ |post| self.new post }.reverse
|
16
|
+
else
|
17
|
+
self.new json['data']
|
18
|
+
end
|
19
|
+
else
|
20
|
+
NullResource.new json['meta']
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class NullResource
|
26
|
+
attr_reader :text
|
27
|
+
|
28
|
+
def initialize( data )
|
29
|
+
@text = "#{data['code']} - #{data['error_message']}"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
data/lib/brio/utils.rb
ADDED
data/lib/brio/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: brio
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-11-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -59,22 +59,86 @@ dependencies:
|
|
59
59
|
- - ! '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rspec
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: webmock
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: timecop
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: pry
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
62
126
|
- !ruby/object:Gem::Dependency
|
63
127
|
name: gli
|
64
128
|
requirement: !ruby/object:Gem::Requirement
|
65
129
|
none: false
|
66
130
|
requirements:
|
67
|
-
- -
|
131
|
+
- - ~>
|
68
132
|
- !ruby/object:Gem::Version
|
69
|
-
version: 2.
|
133
|
+
version: '2.4'
|
70
134
|
type: :runtime
|
71
135
|
prerelease: false
|
72
136
|
version_requirements: !ruby/object:Gem::Requirement
|
73
137
|
none: false
|
74
138
|
requirements:
|
75
|
-
- -
|
139
|
+
- - ~>
|
76
140
|
- !ruby/object:Gem::Version
|
77
|
-
version: 2.
|
141
|
+
version: '2.4'
|
78
142
|
- !ruby/object:Gem::Dependency
|
79
143
|
name: json
|
80
144
|
requirement: !ruby/object:Gem::Requirement
|
@@ -82,7 +146,7 @@ dependencies:
|
|
82
146
|
requirements:
|
83
147
|
- - ~>
|
84
148
|
- !ruby/object:Gem::Version
|
85
|
-
version: '1.
|
149
|
+
version: '1.7'
|
86
150
|
type: :runtime
|
87
151
|
prerelease: false
|
88
152
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -90,29 +154,29 @@ dependencies:
|
|
90
154
|
requirements:
|
91
155
|
- - ~>
|
92
156
|
- !ruby/object:Gem::Version
|
93
|
-
version: '1.
|
157
|
+
version: '1.7'
|
94
158
|
- !ruby/object:Gem::Dependency
|
95
159
|
name: launchy
|
96
160
|
requirement: !ruby/object:Gem::Requirement
|
97
161
|
none: false
|
98
162
|
requirements:
|
99
|
-
- -
|
163
|
+
- - ! '>='
|
100
164
|
- !ruby/object:Gem::Version
|
101
|
-
version: '2.
|
165
|
+
version: '2.1'
|
102
166
|
type: :runtime
|
103
167
|
prerelease: false
|
104
168
|
version_requirements: !ruby/object:Gem::Requirement
|
105
169
|
none: false
|
106
170
|
requirements:
|
107
|
-
- -
|
171
|
+
- - ! '>='
|
108
172
|
- !ruby/object:Gem::Version
|
109
|
-
version: '2.
|
173
|
+
version: '2.1'
|
110
174
|
- !ruby/object:Gem::Dependency
|
111
175
|
name: highline
|
112
176
|
requirement: !ruby/object:Gem::Requirement
|
113
177
|
none: false
|
114
178
|
requirements:
|
115
|
-
- -
|
179
|
+
- - ! '>='
|
116
180
|
- !ruby/object:Gem::Version
|
117
181
|
version: '1.6'
|
118
182
|
type: :runtime
|
@@ -120,7 +184,7 @@ dependencies:
|
|
120
184
|
version_requirements: !ruby/object:Gem::Requirement
|
121
185
|
none: false
|
122
186
|
requirements:
|
123
|
-
- -
|
187
|
+
- - ! '>='
|
124
188
|
- !ruby/object:Gem::Version
|
125
189
|
version: '1.6'
|
126
190
|
- !ruby/object:Gem::Dependency
|
@@ -128,7 +192,7 @@ dependencies:
|
|
128
192
|
requirement: !ruby/object:Gem::Requirement
|
129
193
|
none: false
|
130
194
|
requirements:
|
131
|
-
- -
|
195
|
+
- - ! '>='
|
132
196
|
- !ruby/object:Gem::Version
|
133
197
|
version: '4.3'
|
134
198
|
type: :runtime
|
@@ -136,7 +200,7 @@ dependencies:
|
|
136
200
|
version_requirements: !ruby/object:Gem::Requirement
|
137
201
|
none: false
|
138
202
|
requirements:
|
139
|
-
- -
|
203
|
+
- - ! '>='
|
140
204
|
- !ruby/object:Gem::Version
|
141
205
|
version: '4.3'
|
142
206
|
- !ruby/object:Gem::Dependency
|
@@ -146,7 +210,7 @@ dependencies:
|
|
146
210
|
requirements:
|
147
211
|
- - ! '>='
|
148
212
|
- !ruby/object:Gem::Version
|
149
|
-
version: '0'
|
213
|
+
version: '0.8'
|
150
214
|
type: :runtime
|
151
215
|
prerelease: false
|
152
216
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -154,8 +218,24 @@ dependencies:
|
|
154
218
|
requirements:
|
155
219
|
- - ! '>='
|
156
220
|
- !ruby/object:Gem::Version
|
157
|
-
version: '0'
|
158
|
-
|
221
|
+
version: '0.8'
|
222
|
+
- !ruby/object:Gem::Dependency
|
223
|
+
name: faraday_middleware
|
224
|
+
requirement: !ruby/object:Gem::Requirement
|
225
|
+
none: false
|
226
|
+
requirements:
|
227
|
+
- - ! '>='
|
228
|
+
- !ruby/object:Gem::Version
|
229
|
+
version: 0.8.8
|
230
|
+
type: :runtime
|
231
|
+
prerelease: false
|
232
|
+
version_requirements: !ruby/object:Gem::Requirement
|
233
|
+
none: false
|
234
|
+
requirements:
|
235
|
+
- - ! '>='
|
236
|
+
- !ruby/object:Gem::Version
|
237
|
+
version: 0.8.8
|
238
|
+
description: Interact with app.net through your command line.
|
159
239
|
email: tanja@heroesneverpanic.com
|
160
240
|
executables:
|
161
241
|
- brio
|
@@ -165,14 +245,20 @@ extra_rdoc_files:
|
|
165
245
|
- brio.rdoc
|
166
246
|
files:
|
167
247
|
- bin/brio
|
248
|
+
- lib/brio/utils.rb
|
168
249
|
- lib/brio/version.rb
|
169
250
|
- lib/brio/api.rb
|
170
251
|
- lib/brio/client.rb
|
171
252
|
- lib/brio/rcfile.rb
|
253
|
+
- lib/brio/format/csv.rb
|
254
|
+
- lib/brio/format/pretty.rb
|
255
|
+
- lib/brio/resources/resource.rb
|
256
|
+
- lib/brio/resources/user.rb
|
257
|
+
- lib/brio/resources/post.rb
|
172
258
|
- lib/brio.rb
|
173
259
|
- README.rdoc
|
174
260
|
- brio.rdoc
|
175
|
-
homepage: http://
|
261
|
+
homepage: http://github.com/klaut/brio
|
176
262
|
licenses: []
|
177
263
|
post_install_message:
|
178
264
|
rdoc_options:
|
@@ -201,5 +287,5 @@ rubyforge_project:
|
|
201
287
|
rubygems_version: 1.8.24
|
202
288
|
signing_key:
|
203
289
|
specification_version: 3
|
204
|
-
summary:
|
290
|
+
summary: CLI for app.net
|
205
291
|
test_files: []
|