schedule-cli 0.1.0 → 0.1.1

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: 42782ff951ba926c55abecb022b485b9714a73a10b88d8edaf76fbc756cde429
4
- data.tar.gz: b8e2f32fca289565b1852c6575da834936e24ce0be208610f5a504f19cb607ba
3
+ metadata.gz: 27845260a0b3a6e6dd6b06a498c510b452ae0a69b0b14ef524e0c94c9abea2d6
4
+ data.tar.gz: a87f684a45f6621007e489fa6d51653bc5a1a28f22fc2dc437c0261b63832746
5
5
  SHA512:
6
- metadata.gz: da46ba9b924e8315b27a49d896dc744f3237e4c7389cecbbbfdb97116a84235f61e2c944f99c9df5cb4d5459a215829f2ed4b0f1933cd3169cefe9d0b2b95cbb
7
- data.tar.gz: ef0a550eb9c6805ddc53cbfd874b7993d80f29c25fa1cba91cc6b7c71f2d465f29c108543efa04e40d53a895c0ae3f186f6e8dff8760ab43351050766ffb4589
6
+ metadata.gz: '08667553ba38fde90bce29ea3609ebf2aece59680e18f3c4b1fd7b2af7b305c0baac5e89042b139b5740dc328e4eeb4d9d3070e15416231d2a40071ab54fd86c'
7
+ data.tar.gz: ecf30cfa524aee407cd0898e5b84f4339e2d10a356ac6eacffaa92e8b5af88159f8c45ca574fed0290413dc070f71b229af641b7472f6b9d5c1aec62451426cd
data/Gemfile.lock CHANGED
@@ -1,12 +1,13 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- schedule-cli (0.1.0)
4
+ schedule-cli (0.1.1)
5
5
  activesupport (~> 5.2)
6
6
  chronic
7
7
  google-api-client (~> 0.11)
8
8
  launchy
9
9
  nokogiri
10
+ parallel
10
11
  thor
11
12
 
12
13
  GEM
@@ -57,6 +58,7 @@ GEM
57
58
  nokogiri (1.8.4)
58
59
  mini_portile2 (~> 2.3.0)
59
60
  os (1.0.0)
61
+ parallel (1.12.1)
60
62
  public_suffix (3.0.2)
61
63
  rake (10.5.0)
62
64
  representable (3.0.4)
@@ -4,12 +4,14 @@ require 'active_support/core_ext/numeric/time'
4
4
 
5
5
  module Schedule
6
6
  class AvailabilityRange
7
- def initialize(start, end_, day_start:, day_end:, granularity: 5.minutes)
7
+ def initialize(start, end_, day_start:, day_end:, min_delay:, granularity: 5.minutes)
8
8
  @start = start
9
9
  @granularity = granularity
10
10
  @slots = Array.new(n_slots(start, end_)) do |i|
11
11
  dt = slot_to_datetime(i)
12
- (dt.hour > day_start || (dt.hour == day_start && !dt.minute.zero?)) && (dt.hour < day_end || (dt.hour == day_end && dt.minute.zero?))
12
+ ((dt - DateTime.now).days >= min_delay.hours) &&
13
+ (dt.hour > day_start || (dt.hour == day_start && !dt.minute.zero?)) &&
14
+ (dt.hour < day_end || (dt.hour == day_end && dt.minute.zero?))
13
15
  end
14
16
  end
15
17
 
@@ -4,6 +4,7 @@ require 'active_support/core_ext/date'
4
4
  require 'active_support/core_ext/numeric/time'
5
5
 
6
6
  require 'launchy'
7
+ require 'parallel'
7
8
 
8
9
  require 'google/apis/calendar_v3'
9
10
  require 'googleauth'
@@ -33,6 +34,7 @@ module Schedule
33
34
  range = AvailabilityRange.new(
34
35
  start.beginning_of_day,
35
36
  end_.end_of_day,
37
+ min_delay: @options[:min_delay],
36
38
  day_start: @options[:day][:start],
37
39
  day_end: @options[:day][:end],
38
40
  )
@@ -69,7 +71,6 @@ module Schedule
69
71
  end: Google::Apis::CalendarV3::EventDateTime.new(date: back_current.to_s),
70
72
  )
71
73
  else
72
- events.concat get_events_for_date(back_current)
73
74
  buffer_back += 1
74
75
  end
75
76
  end
@@ -84,23 +85,24 @@ module Schedule
84
85
  end: Google::Apis::CalendarV3::EventDateTime.new(date: forward_current.to_s),
85
86
  )
86
87
  else
87
- events.concat get_events_for_date(forward_current)
88
88
  buffer_forward += 1
89
89
  end
90
90
  end
91
91
 
92
+ events.concat get_events_for_dates(back_current, forward_current)
93
+
92
94
  [[back_current, forward_current], events.uniq]
93
95
  end
94
96
 
95
- def get_events_for_date(date)
96
- @options[:calendars].flat_map do |calendar|
97
+ def get_events_for_dates(from, to)
98
+ Parallel.map(@options[:calendars], in_threads: @options[:calendars].length) do |calendar|
97
99
  @service.list_events(
98
100
  calendar,
99
101
  single_events: true,
100
- time_min: date.beginning_of_day.iso8601,
101
- time_max: date.end_of_day.iso8601,
102
+ time_min: from.beginning_of_day.iso8601,
103
+ time_max: to.end_of_day.iso8601,
102
104
  ).items
103
- end
105
+ end.flatten
104
106
  end
105
107
 
106
108
  def authorize!
data/lib/schedule/cli.rb CHANGED
@@ -21,7 +21,7 @@ module Schedule
21
21
  method_option :debug, type: :boolean, default: false
22
22
  def availability(type = nil, *offset_string)
23
23
  config = Config.values.slice(:calendars, :day).merge(Config.value(:defaults))
24
- if /\A\d+\z/.match(type)
24
+ if /\A\d+\z/.match?(type)
25
25
  config[:duration] = type.to_i
26
26
  else
27
27
  config.merge!(Config.value(:events, type&.to_sym) || {})
@@ -31,9 +31,9 @@ module Schedule
31
31
  elsif config[:day_offset].is_a?(String)
32
32
  config[:day_offset] = parse_offset config[:day_offset]
33
33
  end
34
- puts "#{config}" if options.debug?
34
+ puts config.to_s if options.debug?
35
35
  slots = Schedule::Calendar.new(config).free_slots
36
- print_with_options format_free_slots(slots)
36
+ print_with_options "#{format_free_slots(slots)}<br/>#{Config.value(:footer)}"
37
37
  end
38
38
 
39
39
  desc 'config', 'open config file in default editor'
@@ -59,6 +59,7 @@ module Schedule
59
59
  end
60
60
 
61
61
  def format_free_slots(slots)
62
+ return "<b style='color: red;'>No free slots!</b>" unless slots.present?
62
63
  dates = Hash.new { |h, k| h[k] = [] }
63
64
  slots.each do |(s, e)|
64
65
  dates[s.to_date] << "#{s.strftime('%-l:%M %p')} to #{e.strftime('%-l:%M %p')}"
@@ -13,15 +13,17 @@ module Schedule
13
13
  end: 18,
14
14
  },
15
15
  defaults: {
16
+ align_to: 15,
16
17
  day_offset: 'next weekday',
17
18
  day_buffer: 1,
18
19
  duration: 30,
19
- align_to: 15,
20
+ min_delay: 4,
20
21
  },
21
22
  events: {
22
23
  call: { duration: 30 },
23
24
  coffee: { duration: 60 },
24
25
  },
26
+ footer: nil,
25
27
  }.freeze
26
28
 
27
29
  def self.file(*args)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Schedule
4
- VERSION = '0.1.0'
4
+ VERSION = '0.1.1'
5
5
  end
data/schedule-cli.gemspec CHANGED
@@ -27,9 +27,10 @@ Gem::Specification.new do |spec|
27
27
  spec.add_development_dependency 'rake', '~> 10.0'
28
28
 
29
29
  spec.add_dependency 'activesupport', '~> 5.2'
30
+ spec.add_dependency 'chronic'
30
31
  spec.add_dependency 'google-api-client', '~> 0.11'
31
32
  spec.add_dependency 'launchy'
32
33
  spec.add_dependency 'nokogiri'
34
+ spec.add_dependency 'parallel'
33
35
  spec.add_dependency 'thor'
34
- spec.add_dependency 'chronic'
35
36
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: schedule-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yasyf Mohamedali
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-08-03 00:00:00.000000000 Z
11
+ date: 2018-08-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '5.2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: chronic
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: google-api-client
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -109,7 +123,7 @@ dependencies:
109
123
  - !ruby/object:Gem::Version
110
124
  version: '0'
111
125
  - !ruby/object:Gem::Dependency
112
- name: thor
126
+ name: parallel
113
127
  requirement: !ruby/object:Gem::Requirement
114
128
  requirements:
115
129
  - - ">="
@@ -123,7 +137,7 @@ dependencies:
123
137
  - !ruby/object:Gem::Version
124
138
  version: '0'
125
139
  - !ruby/object:Gem::Dependency
126
- name: chronic
140
+ name: thor
127
141
  requirement: !ruby/object:Gem::Requirement
128
142
  requirements:
129
143
  - - ">="