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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8cd5fb9cde3b246549f7a44e1a068559164eeddb
4
- data.tar.gz: 4b97366cce752dd4ac5d1b28ec9a621f47df2465
3
+ metadata.gz: 8b996754b80b621e130fc3a1cd0343cb8419cad4
4
+ data.tar.gz: 7dd79f18bd5a94eee395222cc8721e1d7ebf58e8
5
5
  SHA512:
6
- metadata.gz: 06241aa95470a2f2bff3f31d8fc46a837d78a64be3f27d074318df6b4b9ad6516b43d98bc2880103f51ad0695bf98f99e15a51b5a6fa68eaae413d675263b73d
7
- data.tar.gz: 0a9b669701c2ca9bc4b185eebc2eebbecc055d4853f84e273a6e6883fc0907e205ac1c184a21127f9439adf1252b304f8ad0870bbb9f09301c4f264032f9cf66
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
- colorize (~> 0.8.1)
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
- colorize (0.8.1)
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
@@ -2,4 +2,10 @@
2
2
 
3
3
  require "terminal_cal"
4
4
 
5
- TerminalCal::App.run
5
+ begin
6
+ TerminalCal::App.run
7
+ rescue TerminalCal::Errors::Error => error
8
+ puts error.message
9
+ rescue TerminalCal::Errors::AppExit
10
+ puts 'Bye'
11
+ end
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 'colorize'
6
+ require 'yaml'
8
7
 
9
- require 'terminal_cal/version'
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/app'
15
+ require 'terminal_cal/version'
@@ -1,13 +1,10 @@
1
1
  module TerminalCal
2
2
  class App
3
- DATE_FMT = '%m/%d'.freeze
4
- TIME_FMT = '%I:%M %p'.freeze
5
-
6
- def initialize
7
- @config = Config.load
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
- config_check
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 config_check
26
- @ics = @config[:ics]
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
- now = Time.now
36
- events = @parser.from_string(read_cal_file).events
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
@@ -0,0 +1,11 @@
1
+ module TerminalCal
2
+ class CalendarParserFactory
3
+ DEFAULT_PARSER = TerminalCal::CalendarParsers::IcsParserWrapper
4
+
5
+ attr_reader :parser
6
+
7
+ def initialize(parser)
8
+ @parser = parser || DEFAULT_PARSER
9
+ end
10
+ end
11
+ end
File without changes
@@ -0,0 +1,9 @@
1
+ module TerminalCal
2
+ module CalendarParsers
3
+ class IcsParserWrapper
4
+ def self.events(content)
5
+ IcsParser.from_string(content).events
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,22 +1,28 @@
1
1
  module TerminalCal
2
2
  class Config
3
- CONFIG_DIR = File.join(Dir.home, '.terminal_cal')
3
+ APP_DIR = File.join(Dir.home, '.terminal_cal')
4
4
  CONFIG_FILE = 'config.yaml'.freeze
5
- CONFIG_PATH = File.join(CONFIG_DIR, CONFIG_FILE)
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(CONFIG_DIR)
9
+ FileUtils.mkdir_p(APP_DIR)
10
+ File.write(CONFIG_PATH, config_template)
10
11
  FileUtils.touch(CONFIG_PATH)
11
- end
12
12
 
13
- config = self.read
13
+ msg = <<~MSG
14
+ New config generated at #{CONFIG_PATH}
15
+ Please update config and then try again.
16
+ MSG
14
17
 
15
- if config[:ics].to_s.empty?
16
- self.write(:ics, '')
18
+ raise TerminalCal::Errors::AppExit, msg
17
19
  end
18
20
 
19
- config
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.read
29
- YAML.load_file(CONFIG_PATH) || {}
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
@@ -0,0 +1,10 @@
1
+ module TerminalCal
2
+ # Namespace for TerminalCal errors
3
+ module Errors
4
+ # General gem errors
5
+ class Error < StandardError; end
6
+
7
+ # Graceful application quitting
8
+ class AppExit < StandardError; end
9
+ end
10
+ end
@@ -1,3 +1,3 @@
1
1
  module TerminalCal
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
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.3"
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.1.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-07-26 00:00:00.000000000 Z
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.3
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.3
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/colorize-0.8.1.gem
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