terminal_cal 0.1.0 → 0.2.0
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/Gemfile.lock +2 -4
- data/exe/terminal_cal +7 -1
- data/lib/terminal_cal.rb +8 -5
- data/lib/terminal_cal/app.rb +14 -41
- data/lib/terminal_cal/calendar.rb +84 -0
- data/lib/terminal_cal/calendar_parser_factory.rb +11 -0
- data/lib/terminal_cal/calendar_parsers/.gitignore +0 -0
- data/lib/terminal_cal/calendar_parsers/ics_parser_wrapper.rb +9 -0
- data/lib/terminal_cal/config.rb +31 -10
- data/lib/terminal_cal/errors/error.rb +10 -0
- data/lib/terminal_cal/version.rb +1 -1
- data/terminal_cal.gemspec +1 -2
- data/vendor/cache/ics_parser-0.0.4.gem +0 -0
- metadata +10 -20
- data/vendor/cache/colorize-0.8.1.gem +0 -0
- data/vendor/cache/ics_parser-0.0.3.gem +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8b996754b80b621e130fc3a1cd0343cb8419cad4
|
4
|
+
data.tar.gz: 7dd79f18bd5a94eee395222cc8721e1d7ebf58e8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ae22ceeae07527bfcfc507e3a9cdf90a62d3546ec319f6a4ecef211b479f196da50226e81673332a52ca77153dc8b10c347ff8fb891d67c4152254facb6dbd49
|
7
|
+
data.tar.gz: b9c38212b45de33e30c88e44d7b899cb8fbc51bce44863a3d8e0e8518d24e782ad4ef0e675fe2e2fe8325730712c62c0b0778a755eff9e1f4c3d99e21876d4b3
|
data/Gemfile.lock
CHANGED
@@ -2,16 +2,14 @@ PATH
|
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
4
|
terminal_cal (0.1.0)
|
5
|
-
|
6
|
-
ics_parser (~> 0.0.3)
|
5
|
+
ics_parser (~> 0.0.4)
|
7
6
|
table_print (~> 1.5)
|
8
7
|
|
9
8
|
GEM
|
10
9
|
remote: https://rubygems.org/
|
11
10
|
specs:
|
12
11
|
coderay (1.1.2)
|
13
|
-
|
14
|
-
ics_parser (0.0.3)
|
12
|
+
ics_parser (0.0.4)
|
15
13
|
method_source (0.9.2)
|
16
14
|
minitest (5.11.3)
|
17
15
|
pry (0.12.2)
|
data/exe/terminal_cal
CHANGED
data/lib/terminal_cal.rb
CHANGED
@@ -1,12 +1,15 @@
|
|
1
|
+
require 'fileutils'
|
1
2
|
require 'ics_parser'
|
2
3
|
require 'open-uri'
|
3
4
|
require 'table_print'
|
4
|
-
require 'fileutils'
|
5
|
-
require 'yaml'
|
6
5
|
require 'tempfile'
|
7
|
-
require '
|
6
|
+
require 'yaml'
|
8
7
|
|
9
|
-
require 'terminal_cal/
|
8
|
+
require 'terminal_cal/app'
|
9
|
+
require 'terminal_cal/calendar'
|
10
|
+
require 'terminal_cal/calendar_parsers/ics_parser_wrapper'
|
11
|
+
require 'terminal_cal/calendar_parser_factory'
|
10
12
|
require 'terminal_cal/config'
|
13
|
+
require 'terminal_cal/errors/error'
|
11
14
|
require 'terminal_cal/event'
|
12
|
-
require 'terminal_cal/
|
15
|
+
require 'terminal_cal/version'
|
data/lib/terminal_cal/app.rb
CHANGED
@@ -1,13 +1,10 @@
|
|
1
1
|
module TerminalCal
|
2
2
|
class App
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
@
|
8
|
-
@today = Time.now.strftime(DATE_FMT)
|
9
|
-
@events = []
|
10
|
-
@parser = IcsParser
|
3
|
+
def initialize(options = {})
|
4
|
+
@config = options[:config] || TerminalCal::Config.load
|
5
|
+
@now = Time.now
|
6
|
+
@calendars = []
|
7
|
+
@events = []
|
11
8
|
end
|
12
9
|
|
13
10
|
def self.run
|
@@ -15,57 +12,33 @@ module TerminalCal
|
|
15
12
|
end
|
16
13
|
|
17
14
|
def run
|
18
|
-
|
15
|
+
load_calendars
|
19
16
|
load_events
|
20
17
|
print_events
|
18
|
+
rescue => error
|
19
|
+
raise TerminalCal::Errors::Error, error
|
21
20
|
end
|
22
21
|
|
23
22
|
private
|
24
23
|
|
25
|
-
def
|
26
|
-
@
|
27
|
-
|
28
|
-
if @ics.to_s.empty?
|
29
|
-
puts "no ics path defined in #{Config::CONFIG_PATH}"
|
30
|
-
exit
|
24
|
+
def load_calendars
|
25
|
+
@calendars = @config[:calendars].to_a.map do |config|
|
26
|
+
TerminalCal::Calendar.new(config: config)
|
31
27
|
end
|
32
28
|
end
|
33
29
|
|
34
30
|
def load_events
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
events.sort_by { |e| e.starts_at.to_i }.each do |event|
|
39
|
-
next unless event.starts_at.strftime(DATE_FMT) == @today
|
40
|
-
|
41
|
-
if (event.starts_at..event.ends_at).include?(now)
|
42
|
-
active = "==="
|
43
|
-
end
|
44
|
-
|
45
|
-
|
46
|
-
@events << Event.new(date: event.starts_at.strftime(DATE_FMT),
|
47
|
-
start_time: event.starts_at.strftime(TIME_FMT),
|
48
|
-
end_time: "#{event.ends_at.strftime(TIME_FMT)} #{active}",
|
49
|
-
summary: event.summary)
|
50
|
-
# end
|
31
|
+
@events = @calendars.map do |calendar|
|
32
|
+
calendar.todays_events
|
51
33
|
end
|
52
34
|
end
|
53
35
|
|
54
36
|
def print_events
|
55
37
|
unless @events.empty?
|
56
|
-
tp @events
|
38
|
+
tp @events.flatten
|
57
39
|
else
|
58
40
|
puts "No events scheduled yet."
|
59
41
|
end
|
60
42
|
end
|
61
|
-
|
62
|
-
def read_cal_file
|
63
|
-
cal = Tempfile.new
|
64
|
-
cal.write(open(@ics) { |f| f.read } )
|
65
|
-
cal.rewind
|
66
|
-
cal.read
|
67
|
-
ensure
|
68
|
-
cal.close
|
69
|
-
end
|
70
43
|
end
|
71
44
|
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module TerminalCal
|
2
|
+
class Calendar
|
3
|
+
DATE_FMT = '%m/%d'.freeze
|
4
|
+
TIME_FMT = '%I:%M %p'.freeze
|
5
|
+
|
6
|
+
attr_reader :source, :name, :cache_life_minutes
|
7
|
+
|
8
|
+
def initialize(options = {})
|
9
|
+
@config = options[:config]
|
10
|
+
@parser = TerminalCal::CalendarParserFactory.new(options[:parser]).parser
|
11
|
+
|
12
|
+
@source = @config[:source]
|
13
|
+
@name = @config[:name].to_s
|
14
|
+
@cache = @config[:cache] || true
|
15
|
+
@cache_life_minutes = @config[:cache_life_minutes] || 10
|
16
|
+
@now = Time.now
|
17
|
+
@today = @now.strftime(DATE_FMT)
|
18
|
+
|
19
|
+
@content = ''
|
20
|
+
end
|
21
|
+
|
22
|
+
def cache?
|
23
|
+
return false unless [true, false].include?(@cache)
|
24
|
+
@cache
|
25
|
+
end
|
26
|
+
|
27
|
+
def update_cache?
|
28
|
+
return false unless cache?
|
29
|
+
return true unless File.exist?(cache_path)
|
30
|
+
(Time.now - File.atime(cache_path)) > (@cache_life_minutes * 60)
|
31
|
+
end
|
32
|
+
|
33
|
+
def events
|
34
|
+
content =
|
35
|
+
if update_cache?
|
36
|
+
fetch_events_from_source
|
37
|
+
else
|
38
|
+
fetch_events_from_cache
|
39
|
+
end
|
40
|
+
|
41
|
+
@parser.events(content)
|
42
|
+
end
|
43
|
+
|
44
|
+
def fetch_events_from_source
|
45
|
+
source = @config[:source]
|
46
|
+
content = open(source) { |f| f.read }
|
47
|
+
|
48
|
+
if cache?
|
49
|
+
cache!(content)
|
50
|
+
end
|
51
|
+
|
52
|
+
content
|
53
|
+
rescue ::SocketError => error
|
54
|
+
raise TerminalCal::Errors::Error, error.message
|
55
|
+
end
|
56
|
+
|
57
|
+
def fetch_events_from_cache
|
58
|
+
File.read(cache_path)
|
59
|
+
end
|
60
|
+
|
61
|
+
def cache_path
|
62
|
+
filename = "#{@config[:name]}-cached-.ics".downcase
|
63
|
+
File.join(TerminalCal::Config::APP_DIR, filename)
|
64
|
+
end
|
65
|
+
|
66
|
+
def cache!(content)
|
67
|
+
File.open(cache_path, 'w+') do |file|
|
68
|
+
file.write(content)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def todays_events
|
73
|
+
events.sort_by { |e| e.starts_at.to_i }.map do |event|
|
74
|
+
next unless event.starts_at.strftime(DATE_FMT) == @today
|
75
|
+
next if event.ends_at < @now
|
76
|
+
|
77
|
+
Event.new(date: event.starts_at.strftime(DATE_FMT),
|
78
|
+
start_time: event.starts_at.strftime(TIME_FMT),
|
79
|
+
end_time: event.ends_at.strftime(TIME_FMT),
|
80
|
+
summary: event.summary)
|
81
|
+
end.compact
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
File without changes
|
data/lib/terminal_cal/config.rb
CHANGED
@@ -1,22 +1,28 @@
|
|
1
1
|
module TerminalCal
|
2
2
|
class Config
|
3
|
-
|
3
|
+
APP_DIR = File.join(Dir.home, '.terminal_cal')
|
4
4
|
CONFIG_FILE = 'config.yaml'.freeze
|
5
|
-
CONFIG_PATH = File.join(
|
5
|
+
CONFIG_PATH = File.join(APP_DIR, CONFIG_FILE)
|
6
6
|
|
7
7
|
def self.load
|
8
8
|
unless File.exist?(CONFIG_PATH)
|
9
|
-
FileUtils.mkdir_p(
|
9
|
+
FileUtils.mkdir_p(APP_DIR)
|
10
|
+
File.write(CONFIG_PATH, config_template)
|
10
11
|
FileUtils.touch(CONFIG_PATH)
|
11
|
-
end
|
12
12
|
|
13
|
-
|
13
|
+
msg = <<~MSG
|
14
|
+
New config generated at #{CONFIG_PATH}
|
15
|
+
Please update config and then try again.
|
16
|
+
MSG
|
14
17
|
|
15
|
-
|
16
|
-
self.write(:ics, '')
|
18
|
+
raise TerminalCal::Errors::AppExit, msg
|
17
19
|
end
|
18
20
|
|
19
|
-
|
21
|
+
self.read
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.read
|
25
|
+
YAML.load_file(CONFIG_PATH) || {}
|
20
26
|
end
|
21
27
|
|
22
28
|
def self.write(key, value)
|
@@ -25,8 +31,23 @@ module TerminalCal
|
|
25
31
|
File.write(CONFIG_PATH, config.to_yaml)
|
26
32
|
end
|
27
33
|
|
28
|
-
def self.
|
29
|
-
|
34
|
+
def self.calendars
|
35
|
+
read[:calendars] || []
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.clobber
|
39
|
+
File.delete(CONFIG_PATH)
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.config_template
|
43
|
+
{ calendars: [
|
44
|
+
{ name: 'Some Calendar',
|
45
|
+
source: 'Some URL or file path',
|
46
|
+
cache: true,
|
47
|
+
cache_life_minutes: 30
|
48
|
+
}
|
49
|
+
]
|
50
|
+
}.to_yaml
|
30
51
|
end
|
31
52
|
end
|
32
53
|
end
|
data/lib/terminal_cal/version.rb
CHANGED
data/terminal_cal.gemspec
CHANGED
@@ -36,9 +36,8 @@ Gem::Specification.new do |spec|
|
|
36
36
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
37
37
|
spec.require_paths = ["lib"]
|
38
38
|
|
39
|
-
spec.add_dependency "ics_parser", "~> 0.0.
|
39
|
+
spec.add_dependency "ics_parser", "~> 0.0.4"
|
40
40
|
spec.add_dependency "table_print", "~> 1.5"
|
41
|
-
spec.add_dependency "colorize", "~> 0.8.1"
|
42
41
|
|
43
42
|
spec.add_development_dependency "pry", "~> 0.12.2"
|
44
43
|
spec.add_development_dependency "bundler", "~> 2.0"
|
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: terminal_cal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Roerig
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-08-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ics_parser
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.0.
|
19
|
+
version: 0.0.4
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.0.
|
26
|
+
version: 0.0.4
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: table_print
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,20 +38,6 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1.5'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: colorize
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: 0.8.1
|
48
|
-
type: :runtime
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: 0.8.1
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
42
|
name: pry
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -129,13 +115,17 @@ files:
|
|
129
115
|
- exe/terminal_cal
|
130
116
|
- lib/terminal_cal.rb
|
131
117
|
- lib/terminal_cal/app.rb
|
118
|
+
- lib/terminal_cal/calendar.rb
|
119
|
+
- lib/terminal_cal/calendar_parser_factory.rb
|
120
|
+
- lib/terminal_cal/calendar_parsers/.gitignore
|
121
|
+
- lib/terminal_cal/calendar_parsers/ics_parser_wrapper.rb
|
132
122
|
- lib/terminal_cal/config.rb
|
123
|
+
- lib/terminal_cal/errors/error.rb
|
133
124
|
- lib/terminal_cal/event.rb
|
134
125
|
- lib/terminal_cal/version.rb
|
135
126
|
- terminal_cal.gemspec
|
136
127
|
- vendor/cache/coderay-1.1.2.gem
|
137
|
-
- vendor/cache/
|
138
|
-
- vendor/cache/ics_parser-0.0.3.gem
|
128
|
+
- vendor/cache/ics_parser-0.0.4.gem
|
139
129
|
- vendor/cache/method_source-0.9.2.gem
|
140
130
|
- vendor/cache/minitest-5.11.3.gem
|
141
131
|
- vendor/cache/pry-0.12.2.gem
|
Binary file
|
Binary file
|