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
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
|