3llo 1.0.0 → 1.3.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.
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: []