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.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/bin/abt +1 -1
  3. data/lib/abt.rb +1 -0
  4. data/lib/abt/cli.rb +32 -9
  5. data/lib/abt/directory_config.rb +43 -0
  6. data/lib/abt/docs.rb +10 -6
  7. data/lib/abt/providers/asana.rb +1 -0
  8. data/lib/abt/providers/asana/base_command.rb +33 -3
  9. data/lib/abt/providers/asana/commands/add.rb +0 -4
  10. data/lib/abt/providers/asana/commands/branch_name.rb +0 -13
  11. data/lib/abt/providers/asana/commands/current.rb +0 -18
  12. data/lib/abt/providers/asana/commands/finalize.rb +2 -4
  13. data/lib/abt/providers/asana/commands/pick.rb +11 -41
  14. data/lib/abt/providers/asana/commands/tasks.rb +2 -7
  15. data/lib/abt/providers/asana/commands/write_config.rb +73 -0
  16. data/lib/abt/providers/asana/configuration.rb +11 -3
  17. data/lib/abt/providers/asana/path.rb +2 -2
  18. data/lib/abt/providers/asana/services/project_picker.rb +54 -0
  19. data/lib/abt/providers/asana/services/task_picker.rb +83 -0
  20. data/lib/abt/providers/devops.rb +1 -0
  21. data/lib/abt/providers/devops/api.rb +27 -20
  22. data/lib/abt/providers/devops/base_command.rb +42 -25
  23. data/lib/abt/providers/devops/commands/branch_name.rb +8 -16
  24. data/lib/abt/providers/devops/commands/current.rb +2 -21
  25. data/lib/abt/providers/devops/commands/harvest_time_entry_data.rb +8 -16
  26. data/lib/abt/providers/devops/commands/pick.rb +11 -60
  27. data/lib/abt/providers/devops/commands/work_items.rb +3 -7
  28. data/lib/abt/providers/devops/commands/write_config.rb +47 -0
  29. data/lib/abt/providers/devops/configuration.rb +1 -1
  30. data/lib/abt/providers/devops/path.rb +24 -8
  31. data/lib/abt/providers/devops/services/board_picker.rb +69 -0
  32. data/lib/abt/providers/devops/services/project_picker.rb +73 -0
  33. data/lib/abt/providers/devops/services/work_item_picker.rb +99 -0
  34. data/lib/abt/providers/harvest.rb +1 -0
  35. data/lib/abt/providers/harvest/base_command.rb +45 -3
  36. data/lib/abt/providers/harvest/commands/current.rb +0 -28
  37. data/lib/abt/providers/harvest/commands/pick.rb +12 -27
  38. data/lib/abt/providers/harvest/commands/projects.rb +2 -9
  39. data/lib/abt/providers/harvest/commands/tasks.rb +2 -19
  40. data/lib/abt/providers/harvest/commands/write_config.rb +41 -0
  41. data/lib/abt/providers/harvest/configuration.rb +1 -1
  42. data/lib/abt/providers/harvest/path.rb +1 -1
  43. data/lib/abt/providers/harvest/services/project_picker.rb +53 -0
  44. data/lib/abt/providers/harvest/services/task_picker.rb +50 -0
  45. data/lib/abt/version.rb +1 -1
  46. metadata +13 -6
  47. data/lib/abt/providers/asana/commands/init.rb +0 -42
  48. data/lib/abt/providers/devops/commands/boards.rb +0 -34
  49. data/lib/abt/providers/devops/commands/init.rb +0 -79
  50. 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 initialize Harvest?")
29
+ abort("No current/specified project. Did you forget to run `pick`?")
30
30
  end
31
31
 
32
32
  def require_task!
33
- abort("No current/specified project. Did you initialize Harvest and pick a task?") unless project_id
33
+ require_project!
34
+ return if task_id
34
35
 
35
- abort("No current/specified task. Did you pick a Harvest task?") if task_id.nil?
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
- require_local_config!
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.path = Path.from_ids(project_id: project_id, task_id: task["id"])
34
- end
35
-
36
- private
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
- def tasks
47
- @tasks ||= project_assignment["task_assignments"].map { |ta| ta["task"] }
35
+ config.path = path
48
36
  end
49
37
 
50
- def project_assignment
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 project_assignments
57
- @project_assignments ||= api.get_paged("users/me/project_assignments")
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 ||= begin
26
- warn("Fetching projects...")
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
- require_project!
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 ||= begin
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
@@ -15,7 +15,7 @@ module Abt
15
15
  end
16
16
 
17
17
  def path
18
- Path.new(local_available? && git["path"] || "")
18
+ Path.new(local_available? && git["path"] || cli.directory_config.dig("harvest", "path") || "")
19
19
  end
20
20
 
21
21
  def path=(new_path)
@@ -28,7 +28,7 @@ module Abt
28
28
  private
29
29
 
30
30
  def match
31
- @match ||= PATH_REGEX.match(self)
31
+ @match ||= PATH_REGEX.match(to_s)
32
32
  end
33
33
  end
34
34
  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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Abt
4
- VERSION = "0.0.25"
4
+ VERSION = "0.0.30"
5
5
  end
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.25
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-18 00:00:00.000000000 Z
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