work_md 0.2.3 → 0.2.7
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/lib/work_md.rb +3 -0
- data/lib/work_md/cli.rb +4 -0
- data/lib/work_md/commands/parse.rb +23 -16
- data/lib/work_md/commands/today.rb +1 -44
- data/lib/work_md/commands/tyesterday.rb +14 -0
- data/lib/work_md/commands/yesterday.rb +13 -0
- data/lib/work_md/config.rb +6 -6
- data/lib/work_md/file.rb +50 -0
- data/lib/work_md/parser/engine.rb +35 -25
- data/lib/work_md/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 240715cce22ce57249e206aaccb86151732c059fa4af0f00b1b3d2c8f47389bb
|
4
|
+
data.tar.gz: 436b17f29758239fe959abdf6d8ffaf24f629ba3fb41315bf92e8c42eaaac4cb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 595cc7e93141034918c3076dcf1416fe46ba9c0194fd06026e117269c73482a595d8d6cfdf7b23cc73e67a60880971d3ba2c76453a567ea6581d273c529414d7
|
7
|
+
data.tar.gz: e9599c13e70ade59262afb89dca054c8dc54821906e9eca4a113efc579716f3df2e1e2f91819d1a0b0edb77a632b8d227233aa3912b70fd87dcb509b984cd0ed
|
data/lib/work_md.rb
CHANGED
@@ -2,7 +2,10 @@
|
|
2
2
|
|
3
3
|
require_relative 'work_md/version'
|
4
4
|
require_relative 'work_md/config'
|
5
|
+
require_relative 'work_md/file'
|
5
6
|
require_relative 'work_md/commands/today'
|
7
|
+
require_relative 'work_md/commands/yesterday'
|
8
|
+
require_relative 'work_md/commands/tyesterday'
|
6
9
|
require_relative 'work_md/parser/engine'
|
7
10
|
require_relative 'work_md/commands/parse'
|
8
11
|
require_relative 'work_md/cli'
|
data/lib/work_md/cli.rb
CHANGED
@@ -7,6 +7,8 @@ module WorkMd
|
|
7
7
|
ALIAS_COMMANDS =
|
8
8
|
{
|
9
9
|
't' => 'today',
|
10
|
+
'ty' => 'tyesterday',
|
11
|
+
'y' => 'yesterday',
|
10
12
|
'p' => 'parse'
|
11
13
|
}.freeze
|
12
14
|
|
@@ -44,6 +46,8 @@ module WorkMd
|
|
44
46
|
'',
|
45
47
|
'- work_md',
|
46
48
|
'- work_md today',
|
49
|
+
'- work_md yesterday',
|
50
|
+
'- work_md tyesterday',
|
47
51
|
'- work_md parse',
|
48
52
|
'',
|
49
53
|
'read more in github.com/henriquefernandez/work_md',
|
@@ -17,7 +17,7 @@ module WorkMd
|
|
17
17
|
|
18
18
|
month = "0#{month.to_i}" if month.to_i < 10
|
19
19
|
|
20
|
-
|
20
|
+
add_file_to_parser = ->(day) do
|
21
21
|
day = "0#{day.to_i}" if day.to_i < 10
|
22
22
|
|
23
23
|
file_name = WorkMd::Config.work_dir + "/#{year}/#{month}/#{day}.md"
|
@@ -25,11 +25,19 @@ module WorkMd
|
|
25
25
|
parser.add_file(file_name)
|
26
26
|
end
|
27
27
|
|
28
|
+
if args['d'].include?('..')
|
29
|
+
range = args['d'].split('..')
|
30
|
+
|
31
|
+
(range[0].to_i..range[1].to_i).each { |day| add_file_to_parser.(day) }
|
32
|
+
else
|
33
|
+
args['d'].split(',').each { |day| add_file_to_parser.(day) }
|
34
|
+
end
|
35
|
+
|
28
36
|
parser.freeze
|
29
37
|
|
30
|
-
File.delete(PARSED_FILE_PATH) if File.exist? PARSED_FILE_PATH
|
38
|
+
::File.delete(PARSED_FILE_PATH) if ::File.exist? PARSED_FILE_PATH
|
31
39
|
|
32
|
-
File.open(PARSED_FILE_PATH, 'w+') do |f|
|
40
|
+
::File.open(PARSED_FILE_PATH, 'w+') do |f|
|
33
41
|
f.puts("# #{WorkMd::Config.title}\n\n")
|
34
42
|
f.puts("### #{t[:tasks]} (#{parser.tasks.size}):\n\n")
|
35
43
|
parser.tasks.each do |task|
|
@@ -38,16 +46,7 @@ module WorkMd
|
|
38
46
|
f.puts("---\n\n")
|
39
47
|
f.puts("### #{t[:meetings]} (#{parser.meetings.size}):\n\n")
|
40
48
|
parser.meetings.each do |meeting|
|
41
|
-
f.puts("- #{meeting}\n\n")
|
42
|
-
end
|
43
|
-
f.puts("---\n\n")
|
44
|
-
f.puts("### #{t[:annotations]}:\n\n")
|
45
|
-
parser.annotations.each do |annotation|
|
46
|
-
f.puts("- #{annotation.gsub('###', '')}") unless annotation.nil?
|
47
|
-
end
|
48
|
-
f.puts("###### #{t[:meeting_annotations]}:\n\n")
|
49
|
-
parser.meeting_annotations.each do |meeting_annotation|
|
50
|
-
f.puts("- #{meeting_annotation}\n\n")
|
49
|
+
f.puts("- [#{meeting}\n\n") if meeting != ' ]'
|
51
50
|
end
|
52
51
|
f.puts("---\n\n")
|
53
52
|
f.puts("### #{t[:interruptions]} (#{parser.interruptions.size}):\n\n")
|
@@ -60,25 +59,33 @@ module WorkMd
|
|
60
59
|
f.puts("- #{difficulty}\n\n")
|
61
60
|
end
|
62
61
|
f.puts("---\n\n")
|
63
|
-
f.puts("### #{t[:
|
62
|
+
f.puts("### #{t[:observations]} (#{parser.observations.size}):\n\n")
|
63
|
+
parser.observations.each do |observation|
|
64
|
+
f.puts("- #{observation}\n\n")
|
65
|
+
end
|
66
|
+
f.puts("---\n\n")
|
67
|
+
f.puts("### #{t[:pomodoros]} (#{parser.average_pomodoros} #{t[:per_day]}):\n\n")
|
64
68
|
f.puts(parser.pomodoros)
|
65
69
|
end
|
66
70
|
|
67
71
|
editor = WorkMd::Config.editor
|
68
72
|
|
69
73
|
unless editor.nil?
|
70
|
-
::TTY::Editor.open(PARSED_FILE_PATH,
|
74
|
+
::TTY::Editor.open(PARSED_FILE_PATH, command: editor)
|
71
75
|
else
|
72
76
|
::TTY::Editor.open(PARSED_FILE_PATH)
|
73
77
|
end
|
74
|
-
rescue
|
78
|
+
rescue => e
|
75
79
|
WorkMd::Cli.info(
|
76
80
|
::TTY::Box.frame(
|
81
|
+
"message: #{e.message}",
|
82
|
+
"",
|
77
83
|
"Usage examples:",
|
78
84
|
"",
|
79
85
|
"work_md parse -d=1 -m=5 -y=2000 | get day 1 from month 5 and year 2000",
|
80
86
|
"work_md parse -d=1,2,3 | get day 1, 2 and 3 from the current month and year",
|
81
87
|
"work_md parse -d=1,2 -m=4 | get day 1 and 2 from month 4 and current year",
|
88
|
+
"work_md parse -d=1..10 -m=4 | get day 1 to 10 from month 4 and current year",
|
82
89
|
**WorkMd::Cli.error_frame_style
|
83
90
|
)
|
84
91
|
)
|
@@ -5,50 +5,7 @@ module WorkMd
|
|
5
5
|
class Today
|
6
6
|
class << self
|
7
7
|
def execute(_argv = [])
|
8
|
-
|
9
|
-
t = WorkMd::Config.translations
|
10
|
-
work_dir = WorkMd::Config.work_dir
|
11
|
-
|
12
|
-
::FileUtils
|
13
|
-
.mkdir_p("#{work_dir}/#{today.strftime('%Y/%m')}")
|
14
|
-
unless ::File
|
15
|
-
.exist?(
|
16
|
-
"#{work_dir}/#{today.strftime('%Y/%m/%d')}.md"
|
17
|
-
)
|
18
|
-
::File.open(
|
19
|
-
"#{work_dir}/#{today.strftime('%Y/%m/%d')}.md",
|
20
|
-
'w+'
|
21
|
-
) do |f|
|
22
|
-
f.puts("# #{today.strftime('%d/%m/%Y')} - #{WorkMd::Config.title} \n\n")
|
23
|
-
f.puts("### #{t[:tasks]}:\n\n")
|
24
|
-
f.puts("- [ ]\n\n")
|
25
|
-
f.puts("---\n\n")
|
26
|
-
f.puts("### #{t[:meetings]}:\n\n")
|
27
|
-
f.puts("---\n\n")
|
28
|
-
f.puts("### #{t[:annotations]}:\n\n")
|
29
|
-
f.puts("###### #{t[:meeting_annotations]}:\n\n")
|
30
|
-
f.puts("---\n\n")
|
31
|
-
f.puts("### #{t[:interruptions]}:\n\n")
|
32
|
-
f.puts("---\n\n")
|
33
|
-
f.puts("### #{t[:difficulties]}:\n\n")
|
34
|
-
f.puts("---\n\n")
|
35
|
-
f.puts("### #{t[:pomodoros]}:\n\n")
|
36
|
-
f.puts("0\n\n")
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
editor = WorkMd::Config.editor
|
41
|
-
|
42
|
-
::FileUtils.cd(work_dir) do
|
43
|
-
unless editor.nil?
|
44
|
-
::TTY::Editor.open(
|
45
|
-
"#{today.strftime('%Y/%m/%d')}.md",
|
46
|
-
{command: editor}
|
47
|
-
)
|
48
|
-
else
|
49
|
-
::TTY::Editor.open("#{today.strftime('%Y/%m/%d')}.md")
|
50
|
-
end
|
51
|
-
end
|
8
|
+
WorkMd::File.open_or_create(DateTime.now)
|
52
9
|
end
|
53
10
|
end
|
54
11
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module WorkMd
|
4
|
+
module Commands
|
5
|
+
class Tyesterday
|
6
|
+
class << self
|
7
|
+
def execute(_argv = [])
|
8
|
+
WorkMd::File.open_or_create(DateTime.now)
|
9
|
+
WorkMd::File.open_or_create(Date.today.prev_day)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/work_md/config.rb
CHANGED
@@ -10,21 +10,21 @@ module WorkMd
|
|
10
10
|
{
|
11
11
|
tasks: 'Atividades',
|
12
12
|
meetings: 'Reuniões',
|
13
|
-
annotations: 'Anotações',
|
14
|
-
meeting_annotations: 'Anotações de Reunião',
|
15
13
|
interruptions: 'Interrupções',
|
16
14
|
difficulties: 'Dificuldades',
|
17
|
-
|
15
|
+
observations: 'Observações',
|
16
|
+
pomodoros: 'Pomodoros / Ciclos',
|
17
|
+
per_day: 'por dia'
|
18
18
|
},
|
19
19
|
'en' =>
|
20
20
|
{
|
21
21
|
tasks: 'Tasks',
|
22
22
|
meetings: 'Meetings',
|
23
|
-
annotations: 'Annotations',
|
24
|
-
meeting_annotations: 'Meeting Annotations',
|
25
23
|
interruptions: 'Interruptions',
|
26
24
|
difficulties: 'Difficulties',
|
27
|
-
|
25
|
+
observations: 'Observations',
|
26
|
+
pomodoros: 'Pomodoros / Cycles',
|
27
|
+
per_day: 'per day'
|
28
28
|
}
|
29
29
|
}.freeze
|
30
30
|
|
data/lib/work_md/file.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module WorkMd
|
4
|
+
class File
|
5
|
+
def self.open_or_create(some_date)
|
6
|
+
t = WorkMd::Config.translations
|
7
|
+
work_dir = WorkMd::Config.work_dir
|
8
|
+
|
9
|
+
::FileUtils
|
10
|
+
.mkdir_p("#{work_dir}/#{some_date.strftime('%Y/%m')}")
|
11
|
+
unless ::File.exist?("#{work_dir}/#{some_date.strftime('%Y/%m/%d')}.md")
|
12
|
+
::File.open(
|
13
|
+
"#{work_dir}/#{some_date.strftime('%Y/%m/%d')}.md",
|
14
|
+
'w+'
|
15
|
+
) do |f|
|
16
|
+
# rubocop:disable Layout/LineLength
|
17
|
+
f.puts("# #{some_date.strftime('%d/%m/%Y')} - #{WorkMd::Config.title} \n\n")
|
18
|
+
# rubocop:enable Layout/LineLength
|
19
|
+
f.puts("### #{t[:tasks]}:\n\n")
|
20
|
+
f.puts("- [ ]\n\n")
|
21
|
+
f.puts("---\n\n")
|
22
|
+
f.puts("### #{t[:meetings]}:\n\n")
|
23
|
+
f.puts("- [ ]\n\n")
|
24
|
+
f.puts("---\n\n")
|
25
|
+
f.puts("### #{t[:interruptions]}:\n\n")
|
26
|
+
f.puts("---\n\n")
|
27
|
+
f.puts("### #{t[:difficulties]}:\n\n")
|
28
|
+
f.puts("---\n\n")
|
29
|
+
f.puts("### #{t[:observations]}:\n\n")
|
30
|
+
f.puts("---\n\n")
|
31
|
+
f.puts("### #{t[:pomodoros]}:\n\n")
|
32
|
+
f.puts("0\n\n")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
editor = WorkMd::Config.editor
|
37
|
+
|
38
|
+
::FileUtils.cd(work_dir) do
|
39
|
+
if editor.nil?
|
40
|
+
::TTY::Editor.open("#{some_date.strftime('%Y/%m/%d')}.md")
|
41
|
+
else
|
42
|
+
::TTY::Editor.open(
|
43
|
+
"#{some_date.strftime('%Y/%m/%d')}.md",
|
44
|
+
command: editor
|
45
|
+
)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -2,17 +2,18 @@
|
|
2
2
|
|
3
3
|
module WorkMd
|
4
4
|
module Parser
|
5
|
+
# rubocop:disable Metrics/ClassLength
|
5
6
|
class Engine
|
6
7
|
IS_FROZEN_ERROR_MESSAGE = 'WorkMd::Parser::Engine is frozen'
|
7
8
|
IS_NOT_FROZEN_ERROR_MESSAGE = 'WorkMd::Parser::Engine is not frozen'
|
8
9
|
|
9
10
|
class ParsedFile
|
10
11
|
attr_accessor :tasks,
|
11
|
-
:annotations,
|
12
|
-
:meeting_annotations,
|
13
12
|
:meetings,
|
14
13
|
:interruptions,
|
15
14
|
:difficulties,
|
15
|
+
:observations,
|
16
|
+
:date,
|
16
17
|
:pomodoros
|
17
18
|
end
|
18
19
|
|
@@ -26,7 +27,7 @@ module WorkMd
|
|
26
27
|
raise IS_FROZEN_ERROR_MESSAGE if @frozen
|
27
28
|
|
28
29
|
begin
|
29
|
-
file_content = File.read(file)
|
30
|
+
file_content = ::File.read(file)
|
30
31
|
rescue Errno::ENOENT
|
31
32
|
return
|
32
33
|
end
|
@@ -49,35 +50,36 @@ module WorkMd
|
|
49
50
|
@tasks ||= @parsed_files.map(&:tasks).flatten
|
50
51
|
end
|
51
52
|
|
52
|
-
def
|
53
|
+
def meetings
|
53
54
|
raise IS_NOT_FROZEN_ERROR_MESSAGE unless @frozen
|
54
55
|
|
55
|
-
@
|
56
|
+
@meetings ||= @parsed_files.map(&:meetings).flatten
|
56
57
|
end
|
57
58
|
|
58
|
-
def
|
59
|
+
def interruptions
|
59
60
|
raise IS_NOT_FROZEN_ERROR_MESSAGE unless @frozen
|
60
61
|
|
61
|
-
@
|
62
|
-
@parsed_files.map(&:meeting_annotations).flatten
|
62
|
+
@interruptions ||= @parsed_files.map(&:interruptions).flatten
|
63
63
|
end
|
64
64
|
|
65
|
-
def
|
65
|
+
def difficulties
|
66
66
|
raise IS_NOT_FROZEN_ERROR_MESSAGE unless @frozen
|
67
67
|
|
68
|
-
@
|
68
|
+
@difficulties ||= @parsed_files.map(&:difficulties).flatten
|
69
69
|
end
|
70
70
|
|
71
|
-
def
|
71
|
+
def observations
|
72
72
|
raise IS_NOT_FROZEN_ERROR_MESSAGE unless @frozen
|
73
73
|
|
74
|
-
@
|
74
|
+
@observations ||= @parsed_files.map(&:observations).flatten
|
75
75
|
end
|
76
76
|
|
77
|
-
def
|
78
|
-
|
77
|
+
def average_pomodoros
|
78
|
+
if @parsed_files.size.positive? && pomodoros.positive?
|
79
|
+
return (pomodoros.to_f / @parsed_files.size).round(1)
|
80
|
+
end
|
79
81
|
|
80
|
-
|
82
|
+
0
|
81
83
|
end
|
82
84
|
|
83
85
|
def pomodoros
|
@@ -106,18 +108,25 @@ module WorkMd
|
|
106
108
|
# rubocop:disable Metrics/CyclomaticComplexity
|
107
109
|
# rubocop:disable Metrics/PerceivedComplexity
|
108
110
|
def parse_content(parsed_file, content)
|
109
|
-
if content.start_with?(
|
110
|
-
parsed_file.
|
111
|
+
if content.start_with?('# ')
|
112
|
+
parsed_file.date =
|
113
|
+
content.split(' - ')[0].gsub('# ', '').gsub("\n\n", '')
|
114
|
+
elsif content.start_with?(@t[:tasks])
|
115
|
+
parsed_file.tasks = parse_check_list(content)
|
111
116
|
elsif content.start_with?(@t[:meetings])
|
112
|
-
parsed_file.meetings =
|
113
|
-
elsif content.start_with?(@t[:meeting_annotations])
|
114
|
-
parsed_file.meeting_annotations = basic_parse(content)
|
115
|
-
elsif content.start_with?(@t[:annotations])
|
116
|
-
parsed_file.annotations = basic_parse(content)
|
117
|
+
parsed_file.meetings = parse_check_list(content)
|
117
118
|
elsif content.start_with?(@t[:interruptions])
|
118
|
-
parsed_file.interruptions = parse_list(content)
|
119
|
+
parsed_file.interruptions = parse_list(content).map do |interruption|
|
120
|
+
"(#{parsed_file.date}) #{interruption}"
|
121
|
+
end
|
119
122
|
elsif content.start_with?(@t[:difficulties])
|
120
|
-
parsed_file.difficulties = parse_list(content)
|
123
|
+
parsed_file.difficulties = parse_list(content).map do |difficulty|
|
124
|
+
"(#{parsed_file.date}) #{difficulty}"
|
125
|
+
end
|
126
|
+
elsif content.start_with?(@t[:observations])
|
127
|
+
parsed_file.observations = parse_list(content).map do |observations|
|
128
|
+
"(#{parsed_file.date}) #{observations}"
|
129
|
+
end
|
121
130
|
elsif content.start_with?(@t[:pomodoros])
|
122
131
|
parsed_file.pomodoros = parse_pomodoro(content)
|
123
132
|
end
|
@@ -125,7 +134,7 @@ module WorkMd
|
|
125
134
|
# rubocop:enable Metrics/CyclomaticComplexity
|
126
135
|
# rubocop:enable Metrics/PerceivedComplexity
|
127
136
|
|
128
|
-
def
|
137
|
+
def parse_check_list(content)
|
129
138
|
clear_list(basic_parse(content).split('- ['))
|
130
139
|
end
|
131
140
|
|
@@ -150,5 +159,6 @@ module WorkMd
|
|
150
159
|
.map(&:strip)
|
151
160
|
end
|
152
161
|
end
|
162
|
+
# rubocop:enable Metrics/ClassLength
|
153
163
|
end
|
154
164
|
end
|
data/lib/work_md/version.rb
CHANGED
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.2.
|
4
|
+
version: 0.2.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Henrique Fernandez Teixeira
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-08-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: tty-box
|
@@ -53,7 +53,10 @@ files:
|
|
53
53
|
- lib/work_md/cli.rb
|
54
54
|
- lib/work_md/commands/parse.rb
|
55
55
|
- lib/work_md/commands/today.rb
|
56
|
+
- lib/work_md/commands/tyesterday.rb
|
57
|
+
- lib/work_md/commands/yesterday.rb
|
56
58
|
- lib/work_md/config.rb
|
59
|
+
- lib/work_md/file.rb
|
57
60
|
- lib/work_md/parser/engine.rb
|
58
61
|
- lib/work_md/version.rb
|
59
62
|
homepage:
|