rbnotes 0.4.18 → 0.4.20

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8a831d67abfd0bae05156f047b6baf44428bc4940058e43bfb9825b5d91c4177
4
- data.tar.gz: 7fb70e39e9feb75edfabe3461697ddfb0145cf449205c25068471687952908d0
3
+ metadata.gz: c983ec2e16d7e384a8b1ba50cd79ed327a1b69cf415c471becfb19dfd71ba5a2
4
+ data.tar.gz: 2147e0b2c7564fc18f664dbd39ee597dbb642a8e6b42575d71078c5cc85cc8c4
5
5
  SHA512:
6
- metadata.gz: 7ea3b1ea6517130e5ba5ece651da8f3e30f1013aaa40aa375ad16fb09a7e07a033c7da4e59a721fade178ed4720cf804cb60cc843ea42cbcb177fdf81f947f01
7
- data.tar.gz: 6a19760bdecd4b967717c30bed0974a8098d5b3f9e9df9a90bd81cd6b1498a6ba226f2e5654547f1ec67da9beb3d54c740ab9895163d8488df9801b74539f8aa
6
+ metadata.gz: f2389e447037b2b9a5a9f2136b435c44cc86bc8f1b84da057ffe9b1474132564034baf539e946dc74aeafa7ba609cd81bd32c1036c60991b1959e691523a3ad9
7
+ data.tar.gz: 257fd944e264ae91780b63a9b37bfca1658943e2098ca4a007e49f05b875e4c496d475e10299496c4d397ffaa6cefe23549267bd3a0a07c8a5d6f658a37e2941
@@ -10,7 +10,7 @@ jobs:
10
10
  - name: Set up Ruby
11
11
  uses: ruby/setup-ruby@v1
12
12
  with:
13
- ruby-version: 3.0.0
13
+ ruby-version: 3.1.0
14
14
  - name: Run the default task
15
15
  run: |
16
16
  gem install bundler -v 2.2.3
data/CHANGELOG.md CHANGED
@@ -5,7 +5,21 @@ 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
- - (nothing to record here)
8
+ - Fix issue #133: some tests fail.
9
+
10
+ ## [0.4.20] - 2022-12-03
11
+ ### Added
12
+ - Add a new keyword, `recent`. (#131)
13
+
14
+ ## [0.4.19] - 2021-05-24
15
+ ### Added
16
+ - Add an option to search in only the subject of each note. (#128)
17
+
18
+ ### Modified
19
+ - Update copyright year in `LICENSE`. (#127)
20
+
21
+ ### Fixed
22
+ - Fix #129: add description about the keyword, "all."
9
23
 
10
24
  ## [0.4.18] - 2021-04-29
11
25
  ### Added
data/Gemfile CHANGED
@@ -6,4 +6,4 @@ gemspec
6
6
  gem "rake", "~> 13.0"
7
7
  gem "minitest", "~> 5.0"
8
8
 
9
- gem 'textrepo', "~> 0.5.8"
9
+ gem 'textrepo', "~> 0.5.9"
data/Gemfile.lock CHANGED
@@ -1,26 +1,26 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rbnotes (0.4.18)
5
- textrepo (~> 0.5.8)
6
- unicode-display_width (~> 1.7)
4
+ rbnotes (0.4.20)
5
+ textrepo (~> 0.5.9)
6
+ unicode-display_width (~> 1.8)
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- minitest (5.14.4)
12
- rake (13.0.3)
13
- textrepo (0.5.8)
14
- unicode-display_width (1.7.0)
11
+ minitest (5.16.3)
12
+ rake (13.0.6)
13
+ textrepo (0.5.9)
14
+ unicode-display_width (1.8.0)
15
15
 
16
16
  PLATFORMS
17
- ruby
17
+ x86_64-darwin-22
18
18
 
19
19
  DEPENDENCIES
20
20
  minitest (~> 5.0)
21
21
  rake (~> 13.0)
22
22
  rbnotes!
23
- textrepo (~> 0.5.8)
23
+ textrepo (~> 0.5.9)
24
24
 
25
25
  BUNDLED WITH
26
- 2.2.15
26
+ 2.3.11
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2020 mnbi
3
+ Copyright (c) 2020, 2021 mnbi
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/exe/rbnotes CHANGED
@@ -66,6 +66,7 @@ rescue MissingArgumentError, MissingTimestampError,
66
66
  InvalidTimestampPatternAsDateError,
67
67
  NoConfFileError,
68
68
  NoTemplateFileError,
69
+ UnknownKeywordError,
69
70
  ArgumentError,
70
71
  Errno::EACCES => e
71
72
  puts e.message
@@ -22,6 +22,7 @@ module Rbnotes::Commands
22
22
 
23
23
  def execute(args, conf)
24
24
  stamp = Rbnotes.utils.read_timestamp(args)
25
+ args.shift # drop the 1st argument
25
26
 
26
27
  repo = Textrepo.init(conf)
27
28
  begin
@@ -33,6 +33,8 @@ module Rbnotes::Commands
33
33
  # - "last_week" (or "lw")
34
34
  # - "this_month" (or "tm")
35
35
  # - "last_month" (or "lm")
36
+ # - "recent" (or "re")
37
+ # - "all"
36
38
  #
37
39
  # Here is several examples of timestamp patterns.
38
40
  #
@@ -66,9 +68,11 @@ module Rbnotes::Commands
66
68
 
67
69
  utils = Rbnotes.utils
68
70
  patterns = utils.read_timestamp_patterns(args, enum_week: @opts[:enum_week])
69
-
70
71
  repo = Textrepo.init(conf)
71
- stamps = utils.find_notes(patterns, repo)
72
+
73
+ num_of_notes = utils.specified_recent?(args) ? conf[:number_of_recent_notes] : 0
74
+ stamps = utils.find_notes(patterns, repo, num_of_notes)
75
+
72
76
  output = []
73
77
  if @opts[:verbose]
74
78
  collect_timestamps_by_date(stamps).each { |date, timestamps|
@@ -106,23 +110,6 @@ OPTIONS:
106
110
  -v, --verbose
107
111
  -w, --week
108
112
 
109
- STAMP_PATTERN must be:
110
-
111
- (a) full qualified timestamp (with suffix): "20201030160200"
112
- (b) year and date part: "20201030"
113
- (c) year and month part: "202010"
114
- (d) year part only: "2020"
115
- (e) date part only: "1030"
116
-
117
- KEYWORD:
118
-
119
- - "today" (or "to")
120
- - "yeasterday" (or "ye")
121
- - "this_week" (or "tw")
122
- - "last_week" (or "lw")
123
- - "this_month" (or "tm")
124
- - "last_month" (or "lm")
125
-
126
113
  An option "--verbose" is acceptable. It specifies to counts number of
127
114
  notes by each day, then put it with the date before notes. It looks
128
115
  like as follows:
@@ -140,11 +127,35 @@ days of a week. Typically, the option is used with a STAMP_PATTERN
140
127
  which specifies a date, such "20201117", then it enumerates all days
141
128
  of the week which contains "17th November 2020".
142
129
 
130
+ STAMP_PATTERN must be:
131
+
132
+ (a) full qualified timestamp (with suffix): "20201030160200"
133
+ (b) year and date part: "20201030"
134
+ (c) year and month part: "202010"
135
+ (d) year part only: "2020"
136
+ (e) date part only: "1030"
137
+
143
138
  A STAMP_PATTERN other than (a) and (b) causes an error if it was used
144
139
  with "--week" option.
145
140
 
146
141
  When no STAMP_PATTERN was specified with "--week" option, the output
147
142
  would be as same as the KEYWORD, "this_week" was specified.
143
+
144
+ KEYWORD:
145
+
146
+ - "today" (or "to")
147
+ - "yeasterday" (or "ye")
148
+ - "this_week" (or "tw")
149
+ - "last_week" (or "lw")
150
+ - "this_month" (or "tm")
151
+ - "last_month" (or "lm")
152
+ - "recent" (or "re")
153
+ - "all"
154
+
155
+ The keyword, "recent" specifies to enumerate recent notes in the
156
+ repository. The keyword, "all" specifies to enumerate all notes in
157
+ the repository.
158
+
148
159
  HELP
149
160
  end
150
161
 
@@ -25,7 +25,8 @@ module Rbnotes::Commands
25
25
 
26
26
  repo = Textrepo.init(conf)
27
27
 
28
- stamps = utils.find_notes(patterns, repo)
28
+ num_of_notes = utils.specified_recent?(args) ? conf[:number_of_recent_notes] : 0
29
+ stamps = utils.find_notes(patterns, repo, num_of_notes)
29
30
  return if stamps.empty?
30
31
 
31
32
  list = []
@@ -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
- puts "#{stamp_display}: #{num_display}: #{e.matched_text}"
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
 
@@ -22,7 +22,7 @@ module Rbnotes::Commands
22
22
  parse_opts(args)
23
23
 
24
24
  repo = Textrepo.init(conf)
25
- stamps = read_timestamps(args, repo)
25
+ stamps = read_timestamps(args, repo, conf)
26
26
  return if stamps.empty?
27
27
 
28
28
  content = stamps.map { |stamp|
@@ -98,13 +98,14 @@ HELP
98
98
  end
99
99
  end
100
100
 
101
- def read_timestamps(args, repo)
101
+ def read_timestamps(args, repo, conf)
102
102
  utils = Rbnotes.utils
103
103
  if args.empty?
104
104
  stamps = utils.read_multiple_timestamps(args)
105
105
  else
106
106
  patterns = utils.read_timestamp_patterns(args)
107
- stamps = utils.find_notes(patterns, repo)
107
+ num_of_notes = utils.specified_recent?(args) ? conf[:number_of_recent_notes] : 0
108
+ stamps = utils.find_notes(patterns, repo, num_of_notes)
108
109
  end
109
110
  stamps
110
111
  end
data/lib/rbnotes/conf.rb CHANGED
@@ -31,6 +31,12 @@ module Rbnotes
31
31
 
32
32
  DIRNAME_COMMON_CONF = ".config"
33
33
 
34
+ ##
35
+ # Name of the number of notes to enumerate. The values is
36
+ # referred only to enumerate the recent notes.
37
+
38
+ NUMBER_OF_RECENT_NOTES = 10
39
+
34
40
  def initialize(path = nil) # :nodoc:
35
41
  @conf = {}
36
42
 
@@ -90,6 +96,7 @@ module Rbnotes
90
96
  :repository_type => :file_system,
91
97
  :repository_name => "notes",
92
98
  :repository_base => "~",
99
+ :number_of_recent_notes => 10,
93
100
  }
94
101
 
95
102
  MODE_POSTFIX = {
data/lib/rbnotes/utils.rb CHANGED
@@ -125,6 +125,8 @@ module Rbnotes
125
125
  # read_timestamp(args) -> String
126
126
 
127
127
  def read_timestamp(args)
128
+ args = args.dup
129
+
128
130
  str = args.shift || read_arg($stdin)
129
131
  raise NoArgumentError if str.nil?
130
132
 
@@ -163,6 +165,9 @@ module Rbnotes
163
165
  # Commands::Pick#execute.
164
166
  #
165
167
  def read_timestamp_patterns(args, enum_week: false)
168
+ args = args.dup
169
+
170
+ validate_arguments(args)
166
171
  patterns = nil
167
172
  if enum_week
168
173
  args.unshift(Time.now.strftime("%Y%m%d")) if args.size == 0
@@ -254,12 +259,13 @@ module Rbnotes
254
259
  # expand_keyword_in_args(Array of Strings) -> Array of Strings
255
260
  #
256
261
  def expand_keyword_in_args(args)
262
+ args = args.dup
257
263
  patterns = []
258
264
  while args.size > 0
259
265
  arg = args.shift
260
- if arg == "all"
266
+ if arg == "all" or arg == "recent" or arg == "re"
261
267
  return [nil]
262
- elsif KEYWORDS.include?(arg)
268
+ elsif valid_keyword?(arg)
263
269
  patterns.concat(expand_keyword(arg))
264
270
  else
265
271
  patterns << arg
@@ -304,13 +310,27 @@ module Rbnotes
304
310
  # given repository. Returns an Array contains Timestamp objects.
305
311
  # The returned Array is sorted by Timestamp.
306
312
  #
313
+ # When a positive number was specified as the 3rd argument, the
314
+ # number was used as the limitation count of enumerated notes.
315
+ #
307
316
  # :call-seq:
308
- # find_notes(Array of timestamp patterns, Textrepo::Repository)
317
+ # find_notes(Array of timestamp patterns, Textrepo::Repository, Integer)
309
318
 
310
- def find_notes(timestamp_patterns, repo)
311
- timestamp_patterns.map { |pat|
319
+ def find_notes(timestamp_patterns, repo, num_of_notes = 0)
320
+ notes = timestamp_patterns.map { |pat|
312
321
  repo.entries(pat)
313
322
  }.flatten.sort{ |a, b| b <=> a }.uniq
323
+
324
+ if num_of_notes > 0
325
+ notes[0,num_of_notes]
326
+ else
327
+ notes
328
+ end
329
+ end
330
+
331
+ def specified_recent?(args)
332
+ validate_arguments(args)
333
+ args.include?("recent") or args.include?("re")
314
334
  end
315
335
 
316
336
  # :stopdoc:
@@ -360,6 +380,30 @@ module Rbnotes
360
380
  str
361
381
  end
362
382
 
383
+ ##
384
+ # Validates arguments as timestamp strings or keywords. If all
385
+ # arguments are valid as timestamp strings or keywords, do
386
+ # nothing. Otherwise, raise an error.
387
+ #
388
+ # :call-seq:
389
+ # validate_arguments(an array of strings) -> nil
390
+ #
391
+ def validate_arguments(args)
392
+ args.each { |arg|
393
+ unless valid_keyword?(arg) or valid_timestamp_pattern?(arg)
394
+ raise InvalidTimestampPatternError, arg
395
+ end
396
+ }
397
+ end
398
+
399
+ def valid_keyword?(arg)
400
+ KEYWORDS.include?(arg)
401
+ end
402
+
403
+ def valid_timestamp_pattern?(arg)
404
+ !/[^_\d]/.match(arg)
405
+ end
406
+
363
407
  ##
364
408
  # Expands a keyword to timestamp strings.
365
409
  #
@@ -388,6 +432,8 @@ module Rbnotes
388
432
  end
389
433
 
390
434
  KEYWORDS = %w(
435
+ all
436
+ recent re
391
437
  today to yesterday ye
392
438
  this_week tw last_week lw
393
439
  this_month tm last_month lm
@@ -1,4 +1,4 @@
1
1
  module Rbnotes
2
- VERSION = "0.4.18"
3
- RELEASE = "2021-04-29"
2
+ VERSION = "0.4.20"
3
+ RELEASE = "2022-12-03"
4
4
  end
data/rbnotes.gemspec CHANGED
@@ -25,6 +25,6 @@ Gem::Specification.new do |spec|
25
25
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
26
26
  spec.require_paths = ["lib"]
27
27
 
28
- spec.add_dependency "textrepo", "~> 0.5.8"
29
- spec.add_dependency "unicode-display_width", "~> 1.7"
28
+ spec.add_dependency "textrepo", "~> 0.5.9"
29
+ spec.add_dependency "unicode-display_width", "~> 1.8"
30
30
  end
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.18
4
+ version: 0.4.20
5
5
  platform: ruby
6
6
  authors:
7
7
  - mnbi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-04-29 00:00:00.000000000 Z
11
+ date: 2022-12-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: textrepo
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.5.8
19
+ version: 0.5.9
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.5.8
26
+ version: 0.5.9
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: unicode-display_width
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.7'
33
+ version: '1.8'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1.7'
40
+ version: '1.8'
41
41
  description: Rbnotes allows you to write a note into a single repository.
42
42
  email:
43
43
  - mnbi@users.noreply.github.com
@@ -106,7 +106,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
106
106
  - !ruby/object:Gem::Version
107
107
  version: '0'
108
108
  requirements: []
109
- rubygems_version: 3.2.15
109
+ rubygems_version: 3.3.11
110
110
  signing_key:
111
111
  specification_version: 4
112
112
  summary: A simple utility to write a note.