abt-cli 0.0.25 → 0.0.30

Sign up to get free protection for your applications and to get access to all the features.
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