work_md 0.2.6 → 0.3.0

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: 566027a143beb9e55274abe76ef2f0d0c7a44078d4773c595e9cdce2175a2c32
4
- data.tar.gz: d4094062e154849f8514d26c20d52d37e931d3f844f2b162cb26eab2b7a70d5d
3
+ metadata.gz: db1941195d4c4dddb02ca3375e3f1dcd099e8799330f7ac6b78ac62cb39984b5
4
+ data.tar.gz: 92c72a7d0909f34bab420fabe8c85959b23ce069908da3704cb4b016d036316f
5
5
  SHA512:
6
- metadata.gz: 41053f4429dfd6a4a3af74e52da1d6f131aac58c79c9034a201814a89dc67fd7a2e3feae74c25afa8c0ffc0b610cf9d8332392ee69cb66f43011779033a4af21
7
- data.tar.gz: 4daed1478dedc190e1d3eef1719c54f16af4040519b276ab08820453e08371112fd92cd70b9aef8c3e32480cee65257daa884f3580b0748cb8d32c34c6fabd3f
6
+ metadata.gz: f5f618a78bab8117824f2819e7c4bf49999a4f3396e1dcd6c198fd78ef37ece4d708ffd7400f9d38eeac72a361109124bf6f9f8feb681730e44d2a65045c91f3
7
+ data.tar.gz: 3030407c84b51b4bb9caf485c88e851b824b1aadcda7ab1859a46c985066a623f74a19614fed3db1a0186822053637fc69deff49d288ab877f4adb9c023df4cf
data/bin/work_md CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
+ # require_relative '../lib/work_md'
4
5
  require 'work_md'
5
6
 
6
7
  WorkMd::Cli.execute(ARGV)
data/lib/work_md.rb CHANGED
@@ -4,7 +4,9 @@ require_relative 'work_md/version'
4
4
  require_relative 'work_md/config'
5
5
  require_relative 'work_md/file'
6
6
  require_relative 'work_md/commands/today'
7
+ require_relative 'work_md/commands/config'
7
8
  require_relative 'work_md/commands/yesterday'
9
+ require_relative 'work_md/commands/tyesterday'
8
10
  require_relative 'work_md/parser/engine'
9
11
  require_relative 'work_md/commands/parse'
10
12
  require_relative 'work_md/cli'
data/lib/work_md/cli.rb CHANGED
@@ -7,12 +7,12 @@ module WorkMd
7
7
  ALIAS_COMMANDS =
8
8
  {
9
9
  't' => 'today',
10
+ 'ty' => 'tyesterday',
10
11
  'y' => 'yesterday',
12
+ 'c' => 'config',
11
13
  'p' => 'parse'
12
14
  }.freeze
13
15
 
14
- DEFAULT_COMMAND = WorkMd::Commands::Today
15
-
16
16
  def self.execute(argv)
17
17
  first_argv_argument = argv.shift
18
18
 
@@ -25,17 +25,17 @@ module WorkMd
25
25
  .const_get("WorkMd::Commands::#{command}")
26
26
  .send(:execute, argv)
27
27
  rescue NameError
28
- puts info(
28
+ puts help(
29
29
  ::TTY::Box.frame(
30
30
  "Command '#{first_argv_argument}' not found!",
31
31
  **error_frame_style
32
32
  )
33
33
  )
34
34
  rescue CommandMissing
35
- DEFAULT_COMMAND.execute(argv)
35
+ help('Welcome! =)')
36
36
  end
37
37
 
38
- def self.info(message = '')
38
+ def self.help(message = '')
39
39
  # rubocop:disable Layout/LineLength
40
40
  puts ::TTY::Box.frame(
41
41
  message,
@@ -46,9 +46,11 @@ module WorkMd
46
46
  '- work_md',
47
47
  '- work_md today',
48
48
  '- work_md yesterday',
49
+ '- work_md tyesterday',
49
50
  '- work_md parse',
51
+ '- work_md config',
50
52
  '',
51
- 'read more in github.com/henriquefernandez/work_md',
53
+ 'more information in github.com/henriquefernandez/work_md',
52
54
  padding: 1,
53
55
  title: { top_left: '(work_md)', bottom_right: "(v#{WorkMd::VERSION})" }
54
56
  )
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WorkMd
4
+ module Commands
5
+ class Config
6
+ class << self
7
+ def execute(_argv = [])
8
+ file_name = 'config.yml'
9
+ work_dir = ::WorkMd::Config::DEFAULT_WORK_DIR
10
+
11
+ unless ::File.exist?("#{work_dir}/#{file_name}")
12
+ ::FileUtils.mkdir_p(work_dir)
13
+
14
+ ::File.open("#{work_dir}/#{file_name}", 'w+') do |f|
15
+ f.puts("# Example configuration:")
16
+ f.puts("#")
17
+ f.puts("# title: Your Name")
18
+ f.puts("# editor: vim")
19
+ f.puts("# lang: en")
20
+ f.puts("#")
21
+ f.puts("title: # Title your work_md files")
22
+ f.puts("editor: # Your default editor")
23
+ f.puts("lang: # Only 'pt', 'en' and 'es' avaiable")
24
+ end
25
+ end
26
+
27
+ ::WorkMd::File.open_in_editor(
28
+ file_names: [file_name],
29
+ dir: work_dir
30
+ )
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -17,7 +17,7 @@ module WorkMd
17
17
 
18
18
  month = "0#{month.to_i}" if month.to_i < 10
19
19
 
20
- args['d'].split(',').each do |day|
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,6 +25,14 @@ 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
38
  ::File.delete(PARSED_FILE_PATH) if ::File.exist? PARSED_FILE_PATH
@@ -51,8 +59,20 @@ module WorkMd
51
59
  f.puts("- #{difficulty}\n\n")
52
60
  end
53
61
  f.puts("---\n\n")
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")
54
67
  f.puts("### #{t[:pomodoros]} (#{parser.average_pomodoros} #{t[:per_day]}):\n\n")
55
- f.puts(parser.pomodoros)
68
+ f.puts(parser.pomodoros_sum)
69
+ f.puts("\n\n")
70
+
71
+ parser.pomodoros_bars.each do |pomodoro_bar|
72
+ f.puts(pomodoro_bar)
73
+ f.puts("\n\n")
74
+ end
75
+ f.puts("\n\n")
56
76
  end
57
77
 
58
78
  editor = WorkMd::Config.editor
@@ -63,7 +83,7 @@ module WorkMd
63
83
  ::TTY::Editor.open(PARSED_FILE_PATH)
64
84
  end
65
85
  rescue => e
66
- WorkMd::Cli.info(
86
+ WorkMd::Cli.help(
67
87
  ::TTY::Box.frame(
68
88
  "message: #{e.message}",
69
89
  "",
@@ -72,6 +92,7 @@ module WorkMd
72
92
  "work_md parse -d=1 -m=5 -y=2000 | get day 1 from month 5 and year 2000",
73
93
  "work_md parse -d=1,2,3 | get day 1, 2 and 3 from the current month and year",
74
94
  "work_md parse -d=1,2 -m=4 | get day 1 and 2 from month 4 and current year",
95
+ "work_md parse -d=1..10 -m=4 | get day 1 to 10 from month 4 and current year",
75
96
  **WorkMd::Cli.error_frame_style
76
97
  )
77
98
  )
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WorkMd
4
+ module Commands
5
+ class Tyesterday
6
+ class << self
7
+ def execute(_argv = [])
8
+ file_names =
9
+ [DateTime.now, Date.today.prev_day].map do |date|
10
+ WorkMd::File.create_if_not_exist(date)
11
+ end
12
+
13
+ WorkMd::File.open_in_editor(file_names: file_names)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -4,7 +4,7 @@ require 'yaml'
4
4
 
5
5
  module WorkMd
6
6
  module Config
7
- DEFAULT_WORK_DIR = Dir.home + '/work_md'
7
+ DEFAULT_WORK_DIR = "#{Dir.home}/work_md"
8
8
  TRANSLATIONS = {
9
9
  'pt' =>
10
10
  {
@@ -12,6 +12,7 @@ module WorkMd
12
12
  meetings: 'Reuniões',
13
13
  interruptions: 'Interrupções',
14
14
  difficulties: 'Dificuldades',
15
+ observations: 'Observações',
15
16
  pomodoros: 'Pomodoros / Ciclos',
16
17
  per_day: 'por dia'
17
18
  },
@@ -21,9 +22,21 @@ module WorkMd
21
22
  meetings: 'Meetings',
22
23
  interruptions: 'Interruptions',
23
24
  difficulties: 'Difficulties',
25
+ observations: 'Observations',
24
26
  pomodoros: 'Pomodoros / Cycles',
25
27
  per_day: 'per day'
28
+ },
29
+ 'es' =>
30
+ {
31
+ tasks: 'Tareas',
32
+ meetings: 'Reuniones',
33
+ interruptions: 'Interrupciones',
34
+ difficulties: 'Dificultades',
35
+ observations: 'Observaciones',
36
+ pomodoros: 'Pomodoros / Ciclos',
37
+ per_day: 'por día'
26
38
  }
39
+
27
40
  }.freeze
28
41
 
29
42
  def self.title
@@ -45,7 +58,7 @@ module WorkMd
45
58
  end
46
59
 
47
60
  def self.yaml_file
48
- YAML.load_file(DEFAULT_WORK_DIR + '/config.yml')
61
+ YAML.load_file("#{DEFAULT_WORK_DIR}/config.yml")
49
62
  rescue StandardError
50
63
  {}
51
64
  end
data/lib/work_md/file.rb CHANGED
@@ -1,47 +1,60 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'byebug'
4
+
3
5
  module WorkMd
4
6
  class File
5
7
  def self.open_or_create(some_date)
8
+ open_in_editor(file_names: [create_if_not_exist(some_date)])
9
+ end
10
+
11
+ def self.create_if_not_exist(some_date)
6
12
  t = WorkMd::Config.translations
7
13
  work_dir = WorkMd::Config.work_dir
8
14
 
15
+ file_name = "#{some_date.strftime('%Y/%m/%d')}.md"
16
+
17
+ return file_name if ::File.exist?("#{work_dir}/#{file_name}")
18
+
9
19
  ::FileUtils
10
20
  .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[:pomodoros]}:\n\n")
30
- f.puts("0\n\n")
31
- end
21
+
22
+ ::File.open(
23
+ "#{work_dir}/#{file_name}",
24
+ 'w+'
25
+ ) do |f|
26
+ # rubocop:disable Layout/LineLength
27
+ f.puts("# #{some_date.strftime('%d/%m/%Y')} - #{WorkMd::Config.title} \n\n")
28
+ # rubocop:enable Layout/LineLength
29
+ f.puts("### #{t[:tasks]}:\n\n")
30
+ f.puts("- [ ]\n\n")
31
+ f.puts("---\n\n")
32
+ f.puts("### #{t[:meetings]}:\n\n")
33
+ f.puts("- [ ]\n\n")
34
+ f.puts("---\n\n")
35
+ f.puts("### #{t[:interruptions]}:\n\n")
36
+ f.puts("---\n\n")
37
+ f.puts("### #{t[:difficulties]}:\n\n")
38
+ f.puts("---\n\n")
39
+ f.puts("### #{t[:observations]}:\n\n")
40
+ f.puts("---\n\n")
41
+ f.puts("### #{t[:pomodoros]}:\n\n")
42
+ f.puts("0\n\n")
32
43
  end
33
44
 
45
+ file_name
46
+ end
47
+
48
+ def self.open_in_editor(file_names: [], dir: nil)
34
49
  editor = WorkMd::Config.editor
50
+ work_dir = dir || WorkMd::Config.work_dir
35
51
 
36
52
  ::FileUtils.cd(work_dir) do
37
- if editor.nil?
38
- ::TTY::Editor.open("#{some_date.strftime('%Y/%m/%d')}.md")
39
- else
40
- ::TTY::Editor.open(
41
- "#{some_date.strftime('%Y/%m/%d')}.md",
42
- command: editor
43
- )
44
- end
53
+ ENV['EDITOR'] = editor unless editor.nil?
54
+
55
+ return ::TTY::Editor.open(file_names[0]) if file_names[1].nil?
56
+
57
+ ::TTY::Editor.open(file_names[0], file_names[1])
45
58
  end
46
59
  end
47
60
  end
@@ -2,6 +2,7 @@
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'
@@ -11,6 +12,7 @@ module WorkMd
11
12
  :meetings,
12
13
  :interruptions,
13
14
  :difficulties,
15
+ :observations,
14
16
  :date,
15
17
  :pomodoros
16
18
  end
@@ -66,21 +68,36 @@ module WorkMd
66
68
  @difficulties ||= @parsed_files.map(&:difficulties).flatten
67
69
  end
68
70
 
71
+ def observations
72
+ raise IS_NOT_FROZEN_ERROR_MESSAGE unless @frozen
73
+
74
+ @observations ||= @parsed_files.map(&:observations).flatten
75
+ end
76
+
69
77
  def average_pomodoros
70
- if @parsed_files.size.positive? && pomodoros.positive?
71
- return (pomodoros / @parsed_files.size)
78
+ if @parsed_files.size.positive? && pomodoros_sum.positive?
79
+ return (pomodoros_sum.to_f / @parsed_files.size).round(1)
72
80
  end
73
81
 
74
82
  0
75
83
  end
76
84
 
77
- def pomodoros
85
+ def pomodoros_sum
78
86
  raise IS_NOT_FROZEN_ERROR_MESSAGE unless @frozen
79
87
 
80
- @pomodoros ||=
88
+ @pomodoros_sum ||=
81
89
  @parsed_files.reduce(0) { |sum, f| sum + f.pomodoros || 0 }
82
90
  end
83
91
 
92
+ def pomodoros_bars
93
+ raise IS_NOT_FROZEN_ERROR_MESSAGE unless @frozen
94
+
95
+ @pomodoros_bars ||=
96
+ @parsed_files.map do |f|
97
+ "(#{f.date}) #{(1..f.pomodoros).map { '◘' }.join}"
98
+ end
99
+ end
100
+
84
101
  def freeze
85
102
  @frozen = true
86
103
  end
@@ -115,7 +132,10 @@ module WorkMd
115
132
  parsed_file.difficulties = parse_list(content).map do |difficulty|
116
133
  "(#{parsed_file.date}) #{difficulty}"
117
134
  end
118
-
135
+ elsif content.start_with?(@t[:observations])
136
+ parsed_file.observations = parse_list(content).map do |observations|
137
+ "(#{parsed_file.date}) #{observations}"
138
+ end
119
139
  elsif content.start_with?(@t[:pomodoros])
120
140
  parsed_file.pomodoros = parse_pomodoro(content)
121
141
  end
@@ -148,5 +168,6 @@ module WorkMd
148
168
  .map(&:strip)
149
169
  end
150
170
  end
171
+ # rubocop:enable Metrics/ClassLength
151
172
  end
152
173
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module WorkMd
4
- VERSION = '0.2.6'
4
+ VERSION = '0.3.0'
5
5
  end
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.6
4
+ version: 0.3.0
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-08-01 00:00:00.000000000 Z
11
+ date: 2021-08-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: tty-box
@@ -51,8 +51,10 @@ files:
51
51
  - bin/work_md
52
52
  - lib/work_md.rb
53
53
  - lib/work_md/cli.rb
54
+ - lib/work_md/commands/config.rb
54
55
  - lib/work_md/commands/parse.rb
55
56
  - lib/work_md/commands/today.rb
57
+ - lib/work_md/commands/tyesterday.rb
56
58
  - lib/work_md/commands/yesterday.rb
57
59
  - lib/work_md/config.rb
58
60
  - lib/work_md/file.rb