repo-small-badge 0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 8d016c07e5425d160473ee038e4f425be76d1d9e508a20f00a9418057dd7c980
4
+ data.tar.gz: ccf25c903bb72632592af4f3494fe7e43703c999812e5f6842c0310a3ea558ee
5
+ SHA512:
6
+ metadata.gz: 938fb539afd31f41eeec309264b1e2758dd6a8047f60187cfc505237333dca6961b31af6f14c2a0457f77f4083ef404a3172d1e6da9a92a6b4151f472882f0f9
7
+ data.tar.gz: 772a1738476f175c19d803d146f5c7b9f2e5ba319eab883735b4636a03755579d7eab0d10882885d91d0b134362e4acdfb3cdf406d2b01470fd034aa8e0f1da2
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/.gitignore ADDED
@@ -0,0 +1,15 @@
1
+ .rvmrc
2
+ .bundle
3
+ Gemfile.lock
4
+
5
+ ## PROJECT::GENERAL
6
+ coverage
7
+ rdoc
8
+ pkg
9
+ .sass-cache
10
+ *.gem
11
+
12
+ ## PROJECT::SPECIFIC
13
+
14
+ vendor
15
+ .byebug_history
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
data/.rubocop.yml ADDED
@@ -0,0 +1,7 @@
1
+ Metrics/ModuleLength:
2
+ Exclude:
3
+ - "spec/*_spec.rb"
4
+
5
+ Metrics/BlockLength:
6
+ Exclude:
7
+ - "spec/*_spec.rb"
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ repo-small-badge
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.5.1
data/.travis.yml ADDED
@@ -0,0 +1,20 @@
1
+ language: ruby
2
+ branches:
3
+ only:
4
+ - master
5
+ rvm:
6
+ - 2.5.1
7
+ cache: bundler
8
+ bundler_args: "--jobs=3 --retry=3 --without production"
9
+ matrix:
10
+ fast_finish: true
11
+ script:
12
+ - sh script/travis.sh
13
+ deploy:
14
+ provider: pages
15
+ skip-cleanup: true
16
+ github-token: $GITHUB_TOKEN
17
+ keep-history: true
18
+ verbose: true
19
+ on:
20
+ branch: master
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gemspec
6
+
7
+ gem 'byebug', group: %i[development test]
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2018 Marc Grimme
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,45 @@
1
+ # RepoSmallBadge
2
+
3
+ [![Build Status](https://api.travis-ci.org/MarcGrimme/repo-small-badge.svg?branch=master)](https://secure.travis-ci.org/MarcGrimme/repo-small-badge)
4
+ [![Depfu](https://badges.depfu.com/badges/e794da00404482f66ce7ca05eea9640b/count.svg)](https://depfu.com/github/MarcGrimme/repo-small-badge?project_id=6915)
5
+ ![Coverage](https://marcgrimme.github.io/repo-small-badge/badges/coverage_badge_total.png)
6
+
7
+ *RepoSmalladge* is a gem that can be added to the `Gemfile` and consolidates functionality to produce a badge file.
8
+ The text place and other configurable can be specified at instance time.
9
+
10
+ ## Installation
11
+
12
+ The badge creation is dependent on the [MiniMagic gem](https://github.com/minimagick/minimagick) which requires the [ImageMagick](http://www.imagemagick.org/index.php) software.
13
+
14
+ It can be installed in your Ruby library or rails app as part of the `Gemfile` as follows.
15
+
16
+ ```
17
+ # In your gemfile
18
+ gem 'repo-small-badge', :require => false
19
+ ```
20
+
21
+ ## Usage
22
+
23
+ Most propably you need a surrounding formatter for a different badge you want to create and this gem is implicitly required.
24
+
25
+ Examples are:
26
+ * [SimpleCovSmallBadge](https://github.com/MarcGrimme/simplecov-small-badge)
27
+
28
+ ## Configuration Options
29
+
30
+ The behaviour of `RepoSmallBadge` can be influenced by configuration options that are passed to the constructor as a hash.
31
+ The following options are supported:
32
+
33
+ ## Development
34
+
35
+ After checking out the repo, run `bundle update` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
36
+
37
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
38
+
39
+ ## Contributing
40
+
41
+ 1. Fork it ( https://github.com/marcgrimme/repo-small-badge/fork )
42
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
43
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
44
+ 4. Push to the branch (`git push origin my-new-feature`)
45
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler'
4
+ Bundler::GemHelper.install_tasks
5
+
6
+ require 'rspec/core/rake_task'
7
+ RSpec::Core::RakeTask.new('spec')
8
+
9
+ # If you want to make this the default task
10
+ task default: :spec
data/bin/console ADDED
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'bundler/setup'
5
+ require 'simplecov_small_badge'
6
+
7
+ # You can add fixtures and/or initialization code here to make experimenting
8
+ # with your gem easier. You can also use a different console, if you like.
9
+
10
+ # (If you use this, don't forget to add pry to your Gemfile!)
11
+ # require "pry"
12
+ # Pry.start
13
+
14
+ # rubocop:disable Style/GlobalVars
15
+ $badge = RepoSmallBadge::Image.new(config)
16
+ # rubocop:enable Style/GlobalVars
17
+
18
+ require 'irb'
19
+ IRB.start
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nodoc:
4
+ module RepoSmallBadge
5
+ end
6
+
7
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__)))
8
+ require 'repo_small_badge/version'
9
+ require 'repo_small_badge/image'
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'mini_magick'
4
+
5
+ ImageMagickError = Class.new(StandardError)
6
+
7
+ module RepoSmallBadge
8
+ # :nodoc:
9
+ class Image
10
+ # Create new instance.
11
+ # @config is a Hash of configurables. Keys are symbols.
12
+ def initialize(config = {})
13
+ raise ImageMagicError, 'Imagemagick is not installed on this system.' \
14
+ unless MiniMagick.imagemagick?
15
+
16
+ @config = config
17
+ MiniMagick.logger = Logger.new($stdout, level:
18
+ @config.fetch(:log_level, 'info')
19
+ .to_sym)
20
+ end
21
+
22
+ # Creates the badge.
23
+ # @name the suffix for the filename (badge_#{name})
24
+ # @title the title of the badge.
25
+ # @value is the overall value to be written to the right side of the badge.
26
+ # @state can be either good, bad, unknown
27
+ # (background color is determined from it.)
28
+ def badge(name, title, value, state)
29
+ MiniMagick::Tool::Convert.new do |convert|
30
+ convert.gravity('center')
31
+ convert.background(@config.fetch(:background, 'transparent'))
32
+ convert.pango(pango(title, value, state))
33
+ rounded_border? &&
34
+ rounded_border(convert,
35
+ @config.fetch(:rounded_edge_radius, 3))
36
+ convert << filename(name)
37
+ end
38
+ true
39
+ end
40
+
41
+ private
42
+
43
+ # rubocop:disable Lint/Void, Metrics/LineLength, Metrics/MethodLength, Metrics/AbcSize
44
+ def rounded_border(convert, radius = 3)
45
+ convert.stack do |stack|
46
+ stack.clone.+
47
+ stack.alpha('extract')
48
+ stack.draw("fill black polygon 0,0 0,#{radius} #{radius},0 fill white circle #{radius},#{radius} #{radius},0")
49
+ stack.stack do |stack1|
50
+ stack1.clone.+
51
+ stack1.flip
52
+ end
53
+ stack.compose('Multiply')
54
+ stack.composite
55
+ stack.stack do |stack1|
56
+ stack1.clone.+
57
+ stack1.flop
58
+ end
59
+ stack.compose('Multiply')
60
+ stack.composite
61
+ end
62
+ convert.alpha('off')
63
+ convert.compose('CopyOpacity')
64
+ convert.composite
65
+ end
66
+ # rubocop:enable Lint/Void, Metrics/LineLength, Metrics/MethodLength, Metrics/AbcSize
67
+
68
+ def rounded_border?
69
+ @config.fetch(:rounded_border, true)
70
+ end
71
+
72
+ def pango(title, value, state)
73
+ "#{pango_title(title)}#{pango_value(value, state)}"
74
+ end
75
+
76
+ def pango_title(suffix)
77
+ pango_text(title(suffix), @config.fetch(:title_font, 'Helvetica'),
78
+ @config.fetch(:title_font_color, 'white'),
79
+ @config.fetch(:title_font_size, '16'),
80
+ @config.fetch(:title_background, '#595959'))
81
+ end
82
+
83
+ def pango_value(value, state)
84
+ pango_text " #{value} ",
85
+ @config.fetch(:value_font, 'Helvetica-Narrow-Bold'),
86
+ @config.fetch(:coverage_font_color, 'white'),
87
+ @config.fetch(:coverage_font_size, '16'),
88
+ state_background(state)
89
+ end
90
+
91
+ def pango_text(text, font, font_color, font_size, background)
92
+ "<span foreground=\"#{font_color}\"
93
+ background=\"#{background}\"\
94
+ size=\"#{font_size.to_i * 1000}\"\
95
+ font=\"#{font}\"\
96
+ >#{text}</span>"
97
+ end
98
+
99
+ def state_background(state)
100
+ @config.fetch(:"value_background_#{state}", 'yellow')
101
+ end
102
+
103
+ def filename(suffix = '')
104
+ prefix = @config.fetch(:filename_prefix, 'badge')
105
+ format = @config.fetch(:format, 'png')
106
+ "#{output_path}/#{prefix}_#{suffix}.#{format}"
107
+ end
108
+
109
+ def title(suffix)
110
+ " #{@config.fetch(:title_prefix, 'badge')} #{suffix} "
111
+ end
112
+
113
+ def output_path
114
+ @config.fetch(:output_path, '.')
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RepoSmallBadge
4
+ VERSION = '0.1'
5
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ $LOAD_PATH.push File.expand_path('lib', __dir__)
4
+ require 'repo_small_badge/version'
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = 'repo-small-badge'
8
+ s.version = RepoSmallBadge::VERSION
9
+ s.platform = Gem::Platform::RUBY
10
+ s.authors = ['Marc Grimme']
11
+ s.email = ['marc.grimme at gmail dot com']
12
+ s.license = 'MIT'
13
+ s.homepage = 'https://github.com/marcgrimme/repo-small-badge'
14
+ s.summary = %(Small Badge generator to be used for different tools 4 ruby)
15
+ s.description = %(Small Badge generator to be used for different tools 4 ruby)
16
+
17
+ s.rubyforge_project = 'repo-small-badge'
18
+
19
+ s.add_dependency 'mini_magick'
20
+ s.add_development_dependency 'rake'
21
+ s.add_development_dependency 'rspec'
22
+ s.add_development_dependency 'rubocop'
23
+ s.add_development_dependency 'simplecov'
24
+ # s.add_development_dependency 'simplecov-small-badge'
25
+
26
+ s.files = `git ls-files`.split("\n")
27
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
28
+ s.executables = `git ls-files -- bin/*`
29
+ .split("\n").map { |f| File.basename(f) }
30
+ s.require_paths = ['lib']
31
+ end
data/script/travis.sh ADDED
@@ -0,0 +1,11 @@
1
+ #!/bin/sh
2
+ set -e
3
+ RUBYCRITICLIMIT=${RUBYCRITICLIMIT:-"90.0"}
4
+
5
+ bundle exec rspec
6
+ bundle exec rubocop
7
+ gem install bundler-audit && bundle-audit update && bundle-audit check
8
+ gem install rubycritic && rubycritic app lib config ${RUBYCRITICPARAMS} --format console --minimum-score ${RUBYCRITICLIMIT}
9
+ echo "Pushing badges upstream"
10
+ [ -d badges ] || mkdir badges
11
+ cp coverage/*.png badges/ 2>/dev/null || true
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe RepoSmallBadge::Image do
6
+ include TestRepoSmallBadge::Mocks
7
+
8
+ context '#coverage_total' do
9
+ describe '#coverage' do
10
+ it do
11
+ mock_mini_magick(name: 'total', title: 'badge Total',
12
+ color: 'yellow', value: '100',
13
+ output_path: '.',
14
+ stack: mock_mini_magick_stack)
15
+ expect(subject.badge('total', 'Total', 100, 'good'))
16
+ .to be_truthy
17
+ end
18
+
19
+ context 'without rounded' do
20
+ subject { described_class.new(rounded_border: false) }
21
+ it do
22
+ mock_mini_magick(name: 'total', title: 'badge Total',
23
+ color: 'yellow', value: '100',
24
+ rounded_border: false,
25
+ output_path: '.',
26
+ stack: mock_mini_magick_stack)
27
+ expect(subject.badge('total', 'Total', 100, 'good')).to be_truthy
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'simplecov'
4
+ require 'byebug'
5
+
6
+ SimpleCov.start do
7
+ # module SimpleCovSmallBadge
8
+ # class Formatter
9
+ # end
10
+ # end
11
+ #
12
+ # SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new(
13
+ # [
14
+ # SimpleCov::Formatter::HTMLFormatter,
15
+ # SimpleCovSmallBadge::Formatter
16
+ # ]
17
+ # )
18
+ end
19
+
20
+ SimpleCov.minimum_coverage 100
21
+
22
+ # require 'simplecov-small-badge'
23
+ require 'repo_small_badge'
24
+ require 'rubygems'
25
+ require 'bundler/setup'
26
+
27
+ Dir[File.join('./spec/support/*.rb')].each { |f| require f }
28
+
29
+ # SimpleCovSmallBadge.configure do |config|
30
+ # # config.rounded_border = false
31
+ # end
32
+
33
+ RSpec.configure do |config|
34
+ # some (optional) config here
35
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TestRepoSmallBadge
4
+ module Mocks
5
+ # rubocop:disable Metrics/LineLength
6
+ def pango_text_match(title = 'badge', color = 'green', value = '100')
7
+ %(<span foreground="white"
8
+ background="#595959" size="16000" font="Helvetica" > #{title} </span><span foreground="white"
9
+ background="#{color}" size="16000" font="Helvetica-Narrow-Bold" > #{value} </span>)
10
+ end
11
+ # rubocop:enable Metrics/LineLength
12
+
13
+ # rubocop:disable Metrics/LineLength, Metrics/AbcSize
14
+ def mock_mini_magick_stack(stack = instance_double('Stack'))
15
+ allow(stack).to receive_message_chain('clone.+')
16
+ allow(stack).to receive(:alpha).with('extract')
17
+ allow(stack).to receive(:draw).with('fill black polygon 0,0 0,3 3,0 fill white circle 3,3 3,0')
18
+ allow(stack).to receive(:flip)
19
+ allow(stack).to receive(:flop)
20
+ allow(stack).to receive(:compose).with('Multiply')
21
+ allow(stack).to receive(:composite)
22
+ allow(stack).to receive(:stack).and_yield(stack)
23
+ stack
24
+ end
25
+ # rubocop:enable Metrics/LineLength, Metrics/AbcSize
26
+
27
+ # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
28
+ def mock_mini_magick(**keys)
29
+ keys[:convert] ||= instance_double('Convert')
30
+ convert = keys[:convert]
31
+ pango_text = pango_text_match(keys[:title], keys[:color], keys[:value])
32
+ allow(MiniMagick::Tool::Convert)
33
+ .to receive(:new).and_yield(keys[:convert])
34
+ allow(convert).to receive(:gravity).with('center')
35
+ allow(convert).to receive(:background).with('transparent')
36
+ allow(convert).to receive(:pango).with(pango_text)
37
+
38
+ if keys.fetch(:rounded_border, true)
39
+ allow(convert).to receive(:stack).and_yield(keys[:stack])
40
+ allow(convert).to receive(:compose).with('CopyOpacity')
41
+ allow(convert).to receive(:alpha).with('off')
42
+ allow(convert).to receive(:composite)
43
+ end
44
+ allow(convert).to receive(:<<)
45
+ .with("#{keys[:output_path]}/badge_#{keys[:name]}.png")
46
+ convert
47
+ end
48
+ # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
49
+ end
50
+ end
metadata ADDED
@@ -0,0 +1,135 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: repo-small-badge
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ platform: ruby
6
+ authors:
7
+ - Marc Grimme
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-02-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: mini_magick
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: Small Badge generator to be used for different tools 4 ruby
84
+ email:
85
+ - marc.grimme at gmail dot com
86
+ executables:
87
+ - console
88
+ extensions: []
89
+ extra_rdoc_files: []
90
+ files:
91
+ - ".document"
92
+ - ".gitignore"
93
+ - ".rspec"
94
+ - ".rubocop.yml"
95
+ - ".ruby-gemset"
96
+ - ".ruby-version"
97
+ - ".travis.yml"
98
+ - Gemfile
99
+ - MIT-LICENSE
100
+ - README.md
101
+ - Rakefile
102
+ - bin/console
103
+ - lib/repo_small_badge.rb
104
+ - lib/repo_small_badge/image.rb
105
+ - lib/repo_small_badge/version.rb
106
+ - repo-small-badge.gemspec
107
+ - script/travis.sh
108
+ - spec/repo_small_badge_spec.rb
109
+ - spec/spec_helper.rb
110
+ - spec/support/mocks.rb
111
+ homepage: https://github.com/marcgrimme/repo-small-badge
112
+ licenses:
113
+ - MIT
114
+ metadata: {}
115
+ post_install_message:
116
+ rdoc_options: []
117
+ require_paths:
118
+ - lib
119
+ required_ruby_version: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ required_rubygems_version: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
129
+ requirements: []
130
+ rubyforge_project: repo-small-badge
131
+ rubygems_version: 2.7.6
132
+ signing_key:
133
+ specification_version: 4
134
+ summary: Small Badge generator to be used for different tools 4 ruby
135
+ test_files: []