list-tool 1.0.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 (61) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.rspec +2 -0
  4. data/Gemfile +4 -0
  5. data/Guardfile +8 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +29 -0
  8. data/Rakefile +1 -0
  9. data/bin/clt +12 -0
  10. data/lib/list_tool/app/commands/add_item_command.rb +39 -0
  11. data/lib/list_tool/app/commands/add_list_command.rb +30 -0
  12. data/lib/list_tool/app/commands/delete_item_command.rb +39 -0
  13. data/lib/list_tool/app/commands/delete_list_command.rb +32 -0
  14. data/lib/list_tool/app/commands/help_command.rb +24 -0
  15. data/lib/list_tool/app/commands/rename_list_command.rb +34 -0
  16. data/lib/list_tool/app/commands/replace_item_command.rb +34 -0
  17. data/lib/list_tool/app/commands/show_items_command.rb +35 -0
  18. data/lib/list_tool/app/commands/show_lists_command.rb +26 -0
  19. data/lib/list_tool/app/commands/unknown_command.rb +26 -0
  20. data/lib/list_tool/app/commands/use_command.rb +31 -0
  21. data/lib/list_tool/app/commands/version_command.rb +24 -0
  22. data/lib/list_tool/app/commands.rb +43 -0
  23. data/lib/list_tool/app/printer.rb +41 -0
  24. data/lib/list_tool/app/runner.rb +54 -0
  25. data/lib/list_tool/app/string.rb +9 -0
  26. data/lib/list_tool/app.rb +9 -0
  27. data/lib/list_tool/data.rb +75 -0
  28. data/lib/list_tool/file_manager.rb +27 -0
  29. data/lib/list_tool/item.rb +23 -0
  30. data/lib/list_tool/json_parser.rb +11 -0
  31. data/lib/list_tool/list.rb +88 -0
  32. data/lib/list_tool/lister.rb +81 -0
  33. data/lib/list_tool/version.rb +3 -0
  34. data/lib/list_tool.rb +19 -0
  35. data/list_tool.gemspec +31 -0
  36. data/spec/fixtures/data.json +18 -0
  37. data/spec/list_tool/app/commands/add_item_command_spec.rb +108 -0
  38. data/spec/list_tool/app/commands/add_list_command_spec.rb +74 -0
  39. data/spec/list_tool/app/commands/delete_item_command_spec.rb +116 -0
  40. data/spec/list_tool/app/commands/delete_list_command_spec.rb +89 -0
  41. data/spec/list_tool/app/commands/help_command_spec.rb +41 -0
  42. data/spec/list_tool/app/commands/rename_list_command_spec.rb +95 -0
  43. data/spec/list_tool/app/commands/replace_item_command_spec.rb +97 -0
  44. data/spec/list_tool/app/commands/show_items_command_spec.rb +111 -0
  45. data/spec/list_tool/app/commands/show_lists_command_spec.rb +48 -0
  46. data/spec/list_tool/app/commands/unknown_command_spec.rb +31 -0
  47. data/spec/list_tool/app/commands/use_command_spec.rb +79 -0
  48. data/spec/list_tool/app/commands/version_comand_spec.rb +41 -0
  49. data/spec/list_tool/app/commands_spec.rb +80 -0
  50. data/spec/list_tool/app/printer_spec.rb +54 -0
  51. data/spec/list_tool/app/runner_spec.rb +166 -0
  52. data/spec/list_tool/app/string_spec.rb +32 -0
  53. data/spec/list_tool/data_spec.rb +257 -0
  54. data/spec/list_tool/file_manager_spec.rb +84 -0
  55. data/spec/list_tool/item_spec.rb +42 -0
  56. data/spec/list_tool/json_parser_spec.rb +14 -0
  57. data/spec/list_tool/list_spec.rb +221 -0
  58. data/spec/list_tool/lister_spec.rb +186 -0
  59. data/spec/spec_helper.rb +18 -0
  60. data/spec/support/factory.rb +33 -0
  61. metadata +213 -0
@@ -0,0 +1,89 @@
1
+ require_relative '../../../spec_helper.rb'
2
+
3
+ describe ListTool::App::DeleteListCommand do
4
+ subject { ListTool::App::DeleteListCommand }
5
+
6
+ describe '.match?' do
7
+ it 'returns true if "dl" or "del-list" given' do
8
+ expect( subject.match? "dl" ).to be_truthy
9
+ expect( subject.match? "del-list" ).to be_truthy
10
+ end
11
+
12
+ it 'returns false otherwise' do
13
+ expect( subject.match? "some-arg" ).to be_falsey
14
+ end
15
+ end
16
+
17
+
18
+ describe '.parse' do
19
+ it 'shifts 1 arg from ARGV' do
20
+ argv = ['2']
21
+ expect( argv ).to receive(:shift).with(no_args).and_return('2')
22
+ subject.parse argv
23
+ end
24
+
25
+ context 'success' do
26
+ it 'returns {list: list_num}' do
27
+ expect( subject.parse(['2']) ).to eq( {list: 1} )
28
+ end
29
+ end
30
+
31
+ context 'failure' do
32
+
33
+ context 'when list number not given' do
34
+ it 'raises ArgumentError' do
35
+ expect{ subject.parse[] }.to raise_error(ArgumentError)
36
+ end
37
+ end
38
+
39
+ context 'when list number is not a integer' do
40
+ it 'raises ArgumentError' do
41
+ expect{ subject.parse(["not_an_integer"]) }.to raise_error(ArgumentError)
42
+ end
43
+ end
44
+
45
+ context 'when list number is less than 1' do
46
+ it 'raises ArgumentError' do
47
+ expect{ subject.parse(['0']) }.to raise_error( ArgumentError )
48
+ end
49
+ end
50
+
51
+ context 'when not an array given' do
52
+ it 'raises ArgumentError' do
53
+ expect{ subject.parse "not_an_array" }.to raise_error( ArgumentError )
54
+ end
55
+ end
56
+
57
+ end
58
+
59
+ end
60
+
61
+
62
+ describe '.execute' do
63
+ let (:lister) { ListTool::Lister.new }
64
+
65
+ context 'success' do
66
+ it 'calls lister.delete_list with given list number' do
67
+ expect(lister).to receive(:delete_list).with(2).and_return("not_nil")
68
+ subject.execute({list: 2}, lister)
69
+ end
70
+ end
71
+
72
+ context 'failure' do
73
+ context 'when list not found' do
74
+ it 'raises ListNotFoundError' do
75
+ expect{ subject.execute({list: -2}, lister) }.to raise_error(ListTool::ListNotFoundError )
76
+ end
77
+ end
78
+ end
79
+
80
+ end
81
+
82
+
83
+ describe '.help' do
84
+ it 'returns help message' do
85
+ expect( subject.help ).to be_a String
86
+ end
87
+ end
88
+
89
+ end
@@ -0,0 +1,41 @@
1
+ require_relative '../../../spec_helper.rb'
2
+
3
+ describe ListTool::App::HelpCommand do
4
+ subject { ListTool::App::HelpCommand }
5
+
6
+ describe '.match?' do
7
+ it 'returns true if "h", "-h", "help" or "--help" given' do
8
+ expect( subject.match? "h" ).to be_truthy
9
+ expect( subject.match? "-h" ).to be_truthy
10
+ expect( subject.match? "help" ).to be_truthy
11
+ expect( subject.match? "--help" ).to be_truthy
12
+ end
13
+
14
+ it 'returns false otherwise' do
15
+ expect( subject.match? "some-arg" ).to be_falsey
16
+ end
17
+ end
18
+
19
+
20
+ describe '.parse' do
21
+ it 'always returns {}' do
22
+ expect( subject.parse nil ).to eq( {} )
23
+ end
24
+ end
25
+
26
+
27
+ describe '.execute' do
28
+ it 'calls Printer.print_usage' do
29
+ expect(ListTool::App::Printer).to receive(:print_usage)
30
+ subject.execute( {}, nil )
31
+ end
32
+ end
33
+
34
+
35
+ describe '.help' do
36
+ it 'returns help message' do
37
+ expect( subject.help ).to be_a String
38
+ end
39
+ end
40
+
41
+ end
@@ -0,0 +1,95 @@
1
+ require_relative '../../../spec_helper.rb'
2
+
3
+ describe ListTool::App::RenameListCommand do
4
+ subject { ListTool::App::RenameListCommand }
5
+
6
+ describe '.match?' do
7
+ it 'returns true if "rl" or "rename-list" given' do
8
+ expect( subject.match? "rl" ).to be_truthy
9
+ expect( subject.match? "rename-list" ).to be_truthy
10
+ end
11
+
12
+ it 'returns false otherwise' do
13
+ expect( subject.match? "some-arg" ).to be_falsey
14
+ end
15
+ end
16
+
17
+
18
+ describe '.parse' do
19
+ it 'shifts 2 arg from ARGV' do
20
+ argv = ['2', 'name']
21
+ expect( argv ).to receive(:shift).with(2).and_return(['2', 'name'])
22
+ subject.parse argv
23
+ end
24
+
25
+ context 'success' do
26
+ it 'returns name and list num' do
27
+ expect( subject.parse(['2', 'new name']) ).to eq( {name: "new name", list: 1} )
28
+ end
29
+ end
30
+
31
+ context 'failure' do
32
+
33
+ context 'when list number not given' do
34
+ it 'raises ArgumentError' do
35
+ expect{ subject.parse[] }.to raise_error(ArgumentError)
36
+ end
37
+ end
38
+
39
+ context 'when list number is not a integer' do
40
+ it 'raises ArgumentError' do
41
+ expect{ subject.parse(["not_an_integer", 'new name']) }.to raise_error(ArgumentError)
42
+ end
43
+ end
44
+
45
+ context 'when list number is less than 1' do
46
+ it 'raises ArgumentError' do
47
+ expect{ subject.parse(['0', 'new name']) }.to raise_error( ArgumentError )
48
+ end
49
+ end
50
+
51
+ context 'when new name not given' do
52
+ it 'raises ArgumentError' do
53
+ expect{ subject.parse(["2"]) }.to raise_error(ArgumentError)
54
+ end
55
+ end
56
+
57
+ context 'when not an array given' do
58
+ it 'raises ArgumentError' do
59
+ expect{ subject.parse "not_an_array" }.to raise_error( ArgumentError )
60
+ end
61
+ end
62
+
63
+ end
64
+
65
+ end
66
+
67
+
68
+ describe '.execute' do
69
+ let (:lister) { ListTool::Lister.new }
70
+
71
+ context 'success' do
72
+ it 'calls lister.rename_list with given list number and name' do
73
+ expect(lister).to receive(:rename_list).with(2, "new name").and_return("not_nil")
74
+ subject.execute({name: 'new name', list: 2}, lister)
75
+ end
76
+ end
77
+
78
+ context 'failure' do
79
+ context 'when list not found' do
80
+ it 'raises ListNotFoundError' do
81
+ expect{ subject.execute({name: 'new name' ,list: -2}, lister) }.to raise_error(ListTool::ListNotFoundError )
82
+ end
83
+ end
84
+ end
85
+
86
+ end
87
+
88
+
89
+ describe '.help' do
90
+ it 'returns help message' do
91
+ expect( subject.help ).to be_a String
92
+ end
93
+ end
94
+
95
+ end
@@ -0,0 +1,97 @@
1
+ require_relative '../../../spec_helper.rb'
2
+
3
+ describe ListTool::App::ReplaceItemCommand do
4
+ subject { ListTool::App::ReplaceItemCommand }
5
+
6
+ describe '.match?' do
7
+ it 'returns true if "r" or "replace-item" given' do
8
+ expect( subject.match? "r" ).to be_truthy
9
+ expect( subject.match? "replace-item" ).to be_truthy
10
+ end
11
+
12
+ it 'returns false otherwise' do
13
+ expect( subject.match? "some-arg" ).to be_falsey
14
+ end
15
+ end
16
+
17
+
18
+ describe '.parse' do
19
+ it 'shifts 2 arg from ARGV' do
20
+ argv = ['2', 'name']
21
+ expect( argv ).to receive(:shift).with(2).and_return(['2', 'name'])
22
+ subject.parse argv
23
+ end
24
+
25
+ context 'success' do
26
+ it 'returns name and item num' do
27
+ expect( subject.parse(['2', 'new name']) ).to eq( {name: "new name", item: 1} )
28
+ end
29
+ end
30
+
31
+ context 'failure' do
32
+
33
+ context 'when item number not given' do
34
+ it 'raises ArgumentError' do
35
+ expect{ subject.parse[] }.to raise_error(ArgumentError)
36
+ end
37
+ end
38
+
39
+ context 'when item number is not a integer' do
40
+ it 'raises ArgumentError' do
41
+ expect{ subject.parse(["not_an_integer", 'new name']) }.to raise_error(ArgumentError)
42
+ end
43
+ end
44
+
45
+ context 'when item number is less than 1' do
46
+ it 'raises ArgumentError' do
47
+ expect{ subject.parse(['0', 'new name']) }.to raise_error( ArgumentError )
48
+ end
49
+ end
50
+
51
+ context 'when new name not given' do
52
+ it 'raises ArgumentError' do
53
+ expect{ subject.parse(["2"]) }.to raise_error(ArgumentError)
54
+ end
55
+ end
56
+
57
+ context 'when not an array given' do
58
+ it 'raises ArgumentError' do
59
+ expect{ subject.parse "not_an_array" }.to raise_error( ArgumentError )
60
+ end
61
+ end
62
+
63
+ end
64
+
65
+ end
66
+
67
+
68
+ describe '.execute' do
69
+ let (:lister) { ListTool::Lister.new }
70
+
71
+ context 'success' do
72
+ it 'calls lister.replace_item with given item number and name' do
73
+ expect(lister).to receive(:change_item).with(2, "new name").and_return("not_nil")
74
+ subject.execute({name: 'new name', item: 2}, lister)
75
+ end
76
+ end
77
+
78
+ context 'failure' do
79
+
80
+ context 'when item not found' do
81
+ it 'raises ItemNotFoundError' do
82
+ allow(lister).to receive(:change_item).and_return(nil)
83
+ expect{ subject.execute({name: 'new name', item: -2}, lister) }.to raise_error( ListTool::ItemNotFoundError )
84
+ end
85
+ end
86
+ end
87
+
88
+ end
89
+
90
+
91
+ describe '.help' do
92
+ it 'returns help message' do
93
+ expect( subject.help ).to be_a String
94
+ end
95
+ end
96
+
97
+ end
@@ -0,0 +1,111 @@
1
+ require_relative '../../../spec_helper.rb'
2
+
3
+ describe ListTool::App::ShowItemsCommand do
4
+ subject { ListTool::App::ShowItemsCommand }
5
+
6
+ describe '.match?' do
7
+ it 'returns true if "s" or "show-items" given' do
8
+ expect( subject.match? "s" ).to be_truthy
9
+ expect( subject.match? "show-items" ).to be_truthy
10
+ end
11
+
12
+ it 'returns false otherwise' do
13
+ expect( subject.match? "some-arg" ).to be_falsey
14
+ end
15
+ end
16
+
17
+
18
+ describe '.parse' do
19
+ it 'shifts 1 arg from ARGV' do
20
+ argv = ['text']
21
+ expect( argv ).to receive(:shift).with(no_args)
22
+ subject.parse argv
23
+ end
24
+
25
+ context 'success' do
26
+ context 'when list number is not given' do
27
+ it 'returns empty hash' do
28
+ expect( subject.parse([]) ).to eq( {} )
29
+ end
30
+ end
31
+
32
+ context 'when list number is given' do
33
+ it 'returns {list: list_num}' do
34
+ expect( subject.parse(["1"]) ).to eq( {list: 0} )
35
+ end
36
+ end
37
+ end
38
+
39
+ context 'failure' do
40
+ context 'when list number is not an integer' do
41
+ it 'raises ArgumentError' do
42
+ expect{ subject.parse(['not_an_int']) }.to raise_error( ArgumentError )
43
+ end
44
+ end
45
+
46
+ context 'when list number is less than 1' do
47
+ it 'raises ArgumentError' do
48
+ expect{ subject.parse(['0']) }.to raise_error( ArgumentError )
49
+ end
50
+ end
51
+
52
+ context 'when not an array given' do
53
+ it 'raises ArgumentError' do
54
+ expect{ subject.parse "not_an_array" }.to raise_error( ArgumentError )
55
+ end
56
+ end
57
+ end
58
+
59
+ end
60
+
61
+
62
+ describe '.execute' do
63
+ let (:lister) { ListTool::Lister.new }
64
+ let (:printer) { ListTool::App::Printer }
65
+
66
+ context 'success' do
67
+ context 'list number not given' do
68
+ it 'gets default list contents' do
69
+ expect(lister).to receive(:list).with(no_args).and_return([])
70
+ allow(printer).to receive(:print_items)
71
+ subject.execute({}, lister)
72
+ end
73
+ end
74
+
75
+ context 'list number is given' do
76
+ it 'gets given list contents' do
77
+ expect(lister).to receive(:list).with(1).and_return([])
78
+ allow(printer).to receive(:print_items)
79
+ subject.execute({list: 1}, lister)
80
+ end
81
+ end
82
+
83
+ it 'calls printer.print_items' do
84
+ allow(lister).to receive(:list).with(no_args).and_return(['item1', 'item2'])
85
+ expect(printer).to receive(:print_items).with(['item1', 'item2'])
86
+ subject.execute({}, lister)
87
+ end
88
+ end
89
+
90
+ context 'failure' do
91
+ context 'when list not found' do
92
+ it 'raises ListNotFoundError' do
93
+ expect{ subject.execute({list: 2}, lister) }.to raise_error(ListTool::ListNotFoundError )
94
+ end
95
+ end
96
+
97
+ context 'when list not specified and no default list set' do
98
+ it 'raises NoDefaultListError' do
99
+ expect{ subject.execute({}, lister) }.to raise_error(ListTool::NoDefaultListError )
100
+ end
101
+ end
102
+ end
103
+ end
104
+
105
+
106
+ describe '.help' do
107
+ it 'returns help message' do
108
+ expect( subject.help ).to be_a String
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,48 @@
1
+ require_relative '../../../spec_helper.rb'
2
+
3
+ describe ListTool::App::ShowListsCommand do
4
+ subject { ListTool::App::ShowListsCommand }
5
+
6
+ describe '.match?' do
7
+ it 'returns true if "sl" or "show-lists" given' do
8
+ expect( subject.match? "sl" ).to be_truthy
9
+ expect( subject.match? "show-lists" ).to be_truthy
10
+ end
11
+
12
+ it 'returns false otherwise' do
13
+ expect( subject.match? "some-arg" ).to be_falsey
14
+ end
15
+ end
16
+
17
+
18
+ describe '.parse' do
19
+ it 'returns {}' do
20
+ expect( subject.parse [] ).to eq( {} )
21
+ end
22
+ end
23
+
24
+
25
+ describe '.execute' do
26
+ let (:lister) { ListTool::Lister.new }
27
+ let (:printer) { ListTool::App::Printer }
28
+
29
+ it 'gets array of lists' do
30
+ expect(lister).to receive(:lists)
31
+ allow(printer).to receive(:print_lists)
32
+ subject.execute( {}, lister )
33
+ end
34
+
35
+ it 'sends array of lists to printer' do
36
+ allow(lister).to receive(:lists).and_return(['list1'])
37
+ expect(printer).to receive(:print_lists).with(['list1'])
38
+ subject.execute( {}, lister )
39
+ end
40
+ end
41
+
42
+
43
+ describe '.help' do
44
+ it 'returns help message' do
45
+ expect( subject.help ).to be_a String
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,31 @@
1
+ require_relative '../../../spec_helper.rb'
2
+
3
+ describe ListTool::App::UnknownCommand do
4
+ subject { ListTool::App::UnknownCommand }
5
+
6
+ describe '.match?' do
7
+ it 'returns true always' do
8
+ expect( subject.match? (65+rand(26)).chr ).to be_truthy
9
+ end
10
+
11
+ it 'stores command to a class variable' do
12
+ subject.match? "a"
13
+ expect(subject.instance_variable_get(:@unknown_command)).to eq 'a'
14
+ end
15
+ end
16
+
17
+
18
+ describe '.parse' do
19
+ it 'does nothing and returns {}' do
20
+ expect( subject.parse [] ).to eq({})
21
+ end
22
+ end
23
+
24
+
25
+ describe '.execute' do
26
+ it 'raises UnknownCommandError' do
27
+ expect{ subject.execute({}, nil) }.to raise_error(ListTool::UnknownCommandError)
28
+ end
29
+ end
30
+
31
+ end
@@ -0,0 +1,79 @@
1
+ require_relative '../../../spec_helper.rb'
2
+
3
+ describe ListTool::App::UseCommand do
4
+ subject { ListTool::App::UseCommand }
5
+
6
+ describe '.match?' do
7
+ it 'returns true if "u" or "use" given' do
8
+ expect( subject.match? "u" ).to be_truthy
9
+ expect( subject.match? "use" ).to be_truthy
10
+ end
11
+
12
+ it 'returns false otherwise' do
13
+ expect( subject.match? "some-arg" ).to be_falsey
14
+ end
15
+ end
16
+
17
+
18
+ describe '.parse' do
19
+ context 'success' do
20
+ it 'returns {List: list_num}' do
21
+ expect( subject.parse(["2"]) ).to eq( {list: 1} )
22
+ end
23
+ end
24
+
25
+ context 'failure' do
26
+ context 'when list number not given' do
27
+ it 'raises ArgumentError' do
28
+ expect{ subject.parse([]) }.to raise_error( ArgumentError )
29
+ end
30
+ end
31
+
32
+ context 'when list number is not an integer' do
33
+ it 'raises ArgumentError' do
34
+ expect{ subject.parse(['not_an_int']) }.to raise_error( ArgumentError )
35
+ end
36
+ end
37
+
38
+ context 'when list number is less than 1' do
39
+ it 'raises ArgumentError' do
40
+ expect{ subject.parse(['0']) }.to raise_error( ArgumentError )
41
+ end
42
+ end
43
+
44
+ context 'when not an array given' do
45
+ it 'raises ArgumentError' do
46
+ expect{ subject.parse "not_an_array" }.to raise_error( ArgumentError )
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+
53
+ describe '.execute' do
54
+ context 'success' do
55
+ it 'sets default list' do
56
+ lister = double()
57
+ expect( lister ).to receive(:set_default_list).with(1).and_return("not_nil")
58
+ subject.execute({list: 1}, lister)
59
+ end
60
+ end
61
+
62
+ context 'failure' do
63
+ context 'when list not found' do
64
+ it 'raises ListNotFoundError' do
65
+ lister = ListTool::Lister.new
66
+ expect{ subject.execute({list: 1}, lister) }.to raise_error(ListTool::ListNotFoundError)
67
+ end
68
+ end
69
+ end
70
+ end
71
+
72
+
73
+ describe '.help' do
74
+ it 'returns help message' do
75
+ expect( subject.help ).to be_a String
76
+ end
77
+ end
78
+
79
+ end
@@ -0,0 +1,41 @@
1
+ require_relative '../../../spec_helper.rb'
2
+
3
+ describe ListTool::App::VersionCommand do
4
+ subject { ListTool::App::VersionCommand }
5
+
6
+ describe '.match?' do
7
+ it 'returns true if "v", "-v", "version", or "--version" given' do
8
+ expect( subject.match? "v" ).to be_truthy
9
+ expect( subject.match? "-v" ).to be_truthy
10
+ expect( subject.match? "version" ).to be_truthy
11
+ expect( subject.match? "--version" ).to be_truthy
12
+ end
13
+
14
+ it 'returns false otherwise' do
15
+ expect( subject.match? "some-arg" ).to be_falsey
16
+ end
17
+ end
18
+
19
+
20
+ describe '.parse' do
21
+ it 'always returns {}' do
22
+ expect( subject.parse nil ).to eq( {} )
23
+ end
24
+ end
25
+
26
+
27
+ describe '.execute' do
28
+ it 'calls Printer.print_version' do
29
+ expect(ListTool::App::Printer).to receive(:print_version)
30
+ subject.execute( {}, nil )
31
+ end
32
+ end
33
+
34
+
35
+ describe '.help' do
36
+ it 'returns help message' do
37
+ expect( subject.help ).to be_a String
38
+ end
39
+ end
40
+
41
+ end