3llo 0.1.8
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.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.travis.yml +5 -0
- data/3llo.gemspec +29 -0
- data/CODE_OF_CONDUCT.md +49 -0
- data/Gemfile +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +58 -0
- data/Rakefile +10 -0
- data/bin/3llo +29 -0
- data/lib/3llo/api/board.rb +47 -0
- data/lib/3llo/api/card.rb +93 -0
- data/lib/3llo/api/list.rb +37 -0
- data/lib/3llo/api/user.rb +34 -0
- data/lib/3llo/api.rb +4 -0
- data/lib/3llo/board_command_factory.rb +29 -0
- data/lib/3llo/card_command_factory.rb +49 -0
- data/lib/3llo/client.rb +62 -0
- data/lib/3llo/command_factory.rb +40 -0
- data/lib/3llo/commands/.gitkeep +0 -0
- data/lib/3llo/commands/board/invalid.rb +33 -0
- data/lib/3llo/commands/board/list.rb +29 -0
- data/lib/3llo/commands/board/select.rb +31 -0
- data/lib/3llo/commands/card/invalid.rb +36 -0
- data/lib/3llo/commands/card/list.rb +37 -0
- data/lib/3llo/commands/card/list_mine.rb +30 -0
- data/lib/3llo/commands/card/move.rb +43 -0
- data/lib/3llo/commands/card/self_assign.rb +31 -0
- data/lib/3llo/commands/card/show.rb +29 -0
- data/lib/3llo/commands/error.rb +18 -0
- data/lib/3llo/commands/exit.rb +16 -0
- data/lib/3llo/commands/help.rb +15 -0
- data/lib/3llo/commands/invalid.rb +18 -0
- data/lib/3llo/commands/list/cards.rb +29 -0
- data/lib/3llo/commands/list/invalid.rb +33 -0
- data/lib/3llo/commands/list/list.rb +29 -0
- data/lib/3llo/configuration.rb +39 -0
- data/lib/3llo/controller.rb +35 -0
- data/lib/3llo/errors.rb +7 -0
- data/lib/3llo/interface.rb +30 -0
- data/lib/3llo/list_command_factory.rb +29 -0
- data/lib/3llo/presenter/.gitkeep +0 -0
- data/lib/3llo/presenter/board/list.rb +25 -0
- data/lib/3llo/presenter/card/list.rb +43 -0
- data/lib/3llo/presenter/card/list_mine.rb +25 -0
- data/lib/3llo/presenter/card/move.rb +25 -0
- data/lib/3llo/presenter/card/show.rb +39 -0
- data/lib/3llo/presenter/help.rb +38 -0
- data/lib/3llo/presenter/list/cards.rb +41 -0
- data/lib/3llo/presenter/list/list.rb +25 -0
- data/lib/3llo/presenter.rb +8 -0
- data/lib/3llo/version.rb +3 -0
- data/lib/3llo.rb +14 -0
- data/lib/container.rb +24 -0
- data/lib/core_ext.rb +41 -0
- metadata +100 -0
@@ -0,0 +1,29 @@
|
|
1
|
+
module Tr3llo
|
2
|
+
module Command
|
3
|
+
module Board
|
4
|
+
class ListCommand
|
5
|
+
def initialize(user_id)
|
6
|
+
@user_id = user_id
|
7
|
+
end
|
8
|
+
|
9
|
+
def execute
|
10
|
+
Tr3llo::Presenter::Board::ListPresenter
|
11
|
+
.new(interface)
|
12
|
+
.print!(list_boards)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
attr_reader :user_id
|
18
|
+
|
19
|
+
def list_boards
|
20
|
+
API::Board.find_all_by_user(user_id)
|
21
|
+
end
|
22
|
+
|
23
|
+
def interface
|
24
|
+
$container.resolve(:interface)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Tr3llo
|
2
|
+
module Command
|
3
|
+
module Board
|
4
|
+
class SelectCommand
|
5
|
+
def initialize(board_id)
|
6
|
+
@board_id = board_id
|
7
|
+
end
|
8
|
+
|
9
|
+
def execute
|
10
|
+
board = load_board
|
11
|
+
$container.register(:board, board)
|
12
|
+
interface.print_frame do
|
13
|
+
interface.puts("Board #{board[:name].labelize} selected")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
attr_reader :board_id
|
20
|
+
|
21
|
+
def load_board
|
22
|
+
API::Board.find(board_id)
|
23
|
+
end
|
24
|
+
|
25
|
+
def interface
|
26
|
+
$container.resolve(:interface)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Tr3llo
|
2
|
+
module Command
|
3
|
+
module Card
|
4
|
+
class InvalidCommand
|
5
|
+
def execute
|
6
|
+
interface.print_frame do
|
7
|
+
interface.puts("Invalid command".red)
|
8
|
+
interface.puts(menu_text)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def menu_text
|
15
|
+
%q{
|
16
|
+
Available `card` commands
|
17
|
+
|
18
|
+
card list - Show list of cards grouped by list
|
19
|
+
card list mine - Show list of my cards
|
20
|
+
card show <card_id> - Show card information
|
21
|
+
card move <card_id> <list_id> - Move card to a list
|
22
|
+
card self-assign <card_id> - Self-assign a card
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
def container
|
27
|
+
$container
|
28
|
+
end
|
29
|
+
|
30
|
+
def interface
|
31
|
+
container.resolve(:interface)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Tr3llo
|
2
|
+
module Command
|
3
|
+
module Card
|
4
|
+
class ListCommand
|
5
|
+
def initialize(board_id)
|
6
|
+
@board_id = board_id
|
7
|
+
end
|
8
|
+
|
9
|
+
def execute
|
10
|
+
lists = load_lists
|
11
|
+
|
12
|
+
lists.each do |list|
|
13
|
+
Tr3llo::Presenter::Card::ListPresenter
|
14
|
+
.new(interface)
|
15
|
+
.print!(list, load_cards(list[:id]))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
attr_reader :board_id
|
22
|
+
|
23
|
+
def load_lists
|
24
|
+
API::List.find_all_by_board(board_id)
|
25
|
+
end
|
26
|
+
|
27
|
+
def load_cards(list_id)
|
28
|
+
API::Card.find_all_by_list(list_id)
|
29
|
+
end
|
30
|
+
|
31
|
+
def interface
|
32
|
+
$container.resolve(:interface)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Tr3llo
|
2
|
+
module Command
|
3
|
+
module Card
|
4
|
+
class ListMineCommand
|
5
|
+
def initialize(board_id, user_id)
|
6
|
+
@board_id = board_id
|
7
|
+
@user_id = user_id
|
8
|
+
end
|
9
|
+
|
10
|
+
def execute
|
11
|
+
Tr3llo::Presenter::Card::ListMinePresenter
|
12
|
+
.new(interface)
|
13
|
+
.print!(load_cards)
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
attr_reader :board_id, :user_id
|
19
|
+
|
20
|
+
def load_cards
|
21
|
+
API::Card.find_all_by_user(board_id, user_id)
|
22
|
+
end
|
23
|
+
|
24
|
+
def interface
|
25
|
+
$container.resolve(:interface)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Tr3llo
|
2
|
+
module Command
|
3
|
+
module Card
|
4
|
+
class MoveCommand
|
5
|
+
def initialize(card_id, list_id, board_id)
|
6
|
+
@card_id = card_id
|
7
|
+
@list_id = list_id
|
8
|
+
@board_id = board_id
|
9
|
+
end
|
10
|
+
|
11
|
+
def execute
|
12
|
+
interface.print_frame do
|
13
|
+
prompt_for_list_id!(board_id) unless list_id
|
14
|
+
move_card!
|
15
|
+
interface.puts("Card has been moved.")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
attr_reader :list_id, :card_id, :board_id
|
22
|
+
|
23
|
+
def prompt_for_list_id!(board_id)
|
24
|
+
board_id = $container.resolve(:board)[:id]
|
25
|
+
lists = Tr3llo::API::List.find_all_by_board(board_id)
|
26
|
+
|
27
|
+
@list_id =
|
28
|
+
Tr3llo::Presenter::Card::MovePresenter
|
29
|
+
.new(interface)
|
30
|
+
.prompt_for_list_id(lists)
|
31
|
+
end
|
32
|
+
|
33
|
+
def move_card!
|
34
|
+
API::Card.move_to_list(card_id, list_id)
|
35
|
+
end
|
36
|
+
|
37
|
+
def interface
|
38
|
+
$container.resolve(:interface)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Tr3llo
|
2
|
+
module Command
|
3
|
+
module Card
|
4
|
+
class SelfAssignCommand
|
5
|
+
def initialize(card_id, user_id)
|
6
|
+
@card_id = card_id
|
7
|
+
@user_id = user_id
|
8
|
+
end
|
9
|
+
|
10
|
+
def execute
|
11
|
+
card = assign_card
|
12
|
+
interface.print_frame do
|
13
|
+
interface.puts("Card #{card[:name].labelize} self-assigned")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
attr_reader :user_id, :card_id
|
20
|
+
|
21
|
+
def assign_card
|
22
|
+
API::Card.assign_members(card_id, [user_id])
|
23
|
+
end
|
24
|
+
|
25
|
+
def interface
|
26
|
+
$container.resolve(:interface)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Tr3llo
|
2
|
+
module Command
|
3
|
+
module Card
|
4
|
+
class ShowCommand
|
5
|
+
def initialize(card_id)
|
6
|
+
@card_id = card_id
|
7
|
+
end
|
8
|
+
|
9
|
+
def execute
|
10
|
+
Tr3llo::Presenter::Card::ShowPresenter
|
11
|
+
.new(interface)
|
12
|
+
.print!(load_card)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
attr_reader :card_id
|
18
|
+
|
19
|
+
def load_card
|
20
|
+
API::Card.find(card_id)
|
21
|
+
end
|
22
|
+
|
23
|
+
def interface
|
24
|
+
$container.resolve(:interface)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Tr3llo
|
2
|
+
module Command
|
3
|
+
class ErrorCommand
|
4
|
+
def execute
|
5
|
+
interface.print_frame do
|
6
|
+
command = "board select <board-id>".red
|
7
|
+
interface.puts("You have not selected any board. Run #{command} to select one.")
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def interface
|
14
|
+
$container.resolve(:interface)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Tr3llo
|
2
|
+
module Command
|
3
|
+
class InvalidCommand
|
4
|
+
def execute
|
5
|
+
interface.print_frame do
|
6
|
+
interface.puts("Invalid command!".red)
|
7
|
+
Presenter::HelpPresenter.new(interface).print!
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def interface
|
14
|
+
$container.resolve(:interface)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Tr3llo
|
2
|
+
module Command
|
3
|
+
module List
|
4
|
+
class CardsCommand
|
5
|
+
def initialize(list_id)
|
6
|
+
@list_id = list_id
|
7
|
+
end
|
8
|
+
|
9
|
+
def execute
|
10
|
+
Tr3llo::Presenter::List::CardsPresenter
|
11
|
+
.new(interface)
|
12
|
+
.print!(list_cards)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
attr_reader :list_id
|
18
|
+
|
19
|
+
def list_cards
|
20
|
+
API::Card.find_all_by_list(list_id)
|
21
|
+
end
|
22
|
+
|
23
|
+
def interface
|
24
|
+
$container.resolve(:interface)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Tr3llo
|
2
|
+
module Command
|
3
|
+
module List
|
4
|
+
class InvalidCommand
|
5
|
+
def execute
|
6
|
+
interface.print_frame do
|
7
|
+
interface.puts("Invalid command".red)
|
8
|
+
interface.puts(menu_text)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def menu_text
|
15
|
+
%q{
|
16
|
+
Available `list` commands
|
17
|
+
|
18
|
+
list list - Show all lists
|
19
|
+
list cards <list_id> - Show all cards in list
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
def container
|
24
|
+
$container
|
25
|
+
end
|
26
|
+
|
27
|
+
def interface
|
28
|
+
container.resolve(:interface)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Tr3llo
|
2
|
+
module Command
|
3
|
+
module List
|
4
|
+
class ListCommand
|
5
|
+
def initialize(board_id)
|
6
|
+
@board_id = board_id
|
7
|
+
end
|
8
|
+
|
9
|
+
def execute
|
10
|
+
Tr3llo::Presenter::List::ListPresenter
|
11
|
+
.new(interface)
|
12
|
+
.print!(list_lists)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
attr_reader :board_id
|
18
|
+
|
19
|
+
def list_lists
|
20
|
+
API::List.find_all_by_board(board_id)
|
21
|
+
end
|
22
|
+
|
23
|
+
def interface
|
24
|
+
$container.resolve(:interface)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Tr3llo
|
2
|
+
class Configuration
|
3
|
+
def initialize
|
4
|
+
@container = Container.new
|
5
|
+
end
|
6
|
+
|
7
|
+
def user_id=(value)
|
8
|
+
container.register(:user_id, value)
|
9
|
+
end
|
10
|
+
|
11
|
+
def user_id
|
12
|
+
container.resolve(:user_id)
|
13
|
+
end
|
14
|
+
|
15
|
+
def api_key=(value)
|
16
|
+
container.register(:api_key, value)
|
17
|
+
end
|
18
|
+
|
19
|
+
def api_key
|
20
|
+
container.resolve(:api_key)
|
21
|
+
end
|
22
|
+
|
23
|
+
def api_token=(token)
|
24
|
+
container.register(:api_token, token)
|
25
|
+
end
|
26
|
+
|
27
|
+
def api_token
|
28
|
+
container.resolve(:api_token)
|
29
|
+
end
|
30
|
+
|
31
|
+
def finalize!
|
32
|
+
container.freeze
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
attr_reader :container
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'readline'
|
2
|
+
|
3
|
+
module Tr3llo
|
4
|
+
class Controller
|
5
|
+
def initialize
|
6
|
+
end
|
7
|
+
|
8
|
+
def start
|
9
|
+
list = %w(board card help list mine move select self-assign show)
|
10
|
+
comp = proc { |s| list.grep( /^#{Regexp.escape(s)}/ ) }
|
11
|
+
|
12
|
+
Readline.completion_append_character = " "
|
13
|
+
Readline.completion_proc = comp
|
14
|
+
loop do
|
15
|
+
command_buffer = Readline.readline("\e[15;48;5;27m 3llo \e[0m > ", true)
|
16
|
+
begin
|
17
|
+
Tr3llo::CommandFactory
|
18
|
+
.new(command_buffer)
|
19
|
+
.factory
|
20
|
+
.execute
|
21
|
+
rescue Tr3llo::Client::RequestError => e
|
22
|
+
interface.print_frame { interface.puts(e.message) }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
rescue Interrupt
|
26
|
+
interface.print_frame { interface.puts('Bye Bye...') }
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def interface
|
32
|
+
$container.resolve(:interface)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/3llo/errors.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
module Tr3llo
|
2
|
+
class Interface
|
3
|
+
def initialize(input, output)
|
4
|
+
@input, @output = input, output
|
5
|
+
end
|
6
|
+
|
7
|
+
def print_frame
|
8
|
+
print_line("")
|
9
|
+
data = yield
|
10
|
+
print_line("")
|
11
|
+
data
|
12
|
+
end
|
13
|
+
|
14
|
+
def print_line(str)
|
15
|
+
output.puts(str)
|
16
|
+
end
|
17
|
+
alias :puts :print_line
|
18
|
+
|
19
|
+
def print(str)
|
20
|
+
output.print(str)
|
21
|
+
end
|
22
|
+
|
23
|
+
def prompt(message)
|
24
|
+
print("Enter list ID to be moved to: ")
|
25
|
+
input.gets.chomp
|
26
|
+
end
|
27
|
+
|
28
|
+
attr_reader :input, :output
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require '3llo/commands/list/list'
|
2
|
+
require '3llo/commands/list/cards'
|
3
|
+
require '3llo/commands/list/invalid'
|
4
|
+
|
5
|
+
module Tr3llo
|
6
|
+
class ListCommandFactory
|
7
|
+
def initialize(subcommand, args)
|
8
|
+
@subcommand = subcommand
|
9
|
+
@args = args
|
10
|
+
end
|
11
|
+
|
12
|
+
def factory
|
13
|
+
case subcommand.to_sym
|
14
|
+
when :list
|
15
|
+
board_id = $container.resolve(:board)[:id]
|
16
|
+
Command::List::ListCommand.new(board_id)
|
17
|
+
when :cards
|
18
|
+
list_id, _ = args
|
19
|
+
Command::List::CardsCommand.new(list_id)
|
20
|
+
else
|
21
|
+
Command::List::InvalidCommand.new
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
attr_reader :subcommand, :args
|
28
|
+
end
|
29
|
+
end
|
File without changes
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Tr3llo
|
2
|
+
module Presenter
|
3
|
+
module Board
|
4
|
+
class ListPresenter
|
5
|
+
def initialize(interface)
|
6
|
+
@interface = interface
|
7
|
+
end
|
8
|
+
|
9
|
+
def print!(boards)
|
10
|
+
interface.print_frame do
|
11
|
+
boards.each { |board| present_board(board) }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
attr_reader :interface
|
18
|
+
|
19
|
+
def present_board(board)
|
20
|
+
interface.puts "[#{board[:id].labelize}] - #{board[:name]}"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Tr3llo
|
2
|
+
module Presenter
|
3
|
+
module Card
|
4
|
+
class ListPresenter
|
5
|
+
def initialize(interface)
|
6
|
+
@interface = interface
|
7
|
+
end
|
8
|
+
|
9
|
+
def print!(list, cards)
|
10
|
+
interface.print_frame do
|
11
|
+
interface.puts("##{list[:name]}".purple)
|
12
|
+
interface.puts("=" * list[:name].length)
|
13
|
+
cards.each { |card| present_card(card) }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
attr_reader :interface
|
20
|
+
|
21
|
+
def present_card(card)
|
22
|
+
if card.has_key?(:labels)
|
23
|
+
label_str = card[:labels].map { |label| colorize_label(label) }.join(", ")
|
24
|
+
else
|
25
|
+
label_str = ''
|
26
|
+
end
|
27
|
+
|
28
|
+
if card[:subscribed]
|
29
|
+
subscribed_str = "[✓]"
|
30
|
+
else
|
31
|
+
subscribed_str = "[ ]"
|
32
|
+
end
|
33
|
+
|
34
|
+
interface.puts "#{subscribed_str} #{card[:id].labelize}] - #{card[:name]} (#{label_str})"
|
35
|
+
end
|
36
|
+
|
37
|
+
def colorize_label(label)
|
38
|
+
"##{label[:name]}".paint(label[:color])
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Tr3llo
|
2
|
+
module Presenter
|
3
|
+
module Card
|
4
|
+
class ListMinePresenter
|
5
|
+
def initialize(interface)
|
6
|
+
@interface = interface
|
7
|
+
end
|
8
|
+
|
9
|
+
def print!(cards)
|
10
|
+
interface.print_frame do
|
11
|
+
cards.each { |card| present_card(card) }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
attr_reader :interface
|
18
|
+
|
19
|
+
def present_card(card)
|
20
|
+
interface.puts "[#{card[:id].labelize}] - (#{card[:list][:name].purple}) - #{card[:name]}"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|