kobot 1.2.5 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f35251b3ce8549b6b268a9741ecc88398f4fca4e1fbe27c343e2a1c35d456ca0
4
- data.tar.gz: 1af276cc34607f075650b5be4df65c9666449c761b410fb5cc63629fe0392ff7
3
+ metadata.gz: '08261437cd35a8b09dfad79740f2f6ec52e87fea47713aba5e00133aa570ac08'
4
+ data.tar.gz: a7941208f88d46d40fb8d5366851f5b466bb85e975b3d5ff95e7753bf9f8032c
5
5
  SHA512:
6
- metadata.gz: a1a76b64eb1aa1019a12b4f1d4a2d34c84d79cf020b0ebc7cee7c1bd4902b180aec70790ee236883100bfd2501bbee9846f61b5b40dd8fb3996159e58b94b0df
7
- data.tar.gz: a81c35396d3dde1a74ab9aad3c3535e92699268f49a133f9f43514b192bae808a84f1974c9f9c537690ce3561c942251c044591fc363b54c619b44586ede7670
6
+ metadata.gz: f14ebacda3eaec90ae6f6e9f995821d3116599e2fdff2e19afcd546c43404f6453055d256828f4f549e07d5f3e08ac0ba4cbc1c6ee0e4b3739a02277b0285258
7
+ data.tar.gz: d42d8f45187cc512eb08b13d5c891cd7b0bf567a76bf55b49ffc089c240946f0345208b7586fecbd2a32c8e3f3855f22086913bed5c79152e3248e5db0692d75
data/CHANGELOG.md CHANGED
@@ -28,3 +28,8 @@
28
28
 
29
29
  ### v1.2.5
30
30
  - Added I18n support for both English and Japanese KOT UI
31
+
32
+ ### v1.3.0
33
+ - Added config option (-a, --auto-skip-without) to enable automatic skipping based on schedule
34
+ - Replaced deprecated options with capabilities option in Selenium driver initialization
35
+ - Refactored scattered attr_accessors and reduced instance variables count reported by Rubocop
data/README.md CHANGED
@@ -62,6 +62,9 @@ Usage: kobot [options]
62
62
  -s, --skip [D1,D2,D3] Specify dates to skip clock in/out with date format YYYY-MM-DD and
63
63
  multiple values separated by comma, such as: 2020-05-01,2020-12-31;
64
64
  weekends and public holidays in Japan will be skipped by default
65
+ -a [SCHEDULE], Enable automatic skipping by reading schedule from the Time Card page;
66
+ --auto-skip-without skip today if the provided text is not contained in the schedule column
67
+ on the Time Card page; by default 裁量労働 is used
65
68
  -t, --to [TO] Email address to send notification to; by default it is sent to
66
69
  the same self email account used in SMTP config as the sender
67
70
  -n, --notify Enable email notification
data/lib/kobot/config.rb CHANGED
@@ -8,24 +8,21 @@ module Kobot
8
8
  attr_accessor :clock,
9
9
  :loglevel,
10
10
  :skip,
11
+ :auto_skip_without,
11
12
  :dryrun,
12
- :force
13
-
14
- attr_accessor :kot_url,
13
+ :force,
14
+ :kot_url,
15
15
  :kot_timezone_offset,
16
- :kot_date_format
17
-
18
- attr_accessor :gmail_notify_enabled,
16
+ :kot_date_format,
17
+ :gmail_notify_enabled,
19
18
  :gmail_notify_subject,
20
19
  :gmail_notify_to,
21
20
  :gmail_smtp_address,
22
- :gmail_smtp_port
23
-
24
- attr_accessor :browser_headless,
21
+ :gmail_smtp_port,
22
+ :browser_headless,
25
23
  :browser_geolocation,
26
- :browser_wait_timeout
27
-
28
- attr_accessor :credentials_file
24
+ :browser_wait_timeout,
25
+ :credentials_file
29
26
 
30
27
  def configure
31
28
  yield self
data/lib/kobot/engine.rb CHANGED
@@ -81,7 +81,10 @@ module Kobot
81
81
  }
82
82
  options = Selenium::WebDriver::Chrome::Options.new(prefs: prefs)
83
83
  options.headless! if Config.browser_headless
84
- @browser = Selenium::WebDriver.for(:chrome, options: options)
84
+ caps = [
85
+ options
86
+ ]
87
+ @browser = Selenium::WebDriver.for(:chrome, capabilities: caps)
85
88
  @wait = Selenium::WebDriver::Wait.new(timeout: Config.browser_wait_timeout)
86
89
  Kobot.logger.info('Launch browser successful')
87
90
  end
@@ -151,22 +154,24 @@ module Kobot
151
154
  next unless date_cell.text.include? @today
152
155
 
153
156
  Kobot.logger.info('Reading today record')
154
- @kot_today = date_cell.text
155
- @kot_today_css_class = date_cell.attribute('class')
156
- @kot_today_type = tr.find_element(css: 'td.work_day_type').text
157
- @kot_today_clock_in = tr.find_element(
157
+ @kot_data = {}
158
+ @kot_data[:today] = date_cell.text
159
+ @kot_data[:today_css_class] = date_cell.attribute('class')
160
+ @kot_data[:today_type] = tr.find_element(css: 'td.work_day_type').text
161
+ @kot_data[:today_schedule] = tr.find_element(css: 'td.schedule').text
162
+ @kot_data[:today_clock_in] = tr.find_element(
158
163
  css: 'td.start_end_timerecord[data-ht-sort-index="START_TIMERECORD"]'
159
164
  ).text
160
- @kot_today_clock_out = tr.find_element(
165
+ @kot_data[:today_clock_out] = tr.find_element(
161
166
  css: 'td.start_end_timerecord[data-ht-sort-index="END_TIMERECORD"]'
162
167
  ).text
163
168
  Kobot.logger.debug do
164
169
  {
165
- kot_toay: @kot_today,
166
- kot_today_css_class: @kot_today_css_class,
167
- kot_today_type: @kot_today_type,
168
- kot_today_clock_in: @kot_today_clock_in,
169
- kot_today_clock_out: @kot_today_clock_out
170
+ kot_toay: @kot_data[:today],
171
+ kot_today_css_class: @kot_data[:today_css_class],
172
+ kot_today_type: @kot_data[:today_type],
173
+ kot_today_clock_in: @kot_data[:today_clock_in],
174
+ kot_today_clock_out: @kot_data[:today_clock_out]
170
175
  }
171
176
  end
172
177
  break
@@ -174,60 +179,69 @@ module Kobot
174
179
  end
175
180
 
176
181
  def validate_today_record!
177
- raise KotRecordError, "Today=#{@today} is not found on kot" if @kot_today.strip.empty?
182
+ raise KotRecordError, "Today=#{@today} is not found on kot" if @kot_data[:today].strip.empty?
178
183
 
179
184
  if kot_weekend?
180
- raise KotRecordError, "Today=#{@today} is marked as weekend on kot: #{@kot_today}" unless Config.force
185
+ raise KotRecordError, "Today=#{@today} is marked as weekend: #{@kot_data[:today]}" unless Config.force
186
+
187
+ Kobot.logger.info(
188
+ "[Force] should have exited: today=#{@today} is marked as weekend: #{@kot_data[:today]}"
189
+ )
190
+ end
191
+
192
+ if kot_public_holiday?
193
+ raise KotRecordError, "Today=#{@today} is marked as public holiday: #{@kot_data[:today]}" unless Config.force
181
194
 
182
195
  Kobot.logger.info(
183
- "[Force] should have exited: today=#{@today} is marked as weekend on kot: #{@kot_today}"
196
+ "[Force] should have exited: today=#{@today} is marked as public holiday: #{@kot_data[:today]}"
184
197
  )
185
198
  end
186
199
 
187
- return unless kot_public_holiday?
188
- raise KotRecordError, "Today=#{@today} is marked as public holiday on kot: #{@kot_today}" unless Config.force
200
+ if kot_non_work_schedule?
201
+ raise KotRecordError, "Today=#{@today} is non-work schedule: #{@kot_data[:today_schedule]}" unless Config.force
189
202
 
190
- Kobot.logger.info(
191
- "[Force] should have exited: today=#{@today} is marked as public holiday on kot: #{@kot_today}"
192
- )
203
+ Kobot.logger.info(
204
+ "[Force] should have exited: today=#{@today} is non-work schedule: #{@kot_data[:today_schedule]}"
205
+ )
206
+ end
193
207
  end
194
208
 
195
209
  def clock_in!
196
210
  Kobot.logger.warn("Clock in during the afternoon: #{@now}") if @now.hour > 12
197
- if @kot_today_clock_in.strip.empty?
211
+ if @kot_data[:today_clock_in].strip.empty?
198
212
  click_clock_in_button
199
213
  return if Config.dryrun
200
214
 
201
215
  read_today_record
202
- raise KotClockInError, 'Clock in operation seems to have failed' if @kot_today_clock_in.strip.empty?
216
+ raise KotClockInError, 'Clock in operation seems to have failed' if @kot_data[:today_clock_in].strip.empty?
203
217
 
204
- Kobot.logger.info("Clock in successful: #{@kot_today_clock_in}")
218
+ Kobot.logger.info("Clock in successful: #{@kot_data[:today_clock_in]}")
205
219
  Mailer.send(clock_notify_message(clock: :in))
206
220
  else
207
- Kobot.logger.warn("Clock in done already: #{@kot_today_clock_in}")
221
+ Kobot.logger.warn("Clock in done already: #{@kot_data[:today_clock_in]}")
208
222
  end
209
223
  end
210
224
 
211
225
  def clock_out!
212
226
  Kobot.logger.warn("Clock out during the morning: #{@now}") if @now.hour <= 12
213
227
  unless Config.dryrun
214
- if @kot_today_clock_in.strip.empty?
228
+ if @kot_data[:today_clock_in].strip.empty?
215
229
  raise KotClockOutError,
216
- "!!!No clock in record for today=#{@kot_today}!!!"
230
+ "!!!No clock in record for today=#{@kot_data[:today]}!!!"
217
231
  end
218
232
  end
219
233
 
220
- if @kot_today_clock_out.strip.empty?
234
+ if @kot_data[:today_clock_out].strip.empty?
221
235
  click_clock_out_button
222
236
  return if Config.dryrun
223
237
 
224
238
  read_today_record
225
- raise KotClockOutError, 'Clock out operation seems to have failed' if @kot_today_clock_out.strip.empty?
239
+ raise KotClockOutError, 'Clock out operation seems to have failed' if @kot_data[:today_clock_out].strip.empty?
226
240
 
227
- Kobot.logger.info("Clock out successful: #{@kot_today_clock_out}")
241
+ Kobot.logger.info("Clock out successful: #{@kot_data[:today_clock_out]}")
228
242
  Mailer.send(clock_notify_message(clock: :out))
229
243
  else
230
- Kobot.logger.warn("Clock out done already: #{@kot_today_clock_out}")
244
+ Kobot.logger.warn("Clock out done already: #{@kot_data[:today_clock_out]}")
231
245
  end
232
246
  end
233
247
 
@@ -270,18 +284,22 @@ module Kobot
270
284
  [
271
285
  @selector.kot_date_saturday,
272
286
  @selector.kot_date_sunday
273
- ].any? { |weekend| @kot_today&.include? weekend }
287
+ ].any? { |weekend| @kot_data[:today]&.include? weekend }
288
+ end
289
+
290
+ def kot_non_work_schedule?
291
+ !@kot_data[:today_schedule]&.include?(Config.auto_skip_without)
274
292
  end
275
293
 
276
294
  def kot_public_holiday?
277
- return true if @kot_today_type&.include? @selector.kot_workday_time_off_text
295
+ return true if @kot_data[:today_type]&.include? @selector.kot_workday_time_off_text
278
296
 
279
297
  kot_today_highlighted = %w[sunday saturday].any? do |css|
280
- @kot_today_css_class&.include? css
298
+ @kot_data[:today_css_class]&.include? css
281
299
  end
282
300
  if kot_today_highlighted
283
301
  Kobot.logger.warn(
284
- "Today=#{@kot_today} is highlighted (holiday) but not marked as #{@selector.kot_workday_time_off_text}"
302
+ "Today=#{@kot_data[:today]} is highlighted (holiday) but not marked as #{@selector.kot_workday_time_off_text}"
285
303
  )
286
304
  end
287
305
  kot_today_highlighted
@@ -293,8 +311,8 @@ module Kobot
293
311
  "<b>Date:</b> #{@today}",
294
312
  "<b>Status:</b> <span style='color:#{color}'>#{status}</span>"
295
313
  ]
296
- message << "<b>Clock_in:</b> #{@kot_today_clock_in}" if clock
297
- message << "<b>Clock_out:</b> #{@kot_today_clock_out}" if clock == :out
314
+ message << "<b>Clock_in:</b> #{@kot_data[:today_clock_in]}" if clock
315
+ message << "<b>Clock_out:</b> #{@kot_data[:today_clock_out]}" if clock == :out
298
316
  message.join('<br>')
299
317
  end
300
318
  end
data/lib/kobot/option.rb CHANGED
@@ -27,6 +27,13 @@ module Kobot
27
27
  options[:skip] = skip
28
28
  end
29
29
 
30
+ opt.on('-a', '--auto-skip-without [SCHEDULE]',
31
+ 'Enable automatic skipping by reading schedule from the Time Card page;',
32
+ 'skip today if the provided text is not contained in the schedule column',
33
+ 'on the Time Card page; by default 裁量労働 is used') do |schedule|
34
+ options[:auto_skip_without] = schedule
35
+ end
36
+
30
37
  opt.on('-t', '--to [TO]',
31
38
  'Email address to send notification to; by default it is sent to',
32
39
  'the same self email account used in SMTP config as the sender') do |to|
data/lib/kobot/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Kobot
4
- VERSION = '1.2.5'
4
+ VERSION = '1.3.0'
5
5
  end
data/lib/kobot.rb CHANGED
@@ -34,6 +34,7 @@ module Kobot
34
34
  config.dryrun = options[:dryrun]
35
35
  config.force = options[:force]
36
36
  config.skip = options[:skip] || []
37
+ config.auto_skip_without = options[:auto_skip_without] || '裁量労働'
37
38
 
38
39
  config.kot_url = 'https://s2.kingtime.jp/independent/recorder/personal/'
39
40
  config.kot_timezone_offset = '+09:00'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kobot
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.5
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Jiang
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-12-07 00:00:00.000000000 Z
11
+ date: 2021-12-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: webdrivers