rbnotes 0.4.14 → 0.4.19
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/CHANGELOG.md +57 -1
- data/Gemfile.lock +1 -1
- data/LICENSE +1 -1
- data/README.md +47 -2
- data/exe/rbnotes +1 -1
- data/lib/rbnotes/commands.rb +1 -1
- data/lib/rbnotes/commands/add.rb +94 -24
- data/lib/rbnotes/commands/commands.rb +17 -12
- data/lib/rbnotes/commands/import.rb +21 -10
- data/lib/rbnotes/commands/list.rb +69 -32
- data/lib/rbnotes/commands/pick.rb +33 -12
- data/lib/rbnotes/commands/search.rb +34 -2
- data/lib/rbnotes/commands/show.rb +32 -14
- data/lib/rbnotes/commands/statistics.rb +32 -13
- data/lib/rbnotes/commands/update.rb +21 -10
- data/lib/rbnotes/utils.rb +49 -11
- data/lib/rbnotes/version.rb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6b77835e83f5e0d1397d86e19cde13466b02cfb84d211d2521c7180f2e362861
|
4
|
+
data.tar.gz: 28821a8a8b53df64caf1c06baa83d61ffd63ae4a739199971e9d560111fc709f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1aad71bb657dd5c3fd9ec40b493fb3290df4e21a4b333bd8c7bb1cfe0368ae226eff1cee04615fc2f7a5cd7054593de20924d1722e88743d9faf686eb8959298
|
7
|
+
data.tar.gz: 3c4a1631efceb61c11f90cc3c97dcdeeb9a7b8dee3cc5cabb3b5071af9e97ce01296fefba830a346edfdf7fd28a3a6930793b1d09e185c3d0c2615bf73f18d32
|
data/CHANGELOG.md
CHANGED
@@ -5,10 +5,66 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/)
|
|
5
5
|
and this project adheres to [Semantic Versioning](https://semver.org/).
|
6
6
|
|
7
7
|
## [Unreleased]
|
8
|
-
-
|
8
|
+
- (nothing to record here)
|
9
|
+
|
10
|
+
## [0.4.19] - 2021-05-24
|
11
|
+
### Added
|
12
|
+
- Add an option to search in only the subject of each note. (#128)
|
13
|
+
|
14
|
+
### Modified
|
15
|
+
- Update copyright year in `LICENSE`. (#127)
|
16
|
+
|
17
|
+
### Fixed
|
18
|
+
- Fix #129: add description about the keyword, "all."
|
19
|
+
|
20
|
+
## [0.4.18] - 2021-04-29
|
21
|
+
### Added
|
22
|
+
- Use ERB to generate the initial content of a new note from the
|
23
|
+
template file (`add`) (#125)
|
24
|
+
|
25
|
+
### Fixed
|
26
|
+
- Add info about template feature of `add`: (#124)
|
27
|
+
- update help text of `add`,
|
28
|
+
- update `README.md`.
|
29
|
+
- Add description about `ugrep` to `README.md`. (#122)
|
30
|
+
- Fix issue #118: help text of `list` is wrong.
|
31
|
+
- Fix issue #119: a test for `Rbnotes::Utils` may fails.
|
32
|
+
- fix the test.
|
33
|
+
|
34
|
+
## [0.4.17] - 2021-04-21
|
35
|
+
### Added
|
36
|
+
- Change for the `show` command to accept keywords. (#84)
|
37
|
+
- Add `-r` option to the `show` command. (#110)
|
38
|
+
- which specifies to enable "raw" output mode.
|
39
|
+
|
40
|
+
### Fixed
|
41
|
+
- Update the help text for the `list` command. (#112, #113)
|
42
|
+
- Remove trailing spaces. (#108)
|
43
|
+
- Fix minor bugs:
|
44
|
+
- remove redundant use of an instance variable,
|
45
|
+
- change the behavior to exit when no notes found in the repo,
|
46
|
+
- `pick` and `show`
|
47
|
+
- change delimiter line size according to terminal column.
|
48
|
+
- `show`
|
49
|
+
|
50
|
+
## [0.4.16] - 2021-04-17
|
51
|
+
### Added
|
52
|
+
- Add a new configuration setting to change the default behavior of
|
53
|
+
the `list` (and `pick`) command. (#109)
|
54
|
+
|
55
|
+
## [0.4.15] - 2021-04-15
|
56
|
+
### Added
|
57
|
+
- Enable to use delimiters within a timestamp string. (#104)
|
58
|
+
|
59
|
+
### Fixed
|
60
|
+
- Fix issue #105: `list` ignores the 2nd arg when specified `-w`
|
61
|
+
option.
|
9
62
|
|
10
63
|
## [0.4.14] - 2021-04-10
|
64
|
+
### Added
|
11
65
|
- Add `-n` option to `show` command. (#102)
|
66
|
+
|
67
|
+
### Fixed
|
12
68
|
- Fix issue #100: modify to catch Textrepo::MissingTimestampError.
|
13
69
|
|
14
70
|
## [0.4.13] - 2021-03-30
|
data/Gemfile.lock
CHANGED
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -149,6 +149,7 @@ The short-hand notation of the home directory ("~") is usable.
|
|
149
149
|
|
150
150
|
##### Miscellaneous variables (optional)
|
151
151
|
|
152
|
+
- :template : specify a template file for `add` command
|
152
153
|
- :pager : specify a pager program
|
153
154
|
- :editor : specify a editor program
|
154
155
|
- :searcher: specify a program to perform search
|
@@ -170,13 +171,15 @@ don't have to set `:searcher_options` for them.
|
|
170
171
|
| `ggrep` | `["-i", "-n", "-H", "-R", "-E"]` |
|
171
172
|
| `gegrep` | `["-i", "-n", "-H", "-R"]` |
|
172
173
|
| `rg` | `["-S", "-n", "--no-heading", "--color", "never"]` |
|
174
|
+
| `ugrep` | `["-i", "-n", "-H", "-R", "--color=never"]` |
|
173
175
|
|
174
176
|
Those searcher names are used in macOS (with Homebrew). Any other OS
|
175
177
|
might use different names.
|
176
178
|
|
177
179
|
- `grep` and `egrep` -> BSD grep (macOS default)
|
178
|
-
- `ggrep` and `gegrep` -> GNU grep
|
179
|
-
- `rg` -> ripgrep
|
180
|
+
- `ggrep` and `gegrep` -> [GNU grep](https://www.gnu.org/software/grep/)
|
181
|
+
- `rg` -> [BurntSushi/ripgrep](https://github.com/BurntSushi/ripgrep)
|
182
|
+
- `ugrep` -> [Genivia/ugrep](https://github.com/Genivia/ugrep)
|
180
183
|
|
181
184
|
If the name is different, `:searcher_options` should be set with the
|
182
185
|
same value. For example, if you system use the name `gnugrep` as GNU
|
@@ -184,6 +187,48 @@ grep, and you want to use it as the searcher (that is, set `gnugrep`
|
|
184
187
|
to `:searcher`), you should set `:searcher_options` value with `["-i",
|
185
188
|
"-n", "-R", "-E"]`.
|
186
189
|
|
190
|
+
##### Template file for `add` command
|
191
|
+
|
192
|
+
`Add` command always searches a template file in the default
|
193
|
+
directory. The default directory is,
|
194
|
+
|
195
|
+
- `$XDG_CONIFG_HOME/rbnotes/templates` (if `$XDG_CONFIG_HOME` is defined)
|
196
|
+
|
197
|
+
or
|
198
|
+
|
199
|
+
- `$HOME/.config/rbnotes/templates`
|
200
|
+
|
201
|
+
If a file which named as `default.md` is found in the above directory,
|
202
|
+
it will use as a template file to generate the initial content of a
|
203
|
+
new note.
|
204
|
+
|
205
|
+
When a command line option or a setting of the configuration file is
|
206
|
+
specified to use a template file, `add` command will read it instead
|
207
|
+
of the default template file.
|
208
|
+
|
209
|
+
Command line option of `add` to specify a template file is:
|
210
|
+
|
211
|
+
``` shell
|
212
|
+
> rbntoes add -f /somewhere/template.md
|
213
|
+
```
|
214
|
+
|
215
|
+
See the above section about the configuration file setting to specify
|
216
|
+
a template file.
|
217
|
+
|
218
|
+
Though a template file can be written any format of text (markdown,
|
219
|
+
HTML, plain text, or ...), `add` command will process the content
|
220
|
+
using ERB. So, using ERB syntax, you can mix Ruby code in a template
|
221
|
+
file.
|
222
|
+
|
223
|
+
Here is a very simple and short example to use ERB syntax:
|
224
|
+
|
225
|
+
``` markdown
|
226
|
+
## <%= Time.now.strftime("%Y-%m-%d") %>
|
227
|
+
```
|
228
|
+
|
229
|
+
It just insert a date string like "2021-04-29" at the top of a new
|
230
|
+
note which generates by `add` command.
|
231
|
+
|
187
232
|
##### Default values for mandatory variables
|
188
233
|
|
189
234
|
All mandatory variables have their default values. Here is the list
|
data/exe/rbnotes
CHANGED
@@ -21,7 +21,7 @@ class App
|
|
21
21
|
file = args.shift
|
22
22
|
raise ArgumentError, args.unshift(arg) if file.nil?
|
23
23
|
file = File.expand_path(file)
|
24
|
-
raise ArgumentError, "no such file: %s" % file unless FileTest.exist?(file)
|
24
|
+
raise ArgumentError, "no such file: %s" % file unless FileTest.exist?(file)
|
25
25
|
@gopts[:conf_file] = file
|
26
26
|
when "-v", "--version"
|
27
27
|
args.clear
|
data/lib/rbnotes/commands.rb
CHANGED
@@ -192,7 +192,7 @@ string could be used as an argument of some rbnotes commands, such
|
|
192
192
|
"2020-11-06" -> "20201106000000"
|
193
193
|
"20201106" -> "20201106000000"
|
194
194
|
"2020-11-06 16" -> "20201106160000"
|
195
|
-
"2020-11-06 16:51" -> "20201106165100"
|
195
|
+
"2020-11-06 16:51" -> "20201106165100"
|
196
196
|
STAMP
|
197
197
|
end
|
198
198
|
end
|
data/lib/rbnotes/commands/add.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
module Rbnotes::Commands
|
2
2
|
|
3
|
+
require "erb"
|
4
|
+
|
3
5
|
##
|
4
6
|
# Adds a new note to the repository. If no options, a new timestamp
|
5
7
|
# is generated at the execution time, then it is attached to the
|
@@ -16,15 +18,39 @@ module Rbnotes::Commands
|
|
16
18
|
# "202011041722" : year, date and time (omit second part)
|
17
19
|
# "11041722" : date and time (omit year and second part)
|
18
20
|
#
|
21
|
+
# Also accepts an option with `-f FILENAME` (or `--template-file`)
|
22
|
+
# to specify a template file which will be the initial content of a
|
23
|
+
# new note.
|
24
|
+
#
|
19
25
|
# This command starts the external editor program to prepare text to
|
20
26
|
# store. The editor program will be searched in the following order:
|
21
27
|
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
25
|
-
#
|
28
|
+
# 1. conf[:editor] (conf is the 1st arg of execute method)
|
29
|
+
# 2. ENV["EDITOR"]
|
30
|
+
# 3. "nano"
|
31
|
+
# 4. "vi"
|
26
32
|
#
|
27
33
|
# If none of the above editor is available, the command fails.
|
34
|
+
#
|
35
|
+
# TEMPLATE FILE:
|
36
|
+
#
|
37
|
+
# This command search a file as its template which will be the initial
|
38
|
+
# conent of a new note when an option or a setting in the configuration
|
39
|
+
# file (`:template`) is specified a template file.
|
40
|
+
#
|
41
|
+
# Or, even if neither an option nor a setting about a template file is
|
42
|
+
# specified, it always searches the default directory to read a template
|
43
|
+
# file. The directory is:
|
44
|
+
#
|
45
|
+
# - $XDG_CONIFG_HOME/rbnotes/templates (if $XDG_CONFIG_HOME is defined)
|
46
|
+
# or
|
47
|
+
# - $HOME/.config/rbnotes/templates
|
48
|
+
#
|
49
|
+
# If a file, `default.md` exists in the above directory, it will used as
|
50
|
+
# a template.
|
51
|
+
#
|
52
|
+
# A template file can be written in ERB syntax. See ERB manual to know
|
53
|
+
# about how to mix ruby code and text content in ERB syntax.
|
28
54
|
|
29
55
|
class Add < Command
|
30
56
|
|
@@ -34,22 +60,7 @@ module Rbnotes::Commands
|
|
34
60
|
|
35
61
|
def execute(args, conf)
|
36
62
|
@opts = {}
|
37
|
-
|
38
|
-
arg = args.shift
|
39
|
-
case arg
|
40
|
-
when "-t", "--timestamp"
|
41
|
-
stamp_str = args.shift
|
42
|
-
raise ArgumentError, "missing timestamp: %s" % args.unshift(arg) if stamp_str.nil?
|
43
|
-
stamp_str = complement_timestamp_pattern(stamp_str)
|
44
|
-
@opts[:timestamp] = Textrepo::Timestamp.parse_s(stamp_str)
|
45
|
-
when "-f", "--template-file"
|
46
|
-
template_path = args.shift
|
47
|
-
@opts[:template] = template_path
|
48
|
-
else
|
49
|
-
args.unshift(arg)
|
50
|
-
break
|
51
|
-
end
|
52
|
-
end
|
63
|
+
parse_opts(args)
|
53
64
|
|
54
65
|
stamp = @opts[:timestamp] || Textrepo::Timestamp.new(Time.now)
|
55
66
|
|
@@ -93,16 +104,26 @@ usage:
|
|
93
104
|
Add a new note to the repository. If no options, a new timestamp is
|
94
105
|
generated at the execution time, then it is attached to the note.
|
95
106
|
|
107
|
+
OPTIONS:
|
108
|
+
-t, --timestamp STAMP_PATTERN
|
109
|
+
-f, --template-file FILENAME
|
110
|
+
|
96
111
|
Accept an option with `-t STAMP_PATTERN` (or `--timestamp`), a
|
97
|
-
timestamp is generated according to `STAMP_PATTERN`.
|
112
|
+
timestamp of a new note is generated according to `STAMP_PATTERN`.
|
113
|
+
|
114
|
+
Also accepts an option with `-f FILENAME` (or `--template-file`) to
|
115
|
+
specify a template file which will be the initial content of a new
|
116
|
+
note. See below section more about a template file.
|
98
117
|
|
99
|
-
STAMP_PATTERN could be
|
118
|
+
STAMP_PATTERN could be:
|
100
119
|
|
101
120
|
"20201104172230_078" : full qualified timestamp string
|
102
121
|
"20201104172230" : full qualified timestamp string (no suffix)
|
103
122
|
"202011041722" : year, date and time (omit second part)
|
104
123
|
"11041722" : date and time (omit year and second part)
|
105
124
|
|
125
|
+
EDITOR:
|
126
|
+
|
106
127
|
This command starts the external editor program to prepare text to
|
107
128
|
store. The editor program will be searched in the following order:
|
108
129
|
|
@@ -112,11 +133,55 @@ store. The editor program will be searched in the following order:
|
|
112
133
|
4. "vi"
|
113
134
|
|
114
135
|
If none of the above editor is available, the execution fails.
|
136
|
+
|
137
|
+
TEMPLATE FILE:
|
138
|
+
|
139
|
+
This command search a file as its template which will be the initial
|
140
|
+
conent of a new note when an option or a setting in the configuration
|
141
|
+
file (`:template`) is specified a template file.
|
142
|
+
|
143
|
+
Or, even if neither an option nor a setting about a template file is
|
144
|
+
specified, it always searches the default directory to read a template
|
145
|
+
file. The directory is:
|
146
|
+
|
147
|
+
- $XDG_CONIFG_HOME/rbnotes/templates (if $XDG_CONFIG_HOME is defined)
|
148
|
+
|
149
|
+
or
|
150
|
+
|
151
|
+
- $HOME/.config/rbnotes/templates
|
152
|
+
|
153
|
+
If a file, `default.md` exists in the above directory, it will used as
|
154
|
+
a template.
|
155
|
+
|
156
|
+
A template file can be written in ERB syntax. See ERB manual to know
|
157
|
+
about how to mix ruby code and text content in ERB syntax.
|
158
|
+
|
115
159
|
HELP
|
116
160
|
end
|
117
161
|
|
118
162
|
# :stopdoc:
|
163
|
+
|
119
164
|
private
|
165
|
+
|
166
|
+
def parse_opts(args)
|
167
|
+
while args.size > 0
|
168
|
+
arg = args.shift
|
169
|
+
case arg
|
170
|
+
when "-t", "--timestamp"
|
171
|
+
stamp_str = args.shift
|
172
|
+
raise ArgumentError, "missing timestamp: %s" % args.unshift(arg) if stamp_str.nil?
|
173
|
+
stamp_str = complement_timestamp_pattern(stamp_str)
|
174
|
+
@opts[:timestamp] = Textrepo::Timestamp.parse_s(stamp_str)
|
175
|
+
when "-f", "--template-file"
|
176
|
+
template_path = args.shift
|
177
|
+
@opts[:template] = template_path
|
178
|
+
else
|
179
|
+
args.unshift(arg)
|
180
|
+
break
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
120
185
|
def complement_timestamp_pattern(pattern)
|
121
186
|
stamp_str = nil
|
122
187
|
case pattern.to_s.size
|
@@ -138,10 +203,15 @@ HELP
|
|
138
203
|
|
139
204
|
if template_path
|
140
205
|
raise Rbnotes::NoTemplateFileError, template_path unless FileTest.exist?(template_path)
|
141
|
-
template = File.readlines(template_path, chomp: true)
|
142
206
|
else
|
143
207
|
template_path = default_template_file(conf)
|
144
|
-
|
208
|
+
return nil unless FileTest.exist?(template_path)
|
209
|
+
end
|
210
|
+
|
211
|
+
erb_source = File.read(template_path)
|
212
|
+
if erb_source and !erb_source.empty?
|
213
|
+
erb = ERB.new(erb_source)
|
214
|
+
template = erb.result.split("\n")
|
145
215
|
end
|
146
216
|
|
147
217
|
template
|
@@ -12,18 +12,7 @@ module Rbnotes::Commands
|
|
12
12
|
|
13
13
|
def execute(args, conf)
|
14
14
|
@opts = {}
|
15
|
-
|
16
|
-
arg = args.shift
|
17
|
-
case arg.to_s
|
18
|
-
when "" # no options
|
19
|
-
break
|
20
|
-
when "-d", "--deve-commands"
|
21
|
-
@opts[:print_deve_commands] = true
|
22
|
-
else # invalid options or args
|
23
|
-
args.unshift(arg)
|
24
|
-
raise ArgumentError, "invalid option or argument: %s" % args.join(" ")
|
25
|
-
end
|
26
|
-
end
|
15
|
+
parse_opts(args)
|
27
16
|
|
28
17
|
puts commands(@opts[:print_deve_commands]).join(" ")
|
29
18
|
end
|
@@ -42,8 +31,24 @@ HELP
|
|
42
31
|
end
|
43
32
|
|
44
33
|
# :stopdoc:
|
34
|
+
|
45
35
|
private
|
46
36
|
|
37
|
+
def parse_opts(args)
|
38
|
+
while args.size > 0
|
39
|
+
arg = args.shift
|
40
|
+
case arg.to_s
|
41
|
+
when "" # no options
|
42
|
+
break
|
43
|
+
when "-d", "--deve-commands"
|
44
|
+
@opts[:print_deve_commands] = true
|
45
|
+
else # invalid options or args
|
46
|
+
args.unshift(arg)
|
47
|
+
raise ArgumentError, "invalid option or argument: %s" % args.join(" ")
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
47
52
|
##
|
48
53
|
# Enumerates all command names.
|
49
54
|
#
|
@@ -29,16 +29,7 @@ module Rbnotes::Commands
|
|
29
29
|
|
30
30
|
def execute(args, conf)
|
31
31
|
@opts = {}
|
32
|
-
|
33
|
-
arg = args.shift
|
34
|
-
case arg
|
35
|
-
when "-m", "--use-mtime"
|
36
|
-
@opts[:use_mtime] = true
|
37
|
-
else
|
38
|
-
args.unshift(arg)
|
39
|
-
break
|
40
|
-
end
|
41
|
-
end
|
32
|
+
parse_opts(args)
|
42
33
|
|
43
34
|
file = args.shift
|
44
35
|
unless file.nil?
|
@@ -116,5 +107,25 @@ If birthtime is not available on the system, use mtime (modification
|
|
116
107
|
time).
|
117
108
|
HELP
|
118
109
|
end
|
110
|
+
|
111
|
+
# :stopdoc:
|
112
|
+
|
113
|
+
private
|
114
|
+
|
115
|
+
def parse_opts(args)
|
116
|
+
while args.size > 0
|
117
|
+
arg = args.shift
|
118
|
+
case arg
|
119
|
+
when "-m", "--use-mtime"
|
120
|
+
@opts[:use_mtime] = true
|
121
|
+
else
|
122
|
+
args.unshift(arg)
|
123
|
+
break
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
# :startdoc:
|
129
|
+
|
119
130
|
end
|
120
131
|
end
|
@@ -10,13 +10,16 @@ module Rbnotes::Commands
|
|
10
10
|
"List notes"
|
11
11
|
end
|
12
12
|
|
13
|
+
DEFAULT_BEHAVIOR = "today" # :nodoc:
|
14
|
+
|
13
15
|
##
|
14
16
|
# Shows a list of notes in the repository. Arguments are
|
15
17
|
# optional. If several args are passed, each of them must be a
|
16
18
|
# timestamp pattern or a keyword.
|
17
19
|
#
|
18
20
|
# Any order of timestamp patterns and keywords mixture is
|
19
|
-
# acceptable. The redundant patterns are just
|
21
|
+
# acceptable. The redundant patterns or invalid patterns are just
|
22
|
+
# ignored.
|
20
23
|
#
|
21
24
|
# A timestamp pattern is a string which would match several
|
22
25
|
# Timestamp objects. A timestamp is an instance of
|
@@ -30,6 +33,7 @@ module Rbnotes::Commands
|
|
30
33
|
# - "last_week" (or "lw")
|
31
34
|
# - "this_month" (or "tm")
|
32
35
|
# - "last_month" (or "lm")
|
36
|
+
# - "all"
|
33
37
|
#
|
34
38
|
# Here is several examples of timestamp patterns.
|
35
39
|
#
|
@@ -54,38 +58,31 @@ module Rbnotes::Commands
|
|
54
58
|
|
55
59
|
def execute(args, conf)
|
56
60
|
@opts = {}
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
when "-v", "--verbose"
|
63
|
-
@opts[:verbose] = true
|
64
|
-
else
|
65
|
-
args.unshift(arg)
|
66
|
-
break
|
67
|
-
end
|
61
|
+
parse_opts(args)
|
62
|
+
|
63
|
+
if args.empty? and !@opts[:enum_week]
|
64
|
+
default_behavior = conf[:list_default] || DEFAULT_BEHAVIOR
|
65
|
+
args << default_behavior
|
68
66
|
end
|
69
67
|
|
70
68
|
utils = Rbnotes.utils
|
71
69
|
patterns = utils.read_timestamp_patterns(args, enum_week: @opts[:enum_week])
|
72
70
|
|
73
|
-
|
74
|
-
|
71
|
+
repo = Textrepo.init(conf)
|
72
|
+
stamps = utils.find_notes(patterns, repo)
|
75
73
|
output = []
|
76
74
|
if @opts[:verbose]
|
77
|
-
collect_timestamps_by_date(
|
75
|
+
collect_timestamps_by_date(stamps).each { |date, timestamps|
|
78
76
|
output << "#{date} (#{timestamps.size})"
|
79
77
|
timestamps.each { |timestamp|
|
80
78
|
pad = " "
|
81
79
|
output << utils.make_headline(timestamp,
|
82
|
-
|
80
|
+
repo.read(timestamp), pad)
|
83
81
|
}
|
84
82
|
}
|
85
83
|
else
|
86
|
-
|
87
|
-
output << utils.make_headline(timestamp,
|
88
|
-
@repo.read(timestamp))
|
84
|
+
stamps.each { |timestamp|
|
85
|
+
output << utils.make_headline(timestamp, repo.read(timestamp))
|
89
86
|
}
|
90
87
|
end
|
91
88
|
puts output
|
@@ -94,13 +91,39 @@ module Rbnotes::Commands
|
|
94
91
|
def help # :nodoc:
|
95
92
|
puts <<HELP
|
96
93
|
usage:
|
97
|
-
#{Rbnotes::NAME} list [
|
94
|
+
#{Rbnotes::NAME} list [OPTIONS] [STAMP_PATTERN|KEYWORD]
|
98
95
|
|
99
|
-
Show a list of notes. When
|
100
|
-
|
101
|
-
pattern are listed. Instead of STAMP_PATTERN, some KEYWORDs could be
|
96
|
+
Show a list of notes. When specified several STAMP_PATTERNs, only
|
97
|
+
those match the pattern are listed. Also, some KEYWORDs could be
|
102
98
|
used.
|
103
99
|
|
100
|
+
When no STAMP_PATTERN or KEYWORD was specified, the behavior of this
|
101
|
+
command could be specified with a configuration setting,
|
102
|
+
":list_default:". The value must be one of valid keywords. If no
|
103
|
+
settings was also given, this command would behave like "today" was
|
104
|
+
specified as the setting.
|
105
|
+
|
106
|
+
OPTIONS:
|
107
|
+
-v, --verbose
|
108
|
+
-w, --week
|
109
|
+
|
110
|
+
An option "--verbose" is acceptable. It specifies to counts number of
|
111
|
+
notes by each day, then put it with the date before notes. It looks
|
112
|
+
like as follows:
|
113
|
+
|
114
|
+
2021-04-19 (3)
|
115
|
+
20210419134222: Foo
|
116
|
+
20210419120235: Bar
|
117
|
+
20210419110057: Baz
|
118
|
+
2021-04-18 (1)
|
119
|
+
20210418125353: Hoge
|
120
|
+
:
|
121
|
+
|
122
|
+
An option "--week" is also acceptable. It specifies to enumerate all
|
123
|
+
days of a week. Typically, the option is used with a STAMP_PATTERN
|
124
|
+
which specifies a date, such "20201117", then it enumerates all days
|
125
|
+
of the week which contains "17th November 2020".
|
126
|
+
|
104
127
|
STAMP_PATTERN must be:
|
105
128
|
|
106
129
|
(a) full qualified timestamp (with suffix): "20201030160200"
|
@@ -109,6 +132,12 @@ STAMP_PATTERN must be:
|
|
109
132
|
(d) year part only: "2020"
|
110
133
|
(e) date part only: "1030"
|
111
134
|
|
135
|
+
A STAMP_PATTERN other than (a) and (b) causes an error if it was used
|
136
|
+
with "--week" option.
|
137
|
+
|
138
|
+
When no STAMP_PATTERN was specified with "--week" option, the output
|
139
|
+
would be as same as the KEYWORD, "this_week" was specified.
|
140
|
+
|
112
141
|
KEYWORD:
|
113
142
|
|
114
143
|
- "today" (or "to")
|
@@ -117,17 +146,10 @@ KEYWORD:
|
|
117
146
|
- "last_week" (or "lw")
|
118
147
|
- "this_month" (or "tm")
|
119
148
|
- "last_month" (or "lm")
|
149
|
+
- "all"
|
120
150
|
|
121
|
-
|
122
|
-
days of a week. Typically, the option is used with a STAMP_PATTERN
|
123
|
-
which specifies a date, such "20201117", then it enumerates all days
|
124
|
-
of the week which contains "17th November 2020".
|
151
|
+
The keyword, "all" specifies to enumerate all notes in the repository.
|
125
152
|
|
126
|
-
A STAMP_PATTERN other than (a) and (b) causes an error if it was used
|
127
|
-
with "--week" option.
|
128
|
-
|
129
|
-
When no STAMP_PATTERN was specified with "--week" option, the output
|
130
|
-
would be as same as the KEYWORD, "this_week" was specified.
|
131
153
|
HELP
|
132
154
|
end
|
133
155
|
|
@@ -135,6 +157,21 @@ HELP
|
|
135
157
|
|
136
158
|
private
|
137
159
|
|
160
|
+
def parse_opts(args)
|
161
|
+
while args.size > 0
|
162
|
+
arg = args.shift
|
163
|
+
case arg
|
164
|
+
when "-w", "--week"
|
165
|
+
@opts[:enum_week] = true
|
166
|
+
when "-v", "--verbose"
|
167
|
+
@opts[:verbose] = true
|
168
|
+
else
|
169
|
+
args.unshift(arg)
|
170
|
+
break
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
138
175
|
def collect_timestamps_by_date(timestamps)
|
139
176
|
result = {}
|
140
177
|
timestamps.map { |ts|
|
@@ -9,27 +9,28 @@ module Rbnotes::Commands
|
|
9
9
|
"Pick a timestamp with a picker program"
|
10
10
|
end
|
11
11
|
|
12
|
+
DEFAULT_BEHAVIOR = "today" # :nodoc:
|
13
|
+
|
12
14
|
def execute(args, conf)
|
13
15
|
@opts = {}
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
else
|
20
|
-
args.unshift(arg)
|
21
|
-
break
|
22
|
-
end
|
16
|
+
parse_opts(args)
|
17
|
+
|
18
|
+
if args.empty?
|
19
|
+
default_behavior = conf[:list_default] || DEFAULT_BEHAVIOR
|
20
|
+
args << default_behavior
|
23
21
|
end
|
24
22
|
|
25
23
|
utils = Rbnotes.utils
|
26
24
|
patterns = utils.read_timestamp_patterns(args, enum_week: @opts[:enum_week])
|
27
25
|
|
28
|
-
|
26
|
+
repo = Textrepo.init(conf)
|
27
|
+
|
28
|
+
stamps = utils.find_notes(patterns, repo)
|
29
|
+
return if stamps.empty?
|
29
30
|
|
30
31
|
list = []
|
31
|
-
|
32
|
-
list << utils.make_headline(timestamp,
|
32
|
+
stamps.each { |timestamp|
|
33
|
+
list << utils.make_headline(timestamp, repo.read(timestamp))
|
33
34
|
}
|
34
35
|
|
35
36
|
picker = conf[:picker]
|
@@ -61,5 +62,25 @@ is specified, it will behave as same as "list" command.
|
|
61
62
|
|
62
63
|
HELP
|
63
64
|
end
|
65
|
+
|
66
|
+
# :stopdoc:
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def parse_opts(args)
|
71
|
+
while args.size > 0
|
72
|
+
arg = args.shift
|
73
|
+
case arg
|
74
|
+
when "-w", "--week"
|
75
|
+
@opts[:enum_week] = true
|
76
|
+
else
|
77
|
+
args.unshift(arg)
|
78
|
+
break
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
# :startdoc:
|
84
|
+
|
64
85
|
end
|
65
86
|
end
|
@@ -29,6 +29,9 @@ module Rbnotes::Commands
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def execute(args, conf)
|
32
|
+
@opts = {}
|
33
|
+
parse_opts(args)
|
34
|
+
|
32
35
|
pattern = args.shift
|
33
36
|
raise MissingArgumentError, args if pattern.nil?
|
34
37
|
|
@@ -46,11 +49,18 @@ module Rbnotes::Commands
|
|
46
49
|
def help # :nodoc:
|
47
50
|
puts <<HELP
|
48
51
|
usage:
|
49
|
-
#{Rbnotes::NAME} search PATTERN [STAMP_PATTERN]
|
52
|
+
#{Rbnotes::NAME} search [OPTIONS] PATTERN [STAMP_PATTERN]
|
50
53
|
|
51
54
|
PATTERN is a word (or words) to search, it may also be a regular
|
52
55
|
expression.
|
53
56
|
|
57
|
+
OPTIONS:
|
58
|
+
-s, --subject-only
|
59
|
+
|
60
|
+
An option "--subject-only" is acceptable. It specifies to search in
|
61
|
+
only the subject of each note. The subject means the first line of
|
62
|
+
the note text.
|
63
|
+
|
54
64
|
STAMP_PATTERN must be:
|
55
65
|
|
56
66
|
(a) full qualified timestamp (with suffix): "20201030160200"
|
@@ -58,11 +68,25 @@ STAMP_PATTERN must be:
|
|
58
68
|
(c) year and month part: "202010"
|
59
69
|
(d) year part only: "2020"
|
60
70
|
(e) date part only: "1030"
|
71
|
+
|
61
72
|
HELP
|
62
73
|
end
|
63
74
|
|
64
75
|
private
|
65
76
|
|
77
|
+
def parse_opts(args)
|
78
|
+
while args.size > 0
|
79
|
+
arg = args.shift
|
80
|
+
case arg
|
81
|
+
when "-s", "--subject-only"
|
82
|
+
@opts[:subject_only] = true
|
83
|
+
else
|
84
|
+
args.unshift(arg)
|
85
|
+
break
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
66
90
|
# Each entry of search result is:
|
67
91
|
#
|
68
92
|
# [<timestamp>, <line_number>, <matched_text>]
|
@@ -84,6 +108,10 @@ HELP
|
|
84
108
|
}
|
85
109
|
|
86
110
|
def print_search_result(entries)
|
111
|
+
if @opts[:subject_only]
|
112
|
+
entries.select!{|e| e.line_number == 1}
|
113
|
+
end
|
114
|
+
|
87
115
|
maxcol_stamp = entries.map(&:timestamp_size).max
|
88
116
|
maxcol_num = entries.map(&:line_number_digits_size).max
|
89
117
|
|
@@ -91,7 +119,11 @@ HELP
|
|
91
119
|
stamp_display = "%- *s" % [maxcol_stamp, e.timestamp]
|
92
120
|
num_display = "%*d" % [maxcol_num, e.line_number]
|
93
121
|
|
94
|
-
|
122
|
+
if @opts[:subject_only]
|
123
|
+
puts "#{stamp_display}: #{e.matched_text}"
|
124
|
+
else
|
125
|
+
puts "#{stamp_display}: #{num_display}: #{e.matched_text}"
|
126
|
+
end
|
95
127
|
}
|
96
128
|
end
|
97
129
|
|
@@ -1,18 +1,13 @@
|
|
1
1
|
module Rbnotes::Commands
|
2
2
|
|
3
3
|
##
|
4
|
-
# Shows the content of the notes specified by arguments.
|
5
|
-
#
|
6
|
-
#
|
4
|
+
# Shows the content of the notes specified by arguments. Arguments
|
5
|
+
# should be timestamp patterns or keywords. See the document for
|
6
|
+
# the `list` command to know about such arguments.
|
7
7
|
#
|
8
8
|
# Accepts an option with `-n NUMBER` (or `--num-of-lines`), to show
|
9
9
|
# the first NUMBER lines of the content of each note.
|
10
10
|
#
|
11
|
-
# A string for Textrepo::Timestamp must be:
|
12
|
-
#
|
13
|
-
# "20201106112600" : year, date, time and sec
|
14
|
-
# "20201106112600_012" : with suffix
|
15
|
-
#
|
16
11
|
# If no argument is passed, reads the standard input for arguments.
|
17
12
|
# If a specified timestamp does not exist in the repository as a key,
|
18
13
|
# Rbnotes::MissingTimestampError will occur.
|
@@ -26,8 +21,9 @@ module Rbnotes::Commands
|
|
26
21
|
@opts = {}
|
27
22
|
parse_opts(args)
|
28
23
|
|
29
|
-
stamps = Rbnotes.utils.read_multiple_timestamps(args)
|
30
24
|
repo = Textrepo.init(conf)
|
25
|
+
stamps = read_timestamps(args, repo)
|
26
|
+
return if stamps.empty?
|
31
27
|
|
32
28
|
content = stamps.map { |stamp|
|
33
29
|
begin
|
@@ -45,7 +41,7 @@ module Rbnotes::Commands
|
|
45
41
|
}.to_h
|
46
42
|
|
47
43
|
pager = conf[:pager]
|
48
|
-
unless pager.nil?
|
44
|
+
unless pager.nil? or @opts[:raw]
|
49
45
|
puts_with_pager(pager, make_output(content))
|
50
46
|
else
|
51
47
|
puts make_output(content)
|
@@ -55,14 +51,23 @@ module Rbnotes::Commands
|
|
55
51
|
def help # :nodoc:
|
56
52
|
puts <<HELP
|
57
53
|
usage:
|
58
|
-
#{Rbnotes::NAME} show [
|
54
|
+
#{Rbnotes::NAME} show [OPTIONS] [STAMP_PATTERN|KEYWORD...]
|
59
55
|
|
60
|
-
Show the content of given notes.
|
61
|
-
|
56
|
+
Show the content of given notes. It accepts timestamp patterns and
|
57
|
+
keywords like the `list` (or `pick`) command. See the help for the
|
58
|
+
`list` command to know more about stamp patterns and keywords.
|
59
|
+
|
60
|
+
OPTIONS:
|
61
|
+
-n, --num-of-lines NUMBER
|
62
|
+
-r, --raw
|
62
63
|
|
63
64
|
Accept an option with `-n NUMBER` (or `--num-of-lines`), to show the
|
64
65
|
first NUMBER lines of the content of each note.
|
65
66
|
|
67
|
+
Also accepts `-r` (or `--raw`) option to specify to use "raw" output,
|
68
|
+
which means no use any pager, no apply to any process to make output.
|
69
|
+
The behavior is intended to be used within a pipeline.
|
70
|
+
|
66
71
|
The command try to read its argument from the standard input when no
|
67
72
|
argument was passed in the command line.
|
68
73
|
HELP
|
@@ -84,6 +89,8 @@ HELP
|
|
84
89
|
raise ArgumentError, "illegal number (must be greater than 0): %d" % num_of_lines unless num_of_lines > 0
|
85
90
|
|
86
91
|
@opts[:num_of_lines] = num_of_lines
|
92
|
+
when "-r", "--raw"
|
93
|
+
@opts[:raw] = true
|
87
94
|
else
|
88
95
|
args.unshift(arg)
|
89
96
|
break
|
@@ -91,6 +98,17 @@ HELP
|
|
91
98
|
end
|
92
99
|
end
|
93
100
|
|
101
|
+
def read_timestamps(args, repo)
|
102
|
+
utils = Rbnotes.utils
|
103
|
+
if args.empty?
|
104
|
+
stamps = utils.read_multiple_timestamps(args)
|
105
|
+
else
|
106
|
+
patterns = utils.read_timestamp_patterns(args)
|
107
|
+
stamps = utils.find_notes(patterns, repo)
|
108
|
+
end
|
109
|
+
stamps
|
110
|
+
end
|
111
|
+
|
94
112
|
def puts_with_pager(pager, output)
|
95
113
|
require "open3"
|
96
114
|
Open3.pipeline_w(pager) { |stdin|
|
@@ -108,7 +126,7 @@ HELP
|
|
108
126
|
|
109
127
|
_, column = IO.console_size
|
110
128
|
output = content.map { |timestamp, text|
|
111
|
-
ary = [make_heading(timestamp,
|
129
|
+
ary = [make_heading(timestamp, column - 10)]
|
112
130
|
ary.concat(text)
|
113
131
|
ary
|
114
132
|
}
|
@@ -9,20 +9,14 @@ module Rbnotes::Commands
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def execute(args, conf)
|
12
|
+
@opts = {}
|
13
|
+
parse_opts(args)
|
14
|
+
|
12
15
|
report = :total
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
report = :yearly
|
18
|
-
break
|
19
|
-
when "-m", "--monthly"
|
20
|
-
report = :monthly
|
21
|
-
break
|
22
|
-
else
|
23
|
-
args.unshift(arg)
|
24
|
-
raise ArgumentError, "invalid option or argument: %s" % args.join(" ")
|
25
|
-
end
|
16
|
+
if @opts[:yearly]
|
17
|
+
report = :yearly
|
18
|
+
elsif @opts[:monthly]
|
19
|
+
report = :monthly
|
26
20
|
end
|
27
21
|
|
28
22
|
stats = Rbnotes::Statistics.new(conf)
|
@@ -51,5 +45,30 @@ In the version #{Rbnotes::VERSION}, only number of notes is supported.
|
|
51
45
|
HELP
|
52
46
|
end
|
53
47
|
|
48
|
+
# :stopdoc:
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def parse_opts(args)
|
53
|
+
while args.size > 0
|
54
|
+
arg = args.shift
|
55
|
+
case arg
|
56
|
+
when "-y", "--yearly"
|
57
|
+
@opts[:yearly] = true
|
58
|
+
@opts[:monthly] = false
|
59
|
+
break
|
60
|
+
when "-m", "--monthly"
|
61
|
+
@opts[:yearly] = false
|
62
|
+
@opts[:monthly] = true
|
63
|
+
break
|
64
|
+
else
|
65
|
+
args.unshift(arg)
|
66
|
+
raise ArgumentError, "invalid option or argument: %s" % args.join(" ")
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# :startdoc:
|
72
|
+
|
54
73
|
end
|
55
74
|
end
|
@@ -32,16 +32,7 @@ module Rbnotes::Commands
|
|
32
32
|
|
33
33
|
def execute(args, conf)
|
34
34
|
@opts = {}
|
35
|
-
|
36
|
-
arg = args.shift
|
37
|
-
case arg
|
38
|
-
when "-k", "--keep"
|
39
|
-
@opts[:keep_timestamp] = true
|
40
|
-
else
|
41
|
-
args.unshift(arg)
|
42
|
-
break
|
43
|
-
end
|
44
|
-
end
|
35
|
+
parse_opts(args)
|
45
36
|
|
46
37
|
target_stamp = Rbnotes.utils.read_timestamp(args)
|
47
38
|
editor = Rbnotes.utils.find_editor(conf[:editor])
|
@@ -100,5 +91,25 @@ editor program will be searched as same as add command. If none of
|
|
100
91
|
editors is available, the execution fails.
|
101
92
|
HELP
|
102
93
|
end
|
94
|
+
|
95
|
+
# :stopdoc:
|
96
|
+
|
97
|
+
private
|
98
|
+
|
99
|
+
def parse_opts(args)
|
100
|
+
while args.size > 0
|
101
|
+
arg = args.shift
|
102
|
+
case arg
|
103
|
+
when "-k", "--keep"
|
104
|
+
@opts[:keep_timestamp] = true
|
105
|
+
else
|
106
|
+
args.unshift(arg)
|
107
|
+
break
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
# :startdoc:
|
113
|
+
|
103
114
|
end
|
104
115
|
end
|
data/lib/rbnotes/utils.rb
CHANGED
@@ -103,6 +103,19 @@ module Rbnotes
|
|
103
103
|
tmpfile
|
104
104
|
end
|
105
105
|
|
106
|
+
# Acceptable delimiters to separate a timestamp string for human
|
107
|
+
# being to read and input easily.
|
108
|
+
#
|
109
|
+
# Here is some examples:
|
110
|
+
#
|
111
|
+
# - "2021-04-15 15:34:56" -> "20210415153456" (a timestamp string)
|
112
|
+
# - "2020-04-15_15:34:56" -> (same as above)
|
113
|
+
# - "2020-04-15-15-34-56" -> (same as above)
|
114
|
+
# - "2020 04 15 15 34 56" -> (same as above)
|
115
|
+
# - "2020-04-15" -> "20200415" (a timestamp pattern)
|
116
|
+
|
117
|
+
TIMESTAMP_DELIMITERS = /[-:_\s]/
|
118
|
+
|
106
119
|
##
|
107
120
|
# Generates a Textrepo::Timestamp object from a String which comes
|
108
121
|
# from the command line arguments. When no argument is given,
|
@@ -114,6 +127,8 @@ module Rbnotes
|
|
114
127
|
def read_timestamp(args)
|
115
128
|
str = args.shift || read_arg($stdin)
|
116
129
|
raise NoArgumentError if str.nil?
|
130
|
+
|
131
|
+
str = remove_delimiters_from_timestamp_string(str)
|
117
132
|
Textrepo::Timestamp.parse_s(str)
|
118
133
|
end
|
119
134
|
|
@@ -135,7 +150,10 @@ module Rbnotes
|
|
135
150
|
def read_multiple_timestamps(args)
|
136
151
|
strings = args.size < 1 ? read_multiple_args($stdin) : args
|
137
152
|
raise NoArgumentError if (strings.nil? || strings.empty?)
|
138
|
-
strings.uniq.map { |str|
|
153
|
+
strings.uniq.map { |str|
|
154
|
+
str = remove_delimiters_from_timestamp_string(str)
|
155
|
+
Textrepo::Timestamp.parse_s(str)
|
156
|
+
}
|
139
157
|
end
|
140
158
|
|
141
159
|
##
|
@@ -147,11 +165,15 @@ module Rbnotes
|
|
147
165
|
def read_timestamp_patterns(args, enum_week: false)
|
148
166
|
patterns = nil
|
149
167
|
if enum_week
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
168
|
+
args.unshift(Time.now.strftime("%Y%m%d")) if args.size == 0
|
169
|
+
patterns = []
|
170
|
+
while args.size > 0
|
171
|
+
arg = args.shift
|
172
|
+
begin
|
173
|
+
patterns.concat(timestamp_patterns_in_week(arg.dup))
|
174
|
+
rescue InvalidTimestampPatternAsDateError => _e
|
175
|
+
raise InvalidTimestampPatternAsDateError, args.unshift(arg)
|
176
|
+
end
|
155
177
|
end
|
156
178
|
else
|
157
179
|
patterns = expand_keyword_in_args(args)
|
@@ -174,7 +196,13 @@ module Rbnotes
|
|
174
196
|
# timestamp_patterns_in_week(String) -> [Array of Strings]
|
175
197
|
#
|
176
198
|
def timestamp_patterns_in_week(arg)
|
177
|
-
date_str =
|
199
|
+
date_str = nil
|
200
|
+
|
201
|
+
if arg
|
202
|
+
date_str = remove_delimiters_from_timestamp_string(arg)
|
203
|
+
else
|
204
|
+
date_str = Textrepo::Timestamp.now[0, 8]
|
205
|
+
end
|
178
206
|
|
179
207
|
case date_str.size
|
180
208
|
when "yyyymodd".size
|
@@ -220,23 +248,24 @@ module Rbnotes
|
|
220
248
|
# - "last_week" (or "lw")
|
221
249
|
# - "this_month" (or "tm")
|
222
250
|
# - "last_month" (or "lm")
|
251
|
+
# - "all"
|
223
252
|
#
|
224
253
|
# :call-seq:
|
225
254
|
# expand_keyword_in_args(Array of Strings) -> Array of Strings
|
226
255
|
#
|
227
256
|
def expand_keyword_in_args(args)
|
228
|
-
return [nil] if args.empty?
|
229
|
-
|
230
257
|
patterns = []
|
231
258
|
while args.size > 0
|
232
259
|
arg = args.shift
|
233
|
-
if
|
260
|
+
if arg == "all"
|
261
|
+
return [nil]
|
262
|
+
elsif KEYWORDS.include?(arg)
|
234
263
|
patterns.concat(expand_keyword(arg))
|
235
264
|
else
|
236
265
|
patterns << arg
|
237
266
|
end
|
238
267
|
end
|
239
|
-
patterns.sort
|
268
|
+
patterns.uniq.sort
|
240
269
|
end
|
241
270
|
|
242
271
|
##
|
@@ -322,6 +351,15 @@ module Rbnotes
|
|
322
351
|
}.compact
|
323
352
|
end
|
324
353
|
|
354
|
+
def remove_delimiters_from_timestamp_string(stamp_str) # :nodoc:
|
355
|
+
str = stamp_str.gsub(TIMESTAMP_DELIMITERS, "")
|
356
|
+
base_size = "yyyymiddhhmoss".size
|
357
|
+
if str.size > base_size # when suffix is specified
|
358
|
+
str = str[0...base_size] + "_" + str[base_size..-1]
|
359
|
+
end
|
360
|
+
str
|
361
|
+
end
|
362
|
+
|
325
363
|
##
|
326
364
|
# Expands a keyword to timestamp strings.
|
327
365
|
#
|
data/lib/rbnotes/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbnotes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.19
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mnbi
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-05-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: textrepo
|