pragmater 6.3.3 → 8.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pragmater
4
+ module Formatters
5
+ # Formats shebang pragmas in a consistent manner.
6
+ class Shebang
7
+ PATTERN = %r(\A\#!\s?/.*ruby\Z).freeze
8
+
9
+ def initialize string, pattern: PATTERN
10
+ @string = string
11
+ @pattern = pattern
12
+ end
13
+
14
+ def call
15
+ return string unless string.match? pattern
16
+
17
+ string.split("!").then { |octothorpe, path| "#{octothorpe}! #{path.strip}" }
18
+ end
19
+
20
+ private
21
+
22
+ attr_reader :string, :pattern
23
+ end
24
+ end
25
+ end
@@ -3,20 +3,10 @@
3
3
  module Pragmater
4
4
  # Gem identity information.
5
5
  module Identity
6
- def self.name
7
- "pragmater"
8
- end
9
-
10
- def self.label
11
- "Pragmater"
12
- end
13
-
14
- def self.version
15
- "6.3.3"
16
- end
17
-
18
- def self.version_label
19
- "#{label} #{version}"
20
- end
6
+ NAME = "pragmater"
7
+ LABEL = "Pragmater"
8
+ VERSION = "8.0.0"
9
+ VERSION_LABEL = "#{LABEL} #{VERSION}"
10
+ SUMMARY = "A command line interface for managing/formatting source file pragma comments."
21
11
  end
22
12
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pragmater
4
+ module Parsers
5
+ # Manages pragma comments.
6
+ class Comments
7
+ def initialize older, newer, formatter: Formatters::Main
8
+ @formatter = formatter
9
+ @older = format older
10
+ @newer = format newer
11
+ end
12
+
13
+ def insert
14
+ older.union newer
15
+ end
16
+
17
+ def remove
18
+ older - older.intersection(newer)
19
+ end
20
+
21
+ private
22
+
23
+ attr_reader :formatter, :older, :newer
24
+
25
+ def format pragmas
26
+ Array(pragmas).map { |pragma| formatter.new(pragma).call }
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pragmater
4
+ module Parsers
5
+ # Parses a file into pragma comment and body lines.
6
+ class File
7
+ def initialize pattern: Formatters::Main::PATTERN,
8
+ comments: Comments,
9
+ processor: Processors::Handler.new
10
+ @pattern = pattern
11
+ @comments = comments
12
+ @processor = processor
13
+ end
14
+
15
+ def call path, new_comments, action:
16
+ path.each_line
17
+ .partition { |line| line.match? pattern }
18
+ .then do |old_comments, body|
19
+ processor.call action, wrap_in_new_line(old_comments, new_comments, action), body
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ attr_reader :pattern, :comments, :processor
26
+
27
+ def wrap_in_new_line old_comments, new_comments, action
28
+ comments.new(old_comments, new_comments).public_send(action).map { |line| "#{line}\n" }
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pragmater
4
+ module Processors
5
+ # Handles the insertion or removal of pragma comments.
6
+ class Handler
7
+ DEFAULTS = {
8
+ insert: Inserter,
9
+ remove: Remover
10
+ }.freeze
11
+
12
+ def initialize processors: DEFAULTS
13
+ @processors = processors
14
+ end
15
+
16
+ def call action, comments, body
17
+ processors.fetch(action).new(comments, body).call
18
+ end
19
+
20
+ private
21
+
22
+ attr_reader :processors
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pragmater
4
+ module Processors
5
+ # Inserts new pragma comments.
6
+ class Inserter
7
+ def initialize comments, body
8
+ @comments = comments
9
+ @body = body
10
+ end
11
+
12
+ def call
13
+ body.first.then do |first|
14
+ comments.append "\n" unless first == "\n" || body.empty?
15
+ comments + body
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ attr_reader :comments, :body
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pragmater
4
+ module Processors
5
+ # Removes existing pragma comments.
6
+ class Remover
7
+ def initialize comments, body
8
+ @comments = comments
9
+ @body = body
10
+ end
11
+
12
+ def call
13
+ body.first.then do |first_line|
14
+ body.delete_at 0 if first_line == "\n" && comments.empty?
15
+ comments + body
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ attr_reader :comments, :body
22
+ end
23
+ end
24
+ end
@@ -1,32 +1,34 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "pathname"
4
+ require "refinements/pathnames"
5
+
3
6
  module Pragmater
4
7
  # Adds/removes pragma comments for files in given path.
5
8
  class Runner
6
- # rubocop:disable Metrics/ParameterLists
7
- def initialize path = ".", comments: [], includes: [], writer: Writer
8
- @path = Pathname path
9
- @comments = Array comments
10
- @includes = Array includes
11
- @writer = writer
12
- end
13
- # rubocop:enable Metrics/ParameterLists
9
+ using Refinements::Pathnames
14
10
 
15
- def files
16
- return [] unless path.exist? && path.directory? && !includes.empty?
11
+ def self.for **attributes
12
+ new Context[attributes]
13
+ end
17
14
 
18
- Pathname.glob(%(#{path}/{#{includes.join ","}})).select(&:file?)
15
+ def initialize context, parser: Parsers::File.new
16
+ @context = context
17
+ @parser = parser
19
18
  end
20
19
 
21
- def run action:
22
- files.each do |file|
23
- writer.new(file, comments).public_send action
24
- yield file if block_given?
25
- end
20
+ def call
21
+ Pathname(context.root_dir).files("{#{context.includes.join ","}}").map(&method(:write))
26
22
  end
27
23
 
28
24
  private
29
25
 
30
- attr_reader :path, :comments, :includes, :writer
26
+ attr_reader :context, :parser
27
+
28
+ def write path
29
+ path.tap do |a_path|
30
+ a_path.write parser.call(a_path, context.comments, action: context.action).join
31
+ end
32
+ end
31
33
  end
32
34
  end
metadata CHANGED
@@ -1,18 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pragmater
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.3.3
4
+ version: 8.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brooke Kuhlmann
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- MIIC/jCCAeagAwIBAgIBAjANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBpicm9v
14
- a2UvREM9YWxjaGVtaXN0cy9EQz1pbzAeFw0xOTAyMTcxNjAxMTFaFw0yMDAyMTcx
15
- NjAxMTFaMCUxIzAhBgNVBAMMGmJyb29rZS9EQz1hbGNoZW1pc3RzL0RDPWlvMIIB
13
+ MIIC/jCCAeagAwIBAgIBAzANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBpicm9v
14
+ a2UvREM9YWxjaGVtaXN0cy9EQz1pbzAeFw0yMDAzMTUxNDQ1MzJaFw0yMTAzMTUx
15
+ NDQ1MzJaMCUxIzAhBgNVBAMMGmJyb29rZS9EQz1hbGNoZW1pc3RzL0RDPWlvMIIB
16
16
  IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6l1qpXTiomH1RfMRloyw7MiE
17
17
  xyVx/x8Yc3EupdH7uhNaTXQGyORN6aOY//1QXXMHIZ9tW74nZLhesWMSUMYy0XhB
18
18
  brs+KkurHnc9FnEJAbG7ebGvl/ncqZt72nQvaxpDxvuCBHgJAz+8i5wl6FhLw+oT
@@ -20,72 +20,44 @@ cert_chain:
20
20
  D5vkU0YlAm1r98BymuJlcQ1qdkVEI1d48ph4kcS0S0nv1RiuyVb6TCAR3Nu3VaVq
21
21
  3fPzZKJLZBx67UvXdbdicWPiUR75elI4PXpLIic3xytaF52ZJYyKZCNZJhNwfQID
22
22
  AQABozkwNzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU0nzow9vc
23
- 2CdikiiE3fJhP/gY4ggwDQYJKoZIhvcNAQELBQADggEBANgfX7kPZkJvsbdWMvbe
24
- DUUYxRTqTUzCDpLd2p3sQvgLMKjTNSKt6CFq/kh+98b6RCgO6DqiVfxvOEq02dvf
25
- ebMN/ylQqan2FgiAs1rpP0/D4C0MlBjoDktsT+2IyLol1KmkDB20ExJ4Sf1GRNdA
26
- hpWOtcgqHtmrc7xzgB6BuyoYufrKKUlCO3ewTM4C375D2qO7hIdKuMOO3CdPMtSk
27
- OrWpbzCL+nbbXqeoqiHgZaUvcyyQrGj5sQRxMTzuMXzzQxtHnuTuKrcz16HMTX/O
28
- dKvURM+1PwDCzC5tvRwjhUJIizau6+MtkFCvJHmaAj1aZL3odcPejHj5Hxt/0CUW
29
- y84=
23
+ 2CdikiiE3fJhP/gY4ggwDQYJKoZIhvcNAQELBQADggEBAIHhAlD3po4sTYqacXaQ
24
+ XI9jIhrfMy//2PgbHWcETtlJPBeNUbbSNBABcllUHKqYsVDlSvSmss034KSWNR8F
25
+ bF1GcloicyvcCC4y6IoW4it0COAcdeaaxkxiBSgKdQFpff9REnDlIKK4uQ9lLxIo
26
+ Y2G5xubiziKZkyfWFuSr67PIjW3Bu673D1JVBArhA1qbgQmYQcy1CkGOjo+iO8Nf
27
+ 7u/QSfBHb+r/bXhKscDgPpnKwbUmvgO2+94zJG9KsrmIydlzYfsD09aXKx0t6Xy4
28
+ 2XV8FRa7/JimI07sPLC13eLY3xd/aYTi85Z782KIA4j0G8XEEWAX0ouBhlXPocZv
29
+ QWc=
30
30
  -----END CERTIFICATE-----
31
- date: 2019-11-01 00:00:00.000000000 Z
31
+ date: 2020-08-25 00:00:00.000000000 Z
32
32
  dependencies:
33
33
  - !ruby/object:Gem::Dependency
34
- name: runcom
34
+ name: refinements
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: '5.0'
39
+ version: '7.7'
40
40
  type: :runtime
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: '5.0'
46
+ version: '7.7'
47
47
  - !ruby/object:Gem::Dependency
48
- name: thor
48
+ name: runcom
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '0.20'
53
+ version: '6.0'
54
54
  type: :runtime
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: '0.20'
61
- - !ruby/object:Gem::Dependency
62
- name: awesome_print
63
- requirement: !ruby/object:Gem::Requirement
64
- requirements:
65
- - - "~>"
66
- - !ruby/object:Gem::Version
67
- version: '1.8'
68
- type: :development
69
- prerelease: false
70
- version_requirements: !ruby/object:Gem::Requirement
71
- requirements:
72
- - - "~>"
73
- - !ruby/object:Gem::Version
74
- version: '1.8'
75
- - !ruby/object:Gem::Dependency
76
- name: bond
77
- requirement: !ruby/object:Gem::Requirement
78
- requirements:
79
- - - "~>"
80
- - !ruby/object:Gem::Version
81
- version: '0.5'
82
- type: :development
83
- prerelease: false
84
- version_requirements: !ruby/object:Gem::Requirement
85
- requirements:
86
- - - "~>"
87
- - !ruby/object:Gem::Version
88
- version: '0.5'
60
+ version: '6.0'
89
61
  - !ruby/object:Gem::Dependency
90
62
  name: bundler-audit
91
63
  requirement: !ruby/object:Gem::Requirement
@@ -100,48 +72,34 @@ dependencies:
100
72
  - - "~>"
101
73
  - !ruby/object:Gem::Version
102
74
  version: '0.6'
103
- - !ruby/object:Gem::Dependency
104
- name: climate_control
105
- requirement: !ruby/object:Gem::Requirement
106
- requirements:
107
- - - "~>"
108
- - !ruby/object:Gem::Version
109
- version: '0.2'
110
- type: :development
111
- prerelease: false
112
- version_requirements: !ruby/object:Gem::Requirement
113
- requirements:
114
- - - "~>"
115
- - !ruby/object:Gem::Version
116
- version: '0.2'
117
75
  - !ruby/object:Gem::Dependency
118
76
  name: gemsmith
119
77
  requirement: !ruby/object:Gem::Requirement
120
78
  requirements:
121
79
  - - "~>"
122
80
  - !ruby/object:Gem::Version
123
- version: '13.5'
81
+ version: '14.2'
124
82
  type: :development
125
83
  prerelease: false
126
84
  version_requirements: !ruby/object:Gem::Requirement
127
85
  requirements:
128
86
  - - "~>"
129
87
  - !ruby/object:Gem::Version
130
- version: '13.5'
88
+ version: '14.2'
131
89
  - !ruby/object:Gem::Dependency
132
- name: git-cop
90
+ name: git-lint
133
91
  requirement: !ruby/object:Gem::Requirement
134
92
  requirements:
135
93
  - - "~>"
136
94
  - !ruby/object:Gem::Version
137
- version: '3.5'
95
+ version: '1.0'
138
96
  type: :development
139
97
  prerelease: false
140
98
  version_requirements: !ruby/object:Gem::Requirement
141
99
  requirements:
142
100
  - - "~>"
143
101
  - !ruby/object:Gem::Version
144
- version: '3.5'
102
+ version: '1.0'
145
103
  - !ruby/object:Gem::Dependency
146
104
  name: guard-rspec
147
105
  requirement: !ruby/object:Gem::Requirement
@@ -156,48 +114,34 @@ dependencies:
156
114
  - - "~>"
157
115
  - !ruby/object:Gem::Version
158
116
  version: '4.7'
159
- - !ruby/object:Gem::Dependency
160
- name: hirb
161
- requirement: !ruby/object:Gem::Requirement
162
- requirements:
163
- - - "~>"
164
- - !ruby/object:Gem::Version
165
- version: '0.7'
166
- type: :development
167
- prerelease: false
168
- version_requirements: !ruby/object:Gem::Requirement
169
- requirements:
170
- - - "~>"
171
- - !ruby/object:Gem::Version
172
- version: '0.7'
173
117
  - !ruby/object:Gem::Dependency
174
118
  name: pry
175
119
  requirement: !ruby/object:Gem::Requirement
176
120
  requirements:
177
121
  - - "~>"
178
122
  - !ruby/object:Gem::Version
179
- version: '0.10'
123
+ version: '0.13'
180
124
  type: :development
181
125
  prerelease: false
182
126
  version_requirements: !ruby/object:Gem::Requirement
183
127
  requirements:
184
128
  - - "~>"
185
129
  - !ruby/object:Gem::Version
186
- version: '0.10'
130
+ version: '0.13'
187
131
  - !ruby/object:Gem::Dependency
188
132
  name: pry-byebug
189
133
  requirement: !ruby/object:Gem::Requirement
190
134
  requirements:
191
135
  - - "~>"
192
136
  - !ruby/object:Gem::Version
193
- version: '3.5'
137
+ version: '3.9'
194
138
  type: :development
195
139
  prerelease: false
196
140
  version_requirements: !ruby/object:Gem::Requirement
197
141
  requirements:
198
142
  - - "~>"
199
143
  - !ruby/object:Gem::Version
200
- version: '3.5'
144
+ version: '3.9'
201
145
  - !ruby/object:Gem::Dependency
202
146
  name: rake
203
147
  requirement: !ruby/object:Gem::Requirement
@@ -218,14 +162,14 @@ dependencies:
218
162
  requirements:
219
163
  - - "~>"
220
164
  - !ruby/object:Gem::Version
221
- version: '5.4'
165
+ version: '6.0'
222
166
  type: :development
223
167
  prerelease: false
224
168
  version_requirements: !ruby/object:Gem::Requirement
225
169
  requirements:
226
170
  - - "~>"
227
171
  - !ruby/object:Gem::Version
228
- version: '5.4'
172
+ version: '6.0'
229
173
  - !ruby/object:Gem::Dependency
230
174
  name: rspec
231
175
  requirement: !ruby/object:Gem::Requirement
@@ -246,112 +190,112 @@ dependencies:
246
190
  requirements:
247
191
  - - "~>"
248
192
  - !ruby/object:Gem::Version
249
- version: '0.76'
193
+ version: '0.89'
250
194
  type: :development
251
195
  prerelease: false
252
196
  version_requirements: !ruby/object:Gem::Requirement
253
197
  requirements:
254
198
  - - "~>"
255
199
  - !ruby/object:Gem::Version
256
- version: '0.76'
200
+ version: '0.89'
257
201
  - !ruby/object:Gem::Dependency
258
202
  name: rubocop-performance
259
203
  requirement: !ruby/object:Gem::Requirement
260
204
  requirements:
261
205
  - - "~>"
262
206
  - !ruby/object:Gem::Version
263
- version: '1.4'
207
+ version: '1.5'
264
208
  type: :development
265
209
  prerelease: false
266
210
  version_requirements: !ruby/object:Gem::Requirement
267
211
  requirements:
268
212
  - - "~>"
269
213
  - !ruby/object:Gem::Version
270
- version: '1.4'
214
+ version: '1.5'
271
215
  - !ruby/object:Gem::Dependency
272
216
  name: rubocop-rake
273
217
  requirement: !ruby/object:Gem::Requirement
274
218
  requirements:
275
219
  - - "~>"
276
220
  - !ruby/object:Gem::Version
277
- version: '0.3'
221
+ version: '0.5'
278
222
  type: :development
279
223
  prerelease: false
280
224
  version_requirements: !ruby/object:Gem::Requirement
281
225
  requirements:
282
226
  - - "~>"
283
227
  - !ruby/object:Gem::Version
284
- version: '0.3'
228
+ version: '0.5'
285
229
  - !ruby/object:Gem::Dependency
286
230
  name: rubocop-rspec
287
231
  requirement: !ruby/object:Gem::Requirement
288
232
  requirements:
289
233
  - - "~>"
290
234
  - !ruby/object:Gem::Version
291
- version: '1.33'
235
+ version: '1.39'
292
236
  type: :development
293
237
  prerelease: false
294
238
  version_requirements: !ruby/object:Gem::Requirement
295
239
  requirements:
296
240
  - - "~>"
297
241
  - !ruby/object:Gem::Version
298
- version: '1.33'
242
+ version: '1.39'
299
243
  - !ruby/object:Gem::Dependency
300
244
  name: simplecov
301
245
  requirement: !ruby/object:Gem::Requirement
302
246
  requirements:
303
247
  - - "~>"
304
248
  - !ruby/object:Gem::Version
305
- version: '0.13'
249
+ version: '0.18'
306
250
  type: :development
307
251
  prerelease: false
308
252
  version_requirements: !ruby/object:Gem::Requirement
309
253
  requirements:
310
254
  - - "~>"
311
255
  - !ruby/object:Gem::Version
312
- version: '0.13'
313
- - !ruby/object:Gem::Dependency
314
- name: wirb
315
- requirement: !ruby/object:Gem::Requirement
316
- requirements:
317
- - - "~>"
318
- - !ruby/object:Gem::Version
319
- version: '2.1'
320
- type: :development
321
- prerelease: false
322
- version_requirements: !ruby/object:Gem::Requirement
323
- requirements:
324
- - - "~>"
325
- - !ruby/object:Gem::Version
326
- version: '2.1'
327
- description:
256
+ version: '0.18'
257
+ description:
328
258
  email:
329
259
  - brooke@alchemists.io
330
260
  executables:
331
261
  - pragmater
332
262
  extensions: []
333
263
  extra_rdoc_files:
334
- - README.md
335
- - LICENSE.md
264
+ - README.adoc
265
+ - LICENSE.adoc
336
266
  files:
337
- - LICENSE.md
338
- - README.md
267
+ - LICENSE.adoc
268
+ - README.adoc
339
269
  - bin/pragmater
340
270
  - lib/pragmater.rb
341
- - lib/pragmater/cli.rb
342
- - lib/pragmater/commenter.rb
343
- - lib/pragmater/formatter.rb
271
+ - lib/pragmater/cli/helper.rb
272
+ - lib/pragmater/cli/options/assembler.rb
273
+ - lib/pragmater/cli/options/configuration.rb
274
+ - lib/pragmater/cli/options/core.rb
275
+ - lib/pragmater/cli/options/defaults.yml
276
+ - lib/pragmater/cli/options/insert_remove.rb
277
+ - lib/pragmater/cli/options/merger.rb
278
+ - lib/pragmater/cli/shell.rb
279
+ - lib/pragmater/context.rb
280
+ - lib/pragmater/formatters/general.rb
281
+ - lib/pragmater/formatters/main.rb
282
+ - lib/pragmater/formatters/shebang.rb
344
283
  - lib/pragmater/identity.rb
284
+ - lib/pragmater/parsers/comments.rb
285
+ - lib/pragmater/parsers/file.rb
286
+ - lib/pragmater/processors/handler.rb
287
+ - lib/pragmater/processors/inserter.rb
288
+ - lib/pragmater/processors/remover.rb
345
289
  - lib/pragmater/runner.rb
346
- - lib/pragmater/writer.rb
347
- homepage: https://github.com/bkuhlmann/pragmater
290
+ homepage: https://www.alchemists.io/projects/pragmater
348
291
  licenses:
349
292
  - Apache-2.0
350
293
  metadata:
351
- source_code_uri: https://github.com/bkuhlmann/pragmater
352
- changelog_uri: https://github.com/bkuhlmann/pragmater/blob/master/CHANGES.md
353
294
  bug_tracker_uri: https://github.com/bkuhlmann/pragmater/issues
354
- post_install_message:
295
+ changelog_uri: https://www.alchemists.io/projects/pragmater/changes.html
296
+ documentation_uri: https://www.alchemists.io/projects/pragmater
297
+ source_code_uri: https://github.com/bkuhlmann/pragmater
298
+ post_install_message:
355
299
  rdoc_options: []
356
300
  require_paths:
357
301
  - lib
@@ -359,15 +303,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
359
303
  requirements:
360
304
  - - "~>"
361
305
  - !ruby/object:Gem::Version
362
- version: '2.6'
306
+ version: '2.7'
363
307
  required_rubygems_version: !ruby/object:Gem::Requirement
364
308
  requirements:
365
309
  - - ">="
366
310
  - !ruby/object:Gem::Version
367
311
  version: '0'
368
312
  requirements: []
369
- rubygems_version: 3.0.6
370
- signing_key:
313
+ rubygems_version: 3.1.4
314
+ signing_key:
371
315
  specification_version: 4
372
316
  summary: A command line interface for managing/formatting source file pragma comments.
373
317
  test_files: []