rbnotes 0.4.2 → 0.4.3
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 +9 -1
- data/Gemfile.lock +1 -1
- data/exe/rbnotes +10 -1
- data/lib/rbnotes.rb +2 -0
- data/lib/rbnotes/commands.rb +161 -59
- data/lib/rbnotes/commands/add.rb +40 -0
- data/lib/rbnotes/commands/delete.rb +24 -12
- data/lib/rbnotes/commands/export.rb +58 -0
- data/lib/rbnotes/commands/help.rb +98 -0
- data/lib/rbnotes/commands/import.rb +39 -2
- data/lib/rbnotes/commands/list.rb +27 -3
- data/lib/rbnotes/commands/search.rb +25 -2
- data/lib/rbnotes/commands/show.rb +33 -2
- data/lib/rbnotes/commands/update.rb +35 -16
- data/lib/rbnotes/version.rb +2 -2
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f48ac5666d917964e9c103c11be86b12736b81ced6e072be4707e1e943b6ff76
|
4
|
+
data.tar.gz: d29b9b68d6ebfcfdc7289962405a0390daed2705cd80b3beb50e036d2f8d9e85
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f5be0687fc189a5dad6178104a05af0f64e35fc44dd1a73bf677a232038b81b4f88e5562ca9f9e8f098152136c005ebdc334158d34652c0fe7a2bea8e13c4056
|
7
|
+
data.tar.gz: a1e5d671d93ff9efdbe33e7c6751984f851c39756304df7c874fe82df558b18b7f4f716d82253e99b2d8e21cc1d795d6b81c0f1ba665f8f3e99e38c30e4d19d8
|
data/CHANGELOG.md
CHANGED
@@ -7,11 +7,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
|
|
7
7
|
## [Unreleased]
|
8
8
|
Nothing to record here.
|
9
9
|
|
10
|
+
## [0.4.3] - 2020-11-08
|
11
|
+
### Added
|
12
|
+
- Add a new command `export` to write out a note into a file (#51)
|
13
|
+
- Add individual help for each command. (#42)
|
14
|
+
|
15
|
+
### Fixed
|
16
|
+
- Fix `add` fails without modification (#48)
|
17
|
+
|
10
18
|
## [0.4.2] - 2020-11-05
|
11
19
|
### Added
|
12
20
|
- Add a feature to keep the timestamp in `update` command. (#44)
|
13
21
|
|
14
|
-
###
|
22
|
+
### Fixed
|
15
23
|
- Fix issue #45: hanging up of `add` command.
|
16
24
|
|
17
25
|
## [0.4.1] - 2020-11-04
|
data/Gemfile.lock
CHANGED
data/exe/rbnotes
CHANGED
@@ -23,6 +23,14 @@ class App
|
|
23
23
|
file = File.expand_path(file)
|
24
24
|
raise ArgumentError, "no such file: %s" % file unless FileTest.exist?(file)
|
25
25
|
@gopts[:conf_file] = file
|
26
|
+
when "-v", "--version"
|
27
|
+
args.clear
|
28
|
+
args.unshift("version")
|
29
|
+
break
|
30
|
+
when "-h", "--help"
|
31
|
+
args.clear
|
32
|
+
args.unshift("help")
|
33
|
+
break
|
26
34
|
else
|
27
35
|
args.unshift(arg)
|
28
36
|
break
|
@@ -43,7 +51,8 @@ begin
|
|
43
51
|
rescue MissingArgumentError, MissingTimestampError,
|
44
52
|
NoEditorError, ProgramAbortError,
|
45
53
|
Textrepo::InvalidTimestampStringError,
|
46
|
-
ArgumentError
|
54
|
+
ArgumentError,
|
55
|
+
Errno::EACCES => e
|
47
56
|
puts e.message
|
48
57
|
exit 1
|
49
58
|
end
|
data/lib/rbnotes.rb
CHANGED
data/lib/rbnotes/commands.rb
CHANGED
@@ -1,14 +1,21 @@
|
|
1
1
|
module Rbnotes
|
2
|
+
|
2
3
|
##
|
3
4
|
# This module defines all command classes of rbnotes. Each command
|
4
5
|
# class must be derived from Rbnotes::Commands::Command class.
|
5
6
|
|
6
7
|
module Commands
|
8
|
+
|
7
9
|
##
|
8
10
|
# The base class for a command class.
|
9
11
|
|
10
12
|
class Command
|
11
13
|
|
14
|
+
##
|
15
|
+
# Short description of each command.
|
16
|
+
|
17
|
+
def description; nil; end
|
18
|
+
|
12
19
|
##
|
13
20
|
# :call-seq:
|
14
21
|
# execute(Array, Hash) -> nil
|
@@ -17,8 +24,17 @@ module Rbnotes
|
|
17
24
|
# - Hash : rbnotes configuration
|
18
25
|
|
19
26
|
def execute(args, conf)
|
20
|
-
Builtins
|
27
|
+
Builtins.default_cmd.new.execute(args, conf)
|
21
28
|
end
|
29
|
+
|
30
|
+
##
|
31
|
+
# Shows the help message for the command.
|
32
|
+
#
|
33
|
+
|
34
|
+
def help
|
35
|
+
Builtins::Usage.new.execute(nil, nil)
|
36
|
+
end
|
37
|
+
|
22
38
|
end
|
23
39
|
|
24
40
|
# :stopdoc:
|
@@ -29,71 +45,73 @@ module Rbnotes
|
|
29
45
|
# - stamp: converts given TIME_STR into a timestamp.
|
30
46
|
# - time: converts given STAMP into a time string.
|
31
47
|
module Builtins
|
32
|
-
class
|
33
|
-
def execute(_, _)
|
34
|
-
puts <<USAGE
|
35
|
-
usage:
|
36
|
-
rbnotes [-c|--conf CONF_FILE] [command] [args]
|
37
|
-
|
38
|
-
option:
|
39
|
-
-c, --conf [CONF_FILE] : specifiy the configuration file
|
40
|
-
|
41
|
-
CONF_FILE must be written in YAML. To know about details of the
|
42
|
-
configuration file, see README.md or Wiki page.
|
43
|
-
|
44
|
-
command:
|
45
|
-
add : create a new note
|
46
|
-
import FILE : import a FILE into the repository
|
48
|
+
class Usage < Command
|
47
49
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
STAMP_PATTERN must be:
|
52
|
-
|
53
|
-
(a) full qualified timestamp (with suffix): "20201030160200"
|
54
|
-
(b) year and date part: "20201030"
|
55
|
-
(c) year and month part: "202010"
|
56
|
-
(d) year part only: "2020"
|
57
|
-
(e) date part only: "1030"
|
58
|
-
|
59
|
-
PATTERN is a word (or words) to search, it may also be a regular
|
60
|
-
expression.
|
61
|
-
|
62
|
-
show [STAMP] : show the note specified with STAMP
|
63
|
-
update [STAMP] : edit the note with external editor
|
64
|
-
delete [STAMP] : delete the note specified with STAMP
|
65
|
-
|
66
|
-
STAMP must be a sequence of digits to represent year, date and
|
67
|
-
time (and suffix), such "20201030160200" or "20201030160200_012".
|
68
|
-
|
69
|
-
show/update/delete reads its argument from the standard input when
|
70
|
-
no argument was passed in the command line.
|
50
|
+
def description
|
51
|
+
"Print usage"
|
52
|
+
end
|
71
53
|
|
72
|
-
|
73
|
-
|
54
|
+
def execute(_, _)
|
55
|
+
puts <<USAGE
|
56
|
+
Syntax:
|
57
|
+
#{Rbnotes::NAME} [-c| --conf CONF_FILE] [command] [args]
|
58
|
+
|
59
|
+
Example usage:
|
60
|
+
#{Rbnotes::NAME} add [-t STAMP_PATTERN]
|
61
|
+
#{Rbnotes::NAME} delete [TIMESTAMP]
|
62
|
+
#{Rbnotes::NAME} export [TIMESTAMP [FILENAME]]
|
63
|
+
#{Rbnotes::NAME} import FILE
|
64
|
+
#{Rbnotes::NAME} list [STAMP_PATTERN]
|
65
|
+
#{Rbnotes::NAME} search PATTERN [STAMP_PATTERN]
|
66
|
+
#{Rbnotes::NAME} show [TIMESTAMP]
|
67
|
+
#{Rbnotes::NAME} update [TIMESTAMP]
|
68
|
+
|
69
|
+
Further help for each command:
|
70
|
+
#{Rbnotes::NAME} help commands
|
71
|
+
#{Rbnotes::NAME} help [COMMAND]
|
72
|
+
|
73
|
+
Further information:
|
74
|
+
https://github.com/mnbi/rbnotes/wiki
|
74
75
|
|
75
|
-
|
76
|
-
|
77
|
-
repo : print the repository path
|
78
|
-
stamp TIME_STR : convert TIME_STR into a timestamp
|
79
|
-
time STAMP : convert STAMP into a time string
|
76
|
+
USAGE
|
77
|
+
end
|
80
78
|
|
81
|
-
|
82
|
-
|
79
|
+
def help
|
80
|
+
puts <<HELP_USAGE
|
81
|
+
usage:
|
82
|
+
#{Rbnotes::NAME} usage
|
83
83
|
|
84
|
-
|
84
|
+
Print a short example of usage.
|
85
|
+
HELP_USAGE
|
85
86
|
end
|
86
87
|
end
|
87
88
|
|
88
89
|
class Version < Command
|
90
|
+
def description
|
91
|
+
"Print version"
|
92
|
+
end
|
93
|
+
|
89
94
|
def execute(_, _)
|
90
|
-
rbnotes_version = "
|
95
|
+
rbnotes_version = "#{Rbnotes::NAME} #{Rbnotes::VERSION} (#{Rbnotes::RELEASE})"
|
91
96
|
textrepo_version = "textrepo #{Textrepo::VERSION}"
|
92
97
|
puts "#{rbnotes_version} [#{textrepo_version}]"
|
93
98
|
end
|
99
|
+
|
100
|
+
def help
|
101
|
+
puts <<VERSION
|
102
|
+
usage:
|
103
|
+
#{Rbnotes::NAME} version
|
104
|
+
|
105
|
+
Print version of #{Rbnotes::NAME} and release date.
|
106
|
+
VERSION
|
107
|
+
end
|
94
108
|
end
|
95
109
|
|
96
110
|
class Repo < Command
|
111
|
+
def description
|
112
|
+
"Print repository path"
|
113
|
+
end
|
114
|
+
|
97
115
|
def execute(_, conf)
|
98
116
|
name = conf[:repository_name]
|
99
117
|
base = conf[:repository_base]
|
@@ -106,19 +124,49 @@ USAGE
|
|
106
124
|
File.join(base, name)
|
107
125
|
end
|
108
126
|
end
|
127
|
+
|
128
|
+
def help
|
129
|
+
puts <<REPO
|
130
|
+
usage:
|
131
|
+
#{Rbnotes::NAME} repo
|
132
|
+
|
133
|
+
Print the path of the repository. The type of the path entity depends
|
134
|
+
on what type is specified to the repository type in the configuration.
|
135
|
+
When ":file_system" is set to "repository_type", the path is a
|
136
|
+
directory which contains all note files. The structure of the
|
137
|
+
directory depends on the implementation of `textrepo`.
|
138
|
+
REPO
|
139
|
+
end
|
109
140
|
end
|
110
141
|
|
111
142
|
class Conf < Command
|
143
|
+
def description
|
144
|
+
"Print the current configuration"
|
145
|
+
end
|
146
|
+
|
112
147
|
def execute(_, conf)
|
113
148
|
conf.keys.sort.each { |k|
|
114
149
|
puts "#{k}=#{conf[k]}"
|
115
150
|
}
|
116
151
|
end
|
152
|
+
|
153
|
+
def help
|
154
|
+
puts <<CONF
|
155
|
+
usage:
|
156
|
+
#{Rbnotes::NAME} conf
|
157
|
+
|
158
|
+
Print the current configuration values.
|
159
|
+
CONF
|
160
|
+
end
|
117
161
|
end
|
118
162
|
|
119
163
|
require "time"
|
120
164
|
|
121
165
|
class Stamp < Command
|
166
|
+
def description
|
167
|
+
"Convert a time string into a timestamp string"
|
168
|
+
end
|
169
|
+
|
122
170
|
def execute(args, _)
|
123
171
|
time_str = args.shift
|
124
172
|
unless time_str.nil?
|
@@ -128,9 +176,30 @@ USAGE
|
|
128
176
|
super
|
129
177
|
end
|
130
178
|
end
|
179
|
+
|
180
|
+
def help
|
181
|
+
puts <<STAMP
|
182
|
+
usage:
|
183
|
+
#{Rbnotes::NAME} stamp
|
184
|
+
|
185
|
+
Convert a given time string into a timestamp string. The timestamp
|
186
|
+
string could be used as an argument of some rbnotes commands, such
|
187
|
+
"show". Here is short example of conversion:
|
188
|
+
|
189
|
+
"2020-11-06 16:51:15" -> "20201106165115"
|
190
|
+
"2020-11-06" -> "20201106000000"
|
191
|
+
"20201106" -> "20201106000000"
|
192
|
+
"2020-11-06 16" -> "20201106160000"
|
193
|
+
"2020-11-06 16:51" -> "20201106165100"
|
194
|
+
STAMP
|
195
|
+
end
|
131
196
|
end
|
132
197
|
|
133
198
|
class Time < Command
|
199
|
+
def description
|
200
|
+
"Convert a timestamp into a time string"
|
201
|
+
end
|
202
|
+
|
134
203
|
def execute(args, _)
|
135
204
|
stamp = args.shift
|
136
205
|
unless stamp.nil?
|
@@ -140,12 +209,41 @@ USAGE
|
|
140
209
|
super
|
141
210
|
end
|
142
211
|
end
|
212
|
+
|
213
|
+
def help
|
214
|
+
puts <<TIME
|
215
|
+
usage:
|
216
|
+
#{Rbnotes::NAME} time
|
217
|
+
|
218
|
+
Convert a given timestamp string into a time string. Here is short
|
219
|
+
example of conversion:
|
220
|
+
|
221
|
+
"20201106165115" -> "2020-11-06 16:51:15 +0900"
|
222
|
+
"202011061651" -> "2020-11-06 16:51:00 +0900"
|
223
|
+
"2020110616" -> "2020-11-06 16:00:00 +0900"
|
224
|
+
"20201106" -> "2020-11-06 00:00:00 +0900"
|
225
|
+
TIME
|
226
|
+
end
|
143
227
|
end
|
144
228
|
|
145
|
-
|
146
|
-
|
229
|
+
class << self
|
230
|
+
def default_cmd_name
|
231
|
+
"usage"
|
232
|
+
end
|
233
|
+
|
234
|
+
def default_cmd
|
235
|
+
Usage
|
236
|
+
end
|
147
237
|
|
148
|
-
|
238
|
+
def command(name)
|
239
|
+
begin
|
240
|
+
const_defined?(name, false) ? const_get(name, false) : nil
|
241
|
+
rescue NameError => _
|
242
|
+
nil
|
243
|
+
end
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|
149
247
|
|
150
248
|
# :startdoc:
|
151
249
|
|
@@ -156,24 +254,28 @@ USAGE
|
|
156
254
|
# of the class.
|
157
255
|
#
|
158
256
|
# :call-seq:
|
257
|
+
# load("add") -> Rbnotes::Commands::Add
|
258
|
+
# load("delete") -> Rbnotes::Commands::Delete
|
259
|
+
# load("export") -> Rbnotes::Commands::Export
|
260
|
+
# load("help") -> Rbnotes::Commands::Help
|
159
261
|
# load("import") -> Rbnotes::Commnads::Import
|
160
262
|
# load("list") -> Rbnotes::Commands::List
|
263
|
+
# load("search") -> Rbnotes::Commands::Search
|
161
264
|
# load("show") -> Rbnotes::Commands::Show
|
265
|
+
# load("update") -> Rbnotes::Commands::Update
|
162
266
|
|
163
267
|
def load(cmd_name)
|
164
|
-
cmd_name ||=
|
268
|
+
cmd_name ||= Builtins.default_cmd_name
|
165
269
|
klass_name = cmd_name.capitalize
|
166
270
|
|
167
|
-
klass =
|
168
|
-
if
|
169
|
-
klass = Builtins::const_get(klass_name, false)
|
170
|
-
else
|
271
|
+
klass = Builtins.command(klass_name)
|
272
|
+
if klass.nil?
|
171
273
|
begin
|
172
274
|
require_relative "commands/#{cmd_name}"
|
173
275
|
klass = const_get(klass_name, false)
|
174
276
|
rescue LoadError => _
|
175
277
|
STDERR.puts "unknown command: #{cmd_name}"
|
176
|
-
klass = Builtins
|
278
|
+
klass = Builtins.default_cmd
|
177
279
|
end
|
178
280
|
end
|
179
281
|
klass.new
|
data/lib/rbnotes/commands/add.rb
CHANGED
@@ -29,6 +29,10 @@ module Rbnotes::Commands
|
|
29
29
|
class Add < Command
|
30
30
|
include ::Rbnotes::Utils
|
31
31
|
|
32
|
+
def description # :nodoc:
|
33
|
+
"Add a new note"
|
34
|
+
end
|
35
|
+
|
32
36
|
def execute(args, conf)
|
33
37
|
@opts = {}
|
34
38
|
while args.size > 0
|
@@ -52,6 +56,12 @@ module Rbnotes::Commands
|
|
52
56
|
raise Rbnotes::NoEditorError, candidates if editor.nil?
|
53
57
|
|
54
58
|
tmpfile = run_with_tmpfile(editor, stamp.to_s)
|
59
|
+
|
60
|
+
unless FileTest.exist?(tmpfile)
|
61
|
+
puts "Cancel adding, since nothing to store"
|
62
|
+
return
|
63
|
+
end
|
64
|
+
|
55
65
|
text = File.readlines(tmpfile)
|
56
66
|
|
57
67
|
repo = Textrepo.init(conf)
|
@@ -72,6 +82,36 @@ module Rbnotes::Commands
|
|
72
82
|
end
|
73
83
|
end
|
74
84
|
|
85
|
+
def help # :nodoc:
|
86
|
+
puts <<HELP
|
87
|
+
usage:
|
88
|
+
#{Rbnotes::NAME} add [(-t|--timestamp) STAMP_PATTERN]
|
89
|
+
|
90
|
+
Add a new note to the repository. If no options, a new timestamp is
|
91
|
+
generated at the execution time, then it is attached to the note.
|
92
|
+
|
93
|
+
Accept an option with `-t STAMP_PATTERN` (or `--timestamp`), a
|
94
|
+
timestamp is generated according to `STAMP_PATTERN`.
|
95
|
+
|
96
|
+
STAMP_PATTERN could be one of followings:
|
97
|
+
|
98
|
+
"20201104172230_078" : full qualified timestamp string
|
99
|
+
"20201104172230" : full qualified timestamp string (no suffix)
|
100
|
+
"202011041722" : year, date and time (omit second part)
|
101
|
+
"11041722" : date and time (omit year and second part)
|
102
|
+
|
103
|
+
This command starts the external editor program to prepare text to
|
104
|
+
store. The editor program will be searched in the following order:
|
105
|
+
|
106
|
+
1. configuration setting of ":editor"
|
107
|
+
2. ENV["EDITOR"]
|
108
|
+
3. "nano"
|
109
|
+
4. "vi"
|
110
|
+
|
111
|
+
If none of the above editor is available, the execution fails.
|
112
|
+
HELP
|
113
|
+
end
|
114
|
+
|
75
115
|
# :stopdoc:
|
76
116
|
private
|
77
117
|
def complement_timestamp_pattern(pattern)
|
@@ -1,18 +1,17 @@
|
|
1
|
-
|
1
|
+
module Rbnotes::Commands
|
2
2
|
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
# It does nothing when the specified note does not exist except to
|
10
|
-
# print error message.
|
3
|
+
# Deletes a given note in the repository. The timestamp string must
|
4
|
+
# be a fully qualified one, like "20201016165130". If no argument
|
5
|
+
# was passed, it would try to read from the standard input.
|
6
|
+
#
|
7
|
+
# It does nothing to change the repository when the specified note
|
8
|
+
# does not exist.
|
11
9
|
|
12
|
-
|
10
|
+
class Delete < Command
|
11
|
+
def description # :nodoc:
|
12
|
+
"Delete a note"
|
13
|
+
end
|
13
14
|
|
14
|
-
module Rbnotes
|
15
|
-
class Commands::Delete < Commands::Command
|
16
15
|
def execute(args, conf)
|
17
16
|
stamp = Rbnotes::Utils.read_timestamp(args)
|
18
17
|
|
@@ -27,5 +26,18 @@ module Rbnotes
|
|
27
26
|
puts "Delete [%s]" % stamp.to_s
|
28
27
|
end
|
29
28
|
end
|
29
|
+
|
30
|
+
def help # :nodoc:
|
31
|
+
puts <<HELP
|
32
|
+
usage:
|
33
|
+
#{Rbnotes::NAME} delete [TIMESTAMP]
|
34
|
+
|
35
|
+
Delete a given note. TIMESTAMP must be a fully qualified one, such
|
36
|
+
"20201016165130" or "20201016165130_012" if it has a suffix.
|
37
|
+
|
38
|
+
Delete reads its argument from the standard input when no argument was
|
39
|
+
passed in the command line.
|
40
|
+
HELP
|
41
|
+
end
|
30
42
|
end
|
31
43
|
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require "pathname"
|
2
|
+
|
3
|
+
module Rbnotes::Commands
|
4
|
+
|
5
|
+
##
|
6
|
+
# Writes out a given note into a specified file. The file will be
|
7
|
+
# created in the current working directory unless an absolute path
|
8
|
+
# is specified as a filename.
|
9
|
+
#
|
10
|
+
# When no argument was passed, would try to read a timestamp string
|
11
|
+
# from the standard input.
|
12
|
+
|
13
|
+
class Export < Command
|
14
|
+
|
15
|
+
def description # :nodoc:
|
16
|
+
"Write out a note into a file"
|
17
|
+
end
|
18
|
+
|
19
|
+
#
|
20
|
+
# :call-seq:
|
21
|
+
# execute([a String as timestring], Rbnotes::Conf or Hash) -> nil
|
22
|
+
|
23
|
+
def execute(args, conf)
|
24
|
+
stamp = Rbnotes::Utils.read_timestamp(args)
|
25
|
+
|
26
|
+
repo = Textrepo.init(conf)
|
27
|
+
begin
|
28
|
+
content = repo.read(stamp)
|
29
|
+
rescue Textrepo::MissingTimestampError => _
|
30
|
+
raise MissingTimestampError, stamp
|
31
|
+
end
|
32
|
+
|
33
|
+
pathname = Pathname.new(args.shift || "#{stamp}.md")
|
34
|
+
pathname.parent.mkpath
|
35
|
+
pathname.open("w"){ |f| f.puts content }
|
36
|
+
puts "Export a note [%s] into a file [%s]" % [stamp, pathname]
|
37
|
+
end
|
38
|
+
|
39
|
+
def help # :nodoc:
|
40
|
+
puts <<HELP
|
41
|
+
usage:
|
42
|
+
#{Rbnotes::NAME} export [TIMESTAMP [FILENAME]]
|
43
|
+
|
44
|
+
Write out a given note into a specified file. TIMESTAMP must be a
|
45
|
+
fully qualified one, such "20201108141600", or "20201108141600_012" if
|
46
|
+
it has a suffix. FILENAME is optional. When it omitted, the filename
|
47
|
+
would be a timestamp string with ".md" as its extension, such
|
48
|
+
"20201108141600.md"
|
49
|
+
|
50
|
+
The file will be created into the current working directory unless an
|
51
|
+
absolute path is specified as FILENAME.
|
52
|
+
|
53
|
+
When no argument was passed, it would try to read a timestamp string
|
54
|
+
from the standard input. Then, FILENAME would be regarded as omitted.
|
55
|
+
HELP
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
module Rbnotes::Commands
|
2
|
+
|
3
|
+
##
|
4
|
+
# Shows help message for the command which specifies with the
|
5
|
+
# argument.
|
6
|
+
|
7
|
+
class Help < Command
|
8
|
+
|
9
|
+
def description # :nodoc:
|
10
|
+
"Provide help on each command"
|
11
|
+
end
|
12
|
+
|
13
|
+
##
|
14
|
+
# :call-seq:
|
15
|
+
# execute(["add"], Rbnotes::Conf or Hash) -> nil
|
16
|
+
# execute(["delete"], Rbnotes::Conf or Hash) -> nil
|
17
|
+
|
18
|
+
def execute(args, conf)
|
19
|
+
cmd_name = args.shift
|
20
|
+
case cmd_name
|
21
|
+
when nil
|
22
|
+
self.help
|
23
|
+
when "commands"
|
24
|
+
print_commands
|
25
|
+
else
|
26
|
+
Commands.load(cmd_name).help
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def help # :nodoc:
|
31
|
+
puts <<HELP
|
32
|
+
#{Rbnotes::NAME.capitalize} is a simple tool to write a note into a single repository.
|
33
|
+
|
34
|
+
When creates a new note, a timestamp is attached to the note. #{Rbnotes::NAME.capitalize}
|
35
|
+
manages notes with those timestamps, such update, delete, ...etc.
|
36
|
+
|
37
|
+
Timestamp is a series of digits which represents year, date, and time.
|
38
|
+
It looks like "20201106121100", means "2020-11-06 12:11:00". It is
|
39
|
+
generated in the local time.
|
40
|
+
|
41
|
+
usage:
|
42
|
+
#{Rbnotes::NAME} [option] [command] [args]
|
43
|
+
|
44
|
+
option:
|
45
|
+
-c, --conf [CONF_FILE] : specifiy the configuration file
|
46
|
+
-v, --version : print version
|
47
|
+
-h, --help : show this message
|
48
|
+
|
49
|
+
CONF_FILE must be written in YAML. To know about details of the
|
50
|
+
configuration file, see README.md or Wiki page.
|
51
|
+
|
52
|
+
Further help:
|
53
|
+
#{Rbnotes::NAME} help commands
|
54
|
+
#{Rbnotes::NAME} help COMMAND
|
55
|
+
#{Rbnotes::NAME} usage
|
56
|
+
|
57
|
+
Further information:
|
58
|
+
https://github.com/mnbi/rbnotes/wiki
|
59
|
+
HELP
|
60
|
+
end
|
61
|
+
|
62
|
+
# :stopdoc:
|
63
|
+
private
|
64
|
+
|
65
|
+
def print_commands
|
66
|
+
Dir.glob("*.rb", :base => __dir__) { |rb|
|
67
|
+
next if rb == "help.rb"
|
68
|
+
require_relative rb
|
69
|
+
}
|
70
|
+
commands = Commands.constants.difference([:Builtins, :Command])
|
71
|
+
builtins = Commands::Builtins.constants
|
72
|
+
|
73
|
+
puts "#{Rbnotes::NAME.capitalize} Commands:"
|
74
|
+
print_commands_desc(commands.sort)
|
75
|
+
puts
|
76
|
+
puts "for development purpose"
|
77
|
+
print_builtins_desc(builtins.sort)
|
78
|
+
end
|
79
|
+
|
80
|
+
def print_commands_desc(commands)
|
81
|
+
print_desc(Commands, commands)
|
82
|
+
end
|
83
|
+
|
84
|
+
def print_builtins_desc(builtins)
|
85
|
+
print_desc(Commands::Builtins, builtins)
|
86
|
+
end
|
87
|
+
|
88
|
+
def print_desc(mod, commands)
|
89
|
+
commands.map { |cmd|
|
90
|
+
name = "#{cmd.to_s.downcase} "[0, 8]
|
91
|
+
desc = mod.const_get(cmd, false).new.description
|
92
|
+
puts " #{name} #{desc}"
|
93
|
+
}
|
94
|
+
end
|
95
|
+
|
96
|
+
# :startdoc:
|
97
|
+
end
|
98
|
+
end
|
@@ -1,5 +1,29 @@
|
|
1
|
-
module Rbnotes
|
2
|
-
|
1
|
+
module Rbnotes::Commands
|
2
|
+
|
3
|
+
##
|
4
|
+
# Imports a existing file which specified by the argument as a note.
|
5
|
+
#
|
6
|
+
# A timestamp is generated referring to the birthtime of the given
|
7
|
+
# file. If birthtime is not available on the system, use mtime
|
8
|
+
# (modification time).
|
9
|
+
#
|
10
|
+
# Occasionally, there is another note which has the same timestmap
|
11
|
+
# in the repository. Then, tries to create a new timestamp with a
|
12
|
+
# suffix. Unluckily, when such timestamp with a suffix already
|
13
|
+
# exists, tries to create a new one with increasing suffix. Suffix
|
14
|
+
# will be "001", "002", ..., or "999". In worst case, all suffix
|
15
|
+
# might have been already used. Then, abandons to import.
|
16
|
+
|
17
|
+
class Import < Command
|
18
|
+
|
19
|
+
def description # :nodoc:
|
20
|
+
"Import a file as a note"
|
21
|
+
end
|
22
|
+
|
23
|
+
##
|
24
|
+
# :call-seq:
|
25
|
+
# execute([PATHNAME], Rbnotes::Conf or Hash) -> nil
|
26
|
+
|
3
27
|
def execute(args, conf)
|
4
28
|
file = args.shift
|
5
29
|
unless file.nil?
|
@@ -58,5 +82,18 @@ module Rbnotes
|
|
58
82
|
super
|
59
83
|
end
|
60
84
|
end
|
85
|
+
|
86
|
+
def help # :nodoc:
|
87
|
+
puts <<HELP
|
88
|
+
usage:
|
89
|
+
#{Rbnotes::NAME} import FILE
|
90
|
+
|
91
|
+
Imports a existing file which specified by the argument as a note.
|
92
|
+
|
93
|
+
A timestamp is generated referring to the birthtime of the given file.
|
94
|
+
If birthtime is not available on the system, use mtime (modification
|
95
|
+
time).
|
96
|
+
HELP
|
97
|
+
end
|
61
98
|
end
|
62
99
|
end
|
@@ -1,15 +1,20 @@
|
|
1
1
|
require "unicode/display_width"
|
2
2
|
require "io/console/size"
|
3
3
|
|
4
|
-
module Rbnotes
|
4
|
+
module Rbnotes::Commands
|
5
|
+
|
5
6
|
##
|
6
7
|
# Defines `list` command for `rbnotes`. See the document of execute
|
7
8
|
# method to know about the behavior of this command.
|
8
9
|
|
9
|
-
class
|
10
|
+
class List < Command
|
11
|
+
|
12
|
+
def description # :nodoc:
|
13
|
+
"List notes"
|
14
|
+
end
|
10
15
|
|
11
16
|
##
|
12
|
-
# Shows
|
17
|
+
# Shows a list of notes in the repository. The only argument is
|
13
18
|
# optional. If it passed, it must be an timestamp pattern. A
|
14
19
|
# timestamp is an instance of Textrepo::Timestamp class. A
|
15
20
|
# timestamp pattern is a string which would match several
|
@@ -48,6 +53,25 @@ module Rbnotes
|
|
48
53
|
}
|
49
54
|
end
|
50
55
|
|
56
|
+
def help # :nodoc:
|
57
|
+
puts <<HELP
|
58
|
+
usage:
|
59
|
+
#{Rbnotes::NAME} list [STAMP_PATTERN]
|
60
|
+
|
61
|
+
Show a list of notes. When no arguments, make a list with all notes
|
62
|
+
in the repository. When specified STAMP_PATTERN, only those match the
|
63
|
+
pattern are listed.
|
64
|
+
|
65
|
+
STAMP_PATTERN must be:
|
66
|
+
|
67
|
+
(a) full qualified timestamp (with suffix): "20201030160200"
|
68
|
+
(b) year and date part: "20201030"
|
69
|
+
(c) year and month part: "202010"
|
70
|
+
(d) year part only: "2020"
|
71
|
+
(e) date part only: "1030"
|
72
|
+
HELP
|
73
|
+
end
|
74
|
+
|
51
75
|
# :stopdoc:
|
52
76
|
|
53
77
|
private
|
@@ -1,4 +1,4 @@
|
|
1
|
-
module Rbnotes
|
1
|
+
module Rbnotes::Commands
|
2
2
|
|
3
3
|
##
|
4
4
|
# Searches a given pattern in notes those have timestamps match a
|
@@ -22,7 +22,12 @@ module Rbnotes
|
|
22
22
|
# See the document of `Rbnotes::Commands::List#execute` to know about
|
23
23
|
# a timestamp pattern.
|
24
24
|
|
25
|
-
class
|
25
|
+
class Search < Command
|
26
|
+
|
27
|
+
def description # :nodoc:
|
28
|
+
"Search a given pattern in notes"
|
29
|
+
end
|
30
|
+
|
26
31
|
def execute(args, conf)
|
27
32
|
pattern = args.shift
|
28
33
|
raise MissingArgumentError, args if pattern.nil?
|
@@ -40,5 +45,23 @@ module Rbnotes
|
|
40
45
|
}
|
41
46
|
end
|
42
47
|
end
|
48
|
+
|
49
|
+
def help # :nodoc:
|
50
|
+
puts <<HELP
|
51
|
+
usage:
|
52
|
+
#{Rbnotes::NAME} search PATTERN [STAMP_PATTERN]
|
53
|
+
|
54
|
+
PATTERN is a word (or words) to search, it may also be a regular
|
55
|
+
expression.
|
56
|
+
|
57
|
+
STAMP_PATTERN must be:
|
58
|
+
|
59
|
+
(a) full qualified timestamp (with suffix): "20201030160200"
|
60
|
+
(b) year and date part: "20201030"
|
61
|
+
(c) year and month part: "202010"
|
62
|
+
(d) year part only: "2020"
|
63
|
+
(e) date part only: "1030"
|
64
|
+
HELP
|
65
|
+
end
|
43
66
|
end
|
44
67
|
end
|
@@ -1,5 +1,23 @@
|
|
1
|
-
module Rbnotes
|
2
|
-
|
1
|
+
module Rbnotes::Commands
|
2
|
+
|
3
|
+
##
|
4
|
+
# Shows the content of the note specified by the argument. The
|
5
|
+
# argument must be a string which can be converted into
|
6
|
+
# Textrepo::Timestamp object.
|
7
|
+
#
|
8
|
+
# A string for Timestamp must be:
|
9
|
+
#
|
10
|
+
# "20201106112600" : year, date, time and sec
|
11
|
+
# "20201106112600_012" : with suffix
|
12
|
+
#
|
13
|
+
# If no argument is passed, reads the standard input for an argument.
|
14
|
+
|
15
|
+
class Show < Command
|
16
|
+
|
17
|
+
def description # :nodoc:
|
18
|
+
"Show the content of a note"
|
19
|
+
end
|
20
|
+
|
3
21
|
def execute(args, conf)
|
4
22
|
stamp = Rbnotes::Utils.read_timestamp(args)
|
5
23
|
|
@@ -17,5 +35,18 @@ module Rbnotes
|
|
17
35
|
puts content
|
18
36
|
end
|
19
37
|
end
|
38
|
+
|
39
|
+
def help # :nodoc:
|
40
|
+
puts <<HELP
|
41
|
+
usage:
|
42
|
+
#{Rbnotes::NAME} show [TIMESTAMP]
|
43
|
+
|
44
|
+
Show the content of given note. TIMESTAMP must be a fully qualified
|
45
|
+
one, such "20201016165130" or "20201016165130_012" if it has a suffix.
|
46
|
+
|
47
|
+
The command try to read its argument from the standard input when no
|
48
|
+
argument was passed in the command line.
|
49
|
+
HELP
|
50
|
+
end
|
20
51
|
end
|
21
52
|
end
|
@@ -1,35 +1,32 @@
|
|
1
1
|
module Rbnotes::Commands
|
2
|
+
|
2
3
|
##
|
3
4
|
# Updates the content of the note associated with given timestamp.
|
4
|
-
#
|
5
|
+
#
|
6
|
+
# Reads its argument from the standard input when no argument was
|
7
|
+
# passed in the command line.
|
8
|
+
#
|
5
9
|
# The timestamp associated with the note will be updated to new one,
|
6
10
|
# which is generated while the command exection.
|
7
11
|
#
|
8
12
|
# When "-k" (or "--keep") option is specified, the timestamp will
|
9
13
|
# remain unchanged.
|
10
14
|
#
|
11
|
-
#
|
12
|
-
# must exactly match to the one of the target note in the
|
13
|
-
# repository. When the given timestamp was not found, the command
|
14
|
-
# fails.
|
15
|
-
#
|
16
|
-
# Timestamp which is associated to the target note will be newly
|
17
|
-
# generated with the command execution time. That is, the timestamp
|
18
|
-
# before the command exection will be obsolete.
|
19
|
-
#
|
20
|
-
# This command starts the external editor program to edit the
|
21
|
-
# content of the note. The editor program will be searched as same
|
22
|
-
# as add command.
|
15
|
+
# Actual modification is done interactively by the external editor.
|
23
16
|
#
|
24
|
-
#
|
17
|
+
# The editor program will be searched as same as add command. If
|
18
|
+
# none of editors is available, the execution fails.
|
25
19
|
|
26
20
|
class Update < Command
|
27
21
|
include ::Rbnotes::Utils
|
28
22
|
|
23
|
+
def description # :nodoc:
|
24
|
+
"Update the content of a note"
|
25
|
+
end
|
26
|
+
|
29
27
|
##
|
30
28
|
# The 1st and only one argument is the timestamp to speficy the
|
31
|
-
# note to update.
|
32
|
-
# to the note updated.
|
29
|
+
# note to update.
|
33
30
|
#
|
34
31
|
# :call-seq:
|
35
32
|
# "20201020112233" -> "20201021123400"
|
@@ -82,5 +79,27 @@ module Rbnotes::Commands
|
|
82
79
|
puts "Nothing is updated, since the specified content is empty."
|
83
80
|
end
|
84
81
|
end
|
82
|
+
|
83
|
+
def help # :nodoc:
|
84
|
+
puts <<HELP
|
85
|
+
usage:
|
86
|
+
#{Rbnotes::NAME} update [TIMESTAMP]
|
87
|
+
|
88
|
+
Updates the content of the note associated with given timestamp.
|
89
|
+
|
90
|
+
Reads its argument from the standard input when no argument was passed
|
91
|
+
in the command line.
|
92
|
+
|
93
|
+
The timestamp associated with the note will be updated to new one,
|
94
|
+
which is generated while the command exection.
|
95
|
+
|
96
|
+
When "-k" (or "--keep") option is specified, the timestamp will remain
|
97
|
+
unchanged.
|
98
|
+
|
99
|
+
Actual modification is done interactively by the external editor. The
|
100
|
+
editor program will be searched as same as add command. If none of
|
101
|
+
editors is available, the execution fails.
|
102
|
+
HELP
|
103
|
+
end
|
85
104
|
end
|
86
105
|
end
|
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.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mnbi
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-11-
|
11
|
+
date: 2020-11-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: textrepo
|
@@ -64,6 +64,8 @@ files:
|
|
64
64
|
- lib/rbnotes/commands.rb
|
65
65
|
- lib/rbnotes/commands/add.rb
|
66
66
|
- lib/rbnotes/commands/delete.rb
|
67
|
+
- lib/rbnotes/commands/export.rb
|
68
|
+
- lib/rbnotes/commands/help.rb
|
67
69
|
- lib/rbnotes/commands/import.rb
|
68
70
|
- lib/rbnotes/commands/list.rb
|
69
71
|
- lib/rbnotes/commands/search.rb
|