willpower 0.0.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 +7 -0
- data/.gitignore +13 -0
- data/.localized +0 -0
- data/.rspec +3 -0
- data/.ruby-version +1 -0
- data/Gemfile +5 -0
- data/Rakefile +6 -0
- data/bin/setup +8 -0
- data/bin/willpower +5 -0
- data/lib/willpower.rb +21 -0
- data/lib/willpower/assets/agile_principles.txt +43 -0
- data/lib/willpower/assets/agile_values.txt +7 -0
- data/lib/willpower/assets/definition_of_done.txt +6 -0
- data/lib/willpower/assets/definition_of_ready.txt +13 -0
- data/lib/willpower/assets/manifesto.txt +26 -0
- data/lib/willpower/commands/dod.rb +13 -0
- data/lib/willpower/commands/dor.rb +13 -0
- data/lib/willpower/commands/events.rb +89 -0
- data/lib/willpower/commands/hello.rb +8 -0
- data/lib/willpower/commands/help.rb +27 -0
- data/lib/willpower/commands/init.rb +25 -0
- data/lib/willpower/commands/login.rb +52 -0
- data/lib/willpower/commands/manifesto.rb +10 -0
- data/lib/willpower/commands/principles.rb +10 -0
- data/lib/willpower/commands/projects.rb +106 -0
- data/lib/willpower/commands/remotes.rb +48 -0
- data/lib/willpower/commands/tickets.rb +214 -0
- data/lib/willpower/commands/users.rb +50 -0
- data/lib/willpower/commands/values.rb +10 -0
- data/lib/willpower/commands/version.rb +8 -0
- data/lib/willpower/constants.rb +6 -0
- data/spec/spec_helper.rb +19 -0
- data/spec/willpower/dod_spec.rb +26 -0
- data/spec/willpower/dor_spec.rb +33 -0
- data/spec/willpower/hello_spec.rb +15 -0
- data/spec/willpower/init_spec.rb +36 -0
- data/spec/willpower/principles_spec.rb +63 -0
- data/spec/willpower/remote_spec.rb +94 -0
- data/spec/willpower/values_spec.rb +27 -0
- data/spec/willpower/version_spec.rb +15 -0
- data/willpower.gemspec +28 -0
- metadata +278 -0
@@ -0,0 +1,10 @@
|
|
1
|
+
module Willpower
|
2
|
+
class CLI < Thor
|
3
|
+
desc Rainbow("principles").cornflower, Rainbow("Shows twelwe willpower principles").darkgoldenrod
|
4
|
+
def principles
|
5
|
+
principl = []
|
6
|
+
principl << File.read("#{GEM_PATH}/willpower/assets/agile_principles.txt")
|
7
|
+
say Terminal::Table.new title: "Agile principles", rows: [principl], style: TERMINAL_STYLE
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
module Willpower
|
2
|
+
class Projects < Thor
|
3
|
+
desc "create <project>", "Create new project"
|
4
|
+
def create(project_name)
|
5
|
+
error_checking_projects
|
6
|
+
response = RestClient.post "#{CONFIG['current_remote']}/api/v1/projects/",
|
7
|
+
name: project_name, current_user: CONFIG["current_user"]
|
8
|
+
if response.body
|
9
|
+
say "Successfully created project #{project_name}"
|
10
|
+
else
|
11
|
+
say "Try again"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
desc "list", "Show projects"
|
16
|
+
def list
|
17
|
+
error_checking_projects
|
18
|
+
response = RestClient.get "#{CONFIG['current_remote']}/api/v1/userproject/#{CONFIG['current_user']}"
|
19
|
+
say Rainbow("<<Your Projects>>").cornflower
|
20
|
+
JSON.parse(response).each do |proj|
|
21
|
+
if proj["name"] == CONFIG["current_project"]
|
22
|
+
say "* #{proj['name']}"
|
23
|
+
else
|
24
|
+
say proj["name"]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
desc "show <project>", "Show project"
|
30
|
+
def show(project)
|
31
|
+
response = RestClient.get "#{CONFIG['current_remote']}/api/v1/projects/#{project}"
|
32
|
+
row = JSON.parse(response)
|
33
|
+
say "Project: #{row['data']['attributes']['name']}"
|
34
|
+
say "Description: #{row['data']['attributes']['description']}"
|
35
|
+
end
|
36
|
+
|
37
|
+
desc "use <project>", "Select current project"
|
38
|
+
def use(project)
|
39
|
+
error_checking_projects
|
40
|
+
response = RestClient.get "#{CONFIG['current_remote']}/api/v1/projects/"
|
41
|
+
project_search(response, project)
|
42
|
+
end
|
43
|
+
|
44
|
+
desc "update <project_name> ", "Update project"
|
45
|
+
def update(project)
|
46
|
+
error_checking_projects
|
47
|
+
choice = HighLine.new
|
48
|
+
answer = choice.ask("Choose what you want to edit: name or description (N or D): ", String)
|
49
|
+
if answer == "N"
|
50
|
+
update_name(project)
|
51
|
+
elsif answer == "D"
|
52
|
+
update_description(project)
|
53
|
+
else
|
54
|
+
say "Try again"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def update_name(project)
|
61
|
+
choice = HighLine.new
|
62
|
+
new_project = choice.ask("Enter new name of project: ", String)
|
63
|
+
RestClient.put "#{CONFIG['current_remote']}/api/v1/projects/#{project}",
|
64
|
+
name: project, new_name: new_project, type: 1,
|
65
|
+
current_user: CONFIG["current_user"]
|
66
|
+
say "Updated from #{project} to #{new_project}"
|
67
|
+
end
|
68
|
+
|
69
|
+
def update_description(project)
|
70
|
+
choice = HighLine.new
|
71
|
+
new_description = choice.ask("Enter new description for project: ", String)
|
72
|
+
RestClient.put "#{CONFIG['current_remote']}/api/v1/projects/#{project}",
|
73
|
+
name: project, new_description: new_description,
|
74
|
+
current_user: CONFIG["current_user"]
|
75
|
+
say "Updated description to #{new_description}"
|
76
|
+
end
|
77
|
+
|
78
|
+
def error_checking_projects
|
79
|
+
abort "You haven't done init yet!" unless CONFIG["current_remote"]
|
80
|
+
abort "Please, log in!" unless CONFIG["current_user"]
|
81
|
+
end
|
82
|
+
|
83
|
+
def project_search(response, project)
|
84
|
+
info = JSON.parse(response).map(&:values)
|
85
|
+
id_pr = info.map { |arr| arr[0] if arr[1] == project }
|
86
|
+
id_pr.delete_if(&:nil?)
|
87
|
+
if id_pr.empty?
|
88
|
+
say "Such project does not exist. Try again"
|
89
|
+
else
|
90
|
+
write_to_config(id_pr, project)
|
91
|
+
say "Your current project: #{project}"
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def write_to_config(id_pr, project)
|
96
|
+
CONFIG["current_project_id"] = id_pr.first
|
97
|
+
CONFIG["current_project"] = project
|
98
|
+
File.write("#{GEM_PATH}.config.json", JSON.generate(CONFIG))
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
class CLI < Thor
|
103
|
+
desc Rainbow("projects SUBCOMMAND ...ARGS").cornflower, Rainbow("Command for work with projects").darkgoldenrod
|
104
|
+
subcommand "projects", Projects
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Willpower
|
2
|
+
class Remotes < Thor
|
3
|
+
desc "use <remotes url>", "Use remote"
|
4
|
+
def use(remote)
|
5
|
+
error_checking_remotes
|
6
|
+
if CONFIG["remotes"].include?(remote)
|
7
|
+
CONFIG["current_remote"] = remote
|
8
|
+
File.write("#{GEM_PATH}.config.json", JSON.generate(CONFIG))
|
9
|
+
say "Successfully changed current remote!"
|
10
|
+
else
|
11
|
+
say "Try again"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
desc "add <remotes url>", "Add remote url"
|
16
|
+
def add(remote)
|
17
|
+
error_checking_remotes
|
18
|
+
CONFIG["remotes"].push(remote)
|
19
|
+
File.write("#{GEM_PATH}.config.json", JSON.generate(CONFIG))
|
20
|
+
say "Successfully added new remote!"
|
21
|
+
end
|
22
|
+
|
23
|
+
desc "list", "Remotes list"
|
24
|
+
def list
|
25
|
+
error_checking_remotes
|
26
|
+
CONFIG["remotes"].each do |name|
|
27
|
+
if name == CONFIG["current_remote"]
|
28
|
+
say "* #{name}"
|
29
|
+
else
|
30
|
+
say name
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def error_checking_remotes
|
38
|
+
abort "You haven't done init yet!" unless CONFIG["current_remote"]
|
39
|
+
abort "Please, log in!" unless CONFIG["current_user"]
|
40
|
+
abort "You have no remotes. Try to init!" unless CONFIG["remotes"]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class CLI < Thor
|
45
|
+
desc Rainbow("remotes SUBCOMMAND ...ARGS").cornflower, Rainbow("Command for work with remotes").darkgoldenrod
|
46
|
+
subcommand "remotes", Remotes
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,214 @@
|
|
1
|
+
# :reek:FeatureEnvy
|
2
|
+
module Willpower
|
3
|
+
class Tickets < Thor
|
4
|
+
desc "create <ticket>", "Add new ticket"
|
5
|
+
def create(ticket)
|
6
|
+
error_checking_tickets
|
7
|
+
ticket_name = ticket
|
8
|
+
cli = HighLine.new
|
9
|
+
ticket_description = cli.ask("description for ticket: ", String)
|
10
|
+
RestClient.post"#{CONFIG['current_remote']}/api/v1/tickets/",
|
11
|
+
project_id: CONFIG["current_project_id"], name: ticket_name,
|
12
|
+
user: CONFIG["current_user"], desc: ticket_description, status: ticket_status
|
13
|
+
say "Successfully added new ticket!"
|
14
|
+
end
|
15
|
+
|
16
|
+
desc "list", "Tickets list"
|
17
|
+
def list
|
18
|
+
error_checking_tickets
|
19
|
+
response = RestClient.get "#{CONFIG['current_remote']}/api/v1/tickets/"
|
20
|
+
info = JSON.parse(response)
|
21
|
+
print_tickets_list(info)
|
22
|
+
end
|
23
|
+
|
24
|
+
desc "my_list", "Tickets list"
|
25
|
+
def my_list
|
26
|
+
error_checking_tickets
|
27
|
+
response = RestClient.get "#{CONFIG['current_remote']}/api/v1/tickets/"
|
28
|
+
owner = []
|
29
|
+
JSON.parse(response).each { |ticket| owner << ticket if ticket["owner"] == CONFIG["current_user"] }
|
30
|
+
print_tickets_list(owner)
|
31
|
+
end
|
32
|
+
|
33
|
+
desc "show <name_ticket>", "Show ticket"
|
34
|
+
def show(ticket)
|
35
|
+
error_checking_tickets
|
36
|
+
response = RestClient.get "#{CONFIG['current_remote']}/api/v1/tickets/#{ticket}"
|
37
|
+
row = JSON.parse(response)
|
38
|
+
output_ticket(row["data"]["attributes"])
|
39
|
+
end
|
40
|
+
|
41
|
+
desc "update <ticket>", "update ticket"
|
42
|
+
def update(ticket)
|
43
|
+
error_checking_tickets
|
44
|
+
choice = HighLine.new
|
45
|
+
answer = choice.ask("Choose what you need to edit : name or description (N or D): ", String)
|
46
|
+
if answer == "N"
|
47
|
+
update_name(ticket)
|
48
|
+
elsif answer == "D"
|
49
|
+
update_description(ticket)
|
50
|
+
else
|
51
|
+
say "Try again"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
desc "take <ticket>", "Take ticket"
|
56
|
+
def take(ticket)
|
57
|
+
error_checking_tickets
|
58
|
+
RestClient.put "#{CONFIG['current_remote']}/api/v1/tickets/#{ticket}",
|
59
|
+
name: ticket, user: CONFIG["current_user"], type: 2
|
60
|
+
say "You take ticket #{ticket}"
|
61
|
+
end
|
62
|
+
|
63
|
+
desc "status <ticket>", "Update ticket status"
|
64
|
+
def status(ticket)
|
65
|
+
error_checking_tickets
|
66
|
+
RestClient.put "#{CONFIG['current_remote']}/api/v1/tickets/#{ticket}",
|
67
|
+
name: ticket, status: ticket_status, type: 3, project_id: CONFIG["current_project_id"]
|
68
|
+
say "You take ticket #{ticket}"
|
69
|
+
end
|
70
|
+
|
71
|
+
desc "archive", "View archived tickets"
|
72
|
+
def archive
|
73
|
+
error_checking_tickets
|
74
|
+
response = RestClient.get "#{CONFIG['current_remote']}/api/v1/tickets/"
|
75
|
+
info = JSON.parse(response)
|
76
|
+
info.each do |ticket|
|
77
|
+
archive_ticket(ticket) if ticket["project_id"] == CONFIG["current_project_id"] && ticket["status"] == "archived"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
def error_checking_tickets
|
84
|
+
abort "You haven't done init yet!" unless CONFIG["current_remote"]
|
85
|
+
abort "Please, log in!" unless CONFIG["current_user"]
|
86
|
+
abort "Please, choose a project to work with!" unless CONFIG["current_project"]
|
87
|
+
end
|
88
|
+
|
89
|
+
def output_ticket(row)
|
90
|
+
say "Ticket: #{row['name']}"
|
91
|
+
say "Description: #{row['description']}"
|
92
|
+
say "Status: #{row['status']}"
|
93
|
+
say "Owner: #{row['owner']}"
|
94
|
+
end
|
95
|
+
|
96
|
+
def archive_ticket(ticket)
|
97
|
+
say ticket["name"]
|
98
|
+
end
|
99
|
+
|
100
|
+
def ticket_status
|
101
|
+
cli = HighLine.new
|
102
|
+
puts "0 - ToDo\n1 - Review\n2 - Merged\n3 - In progress\n4 - Done\n5 - Archived"
|
103
|
+
cli.ask("Choose status of ticket (select number): ", Integer)
|
104
|
+
end
|
105
|
+
|
106
|
+
def update_name(ticket)
|
107
|
+
choice = HighLine.new
|
108
|
+
new_ticket = choice.ask("Enter new name of ticket: ", String)
|
109
|
+
RestClient.put "#{CONFIG['current_remote']}/api/v1/tickets/#{ticket}",
|
110
|
+
name: ticket, new_name: new_ticket, type: 1,
|
111
|
+
user: CONFIG["current_user"], project_id: CONFIG["current_project_id"]
|
112
|
+
say "Updated from #{ticket} to #{new_ticket}"
|
113
|
+
end
|
114
|
+
|
115
|
+
def update_description(ticket)
|
116
|
+
choice = HighLine.new
|
117
|
+
new_description = choice.ask("Enter new description of ticket: ", String)
|
118
|
+
RestClient.put "#{CONFIG['current_remote']}/api/v1/tickets/#{ticket}",
|
119
|
+
name: ticket, new_description: new_description,
|
120
|
+
user: CONFIG["current_user"]
|
121
|
+
say "Updated description to #{new_description}"
|
122
|
+
end
|
123
|
+
|
124
|
+
def print_arr_to_do(arr)
|
125
|
+
@s_to_do = ""
|
126
|
+
arr.each do |element|
|
127
|
+
@s_to_do += element.to_s + "\n"
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def print_arr_review(arr)
|
132
|
+
@s_review = ""
|
133
|
+
arr.each do |element|
|
134
|
+
@s_review += element.to_s + "\n"
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def print_arr_merged(arr)
|
139
|
+
@s_merged = ""
|
140
|
+
arr.each do |element|
|
141
|
+
@s_merged += element.to_s + "\n"
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
def print_arr_in_progress(arr)
|
146
|
+
@s_in_progress = ""
|
147
|
+
arr.each do |element|
|
148
|
+
@s_in_progress += element.to_s + "\n"
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
def print_arr_done(arr)
|
153
|
+
@s_done = ""
|
154
|
+
arr.each do |element|
|
155
|
+
@s_done += element.to_s + "\n"
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
# rubocop:disable Metrics/MethodLength
|
160
|
+
def tickets_to_arrays(my_tickets)
|
161
|
+
@to_do = []
|
162
|
+
@review = []
|
163
|
+
@merged = []
|
164
|
+
@in_progress = []
|
165
|
+
@done = []
|
166
|
+
|
167
|
+
my_tickets.each do |ticket|
|
168
|
+
case ticket["status"]
|
169
|
+
when "todo"
|
170
|
+
@to_do.push(ticket["name"])
|
171
|
+
when "review"
|
172
|
+
@review.push(ticket["name"])
|
173
|
+
when "merged"
|
174
|
+
@merged.push(ticket["name"])
|
175
|
+
when "in_progress"
|
176
|
+
@in_progress.push(ticket["name"])
|
177
|
+
when "done"
|
178
|
+
@done.push(ticket["name"])
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
# rubocop:enable Metrics/MethodLength
|
183
|
+
|
184
|
+
def parse_tickets(all_tickets)
|
185
|
+
my_tickets = []
|
186
|
+
all_tickets.each { |ticket| my_tickets << ticket if ticket["project_id"] == CONFIG["current_project_id"] }
|
187
|
+
tickets_to_arrays(my_tickets)
|
188
|
+
end
|
189
|
+
|
190
|
+
def print_all_arrays
|
191
|
+
print_arr_to_do(@to_do)
|
192
|
+
print_arr_review(@review)
|
193
|
+
print_arr_merged(@merged)
|
194
|
+
print_arr_in_progress(@in_progress)
|
195
|
+
print_arr_done(@done)
|
196
|
+
end
|
197
|
+
|
198
|
+
def print_tickets_list(all_tickets)
|
199
|
+
parse_tickets(all_tickets)
|
200
|
+
print_all_arrays
|
201
|
+
table = Terminal::Table.new do |tbl|
|
202
|
+
tbl.title = CONFIG["current_project"]
|
203
|
+
tbl.headings = %w[todo review merged in_progress done]
|
204
|
+
tbl.rows = [[@s_to_do, @s_review, @s_merged, @s_in_progress, @s_done]]
|
205
|
+
end
|
206
|
+
say table
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
class CLI < Thor
|
211
|
+
desc Rainbow("tickets SUBCOMMAND ...ARGS").cornflower, Rainbow("Command for work with tickets").darkgoldenrod
|
212
|
+
subcommand "tickets", Tickets
|
213
|
+
end
|
214
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Willpower
|
2
|
+
class Members < Thor
|
3
|
+
desc "invite <github_login>", "Add user in project"
|
4
|
+
def invite(login)
|
5
|
+
error_checking_users
|
6
|
+
find_user(login)
|
7
|
+
if @users_array.include?(login)
|
8
|
+
RestClient.put "#{CONFIG['current_remote']}/api/v1/userproject/#{login}",
|
9
|
+
project: CONFIG["current_project"], current_user: CONFIG["current_user"], new_user: login
|
10
|
+
say "Successfully added new user!"
|
11
|
+
else
|
12
|
+
say "There is no such user!"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
desc "role <github_login>", "Assign role to a user"
|
17
|
+
def role(login)
|
18
|
+
error_checking_users
|
19
|
+
RestClient.put"#{CONFIG['current_remote']}/api/v1/users/#{login}",
|
20
|
+
project_id: CONFIG["current_project_id"], name: login, role_id: role_type
|
21
|
+
say "Successfully updated user's role!"
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def find_user(login)
|
27
|
+
@users_array = []
|
28
|
+
all_users = RestClient.get "#{CONFIG['current_remote']}/api/v1/users"
|
29
|
+
JSON.parse(all_users).each do |hash|
|
30
|
+
@users_array.push(login) if hash["github_login"] == login
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def error_checking_users
|
35
|
+
abort "You haven't done init yet!" unless CONFIG["current_remote"]
|
36
|
+
abort "Please, log in!" unless CONFIG["current_user"]
|
37
|
+
abort "Please, choose a project to work with!" unless CONFIG["current_project"]
|
38
|
+
end
|
39
|
+
|
40
|
+
def role_type
|
41
|
+
cli = HighLine.new
|
42
|
+
cli.ask("Choose role type:\n1 - team member\n2 - scrum master\n3 - product owner", Integer)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
class CLI < Thor
|
47
|
+
desc Rainbow("users SUBCOMMAND ...ARGS").cornflower, Rainbow("Command for work with users").darkgoldenrod
|
48
|
+
subcommand "users", Members
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module Willpower
|
2
|
+
class CLI < Thor
|
3
|
+
desc Rainbow("values").cornflower, Rainbow("Shows core willpower values").darkgoldenrod
|
4
|
+
def values
|
5
|
+
values = []
|
6
|
+
values << File.read("#{GEM_PATH}/willpower/assets/agile_values.txt")
|
7
|
+
say Terminal::Table.new title: "Values", rows: [values], style: TERMINAL_STYLE
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|