abt-cli 0.0.25 → 0.0.30
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 +4 -4
- data/bin/abt +1 -1
- data/lib/abt.rb +1 -0
- data/lib/abt/cli.rb +32 -9
- data/lib/abt/directory_config.rb +43 -0
- data/lib/abt/docs.rb +10 -6
- data/lib/abt/providers/asana.rb +1 -0
- data/lib/abt/providers/asana/base_command.rb +33 -3
- data/lib/abt/providers/asana/commands/add.rb +0 -4
- data/lib/abt/providers/asana/commands/branch_name.rb +0 -13
- data/lib/abt/providers/asana/commands/current.rb +0 -18
- data/lib/abt/providers/asana/commands/finalize.rb +2 -4
- data/lib/abt/providers/asana/commands/pick.rb +11 -41
- data/lib/abt/providers/asana/commands/tasks.rb +2 -7
- data/lib/abt/providers/asana/commands/write_config.rb +73 -0
- data/lib/abt/providers/asana/configuration.rb +11 -3
- data/lib/abt/providers/asana/path.rb +2 -2
- data/lib/abt/providers/asana/services/project_picker.rb +54 -0
- data/lib/abt/providers/asana/services/task_picker.rb +83 -0
- data/lib/abt/providers/devops.rb +1 -0
- data/lib/abt/providers/devops/api.rb +27 -20
- data/lib/abt/providers/devops/base_command.rb +42 -25
- data/lib/abt/providers/devops/commands/branch_name.rb +8 -16
- data/lib/abt/providers/devops/commands/current.rb +2 -21
- data/lib/abt/providers/devops/commands/harvest_time_entry_data.rb +8 -16
- data/lib/abt/providers/devops/commands/pick.rb +11 -60
- data/lib/abt/providers/devops/commands/work_items.rb +3 -7
- data/lib/abt/providers/devops/commands/write_config.rb +47 -0
- data/lib/abt/providers/devops/configuration.rb +1 -1
- data/lib/abt/providers/devops/path.rb +24 -8
- data/lib/abt/providers/devops/services/board_picker.rb +69 -0
- data/lib/abt/providers/devops/services/project_picker.rb +73 -0
- data/lib/abt/providers/devops/services/work_item_picker.rb +99 -0
- data/lib/abt/providers/harvest.rb +1 -0
- data/lib/abt/providers/harvest/base_command.rb +45 -3
- data/lib/abt/providers/harvest/commands/current.rb +0 -28
- data/lib/abt/providers/harvest/commands/pick.rb +12 -27
- data/lib/abt/providers/harvest/commands/projects.rb +2 -9
- data/lib/abt/providers/harvest/commands/tasks.rb +2 -19
- data/lib/abt/providers/harvest/commands/write_config.rb +41 -0
- data/lib/abt/providers/harvest/configuration.rb +1 -1
- data/lib/abt/providers/harvest/path.rb +1 -1
- data/lib/abt/providers/harvest/services/project_picker.rb +53 -0
- data/lib/abt/providers/harvest/services/task_picker.rb +50 -0
- data/lib/abt/version.rb +1 -1
- metadata +13 -6
- data/lib/abt/providers/asana/commands/init.rb +0 -42
- data/lib/abt/providers/devops/commands/boards.rb +0 -34
- data/lib/abt/providers/devops/commands/init.rb +0 -79
- data/lib/abt/providers/harvest/commands/init.rb +0 -53
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
Dir.glob("#{File.expand_path(__dir__)}/harvest/*.rb").sort.each { |file| require file }
|
4
4
|
Dir.glob("#{File.expand_path(__dir__)}/harvest/commands/*.rb").sort.each { |file| require file }
|
5
|
+
Dir.glob("#{File.expand_path(__dir__)}/harvest/services/*.rb").sort.each { |file| require file }
|
5
6
|
|
6
7
|
module Abt
|
7
8
|
module Providers
|
@@ -26,13 +26,55 @@ module Abt
|
|
26
26
|
def require_project!
|
27
27
|
return if project_id
|
28
28
|
|
29
|
-
abort("No current/specified project. Did you
|
29
|
+
abort("No current/specified project. Did you forget to run `pick`?")
|
30
30
|
end
|
31
31
|
|
32
32
|
def require_task!
|
33
|
-
|
33
|
+
require_project!
|
34
|
+
return if task_id
|
34
35
|
|
35
|
-
abort("No current/specified task. Did you
|
36
|
+
abort("No current/specified task. Did you forget to run `pick`?")
|
37
|
+
end
|
38
|
+
|
39
|
+
def prompt_project!
|
40
|
+
result = Services::ProjectPicker.call(cli: cli, project_assignments: project_assignments)
|
41
|
+
@path = result.path
|
42
|
+
@project = result.project
|
43
|
+
end
|
44
|
+
|
45
|
+
def prompt_task!
|
46
|
+
result = Services::TaskPicker.call(cli: cli, path: path, project_assignment: project_assignment)
|
47
|
+
@path = result.path
|
48
|
+
@task = result.task
|
49
|
+
end
|
50
|
+
|
51
|
+
def task
|
52
|
+
return @task if instance_variable_defined?(:@task)
|
53
|
+
|
54
|
+
@task = if project_assignment
|
55
|
+
project_assignment["task_assignments"].map { |ta| ta["task"] }.find do |task|
|
56
|
+
task["id"].to_s == task_id
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def project
|
62
|
+
return @project if instance_variable_defined?(:@project)
|
63
|
+
|
64
|
+
@project = if project_assignment
|
65
|
+
project_assignment["project"].merge("client" => project_assignment["client"])
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def project_assignment
|
70
|
+
@project_assignment ||= project_assignments.find { |pa| pa["project"]["id"].to_s == path.project_id }
|
71
|
+
end
|
72
|
+
|
73
|
+
def project_assignments
|
74
|
+
@project_assignments ||= begin
|
75
|
+
warn("Fetching Harvest data...")
|
76
|
+
api.get_paged("users/me/project_assignments")
|
77
|
+
end
|
36
78
|
end
|
37
79
|
|
38
80
|
def print_project(project)
|
@@ -40,34 +40,6 @@ module Abt
|
|
40
40
|
abort("Invalid project: #{project_id}") if project.nil?
|
41
41
|
abort("Invalid task: #{task_id}") if task_id && task.nil?
|
42
42
|
end
|
43
|
-
|
44
|
-
def project
|
45
|
-
return @project if instance_variable_defined?(:@project)
|
46
|
-
|
47
|
-
@project = if project_assignment
|
48
|
-
project_assignment["project"].merge("client" => project_assignment["client"])
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def task
|
53
|
-
return @task if instance_variable_defined?(:@task)
|
54
|
-
|
55
|
-
@task = if project_assignment
|
56
|
-
project_assignment["task_assignments"].map { |ta| ta["task"] }.find do |task|
|
57
|
-
task["id"].to_s == task_id
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
def project_assignment
|
63
|
-
@project_assignment ||= begin
|
64
|
-
project_assignments.find { |pa| pa["project"]["id"].to_s == project_id }
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
def project_assignments
|
69
|
-
@project_assignments ||= api.get_paged("users/me/project_assignments")
|
70
|
-
end
|
71
43
|
end
|
72
44
|
end
|
73
45
|
end
|
@@ -15,46 +15,31 @@ module Abt
|
|
15
15
|
|
16
16
|
def self.flags
|
17
17
|
[
|
18
|
-
["-d", "--dry-run", "Keep existing configuration"]
|
18
|
+
["-d", "--dry-run", "Keep existing configuration"],
|
19
|
+
["-c", "--clean", "Don't reuse project configuration"]
|
19
20
|
]
|
20
21
|
end
|
21
22
|
|
22
23
|
def perform
|
23
|
-
|
24
|
-
require_project!
|
25
|
-
|
26
|
-
warn(project["name"])
|
27
|
-
task = pick_task
|
24
|
+
pick!
|
28
25
|
|
29
26
|
print_task(project, task)
|
30
27
|
|
31
28
|
return if flags[:"dry-run"]
|
32
29
|
|
33
|
-
config.
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
def project
|
39
|
-
project_assignment["project"]
|
40
|
-
end
|
41
|
-
|
42
|
-
def pick_task
|
43
|
-
cli.prompt.choice("Select a task", tasks)
|
44
|
-
end
|
30
|
+
unless config.local_available?
|
31
|
+
warn("No local configuration to update - will function as dry run")
|
32
|
+
return
|
33
|
+
end
|
45
34
|
|
46
|
-
|
47
|
-
@tasks ||= project_assignment["task_assignments"].map { |ta| ta["task"] }
|
35
|
+
config.path = path
|
48
36
|
end
|
49
37
|
|
50
|
-
|
51
|
-
@project_assignment ||= begin
|
52
|
-
project_assignments.find { |pa| pa["project"]["id"].to_s == project_id }
|
53
|
-
end
|
54
|
-
end
|
38
|
+
private
|
55
39
|
|
56
|
-
def
|
57
|
-
|
40
|
+
def pick!
|
41
|
+
prompt_project! if project_id.nil? || flags[:clean]
|
42
|
+
prompt_task!
|
58
43
|
end
|
59
44
|
end
|
60
45
|
end
|
@@ -22,17 +22,10 @@ module Abt
|
|
22
22
|
private
|
23
23
|
|
24
24
|
def projects
|
25
|
-
@projects ||=
|
26
|
-
|
27
|
-
project_assignments.map do |project_assignment|
|
28
|
-
project_assignment["project"].merge("client" => project_assignment["client"])
|
29
|
-
end
|
25
|
+
@projects ||= project_assignments.map do |project_assignment|
|
26
|
+
project_assignment["project"].merge("client" => project_assignment["client"])
|
30
27
|
end
|
31
28
|
end
|
32
|
-
|
33
|
-
def project_assignments
|
34
|
-
@project_assignments ||= api.get_paged("users/me/project_assignments")
|
35
|
-
end
|
36
29
|
end
|
37
30
|
end
|
38
31
|
end
|
@@ -14,7 +14,7 @@ module Abt
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def perform
|
17
|
-
|
17
|
+
prompt_project! unless project_id
|
18
18
|
|
19
19
|
tasks.each do |task|
|
20
20
|
print_task(project, task)
|
@@ -23,25 +23,8 @@ module Abt
|
|
23
23
|
|
24
24
|
private
|
25
25
|
|
26
|
-
def project
|
27
|
-
project_assignment["project"]
|
28
|
-
end
|
29
|
-
|
30
26
|
def tasks
|
31
|
-
@tasks ||=
|
32
|
-
warn("Fetching tasks...")
|
33
|
-
project_assignment["task_assignments"].map { |ta| ta["task"] }
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def project_assignment
|
38
|
-
@project_assignment ||= begin
|
39
|
-
project_assignments.find { |pa| pa["project"]["id"].to_s == project_id }
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def project_assignments
|
44
|
-
@project_assignments ||= api.get_paged("users/me/project_assignments")
|
27
|
+
@tasks ||= project_assignment["task_assignments"].map { |ta| ta["task"] }
|
45
28
|
end
|
46
29
|
end
|
47
30
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Abt
|
4
|
+
module Providers
|
5
|
+
module Harvest
|
6
|
+
module Commands
|
7
|
+
class WriteConfig < BaseCommand
|
8
|
+
def self.usage
|
9
|
+
"abt write-config harvest[:<project-id>[/<task-id>]]"
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.description
|
13
|
+
"Write Harvest settings to .abt.yml"
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.flags
|
17
|
+
[
|
18
|
+
["-c", "--clean", "Don't reuse configuration"]
|
19
|
+
]
|
20
|
+
end
|
21
|
+
|
22
|
+
def perform
|
23
|
+
prompt_project! if project_id.nil? || flags[:clean]
|
24
|
+
prompt_task! if task_id.nil? || flags[:clean]
|
25
|
+
|
26
|
+
update_directory_config!
|
27
|
+
|
28
|
+
warn("Harvest configuration written to #{Abt::DirectoryConfig::FILE_NAME}")
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def update_directory_config!
|
34
|
+
cli.directory_config["harvest"] = { "path" => path.to_s }
|
35
|
+
cli.directory_config.save!
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Abt
|
4
|
+
module Providers
|
5
|
+
module Harvest
|
6
|
+
module Services
|
7
|
+
class ProjectPicker
|
8
|
+
class Result
|
9
|
+
attr_reader :project, :path
|
10
|
+
|
11
|
+
def initialize(project:, path:)
|
12
|
+
@project = project
|
13
|
+
@path = path
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.call(**args)
|
18
|
+
new(**args).call
|
19
|
+
end
|
20
|
+
|
21
|
+
attr_reader :cli, :project_assignments
|
22
|
+
|
23
|
+
def initialize(cli:, project_assignments:)
|
24
|
+
@cli = cli
|
25
|
+
@project_assignments = project_assignments
|
26
|
+
end
|
27
|
+
|
28
|
+
def call
|
29
|
+
project = cli.prompt.search("Select a project", searchable_projects)["project"]
|
30
|
+
|
31
|
+
path = Path.from_ids(project_id: project["id"])
|
32
|
+
|
33
|
+
Result.new(project: project, path: path)
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def searchable_projects
|
39
|
+
@searchable_projects ||= project_assignments.map do |project_assignment|
|
40
|
+
client = project_assignment["client"]
|
41
|
+
project = project_assignment["project"]
|
42
|
+
|
43
|
+
project_assignment.merge(
|
44
|
+
"name" => "#{client['name']} > #{project['name']}",
|
45
|
+
"project" => project
|
46
|
+
)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Abt
|
4
|
+
module Providers
|
5
|
+
module Harvest
|
6
|
+
module Services
|
7
|
+
class TaskPicker
|
8
|
+
class Result
|
9
|
+
attr_reader :task, :path
|
10
|
+
|
11
|
+
def initialize(task:, path:)
|
12
|
+
@task = task
|
13
|
+
@path = path
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.call(**args)
|
18
|
+
new(**args).call
|
19
|
+
end
|
20
|
+
|
21
|
+
attr_reader :cli, :path, :project_assignment
|
22
|
+
|
23
|
+
def initialize(cli:, path:, project_assignment:)
|
24
|
+
@cli = cli
|
25
|
+
@path = path
|
26
|
+
@project_assignment = project_assignment
|
27
|
+
end
|
28
|
+
|
29
|
+
def call
|
30
|
+
task = cli.prompt.choice("Select a task from #{project['name']}", tasks)
|
31
|
+
|
32
|
+
path_with_task = Path.from_ids(project_id: path.project_id, task_id: task["id"])
|
33
|
+
|
34
|
+
Result.new(task: task, path: path_with_task)
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def project
|
40
|
+
project_assignment["project"]
|
41
|
+
end
|
42
|
+
|
43
|
+
def tasks
|
44
|
+
@tasks ||= project_assignment["task_assignments"].map { |ta| ta["task"] }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/lib/abt/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: abt-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.30
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jesper Sørensen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-03-
|
11
|
+
date: 2021-03-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dry-inflector
|
@@ -88,6 +88,7 @@ files:
|
|
88
88
|
- "./lib/abt/cli/global_commands/share.rb"
|
89
89
|
- "./lib/abt/cli/global_commands/version.rb"
|
90
90
|
- "./lib/abt/cli/prompt.rb"
|
91
|
+
- "./lib/abt/directory_config.rb"
|
91
92
|
- "./lib/abt/docs.rb"
|
92
93
|
- "./lib/abt/docs/cli.rb"
|
93
94
|
- "./lib/abt/docs/markdown.rb"
|
@@ -104,28 +105,32 @@ files:
|
|
104
105
|
- "./lib/abt/providers/asana/commands/current.rb"
|
105
106
|
- "./lib/abt/providers/asana/commands/finalize.rb"
|
106
107
|
- "./lib/abt/providers/asana/commands/harvest_time_entry_data.rb"
|
107
|
-
- "./lib/abt/providers/asana/commands/init.rb"
|
108
108
|
- "./lib/abt/providers/asana/commands/pick.rb"
|
109
109
|
- "./lib/abt/providers/asana/commands/projects.rb"
|
110
110
|
- "./lib/abt/providers/asana/commands/share.rb"
|
111
111
|
- "./lib/abt/providers/asana/commands/start.rb"
|
112
112
|
- "./lib/abt/providers/asana/commands/tasks.rb"
|
113
|
+
- "./lib/abt/providers/asana/commands/write_config.rb"
|
113
114
|
- "./lib/abt/providers/asana/configuration.rb"
|
114
115
|
- "./lib/abt/providers/asana/path.rb"
|
116
|
+
- "./lib/abt/providers/asana/services/project_picker.rb"
|
117
|
+
- "./lib/abt/providers/asana/services/task_picker.rb"
|
115
118
|
- "./lib/abt/providers/devops.rb"
|
116
119
|
- "./lib/abt/providers/devops/api.rb"
|
117
120
|
- "./lib/abt/providers/devops/base_command.rb"
|
118
|
-
- "./lib/abt/providers/devops/commands/boards.rb"
|
119
121
|
- "./lib/abt/providers/devops/commands/branch_name.rb"
|
120
122
|
- "./lib/abt/providers/devops/commands/clear.rb"
|
121
123
|
- "./lib/abt/providers/devops/commands/current.rb"
|
122
124
|
- "./lib/abt/providers/devops/commands/harvest_time_entry_data.rb"
|
123
|
-
- "./lib/abt/providers/devops/commands/init.rb"
|
124
125
|
- "./lib/abt/providers/devops/commands/pick.rb"
|
125
126
|
- "./lib/abt/providers/devops/commands/share.rb"
|
126
127
|
- "./lib/abt/providers/devops/commands/work_items.rb"
|
128
|
+
- "./lib/abt/providers/devops/commands/write_config.rb"
|
127
129
|
- "./lib/abt/providers/devops/configuration.rb"
|
128
130
|
- "./lib/abt/providers/devops/path.rb"
|
131
|
+
- "./lib/abt/providers/devops/services/board_picker.rb"
|
132
|
+
- "./lib/abt/providers/devops/services/project_picker.rb"
|
133
|
+
- "./lib/abt/providers/devops/services/work_item_picker.rb"
|
129
134
|
- "./lib/abt/providers/git.rb"
|
130
135
|
- "./lib/abt/providers/git/commands/branch.rb"
|
131
136
|
- "./lib/abt/providers/harvest.rb"
|
@@ -133,7 +138,6 @@ files:
|
|
133
138
|
- "./lib/abt/providers/harvest/base_command.rb"
|
134
139
|
- "./lib/abt/providers/harvest/commands/clear.rb"
|
135
140
|
- "./lib/abt/providers/harvest/commands/current.rb"
|
136
|
-
- "./lib/abt/providers/harvest/commands/init.rb"
|
137
141
|
- "./lib/abt/providers/harvest/commands/pick.rb"
|
138
142
|
- "./lib/abt/providers/harvest/commands/projects.rb"
|
139
143
|
- "./lib/abt/providers/harvest/commands/share.rb"
|
@@ -141,8 +145,11 @@ files:
|
|
141
145
|
- "./lib/abt/providers/harvest/commands/stop.rb"
|
142
146
|
- "./lib/abt/providers/harvest/commands/tasks.rb"
|
143
147
|
- "./lib/abt/providers/harvest/commands/track.rb"
|
148
|
+
- "./lib/abt/providers/harvest/commands/write_config.rb"
|
144
149
|
- "./lib/abt/providers/harvest/configuration.rb"
|
145
150
|
- "./lib/abt/providers/harvest/path.rb"
|
151
|
+
- "./lib/abt/providers/harvest/services/project_picker.rb"
|
152
|
+
- "./lib/abt/providers/harvest/services/task_picker.rb"
|
146
153
|
- "./lib/abt/version.rb"
|
147
154
|
- bin/abt
|
148
155
|
homepage: https://github.com/abtion/abt
|