piece_of_wax 0.0.2 → 1.0.0.rc1

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
  SHA256:
3
- metadata.gz: 683908a54cb7a603677d40b86d375486d3c32f52a0d6630ceb24ac1c91a953eb
4
- data.tar.gz: 6eeb3aef9b284a8086a32ab70248b4ea53bfd9614e417293734fc2f49bd8ccc2
3
+ metadata.gz: 818b72b11bd06930c11e17c07e72512f9a4b1864dfb00090c681226414b720a3
4
+ data.tar.gz: f2423eb394952af0fadd964245b4637e5e2b58267933442459ea89dbe3203640
5
5
  SHA512:
6
- metadata.gz: 4da0542b0d656c49f6278fedfa449966a1a07d0fda7fc3c02d33679b3108605d614237c1ae7c524d498cfc6d3b50ca14439e52dad8a7175baf0bc37a20bf5f3a
7
- data.tar.gz: d610bdae2c2fa0125e1691ba3bc83d7f5051aa5a6455985ac69055d45996a4dcb46ee1a2410f9639c271049513ff91dd485d08a01addccf41f28f6eacf554fe0
6
+ metadata.gz: 105bd336b6d5d5ed58b53263fe05ed542f3b1dc35c2d346239f469d2935a9e73b2ad05249db8e984d28843b077b3a1850f5ab456825a43813b3673c48294bb51
7
+ data.tar.gz: 20b656e3e4fb4bb5a53e69ee010a0bcf87845479e437c267a549855cfca70be9a12393d5787c2d507fc66526d499e47599e36a5fc44f0d9e8fa7bb05446ad709
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require_relative '../lib/piece_of_wax'
4
- PieceOfWax.start(ARGV)
3
+ require 'piece_of_wax'
4
+ PieceOfWax::CLI.start(ARGV)
@@ -1,68 +1,38 @@
1
+ require "json"
2
+ require "piece_of_wax/cli_options"
3
+ require "piece_of_wax/date_time"
4
+ require "piece_of_wax/date_time_decorator/error_message_display"
5
+ require "piece_of_wax/logfile"
1
6
  require "thor"
2
- require "date"
3
7
 
4
- class PieceOfWax < Thor
5
- desc "activity _activity_", "log activity"
6
- def activity(x)
7
- write_to_file("#{Time.now} - #{x}")
8
- puts "wrote #{x} to file"
9
- end
8
+ module PieceOfWax
9
+ class CLI < Thor
10
+ desc 'activity "_activity_"', "log activity (wrap multi-word entries in quotation marks)"
11
+ option :time, aliases: :t, desc: 'time when activity was started'
12
+ def activity(str)
13
+ CLIOptions.instance.set(options)
14
+ time = DateTime.safe_parse(options[:time]) || DateTime.current_time
15
+ Logfile.new(DateTime.current_date).add_activity(time, str)
16
+ $stdout.puts "wrote #{str} to file"
17
+ end
10
18
 
11
- desc "read [date]", "print activities on given [date] (yesterday by default)"
12
- def read(date = Date.today.strftime('%Y-%m-%d'))
13
- output =
14
- begin
15
- generate_output(File.open(filename(date)).readlines)
16
- rescue Errno::ENOENT
17
- "Sorry, I couldn't find any logs for #{print_date(date)}."
19
+ desc "read [date]", "print activities on given [date] (yesterday by default)"
20
+ option :military, aliases: :m, desc: 'render time in military (24-hour) format'
21
+ def read(date_str = '')
22
+ CLIOptions.instance.set(options)
23
+ date = DateTime.safe_parse(date_str) || DateTime.current_date
24
+ logfile = Logfile.new(date)
25
+ if logfile.contents
26
+ $stdout.puts logfile
27
+ else
28
+ $stderr.puts "Sorry, I couldn't find any logs for #{DateTimeDecorator::ErrorMessageDisplay.new(date)}."
18
29
  end
19
- puts output
20
- end
21
-
22
- private
23
-
24
- def write_to_file(str)
25
- today = Time.now.strftime("%y%m%d")
26
- File.open("#{today}.txt", "a+") do |f|
27
- f.puts(str)
28
30
  end
29
- end
30
31
 
31
- def filename(date)
32
- "%s.txt" % Date.parse(date).strftime("%y%m%d")
33
- end
32
+ private
34
33
 
35
- def print_date(date)
36
- if date == Date.today.prev_day
37
- 'yesterday'
38
- else
39
- date
34
+ def exit_on_failure?
35
+ true
40
36
  end
41
37
  end
42
-
43
- def generate_output(lines)
44
- date = date_format(lines[0].split(' ')[0])
45
- result =
46
- lines.each_cons(2).reduce([date]) do |output, (line1, line2)|
47
- output << output_line(line1, line2)
48
- end
49
- result << output_line(lines.last, "#{date} 05:45:00 -0500 - #{lines.last.split(' - ')[1]}")
50
- end
51
-
52
- def output_line(line1, line2)
53
- date_info1, activity1 = line1.split(' - ')
54
- date_info2, _activity2 = line2.split(' - ')
55
- _date1, time1, _time_delta1 = date_info1.split(' ')
56
- _date2, time2, _time_delta2 = date_info2.split(' ')
57
- "#{time_format(time1)}-#{time_format(time2)} - #{activity1}"
58
- end
59
-
60
- def date_format(str)
61
- year, month, day = str.split('-').map(&:to_i)
62
- Date.new(year, month, day).strftime('%-m/%-d/%y')
63
- end
64
-
65
- def time_format(str)
66
- str.split(':').first(2).join(':')
67
- end
68
38
  end
@@ -0,0 +1,64 @@
1
+ require 'erb'
2
+ require 'json'
3
+ require 'piece_of_wax/file_io'
4
+ require 'piece_of_wax/output_line/activity'
5
+ require 'piece_of_wax/output_line/date'
6
+
7
+ module PieceOfWax
8
+ class Logfile
9
+ def initialize(date)
10
+ filename = "%s.txt" % date.strftime("%y%m%d")
11
+ @file_io = FileIO.new(filename)
12
+ end
13
+
14
+ def contents
15
+ return unless raw_content = @file_io.read
16
+ JSON.parse(raw_content)
17
+ end
18
+
19
+ def add_activity(time, description)
20
+ data =
21
+ { datetime: time, description: description }
22
+ obj =
23
+ if contents
24
+ contents.insert(proper_index(time), data)
25
+ else
26
+ [data]
27
+ end
28
+ str = obj.to_json
29
+ @file_io.overwrite_with(str)
30
+ end
31
+
32
+ def to_s
33
+ output =
34
+ ERB.new(<<~ERB).result(binding)
35
+ <%= OutputLine::Date.new(first_entry['datetime']) %>
36
+ <% contents.each_cons(2).map do |line1, line2| %>
37
+ <%= OutputLine::Activity.new(line1['datetime'], line2['datetime'], line1['description']) %>
38
+ <% end.join("\n") %>
39
+ <%= OutputLine::Activity.new(last_entry['datetime'], "17:45:00 -0500", last_entry['description']) %>
40
+ ERB
41
+ # Unsure why ERB is inserting the double linebreaks after each
42
+ # iteration of `contents.each_cons(2)`. For now, subbing single linebreak
43
+ # to eliminate doubles.
44
+ output.gsub("\n\n", "\n")
45
+ end
46
+
47
+ private
48
+
49
+ def proper_index(time)
50
+ contents.each_with_index do |line, i|
51
+ return i if Time.parse(line['datetime']) > time
52
+ end
53
+ return contents.length
54
+ end
55
+
56
+ def first_entry
57
+ contents.first
58
+ end
59
+
60
+ def last_entry
61
+ contents.last
62
+ end
63
+ end
64
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: piece_of_wax
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 1.0.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Stegeman
@@ -14,28 +14,98 @@ dependencies:
14
14
  name: thor
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '='
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.20.0
19
+ version: '1.0'
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.20.0
26
+ version: '1.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: aruba
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.11.3
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.11.3
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry-nav
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.3'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.3'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry-remote
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.1.7
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.1.7
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 3.7.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 3.7.0
27
97
  - !ruby/object:Gem::Dependency
28
98
  name: timecop
29
99
  requirement: !ruby/object:Gem::Requirement
30
100
  requirements:
31
- - - '='
101
+ - - "~>"
32
102
  - !ruby/object:Gem::Version
33
103
  version: 0.9.1
34
104
  type: :development
35
105
  prerelease: false
36
106
  version_requirements: !ruby/object:Gem::Requirement
37
107
  requirements:
38
- - - '='
108
+ - - "~>"
39
109
  - !ruby/object:Gem::Version
40
110
  version: 0.9.1
41
111
  description: ''
@@ -47,6 +117,7 @@ extra_rdoc_files: []
47
117
  files:
48
118
  - bin/piece_of_wax
49
119
  - lib/piece_of_wax.rb
120
+ - lib/piece_of_wax/logfile.rb
50
121
  homepage:
51
122
  licenses:
52
123
  - MIT
@@ -62,9 +133,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
62
133
  version: '0'
63
134
  required_rubygems_version: !ruby/object:Gem::Requirement
64
135
  requirements:
65
- - - ">="
136
+ - - ">"
66
137
  - !ruby/object:Gem::Version
67
- version: '0'
138
+ version: 1.3.1
68
139
  requirements: []
69
140
  rubyforge_project:
70
141
  rubygems_version: 2.7.6