balboa 0.1.2 → 0.1.3
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 +4 -4
- data/balboa.gemspec +2 -0
- data/bin/balboa +20 -10
- data/lib/balboa/cli/command/help_command.rb +0 -21
- data/lib/balboa/cli/command/punch_command.rb +58 -13
- data/lib/balboa/cli/command/reset_command.rb +19 -0
- data/lib/balboa/cli/defaults.rb +81 -0
- data/lib/balboa/cli/options.rb +7 -40
- data/lib/balboa/cli/parser_builder.rb +122 -0
- data/lib/balboa/config_file.rb +5 -0
- data/lib/balboa/interactor/capybara_interactor.rb +6 -4
- data/lib/balboa/interactor/command/fill_punch_command.rb +11 -6
- data/lib/balboa/interactor/command/login_command.rb +3 -4
- data/lib/balboa/interactor/interactor_builder.rb +2 -2
- data/lib/balboa/interactor/interactor_wrapper.rb +4 -0
- data/lib/balboa/version.rb +1 -1
- data/lib/balboa.rb +3 -1
- data/spec/balboa/{interactor_spec.rb → capybara_interactor_spec.rb} +8 -2
- data/spec/balboa/interactor/interactor_wrapper_spec.rb +25 -0
- metadata +36 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4c25acee3579ab0c156d12ce5e438e813d1547d8
|
4
|
+
data.tar.gz: 1476c5b8e2c9a49b7f5e5d2d5591888234e3b5f0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3fcfe0ee354b9c9996907fb1d529e72d6910127b9abd812dbbb486259ea35f1ed21835843febaf6b626113b3dc95fda6fb0ec55b9bbf425459f69152c718dc4b
|
7
|
+
data.tar.gz: 387295753dda02919638b846b917bb4e9a63992ae178f74e1ff6b184628d1224f2ac50d3507e6badb22673f4a0784cbdca1bdcbdd4d79504c16be5dfc48f105e
|
data/balboa.gemspec
CHANGED
data/bin/balboa
CHANGED
@@ -3,24 +3,34 @@
|
|
3
3
|
|
4
4
|
require_relative '../lib/balboa'
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
defaults = if File.exist?(Balboa::CONFIG_FILE)
|
7
|
+
YAML.load_file(Balboa::CONFIG_FILE)
|
8
|
+
else
|
9
|
+
Balboa::CLI::Defaults.prompt
|
10
|
+
end
|
11
11
|
|
12
|
-
Balboa::
|
12
|
+
options = Balboa::CLI::Options.parse(ARGV, defaults)
|
13
13
|
|
14
|
+
raw_interactor = Balboa::Interactor::InteractorBuilder.create(options)
|
14
15
|
interactor = Balboa::Interactor::InteractorWrapper.new(raw_interactor)
|
15
16
|
|
16
17
|
app_last = Balboa::CLI::Command::LastCommand.new(interactor)
|
17
|
-
app_punch = Balboa::CLI::Command::PunchCommand.new(interactor
|
18
|
-
|
18
|
+
app_punch = Balboa::CLI::Command::PunchCommand.new(interactor)
|
19
|
+
app_reset = Balboa::CLI::Command::ResetCommand.new
|
19
20
|
app_star_wars = Balboa::CLI::Command::StarWarsCommand.new
|
20
21
|
|
22
|
+
command = ARGV.first
|
23
|
+
app = Balboa::CLI::Application.new(command)
|
21
24
|
app.add_command(:last, app_last)
|
22
25
|
app.add_command(:punch, app_punch)
|
23
|
-
app.add_command(:
|
26
|
+
app.add_command(:reset, app_reset)
|
24
27
|
app.add_command(:star_wars, app_star_wars)
|
25
28
|
|
26
|
-
|
29
|
+
begin
|
30
|
+
app.execute
|
31
|
+
rescue Balboa::CLI::Application::CommandNotFound
|
32
|
+
$stdout.puts("\nCommand Not Found!")
|
33
|
+
$stdout.puts("\nRun `balboa -h' to check available commands and options.")
|
34
|
+
rescue Balboa::Interactor::Command::LoginCommand::LoginFailure
|
35
|
+
$stdout.puts("\nWrong e-mail or password!")
|
36
|
+
end
|
@@ -13,27 +13,6 @@ module Balboa
|
|
13
13
|
private
|
14
14
|
|
15
15
|
def help
|
16
|
-
[
|
17
|
-
"░░░░░▄▄███████████████▄▄░░░░ BALBOA #{Balboa::VERSION}",
|
18
|
-
"░░▄██████████████████████▄░░",
|
19
|
-
"░█████████▀███████▀████████░",
|
20
|
-
"█████████▀▀█▀█░░▀██▄██▄████░ Usage: balboa [command] [options]",
|
21
|
-
"░████████▄▄█░▀▀▄▄█░░▀░████░░",
|
22
|
-
"░███████▀░░░▄▄▄▄░░░▄▄▄███░░░ Commands:",
|
23
|
-
"▀███████░░▄▀▀██▀░░█▄░▄▀███░░ last Fetch last punch date",
|
24
|
-
"░██████▀░░█░██▀▀░░████░██░░░ punch Punch up to yesterday",
|
25
|
-
"████████░▄░░▀▀░░░░▀▄░▀▀█░░░░ help HERBERT, COME TO MY RESCUE",
|
26
|
-
"█▀██████▀░▄░░▄░░░░░░█░░█░░░░",
|
27
|
-
"▀▄████▄▀░░░▀▀░░▀░▄░░▀░░░█░░░ Options:",
|
28
|
-
"▄██████▀▄░░░░░░░░░██▄▄▄░█░░░ balboa punch -c FILE Override config from .balboa",
|
29
|
-
"███████░█░░░░░░░░█▀▄▄▄█░░█░░ balboa punch -p PASSWORD Override password from .balboa",
|
30
|
-
"░██████░░█░░░░░░░░░▀░░░░░░▀▄",
|
31
|
-
"▀▄█████░░░▀▄░░░░░░░░░░░░░░░█ Examples:",
|
32
|
-
"░░░███▀░░░░░░▀░░░░▄░░░░░░▄█░ balboa",
|
33
|
-
"░░░▄▀░░░░░░░░░▀▄░░░▀▀▀▀▀█▀░░ balboa punch",
|
34
|
-
"░▀░░░░░░░░░░░░░░░▀░░░░░░▀▄░░",
|
35
|
-
"░░░░░░░░░░░░░░░░░░░░░░░▄░█▀▄ #{quote}"
|
36
|
-
].join("\n")
|
37
16
|
end
|
38
17
|
|
39
18
|
def quote
|
@@ -1,25 +1,21 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'holidays'
|
4
|
+
require 'highline/import'
|
5
|
+
|
3
6
|
module Balboa
|
4
7
|
module CLI
|
5
8
|
module Command
|
6
9
|
class PunchCommand
|
7
|
-
def initialize(interactor
|
10
|
+
def initialize(interactor)
|
8
11
|
@interactor = interactor
|
9
|
-
@holidays = holidays.uniq.map { |holiday| Date.parse(holiday) }
|
10
12
|
end
|
11
13
|
|
12
14
|
def execute
|
13
15
|
punch_dates.each do |date|
|
14
|
-
$stdout.print(date.strftime("%d/%m/%Y"))
|
15
|
-
|
16
|
-
if date.saturday? || date.sunday? || holiday?(date)
|
17
|
-
$stdout.print(" # SKIPPED")
|
18
|
-
else
|
19
|
-
@interactor.punch(date)
|
20
|
-
end
|
16
|
+
$stdout.print("\n#{date.strftime("%d/%m/%Y")}")
|
21
17
|
|
22
|
-
|
18
|
+
@interactor.punch(date) unless skip_date?(date)
|
23
19
|
end
|
24
20
|
end
|
25
21
|
|
@@ -28,16 +24,65 @@ module Balboa
|
|
28
24
|
def punch_dates
|
29
25
|
yesterday = Date.today - 1
|
30
26
|
|
31
|
-
(last_punch_date..yesterday)
|
27
|
+
(last_punch_date..yesterday).map do |date|
|
28
|
+
PunchDate.new(date)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def skip_date?(date)
|
33
|
+
!date.punchable? || skips_include?(date)
|
32
34
|
end
|
33
35
|
|
34
|
-
def
|
35
|
-
@
|
36
|
+
def skips_include?(date)
|
37
|
+
@interactor.options['skips'].include?(date)
|
36
38
|
end
|
37
39
|
|
38
40
|
def last_punch_date
|
39
41
|
Date.parse(@interactor.last) + 1
|
40
42
|
end
|
43
|
+
|
44
|
+
class PunchDate
|
45
|
+
def initialize(date)
|
46
|
+
@date = date
|
47
|
+
@holiday = Hash(Holidays.on(@date, :br).first)
|
48
|
+
end
|
49
|
+
|
50
|
+
def punchable?
|
51
|
+
if weekend?
|
52
|
+
false
|
53
|
+
elsif holiday?
|
54
|
+
ask_for_punch
|
55
|
+
else
|
56
|
+
true
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def to_s
|
61
|
+
@date.to_s
|
62
|
+
end
|
63
|
+
|
64
|
+
def strftime(format)
|
65
|
+
@date.strftime(format)
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def ask_for_punch
|
71
|
+
HighLine.agree(" #{holiday_name}. Punch? (y|n) ")
|
72
|
+
end
|
73
|
+
|
74
|
+
def holiday_name
|
75
|
+
@holiday[:name]
|
76
|
+
end
|
77
|
+
|
78
|
+
def holiday?
|
79
|
+
!!@holiday
|
80
|
+
end
|
81
|
+
|
82
|
+
def weekend?
|
83
|
+
@date.sunday? || @date.saturday?
|
84
|
+
end
|
85
|
+
end
|
41
86
|
end
|
42
87
|
end
|
43
88
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Balboa
|
4
|
+
module CLI
|
5
|
+
module Command
|
6
|
+
class ResetCommand
|
7
|
+
def execute
|
8
|
+
File.delete(Balboa::CONFIG_FILE)
|
9
|
+
|
10
|
+
$stdout.puts(message)
|
11
|
+
end
|
12
|
+
|
13
|
+
def message
|
14
|
+
"\nBalboa restored to initial settings!"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'yaml'
|
4
|
+
require 'highline'
|
5
|
+
|
6
|
+
module Balboa
|
7
|
+
module CLI
|
8
|
+
class Defaults
|
9
|
+
def self.prompt
|
10
|
+
new.prompt
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@config = {}
|
15
|
+
@cli = HighLine.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def prompt
|
19
|
+
prompt_attributes
|
20
|
+
|
21
|
+
prompt_schedule
|
22
|
+
|
23
|
+
create_file
|
24
|
+
|
25
|
+
@config
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def create_file
|
31
|
+
@config.reject! { |_, key| key.empty? }
|
32
|
+
@config.merge!('skips' => [])
|
33
|
+
|
34
|
+
File.open(Balboa::CONFIG_FILE, 'w') { |file| file.write(@config.to_yaml) }
|
35
|
+
end
|
36
|
+
|
37
|
+
def prompt_attributes
|
38
|
+
@config.merge!('email' => prompt_email)
|
39
|
+
@config.merge!('password' => prompt_password)
|
40
|
+
@config.merge!('project' => prompt_project)
|
41
|
+
end
|
42
|
+
|
43
|
+
def prompt_email
|
44
|
+
@cli.ask("E-mail: ")
|
45
|
+
end
|
46
|
+
|
47
|
+
def prompt_password
|
48
|
+
@cli.say("\nRemember: Password can be stored as text or passed via option!")
|
49
|
+
|
50
|
+
@cli.ask("Password: ") { |qst| qst.echo = "*" }
|
51
|
+
end
|
52
|
+
|
53
|
+
def prompt_project
|
54
|
+
@cli.ask("\nProject: ")
|
55
|
+
end
|
56
|
+
|
57
|
+
def prompt_schedule
|
58
|
+
@config.merge!('start_at' => prompt_start)
|
59
|
+
@config.merge!('lunch_at' => prompt_lunch)
|
60
|
+
@config.merge!('restart_at' => prompt_restart)
|
61
|
+
@config.merge!('leave_at' => prompt_leave)
|
62
|
+
end
|
63
|
+
|
64
|
+
def prompt_start
|
65
|
+
@cli.ask("\nFirst shift: ") { |qst| qst.default = "8" }
|
66
|
+
end
|
67
|
+
|
68
|
+
def prompt_lunch
|
69
|
+
@cli.ask("\nLunch: ") { |qst| qst.default = "12" }
|
70
|
+
end
|
71
|
+
|
72
|
+
def prompt_restart
|
73
|
+
@cli.ask("\nSecond shift: ") { |qst| qst.default = "13" }
|
74
|
+
end
|
75
|
+
|
76
|
+
def prompt_leave
|
77
|
+
@cli.ask("\nLeave: ") { |qst| qst.default = "17" }
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
data/lib/balboa/cli/options.rb
CHANGED
@@ -1,59 +1,26 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
require 'yaml'
|
3
|
+
require_relative 'parser_builder'
|
5
4
|
|
6
5
|
module Balboa
|
7
6
|
module CLI
|
8
7
|
class Options
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
MissingOptionError = Class.new(RuntimeError)
|
13
|
-
|
14
|
-
def self.parse(shifted_argv=[])
|
15
|
-
new(shifted_argv).parse
|
8
|
+
def self.parse(*args)
|
9
|
+
new(*args).parse
|
16
10
|
rescue OptionParser::InvalidOption => error
|
17
11
|
$stderr.puts "Error: #{error}"
|
18
|
-
exit
|
12
|
+
exit
|
19
13
|
end
|
20
14
|
|
21
|
-
def initialize(
|
22
|
-
@
|
23
|
-
@
|
24
|
-
|
25
|
-
configure_parser
|
15
|
+
def initialize(argv=[], config={})
|
16
|
+
@config = config
|
17
|
+
@parser = Balboa::CLI::ParserBuilder.create(argv, config)
|
26
18
|
end
|
27
19
|
|
28
20
|
def parse
|
29
21
|
@parser.parse!
|
30
|
-
|
31
22
|
@config
|
32
23
|
end
|
33
|
-
|
34
|
-
private
|
35
|
-
|
36
|
-
def configure_parser
|
37
|
-
load_balboa_file
|
38
|
-
load_config_file
|
39
|
-
load_params
|
40
|
-
end
|
41
|
-
|
42
|
-
def load_balboa_file
|
43
|
-
@config.merge!(YAML.load_file(BALBOA_FILE)) if File.exists?(BALBOA_FILE)
|
44
|
-
end
|
45
|
-
|
46
|
-
def load_config_file
|
47
|
-
@parser.on('-c', '--config FILE') do |file|
|
48
|
-
@config.merge!(YAML.load_file(file)) if File.exists?(file)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def load_params
|
53
|
-
@parser.on('-p', '--password PASSWORD') do |password|
|
54
|
-
@config.merge!('password' => password)
|
55
|
-
end
|
56
|
-
end
|
57
24
|
end
|
58
25
|
end
|
59
26
|
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'optparse'
|
4
|
+
require 'yaml'
|
5
|
+
|
6
|
+
module Balboa
|
7
|
+
module CLI
|
8
|
+
class ParserBuilder
|
9
|
+
def self.create(*args)
|
10
|
+
new(*args).create
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(argv, config)
|
14
|
+
@config = config
|
15
|
+
@parser = OptionParser.new(argv)
|
16
|
+
end
|
17
|
+
|
18
|
+
def create
|
19
|
+
configure_parser
|
20
|
+
|
21
|
+
@parser
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def configure_parser
|
27
|
+
program_name = @parser.program_name
|
28
|
+
|
29
|
+
@parser.banner = <<-EOF.gsub(/^[ ]+/, '')
|
30
|
+
\nUsage: #{program_name} [commands] [options]"
|
31
|
+
|
32
|
+
Commands:
|
33
|
+
|
34
|
+
#{program_name} last
|
35
|
+
#{program_name} punch -p '123456' -s '12/06/1992,13/06/1992,14/06/1992'
|
36
|
+
#{program_name} reset
|
37
|
+
EOF
|
38
|
+
|
39
|
+
set_options
|
40
|
+
set_utilities
|
41
|
+
end
|
42
|
+
|
43
|
+
def set_options
|
44
|
+
@parser.separator "\nOptions:"
|
45
|
+
set_attributes
|
46
|
+
set_skipped_dates
|
47
|
+
set_custom_defaults
|
48
|
+
end
|
49
|
+
|
50
|
+
def set_utilities
|
51
|
+
@parser.separator "\nUtilities:"
|
52
|
+
set_help_option
|
53
|
+
set_version_option
|
54
|
+
set_balboa_picture
|
55
|
+
end
|
56
|
+
|
57
|
+
def set_custom_defaults
|
58
|
+
@parser.on('-c', '--config \'FILE\'', 'Read configuration options from FILE') do |file|
|
59
|
+
@config.merge!(YAML.load_file(file)) if File.exist?(file)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def set_attributes
|
64
|
+
@parser.on('-e', '--email \'EMAIL\'') do |email|
|
65
|
+
@config.merge!('email' => email)
|
66
|
+
end.on('-p', '--password \'PASSWORD\'') do |password|
|
67
|
+
@config.merge!('password' => password)
|
68
|
+
end.on('-w', '--project \'PROJECT\'') do |project|
|
69
|
+
@config.merge!('project' => project)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def set_skipped_dates
|
74
|
+
@parser.on('-s', '--skip \'DATES\'', 'Skip input dates', Array) do |dates|
|
75
|
+
parse_dates(dates)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def parse_dates(dates)
|
80
|
+
@config.merge!('skips' => dates.map { |date| Date.parse(date) })
|
81
|
+
end
|
82
|
+
|
83
|
+
def set_help_option
|
84
|
+
@parser.on('-h', '--help', 'Show this message') do
|
85
|
+
$stdout.puts @parser
|
86
|
+
exit
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def set_version_option
|
91
|
+
@parser.on('-v', '--version', 'Show version') do
|
92
|
+
$stdout.puts "#{@parser.program_name} #{Balboa::VERSION}\n"
|
93
|
+
exit
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def set_balboa_picture
|
98
|
+
@parser.separator("\n" + [
|
99
|
+
"░░░░░▄▄███████████████▄▄░░░░",
|
100
|
+
"░░▄██████████████████████▄░░",
|
101
|
+
"░█████████▀███████▀████████░",
|
102
|
+
"█████████▀▀█▀█░░▀██▄██▄████░",
|
103
|
+
"░████████▄▄█░▀▀▄▄█░░▀░████░░",
|
104
|
+
"░███████▀░░░▄▄▄▄░░░▄▄▄███░░░",
|
105
|
+
"▀███████░░▄▀▀██▀░░█▄░▄▀███░░",
|
106
|
+
"░██████▀░░█░██▀▀░░████░██░░░",
|
107
|
+
"████████░▄░░▀▀░░░░▀▄░▀▀█░░░░",
|
108
|
+
"█▀██████▀░▄░░▄░░░░░░█░░█░░░░",
|
109
|
+
"▀▄████▄▀░░░▀▀░░▀░▄░░▀░░░█░░░",
|
110
|
+
"▄██████▀▄░░░░░░░░░██▄▄▄░█░░░",
|
111
|
+
"███████░█░░░░░░░░█▀▄▄▄█░░█░░",
|
112
|
+
"░██████░░█░░░░░░░░░▀░░░░░░▀▄",
|
113
|
+
"▀▄█████░░░▀▄░░░░░░░░░░░░░░░█",
|
114
|
+
"░░░███▀░░░░░░▀░░░░▄░░░░░░▄█░",
|
115
|
+
"░░░▄▀░░░░░░░░░▀▄░░░▀▀▀▀▀█▀░░",
|
116
|
+
"░▀░░░░░░░░░░░░░░░▀░░░░░░▀▄░░",
|
117
|
+
"░░░░░░░░░░░░░░░░░░░░░░░▄░█▀▄",
|
118
|
+
].join("\n"))
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
@@ -5,9 +5,13 @@ module Balboa
|
|
5
5
|
class CapybaraInteractor
|
6
6
|
|
7
7
|
CommandNotFound = Class.new(RuntimeError)
|
8
|
-
LoginCommandNotFound = Class.new(CommandNotFound)
|
9
8
|
|
10
|
-
|
9
|
+
LoginCommandNotFound = Class.new(RuntimeError)
|
10
|
+
|
11
|
+
attr_reader :options
|
12
|
+
|
13
|
+
def initialize(options={})
|
14
|
+
@options = options
|
11
15
|
@commands = Hash.new { fail CommandNotFound }
|
12
16
|
@signed_in = false
|
13
17
|
end
|
@@ -18,13 +22,11 @@ module Balboa
|
|
18
22
|
|
19
23
|
def last
|
20
24
|
login unless signed_in?
|
21
|
-
|
22
25
|
@commands['last'].execute
|
23
26
|
end
|
24
27
|
|
25
28
|
def punch(date)
|
26
29
|
login unless signed_in?
|
27
|
-
|
28
30
|
@commands['punch'].execute(date)
|
29
31
|
end
|
30
32
|
|
@@ -8,6 +8,11 @@ module Balboa
|
|
8
8
|
class FillPunchCommand
|
9
9
|
include Capybara::DSL
|
10
10
|
|
11
|
+
TIME_TEMPLATE = '%02d:00'.freeze
|
12
|
+
SUCCESS_MESSAGE = 'Punch foi criado com sucesso.'.freeze
|
13
|
+
|
14
|
+
PunchCreationError = Class.new(RuntimeError)
|
15
|
+
|
11
16
|
def initialize(options)
|
12
17
|
@options = options
|
13
18
|
end
|
@@ -30,25 +35,25 @@ module Balboa
|
|
30
35
|
|
31
36
|
def fill_first_shift(date)
|
32
37
|
fill_form(date, @options['start_at'], @options['lunch_at'])
|
33
|
-
|
34
|
-
confirm
|
35
38
|
end
|
36
39
|
|
37
40
|
def fill_second_shift(date)
|
38
41
|
fill_form(date, @options['restart_at'], @options['leave_at'])
|
39
|
-
|
40
|
-
confirm
|
41
42
|
end
|
42
43
|
|
43
44
|
def fill_form(date, start_time, finish_time)
|
44
|
-
fill_in 'punch[from_time]', with: start_time
|
45
|
-
fill_in 'punch[to_time]', with: finish_time
|
45
|
+
fill_in 'punch[from_time]', with: TIME_TEMPLATE % start_time
|
46
|
+
fill_in 'punch[to_time]', with: TIME_TEMPLATE % finish_time
|
46
47
|
fill_in 'punch[when_day]', with: date.to_s
|
47
48
|
select @options['project'], from: 'punch[project_id]'
|
49
|
+
|
50
|
+
confirm
|
48
51
|
end
|
49
52
|
|
50
53
|
def confirm
|
51
54
|
click_button 'Criar Punch'
|
55
|
+
|
56
|
+
fail PunchCreationError unless body[SUCCESS_MESSAGE]
|
52
57
|
end
|
53
58
|
end
|
54
59
|
end
|
@@ -8,7 +8,7 @@ module Balboa
|
|
8
8
|
class LoginCommand
|
9
9
|
include Capybara::DSL
|
10
10
|
|
11
|
-
|
11
|
+
SUCCESS_MESSAGE = 'Login efetuado com sucesso!'.freeze
|
12
12
|
|
13
13
|
LoginFailure = Class.new(RuntimeError)
|
14
14
|
|
@@ -37,9 +37,8 @@ module Balboa
|
|
37
37
|
|
38
38
|
def confirm
|
39
39
|
click_button 'Sign in'
|
40
|
-
|
41
|
-
|
42
|
-
raise LoginFailure
|
40
|
+
|
41
|
+
fail LoginFailure unless body[SUCCESS_MESSAGE]
|
43
42
|
end
|
44
43
|
end
|
45
44
|
end
|
@@ -12,9 +12,9 @@ module Balboa
|
|
12
12
|
new(*args).create
|
13
13
|
end
|
14
14
|
|
15
|
-
def initialize(
|
16
|
-
@interactor = interactor
|
15
|
+
def initialize(options)
|
17
16
|
@options = options
|
17
|
+
@interactor = Balboa::Interactor::CapybaraInteractor.new(options)
|
18
18
|
end
|
19
19
|
|
20
20
|
def create
|
data/lib/balboa/version.rb
CHANGED
data/lib/balboa.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative 'balboa/version'
|
4
|
+
require_relative 'balboa/config_file'
|
4
5
|
require_relative 'balboa/host'
|
5
6
|
|
6
7
|
require_relative 'balboa/interactor/capybara_interactor'
|
@@ -12,9 +13,10 @@ require_relative 'balboa/interactor/command/login_command'
|
|
12
13
|
|
13
14
|
require_relative 'balboa/cli/application'
|
14
15
|
require_relative 'balboa/cli/options'
|
16
|
+
require_relative 'balboa/cli/defaults'
|
15
17
|
require_relative 'balboa/cli/command/last_command'
|
16
18
|
require_relative 'balboa/cli/command/punch_command'
|
17
|
-
require_relative 'balboa/cli/command/
|
19
|
+
require_relative 'balboa/cli/command/reset_command'
|
18
20
|
require_relative 'balboa/cli/command/star_wars_command'
|
19
21
|
|
20
22
|
require 'phantomjs'
|
@@ -28,8 +28,8 @@ describe Balboa::Interactor::CapybaraInteractor do
|
|
28
28
|
it 'responds to last but raises if no command provided' do
|
29
29
|
interactor = described_class.new
|
30
30
|
|
31
|
-
last = double('cmd', execute:
|
32
|
-
login = double('login', execute:
|
31
|
+
last = double('cmd', execute: nil)
|
32
|
+
login = double('login', execute: nil)
|
33
33
|
|
34
34
|
interactor.add_command('login', login)
|
35
35
|
|
@@ -39,6 +39,12 @@ describe Balboa::Interactor::CapybaraInteractor do
|
|
39
39
|
}.to raise_error error
|
40
40
|
end
|
41
41
|
|
42
|
+
it 'holds the options so commands can use it' do
|
43
|
+
interactor = described_class.new(a: 1, b: 2)
|
44
|
+
|
45
|
+
expect(interactor.options).to eq(a: 1, b: 2)
|
46
|
+
end
|
47
|
+
|
42
48
|
it 'responds to punch but raises if no command provided' do
|
43
49
|
interactor = described_class.new
|
44
50
|
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Balboa::Interactor::InteractorWrapper do
|
6
|
+
it 'forwards punch call to its dependency' do
|
7
|
+
today = Date.today
|
8
|
+
|
9
|
+
interactor = double
|
10
|
+
allow(interactor).to receive(:punch).with(today)
|
11
|
+
|
12
|
+
described_class.new(interactor).punch(today)
|
13
|
+
|
14
|
+
expect(interactor).to have_received(:punch).with(today).once
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'forwards last call to its dependency' do
|
18
|
+
interactor = double
|
19
|
+
allow(interactor).to receive(:last)
|
20
|
+
|
21
|
+
described_class.new(interactor).last
|
22
|
+
|
23
|
+
expect(interactor).to have_received(:last).once
|
24
|
+
end
|
25
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: balboa
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Waldyr de Souza
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-07-
|
11
|
+
date: 2016-07-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: capybara
|
@@ -38,6 +38,34 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 2.1.1.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: highline
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.7.8
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.7.8
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: holidays
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 4.6.0
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 4.6.0
|
41
69
|
description: Make Balboa do the punches for you
|
42
70
|
email:
|
43
71
|
- waldyr.ar@gmail.com
|
@@ -66,8 +94,12 @@ files:
|
|
66
94
|
- lib/balboa/cli/command/help_command.rb
|
67
95
|
- lib/balboa/cli/command/last_command.rb
|
68
96
|
- lib/balboa/cli/command/punch_command.rb
|
97
|
+
- lib/balboa/cli/command/reset_command.rb
|
69
98
|
- lib/balboa/cli/command/star_wars_command.rb
|
99
|
+
- lib/balboa/cli/defaults.rb
|
70
100
|
- lib/balboa/cli/options.rb
|
101
|
+
- lib/balboa/cli/parser_builder.rb
|
102
|
+
- lib/balboa/config_file.rb
|
71
103
|
- lib/balboa/host.rb
|
72
104
|
- lib/balboa/interactor/capybara_interactor.rb
|
73
105
|
- lib/balboa/interactor/command/fetch_last_punch_command.rb
|
@@ -76,8 +108,9 @@ files:
|
|
76
108
|
- lib/balboa/interactor/interactor_builder.rb
|
77
109
|
- lib/balboa/interactor/interactor_wrapper.rb
|
78
110
|
- lib/balboa/version.rb
|
111
|
+
- spec/balboa/capybara_interactor_spec.rb
|
79
112
|
- spec/balboa/cli/application_spec.rb
|
80
|
-
- spec/balboa/
|
113
|
+
- spec/balboa/interactor/interactor_wrapper_spec.rb
|
81
114
|
- spec/balboa_spec.rb
|
82
115
|
- spec/spec_helper.rb
|
83
116
|
homepage:
|