willpower 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 59e7bd3b77b7f2017dfaac5e08131130dcc84e4f452169b1aa5a62ae3c0d0b54
|
4
|
+
data.tar.gz: ed023080f6b4c05b82324980f7c1cf145670b6f5ba6249fbc5dbe6f96aadf062
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1219840e34734b9ae57b6c4dfc86ca76c968586b417f7b2af4919744902c47d451fd53a5910eaa98050d590df78fbeb11813bac82ee4477b3e0e790665d44ec8
|
7
|
+
data.tar.gz: dd74863f4a8310a148e4b4d8ca54a23629e9120c052db95edd121617dfa33a868b54657d4a6ee9456def656cbf59418dba0045a62bde1a748388e5667cf2694a
|
data/.gitignore
ADDED
data/.localized
ADDED
File without changes
|
data/.rspec
ADDED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.7.2
|
data/Gemfile
ADDED
data/Rakefile
ADDED
data/bin/setup
ADDED
data/bin/willpower
ADDED
data/lib/willpower.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require "thor"
|
2
|
+
require "rainbow"
|
3
|
+
require "willpower/constants"
|
4
|
+
require "json"
|
5
|
+
require "rest-client"
|
6
|
+
require "terminal-table"
|
7
|
+
require "highline"
|
8
|
+
Dir[File.join(__dir__, "willpower/commands", "*.rb")].each { |file| require file }
|
9
|
+
|
10
|
+
module Willpower
|
11
|
+
GEM_PATH = `gem which willpower`.chomp.chomp("willpower.rb")
|
12
|
+
if `find "#{GEM_PATH}" -name .config.json`.empty?
|
13
|
+
`touch #{GEM_PATH}.config.json`
|
14
|
+
File.write("#{GEM_PATH}.config.json", {})
|
15
|
+
end
|
16
|
+
|
17
|
+
CONFIG = JSON.parse(File.read("#{GEM_PATH}.config.json"))
|
18
|
+
|
19
|
+
class CLI < Thor
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
Our highest priority is to satisfy the customer
|
2
|
+
through early and continuous delivery
|
3
|
+
of valuable software.
|
4
|
+
|
5
|
+
Welcome changing requirements, even late in
|
6
|
+
development. Agile processes harness change for
|
7
|
+
the customer's competitive advantage.
|
8
|
+
|
9
|
+
Deliver working software frequently, from a
|
10
|
+
couple of weeks to a couple of months, with a
|
11
|
+
preference to the shorter timescale.
|
12
|
+
|
13
|
+
Business people and developers must work
|
14
|
+
together daily throughout the project.
|
15
|
+
|
16
|
+
Build projects around motivated individuals.
|
17
|
+
|
18
|
+
Give them the environment and support they need,
|
19
|
+
and trust them to get the job done.
|
20
|
+
|
21
|
+
The most efficient and effective method of
|
22
|
+
conveying information to and within a development
|
23
|
+
team is face-to-face conversation.
|
24
|
+
|
25
|
+
Working software is the primary measure of progress.
|
26
|
+
|
27
|
+
Agile processes promote sustainable development.
|
28
|
+
|
29
|
+
The sponsors, developers, and users should be able
|
30
|
+
to maintain a constant pace indefinitely.
|
31
|
+
|
32
|
+
Continuous attention to technical excellence
|
33
|
+
and good design enhances agility.
|
34
|
+
|
35
|
+
Simplicity--the art of maximizing the amount
|
36
|
+
of work not done--is essential.
|
37
|
+
|
38
|
+
The best architectures, requirements, and designs
|
39
|
+
emerge from self-organizing teams.
|
40
|
+
|
41
|
+
At regular intervals, the team reflects on how
|
42
|
+
to become more effective, then tunes and adjusts
|
43
|
+
its behavior accordingly.
|
@@ -0,0 +1,13 @@
|
|
1
|
+
All work should have a related Ticket.
|
2
|
+
Developer should not start development unless a Ticket is "Ready for development"
|
3
|
+
We consider a Ticket "Ready for development" if it meets following requirements:
|
4
|
+
|
5
|
+
Ticket Requirements must have:
|
6
|
+
|
7
|
+
1. Ticket should have a short title
|
8
|
+
2. Ticket should have a clear description
|
9
|
+
3. Description should including "How to demo" section
|
10
|
+
4. Description may have "Acceptance Criteria" section which includes all important(specific) requirements
|
11
|
+
5. All Blocker should be resolved
|
12
|
+
6. Ticket can reasonably be "Done" within the Sprint time-box
|
13
|
+
7. Ticket should have Estimation
|
@@ -0,0 +1,26 @@
|
|
1
|
+
Manifesto for Agile Software Development
|
2
|
+
|
3
|
+
We are uncovering better ways of developing
|
4
|
+
software by doing it and helping others do it.
|
5
|
+
Through this work we have come to value:
|
6
|
+
|
7
|
+
Individuals and interactions over processes and tools
|
8
|
+
Working software over comprehensive documentation
|
9
|
+
Customer collaboration over contract negotiation
|
10
|
+
Responding to change over following a plan
|
11
|
+
|
12
|
+
That is, while there is value in the items on
|
13
|
+
the right, we value the items on the left more.
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
Kent Beck | Andrew Hunt
|
19
|
+
Mike Beedle | Ron Jeffries
|
20
|
+
Arie van Bennekum | Jon Kern
|
21
|
+
Alistair Cockburn | Brian Marick
|
22
|
+
Ward Cunningham | Robert C. Martin
|
23
|
+
Martin Fowler | Steve Mellor
|
24
|
+
James Grenning | Ken Schwaber
|
25
|
+
Jim Highsmith | Jeff Sutherland
|
26
|
+
Dave Thomas |
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# rubocop:disable Naming/MethodName
|
2
|
+
# :reek:UncommunicativeMethodName
|
3
|
+
module Willpower
|
4
|
+
class CLI < Thor
|
5
|
+
desc Rainbow("DoD").cornflower, Rainbow("Shows you rules of display done tasks").darkgoldenrod
|
6
|
+
def DoD
|
7
|
+
dod = []
|
8
|
+
dod << File.read("#{GEM_PATH}/willpower/assets/definition_of_done.txt")
|
9
|
+
say Terminal::Table.new title: "Definition of Done", rows: [dod], style: TERMINAL_STYLE
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
# rubocop:enable Naming/MethodName
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# rubocop:disable Naming/MethodName
|
2
|
+
# :reek:UncommunicativeMethodName
|
3
|
+
module Willpower
|
4
|
+
class CLI < Thor
|
5
|
+
desc Rainbow("DoR").cornflower, Rainbow("Shows you rules of writing items").darkgoldenrod
|
6
|
+
def DoR
|
7
|
+
dor = []
|
8
|
+
dor << File.read("#{GEM_PATH}/willpower/assets/definition_of_ready.txt")
|
9
|
+
say Terminal::Table.new title: "Definition of Ready", rows: [dor], style: TERMINAL_STYLE
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
# rubocop:enable Naming/MethodName
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module Willpower
|
2
|
+
class Events < Thor
|
3
|
+
desc "create", "Add new event"
|
4
|
+
def create
|
5
|
+
error_checking_events
|
6
|
+
cli = HighLine.new
|
7
|
+
event_description = cli.ask("description for event: ", String)
|
8
|
+
RestClient.post"#{CONFIG['current_remote']}/api/v1/events/",
|
9
|
+
event_type: type_cli, date: date_cli, start_time: start_time_cli,
|
10
|
+
end_time: end_time_cli, desc: event_description,
|
11
|
+
current_user: CONFIG["current_user"], project_id: CONFIG["current_project_id"]
|
12
|
+
say "Successfully added new event!"
|
13
|
+
end
|
14
|
+
|
15
|
+
desc "list", "Show all events"
|
16
|
+
def list
|
17
|
+
error_checking_events
|
18
|
+
response = RestClient.get "#{CONFIG['current_remote']}/api/v1/events/"
|
19
|
+
say "<<Project events>>"
|
20
|
+
JSON.parse(response).each do |event|
|
21
|
+
if event["project_id"] == CONFIG["current_project_id"]
|
22
|
+
info = parse_info(event)
|
23
|
+
say "#{(event['event_type']).upcase} starts at #{parse_date(event)} #{info[:start]} and ends at #{info[:end]}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "show <date (yyyy-mm-dd)>", "Show event"
|
29
|
+
# :reek:ControlParameter
|
30
|
+
def show(date)
|
31
|
+
error_checking_events
|
32
|
+
response = RestClient.get "#{CONFIG['current_remote']}/api/v1/events/"
|
33
|
+
JSON.parse(response).each { |event| puts_info(event) if event["date"] == date }
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def error_checking_events
|
39
|
+
abort "You haven't done init yet!" unless CONFIG["current_remote"]
|
40
|
+
abort "Please, log in!" unless CONFIG["current_user"]
|
41
|
+
abort "Please, choose a project to work with!" unless CONFIG["current_project"]
|
42
|
+
end
|
43
|
+
|
44
|
+
def puts_info(event)
|
45
|
+
say "Type of event: #{event['event_type']}\nDescription: #{event['description']}"
|
46
|
+
say "Start at #{norm_time(event['start_time'])}\nEnd at #{norm_time(event['end_time'])}"
|
47
|
+
puts ""
|
48
|
+
end
|
49
|
+
|
50
|
+
def parse_info(event)
|
51
|
+
{ start: norm_time(event["start_time"]),
|
52
|
+
end: norm_time(event["end_time"]) }
|
53
|
+
end
|
54
|
+
|
55
|
+
def parse_date(event)
|
56
|
+
Date.parse(event["date"]).strftime("%B %d")
|
57
|
+
end
|
58
|
+
|
59
|
+
def norm_time(param)
|
60
|
+
Time.parse(param).strftime("%I:%M")
|
61
|
+
end
|
62
|
+
|
63
|
+
def type_cli
|
64
|
+
cli = HighLine.new
|
65
|
+
puts "0 - scrum\n1 - retro\n2 - planning\n3 - review"
|
66
|
+
cli.ask("Choose type of event (select number): ", Integer)
|
67
|
+
end
|
68
|
+
|
69
|
+
def date_cli
|
70
|
+
cli = HighLine.new
|
71
|
+
cli.ask("Select data for event (yyyy.mm.dd): ", String)
|
72
|
+
end
|
73
|
+
|
74
|
+
def start_time_cli
|
75
|
+
cli = HighLine.new
|
76
|
+
cli.ask("Select start time for event (hh:mm): ", String)
|
77
|
+
end
|
78
|
+
|
79
|
+
def end_time_cli
|
80
|
+
cli = HighLine.new
|
81
|
+
cli.ask("Select end time for event (hh:mm): ", String)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
class CLI < Thor
|
86
|
+
desc Rainbow("events SUBCOMMAND ...ARGS").cornflower, Rainbow("Command for work with events").darkgoldenrod
|
87
|
+
subcommand "events", Events
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# rubocop: disable all
|
2
|
+
# :reek:disable
|
3
|
+
module Willpower
|
4
|
+
class CLI < Thor
|
5
|
+
class << self
|
6
|
+
def help(shell, subcommand = false)
|
7
|
+
list = printable_commands(true, subcommand)
|
8
|
+
Thor::Util.thor_classes_in(self).each do |klass|
|
9
|
+
list += klass.printable_commands(false)
|
10
|
+
end
|
11
|
+
list.sort! { |a, b| a[0] <=> b[0] }
|
12
|
+
list.reject! { |l| l[0].split[1] == 'help' }
|
13
|
+
|
14
|
+
if defined?(@package_name) && @package_name
|
15
|
+
shell.say "#{@package_name} commands:"
|
16
|
+
else
|
17
|
+
shell.say Rainbow('Commands:').whitesmoke
|
18
|
+
end
|
19
|
+
|
20
|
+
shell.print_table(list, indent: 2, truncate: true)
|
21
|
+
shell.say
|
22
|
+
class_options_help(shell)
|
23
|
+
shell.say Rainbow('All commands can be run with -h (or --help) for more information.').whitesmoke
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# :reek:InstanceVariableAssumption
|
2
|
+
module Willpower
|
3
|
+
class CLI < Thor
|
4
|
+
include Thor::Actions
|
5
|
+
desc Rainbow("init REMOTE_URL").cornflower, Rainbow("Add default remote").darkgoldenrod
|
6
|
+
|
7
|
+
def init(remote)
|
8
|
+
error_checking_init
|
9
|
+
write_remote_to_config(remote)
|
10
|
+
say "Successfully added new remote!"
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def error_checking_init
|
16
|
+
abort "You've already did init! Try to add more remotes" if CONFIG["current_remote"]
|
17
|
+
end
|
18
|
+
|
19
|
+
def write_remote_to_config(remote)
|
20
|
+
CONFIG["current_remote"] = remote
|
21
|
+
CONFIG["remotes"] = [remote]
|
22
|
+
File.write("#{GEM_PATH}.config.json", JSON.generate(CONFIG))
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# :reek:InstanceVariableAssumption:TooManyStatements
|
2
|
+
|
3
|
+
module Willpower
|
4
|
+
class CLI < Thor
|
5
|
+
desc Rainbow("login").cornflower, Rainbow("Sign in github.").darkgoldenrod
|
6
|
+
def login
|
7
|
+
error_checking_login
|
8
|
+
open_link
|
9
|
+
@secret_node = call_cli
|
10
|
+
@response = RestClient.get "#{CONFIG['current_remote']}/api/v1/users/#{@secret_node}"
|
11
|
+
if JSON.parse(@response)["data"]["attributes"]
|
12
|
+
parse_login
|
13
|
+
else
|
14
|
+
say "Something went wrong"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def write_to_config(login)
|
21
|
+
CONFIG["current_user"] = login
|
22
|
+
CONFIG["user_node"] = @secret_node
|
23
|
+
File.write("#{GEM_PATH}.config.json", JSON.generate(CONFIG))
|
24
|
+
end
|
25
|
+
|
26
|
+
def parse_login
|
27
|
+
login = JSON.parse(@response)["data"]["attributes"]["github_login"]
|
28
|
+
write_to_config(login)
|
29
|
+
say "Hello, #{login}!"
|
30
|
+
end
|
31
|
+
|
32
|
+
def call_cli
|
33
|
+
cli = HighLine.new
|
34
|
+
cli.ask("Enter your secret code: ", String)
|
35
|
+
end
|
36
|
+
|
37
|
+
def open_link
|
38
|
+
link = "#{GITHUB_URL}/oauth/authorize?client_id=#{CLIENT_ID}"
|
39
|
+
if RbConfig::CONFIG["host_os"].match?(/mswin|mingw|cygwin/)
|
40
|
+
system "start #{link}"
|
41
|
+
elsif RbConfig::CONFIG["host_os"].match?(/darwin/)
|
42
|
+
system "open #{link}"
|
43
|
+
elsif RbConfig::CONFIG["host_os"].match?(/linux|bsd/)
|
44
|
+
system "xdg-open #{link}"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def error_checking_login
|
49
|
+
abort "You haven't done init yet!" unless CONFIG["current_remote"]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module Willpower
|
2
|
+
class CLI < Thor
|
3
|
+
desc Rainbow("manifesto").cornflower, Rainbow("Shows manifesto").darkgoldenrod
|
4
|
+
def manifesto
|
5
|
+
manifest = []
|
6
|
+
manifest << File.read("#{GEM_PATH}/willpower/assets/manifesto.txt")
|
7
|
+
say Terminal::Table.new title: "Manifesto", rows: [manifest], style: TERMINAL_STYLE
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|