ayadn 1.8.2 → 2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -0
  3. data/CHANGELOG.md +73 -52
  4. data/README.md +17 -3
  5. data/ayadn.gemspec +3 -4
  6. data/doc/01-index.md +6 -5
  7. data/doc/02-install.md +23 -1
  8. data/doc/03-first-steps.md +22 -28
  9. data/doc/04-options.md +1 -1
  10. data/doc/05-streams.md +29 -9
  11. data/doc/06-post.md +13 -5
  12. data/doc/07-actions.md +63 -1
  13. data/doc/08-listings.md +112 -4
  14. data/doc/09-accounts.md +17 -3
  15. data/doc/10-nicerank.md +5 -5
  16. data/doc/11-blacklist.md +8 -14
  17. data/doc/12-alias.md +1 -13
  18. data/doc/14-set.md +8 -110
  19. data/doc/15-nowplaying.md +16 -4
  20. data/doc/18-contact.md +14 -13
  21. data/doc/19-examples.md +2 -0
  22. data/lib/ayadn/action.rb +322 -183
  23. data/lib/ayadn/alias.rb +17 -45
  24. data/lib/ayadn/annotations.rb +1 -1
  25. data/lib/ayadn/api.rb +7 -8
  26. data/lib/ayadn/app.rb +99 -12
  27. data/lib/ayadn/authorize.rb +92 -57
  28. data/lib/ayadn/blacklist.rb +52 -62
  29. data/lib/ayadn/check.rb +81 -74
  30. data/lib/ayadn/cnx.rb +77 -26
  31. data/lib/ayadn/databases.rb +890 -105
  32. data/lib/ayadn/debug.rb +30 -89
  33. data/lib/ayadn/descriptions.rb +876 -329
  34. data/lib/ayadn/endpoints.rb +2 -2
  35. data/lib/ayadn/errors.rb +9 -9
  36. data/lib/ayadn/extend.rb +8 -1
  37. data/lib/ayadn/fileops.rb +10 -8
  38. data/lib/ayadn/mark.rb +79 -56
  39. data/lib/ayadn/migration.rb +427 -0
  40. data/lib/ayadn/nicerank.rb +74 -72
  41. data/lib/ayadn/nowplaying.rb +123 -60
  42. data/lib/ayadn/nowwatching.rb +26 -10
  43. data/lib/ayadn/pinboard.rb +12 -7
  44. data/lib/ayadn/post.rb +40 -37
  45. data/lib/ayadn/profile.rb +5 -2
  46. data/lib/ayadn/scroll.rb +20 -5
  47. data/lib/ayadn/search.rb +30 -22
  48. data/lib/ayadn/set.rb +146 -50
  49. data/lib/ayadn/settings.rb +66 -67
  50. data/lib/ayadn/status.rb +459 -234
  51. data/lib/ayadn/stream.rb +80 -46
  52. data/lib/ayadn/switch.rb +51 -47
  53. data/lib/ayadn/tvshow.rb +47 -15
  54. data/lib/ayadn/version.rb +1 -1
  55. data/lib/ayadn/view.rb +119 -60
  56. data/lib/ayadn/workers.rb +144 -92
  57. data/lib/ayadn.rb +7 -8
  58. data/spec/mock/ayadn/accounts.sqlite +0 -0
  59. data/spec/mock/ayadn.sqlite +0 -0
  60. data/spec/unit/annotations_spec.rb +12 -13
  61. data/spec/unit/api_spec.rb +3 -4
  62. data/spec/unit/blacklistworkers_spec.rb +18 -23
  63. data/spec/unit/databases_spec.rb +51 -36
  64. data/spec/unit/endpoints_spec.rb +5 -2
  65. data/spec/unit/extend_spec.rb +24 -0
  66. data/spec/unit/nicerank_spec.rb +13 -13
  67. data/spec/unit/post_spec.rb +47 -36
  68. data/spec/unit/set_spec.rb +67 -96
  69. data/spec/unit/view_spec.rb +12 -6
  70. data/spec/unit/workers_spec.rb +38 -12
  71. data/tags +1285 -0
  72. metadata +29 -39
  73. data/spec/mock/aliases.db +0 -0
  74. data/spec/mock/blacklist.db +0 -0
  75. data/spec/mock/bookmarks.db +0 -0
  76. data/spec/mock/channels.db +0 -0
  77. data/spec/mock/index.db +0 -0
  78. data/spec/mock/nicerank.db +0 -0
  79. data/spec/mock/pagination.db +0 -0
  80. data/spec/mock/users.db +0 -0
  81. data/spec/unit/status_spec.rb +0 -9
@@ -2,50 +2,95 @@
2
2
  module Ayadn
3
3
  class Authorize
4
4
 
5
+ def initialize
6
+ @thor = Thor::Shell::Color.new # local statuses
7
+ @status = Status.new # global statuses + utils
8
+ end
9
+
5
10
  def authorize
11
+ puts "\n"
12
+ if File.exist?(Dir.home + "/ayadn/accounts.db")
13
+ @status.has_to_migrate
14
+ exit
15
+ end
6
16
  puts "\e[H\e[2J"
7
- try_remove_old_ayadn
8
17
  show_link
9
18
  token = get_token
10
19
  check_token(token)
11
- puts "\n\nThanks! Contacting App.net...\n".color(:green)
20
+ puts "\e[H\e[2J"
21
+ @thor.say_status :connexion, "downloading user info", :yellow
12
22
  user = create_user_data(token, Dir.home + "/ayadn")
13
23
  prepare(user)
14
- puts "Creating configuration...\n".color(:green)
24
+ @thor.say_status :create, "configuration", :yellow
15
25
  Settings.load_config
16
26
  Logs.create_logger
17
27
  install
18
- puts Status.done
19
- Errors.info "Done!"
20
- puts "\nThank you for using Ayadn. Enjoy!\n\n".color(:yellow)
28
+ @thor.say_status :done, "user #{user.handle} is authorized", :green
29
+ Errors.info "#{user.handle} authorized."
30
+ @status.say { @thor.say_status :end, "Thank you for using Ayadn. Enjoy!", :green }
31
+ Switch.new.list
32
+ end
33
+
34
+ def unauthorize(user, options)
35
+ begin
36
+ @workers = Workers.new
37
+ if user.size > 1
38
+ @status.one_username
39
+ exit
40
+ end
41
+ user = @workers.remove_arobase_if_present(user)[0]
42
+ puts "\e[H\e[2J"
43
+ if options[:delete]
44
+ sure = @thor.yes?("Are you sure you want to unauthorize user @#{user} and delete its folders?\n\n> ", :red)
45
+ else
46
+ sure = @thor.yes?("Are you sure you want to unauthorize user @#{user} ?\n\n> ", :red)
47
+ end
48
+ unless sure == true
49
+ Status.new.canceled
50
+ exit
51
+ end
52
+ puts "\e[H\e[2J"
53
+ @thor.say_status :delete, "database entry for @#{user}", :yellow
54
+ db = Amalgalite::Database.new(Dir.home + "/ayadn/accounts.sqlite")
55
+ Databases.remove_from_accounts(db, user)
56
+ if options[:delete]
57
+ @thor.say_status :delete, "@#{user} user folders", :yellow
58
+ FileUtils.remove_dir(Dir.home + "/ayadn/#{user}")
59
+ end
60
+ @thor.say_status :done, "user @#{user} has been unauthorized", :green
61
+ puts "\n"
62
+ rescue Interrupt
63
+ Status.new.canceled
64
+ exit
65
+ end
21
66
  end
22
67
 
23
68
  private
24
69
 
25
70
  def prepare(user)
26
- puts "Ok! Creating Ayadn folders...\n".color(:green)
71
+ @thor.say_status :create, "user folders", :yellow
27
72
  create_config_folders(user)
28
- puts "Saving user token...\n".color(:green)
73
+ @thor.say_status :save, "user token", :yellow
29
74
  create_token_file(user)
30
- puts "Creating user account for #{user.handle}...\n".color(:green)
31
- accounts_db = Databases.init("#{user.home_path}/accounts.db")
32
- create_account(user, accounts_db)
75
+ @thor.say_status :create, "Ayadn account", :yellow
76
+ acc_db = Amalgalite::Database.new(Dir.home + "/ayadn/accounts.sqlite")
77
+ user_db = Amalgalite::Database.new("#{user.user_path}/db/ayadn.sqlite")
78
+ if user_db.schema.tables.empty?
79
+ Databases.create_tables(user)
80
+ end
81
+ if acc_db.schema.tables.empty?
82
+ Databases.create_account_table(acc_db)
83
+ end
84
+ Databases.create_account(acc_db, user)
33
85
  end
34
86
 
35
87
  def install
36
- puts "Creating api and config files...\n".color(:green)
37
- Errors.info "Creating api, version and config files..."
88
+ @thor.say_status :create, "api and config files", :yellow
89
+ Errors.info "Creating api and config files..."
38
90
  Errors.info "Creating version file..."
39
91
  Settings.init_config
40
92
  end
41
93
 
42
- def create_account(user, accounts_db)
43
- accounts_db[user.username] = {username: user.username, id: user.id, handle: user.handle, path: user.user_path}
44
- accounts_db['ACTIVE'] = user.username
45
- accounts_db.flush
46
- accounts_db.close
47
- end
48
-
49
94
  def create_token_file(user)
50
95
  File.write("#{user.user_path}/auth/token", user.token)
51
96
  end
@@ -53,70 +98,60 @@ module Ayadn
53
98
  def create_config_folders(user)
54
99
  begin
55
100
  FileUtils.mkdir_p(user.user_path)
56
- %w{log db pagination config auth downloads backup posts messages lists}.each do |target|
101
+ %w{log db config auth downloads posts messages lists}.each do |target|
57
102
  Dir.mkdir("#{user.user_path}/#{target}") unless Dir.exist?("#{user.user_path}/#{target}")
58
103
  end
59
104
  rescue => e
60
- puts "\nError creating Ayadn #{user.handle} account folders.\n\n"
61
- puts "Error: #{e}"
105
+ @status.say do
106
+ @thor.say_status :error, "can't create #{user.handle} account folders", :red
107
+ end
108
+ @status.say { puts "\nError: #{e}" }
62
109
  exit
63
110
  end
64
111
  end
65
112
 
66
113
  def show_link
67
- puts "\nPlease click this URL, or open a browser then copy/paste it:\n".color(:cyan)
68
- puts Endpoints.new.authorize_url
69
- puts "\n"
70
- puts "On this page, log in with your App.net account to authorize Ayadn.\n".color(:cyan)
71
- puts "You will then be redirected to a page showing a 'user token' (your secret code).\n".color(:cyan)
72
- puts "Copy it then paste it here:\n".color(:yellow)
73
- print "> "
114
+ @status.say do
115
+ @thor.say_status :please, "click or copy/paste this URL in a browser", :yellow
116
+ puts "\n"
117
+ puts "\t#{Endpoints.new.authorize_url}"
118
+ puts "\n"
119
+ @thor.say_status :next, "log in to authorize Ayadn", :cyan
120
+ @thor.say_status nil, "you will be redirected to your 'user token'"
121
+ @thor.say_status :please, "copy/paste the token here:", :yellow
122
+ end
123
+ print "\t> "
74
124
  end
75
125
 
76
126
  def get_user(token)
77
- JSON.parse(RestClient.get("https://api.app.net/users/me?access_token=#{token}", :verify_ssl => OpenSSL::SSL::VERIFY_NONE) {|response, request, result| response })
127
+ begin
128
+ JSON.parse(RestClient.get("https://api.app.net/users/me?access_token=#{token}", :verify_ssl => OpenSSL::SSL::VERIFY_NONE) {|response, request, result| response })
129
+ rescue Exception => e
130
+ @status.say do
131
+ @thor.say_status :error, "connection problem", :red
132
+ end
133
+ puts "#{e}"
134
+ end
78
135
  end
79
136
 
80
137
  def get_token
81
138
  begin
82
139
  STDIN.gets.chomp()
83
140
  rescue Interrupt
84
- puts Status.canceled
141
+ @status.canceled
85
142
  exit
86
143
  end
87
144
  end
88
145
 
89
146
  def check_token(token)
90
147
  if token.empty? || token.nil?
91
- puts "\n\nOops, something went wrong, I couldn't get the token. Please try again.\n\n".color(:red)
92
- exit
93
- end
94
- end
95
-
96
- def try_remove_old_ayadn
97
- if FileOps.old_ayadn?
98
- answer = ask_del_old_ayadn
99
- unless answer.downcase == "y"
100
- puts Status.canceled
101
- exit
102
- end
103
- puts "\nDeleting old version...\n".color(:green)
104
- begin
105
- old_dir = Dir.home + "/ayadn"
106
- FileUtils.remove_dir(old_dir)
107
- rescue => e
108
- puts "Unable to remove folder: #{old_dir}\n\n".color(:red)
109
- raise e
148
+ @status.say do
149
+ @thor.say_status :error, "couldn't get the token", :red
110
150
  end
151
+ exit
111
152
  end
112
153
  end
113
154
 
114
- def ask_del_old_ayadn
115
- puts "\nAn obsolete version of Ayadn has been detected and will be deleted. Install and authorize the new version? [y/N]\n".color(:red)
116
- print "> "
117
- STDIN.getch
118
- end
119
-
120
155
  def create_user_data(token, home_path)
121
156
  resp = get_user(token)
122
157
  model = Struct.new(:resp, :username, :id, :handle, :home_path, :user_path, :token)
@@ -5,44 +5,44 @@ module Ayadn
5
5
  map "create" => :add
6
6
  long_desc Descriptions.blacklist_add
7
7
  def add(*args)
8
- abort(Status.type_and_target_missing) if args.length < 2
8
+ if args.length < 2
9
+ Status.new.type_and_target_missing
10
+ exit
11
+ end
9
12
  BlacklistWorkers.new.add(args)
10
- puts Status.done
13
+ Status.new.done
11
14
  end
12
15
 
13
16
  desc "remove TYPE TARGET", "Removes a mention, hashtag, client or username from your blacklist"
14
17
  map "delete" => :remove
15
18
  long_desc Descriptions.blacklist_remove
16
19
  def remove(*args)
17
- abort(Status.type_and_target_missing) if args.length < 2
20
+ if args.length < 2
21
+ Status.new.type_and_target_missing
22
+ exit
23
+ end
18
24
  BlacklistWorkers.new.remove(args)
19
- puts Status.done
25
+ Status.new.done
20
26
  end
21
27
 
22
28
  desc "list", "List the content of your blacklist"
23
29
  long_desc Descriptions.blacklist_list
24
30
  option :raw, aliases: "-x", type: :boolean, desc: "Outputs the raw list in CSV"
31
+ option :compact, aliases: "-k", type: :boolean, desc: "Force the view to be compact if not already"
25
32
  def list
26
33
  BlacklistWorkers.new.list(options)
27
34
  end
28
35
 
29
- desc "import DATABASE", "Imports a blacklist database from another Ayadn account"
30
- long_desc Descriptions.blacklist_import
31
- def import(database)
32
- BlacklistWorkers.new.import(database)
33
- end
34
-
35
- desc "convert", "Convert your current blacklist database to the new format"
36
- long_desc Descriptions.blacklist_convert
37
- def convert
38
- BlacklistWorkers.new.convert
39
- puts Status.done
40
- end
36
+ # desc "import DATABASE", "Imports a blacklist database from another Ayadn account"
37
+ # long_desc Descriptions.blacklist_import
38
+ # def import(database)
39
+ # BlacklistWorkers.new.import(database)
40
+ # end
41
41
 
42
42
  desc "clear", "Clear your blacklist database"
43
43
  def clear
44
44
  BlacklistWorkers.new.clear
45
- puts Status.done
45
+ Status.new.done
46
46
  end
47
47
 
48
48
  end
@@ -56,39 +56,29 @@ module Ayadn
56
56
  Databases.open_databases
57
57
  @workers = Workers.new
58
58
  end
59
- def import(database)
60
- begin
61
- new_db = File.realpath(database)
62
- if File.exist?(new_db)
63
- Databases.import_blacklist(new_db)
64
- Logs.rec.info "Imported '#{new_db}' values in blacklist database."
65
- else
66
- puts "\nFile '#{new_db}' doesn't exist.\n\n".color(:red)
67
- Logs.rec.warn "File '#{new_db}' doesn't exist."
68
- end
69
- ensure
70
- Databases.close_all
71
- end
72
- end
73
- def convert
74
- begin
75
- Databases.convert_blacklist
76
- ensure
77
- Databases.close_all
78
- end
79
- end
59
+ # def import(database)
60
+ # begin
61
+ # new_db = File.realpath(database)
62
+ # if File.exist?(new_db)
63
+ # Databases.import_blacklist(new_db)
64
+ # Logs.rec.info "Imported '#{new_db}' values in blacklist database."
65
+ # else
66
+ # puts "\nFile '#{new_db}' doesn't exist.\n\n".color(:red)
67
+ # Logs.rec.warn "File '#{new_db}' doesn't exist."
68
+ # end
69
+ # end
70
+ # end
80
71
  def clear
81
72
  begin
82
- puts "\n\nAre you sure you want to erase all the content of your blacklist database?\n\n[y/N]\n".color(:red)
73
+ Status.new.ask_clear_blacklist
83
74
  input = STDIN.getch
84
75
  if input == 'y' || input == 'Y'
85
76
  Databases.clear_blacklist
86
77
  Logs.rec.info "Cleared the blacklist database."
87
78
  else
88
- abort Status.canceled
79
+ Status.new.canceled
80
+ exit
89
81
  end
90
- ensure
91
- Databases.close_all
92
82
  end
93
83
  end
94
84
  def add(args)
@@ -96,24 +86,24 @@ module Ayadn
96
86
  type = args.shift
97
87
  case type
98
88
  when 'user', 'username', 'account'
89
+ target = @workers.remove_arobase_if_present(args)
90
+ Databases.add_to_blacklist('user', target)
99
91
  target = @workers.add_arobases_to_usernames args
100
- Databases.add_user_to_blacklist(target)
101
92
  Logs.rec.info "Added '#{target}' to blacklist of users."
102
93
  when 'mention', 'mentions'
94
+ target = @workers.remove_arobase_if_present(args)
95
+ Databases.add_to_blacklist('mention', target)
103
96
  target = @workers.add_arobases_to_usernames args
104
- Databases.add_mention_to_blacklist(target)
105
97
  Logs.rec.info "Added '#{target}' to blacklist of mentions."
106
98
  when 'client', 'source'
107
- Databases.add_client_to_blacklist(args)
99
+ Databases.add_to_blacklist('client', args)
108
100
  Logs.rec.info "Added '#{args}' to blacklist of clients."
109
101
  when 'hashtag', 'tag'
110
- Databases.add_hashtag_to_blacklist(args)
102
+ Databases.add_to_blacklist('hashtag', args)
111
103
  Logs.rec.info "Added '#{args}' to blacklist of hashtags."
112
104
  else
113
- puts Status.wrong_arguments
105
+ Status.new.wrong_arguments
114
106
  end
115
- ensure
116
- Databases.close_all
117
107
  end
118
108
  end
119
109
  def remove(args)
@@ -121,44 +111,44 @@ module Ayadn
121
111
  type = args.shift
122
112
  case type
123
113
  when 'user', 'username', 'account'
124
- temp = @workers.add_arobases_to_usernames args
125
- target = temp.map {|u| "-#{u}"}
126
- Databases.remove_from_blacklist(target)
114
+ Databases.remove_from_blacklist(args)
115
+ target = @workers.add_arobases_to_usernames(args)
127
116
  Logs.rec.info "Removed '#{target}' from blacklist of users."
128
117
  when 'mention', 'mentions'
129
- target = @workers.add_arobases_to_usernames args
130
- Databases.remove_from_blacklist(target)
118
+ Databases.remove_from_blacklist(args)
119
+ target = @workers.add_arobases_to_usernames(args)
131
120
  Logs.rec.info "Removed '#{target}' from blacklist of mentions."
132
121
  when 'client', 'source', 'hashtag', 'tag'
133
122
  Databases.remove_from_blacklist(args)
134
123
  Logs.rec.info "Removed '#{type}:#{args}' from blacklist."
135
124
  else
136
- puts Status.wrong_arguments
125
+ Status.new.wrong_arguments
137
126
  end
138
- ensure
139
- Databases.close_all
140
127
  end
141
128
  end
142
129
  def list(options)
143
130
  begin
131
+ Settings.options[:timeline][:compact] = true if options[:compact] == true
144
132
  show_list(options)
145
- ensure
146
- Databases.close_all
147
133
  end
148
134
  end
149
135
 
150
136
  private
151
137
 
152
138
  def show_list(options)
153
- list = Databases.blacklist
139
+ list = Databases.all_blacklist
154
140
  unless list.empty?
155
141
  if options[:raw]
156
- list.each {|v,k| puts "#{v},#{k}"}
142
+ xx = list.map {|obj| [obj[0], obj[1].to_s.force_encoding("UTF-8")] }
143
+ puts xx.to_json
157
144
  else
145
+ puts "\n"
158
146
  puts Workers.new.build_blacklist_list(list)
147
+ puts "\n"
159
148
  end
160
149
  else
161
- abort(Status.empty_list)
150
+ Status.new.empty_list
151
+ exit
162
152
  end
163
153
  end
164
154
  end