work-md 0.3.8 → 0.4.1
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/bin/work-md.rb +7 -0
- data/lib/work/md/cli.rb +6 -2
- data/lib/work/md/commands/last.rb +38 -0
- data/lib/work/md/commands/parse.rb +13 -15
- data/lib/work/md/commands/tlast.rb +28 -0
- data/lib/work/md/commands/today.rb +1 -1
- data/lib/work/md/commands/tyesterday.rb +1 -1
- data/lib/work/md/commands/yesterday.rb +1 -1
- data/lib/work/md/config.rb +6 -1
- data/lib/work/md/date_file.rb +48 -0
- data/lib/work/md/file.rb +0 -39
- data/lib/work/md/parser/engine.rb +30 -18
- data/lib/work/md/version.rb +1 -1
- data/lib/work/md.rb +3 -0
- metadata +12 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 785ba0c00e62f155b5d1f0bd99e8aabe1f2e2a21ab969ee2d2a537cacdea905a
|
4
|
+
data.tar.gz: 1b0e7d575c2cc1dfa12286ae3a81f7e6407c23bc7e7779cacf04f88fccc3bede
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2f29dee5202dbda4cac2ba534b4fec472188153db6f0aeda0dff409fcb0b20a0dc3a9fbb8d67b0e4ef43c492bdbf5a0aabd0ad6d1e356d4cea0d7aa5b572aa31
|
7
|
+
data.tar.gz: 7908a13d8c2515a0d149f63aa896aad7c476efde33664a66f08da9178e979f8f761a25ad5ed6b41fc6a44fa2898d3ca934ad9021575ccd6ca1079233b9a10219
|
data/bin/work-md.rb
ADDED
data/lib/work/md/cli.rb
CHANGED
@@ -12,7 +12,9 @@ module Work
|
|
12
12
|
'y' => 'yesterday',
|
13
13
|
'c' => 'config',
|
14
14
|
'p' => 'parse',
|
15
|
-
'a' => 'annotations'
|
15
|
+
'a' => 'annotations',
|
16
|
+
'l' => 'last',
|
17
|
+
'tl' => 'tlast'
|
16
18
|
}.freeze
|
17
19
|
|
18
20
|
def self.execute(argv)
|
@@ -27,7 +29,7 @@ module Work
|
|
27
29
|
Object
|
28
30
|
.const_get("Work::Md::Commands::#{command}")
|
29
31
|
.send(:execute, argv)
|
30
|
-
rescue NameError
|
32
|
+
rescue NameError => e
|
31
33
|
puts help(
|
32
34
|
::TTY::Box.frame(
|
33
35
|
"Command '#{first_argv_argument}' not found!",
|
@@ -50,6 +52,8 @@ module Work
|
|
50
52
|
'- work-md today',
|
51
53
|
'- work-md yesterday',
|
52
54
|
'- work-md tyesterday',
|
55
|
+
'- work-md last',
|
56
|
+
'- work-md tlast',
|
53
57
|
'- work-md parse',
|
54
58
|
'- work-md annotations',
|
55
59
|
'- work-md config',
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Work
|
4
|
+
module Md
|
5
|
+
module Commands
|
6
|
+
class Last
|
7
|
+
class << self
|
8
|
+
def execute(_argv = [])
|
9
|
+
found_file = false
|
10
|
+
current_day = Date.today.prev_day
|
11
|
+
work_dir = Work::Md::Config.work_dir
|
12
|
+
|
13
|
+
(1..160).each do
|
14
|
+
file_name = "#{current_day.strftime('%Y/%m/%d')}.md"
|
15
|
+
|
16
|
+
if ::File.exist?("#{work_dir}/#{file_name}")
|
17
|
+
Work::Md::File.open_in_editor([file_name])
|
18
|
+
found_file = true
|
19
|
+
break
|
20
|
+
end
|
21
|
+
|
22
|
+
current_day = current_day.prev_day
|
23
|
+
end
|
24
|
+
|
25
|
+
unless found_file
|
26
|
+
Work::Md::Cli.help(
|
27
|
+
::TTY::Box.frame(
|
28
|
+
"message: No file found in last 5 months",
|
29
|
+
**Work::Md::Cli.error_frame_style
|
30
|
+
)
|
31
|
+
)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -60,44 +60,41 @@ module Work
|
|
60
60
|
parser.interruptions.each do |interruption|
|
61
61
|
f.puts("- #{interruption}\n")
|
62
62
|
end
|
63
|
+
f.puts("\n") if parser.interruptions.size > 0
|
63
64
|
f.puts("---\n\n")
|
64
65
|
f.puts("### #{t[:difficulties]} (#{parser.difficulties.size}):\n\n")
|
65
66
|
parser.difficulties.each do |difficulty|
|
66
67
|
f.puts("- #{difficulty}\n")
|
67
68
|
end
|
69
|
+
f.puts("\n") if parser.difficulties.size > 0
|
68
70
|
f.puts("---\n\n")
|
69
71
|
f.puts("### #{t[:observations]} (#{parser.observations.size}):\n\n")
|
70
72
|
parser.observations.each do |observation|
|
71
73
|
f.puts("- #{observation}\n")
|
72
74
|
end
|
75
|
+
f.puts("\n") if parser.observations.size > 0
|
73
76
|
f.puts("---\n\n")
|
74
77
|
f.puts("### #{t[:pomodoros]} (#{parser.average_pomodoros} #{t[:per_day]}):\n\n")
|
75
78
|
f.puts("**#{t[:total]}: #{parser.pomodoros_sum}**")
|
76
|
-
f.puts("\n
|
79
|
+
f.puts("\n")
|
77
80
|
parser.pomodoros_bars.each do |pomodoro_bar|
|
78
81
|
f.puts(pomodoro_bar)
|
79
|
-
f.puts("\n
|
82
|
+
f.puts("\n")
|
80
83
|
end
|
81
84
|
f.puts("---\n\n")
|
82
85
|
f.puts("### #{t[:days_bars]}:\n\n")
|
83
86
|
f.puts("**#{t[:pomodoros]}: ⬛ | #{t[:meetings]}: 📅 | #{t[:interruptions]}: ⚠️ | #{t[:difficulties]}: 😓 | #{t[:observations]}: 📝 | #{t[:tasks]}: ✔️**")
|
84
87
|
|
85
|
-
f.puts("\n
|
88
|
+
f.puts("\n")
|
86
89
|
parser.days_bars.each do |day_bar|
|
87
90
|
f.puts(day_bar)
|
88
|
-
f.puts("\n
|
91
|
+
f.puts("\n")
|
89
92
|
end
|
90
93
|
|
91
94
|
f.puts("\n\n")
|
92
95
|
end
|
93
96
|
|
94
|
-
|
95
|
-
|
96
|
-
if editor.nil?
|
97
|
-
::TTY::Editor.open(parsed_file_path)
|
98
|
-
else
|
99
|
-
::TTY::Editor.open(parsed_file_path, command: editor)
|
100
|
-
end
|
97
|
+
Work::Md::File.open_in_editor([parsed_file_path])
|
101
98
|
rescue StandardError => e
|
102
99
|
Work::Md::Cli.help(
|
103
100
|
::TTY::Box.frame(
|
@@ -105,10 +102,11 @@ module Work
|
|
105
102
|
'',
|
106
103
|
'Usage examples:',
|
107
104
|
'',
|
108
|
-
'work-md
|
109
|
-
'work-md
|
110
|
-
'work-md
|
111
|
-
'work-md
|
105
|
+
'work-md p -d=1 -m=5 -y=2000 # get day 1 from month 5 and year 2000',
|
106
|
+
'work-md p -d=1,2,3 # get day 1, 2 and 3 from the current month and year',
|
107
|
+
'work-md p -d=1,2 -m=4 # get day 1 and 2 from month 4 and current year',
|
108
|
+
'work-md p -d=1..10 -m=4 # get day 1 to 10 from month 4 and current year',
|
109
|
+
'work-md p -d=1..25 -m=2 and -d=1..25 -m=2 -y=1999 # get day 1 to 25 from month 2 and current year and 1 to 25 from month 2 in 1999',
|
112
110
|
**Work::Md::Cli.error_frame_style
|
113
111
|
)
|
114
112
|
)
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Work
|
4
|
+
module Md
|
5
|
+
module Commands
|
6
|
+
class Tlast
|
7
|
+
class << self
|
8
|
+
def execute(_argv = [])
|
9
|
+
last_date = Date.today.prev_day
|
10
|
+
work_dir = Work::Md::Config.work_dir
|
11
|
+
last_file_name = nil
|
12
|
+
|
13
|
+
(1..160).each do
|
14
|
+
last_file_name = "#{last_date.strftime('%Y/%m/%d')}.md"
|
15
|
+
break if ::File.exist?("#{work_dir}/#{last_file_name}")
|
16
|
+
|
17
|
+
last_date = last_date.prev_day
|
18
|
+
end
|
19
|
+
|
20
|
+
today_file_name = Work::Md::DateFile.create_if_not_exist(DateTime.now)
|
21
|
+
|
22
|
+
Work::Md::File.open_in_editor([today_file_name, last_file_name].compact)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/work/md/config.rb
CHANGED
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Work
|
4
|
+
module Md
|
5
|
+
class DateFile
|
6
|
+
def self.open_or_create(some_date, dir: nil)
|
7
|
+
Work::Md::File.open_in_editor(
|
8
|
+
[create_if_not_exist(some_date, dir: dir)], dir: dir
|
9
|
+
)
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.create_if_not_exist(some_date, dir: nil)
|
13
|
+
t = Work::Md::Config.translations
|
14
|
+
work_dir = dir || Work::Md::Config.work_dir
|
15
|
+
|
16
|
+
file_name = "#{some_date.strftime('%Y/%m/%d')}.md"
|
17
|
+
|
18
|
+
return file_name if ::File.exist?("#{work_dir}/#{file_name}")
|
19
|
+
|
20
|
+
::FileUtils
|
21
|
+
.mkdir_p("#{work_dir}/#{some_date.strftime('%Y/%m')}")
|
22
|
+
|
23
|
+
::File.open(
|
24
|
+
"#{work_dir}/#{file_name}",
|
25
|
+
'w+'
|
26
|
+
) do |f|
|
27
|
+
f.puts("# #{some_date.strftime('%d/%m/%Y')} - #{Work::Md::Config.title} \n\n")
|
28
|
+
f.puts("### #{t[:tasks]}:\n\n")
|
29
|
+
f.puts("- [ ]\n\n")
|
30
|
+
f.puts("---\n\n")
|
31
|
+
f.puts("### #{t[:meetings]}:\n\n")
|
32
|
+
f.puts("- [ ]\n\n")
|
33
|
+
f.puts("---\n\n")
|
34
|
+
f.puts("### #{t[:interruptions]}:\n\n")
|
35
|
+
f.puts("---\n\n")
|
36
|
+
f.puts("### #{t[:difficulties]}:\n\n")
|
37
|
+
f.puts("---\n\n")
|
38
|
+
f.puts("### #{t[:observations]}:\n\n")
|
39
|
+
f.puts("---\n\n")
|
40
|
+
f.puts("### #{t[:pomodoros]}:\n\n")
|
41
|
+
f.puts("0\n\n")
|
42
|
+
end
|
43
|
+
|
44
|
+
file_name
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/work/md/file.rb
CHANGED
@@ -3,45 +3,6 @@
|
|
3
3
|
module Work
|
4
4
|
module Md
|
5
5
|
class File
|
6
|
-
def self.open_or_create(some_date, dir: nil)
|
7
|
-
open_in_editor([create_if_not_exist(some_date, dir: dir)], dir: dir)
|
8
|
-
end
|
9
|
-
|
10
|
-
def self.create_if_not_exist(some_date, dir: nil)
|
11
|
-
t = Work::Md::Config.translations
|
12
|
-
work_dir = dir || Work::Md::Config.work_dir
|
13
|
-
|
14
|
-
file_name = "#{some_date.strftime('%Y/%m/%d')}.md"
|
15
|
-
|
16
|
-
return file_name if ::File.exist?("#{work_dir}/#{file_name}")
|
17
|
-
|
18
|
-
::FileUtils
|
19
|
-
.mkdir_p("#{work_dir}/#{some_date.strftime('%Y/%m')}")
|
20
|
-
|
21
|
-
::File.open(
|
22
|
-
"#{work_dir}/#{file_name}",
|
23
|
-
'w+'
|
24
|
-
) do |f|
|
25
|
-
f.puts("# #{some_date.strftime('%d/%m/%Y')} - #{Work::Md::Config.title} \n\n")
|
26
|
-
f.puts("### #{t[:tasks]}:\n\n")
|
27
|
-
f.puts("- [ ]\n\n")
|
28
|
-
f.puts("---\n\n")
|
29
|
-
f.puts("### #{t[:meetings]}:\n\n")
|
30
|
-
f.puts("- [ ]\n\n")
|
31
|
-
f.puts("---\n\n")
|
32
|
-
f.puts("### #{t[:interruptions]}:\n\n")
|
33
|
-
f.puts("---\n\n")
|
34
|
-
f.puts("### #{t[:difficulties]}:\n\n")
|
35
|
-
f.puts("---\n\n")
|
36
|
-
f.puts("### #{t[:observations]}:\n\n")
|
37
|
-
f.puts("---\n\n")
|
38
|
-
f.puts("### #{t[:pomodoros]}:\n\n")
|
39
|
-
f.puts("0\n\n")
|
40
|
-
end
|
41
|
-
|
42
|
-
file_name
|
43
|
-
end
|
44
|
-
|
45
6
|
def self.open_in_editor(file_names = [], dir: nil)
|
46
7
|
editor = Work::Md::Config.editor
|
47
8
|
work_dir = dir || Work::Md::Config.work_dir
|
@@ -144,53 +144,65 @@ module Work
|
|
144
144
|
parsed_file.date =
|
145
145
|
content.split(' - ')[0].gsub('# ', '').gsub("\n\n", '')
|
146
146
|
elsif content.start_with?(@t[:tasks])
|
147
|
-
parsed_file.tasks = parse_check_list(content)
|
147
|
+
parsed_file.tasks = parse_check_list(content, start_with: @t[:tasks])
|
148
148
|
elsif content.start_with?(@t[:meetings])
|
149
|
-
parsed_file.meetings = parse_check_list(content)
|
149
|
+
parsed_file.meetings = parse_check_list(content, start_with: @t[:meetings])
|
150
150
|
elsif content.start_with?(@t[:interruptions])
|
151
151
|
parsed_file.interruptions =
|
152
|
-
parse_list(content).map do |interruption|
|
152
|
+
parse_list(content, start_with: @t[:interruptions]).map do |interruption|
|
153
153
|
"(#{parsed_file.date}) #{interruption}"
|
154
154
|
end
|
155
155
|
elsif content.start_with?(@t[:difficulties])
|
156
|
-
parsed_file.difficulties =
|
157
|
-
|
158
|
-
|
156
|
+
parsed_file.difficulties =
|
157
|
+
parse_list(
|
158
|
+
content, start_with: @t[:difficulties]
|
159
|
+
).map do |difficulty|
|
160
|
+
"(#{parsed_file.date}) #{difficulty}"
|
161
|
+
end
|
159
162
|
elsif content.start_with?(@t[:observations])
|
160
|
-
parsed_file.observations =
|
161
|
-
|
162
|
-
|
163
|
+
parsed_file.observations =
|
164
|
+
parse_list(
|
165
|
+
content, start_with: @t[:observations]
|
166
|
+
).map do |observations|
|
167
|
+
"(#{parsed_file.date}) #{observations}"
|
168
|
+
end
|
163
169
|
elsif content.start_with?(@t[:pomodoros])
|
164
|
-
parsed_file.pomodoros =
|
170
|
+
parsed_file.pomodoros =
|
171
|
+
parse_pomodoro(content, start_with: @t[:pomodoros])
|
165
172
|
end
|
166
173
|
end
|
167
174
|
# rubocop:enable Metrics/CyclomaticComplexity
|
168
175
|
# rubocop:enable Metrics/PerceivedComplexity
|
169
176
|
|
170
|
-
def parse_check_list(content)
|
171
|
-
clear_list(basic_parse(content).split('- ['))
|
177
|
+
def parse_check_list(content, start_with: nil)
|
178
|
+
clear_list(basic_parse(content, start_with: start_with).split('- ['))
|
172
179
|
end
|
173
180
|
|
174
|
-
def parse_list(content)
|
175
|
-
clear_list(basic_parse(content).split('- '))
|
181
|
+
def parse_list(content, start_with: nil)
|
182
|
+
clear_list(basic_parse(content, start_with: start_with).split('- '))
|
176
183
|
end
|
177
184
|
|
178
|
-
def parse_pomodoro(content)
|
179
|
-
basic_parse(content).scan(/\d+/).first.to_i
|
185
|
+
def parse_pomodoro(content, start_with: nil)
|
186
|
+
basic_parse(content, start_with: start_with).scan(/\d+/).first.to_i
|
180
187
|
end
|
181
188
|
|
182
|
-
def basic_parse(content)
|
189
|
+
def basic_parse(content, start_with: nil)
|
190
|
+
return content.split("#{start_with}:\n")[1] unless start_with.nil?
|
191
|
+
|
183
192
|
content.split(":\n\n")[1]
|
184
193
|
end
|
185
194
|
|
195
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
186
196
|
def clear_list(list)
|
187
197
|
return list unless list.is_a?(Array)
|
188
198
|
|
189
199
|
list
|
190
200
|
.map { |s| s.gsub('---', '') unless s.nil? }
|
191
|
-
.select { |s| (s !=
|
201
|
+
.select { |s| (s != "\n\n") && (s != "\n\n\n") }
|
192
202
|
.map(&:strip)
|
203
|
+
.reject { |s| (s == '') }
|
193
204
|
end
|
205
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
194
206
|
end
|
195
207
|
# rubocop:enable Metrics/ClassLength
|
196
208
|
end
|
data/lib/work/md/version.rb
CHANGED
data/lib/work/md.rb
CHANGED
@@ -3,11 +3,14 @@
|
|
3
3
|
require_relative 'md/version'
|
4
4
|
require_relative 'md/config'
|
5
5
|
require_relative 'md/file'
|
6
|
+
require_relative 'md/date_file'
|
6
7
|
require_relative 'md/commands/today'
|
7
8
|
require_relative 'md/commands/config'
|
8
9
|
require_relative 'md/commands/yesterday'
|
9
10
|
require_relative 'md/commands/tyesterday'
|
10
11
|
require_relative 'md/commands/annotations'
|
12
|
+
require_relative 'md/commands/last'
|
13
|
+
require_relative 'md/commands/tlast'
|
11
14
|
require_relative 'md/parser/engine'
|
12
15
|
require_relative 'md/commands/parse'
|
13
16
|
require_relative 'md/cli'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: work-md
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Henrique Fernandez Teixeira
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-10-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: tty-box
|
@@ -38,7 +38,7 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 0.7.0
|
41
|
-
description:
|
41
|
+
description:
|
42
42
|
email:
|
43
43
|
- hriqueft@gmail.com
|
44
44
|
executables:
|
@@ -49,24 +49,28 @@ files:
|
|
49
49
|
- bin/console
|
50
50
|
- bin/setup
|
51
51
|
- bin/work-md
|
52
|
+
- bin/work-md.rb
|
52
53
|
- lib/work/md.rb
|
53
54
|
- lib/work/md/cli.rb
|
54
55
|
- lib/work/md/commands/annotations.rb
|
55
56
|
- lib/work/md/commands/config.rb
|
57
|
+
- lib/work/md/commands/last.rb
|
56
58
|
- lib/work/md/commands/parse.rb
|
59
|
+
- lib/work/md/commands/tlast.rb
|
57
60
|
- lib/work/md/commands/today.rb
|
58
61
|
- lib/work/md/commands/tyesterday.rb
|
59
62
|
- lib/work/md/commands/yesterday.rb
|
60
63
|
- lib/work/md/config.rb
|
64
|
+
- lib/work/md/date_file.rb
|
61
65
|
- lib/work/md/file.rb
|
62
66
|
- lib/work/md/parser/engine.rb
|
63
67
|
- lib/work/md/version.rb
|
64
|
-
homepage:
|
68
|
+
homepage:
|
65
69
|
licenses:
|
66
70
|
- MIT
|
67
71
|
metadata:
|
68
72
|
source_code_uri: https://github.com/work-md/work-md
|
69
|
-
post_install_message:
|
73
|
+
post_install_message:
|
70
74
|
rdoc_options: []
|
71
75
|
require_paths:
|
72
76
|
- lib
|
@@ -81,8 +85,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
81
85
|
- !ruby/object:Gem::Version
|
82
86
|
version: '0'
|
83
87
|
requirements: []
|
84
|
-
rubygems_version: 3.2.
|
85
|
-
signing_key:
|
88
|
+
rubygems_version: 3.2.22
|
89
|
+
signing_key:
|
86
90
|
specification_version: 4
|
87
91
|
summary: Track your work activities, write annotations, recap what you did for a week,
|
88
92
|
month or specific days... and much more!
|