3llo 1.0.0 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8e6ca4c800b73fb0a5514e1a87204547c243045b9e3a0b5842f327513b726073
4
- data.tar.gz: c6bc2f0e09bd27a558c8914d34734863efce9d6b534d2bae38d5d1267d378eb7
3
+ metadata.gz: 1d1461854cddc2b1c620478538b38f7500d885d935c22921cd90e249359e492e
4
+ data.tar.gz: 757aea8fd3cd7bd43394f5d4ca32f34695008252e23d48bf9b523535d3093247
5
5
  SHA512:
6
- metadata.gz: 035ff3a48dcfe77e558d5eec4e341dcfc78caf0b6d55fa60c91f8a9d56b32a8d8221634e78ec3f34e26fc13c9d10df130017483fd3b9bcfb5aa0c64ce3d19e0f
7
- data.tar.gz: 152e793d22f7db0ab50d9504c3d2c2d36051dcfa74293931d368a5e58ec9b176fa34f77215498566947fc6851a33bc9eadc3f891fbe43fa0221be13407d1c9b7
6
+ metadata.gz: c970411655be89226255b61ef97f69d9d12067c3eae1dbda1f227868be53c0d2977f2d1c4e630a0d6aa944c94deb9fa8c86a2a681e62b2c48cfa7bf4710a1dbc
7
+ data.tar.gz: 8a53b15db5b4209400bc85141522a2d0afc2fe2702d4c0187b8856ca3f3d6ffbe2c88c6e906d78be55f562b0b31f729a3737b3ca1bbe63aa57194ce9eddd2216
data/.rubocop.yml CHANGED
@@ -57,8 +57,14 @@ Security/JSONLoad:
57
57
  Style/Alias:
58
58
  EnforcedStyle: prefer_alias
59
59
 
60
- Style/BracesAroundHashParameters:
61
- Enabled: false
60
+ Style/HashEachMethods:
61
+ Enabled: true
62
+
63
+ Style/HashTransformKeys:
64
+ Enabled: true
65
+
66
+ Style/HashTransformValues:
67
+ Enabled: true
62
68
 
63
69
  Style/DefWithParentheses:
64
70
  Enabled: false
@@ -111,3 +117,6 @@ Style/StringLiteralsInInterpolation:
111
117
 
112
118
  Style/RaiseArgs:
113
119
  EnforcedStyle: compact
120
+
121
+ Lint/NonDeterministicRequireOrder:
122
+ Enabled: false
data/3llo.gemspec CHANGED
@@ -5,8 +5,8 @@ require "3llo/version"
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "3llo"
7
7
  spec.version = Tr3llo::VERSION
8
- spec.authors = ["Cẩm Huỳnh"]
9
- spec.email = ["huynhquancam@gmail.com"]
8
+ spec.authors = ["Cẩm Huỳnh", "Diệp Sở Hùng"]
9
+ spec.email = ["huynhquancam@gmail.com", "diepsohung@gmail.com"]
10
10
 
11
11
  spec.summary = "Trello CLI app"
12
12
  spec.description = "Interactive CLI application for Trello"
@@ -24,7 +24,7 @@ Gem::Specification.new do |spec|
24
24
  spec.executables = spec.files.grep(%r{^bin/}) { |filename| File.basename(filename) }
25
25
  spec.require_paths = ["lib"]
26
26
 
27
- spec.required_ruby_version = "~> 2.5"
27
+ spec.required_ruby_version = "~> 3.0"
28
28
 
29
29
  spec.add_runtime_dependency "tty-prompt", "~> 0.20"
30
30
 
data/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## v1.3.1
4
+
5
+ * Require Ruby version 3
6
+
7
+ ## v1.3.0 (yanked)
8
+
9
+ * Support Ruby version 3
10
+ * Fix comment listing (#86)
11
+
12
+ ## v1.2.0
13
+
14
+ * Support running multiple commands with `--init` switch (#83)
15
+ * Include current board name to status line (#77)
16
+ * Introduce `card add-label` command (#74)
17
+ * Support multiline card description (#72)
18
+
19
+ ## v1.1.0
20
+
21
+ * Introduce "list add" command.
22
+ * Introduce "board add" command.
23
+ * Introduce label related command.
24
+ * Support exiting with Ctrl+D.
25
+
3
26
  ## v1.0.0
4
27
 
5
28
  * Support using shortcuts to access entities.
data/LICENSE CHANGED
@@ -1,6 +1,7 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2017-2020 Cẩm Huỳnh
3
+ Copyright (c) 2017 Cẩm Huỳnh
4
+ Copyright (c) 2020 Cẩm Huỳnh and Diệp Sở Hùng
4
5
 
5
6
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
7
  of this software and associated documentation files (the "Software"), to deal
data/Rakefile CHANGED
@@ -1,10 +1,4 @@
1
- require "bundler/gem_tasks"
2
- require "rake/testtask"
1
+ require "rspec/core/rake_task"
2
+ RSpec::Core::RakeTask.new(:spec)
3
3
 
4
- Rake::TestTask.new(:test) do |t|
5
- t.libs << "test"
6
- t.libs << "lib"
7
- t.test_files = FileList["test/**/*_test.rb"]
8
- end
9
-
10
- task default: :test
4
+ task default: :spec
@@ -25,6 +25,18 @@ module Tr3llo
25
25
  make_struct(client.get(req_path, {}))
26
26
  end
27
27
 
28
+ def create(name:, desc:, default_lists: true)
29
+ client = Application.fetch_client!()
30
+ req_path = Utils.build_req_path("/boards", {})
31
+ payload = {
32
+ "name" => name,
33
+ "desc" => desc,
34
+ "defaultLists" => default_lists
35
+ }
36
+
37
+ client.post(req_path, {}, payload)
38
+ end
39
+
28
40
  private
29
41
 
30
42
  def make_struct(payload)
data/lib/3llo/api/card.rb CHANGED
@@ -116,6 +116,12 @@ module Tr3llo
116
116
  client.put(req_path, {}, payload)
117
117
  end
118
118
 
119
+ def add_labels(card_id, labels)
120
+ req_path = Utils.build_req_path("/cards/#{card_id}/idLabels")
121
+
122
+ client.put(req_path, {}, {"value" => labels.join(",")})
123
+ end
124
+
119
125
  private
120
126
 
121
127
  def make_struct(payload)
@@ -135,10 +141,11 @@ module Tr3llo
135
141
  payload
136
142
  .fetch("labels", [])
137
143
  .map do |label_payload|
144
+ label_id = label_payload.fetch("id")
138
145
  label_name = label_payload.fetch("name")
139
146
  label_color = label_payload["color"]
140
147
 
141
- Entities::Label.new(label_name, label_color)
148
+ Entities::Label.new(id: label_id, shortcut: nil, name: label_name, color: label_color)
142
149
  end
143
150
 
144
151
  card =
@@ -0,0 +1,64 @@
1
+ module Tr3llo
2
+ module API
3
+ module Label
4
+ extend self
5
+
6
+ def find_all_by_board(board_id)
7
+ req_path =
8
+ Utils.build_req_path(
9
+ "/boards/#{board_id}/labels"
10
+ )
11
+
12
+ client
13
+ .get(req_path, {})
14
+ .reject { |label| label["name"].empty? }
15
+ .map do |label_payload|
16
+ make_struct(label_payload)
17
+ end
18
+ end
19
+
20
+ def find(label_id)
21
+ req_path = Utils.build_req_path("/labels/#{label_id}")
22
+ label_payload = client.get(req_path, {})
23
+
24
+ make_struct(label_payload)
25
+ end
26
+
27
+ def create(name:, color:, board_id:)
28
+ req_path = Utils.build_req_path("/labels")
29
+ payload = {
30
+ "name" => name,
31
+ "color" => color,
32
+ "idBoard" => board_id
33
+ }
34
+
35
+ client.post(req_path, {}, payload)
36
+ end
37
+
38
+ def update(label_id, data)
39
+ req_path = Utils.build_req_path("/labels/#{label_id}")
40
+
41
+ client.put(req_path, {}, data)
42
+ end
43
+
44
+ def delete(label_id)
45
+ req_path = Utils.build_req_path("/labels/#{label_id}")
46
+
47
+ client.delete(req_path, {}, {})
48
+ end
49
+
50
+ private
51
+
52
+ def make_struct(payload)
53
+ id, name, color = payload.fetch_values("id", "name", "color")
54
+ shortcut = Entities.make_shortcut(:label, id)
55
+
56
+ Entities::Label.new(id: id, shortcut: shortcut, name: name, color: color)
57
+ end
58
+
59
+ def client
60
+ Application.fetch_client!()
61
+ end
62
+ end
63
+ end
64
+ end
data/lib/3llo/api/list.rb CHANGED
@@ -23,6 +23,16 @@ module Tr3llo
23
23
  client.post(req_path, {}, {})
24
24
  end
25
25
 
26
+ def create(name, board_id)
27
+ req_path = Utils.build_req_path("/lists")
28
+ payload = {
29
+ "name" => name,
30
+ "idBoard" => board_id
31
+ }
32
+
33
+ client.post(req_path, {}, payload)
34
+ end
35
+
26
36
  private
27
37
 
28
38
  def make_struct(payload)
data/lib/3llo/api.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require "3llo/api/board"
2
2
  require "3llo/api/card"
3
3
  require "3llo/api/list"
4
+ require "3llo/api/label"
4
5
  require "3llo/api/user"
5
6
  require "3llo/api/checklist"
6
7
  require "3llo/api/token"
@@ -0,0 +1,29 @@
1
+ module Tr3llo
2
+ module Command
3
+ module Board
4
+ module Add
5
+ extend self
6
+
7
+ def execute()
8
+ interface = Application.fetch_interface!()
9
+
10
+ interface.print_frame do
11
+ name = interface.input.ask("Name:", required: true)
12
+ desc = interface.input.ask("Description:")
13
+
14
+ default_lists =
15
+ interface.input.yes?("With default set of lists to the board (To Do, Doing, Done)?") do |question|
16
+ question.default false
17
+ question.positive "Y"
18
+ question.negative "N"
19
+ end
20
+
21
+ API::Board.create(name: name, desc: desc, default_lists: default_lists)
22
+
23
+ interface.puts("Board has been created.")
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,6 +1,4 @@
1
- require "3llo/command/board/list"
2
- require "3llo/command/board/select"
3
- require "3llo/command/board/invalid"
1
+ Tr3llo::Utils.require_directory(File.dirname(__FILE__) + "/board/*.rb")
4
2
 
5
3
  module Tr3llo
6
4
  module Command
@@ -18,12 +16,12 @@ module Tr3llo
18
16
  Utils.assert_string!(board_key, "board key is missing")
19
17
 
20
18
  Command::Board::Select.execute(board_key)
19
+ when "add"
20
+ Command::Board::Add.execute()
21
21
  else
22
22
  handle_invalid_subcommand(subcommand, args)
23
23
  end
24
- rescue InvalidCommandError => exception
25
- Command::Board::Invalid.execute(exception.message)
26
- rescue InvalidArgumentError => exception
24
+ rescue InvalidCommandError, InvalidArgumentError => exception
27
25
  Command::Board::Invalid.execute(exception.message)
28
26
  end
29
27
 
@@ -14,17 +14,21 @@ module Tr3llo
14
14
  interface = Application.fetch_interface!()
15
15
 
16
16
  interface.print_frame do
17
- list_id = interface.input.select(
18
- "Choose the list this card should belong to:",
19
- list_options
20
- )
17
+ if list_options.any?
18
+ list_id = interface.input.select(
19
+ "Choose the list this card should belong to:",
20
+ list_options
21
+ )
21
22
 
22
- name = interface.input.ask("Name:", required: true)
23
- description = interface.input.ask("Description:")
23
+ name = interface.input.ask("Name:", required: true)
24
+ description = interface.input.multiline("Description:").join("")
24
25
 
25
- API::Card.create(name, description, list_id)
26
+ API::Card.create(name, description, list_id)
26
27
 
27
- interface.puts("Card has been created.")
28
+ interface.puts("Card has been created.")
29
+ else
30
+ interface.puts("There is no list on board.")
31
+ end
28
32
  end
29
33
  end
30
34
  end
@@ -0,0 +1,56 @@
1
+ module Tr3llo
2
+ module Command
3
+ module Card
4
+ module AddLabel
5
+ extend self
6
+
7
+ def execute(key, board_id)
8
+ card_id = Entities.parse_id(:card, key)
9
+ assert_card_id!(card_id, key)
10
+
11
+ card = API::Card.find(card_id)
12
+
13
+ interface = Application.fetch_interface!()
14
+
15
+ interface.print_frame do
16
+ label_ids = select_labels(interface, card, board_id)
17
+
18
+ add_labels(card_id, label_ids)
19
+ interface.puts("Chosen labels have been added to the card.")
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def assert_card_id!(card_id, key)
26
+ raise InvalidArgumentError.new("#{key.inspect} is not a valid card key") unless card_id
27
+ end
28
+
29
+ def add_labels(card_id, label_ids)
30
+ API::Card.add_labels(card_id, label_ids)
31
+ end
32
+
33
+ def select_labels(interface, card, board_id)
34
+ label_options =
35
+ API::Label.find_all_by_board(board_id)
36
+ .map { |label| [label.name, label.id] }
37
+ .to_h()
38
+
39
+ preselected_label_ids =
40
+ card.labels.flat_map do |label|
41
+ index = label_options.find_index { |_label_name, label_id| label_id == label.id }
42
+
43
+ index ? [index + 1] : []
44
+ end
45
+
46
+ interface.input.multi_select(
47
+ "Choose the labels to add to this card:",
48
+ label_options,
49
+ default: preselected_label_ids,
50
+ enum: "."
51
+ )
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -33,10 +33,6 @@ module Tr3llo
33
33
  )
34
34
  end
35
35
 
36
- def move_card!(card_id, list_id)
37
- API::Card.move_to_list(card_id, list_id)
38
- end
39
-
40
36
  def assert_card_id!(card_id, key)
41
37
  raise InvalidArgumentError.new("#{key.inspect} is not a valid card key") unless card_id
42
38
  end
@@ -1,23 +1,4 @@
1
- require "3llo/command/card/list"
2
- require "3llo/command/card/list_mine"
3
- require "3llo/command/card/edit"
4
- require "3llo/command/card/show"
5
- require "3llo/command/card/move"
6
- require "3llo/command/card/self_assign"
7
- require "3llo/command/card/assign"
8
- require "3llo/command/card/invalid"
9
- require "3llo/command/card/comments"
10
- require "3llo/command/card/comment"
11
- require "3llo/command/card/add"
12
- require "3llo/command/card/archive"
13
- require "3llo/command/card/add_checklist"
14
- require "3llo/command/card/edit_checklist"
15
- require "3llo/command/card/remove_checklist"
16
- require "3llo/command/card/add_item"
17
- require "3llo/command/card/check_item"
18
- require "3llo/command/card/uncheck_item"
19
- require "3llo/command/card/edit_item"
20
- require "3llo/command/card/remove_item"
1
+ Tr3llo::Utils.require_directory(File.dirname(__FILE__) + "/card/*.rb")
21
2
 
22
3
  module Tr3llo
23
4
  module Command
@@ -125,6 +106,12 @@ module Tr3llo
125
106
  Utils.assert_string!(check_item_key, "item key is missing")
126
107
 
127
108
  Command::Card::RemoveItem.execute(card_key, check_item_key)
109
+ when "add-label"
110
+ board = Application.fetch_board!()
111
+ card_key, = args
112
+ Utils.assert_string!(card_key, "card key is missing")
113
+
114
+ Command::Card::AddLabel.execute(card_key, board[:id])
128
115
  else
129
116
  handle_invalid_subcommand(subcommand, args)
130
117
  end
@@ -0,0 +1,22 @@
1
+ module Tr3llo
2
+ module Command
3
+ module Label
4
+ module Add
5
+ extend self
6
+
7
+ def execute(board_id)
8
+ interface = Application.fetch_interface!()
9
+
10
+ interface.print_frame do
11
+ name = interface.input.ask("Name:", required: true)
12
+ color = interface.input.select("Choose the color:", Utils::TRELLO_LABEL_COLOR)
13
+
14
+ API::Label.create(name: name, color: color, board_id: board_id)
15
+
16
+ interface.puts("Label has been created.")
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,37 @@
1
+ module Tr3llo
2
+ module Command
3
+ module Label
4
+ module Edit
5
+ extend self
6
+
7
+ def execute(label_key)
8
+ label_id = Entities.parse_id(:label, label_key)
9
+ assert_label_id!(label_id, label_key)
10
+
11
+ label = API::Label.find(label_id)
12
+
13
+ interface = Application.fetch_interface!()
14
+
15
+ interface.print_frame do
16
+ name = interface.input.ask("Name:", required: true, value: label.name)
17
+ color = interface.input.select(
18
+ "Choose the color:",
19
+ Utils::TRELLO_LABEL_COLOR,
20
+ default: Utils::TRELLO_LABEL_COLOR.index(label.color)
21
+ )
22
+
23
+ API::Label.update(label_id, {"name" => name, "color" => color})
24
+
25
+ interface.puts("Label has been updated.")
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ def assert_label_id!(label_id, key)
32
+ raise InvalidArgumentError.new("#{key.inspect} is not a valid label key") unless label_id
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,18 @@
1
+ module Tr3llo
2
+ module Command
3
+ module Label
4
+ module Invalid
5
+ extend self
6
+
7
+ def execute(message)
8
+ interface = Application.fetch_interface!()
9
+
10
+ interface.print_frame do
11
+ interface.print_error(message)
12
+ interface.puts(View::Label::Help.render())
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ module Tr3llo
2
+ module Command
3
+ module Label
4
+ module List
5
+ extend self
6
+
7
+ def execute(board_id)
8
+ interface = Application.fetch_interface!()
9
+ labels = API::Label.find_all_by_board(board_id)
10
+
11
+ interface.print_frame do
12
+ interface.puts(View::Label::List.render(labels))
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,28 @@
1
+ module Tr3llo
2
+ module Command
3
+ module Label
4
+ module Remove
5
+ extend self
6
+
7
+ def execute(label_key)
8
+ label_id = Entities.parse_id(:label, label_key)
9
+ assert_label_id!(label_id, label_key)
10
+
11
+ interface = Application.fetch_interface!()
12
+
13
+ interface.print_frame do
14
+ API::Label.delete(label_id)
15
+
16
+ interface.puts("Label has been deleted.")
17
+ end
18
+ end
19
+
20
+ private
21
+
22
+ def assert_label_id!(label_id, key)
23
+ raise InvalidArgumentError.new("#{key.inspect} is not a valid label key") unless label_id
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,47 @@
1
+ Tr3llo::Utils.require_directory(File.dirname(__FILE__) + "/label/*.rb")
2
+
3
+ module Tr3llo
4
+ module Command
5
+ module Label
6
+ extend self
7
+
8
+ def execute(subcommand, args)
9
+ case subcommand
10
+ when "list"
11
+ board = Application.fetch_board!()
12
+
13
+ Command::Label::List.execute(board[:id])
14
+ when "add"
15
+ board = Application.fetch_board!()
16
+
17
+ Command::Label::Add.execute(board[:id])
18
+ when "edit"
19
+ label_key, = args
20
+ Utils.assert_string!(label_key, "label key is missing")
21
+
22
+ Command::Label::Edit.execute(label_key)
23
+ when "remove"
24
+ label_key, = args
25
+ Utils.assert_string!(label_key, "label key is missing")
26
+
27
+ Command::Label::Remove.execute(label_key)
28
+ else
29
+ handle_invalid_subcommand(subcommand, args)
30
+ end
31
+ rescue InvalidArgumentError, InvalidCommandError, BoardNotSelectedError => exception
32
+ Command::Label::Invalid.execute(exception.message)
33
+ end
34
+
35
+ private
36
+
37
+ def handle_invalid_subcommand(subcommand, _args)
38
+ case subcommand
39
+ when String
40
+ raise InvalidCommandError.new("#{subcommand.inspect} is not a valid command")
41
+ when NilClass
42
+ raise InvalidCommandError.new("command is missing")
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,21 @@
1
+ module Tr3llo
2
+ module Command
3
+ module List
4
+ module Add
5
+ extend self
6
+
7
+ def execute(board_id)
8
+ interface = Application.fetch_interface!()
9
+
10
+ interface.print_frame do
11
+ name = interface.input.ask("Name:", required: true)
12
+
13
+ API::List.create(name, board_id)
14
+
15
+ interface.puts("List has been created.")
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,7 +1,4 @@
1
- require "3llo/command/list/list"
2
- require "3llo/command/list/cards"
3
- require "3llo/command/list/invalid"
4
- require "3llo/command/list/archive_cards"
1
+ Tr3llo::Utils.require_directory(File.dirname(__FILE__) + "/list/*.rb")
5
2
 
6
3
  module Tr3llo
7
4
  module Command
@@ -14,6 +11,10 @@ module Tr3llo
14
11
  board = Application.fetch_board!()
15
12
 
16
13
  Command::List::List.execute(board[:id])
14
+ when "add"
15
+ board = Application.fetch_board!()
16
+
17
+ Command::List::Add.execute(board[:id])
17
18
  when "cards"
18
19
  list_key, = args
19
20
  Utils.assert_string!(list_key, "list key is missing")
data/lib/3llo/command.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require "3llo/command/board"
2
2
  require "3llo/command/card"
3
3
  require "3llo/command/list"
4
+ require "3llo/command/label"
4
5
  require "3llo/command/help"
5
6
  require "3llo/command/exit"
6
7
  require "3llo/command/invalid"
@@ -15,14 +16,15 @@ module Tr3llo
15
16
 
16
17
  def generate_suggestions(buffer, command_buffer)
17
18
  commands = {
18
- "board" => ["list", "select"],
19
- "list" => %w[list cards archive-cards],
19
+ "board" => %w[add list select],
20
+ "list" => %w[list add cards archive-cards],
20
21
  "card" => %w[
21
22
  list show add edit archive list-mine move
22
23
  comment comments self-assign assign
23
24
  add-checklist edit-checklist remove-checklist
24
- add-item edit-item remote-item check-item uncheck-item
25
+ add-item edit-item remote-item check-item uncheck-item add-label
25
26
  ],
27
+ "label" => %w[list add edit remove],
26
28
  "help" => [],
27
29
  "exit" => []
28
30
  }
@@ -52,6 +54,8 @@ module Tr3llo
52
54
  Command::Card.execute(subcommand, args)
53
55
  when "list"
54
56
  Command::List.execute(subcommand, args)
57
+ when "label"
58
+ Command::Label.execute(subcommand, args)
55
59
  when "help"
56
60
  Command::Help.execute()
57
61
  when "exit"
@@ -5,7 +5,7 @@ module Tr3llo
5
5
  extend self
6
6
 
7
7
  def start(init_command)
8
- Readline.completion_append_character = " "
8
+ Readline.completion_append_character = " "
9
9
  Readline.completion_proc = lambda { |buffer|
10
10
  Command.generate_suggestions(buffer, Readline.line_buffer)
11
11
  }
@@ -13,13 +13,17 @@ module Tr3llo
13
13
  interface = Application.fetch_interface!()
14
14
 
15
15
  if init_command && init_command != ""
16
- interface.puts("Executing " + Utils.format_highlight(init_command) + " command")
17
-
18
- execute_command!(init_command)
16
+ init_commands = init_command.split(";")
17
+ init_commands.each do |cmd|
18
+ interface.puts("Executing " + Utils.format_highlight(cmd) + " command")
19
+ execute_command!(cmd)
20
+ end
19
21
  end
20
22
 
21
23
  loop do
22
- command_buffer = Readline.readline("\e[15;48;5;27m 3llo \e[0m > ", true)
24
+ status_line = determine_status_line()
25
+ command_buffer = Readline.readline(status_line, true)
26
+ Command::Exit.execute() if command_buffer.nil?
23
27
 
24
28
  execute_command!(command_buffer)
25
29
  end
@@ -29,6 +33,18 @@ module Tr3llo
29
33
 
30
34
  private
31
35
 
36
+ def determine_status_line()
37
+ program_name = ["\e[15;48;5;27m 3llo \e[0m"]
38
+ board_name =
39
+ begin
40
+ ["\e[45m #{Application.fetch_board!().name} \e[0m"]
41
+ rescue BoardNotSelectedError
42
+ []
43
+ end
44
+
45
+ (program_name + board_name + [""]).join(" > ")
46
+ end
47
+
32
48
  def execute_command!(command_buffer)
33
49
  Tr3llo::Command.execute(command_buffer.strip())
34
50
  end
data/lib/3llo/entities.rb CHANGED
@@ -11,7 +11,7 @@ module Tr3llo
11
11
  Board = Struct.new(:id, :shortcut, :name)
12
12
  List = Struct.new(:id, :shortcut, :name)
13
13
  Card = Struct.new(:id, :shortcut, :name, :description, :short_url, :labels, :members, :list, keyword_init: true)
14
- Label = Struct.new(:name, :color)
14
+ Label = Struct.new(:id, :shortcut, :name, :color, keyword_init: true)
15
15
  Comment = Struct.new(:id, :text, :creator, :created_at, keyword_init: true)
16
16
  Checklist = Struct.new(:id, :shortcut, :name, :items, keyword_init: true)
17
17
  Checklist::Item = Struct.new(:id, :shortcut, :name, :state, keyword_init: true)
@@ -78,6 +78,8 @@ module Tr3llo
78
78
 
79
79
  def build_request_uri(req_path)
80
80
  URI.parse(endpoint_url + req_path)
81
+ rescue URI::Error
82
+ raise InvalidArgumentError.new("invalid command arguments")
81
83
  end
82
84
 
83
85
  def dispatch(request, expected_status_codes)
data/lib/3llo/utils.rb CHANGED
@@ -17,6 +17,8 @@ module Tr3llo
17
17
  "sky" => 36
18
18
  }.freeze()
19
19
 
20
+ TRELLO_LABEL_COLOR = %w[red pink blue green purple yellow orange sky].freeze()
21
+
20
22
  def format_key_tag(id, shortcut)
21
23
  formatted_shortcut = Utils.format_highlight(Entities::SHORTCUT_PREFIX + shortcut)
22
24
  formatted_id = Utils.paint(id, "blue")
@@ -65,5 +67,11 @@ module Tr3llo
65
67
 
66
68
  [path, URI.encode_www_form(params)].join("?")
67
69
  end
70
+
71
+ def require_directory(glob)
72
+ Dir.glob(glob).each do |file|
73
+ require file
74
+ end
75
+ end
68
76
  end
69
77
  end
data/lib/3llo/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Tr3llo
2
- VERSION = "1.0.0".freeze
2
+ VERSION = "1.3.1".freeze
3
3
  end
@@ -10,6 +10,7 @@ module Tr3llo
10
10
 
11
11
  board list - Show list of boards
12
12
  board select <board_key> - Select board
13
+ board add - Create a board
13
14
  TEMPLATE
14
15
  end
15
16
  end
@@ -18,6 +18,7 @@ module Tr3llo
18
18
  card comments <key> - Load recent comments of a card
19
19
  card comment <key> - Add a comment to a card
20
20
  card archive <key> - Archive a card
21
+ card add-label <key> - Label a card
21
22
 
22
23
  #{Utils.format_bold("# Available checklist commands:")}
23
24
 
@@ -14,6 +14,8 @@ module Tr3llo
14
14
 
15
15
  #{View::List::Help.render()}
16
16
 
17
+ #{View::Label::Help.render()}
18
+
17
19
  #{miscellaneous_help()}
18
20
  TEMPLATE
19
21
  end
@@ -0,0 +1,20 @@
1
+ module Tr3llo
2
+ module View
3
+ module Label
4
+ module Help
5
+ extend self
6
+
7
+ def render()
8
+ <<~TEMPLATE.strip
9
+ #{Utils.format_bold("# Available label commands:")}
10
+
11
+ label list - Show all labels
12
+ label add - Create a label
13
+ label edit <key> - Edit a label
14
+ list remove <key> - Remove a label
15
+ TEMPLATE
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,21 @@
1
+ module Tr3llo
2
+ module View
3
+ module Label
4
+ module List
5
+ extend self
6
+
7
+ def render(labels)
8
+ labels
9
+ .map { |label| render_label(label) }
10
+ .join("\n")
11
+ end
12
+
13
+ private
14
+
15
+ def render_label(label)
16
+ "#{Utils.format_key_tag(label.id, label.shortcut)} #{Utils.paint("#" + label.name, label.color)}"
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -9,6 +9,7 @@ module Tr3llo
9
9
  #{Utils.format_bold("# Available list commands:")}
10
10
 
11
11
  list list - Show all lists
12
+ list add - Create a list
12
13
  list cards <key> - Show all cards in list
13
14
  list archive-cards <key> - Archive all cards in list
14
15
  TEMPLATE
data/lib/3llo/view.rb CHANGED
@@ -9,3 +9,5 @@ require "3llo/view/card/comments"
9
9
  require "3llo/view/list/help"
10
10
  require "3llo/view/list/list"
11
11
  require "3llo/view/list/cards"
12
+ require "3llo/view/label/list"
13
+ require "3llo/view/label/help"
data/lib/3llo.rb CHANGED
@@ -3,7 +3,7 @@ require "3llo/remote_server"
3
3
  require "3llo/interface"
4
4
  require "container"
5
5
  require "json"
6
- require "erb"
6
+ require "date"
7
7
 
8
8
  require "3llo/application"
9
9
  require "3llo/configuration"
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: 3llo
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cẩm Huỳnh
8
- autorequire:
8
+ - Diệp Sở Hùng
9
+ autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2020-01-23 00:00:00.000000000 Z
12
+ date: 2022-01-10 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: tty-prompt
@@ -55,6 +56,7 @@ dependencies:
55
56
  description: Interactive CLI application for Trello
56
57
  email:
57
58
  - huynhquancam@gmail.com
59
+ - diepsohung@gmail.com
58
60
  executables:
59
61
  - 3llo
60
62
  extensions: []
@@ -75,6 +77,7 @@ files:
75
77
  - lib/3llo/api/board.rb
76
78
  - lib/3llo/api/card.rb
77
79
  - lib/3llo/api/checklist.rb
80
+ - lib/3llo/api/label.rb
78
81
  - lib/3llo/api/list.rb
79
82
  - lib/3llo/api/token.rb
80
83
  - lib/3llo/api/user.rb
@@ -82,6 +85,7 @@ files:
82
85
  - lib/3llo/command.rb
83
86
  - lib/3llo/command/.gitkeep
84
87
  - lib/3llo/command/board.rb
88
+ - lib/3llo/command/board/add.rb
85
89
  - lib/3llo/command/board/invalid.rb
86
90
  - lib/3llo/command/board/list.rb
87
91
  - lib/3llo/command/board/select.rb
@@ -89,6 +93,7 @@ files:
89
93
  - lib/3llo/command/card/add.rb
90
94
  - lib/3llo/command/card/add_checklist.rb
91
95
  - lib/3llo/command/card/add_item.rb
96
+ - lib/3llo/command/card/add_label.rb
92
97
  - lib/3llo/command/card/archive.rb
93
98
  - lib/3llo/command/card/assign.rb
94
99
  - lib/3llo/command/card/check_item.rb
@@ -109,7 +114,14 @@ files:
109
114
  - lib/3llo/command/exit.rb
110
115
  - lib/3llo/command/help.rb
111
116
  - lib/3llo/command/invalid.rb
117
+ - lib/3llo/command/label.rb
118
+ - lib/3llo/command/label/add.rb
119
+ - lib/3llo/command/label/edit.rb
120
+ - lib/3llo/command/label/invalid.rb
121
+ - lib/3llo/command/label/list.rb
122
+ - lib/3llo/command/label/remove.rb
112
123
  - lib/3llo/command/list.rb
124
+ - lib/3llo/command/list/add.rb
113
125
  - lib/3llo/command/list/archive_cards.rb
114
126
  - lib/3llo/command/list/cards.rb
115
127
  - lib/3llo/command/list/invalid.rb
@@ -133,6 +145,8 @@ files:
133
145
  - lib/3llo/view/card/list_mine.rb
134
146
  - lib/3llo/view/card/show.rb
135
147
  - lib/3llo/view/help.rb
148
+ - lib/3llo/view/label/help.rb
149
+ - lib/3llo/view/label/list.rb
136
150
  - lib/3llo/view/list/cards.rb
137
151
  - lib/3llo/view/list/help.rb
138
152
  - lib/3llo/view/list/list.rb
@@ -142,7 +156,7 @@ licenses:
142
156
  - MIT
143
157
  metadata:
144
158
  allowed_push_host: https://rubygems.org
145
- post_install_message:
159
+ post_install_message:
146
160
  rdoc_options: []
147
161
  require_paths:
148
162
  - lib
@@ -150,15 +164,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
150
164
  requirements:
151
165
  - - "~>"
152
166
  - !ruby/object:Gem::Version
153
- version: '2.5'
167
+ version: '3.0'
154
168
  required_rubygems_version: !ruby/object:Gem::Requirement
155
169
  requirements:
156
170
  - - ">="
157
171
  - !ruby/object:Gem::Version
158
172
  version: '0'
159
173
  requirements: []
160
- rubygems_version: 3.1.2
161
- signing_key:
174
+ rubygems_version: 3.3.3
175
+ signing_key:
162
176
  specification_version: 4
163
177
  summary: Trello CLI app
164
178
  test_files: []