rbnotes 0.2.2 → 0.3.0
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 +5 -1
- data/Gemfile.lock +2 -2
- data/exe/rbnotes +1 -1
- data/lib/rbnotes/commands/delete.rb +10 -14
- data/lib/rbnotes/commands/import.rb +3 -3
- data/lib/rbnotes/commands/list.rb +10 -8
- data/lib/rbnotes/commands/show.rb +12 -16
- data/lib/rbnotes/commands/update.rb +3 -12
- data/lib/rbnotes/error.rb +17 -4
- data/lib/rbnotes/utils.rb +35 -0
- 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: 906c366a81295b7d9a1c2e86ad2bd6f1d35f410ac7360f1e2067c0a0f8e4f48b
|
4
|
+
data.tar.gz: d2af84cbd9ddbb60fe6f21ddffb9c072ebe0b767e8c8ab6ae4cac0c1bca30acd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5fa3929995ebda0b4970c18516dadc37b5ddeb99d2a33c39ce90ac9f8bb90556c7a406b995b3373e4bc559c56b57750f0a0796f53b3d25624d1a891d2da456d1
|
7
|
+
data.tar.gz: 99c4dd49875b4cf1f262cbd845bbccb6482449f0a1573ed188b50cd6814c1220cc7cea1032cc2b6bbaaeb2e05c4f21f8a241e8931ff8d44128e72f8457c1b113
|
data/CHANGELOG.md
CHANGED
@@ -7,8 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
|
|
7
7
|
## [Unreleased]
|
8
8
|
Nothing to record here.
|
9
9
|
|
10
|
+
## [0.3.0] - 2020-10-29
|
11
|
+
### Added
|
12
|
+
- Add feature to read argument from the standard input. (#27)
|
13
|
+
|
10
14
|
## [0.2.2] - 2020-10-27
|
11
|
-
###
|
15
|
+
### Added
|
12
16
|
- Add feature to accept a timestamp pattern in `list` command. (#22)
|
13
17
|
|
14
18
|
## [0.2.1] - 2020-10-25
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rbnotes (0.
|
4
|
+
rbnotes (0.3.0)
|
5
5
|
textrepo (~> 0.4)
|
6
6
|
unicode-display_width (~> 1.7)
|
7
7
|
|
@@ -10,7 +10,7 @@ GEM
|
|
10
10
|
specs:
|
11
11
|
minitest (5.14.2)
|
12
12
|
rake (13.0.1)
|
13
|
-
textrepo (0.4.
|
13
|
+
textrepo (0.4.4)
|
14
14
|
unicode-display_width (1.7.0)
|
15
15
|
|
16
16
|
PLATFORMS
|
data/exe/rbnotes
CHANGED
@@ -14,21 +14,17 @@
|
|
14
14
|
module Rbnotes
|
15
15
|
class Commands::Delete < Commands::Command
|
16
16
|
def execute(args, conf)
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
puts e.message
|
27
|
-
else
|
28
|
-
puts "Delete [%s]" % stamp.to_s
|
29
|
-
end
|
17
|
+
stamp = Rbnotes::Utils.read_timestamp(args)
|
18
|
+
|
19
|
+
repo = Textrepo.init(conf)
|
20
|
+
begin
|
21
|
+
repo.delete(stamp)
|
22
|
+
rescue Textrepo::MissingTimestampError => e
|
23
|
+
puts e.message
|
24
|
+
rescue StandardError => e
|
25
|
+
puts e.message
|
30
26
|
else
|
31
|
-
|
27
|
+
puts "Delete [%s]" % stamp.to_s
|
32
28
|
end
|
33
29
|
end
|
34
30
|
end
|
@@ -29,7 +29,7 @@ module Rbnotes
|
|
29
29
|
puts "The note [%s] in the repository exactly matches" \
|
30
30
|
" the specified file." % stamp
|
31
31
|
puts "It seems there is no need to import the file [%s]." % file
|
32
|
-
|
32
|
+
break
|
33
33
|
else
|
34
34
|
puts "The text in the repository does not match the" \
|
35
35
|
" specified file."
|
@@ -40,8 +40,8 @@ module Rbnotes
|
|
40
40
|
end
|
41
41
|
rescue Textrepo::EmptyTextError => _
|
42
42
|
puts "... aborted."
|
43
|
-
puts "The specified file is
|
44
|
-
|
43
|
+
puts "The specified file is empty."
|
44
|
+
break
|
45
45
|
end
|
46
46
|
end
|
47
47
|
if count > 999
|
@@ -54,11 +54,11 @@ module Rbnotes
|
|
54
54
|
# Makes a headline with the timestamp and subject of the notes, it
|
55
55
|
# looks like as follows:
|
56
56
|
#
|
57
|
-
# |<------------------ console column size
|
58
|
-
# +-- timestamp ---+
|
59
|
-
# | | |
|
60
|
-
# 20101010001000_123:
|
61
|
-
# 20100909090909_999:
|
57
|
+
# |<------------------ console column size ------------------->|
|
58
|
+
# +-- timestamp ---+ +- subject (the 1st line of each note) -+
|
59
|
+
# | | | |
|
60
|
+
# 20101010001000_123: I love Macintosh. [EOL]
|
61
|
+
# 20100909090909_999: This is very very long long loooong subje[EOL]
|
62
62
|
# ++
|
63
63
|
# ^--- delimiter (2 characters)
|
64
64
|
#
|
@@ -69,9 +69,7 @@ module Rbnotes
|
|
69
69
|
delimiter = ": "
|
70
70
|
subject_width = column - TIMESTAMP_STR_MAX_WIDTH - delimiter.size - 1
|
71
71
|
|
72
|
-
subject = @repo.read(timestamp)[0]
|
73
|
-
prefix = '# '
|
74
|
-
subject = prefix + subject.lstrip if subject[0, 2] != prefix
|
72
|
+
subject = remove_heading_markup(@repo.read(timestamp)[0])
|
75
73
|
|
76
74
|
ts_part = "#{timestamp.to_s} "[0..(TIMESTAMP_STR_MAX_WIDTH - 1)]
|
77
75
|
sj_part = truncate_str(subject, subject_width)
|
@@ -90,6 +88,10 @@ module Rbnotes
|
|
90
88
|
result
|
91
89
|
end
|
92
90
|
|
91
|
+
def remove_heading_markup(str)
|
92
|
+
str.sub(/^#+ +/, '')
|
93
|
+
end
|
94
|
+
|
93
95
|
# :startdoc:
|
94
96
|
end
|
95
97
|
end
|
@@ -1,24 +1,20 @@
|
|
1
1
|
module Rbnotes
|
2
2
|
class Commands::Show < Commands::Command
|
3
3
|
def execute(args, conf)
|
4
|
-
|
5
|
-
unless stamp_str.nil?
|
6
|
-
repo = Textrepo.init(conf)
|
7
|
-
stamp = Textrepo::Timestamp.parse_s(stamp_str)
|
8
|
-
content = repo.read(stamp)
|
4
|
+
stamp = Rbnotes::Utils.read_timestamp(args)
|
9
5
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
6
|
+
repo = Textrepo.init(conf)
|
7
|
+
content = repo.read(stamp)
|
8
|
+
|
9
|
+
pager = conf[:pager]
|
10
|
+
unless pager.nil?
|
11
|
+
require 'open3'
|
12
|
+
Open3.pipeline_w(pager) { |stdin|
|
13
|
+
stdin.puts content
|
14
|
+
stdin.close
|
15
|
+
}
|
20
16
|
else
|
21
|
-
|
17
|
+
puts content
|
22
18
|
end
|
23
19
|
end
|
24
20
|
end
|
@@ -19,7 +19,7 @@ module Rbnotes::Commands
|
|
19
19
|
# as add command.
|
20
20
|
#
|
21
21
|
# If none of editors is available, the command fails.
|
22
|
-
|
22
|
+
|
23
23
|
class Update < Command
|
24
24
|
include ::Rbnotes::Utils
|
25
25
|
|
@@ -30,19 +30,10 @@ module Rbnotes::Commands
|
|
30
30
|
#
|
31
31
|
# :call-seq:
|
32
32
|
# "20201020112233" -> "20201021123400"
|
33
|
-
#
|
34
|
-
def execute(args, conf)
|
35
|
-
raise Rbnotes::MissingArgumentError, args if args.size < 1
|
36
|
-
|
37
|
-
target_stamp = nil
|
38
|
-
begin
|
39
|
-
target_stamp = Textrepo::Timestamp.parse_s(args.shift)
|
40
|
-
rescue ArgumentError => e
|
41
|
-
raise Rbnotes::MissingArgumentError, args
|
42
|
-
end
|
43
33
|
|
34
|
+
def execute(args, conf)
|
35
|
+
target_stamp = Rbnotes::Utils.read_timestamp(args)
|
44
36
|
editor = find_editor(conf[:editor])
|
45
|
-
|
46
37
|
repo = Textrepo.init(conf)
|
47
38
|
|
48
39
|
text = nil
|
data/lib/rbnotes/error.rb
CHANGED
@@ -1,13 +1,15 @@
|
|
1
1
|
module Rbnotes
|
2
2
|
##
|
3
3
|
# A base class for each error class of rbnotes.
|
4
|
-
|
4
|
+
|
5
5
|
class Error < StandardError; end
|
6
6
|
|
7
7
|
# :stopdoc:
|
8
|
+
|
8
9
|
module ErrMsg
|
9
10
|
MISSING_ARGUMENT = "missing argument: %s"
|
10
11
|
MISSING_TIMESTAMP = "missing timestamp: %s"
|
12
|
+
INVALID_TIMESTAMP_STRING = "invalid string as timestamp: %s"
|
11
13
|
NO_EDITOR = "No editor is available: %s"
|
12
14
|
PROGRAM_ABORT = "External program was aborted: %s"
|
13
15
|
end
|
@@ -16,7 +18,7 @@ module Rbnotes
|
|
16
18
|
|
17
19
|
##
|
18
20
|
# An error raised if an essential argument was missing.
|
19
|
-
|
21
|
+
|
20
22
|
class MissingArgumentError < Error
|
21
23
|
def initialize(args)
|
22
24
|
super(ErrMsg::MISSING_ARGUMENT % args.to_s)
|
@@ -26,17 +28,27 @@ module Rbnotes
|
|
26
28
|
##
|
27
29
|
# An error raised if a given timestamp was not found in the
|
28
30
|
# repository.
|
29
|
-
|
31
|
+
|
30
32
|
class MissingTimestampError < Error
|
31
33
|
def initialize(timestamp)
|
32
34
|
super(ErrMsg::MISSING_TIMESTAMP % timestamp)
|
33
35
|
end
|
34
36
|
end
|
35
37
|
|
38
|
+
##
|
39
|
+
# An error raised if an argument is invalid to convert a
|
40
|
+
# Textrepo::Timestamp object.
|
41
|
+
|
42
|
+
class InvalidTimestampStringError < Error
|
43
|
+
def initialize(str)
|
44
|
+
super(ErrMsg::INVALID_TIMESTAMP_STRING % str)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
36
48
|
##
|
37
49
|
# An error raised if no external editor is available to edit a note,
|
38
50
|
# even "nano" or "vi".
|
39
|
-
|
51
|
+
|
40
52
|
class NoEditorError < Error
|
41
53
|
def initialize(names)
|
42
54
|
super(ErrMsg::NO_EDITOR % names.to_s)
|
@@ -46,6 +58,7 @@ module Rbnotes
|
|
46
58
|
##
|
47
59
|
# An error raised when a external program such an editor was aborted
|
48
60
|
# during its execution.
|
61
|
+
|
49
62
|
class ProgramAbortError < Error
|
50
63
|
def initialize(cmdline)
|
51
64
|
super(ErrMsg::PROGRAM_ABORT % cmdline.join(" "))
|
data/lib/rbnotes/utils.rb
CHANGED
@@ -86,6 +86,41 @@ module Rbnotes
|
|
86
86
|
end
|
87
87
|
module_function :run_with_tmpfile
|
88
88
|
|
89
|
+
##
|
90
|
+
# Generates a Textrepo::Timestamp object from a String which comes
|
91
|
+
# from the command line arguments. When no argument is given,
|
92
|
+
# then reads from STDIN.
|
93
|
+
#
|
94
|
+
# :call-seq:
|
95
|
+
# read_timestamp(args) -> String
|
96
|
+
|
97
|
+
def read_timestamp(args)
|
98
|
+
str = args.shift || read_arg($stdin)
|
99
|
+
begin
|
100
|
+
Textrepo::Timestamp.parse_s(str)
|
101
|
+
rescue ArgumentError => _
|
102
|
+
raise InvalidTimestampStringError, str
|
103
|
+
end
|
104
|
+
end
|
105
|
+
module_function :read_timestamp
|
106
|
+
|
107
|
+
##
|
108
|
+
# Reads an argument from the IO object. Typically, it is intended
|
109
|
+
# to be used with STDIN.
|
110
|
+
#
|
111
|
+
# :call-seq:
|
112
|
+
# read_arg(IO) -> String
|
113
|
+
|
114
|
+
def read_arg(io)
|
115
|
+
# assumes the reading line looks like:
|
116
|
+
#
|
117
|
+
# foo bar baz ...
|
118
|
+
#
|
119
|
+
# then, only the first string is interested
|
120
|
+
io.gets.split(" ")[0]
|
121
|
+
end
|
122
|
+
module_function :read_arg
|
123
|
+
|
89
124
|
# :stopdoc:
|
90
125
|
|
91
126
|
private
|
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
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mnbi
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-10-
|
11
|
+
date: 2020-10-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: textrepo
|