bell 0.0.1

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. data/.gitignore +5 -0
  2. data/.rvmrc +1 -0
  3. data/Gemfile +2 -0
  4. data/Gemfile.lock +47 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.org +128 -0
  7. data/Rakefile +16 -0
  8. data/bell.gemspec +30 -0
  9. data/bin/bell +5 -0
  10. data/features/create_user.feature +16 -0
  11. data/features/full_report.feature +84 -0
  12. data/features/import_public_contacts.feature +20 -0
  13. data/features/import_user_contacts.feature +43 -0
  14. data/features/list_all_contacts.feature +19 -0
  15. data/features/list_user_contacts.feature +27 -0
  16. data/features/list_users.feature +22 -0
  17. data/features/remove_user.feature +21 -0
  18. data/features/rename_user.feature +25 -0
  19. data/features/step_definitions/cli_steps.rb +59 -0
  20. data/features/step_definitions/contact_steps.rb +104 -0
  21. data/features/step_definitions/database_steps.rb +3 -0
  22. data/features/step_definitions/report_steps.rb +17 -0
  23. data/features/step_definitions/user_steps.rb +71 -0
  24. data/features/support/env.rb +65 -0
  25. data/features/user_report.feature +67 -0
  26. data/lib/bell/cli.rb +12 -0
  27. data/lib/bell/commands/command.rb +58 -0
  28. data/lib/bell/commands/contact_command.rb +91 -0
  29. data/lib/bell/commands/implosion_command.rb +14 -0
  30. data/lib/bell/commands/report_command.rb +69 -0
  31. data/lib/bell/commands/user_command.rb +74 -0
  32. data/lib/bell/commands.rb +5 -0
  33. data/lib/bell/csv_parser.rb +52 -0
  34. data/lib/bell/dispatcher.rb +13 -0
  35. data/lib/bell/displayable.rb +13 -0
  36. data/lib/bell/full_report.rb +145 -0
  37. data/lib/bell/handlers/contacts_handler.rb +79 -0
  38. data/lib/bell/handlers/implosions_handler.rb +9 -0
  39. data/lib/bell/handlers/reports_handler.rb +41 -0
  40. data/lib/bell/handlers/users_handler.rb +50 -0
  41. data/lib/bell/handlers.rb +4 -0
  42. data/lib/bell/message.rb +115 -0
  43. data/lib/bell/public_contact.rb +17 -0
  44. data/lib/bell/user.rb +16 -0
  45. data/lib/bell/user_contact.rb +18 -0
  46. data/lib/bell/user_report.rb +88 -0
  47. data/lib/bell/util.rb +31 -0
  48. data/lib/bell.rb +157 -0
  49. data/spec/bell/cli_spec.rb +4 -0
  50. data/spec/bell/commands/command_spec.rb +59 -0
  51. data/spec/bell/commands/contact_command_spec.rb +112 -0
  52. data/spec/bell/commands/implosion_command_spec.rb +31 -0
  53. data/spec/bell/commands/report_command_spec.rb +71 -0
  54. data/spec/bell/commands/user_command_spec.rb +128 -0
  55. data/spec/bell/csv_parser_spec.rb +167 -0
  56. data/spec/bell/dispatcher_spec.rb +4 -0
  57. data/spec/bell/full_report_spec.rb +4 -0
  58. data/spec/bell/handlers/contacts_handler_spec.rb +160 -0
  59. data/spec/bell/handlers/implosions_handler_spec.rb +11 -0
  60. data/spec/bell/handlers/reports_handler_spec.rb +183 -0
  61. data/spec/bell/handlers/users_handler_spec.rb +94 -0
  62. data/spec/bell/public_contact_spec.rb +4 -0
  63. data/spec/bell/user_contact_spec.rb +4 -0
  64. data/spec/bell/user_report_spec.rb +4 -0
  65. data/spec/bell/user_spec.rb +4 -0
  66. data/spec/spec_helper.rb +21 -0
  67. metadata +230 -0
@@ -0,0 +1,104 @@
1
+ Given /^a contact with name "([^"]*)" and number "([^"]*)" exists$/ do |contact_name, contact_number|
2
+ Bell::UserContact.create(:name => contact_name, :number => contact_number)
3
+ end
4
+
5
+ Given /^a contact with name "([^"]*)" exists$/ do |contact_name|
6
+ Given %{"#{random_name}" has a contact with name "#{contact_name}" and number "#{random_number}" in his contact list}
7
+ end
8
+
9
+ Given /^"([^"]*)" has a contact with name "([^"]*)" and number "([^"]*)" in his contact list$/ do |user_name, contact_name, contact_number|
10
+ user = Bell::User.find_or_create(:name => user_name)
11
+ user.add_contact(:name => contact_name, :number => contact_number)
12
+ end
13
+
14
+ Given /^"([^"]*)" has a contact with name "([^"]*)" in his contact list$/ do |user_name, contact_name|
15
+ Given %{"#{user_name}" has a contact with name "#{contact_name}" and number "#{random_number}" in his contact list}
16
+ end
17
+
18
+ Given /^"([^"]*)" has a contact with number "([^"]*)" in his contact list$/ do |user_name, contact_number|
19
+ Given %{"#{user_name}" has a contact with name "#{random_name}" and number "#{contact_number}" in his contact list}
20
+ end
21
+
22
+ Given /^"([^"]*)" doesn't have a contact with name "([^"]*)" in his contacts$/ do |user_name, contact_name|
23
+ user = Bell::User.find(:name => user_name)
24
+ Bell::UserContact.filter(:name => contact_name, :user_id => user.id).delete
25
+ end
26
+
27
+ Given /^a public contact with number "([^"]*)" and name "([^"]*)"$/ do |contact_number, contact_name|
28
+ Bell::PublicContact.create(:name => contact_name, :number => contact_number)
29
+ end
30
+
31
+ Given /^no contact with name "([^"]*)" exists$/ do |contact_name|
32
+ Bell::UserContact.filter(:name => contact_name).delete
33
+ end
34
+
35
+ Given /^no created contacts$/ do
36
+ Bell::UserContact.delete
37
+ end
38
+
39
+ When /^I list all contacts$/ do
40
+ Bell::Handlers::ContactsHandler.list
41
+ end
42
+
43
+ When /^I list the contacts for the user with name "([^"]*)"$/ do |user_name|
44
+ params = { :user => { :name => user_name }, :csv => @csv }
45
+ Bell::Handlers::ContactsHandler.list(params)
46
+ end
47
+
48
+ When /^I list the contacts for the user with name "([^"]*)" in CSV format$/ do |user_name|
49
+ @csv = true
50
+ When %{I list the contacts for the user with name "#{user_name}"}
51
+ end
52
+
53
+ When /^I request a contact import using "([^"]*)"$/ do |path|
54
+ Bell::Handlers::ContactsHandler.import(@params || { :path => File.join(TMP_PATH, path) })
55
+ end
56
+
57
+ When /^I request a contact import for "([^"]*)" using "([^"]*)"$/ do |user_name, path|
58
+ @params = { :path => File.join(TMP_PATH, path), :user => { :name => user_name } }
59
+ When %{I request a contact import using "#{path}"}
60
+ end
61
+
62
+ When /^I request a public contact import using "([^"]*)"$/ do |path|
63
+ @params = { :path => File.join(TMP_PATH, path), :public => true }
64
+ When %{I request a contact import using "#{path}"}
65
+ end
66
+
67
+ Then /^bell should tell me that "([^"]*)" already has "([^"]*)" in his contact list$/ do |user_name, contact_name|
68
+ user = Bell::User.find(:name => user_name)
69
+ contact = Bell::UserContact.find(:name => contact_name, :user_id => user.id)
70
+ Bell.output.string.chomp.should == Bell::Message.contact_name_taken(contact_name)
71
+ end
72
+
73
+ Then /^"([^"]*)" should have "([^"]*)" in his contact list$/ do |user_name, contact_name|
74
+ user = Bell::User.find(:name => user_name)
75
+ Bell::UserContact.find(:name => contact_name, :user_id => user.id).should_not be_nil
76
+ end
77
+
78
+ Then /^"([^"]*)" should be in the public contact list$/ do |contact_name|
79
+ Bell::PublicContact.find(:name => contact_name).should_not be_nil
80
+ end
81
+
82
+ Then /^bell should tell me that the number "([^"]*)" was already taken$/ do |contact_number|
83
+ Bell.output.string.chomp.should == Bell::Message.contact_number_taken(contact_number)
84
+ end
85
+
86
+ Then /^bell should tell me that the number "([^"]*)" has a bad format$/ do |contact_number|
87
+ Bell.output.string.chomp.should == Bell::Message.contact_number_bad_format(contact_number)
88
+ end
89
+
90
+ Then /^bell should tell me that the contact list of the user with name "([^"]*)" is empty$/ do |user_name|
91
+ Bell.output.string.chomp.should == Bell::Message.contact_list_empty(user_name)
92
+ end
93
+
94
+ Then /^I should not have a contact with name "([^"]*)" in the database$/ do |contact_name|
95
+ Bell::UserContact.find(:name => contact_name).should be_nil
96
+ end
97
+
98
+ Then /^bell should tell me that the contact "([^"]*)" was removed$/ do |contact_name|
99
+ Bell.output.string.chomp.should == Bell::Message.contact_removed(contact_name)
100
+ end
101
+
102
+ Then /^bell should tell me that there are no created contacts$/ do
103
+ Bell.output.string.chomp.should == Bell::Message.no_contacts_created
104
+ end
@@ -0,0 +1,3 @@
1
+ Given /^a clean slate$/ do
2
+ DB.tables.each { |table| DB[table].delete }
3
+ end
@@ -0,0 +1,17 @@
1
+ When /^I request a full report using "([^"]*)"$/ do |path|
2
+ path = File.join(TMP_PATH, path)
3
+ params = { :path => path }
4
+ Bell::Handlers::ReportsHandler.full_report(params)
5
+ end
6
+
7
+ When /^I request a user report using "([^"]*)"$/ do |path|
8
+ path = File.join(TMP_PATH, path)
9
+ params = { :path => path }
10
+ Bell::Handlers::ReportsHandler.user_report(params)
11
+ end
12
+
13
+ When /^I request a user report for "([^"]*)" using "([^"]*)"$/ do |user_name, path|
14
+ path = File.join(TMP_PATH, path)
15
+ params = { :path => path, :user => { :name => user_name } }
16
+ Bell::Handlers::ReportsHandler.user_report(params)
17
+ end
@@ -0,0 +1,71 @@
1
+ Given /^no user exists$/ do
2
+ Bell::User.delete
3
+ end
4
+
5
+ Given /^no user with name "([^"]*)" exists$/ do |user_name|
6
+ Bell::User.filter(:name => user_name).delete
7
+ end
8
+
9
+ Given /^a user with name "([^"]*)" exists$/ do |user_name|
10
+ Bell::User.create(:name => user_name)
11
+ end
12
+
13
+ Given /^"([^"]*)" has an empty contact list$/ do |user_name|
14
+ Bell::User.find(:name => user_name).remove_all_contacts
15
+ end
16
+
17
+ When /^I create a user with name "([^"]*)"$/ do |user_name|
18
+ params = { :user => { :name => user_name } }
19
+ Bell::Handlers::UsersHandler.create(params)
20
+ end
21
+
22
+ When /^I list all users$/ do
23
+ Bell::Handlers::UsersHandler.list
24
+ end
25
+
26
+ When /^I remove the user with name "([^"]*)"$/ do |user_name|
27
+ params = { :user => { :name => user_name } }
28
+ Bell::Handlers::UsersHandler.remove(params)
29
+ end
30
+
31
+ When /^I rename "([^"]*)" to "([^"]*)"$/ do |source_name, target_name|
32
+ params = { :user => { :source_name => source_name, :target_name => target_name } }
33
+ Bell::Handlers::UsersHandler.rename(params)
34
+ end
35
+
36
+ Then /^bell should tell me that there are no created users$/ do
37
+ Bell.output.string.chomp.should == Bell::Message.no_created_users
38
+ end
39
+
40
+ Then /^bell should tell me that a user with name "([^"]*)" was created$/ do |user_name|
41
+ Bell.output.string.chomp.should == Bell::Message.user_created(user_name)
42
+ end
43
+
44
+ Then /^bell should tell me that the user "([^"]*)" was removed$/ do |user_name|
45
+ Bell.output.string.chomp.should == Bell::Message.user_removed(user_name)
46
+ end
47
+
48
+ Then /^bell should tell me that the user "([^"]*)" already exists$/ do |user_name|
49
+ Bell.output.string.chomp.should == Bell::Message.user_already_exists(user_name)
50
+ end
51
+
52
+ Then /^bell should tell me that there is no user with name "([^"]*)"$/ do |user_name|
53
+ Bell.output.string.chomp.should == Bell::Message.user_does_not_exist(user_name)
54
+ end
55
+
56
+ Then /^I should have the user "([^"]*)" in the database$/ do |user_name|
57
+ Bell::User.find(:name => user_name).should_not be_nil
58
+ end
59
+
60
+ Then /^I should not have the user "([^"]*)" in the database$/ do |user_name|
61
+ Bell::User.find(:name => user_name).should be_nil
62
+ end
63
+
64
+ Then /^bell should tell me that the user "([^"]*)" was renamed to "([^"]*)"$/ do |source_name, target_name|
65
+ params = { :source_name => source_name, :target_name => target_name }
66
+ Bell.output.string.chomp.should == Bell::Message.user_renamed(params)
67
+ end
68
+
69
+ Then /^bell should tell me that "([^"]*)" has an empty contact list$/ do |user_name|
70
+ Bell.output.string.chomp.should == Bell::Message.contact_list_empty(user_name)
71
+ end
@@ -0,0 +1,65 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib')
2
+ require 'bell'
3
+
4
+ TMP_PATH = File.join(File.dirname(__FILE__), '..', '..', 'tmp')
5
+
6
+ After('@no-txn') do
7
+ Given 'a clean slate'
8
+ end
9
+
10
+ Before do
11
+ Bell.output.reopen
12
+ FileUtils.rm_rf(TMP_PATH)
13
+ FileUtils.mkdir_p(TMP_PATH)
14
+ end
15
+
16
+ at_exit do
17
+ FileUtils.rm_rf(TMP_PATH)
18
+ end
19
+
20
+ module Bell::StepDefinitionHelper
21
+ FIXTURES_PATH = File.join(File.dirname(__FILE__), '..', '..', 'spec', 'fixtures')
22
+
23
+ def inside_the_tmp_directory(&block)
24
+ FileUtils.chdir(TMP_PATH, &block)
25
+ end
26
+
27
+ def non_existing_file_path
28
+ "#{FIXTURES_PATH}/non_existing_file.csv"
29
+ end
30
+
31
+ def directory_path
32
+ "#{FIXTURES_PATH}"
33
+ end
34
+
35
+ def non_phone_bill_file_path
36
+ "#{FIXTURES_PATH}/text_file.txt"
37
+ end
38
+
39
+ def malformed_csv_file_path
40
+ "#{FIXTURES_PATH}/malformed_csv_file.csv"
41
+ end
42
+
43
+ def valid_phone_bill_file_path
44
+ "#{FIXTURES_PATH}/valid_phone_bill_file.csv"
45
+ end
46
+
47
+ def invalid_contacts_file_path
48
+ "#{FIXTURES_PATH}/invalid_contacts_file.csv"
49
+ end
50
+
51
+ def valid_contacts_file_path
52
+ "#{FIXTURES_PATH}/valid_contacts_file.csv"
53
+ end
54
+
55
+ def random_name
56
+ (0...8).map{65.+(rand(25)).chr}.join
57
+ end
58
+
59
+ def random_number
60
+ charset = %w[0 1 2 3 4 5 6 7 9]
61
+ (0...10).map{ charset.to_a[rand(charset.size)] }.join
62
+ end
63
+ end
64
+
65
+ World(Bell::StepDefinitionHelper)
@@ -0,0 +1,67 @@
1
+ @no-txn
2
+ Feature: Shell user requests an user report
3
+ As a person using the shell
4
+ I want to show user reports
5
+ In order to see how much each user spent on phone calls
6
+
7
+ Scenario: Non-existing file
8
+ When I request a user report using "/non/existent/path"
9
+ Then bell should tell me that "/non/existent/path" does not exist
10
+
11
+ Scenario: Directory
12
+ Given a directory named "tmp"
13
+ When I request a user report using "tmp"
14
+ Then bell should tell me that "tmp" is a directory
15
+
16
+ Scenario: Non CSV file
17
+ Given a file named "non_csv_file.txt" with:
18
+ """
19
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit
20
+ """
21
+ When I request a user report using "non_csv_file.txt"
22
+ Then bell should tell me that "non_csv_file.txt" is not a csv file
23
+
24
+ Scenario: Malformed CSV file
25
+ Given a file named "malformed_csv_file.csv" with:
26
+ """
27
+ "1", 'first"
28
+ """
29
+ When I request a full report using "malformed_csv_file.csv"
30
+ Then bell should tell me that "malformed_csv_file.csv" is a malformed csv file
31
+
32
+ Scenario: Phone bill file with invalid rows
33
+ Given a file named "invalid_rows.csv" with:
34
+ """
35
+ Detalhes da fatura
36
+
37
+ "Seq ","Origem ","Descrição ","Periodo/Data ","Terminal_Destino ","Local Origem","Local Destino ","Hora Inicio ","Hora Fim ","Imp ","Pais ","Qtde ","Unid ","Valor (R$) "
38
+ 1,"1634125644-FRANQUIA 01 ","04 - LIGACOES DDD PARA CELULARES ","11/08/10 A 99/99/99 ",1993692887,"SCL -SP ","CAS -SP ",02:56:29 AM," ","E "," ",
39
+ 2,"1634125644-FRANQUIA 01 ","04 - LIGACOES DDD PARA CELULARES ","11/08/10 A 99/99/99 ",1993692887,"SCL -SP ","CAS -SP ",02:59:03 AM," ","E "," ",900,"MIN ",1.3
40
+ 3,"1634125644-FRANQUIA 01 ","04 - LIGACOES DDD PARA CELULARES "
41
+
42
+ """
43
+ When I request a user report using "invalid_rows.csv"
44
+ Then bell should tell me that "invalid_rows.csv" has errors on line 4, 6
45
+
46
+ Scenario: Valid phone bill file
47
+ Given a user with name "bob" exists
48
+ And "bob" has a contact with name "earl" and number "1993692887" in his contact list
49
+ And a file named "fatura.csv" with:
50
+ """
51
+ Detalhes da fatura
52
+
53
+ "Seq ","Origem ","Descri��o ","Periodo/Data ","Terminal_Destino ","Local Origem","Local Destino ","Hora Inicio ","Hora Fim ","Imp ","Pais ","Qtde ","Unid ","Valor (R$) "
54
+ 1,"1634125644-FRANQUIA 01 ","04 - LIGACOES DDD PARA CELULARES ","11/08/10 A 99/99/99 ",1993692887,"SCL -SP ","CAS -SP ",02:56:29 AM," ","E "," ",500,"MIN ",0.73
55
+ 2,"1634125644-FRANQUIA 01 ","04 - LIGACOES DDD PARA CELULARES ","11/08/10 A 99/99/99 ",1993692887,"SCL -SP ","CAS -SP ",02:59:03 AM," ","E "," ",900,"MIN ",1.3
56
+ 3,"1634125644-FRANQUIA 01 ","04 - LIGACOES DDD PARA CELULARES ","13/08/10 A 99/99/99 ",1992563321,"SCL -SP ","CAS -SP ",09:07:55 PM," ","E "," ",5800,"MIN ",8.47
57
+
58
+ """
59
+ When I request a user report for "bob" using "fatura.csv"
60
+ Then the output should be:
61
+ """
62
+ Data Contato Número Horário Custo
63
+ 11/08/10 earl 1993692887 02:56:29 AM 0.73
64
+ 11/08/10 earl 1993692887 02:59:03 AM 1.30
65
+
66
+ Total: R$ 2.03
67
+ """
data/lib/bell/cli.rb ADDED
@@ -0,0 +1,12 @@
1
+ module Bell
2
+ module CLI
3
+ include Displayable
4
+
5
+ def self.run(args)
6
+ command = Commands::Command.new(args).parse
7
+ Dispatcher.dispatch(command.route)
8
+ rescue ArgumentError
9
+ display $!
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,58 @@
1
+ # encoding: utf-8
2
+
3
+ module Bell::Commands
4
+ class Command
5
+ CSV_FLAGS = %w[--csv]
6
+ USER_NAME_FLAGS = %w[-u --user]
7
+ CONTACT_NUMBER_FLAGS = %w[-n --number]
8
+
9
+ USAGE = <<-USAGE.gsub(/^ /, '')
10
+ uso: bell [--version] [--help] <comando> [<ação>] [<argumentos>]
11
+
12
+ Comandos:
13
+ user Cria, lista, renomeia ou remove usuários
14
+ contact Importa uma lista de contatos ou liste contatos
15
+ report Mostra relatórios completos, de usuário ou de ligação
16
+ implode Remove todos os usuários e contatos
17
+
18
+ Veja `bell help <comando>` para mais informações sobre um comando específico
19
+ USAGE
20
+
21
+ def initialize(args)
22
+ @args = args
23
+ @handler ||= nil
24
+ @action ||= nil
25
+ @params = {}
26
+ end
27
+
28
+ def route
29
+ { :handler => @handler,
30
+ :action => @action,
31
+ :params => @params }
32
+ end
33
+
34
+ def parse
35
+ case @args[0]
36
+ when 'user' then UserCommand.new(@args[1..-1]).parse
37
+ when 'contact' then ContactCommand.new(@args[1..-1]).parse
38
+ when 'report' then ReportCommand.new(@args[1..-1]).parse
39
+ when 'implode' then ImplosionCommand.new(@args[1..-1]).parse
40
+ else raise ArgumentError, USAGE
41
+ end
42
+ end
43
+
44
+ protected
45
+
46
+ def csv_given?
47
+ !(@args & CSV_FLAGS).empty?
48
+ end
49
+
50
+ def user_name_given?
51
+ !(@args & USER_NAME_FLAGS).empty?
52
+ end
53
+
54
+ def contact_number_given?
55
+ !(@args & USER_NAME_FLAGS).empty?
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,91 @@
1
+ # encoding: utf-8
2
+
3
+ module Bell::Commands
4
+ class ContactCommand < Command
5
+ USAGE = <<-USAGE.gsub(/^ /, '')
6
+ uso: bell contact [<ação>] [<argumentos>]
7
+
8
+ Ações:
9
+ list [--csv] [-u|--user <usuário>]
10
+ import [-f|--force] /path/para/lista/de/contatos.csv -u|--user <usuário>
11
+ USAGE
12
+
13
+ LIST_USAGE = <<-LIST_USAGE.gsub(/^ /, '')
14
+ uso: bell contact list [<argumentos>]
15
+
16
+ Argumentos:
17
+ --csv Lista de contatos em formato CSV
18
+ -u|--user <usuário> Lista somente os contatos de determinado usuário
19
+ LIST_USAGE
20
+
21
+ IMPORT_USAGE = <<-IMPORT_USAGE.gsub(/^ /, '')
22
+ uso: bell contact import /path/contatos.csv -u|--user <usuário> [<argumentos>]
23
+
24
+ Argumentos:
25
+ -f|--force Ignora a lista de contatos e faz uma importação forçada
26
+ IMPORT_USAGE
27
+
28
+ def initialize(args)
29
+ super(args)
30
+ @handler = 'contacts_handler'
31
+ @action = @args.shift
32
+ end
33
+
34
+ def parse
35
+ case @action
36
+ when 'import' then
37
+ if valid_contact_import_args?(@args)
38
+ @params = extract_contact_import_params(@args)
39
+ else
40
+ raise ArgumentError, IMPORT_USAGE
41
+ end
42
+ when 'list' then
43
+ if valid_contact_list_args?(@args)
44
+ @params = extract_contact_list_params(@args)
45
+ else
46
+ raise ArgumentError, LIST_USAGE
47
+ end
48
+ else
49
+ raise ArgumentError, USAGE
50
+ end
51
+
52
+ self
53
+ end
54
+
55
+ private
56
+
57
+ def valid_contact_import_args?(args)
58
+ (args.length == 3 && user_name_given?) ||
59
+ (args.length == 2 && args.any? { |e| e == '-p' || e == '--public' })
60
+ end
61
+
62
+ def valid_contact_list_args?(args)
63
+ args_without_csv = args.reject { |element| element == '--csv' }
64
+ user_name_given? ? args_without_csv.length == 2 : args_without_csv.length == 0
65
+ end
66
+
67
+ def extract_contact_import_params(args)
68
+ if user_name_given?
69
+ user_name_flag = (args & USER_NAME_FLAGS).first
70
+ user_name = args[args.index(user_name_flag) + 1]
71
+ args.reject! { |e| e == user_name_flag || e == user_name }
72
+ path = args[0]
73
+ { :path => path, :user => { :name => user_name } }
74
+ elsif args.any? { |e| e == '-p' || e == '--public' }
75
+ { :path => args.first, :public => true }
76
+ end
77
+ end
78
+
79
+ def extract_contact_list_params(args)
80
+ if user_name_given?
81
+ user_name_flag = (args & USER_NAME_FLAGS).first
82
+ user_name = args[args.index(user_name_flag) + 1]
83
+ csv_flag = !((args & CSV_FLAGS).first || []).empty?
84
+ params = { :user => { :name => user_name } }
85
+ csv_flag ? params.merge(:csv => csv_flag) : params
86
+ else
87
+ {}
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,14 @@
1
+ module Bell::Commands
2
+ class ImplosionCommand < Command
3
+ def initialize(args = [])
4
+ super(args)
5
+ @handler = 'implosions_handler'
6
+ end
7
+
8
+ def parse
9
+ @action = 'implode'
10
+
11
+ self
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,69 @@
1
+ # encoding: utf-8
2
+
3
+ module Bell::Commands
4
+ class ReportCommand < Command
5
+ USAGE = <<-USAGE.gsub(/^ /, '')
6
+ uso: bell report /path/fatura.csv [<argumentos>]
7
+
8
+ Argumentos:
9
+ -u|--user <usuário> Mostra relatório para o dado usuário
10
+ -n|--number <número> Mostra relatório para o dado número de telefone
11
+ USAGE
12
+
13
+ FULL_REPORT_USAGE = <<-FULL_REPORT_USAGE.gsub(/^ /, '')
14
+ uso: bell report /path/fatura.csv
15
+ FULL_REPORT_USAGE
16
+
17
+ USER_REPORT_USAGE = <<-USER_REPORT_USAGE.gsub(/^ /, '')
18
+ uso: bell report /path/fatura.csv -u <usuário>
19
+ USER_REPORT_USAGE
20
+
21
+ def initialize(args = [])
22
+ super(args)
23
+ @handler = 'reports_handler'
24
+ end
25
+
26
+ def parse
27
+ if full_report?
28
+ @action = 'full_report'
29
+ if @args[0]
30
+ @params = { :path => @args[0] }
31
+ else
32
+ raise ArgumentError, FULL_REPORT_USAGE
33
+ end
34
+ elsif user_report?
35
+ @action = 'user_report'
36
+ if valid_args_for_user_report?
37
+ @params = user_report_params
38
+ else
39
+ raise ArgumentError, USER_REPORT_USAGE
40
+ end
41
+ else
42
+ raise ArgumentError, USAGE
43
+ end
44
+
45
+ self
46
+ end
47
+
48
+ private
49
+
50
+ def full_report?
51
+ !user_name_given? && !contact_number_given?
52
+ end
53
+
54
+ def user_report?
55
+ user_name_given?
56
+ end
57
+
58
+ def valid_args_for_user_report?
59
+ @args.size > 2
60
+ end
61
+
62
+ def user_report_params
63
+ user_flag = (@args & USER_NAME_FLAGS).first
64
+ user_name = @args[@args.index(user_flag) + 1]
65
+
66
+ { :path => @args[0], :user => { :name => user_name } }
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,74 @@
1
+ # encoding: utf-8
2
+
3
+ module Bell::Commands
4
+ class UserCommand < Command
5
+ USAGE = <<-USAGE.gsub(/^ /, '')
6
+ uso: bell user [<ação>]
7
+
8
+ Ações:
9
+ create <usuário>
10
+ rename <nome anterior> <novo nome>
11
+ list
12
+ remove <usuário>
13
+ USAGE
14
+
15
+ CREATE_USAGE = <<-CREATE_USAGE.gsub(/^ /, '')
16
+ uso: bell user create <usuário>
17
+ CREATE_USAGE
18
+
19
+ RENAME_USAGE = <<-RENAME_USAGE.gsub(/^ /, '')
20
+ uso: bell user rename <nome anterior> <novo nome>
21
+ RENAME_USAGE
22
+
23
+ REMOVE_USAGE = <<-REMOVE_USAGE.gsub(/^ /, '')
24
+ uso: bell user create <usuário>
25
+ REMOVE_USAGE
26
+
27
+ def initialize(args = [])
28
+ super(args)
29
+ @handler = 'users_handler'
30
+ end
31
+
32
+ def parse
33
+ case @args[0]
34
+ when 'create' then
35
+ if @args[1]
36
+ @action = 'create'
37
+ @params = { :user => { :name => @args[1] } }
38
+ else
39
+ raise ArgumentError, CREATE_USAGE
40
+ end
41
+ when 'rename' then
42
+ if valid_args_for_user_rename?
43
+ @action = 'rename'
44
+ @params = user_rename_params
45
+ else
46
+ raise ArgumentError, RENAME_USAGE
47
+ end
48
+ when 'list' then
49
+ @action = 'list'
50
+ when 'remove' then
51
+ if @args[1]
52
+ @action = 'remove'
53
+ @params = { :user => { :name => @args[1] } }
54
+ else
55
+ raise ArgumentError, CREATE_USAGE
56
+ end
57
+ else
58
+ raise ArgumentError, USAGE
59
+ end
60
+
61
+ self
62
+ end
63
+
64
+ private
65
+
66
+ def valid_args_for_user_rename?
67
+ @args.length == 3
68
+ end
69
+
70
+ def user_rename_params
71
+ { :user => { :source_name => @args[1], :target_name => @args[2] } }
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,5 @@
1
+ require File.join(File.dirname(__FILE__), 'commands', 'command.rb')
2
+ require File.join(File.dirname(__FILE__), 'commands', 'user_command')
3
+ require File.join(File.dirname(__FILE__), 'commands', 'contact_command')
4
+ require File.join(File.dirname(__FILE__), 'commands', 'report_command')
5
+ require File.join(File.dirname(__FILE__), 'commands', 'implosion_command')