piece_of_wax 0.0.2 → 1.0.0.rc1

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: 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