term_utils 0.4.0 → 0.5.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.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +7 -0
  3. data/COPYING +1 -1
  4. data/Rakefile +6 -0
  5. data/doc/TermUtils/AP/Article.html +13 -13
  6. data/doc/TermUtils/AP/ArticleResult.html +4 -4
  7. data/doc/TermUtils/AP/Flag.html +8 -8
  8. data/doc/TermUtils/AP/Parameter.html +9 -9
  9. data/doc/TermUtils/AP/ParameterResult.html +4 -4
  10. data/doc/TermUtils/AP/ParameterWalkerHooks.html +4 -4
  11. data/doc/TermUtils/AP/ParseError.html +646 -14
  12. data/doc/TermUtils/AP/Parser.html +43 -15
  13. data/doc/TermUtils/AP/Result.html +4 -4
  14. data/doc/TermUtils/AP/Syntax.html +4 -4
  15. data/doc/TermUtils/AP/SyntaxError.html +4 -86
  16. data/doc/TermUtils/AP/Walker.html +4 -4
  17. data/doc/TermUtils/AP.html +16 -16
  18. data/doc/TermUtils/FF/Config.html +8 -8
  19. data/doc/TermUtils/FF/Context.html +4 -4
  20. data/doc/TermUtils/FF/Entry.html +4 -4
  21. data/doc/TermUtils/FF/Finder.html +850 -0
  22. data/doc/TermUtils/FF/FinderEntry.html +1191 -0
  23. data/doc/TermUtils/FF/FinderQuery.html +946 -0
  24. data/doc/TermUtils/FF/Query.html +11 -15
  25. data/doc/TermUtils/FF.html +131 -7
  26. data/doc/TermUtils/PropertyTreeNode.html +6 -6
  27. data/doc/TermUtils/Tab/Column.html +44 -44
  28. data/doc/TermUtils/Tab/Header.html +19 -19
  29. data/doc/TermUtils/Tab/Holder.html +40 -40
  30. data/doc/TermUtils/Tab/Printer.html +4 -4
  31. data/doc/TermUtils/Tab/Table.html +59 -59
  32. data/doc/TermUtils/Tab/TableError.html +4 -86
  33. data/doc/TermUtils/Tab.html +42 -42
  34. data/doc/TermUtils.html +6 -6
  35. data/doc/_index.html +29 -23
  36. data/doc/class_list.html +1 -1
  37. data/doc/css/style.css +1 -0
  38. data/doc/file.README.html +25 -21
  39. data/doc/frames.html +1 -1
  40. data/doc/index.html +25 -21
  41. data/doc/method_list.html +385 -89
  42. data/doc/top-level-namespace.html +4 -4
  43. data/lib/term_utils/ap/article.rb +2 -2
  44. data/lib/term_utils/ap/flag.rb +2 -2
  45. data/lib/term_utils/ap/parameter.rb +2 -2
  46. data/lib/term_utils/ap/parser.rb +16 -15
  47. data/lib/term_utils/ap/result.rb +2 -2
  48. data/lib/term_utils/ap/syntax.rb +2 -2
  49. data/lib/term_utils/ap.rb +66 -22
  50. data/lib/term_utils/ff/config.rb +3 -3
  51. data/lib/term_utils/ff/entry.rb +2 -2
  52. data/lib/term_utils/ff/finder.rb +255 -0
  53. data/lib/term_utils/ff/query.rb +6 -8
  54. data/lib/term_utils/ff.rb +4 -3
  55. data/lib/term_utils/property_tree_node.rb +3 -3
  56. data/lib/term_utils/tab.rb +14 -13
  57. data/lib/term_utils.rb +2 -2
  58. data/term_utils.gemspec +2 -2
  59. metadata +8 -5
  60. data/doc/TermUtils/AP/NoSuchValueError.html +0 -217
@@ -6,7 +6,7 @@
6
6
  <title>
7
7
  Top Level Namespace
8
8
 
9
- &mdash; Documentation by YARD 0.9.25
9
+ &mdash; Documentation by YARD 0.9.34
10
10
 
11
11
  </title>
12
12
 
@@ -100,9 +100,9 @@
100
100
  </div>
101
101
 
102
102
  <div id="footer">
103
- Generated on Sun Aug 2 18:35:09 2020 by
104
- <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
105
- 0.9.25 (ruby-2.6.5).
103
+ Generated on Wed Aug 9 17:34:25 2023 by
104
+ <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
105
+ 0.9.34 (ruby-3.2.2).
106
106
  </div>
107
107
 
108
108
  </div>
@@ -1,6 +1,6 @@
1
- # frozen-string-literal: true
1
+ # frozen_string_literal: true
2
2
 
3
- # Copyright (C) 2020 Thomas Baron
3
+ # Copyright (C) 2023 Thomas Baron
4
4
  #
5
5
  # This file is part of term_utils.
6
6
  #
@@ -1,6 +1,6 @@
1
- # frozen-string-literal: true
1
+ # frozen_string_literal: true
2
2
 
3
- # Copyright (C) 2020 Thomas Baron
3
+ # Copyright (C) 2023 Thomas Baron
4
4
  #
5
5
  # This file is part of term_utils.
6
6
  #
@@ -1,6 +1,6 @@
1
- # frozen-string-literal: true
1
+ # frozen_string_literal: true
2
2
 
3
- # Copyright (C) 2020 Thomas Baron
3
+ # Copyright (C) 2023 Thomas Baron
4
4
  #
5
5
  # This file is part of term_utils.
6
6
  #
@@ -1,6 +1,6 @@
1
- # frozen-string-literal: true
1
+ # frozen_string_literal: true
2
2
 
3
- # Copyright (C) 2020 Thomas Baron
3
+ # Copyright (C) 2023 Thomas Baron
4
4
  #
5
5
  # This file is part of term_utils.
6
6
  #
@@ -27,7 +27,8 @@ module TermUtils
27
27
  # Parses a given list of arguments.
28
28
  # @param syntax [Syntax]
29
29
  # @param arguments [Array<String>]
30
- # @param opts [Hash]
30
+ # @param opts [Hash<Symbol, Object>]
31
+ # @option opts [Boolean] :strict Whether the Syntax must be considered as strict.
31
32
  # @return [Result]
32
33
  # @raise [ParseError]
33
34
  # @raise [SyntaxError]
@@ -52,7 +53,7 @@ module TermUtils
52
53
  shortcut_flags.each do |label, flag|
53
54
  next unless arg.start_with? label
54
55
 
55
- return [flag.label, arg[label.length..-1]]
56
+ return [flag.label, arg[label.length..]]
56
57
  end
57
58
 
58
59
  nil
@@ -96,7 +97,7 @@ module TermUtils
96
97
  unless flagged_params.key? arguments.first
97
98
  # Unknown flag
98
99
  # End of parsing
99
- raise TermUtils::AP::ParseError, 'flagged parameter unexpected' if opts.fetch(:strict, false)
100
+ raise TermUtils::AP::ParseError.new(message: 'flagged parameter unexpected', fault: arguments.first) if opts.fetch(:strict, false)
100
101
 
101
102
  break
102
103
  end
@@ -104,7 +105,7 @@ module TermUtils
104
105
  param = flagged_params[arguments.first]
105
106
  if param.occur_bounded? && (fp_occ[param.id] >= param.max_occurs)
106
107
  # Max occurs reached
107
- raise TermUtils::AP::ParseError, "occur limit reached (#{param.id})" if opts.fetch(:strict, false)
108
+ raise TermUtils::AP::ParseError.new(message: 'occur limit reached', parameter: param.id, fault: arguments.first) if opts.fetch(:strict, false)
108
109
 
109
110
  break
110
111
  end
@@ -117,7 +118,7 @@ module TermUtils
117
118
  # Unflagged
118
119
  if unflagged_params.empty?
119
120
  # End of parsing
120
- raise TermUtils::AP::ParseError, 'unflagged parameter unexpected' if opts.fetch(:strict, false)
121
+ raise TermUtils::AP::ParseError.new(message: 'unflagged parameter unexpected', fault: arguments.first) if opts.fetch(:strict, false)
121
122
 
122
123
  break
123
124
  end
@@ -125,7 +126,7 @@ module TermUtils
125
126
  param = unflagged_params.first
126
127
  if arguments.first == '--'
127
128
  # End of parameter
128
- raise TermUtils::AP::ParseError, "parameter not consumed (#{param.id})" if up_occ < param.min_occurs
129
+ raise TermUtils::AP::ParseError.new(message: 'parameter not consumed', parameter: param.id) if up_occ < param.min_occurs
129
130
 
130
131
  arguments.shift
131
132
  unflagged_params.shift
@@ -137,7 +138,7 @@ module TermUtils
137
138
  param_res = TermUtils::AP::ParameterResult.new(result, param)
138
139
  case parse0_param(param_res, param, arguments)
139
140
  when :esc_param
140
- raise TermUtils::AP::ParseError, "parameter not consumed (#{param.id})" if up_occ < param.min_occurs
141
+ raise TermUtils::AP::ParseError.new(message: 'parameter not consumed', parameter: param.id) if up_occ < param.min_occurs
141
142
 
142
143
  unflagged_params.shift
143
144
  up_occ = 0
@@ -153,7 +154,7 @@ module TermUtils
153
154
  syntax.parameters.each do |p|
154
155
  next if result.find_parameters(p.id).length >= p.min_occurs
155
156
 
156
- raise TermUtils::AP::ParseError, "parameter not consumed (#{p.id})"
157
+ raise TermUtils::AP::ParseError.new(message: 'parameter not consumed', parameter: p.id)
157
158
  end
158
159
  end
159
160
 
@@ -170,15 +171,15 @@ module TermUtils
170
171
 
171
172
  if arguments.empty?
172
173
  # End of arguments
173
- raise TermUtils::AP::ParseError, 'article not consumed' if occ < arts.first.min_occurs
174
- raise TermUtils::AP::ParseError, 'article not consumed' if self.class.eval_article_min_occurs(arts[1..-1]) > 0
174
+ raise TermUtils::AP::ParseError.new(message: 'article not consumed', parameter: param.id) if occ < arts.first.min_occurs
175
+ raise TermUtils::AP::ParseError.new(message: 'article not consumed', parameter: param.id) if self.class.eval_article_min_occurs(arts[1..]) > 0
175
176
 
176
177
  break
177
178
  end
178
179
 
179
180
  if arguments.first == '-'
180
181
  # End of article
181
- raise TermUtils::AP::ParseError, 'article not consumed' if occ < arts.first.min_occurs
182
+ raise TermUtils::AP::ParseError.new(message: 'article not consumed', parameter: param.id) if occ < arts.first.min_occurs
182
183
 
183
184
  arguments.shift
184
185
  arts.shift
@@ -186,8 +187,8 @@ module TermUtils
186
187
  next
187
188
  elsif arguments.first.start_with? '-'
188
189
  # End of parameter
189
- raise TermUtils::AP::ParseError, 'article not consumed' if occ < arts.first.min_occurs
190
- raise TermUtils::AP::ParseError, 'article not consumed' if self.class.eval_article_min_occurs(arts[1..-1]) > 0
190
+ raise TermUtils::AP::ParseError.new(message: 'article not consumed', parameter: param.id) if occ < arts.first.min_occurs
191
+ raise TermUtils::AP::ParseError.new(message: 'article not consumed', parameter: param.id) if self.class.eval_article_min_occurs(arts[1..]) > 0
191
192
 
192
193
  if arguments.first == '--'
193
194
  arguments.shift
@@ -1,6 +1,6 @@
1
- # frozen-string-literal: true
1
+ # frozen_string_literal: true
2
2
 
3
- # Copyright (C) 2020 Thomas Baron
3
+ # Copyright (C) 2023 Thomas Baron
4
4
  #
5
5
  # This file is part of term_utils.
6
6
  #
@@ -1,6 +1,6 @@
1
- # frozen-string-literal: true
1
+ # frozen_string_literal: true
2
2
 
3
- # Copyright (C) 2020 Thomas Baron
3
+ # Copyright (C) 2023 Thomas Baron
4
4
  #
5
5
  # This file is part of term_utils.
6
6
  #
data/lib/term_utils/ap.rb CHANGED
@@ -1,6 +1,6 @@
1
- # frozen-string-literal: true
1
+ # frozen_string_literal: true
2
2
 
3
- # Copyright (C) 2020 Thomas Baron
3
+ # Copyright (C) 2023 Thomas Baron
4
4
  #
5
5
  # This file is part of term_utils.
6
6
  #
@@ -16,28 +16,79 @@
16
16
  # You should have received a copy of the GNU General Public License
17
17
  # along with term_utils. If not, see <https://www.gnu.org/licenses/>.
18
18
 
19
+ require 'term_utils/ap/article'
20
+ require 'term_utils/ap/flag'
21
+ require 'term_utils/ap/parameter'
22
+ require 'term_utils/ap/syntax'
23
+ require 'term_utils/ap/result'
24
+ require 'term_utils/ap/parser'
25
+
19
26
  module TermUtils
20
27
  # The Argument Parser module provides a way to parse arguments.
21
28
  module AP
22
- # NoSuchValueError.
23
- class NoSuchValueError < StandardError
24
- def initialize(msg)
25
- super
26
- end
27
- end
28
-
29
29
  # ParseError.
30
30
  class ParseError < StandardError
31
- def initialize(msg)
32
- super
31
+ # Constructs a new ParseError.
32
+ # @param props [Hash<Symbol, Object>]
33
+ def initialize(props = {})
34
+ super(self.class.create_message(props))
35
+ @props = props.dup
36
+ end
37
+
38
+ # Returns the properties associated to this one.
39
+ # @return [Hash<Symbol, Object>]
40
+ def props
41
+ @props.dup
42
+ end
43
+
44
+ # Returns the short message (i.e. the message without properties).
45
+ # @return [String] The short message.
46
+ def short_message
47
+ @props.fetch(:message)
48
+ end
49
+
50
+ # Tests whether this one has a syntax parameter ID.
51
+ # @return [Boolean]
52
+ def parameter?
53
+ @props.key?(:parameter)
54
+ end
55
+
56
+ # Returns the syntax parameter ID (if any).
57
+ # @return [Symbol, nil] The syntax parameter ID if any, `nil` otherwise.
58
+ def parameter
59
+ @props.fetch(:parameter, nil)
60
+ end
61
+
62
+ # Tests whether this one has a faulty argument.
63
+ # @return [Boolean]
64
+ def fault?
65
+ @props.key?(:fault)
66
+ end
67
+
68
+ # Returns the faulty argument (if any).
69
+ # @return [String, nil] The faulty argument if any, `nil` otherwise.
70
+ def fault
71
+ @props.fetch(:fault, nil)
72
+ end
73
+
74
+ # Creates a message based on given properties.
75
+ # @param props [Hash<Symbol, Object>]
76
+ # @return [String]
77
+ def self.create_message(props)
78
+ props = props.dup
79
+ msg = props.delete(:message) { |key| raise StandardError, "#{key} property is mandatory" }
80
+ return msg if props.empty?
81
+
82
+ vals = []
83
+ props.each do |key, val|
84
+ vals << "#{key}: \"#{val}\""
85
+ end
86
+ "#{msg} (#{vals.join(', ')})"
33
87
  end
34
88
  end
35
89
 
36
90
  # SyntaxError.
37
91
  class SyntaxError < StandardError
38
- def initialize(msg)
39
- super
40
- end
41
92
  end
42
93
 
43
94
  # Creates a new Syntax.
@@ -52,7 +103,7 @@ module TermUtils
52
103
  # @param syntax [Syntax]
53
104
  # @param arguments [Array<String>]
54
105
  # @param opts [Hash]
55
- # @option opts [Boolean] :strict Whether the Syntax must be considered strict.
106
+ # @option opts [Boolean] :strict Whether the Syntax must be considered as strict.
56
107
  # @return [Result]
57
108
  # @raise [ParseError]
58
109
  # @raise [SyntaxError]
@@ -61,10 +112,3 @@ module TermUtils
61
112
  end
62
113
  end
63
114
  end
64
-
65
- require 'term_utils/ap/article'
66
- require 'term_utils/ap/flag'
67
- require 'term_utils/ap/parameter'
68
- require 'term_utils/ap/syntax'
69
- require 'term_utils/ap/result'
70
- require 'term_utils/ap/parser'
@@ -1,6 +1,6 @@
1
- # frozen-string-literal: true
1
+ # frozen_string_literal: true
2
2
 
3
- # Copyright (C) 2020 Thomas Baron
3
+ # Copyright (C) 2023 Thomas Baron
4
4
  #
5
5
  # This file is part of term_utils.
6
6
  #
@@ -47,8 +47,8 @@ module TermUtils
47
47
  end
48
48
 
49
49
  def initialize_copy(other)
50
- @ignore_list = other.ignore_list.dup
51
50
  super
51
+ @ignore_list = @ignore_list.dup
52
52
  end
53
53
  end
54
54
  end
@@ -1,6 +1,6 @@
1
- # frozen-string-literal: true
1
+ # frozen_string_literal: true
2
2
 
3
- # Copyright (C) 2020 Thomas Baron
3
+ # Copyright (C) 2023 Thomas Baron
4
4
  #
5
5
  # This file is part of term_utils.
6
6
  #
@@ -0,0 +1,255 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (C) 2023 Thomas Baron
4
+ #
5
+ # This file is part of term_utils.
6
+ #
7
+ # term_utils is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU General Public License as published by
9
+ # the Free Software Foundation, version 3 of the License.
10
+ #
11
+ # term_utils is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with term_utils. If not, see <https://www.gnu.org/licenses/>.
18
+
19
+ module TermUtils
20
+ module FF
21
+ # Represents filesystem Entry.
22
+ class FinderEntry
23
+ # @return [Integer]
24
+ attr_accessor :index
25
+ # @return [String]
26
+ attr_accessor :name
27
+ # Identifies the type of stat. The return string is one of: “file”,
28
+ # “directory”, “characterSpecial”, “blockSpecial”, “fifo”, “link”,
29
+ # “socket”, or “unknown”.
30
+ # @return [String]
31
+ attr_accessor :kind
32
+ # Returns the numeric user id of the owner of stat.
33
+ # @return [Integer]
34
+ attr_accessor :uid
35
+ # Returns the numeric group id of the owner of stat.
36
+ # @return [Integer]
37
+ attr_accessor :gid
38
+ # Returns an integer representing the permission bits of stat. The meaning
39
+ # of the bits is platform dependent.
40
+ # @return [Integer]
41
+ attr_accessor :mode
42
+ # Returns the size of stat in bytes.
43
+ # @return [Integer]
44
+ attr_accessor :size
45
+ # @return [Array<String>]
46
+ attr_accessor :path_parts
47
+ # @return [String]
48
+ attr_accessor :path
49
+
50
+ def initialize
51
+ @index = nil
52
+ @name = nil
53
+ @kind = nil
54
+ @path_parts = nil
55
+ @path = nil
56
+ end
57
+
58
+ def directory?
59
+ @kind == 'directory'
60
+ end
61
+
62
+ def file?
63
+ @kind == 'file'
64
+ end
65
+
66
+ # @return [Integer]
67
+ def depth
68
+ @path_parts.length
69
+ end
70
+ end
71
+
72
+ # Represents a Query.
73
+ class FinderQuery
74
+ # @return [Integer]
75
+ attr_accessor :min_depth
76
+ # @return [Integer, nil]
77
+ attr_accessor :max_depth
78
+ # @return [Boolean]
79
+ attr_accessor :use_stat
80
+ # @return [String, Array<String>, nil]
81
+ attr_accessor :entry_kind
82
+
83
+ def initialize
84
+ @min_depth = 0
85
+ @max_depth = nil
86
+ @use_stat = false
87
+ @entry_kind = nil
88
+ @filters = []
89
+ end
90
+
91
+ def filter(kind, &block)
92
+ raise StandardError, 'wrong filter kind' unless %i[enter skip include exclude].include?(kind)
93
+ raise StandardError, "missing #{kind} block" if block.nil?
94
+
95
+ @filters << { kind: kind, block: block }
96
+ end
97
+
98
+ # Wether to enter a directory.
99
+ def enter_directory(&block)
100
+ filter(:enter, &block)
101
+ end
102
+
103
+ # Wether not to enter a directory.
104
+ def skip_directory(&block)
105
+ filter(:skip, &block)
106
+ end
107
+
108
+ # Wether to include an entry into the results.
109
+ def include_entry(&block)
110
+ filter(:include, &block)
111
+ end
112
+
113
+ # Wether to exclue an entry from the results.
114
+ def exclude_entry(&block)
115
+ filter(:exclude, &block)
116
+ end
117
+
118
+ def each_filter(&block)
119
+ @filters.each(&block)
120
+ end
121
+ end
122
+
123
+ # Represents the find method engine.
124
+ class Finder
125
+ attr_reader :query
126
+
127
+ def initialize(paths)
128
+ @paths = paths.dup
129
+ @query = FinderQuery.new
130
+ end
131
+
132
+ def exec
133
+ @paths.each_with_object([]) do |path, obj|
134
+ ctx = { entries: obj, basedir: path }
135
+ list_start(ctx)
136
+ end
137
+ end
138
+
139
+ def list_start(ctx)
140
+ entry = FinderEntry.new.tap do |e|
141
+ e.index = ctx[:entries].length
142
+ e.name = File.basename(ctx[:basedir])
143
+ if @query.use_stat
144
+ st = File.stat(ctx[:basedir])
145
+ e.kind = st.ftype
146
+ e.uid = st.uid
147
+ e.gid = st.gid
148
+ e.mode = st.mode
149
+ e.size = st.size
150
+ end
151
+ e.path_parts = []
152
+ e.path = ctx[:basedir]
153
+ end
154
+ ctx[:entries] << entry if match?(entry) && include?(entry)
155
+ return unless enter?(entry)
156
+
157
+ list(ctx)
158
+ end
159
+
160
+ def list(ctx)
161
+ path_parts = ctx.fetch(:path_parts, [])
162
+ absolute_path =
163
+ if path_parts.empty?
164
+ ctx[:basedir]
165
+ else
166
+ "#{ctx[:basedir]}/#{path_parts.join('/')}"
167
+ end
168
+ entries = Dir.entries(absolute_path)
169
+ entries.each do |name|
170
+ next if %w[. ..].include?(name)
171
+
172
+ entry = FinderEntry.new.tap do |e|
173
+ e.index = ctx[:entries].length
174
+ e.name = name
175
+ if @query.use_stat
176
+ st = File.stat("#{absolute_path}/#{name}")
177
+ e.kind = st.ftype
178
+ e.uid = st.uid
179
+ e.gid = st.gid
180
+ e.mode = st.mode
181
+ e.size = st.size
182
+ end
183
+ e.path_parts = path_parts.dup + [name]
184
+ e.path = "#{ctx[:basedir]}/#{e.path_parts.join('/')}"
185
+ end
186
+ ctx[:entries] << entry if match?(entry) && include?(entry)
187
+ if enter?(entry)
188
+ list(ctx.merge({ path_parts: entry.path_parts }))
189
+ end
190
+ end
191
+ end
192
+
193
+ def match?(entry)
194
+ # (1of2) Depth
195
+ return false if entry.depth < @query.min_depth
196
+ return false if !@query.max_depth.nil? && entry.depth > @query.max_depth
197
+
198
+ # (2of2) Entry kind.
199
+ if @query.entry_kind.nil?
200
+ true
201
+ elsif @query.entry_kind.is_a?(String)
202
+ entry.kind == @query.entry_kind
203
+ elsif @query.entry_kind.is_a?(Array)
204
+ @query.entry_kind.include?(entry.kind)
205
+ else
206
+ false
207
+ end
208
+ end
209
+
210
+ def enter?(entry)
211
+ unless @query.use_stat
212
+ return File.directory?(entry.path)
213
+ end
214
+
215
+ return false unless entry.directory?
216
+
217
+ @query.each_filter do |f|
218
+ case f[:kind]
219
+ when :enter
220
+ return true if f[:block].call(entry)
221
+ when :skip
222
+ return false if f[:block].call(entry)
223
+ end
224
+ end
225
+ true
226
+ end
227
+
228
+ def include?(entry)
229
+ @query.each_filter do |f|
230
+ case f[:kind]
231
+ when :include
232
+ return true if f[:block].call(entry)
233
+ when :exclude
234
+ return false if f[:block].call(entry)
235
+ end
236
+ end
237
+ true
238
+ end
239
+ end
240
+
241
+ # Finds files.
242
+ # @param paths [Array<String>]
243
+ # @return [Array<Hash>]
244
+ def self.find(*paths, &block)
245
+ fdr =
246
+ if paths.empty?
247
+ TermUtils::FF::Finder.new(['.'])
248
+ else
249
+ TermUtils::FF::Finder.new(paths)
250
+ end
251
+ block&.call(fdr.query)
252
+ fdr.exec
253
+ end
254
+ end
255
+ end
@@ -1,6 +1,6 @@
1
- # frozen-string-literal: true
1
+ # frozen_string_literal: true
2
2
 
3
- # Copyright (C) 2020 Thomas Baron
3
+ # Copyright (C) 2023 Thomas Baron
4
4
  #
5
5
  # This file is part of term_utils.
6
6
  #
@@ -28,11 +28,11 @@ module TermUtils
28
28
  end
29
29
 
30
30
  def initialize_copy(other)
31
- @config = other.config.dup
32
31
  super
32
+ @config = @config.dup
33
33
  end
34
34
 
35
- # Adds a Regexp to ignore.
35
+ # Adds a Regexp for ignoring file names.
36
36
  # @param regexp [Regexp]
37
37
  # @return [Query]
38
38
  def ignore(regexp)
@@ -133,10 +133,8 @@ module TermUtils
133
133
  # @param name [String]
134
134
  # @return [Boolean]
135
135
  def self.accept_entry_name?(ctx, name)
136
- ctx.config.ignore_list.each do |i|
137
- if i.match? name
138
- return false
139
- end
136
+ ctx.config.ignore_list.each do |e|
137
+ return false if e.match?(name)
140
138
  end
141
139
  true
142
140
  end
data/lib/term_utils/ff.rb CHANGED
@@ -1,6 +1,6 @@
1
- # frozen-string-literal: true
1
+ # frozen_string_literal: true
2
2
 
3
- # Copyright (C) 2020 Thomas Baron
3
+ # Copyright (C) 2023 Thomas Baron
4
4
  #
5
5
  # This file is part of term_utils.
6
6
  #
@@ -17,7 +17,7 @@
17
17
  # along with term_utils. If not, see <https://www.gnu.org/licenses/>.
18
18
 
19
19
  module TermUtils
20
- # Provides a way to find files.
20
+ # Provides ways to find files.
21
21
  module FF
22
22
  end
23
23
  end
@@ -25,3 +25,4 @@ end
25
25
  require 'term_utils/ff/config'
26
26
  require 'term_utils/ff/entry'
27
27
  require 'term_utils/ff/query'
28
+ require 'term_utils/ff/finder'
@@ -1,6 +1,6 @@
1
- # frozen-string-literal: true
1
+ # frozen_string_literal: true
2
2
 
3
- # Copyright (C) 2020 Thomas Baron
3
+ # Copyright (C) 2023 Thomas Baron
4
4
  #
5
5
  # This file is part of term_utils.
6
6
  #
@@ -191,7 +191,7 @@ module TermUtils
191
191
  # @return [PropertyTreeNode]
192
192
  def find_node(path)
193
193
  catch :found do
194
- each_node(path: path) do |n|
194
+ each_node(path: path) do |n| # rubocop:disable Lint/UnreachableLoop
195
195
  throw :found, n
196
196
  end
197
197
  nil