doing 2.1.21 → 2.1.22

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/.yardoc/checksums +13 -13
  3. data/.yardoc/object_types +0 -0
  4. data/.yardoc/objects/root.dat +0 -0
  5. data/CHANGELOG.md +16 -15
  6. data/Gemfile.lock +1 -1
  7. data/README.md +1 -1
  8. data/Rakefile +4 -2
  9. data/bin/doing +44 -44
  10. data/docs/doc/Array.html +7 -35
  11. data/docs/doc/BooleanTermParser/Clause.html +1 -1
  12. data/docs/doc/BooleanTermParser/Operator.html +1 -1
  13. data/docs/doc/BooleanTermParser/Query.html +1 -1
  14. data/docs/doc/BooleanTermParser/QueryParser.html +1 -1
  15. data/docs/doc/BooleanTermParser/QueryTransformer.html +1 -1
  16. data/docs/doc/BooleanTermParser.html +1 -1
  17. data/docs/doc/Doing/Color.html +1 -1
  18. data/docs/doc/Doing/Completion.html +1 -1
  19. data/docs/doc/Doing/Configuration.html +1 -1
  20. data/docs/doc/Doing/Errors/DoingNoTraceError.html +1 -1
  21. data/docs/doc/Doing/Errors/DoingRuntimeError.html +1 -1
  22. data/docs/doc/Doing/Errors/DoingStandardError.html +1 -1
  23. data/docs/doc/Doing/Errors/EmptyInput.html +1 -1
  24. data/docs/doc/Doing/Errors/NoResults.html +1 -1
  25. data/docs/doc/Doing/Errors/PluginException.html +1 -1
  26. data/docs/doc/Doing/Errors/UserCancelled.html +1 -1
  27. data/docs/doc/Doing/Errors/WrongCommand.html +1 -1
  28. data/docs/doc/Doing/Errors.html +1 -1
  29. data/docs/doc/Doing/Hooks.html +1 -1
  30. data/docs/doc/Doing/Item.html +1 -1
  31. data/docs/doc/Doing/Items.html +1 -1
  32. data/docs/doc/Doing/LogAdapter.html +1 -1
  33. data/docs/doc/Doing/Note.html +1 -1
  34. data/docs/doc/Doing/Pager.html +1 -1
  35. data/docs/doc/Doing/Plugins.html +1 -1
  36. data/docs/doc/Doing/Prompt.html +5 -5
  37. data/docs/doc/Doing/Section.html +1 -1
  38. data/docs/doc/Doing/TemplateString.html +2 -2
  39. data/docs/doc/Doing/Util/Backup.html +1 -1
  40. data/docs/doc/Doing/Util.html +1 -1
  41. data/docs/doc/Doing/WWID.html +1 -1
  42. data/docs/doc/Doing.html +4 -4
  43. data/docs/doc/GLI/Commands/MarkdownDocumentListener.html +1 -1
  44. data/docs/doc/GLI/Commands.html +1 -1
  45. data/docs/doc/GLI.html +1 -1
  46. data/docs/doc/Hash.html +76 -4
  47. data/docs/doc/Numeric.html +1 -1
  48. data/docs/doc/PhraseParser/Operator.html +1 -1
  49. data/docs/doc/PhraseParser/PhraseClause.html +1 -1
  50. data/docs/doc/PhraseParser/Query.html +1 -1
  51. data/docs/doc/PhraseParser/QueryParser.html +1 -1
  52. data/docs/doc/PhraseParser/QueryTransformer.html +1 -1
  53. data/docs/doc/PhraseParser/TermClause.html +1 -1
  54. data/docs/doc/PhraseParser.html +1 -1
  55. data/docs/doc/Status.html +1 -1
  56. data/docs/doc/String.html +63 -1
  57. data/docs/doc/Symbol.html +1 -1
  58. data/docs/doc/Time.html +1 -1
  59. data/docs/doc/_index.html +20 -13
  60. data/docs/doc/class_list.html +1 -1
  61. data/docs/doc/file.README.html +2 -2
  62. data/docs/doc/index.html +2 -2
  63. data/docs/doc/method_list.html +238 -214
  64. data/docs/doc/top-level-namespace.html +1 -92
  65. data/doing.rdoc +12 -7
  66. data/lib/doing/array.rb +5 -4
  67. data/lib/doing/array_chronify.rb +4 -3
  68. data/lib/doing/configuration.rb +1 -1
  69. data/lib/doing/hash.rb +21 -3
  70. data/lib/doing/item.rb +2 -2
  71. data/lib/doing/log_adapter.rb +1 -1
  72. data/lib/doing/pager.rb +1 -1
  73. data/lib/doing/plugins/export/template_export.rb +8 -2
  74. data/lib/doing/prompt.rb +4 -2
  75. data/lib/doing/string.rb +10 -1
  76. data/lib/doing/template_string.rb +7 -0
  77. data/lib/doing/types.rb +20 -16
  78. data/lib/doing/version.rb +1 -1
  79. data/lib/doing/wwid.rb +3 -9
  80. data/lib/doing.rb +1 -0
  81. data/lib/helpers/threaded_tests.rb +73 -50
  82. metadata +2 -2
@@ -91,97 +91,6 @@
91
91
 
92
92
  </p>
93
93
 
94
-
95
- <h2>
96
- Constant Summary
97
- <small><a href="#" class="constants_summary_toggle">collapse</a></small>
98
- </h2>
99
-
100
- <dl class="constants">
101
-
102
- <dt id="REGEX_BOOL-constant" class="">REGEX_BOOL =
103
-
104
- </dt>
105
- <dd><pre class="code"><span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$</span><span class='regexp_end'>/i</span></span></pre></dd>
106
-
107
- <dt id="REGEX_SORT_ORDER-constant" class="">REGEX_SORT_ORDER =
108
-
109
- </dt>
110
- <dd><pre class="code"><span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>^(?:a(?:sc)?|d(?:esc)?)$</span><span class='regexp_end'>/i</span></span></pre></dd>
111
-
112
- <dt id="REGEX_VALUE_QUERY-constant" class="">REGEX_VALUE_QUERY =
113
-
114
- </dt>
115
- <dd><pre class="code"><span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>^(?:!)?@?(?:\S+) +(?:!?[&lt;&gt;=][=*]?|[$*^]=) +(?:.*?)$</span><span class='regexp_end'>/</span></span></pre></dd>
116
-
117
- <dt id="REGEX_CLOCK-constant" class="">REGEX_CLOCK =
118
-
119
- </dt>
120
- <dd><pre class="code"><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>(?:\d{1,2}+(?::\d{1,2}+)?(?: *(?:am|pm))?|midnight|noon)</span><span class='tstring_end'>&#39;</span></span></pre></dd>
121
-
122
- <dt id="REGEX_TIME-constant" class="">REGEX_TIME =
123
-
124
- </dt>
125
- <dd><pre class="code"><span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>^</span><span class='embexpr_beg'>#{</span><span class='const'><span class='object_link'><a href="top-level-namespace.html#REGEX_CLOCK-constant" title="REGEX_CLOCK (constant)">REGEX_CLOCK</a></span></span><span class='embexpr_end'>}</span><span class='tstring_content'>$</span><span class='regexp_end'>/i</span></span></pre></dd>
126
-
127
- <dt id="REGEX_DAY-constant" class="">REGEX_DAY =
128
-
129
- </dt>
130
- <dd><pre class="code"><span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>^(mon|tue|wed|thur?|fri|sat|sun)(\w+(day)?)?$</span><span class='regexp_end'>/i</span></span></pre></dd>
131
-
132
- <dt id="REGEX_RANGE_INDICATOR-constant" class="">REGEX_RANGE_INDICATOR =
133
-
134
- </dt>
135
- <dd><pre class="code"><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'> +(?:to|through|thru|(?:un)?til|-+) +</span><span class='tstring_end'>&#39;</span></span></pre></dd>
136
-
137
- <dt id="REGEX_RANGE-constant" class="">REGEX_RANGE =
138
-
139
- </dt>
140
- <dd><pre class="code"><span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>^\S+</span><span class='embexpr_beg'>#{</span><span class='const'><span class='object_link'><a href="top-level-namespace.html#REGEX_RANGE_INDICATOR-constant" title="REGEX_RANGE_INDICATOR (constant)">REGEX_RANGE_INDICATOR</a></span></span><span class='embexpr_end'>}</span><span class='tstring_content'>+\S+</span><span class='regexp_end'>/i</span></span></pre></dd>
141
-
142
- <dt id="REGEX_TIME_RANGE-constant" class="">REGEX_TIME_RANGE =
143
-
144
- </dt>
145
- <dd><pre class="code"><span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>^</span><span class='embexpr_beg'>#{</span><span class='const'><span class='object_link'><a href="top-level-namespace.html#REGEX_CLOCK-constant" title="REGEX_CLOCK (constant)">REGEX_CLOCK</a></span></span><span class='embexpr_end'>}</span><span class='embexpr_beg'>#{</span><span class='const'><span class='object_link'><a href="top-level-namespace.html#REGEX_RANGE_INDICATOR-constant" title="REGEX_RANGE_INDICATOR (constant)">REGEX_RANGE_INDICATOR</a></span></span><span class='embexpr_end'>}</span><span class='embexpr_beg'>#{</span><span class='const'><span class='object_link'><a href="top-level-namespace.html#REGEX_CLOCK-constant" title="REGEX_CLOCK (constant)">REGEX_CLOCK</a></span></span><span class='embexpr_end'>}</span><span class='tstring_content'>$</span><span class='regexp_end'>/i</span></span></pre></dd>
146
-
147
- <dt id="InvalidExportType-constant" class="">InvalidExportType =
148
-
149
- </dt>
150
- <dd><pre class="code"><span class='const'>Class</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='const'>RuntimeError</span><span class='rparen'>)</span></pre></dd>
151
-
152
- <dt id="MissingConfigFile-constant" class="">MissingConfigFile =
153
-
154
- </dt>
155
- <dd><pre class="code"><span class='const'>Class</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='const'>RuntimeError</span><span class='rparen'>)</span></pre></dd>
156
-
157
- <dt id="TagArray-constant" class="">TagArray =
158
-
159
- </dt>
160
- <dd><pre class="code"><span class='const'>Class</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='const'><span class='object_link'><a href="Array.html" title="Array (class)">Array</a></span></span><span class='rparen'>)</span></pre></dd>
161
-
162
- <dt id="DateBeginString-constant" class="">DateBeginString =
163
-
164
- </dt>
165
- <dd><pre class="code"><span class='const'>Class</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='const'>DateTime</span><span class='rparen'>)</span></pre></dd>
166
-
167
- <dt id="DateEndString-constant" class="">DateEndString =
168
-
169
- </dt>
170
- <dd><pre class="code"><span class='const'>Class</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='const'>DateTime</span><span class='rparen'>)</span></pre></dd>
171
-
172
- <dt id="DateRangeString-constant" class="">DateRangeString =
173
-
174
- </dt>
175
- <dd><pre class="code"><span class='const'>Class</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='const'><span class='object_link'><a href="Array.html" title="Array (class)">Array</a></span></span><span class='rparen'>)</span></pre></dd>
176
-
177
- <dt id="DateIntervalString-constant" class="">DateIntervalString =
178
-
179
- </dt>
180
- <dd><pre class="code"><span class='const'>Class</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='const'>DateTime</span><span class='rparen'>)</span></pre></dd>
181
-
182
- </dl>
183
-
184
-
185
94
 
186
95
 
187
96
 
@@ -193,7 +102,7 @@
193
102
  </div>
194
103
 
195
104
  <div id="footer">
196
- Generated on Thu Jan 20 12:10:33 2022 by
105
+ Generated on Fri Jan 21 14:53:33 2022 by
197
106
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
198
107
  0.9.27 (ruby-3.0.1).
199
108
  </div>
data/doing.rdoc CHANGED
@@ -5,7 +5,7 @@ record of what you've been doing, complete with tag-based time tracking. The
5
5
  command line tool allows you to add entries, annotate with tags and notes, and
6
6
  view your entries with myriad options, with a focus on a "natural" language syntax.
7
7
 
8
- v2.1.21
8
+ v2.1.22
9
9
 
10
10
  === Global Options
11
11
  === --config_file arg
@@ -32,7 +32,7 @@ Verbose output
32
32
 
33
33
 
34
34
 
35
- === --[no-]default
35
+ === --default
36
36
  Answer yes/no menus with default option
37
37
 
38
38
 
@@ -528,7 +528,7 @@ Update default config file, adding any missing keys
528
528
 
529
529
 
530
530
  [Default Command] edit
531
- ==== Command: <tt>done|did ENTRY</tt>
531
+ ==== Command: <tt>done|did [ENTRY]</tt>
532
532
  Add a completed item with @done(date). No argument finishes last entry
533
533
 
534
534
  Use this command to add an entry after you've already finished it. It will be immediately marked as @done.
@@ -612,7 +612,7 @@ Finish last entry not already marked @done
612
612
 
613
613
 
614
614
 
615
- ==== Command: <tt>finish COUNT</tt>
615
+ ==== Command: <tt>finish [COUNT]</tt>
616
616
  Mark last X entries as @done
617
617
 
618
618
  Marks the last X entries with a @done tag and current date. Does not alter already completed entries.
@@ -1165,7 +1165,7 @@ Force exact search string matching (case sensitive)
1165
1165
 
1166
1166
 
1167
1167
 
1168
- ==== Command: <tt>meanwhile ENTRY</tt>
1168
+ ==== Command: <tt>meanwhile [ENTRY]</tt>
1169
1169
  Finish any running @meanwhile tasks and optionally create a new one
1170
1170
 
1171
1171
  The @meanwhile tag allows you to have long-running entries that encompass smaller entries.
@@ -1209,7 +1209,7 @@ Edit entry with vim
1209
1209
 
1210
1210
 
1211
1211
 
1212
- ==== Command: <tt>note NOTE_TEXT</tt>
1212
+ ==== Command: <tt>note [NOTE_TEXT]</tt>
1213
1213
  Add a note to the last entry
1214
1214
 
1215
1215
  If -r is provided with no other arguments, the last note is removed.
@@ -1473,7 +1473,7 @@ Show intervals with totals at the end of output
1473
1473
 
1474
1474
 
1475
1475
 
1476
- ==== Command: <tt>reset|begin DATE_STRING</tt>
1476
+ ==== Command: <tt>reset|begin [DATE_STRING]</tt>
1477
1477
  Reset the start time of an entry
1478
1478
 
1479
1479
  Update the start time of the last entry or the last entry matching a tag/search filter.
@@ -1530,6 +1530,11 @@ Select from a menu of matching entries
1530
1530
 
1531
1531
 
1532
1532
 
1533
+ ===== -n
1534
+ Change start date but do not remove @done (shortcut for --no-resume)
1535
+
1536
+
1537
+
1533
1538
  ===== --not
1534
1539
  Reset items that *don't* match search/tag filters
1535
1540
 
data/lib/doing/array.rb CHANGED
@@ -11,17 +11,18 @@ module Doing
11
11
  ## @return [Array] array of strings
12
12
  ##
13
13
  def tags_to_array
14
- map { |t| t.sub(/^@/, '') }
14
+ map(&:remove_at)
15
15
  end
16
16
 
17
17
  # Convert strings to @tags
18
18
  #
19
- # @example `['one', '@two', 'three'].to_tags`
20
- # @example `=> ['@one', '@two', '@three']`
21
19
  # @return [Array] Array of @tags
22
20
  #
21
+ # @example
22
+ # ['one', '@two', 'three'].to_tags
23
+ # # => ['@one', '@two', '@three']
23
24
  def to_tags
24
- map { |t| t.sub(/^@?/, '@') }
25
+ map(&:add_at)
25
26
  end
26
27
 
27
28
  def to_tags!
@@ -6,9 +6,10 @@ module Doing
6
6
  ##
7
7
  ## Format [d, h, m] as string
8
8
  ##
9
- ## @param time [Array] Array of [days, hours,
10
- ## minutes]
11
- ## @param format [Symbol] The format, :dhm, :hm, :m, :clock, :natural
9
+ ## @accept [Array] Array of [days, hours, minutes]
10
+ ##
11
+ ## @param format [Symbol] The format, :dhm, :hm,
12
+ ## :m, :clock, :natural
12
13
  ## @return [String] formatted string
13
14
  ##
14
15
  def time_string(format: :dhm)
@@ -160,7 +160,7 @@ module Doing
160
160
  def choose_config(create: false)
161
161
  return @config_file if @force_answer
162
162
 
163
- if @additional_configs.count.positive? || create
163
+ if @additional_configs&.count&.positive? || create
164
164
  choices = [@config_file].concat(@additional_configs)
165
165
  choices.push('Create a new .doingrc in the current directory') if create && !File.exist?('.doingrc')
166
166
  res = Doing::Prompt.choose_from(choices.uniq.sort.reverse,
data/lib/doing/hash.rb CHANGED
@@ -6,14 +6,32 @@ module Doing
6
6
  ##
7
7
  ## Freeze all values in a hash
8
8
  ##
9
- ## @return { description_of_the_return_value }
9
+ ## @return Hash with all values frozen
10
10
  ##
11
11
  def deep_freeze
12
- map { |k, v| v.is_a?(Hash) ? v.deep_freeze : v.freeze }.freeze
12
+ chilled = {}
13
+ each do |k, v|
14
+ chilled[k] = v.is_a?(Hash) ? v.deep_freeze : v.freeze
15
+ end
16
+
17
+ chilled.freeze
13
18
  end
14
19
 
15
20
  def deep_freeze!
16
- replace deep_freeze
21
+ replace deep_thaw.deep_freeze
22
+ end
23
+
24
+ def deep_thaw
25
+ chilled = {}
26
+ each do |k, v|
27
+ chilled[k] = v.is_a?(Hash) ? v.deep_thaw : v.dup
28
+ end
29
+
30
+ chilled.dup
31
+ end
32
+
33
+ def deep_thaw!
34
+ replace deep_thaw
17
35
  end
18
36
 
19
37
  # Turn all keys into string
data/lib/doing/item.rb CHANGED
@@ -633,8 +633,8 @@ module Doing
633
633
  end
634
634
 
635
635
  def split_tags(tags)
636
- tags = tags.split(/ *, */) if tags.is_a? String
637
- tags.map { |t| t.strip.add_at }
636
+ tags = tags.to_tags if tags.is_a? String
637
+ tags.map(&:remove_at)
638
638
  end
639
639
  end
640
640
  end
@@ -356,7 +356,7 @@ module Doing
356
356
  next if data[:count].zero?
357
357
 
358
358
  count = data[:count]
359
- tags = data[:tag] ? data[:tag].uniq.map { |t| "@#{t}".cyan }.join(', ') : 'tags'
359
+ tags = data[:tag] ? data[:tag].uniq.map { |t| t.add_at.cyan }.join(', ') : 'tags'
360
360
  topic, m = format_counter(key, data)
361
361
  message = m.dup
362
362
  message.sub!(/%count/, count.to_s)
data/lib/doing/pager.rb CHANGED
@@ -54,7 +54,7 @@ module Doing
54
54
  read_io.close
55
55
  write_io.write(text)
56
56
  write_io.close
57
- rescue SystemCallError => e
57
+ rescue SystemCallError # => e
58
58
  # raise Errors::DoingStandardError, "Pager error, #{e}"
59
59
  end
60
60
 
@@ -49,6 +49,8 @@ module Doing
49
49
  note = []
50
50
  end
51
51
 
52
+ placeholders['tags'] = item.tags
53
+
52
54
  placeholders['date'] = item.date.strftime(opt[:format])
53
55
 
54
56
  interval = wwid.get_interval(item, record: true, formatted: false) if opt[:times]
@@ -56,8 +58,10 @@ module Doing
56
58
  interval = case opt[:interval_format].to_sym
57
59
  when :human
58
60
  interval.time_string(format: :hm)
59
- else
61
+ when :text
60
62
  interval.time_string(format: :clock)
63
+ else
64
+ interval.time_string(format: opt[:interval_format].to_sym)
61
65
  end
62
66
  end
63
67
 
@@ -69,8 +73,10 @@ module Doing
69
73
  duration = case opt[:interval_format].to_sym
70
74
  when :human
71
75
  duration.time_string(format: :hm)
72
- else
76
+ when :text
73
77
  duration.time_string(format: :clock)
78
+ else
79
+ duration.time_string(format: opt[:interval_format].to_sym)
74
80
  end
75
81
  end
76
82
  duration ||= ''
data/lib/doing/prompt.rb CHANGED
@@ -42,7 +42,7 @@ module Doing
42
42
  end
43
43
  end
44
44
 
45
- def read_lines(prompt: 'Enter text', completions: [])
45
+ def read_lines(prompt: 'Enter text', completions: [], default_response: '')
46
46
  $stdin.reopen('/dev/tty')
47
47
  return default_response if @default_answer
48
48
 
@@ -72,8 +72,10 @@ module Doing
72
72
  res.join("\n").strip
73
73
  end
74
74
 
75
- def request_lines(prompt: 'Enter text')
75
+ def request_lines(prompt: 'Enter text', default_response: '')
76
76
  $stdin.reopen('/dev/tty')
77
+ return default_response if @default_answer
78
+
77
79
  ask_note = []
78
80
  reader = TTY::Reader.new(interrupt: -> { raise Errors::UserCancelled }, track_history: false)
79
81
  puts "#{boldgreen(prompt.sub(/:?$/, ':'))} #{yellow('Hit return for a new line, ')}#{boldwhite('enter a blank line (')}#{boldyellow('return twice')}#{boldwhite(') to end editing')}"
data/lib/doing/string.rb CHANGED
@@ -458,7 +458,16 @@ module Doing
458
458
  ## @return [String] @string
459
459
  ##
460
460
  def add_at
461
- strip.sub(/^([+-]*)@/, '\1')
461
+ strip.sub(/^([+-]*)@?/, '\1@')
462
+ end
463
+
464
+ ##
465
+ ## Removes @ prefix if needed, maintains +/- prefix
466
+ ##
467
+ ## @return [String] string without @ prefix
468
+ ##
469
+ def remove_at
470
+ strip.sub(/^([+-]*)@?/, '\1')
462
471
  end
463
472
 
464
473
  ##
@@ -146,6 +146,13 @@ module Doing
146
146
  end
147
147
  indent ||= placeholder =~ /^title/ ? '' : "\t"
148
148
  prefix = m['prefix']
149
+
150
+ if placeholder =~ /^tags/
151
+ prefix ||= ''
152
+ value = value.map { |t| "#{prefix}#{t.sub(/^#{prefix}?/, '')}" }.join(' ')
153
+ prefix = ''
154
+ end
155
+
149
156
  if placeholder =~ /^title/
150
157
  color = last_color + color
151
158
 
data/lib/doing/types.rb CHANGED
@@ -1,19 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- REGEX_BOOL = /^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$/i
4
- REGEX_SORT_ORDER = /^(?:a(?:sc)?|d(?:esc)?)$/i
5
- REGEX_VALUE_QUERY = /^(?:!)?@?(?:\S+) +(?:!?[<>=][=*]?|[$*^]=) +(?:.*?)$/
6
- REGEX_CLOCK = '(?:\d{1,2}+(?::\d{1,2}+)?(?: *(?:am|pm))?|midnight|noon)'
7
- REGEX_TIME = /^#{REGEX_CLOCK}$/i
8
- REGEX_DAY = /^(mon|tue|wed|thur?|fri|sat|sun)(\w+(day)?)?$/i
9
- REGEX_RANGE_INDICATOR = ' +(?:to|through|thru|(?:un)?til|-+) +'
10
- REGEX_RANGE = /^\S+#{REGEX_RANGE_INDICATOR}+\S+/i
11
- REGEX_TIME_RANGE = /^#{REGEX_CLOCK}#{REGEX_RANGE_INDICATOR}#{REGEX_CLOCK}$/i
3
+ module Doing
4
+ module Types
5
+ REGEX_BOOL = /^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$/i.freeze
6
+ REGEX_SORT_ORDER = /^(?:a(?:sc)?|d(?:esc)?)$/i.freeze
7
+ REGEX_VALUE_QUERY = /^(?:!)?@?(?:\S+) +(?:!?[<>=][=*]?|[$*^]=) +(?:.*?)$/.freeze
8
+ REGEX_CLOCK = '(?:\d{1,2}+(?::\d{1,2}+)?(?: *(?:am|pm))?|midnight|noon)'
9
+ REGEX_TIME = /^#{REGEX_CLOCK}$/i.freeze
10
+ REGEX_DAY = /^(mon|tue|wed|thur?|fri|sat|sun)(\w+(day)?)?$/i.freeze
11
+ REGEX_RANGE_INDICATOR = ' +(?:to|through|thru|(?:un)?til|-+) +'
12
+ REGEX_RANGE = /^\S+#{REGEX_RANGE_INDICATOR}+\S+/i.freeze
13
+ REGEX_TIME_RANGE = /^#{REGEX_CLOCK}#{REGEX_RANGE_INDICATOR}#{REGEX_CLOCK}$/i.freeze
12
14
 
13
- InvalidExportType = Class.new(RuntimeError)
14
- MissingConfigFile = Class.new(RuntimeError)
15
- TagArray = Class.new(Array)
16
- DateBeginString = Class.new(DateTime)
17
- DateEndString = Class.new(DateTime)
18
- DateRangeString = Class.new(Array)
19
- DateIntervalString = Class.new(DateTime)
15
+ InvalidExportType = Class.new(RuntimeError)
16
+ MissingConfigFile = Class.new(RuntimeError)
17
+ TagArray = Class.new(Array)
18
+ DateBeginString = Class.new(DateTime)
19
+ DateEndString = Class.new(DateTime)
20
+ DateRangeString = Class.new(Array)
21
+ DateIntervalString = Class.new(DateTime)
22
+ end
23
+ end
data/lib/doing/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Doing
2
- VERSION = '2.1.21'
2
+ VERSION = '2.1.22'
3
3
  end
data/lib/doing/wwid.rb CHANGED
@@ -657,14 +657,8 @@ module Doing
657
657
  opt[:time_filter] = [nil, nil]
658
658
  if opt[:from] && !opt[:date_filter]
659
659
  if opt[:from][0].is_a?(String) && opt[:from][0] =~ time_rx
660
- time_start, time_end = opt[:from]
661
- elsif opt[:from].is_a?(Time)
662
- start, finish = opt[:from]
663
- end
664
-
665
- if time_start
666
- opt[:time_filter] = [time_start, time_end]
667
- else
660
+ opt[:time_filter] = opt[:from]
661
+ elsif opt[:from][0].is_a?(Time)
668
662
  opt[:date_filter] = opt[:from]
669
663
  end
670
664
  end
@@ -1622,6 +1616,7 @@ module Doing
1622
1616
  'duration' => @config['duration'],
1623
1617
  'interval_format' => @config['interval_format']
1624
1618
  }, { extend_existing_arrays: true, sort_merged_arrays: true })
1619
+
1625
1620
  opt[:duration] ||= cfg['duration'] || false
1626
1621
  opt[:interval_format] ||= cfg['interval_format'] || 'text'
1627
1622
  opt[:count] ||= 0
@@ -2307,7 +2302,6 @@ EOS
2307
2302
 
2308
2303
  section_items = @content.in_section(section)
2309
2304
  max = section_items.count - count.to_i
2310
- moved_items = []
2311
2305
 
2312
2306
  counter = 0
2313
2307
 
data/lib/doing.rb CHANGED
@@ -24,6 +24,7 @@ require 'tty-reader'
24
24
  require 'tty-screen'
25
25
 
26
26
  require_relative 'doing/hash'
27
+ require_relative 'doing/types'
27
28
  require_relative 'doing/colors'
28
29
  require_relative 'doing/template_string'
29
30
  require_relative 'doing/string'
@@ -58,10 +58,10 @@ end
58
58
  class ThreadedTests
59
59
  include Doing::Color
60
60
 
61
- def run(pattern: '*', max_threads: 24, max_tests: 0)
61
+ def run(pattern: '*', max_threads: 8, max_tests: 0)
62
62
  start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
63
63
 
64
- max_threads = 24 if max_threads == 0
64
+ max_threads = 1000 if max_threads == 0
65
65
 
66
66
  c = Doing::Color
67
67
  c.coloring = true
@@ -91,11 +91,12 @@ class ThreadedTests
91
91
  progress = TTY::ProgressBar::Multi.new(banner,
92
92
  width: 12,
93
93
  hide_cursor: true)
94
- children = []
94
+ @children = []
95
95
  tests.each do |t|
96
96
  test_name = File.basename(t, '.rb').sub(/doing_(.*?)_test/, '\1')
97
- new_sp = progress.register("[#{':bar'.cyan}] #{test_name.bold.white}:status", total: 2, width: 1, head: '.', hide_cursor: true)
98
- children.push([test_name, new_sp, nil])
97
+ new_sp = progress.register("[#{':bar'.cyan}] #{test_name.bold.white}:status",
98
+ total: 2, width: 1, head: '.', hide_cursor: true, clear: true)
99
+ @children.push([test_name, new_sp, nil])
99
100
  end
100
101
 
101
102
  @elapsed = 0.0
@@ -103,57 +104,20 @@ class ThreadedTests
103
104
  @assrt_total = 0
104
105
  @error_out = []
105
106
  # progress.start
107
+ @threads = []
106
108
 
107
109
  begin
108
- while children.count.positive?
109
- threads = []
110
- slices = children.slice!(0, max_threads)
110
+ while @children.count.positive?
111
+
112
+ slices = @children.slice!(0, max_threads)
111
113
  slices.each { |c| c[1].start }
112
114
  slices.each do |s|
113
- bar = s[1]
114
- bar.advance(status: ": #{'running'.green}")
115
-
116
- threads << Thread.new do
117
- out, _err, status = Open3.capture3(ENV, 'rake', "test:#{s[0]}", stdin_data: nil)
118
- unless status.success?
119
- m = out.match(/(?<fail>\d+) failures, (?<err>\d+) errors/)
120
- status = ": #{m['fail'].bold.red} #{'failures'.red}, #{m['err'].bold.red} #{'errors'.red}"
121
- bar.update(head: '✖'.boldred)
122
- bar.advance(head: '✖'.boldred, status: status)
123
-
124
- # errs = out.scan(/(?:Failure|Error): [\w_]+\((?:.*?)\):(?:.*?)(?=\n=======)/m)
125
- @error_out.push(out.highlight_errors)
126
- bar.finish
127
-
128
- Thread.exit
129
- end
130
-
131
- time = out.match(/^Finished in (?<time>\d+\.\d+) seconds\./)
132
- count = out.match(/^(?<tests>\d+) tests, (?<assrt>\d+) assertions, (?<fails>\d+) failures, (?<errs>\d+) errors/)
133
- status = [
134
- ': ',
135
- count['tests'].green,
136
- '/',
137
- count['assrt'].cyan,
138
- # ' (',
139
- # count['fails'].to_i == 0 ? '-'.dark.white.reset : count['fails'].bold.red,
140
- # '/',
141
- # count['errs'].to_i == 0 ? '-'.dark.white.reset : count['errs'].bold.red,
142
- # ') ',
143
- ' ',
144
- time['time'].to_f.round(3).to_s.yellow,
145
- 's'
146
- ].join('')
147
- bar.update(head: '✔'.boldgreen)
148
- bar.advance(head: '✔'.boldgreen, status: status)
149
- @test_total += count['tests'].to_i
150
- @assrt_total += count['assrt'].to_i
151
- @elapsed += time['time'].to_f
152
-
153
- bar.finish
115
+ @threads << Thread.new do
116
+ run_test(s)
154
117
  end
155
118
  end
156
- threads.each { |t| t.join }
119
+
120
+ @threads.each { |t| t.join }
157
121
  end
158
122
 
159
123
  finish_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
@@ -176,6 +140,65 @@ class ThreadedTests
176
140
  progress.stop
177
141
  end
178
142
  end
143
+
144
+ def run_test(s)
145
+ bar = s[1]
146
+ bar.advance(status: ": #{'running'.green}")
147
+
148
+ out, _err, status = Open3.capture3(ENV, 'rake', "test:#{s[0]}", stdin_data: nil)
149
+ unless status.success?
150
+ m = out.match(/(?<fail>\d+) failures, (?<err>\d+) errors/)
151
+ status = ": #{m['fail'].bold.red} #{'failures'.red}, #{m['err'].bold.red} #{'errors'.red}"
152
+ bar.update(head: '✖'.boldred)
153
+ bar.advance(head: '✖'.boldred, status: status)
154
+
155
+ # errs = out.scan(/(?:Failure|Error): [\w_]+\((?:.*?)\):(?:.*?)(?=\n=======)/m)
156
+ @error_out.push(out.highlight_errors)
157
+ bar.finish
158
+
159
+ next_test
160
+ Thread.exit
161
+ end
162
+
163
+ time = out.match(/^Finished in (?<time>\d+\.\d+) seconds\./)
164
+ count = out.match(/^(?<tests>\d+) tests, (?<assrt>\d+) assertions, (?<fails>\d+) failures, (?<errs>\d+) errors/)
165
+ status = [
166
+ ': ',
167
+ count['tests'].green,
168
+ '/',
169
+ count['assrt'].cyan,
170
+ # ' (',
171
+ # count['fails'].to_i == 0 ? '-'.dark.white.reset : count['fails'].bold.red,
172
+ # '/',
173
+ # count['errs'].to_i == 0 ? '-'.dark.white.reset : count['errs'].bold.red,
174
+ # ') ',
175
+ ' ',
176
+ time['time'].to_f.round(3).to_s.yellow,
177
+ 's'
178
+ ].join('')
179
+ bar.update(head: '✔'.boldgreen)
180
+ bar.advance(head: '✔'.boldgreen, status: status)
181
+ @test_total += count['tests'].to_i
182
+ @assrt_total += count['assrt'].to_i
183
+ @elapsed += time['time'].to_f
184
+
185
+ bar.finish
186
+
187
+ next_test
188
+ end
189
+
190
+ def next_test
191
+ if @children.count.positive?
192
+ t = Thread.new do
193
+ s = @children.shift
194
+ # s[1].start
195
+ # s[1].advance(status: ": #{'running'.green}")
196
+ run_test(s)
197
+ end
198
+
199
+ t.join
200
+ end
201
+ end
179
202
  end
180
203
 
181
204
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: doing
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.21
4
+ version: 2.1.22
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brett Terpstra
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-20 00:00:00.000000000 Z
11
+ date: 2022-01-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: safe_yaml