essay 1.0.1
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 +7 -0
- data/.gitignore +15 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/essay.gemspec +22 -0
- data/lib/essay.rb +36 -0
- data/lib/essay/abstract_collection.rb +37 -0
- data/lib/essay/abstract_feature.rb +17 -0
- data/lib/essay/abstract_features.rb +19 -0
- data/lib/essay/association/association_collection.rb +12 -0
- data/lib/essay/association/association_features.rb +14 -0
- data/lib/essay/association/base_feature.rb +14 -0
- data/lib/essay/attribute/attribute_collection.rb +12 -0
- data/lib/essay/attribute/attribute_features.rb +14 -0
- data/lib/essay/attribute/base_feature.rb +14 -0
- data/lib/essay/helpers/association_helper.rb +15 -0
- data/lib/essay/helpers/attribute_helper.rb +15 -0
- data/lib/essay/helpers/description_helper.rb +16 -0
- data/lib/essay/helpers/feature_helper.rb +17 -0
- data/lib/essay/helpers/model_helper.rb +28 -0
- data/lib/essay/helpers/serialize_helper.rb +29 -0
- data/lib/essay/model/base_feature.rb +7 -0
- data/lib/essay/model/model_features.rb +7 -0
- data/lib/essay/version.rb +4 -0
- metadata +122 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c397065af85bfaa45635847b7a96c1ec7e75a7b4
|
4
|
+
data.tar.gz: a4ab9c5a04548f6cccea372596e468bf9fde4cdb
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 58772dc8270cfb20289db16e7fee4969fed6e834ba67dfef46c86056bb71ad11a15ab00d0e0af02714eacca0944436c917f34979917281b9d27873a4f2ad4991
|
7
|
+
data.tar.gz: 8e36d383b357f52fa25835217f2657ec7da439e9639e9826dd9efb9a1730bc72e7fb570cbdc47af8297445b18fe484abf7edcbfd5d5962a5e8acd893327cbf64
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2015 Yaroslav Konoplov
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# Essay
|
2
|
+
|
3
|
+
##### This library provides a series of classes to obtain plugin information of ActiveRecord models.
|
4
|
+
This library is focused only on ***custom*** ActiveRecord features and will not provide information for default ActiveRecord features.
|
5
|
+
|
6
|
+
### The problem
|
7
|
+
There are a lot of plugins for ActiveRecord. For example:
|
8
|
+
|
9
|
+
- Plugins for translation (Globalize)
|
10
|
+
- Plugins for file attachments (CarrierWave, PaperClip)
|
11
|
+
- Plugins for safe deleting (Paranoid)
|
12
|
+
- Plugins for taggings
|
13
|
+
- Plugins for geocoding
|
14
|
+
- Plugins for social networks (likes, shares etc)
|
15
|
+
- and others...
|
16
|
+
|
17
|
+
Each of this plugins adds and/or removes and/or modifies behaviours of model. For example: adds callbacks, validations, methods, adds some imaginary meaning for attributes (good example: `deleted_at` when using paranoid). Each plugin uses different way of storing its options.
|
18
|
+
|
19
|
+
So, what if we need to know what plugins model is using and plugin options? ActiveRecord does not provide standardized way of developing and storing plugin options. **This library provides a series of classes and utilities for creating essay writers (classes which provide information about specific ActiveRecord plugin) with unified API design.**
|
20
|
+
|
21
|
+
### Example for Globalize
|
22
|
+
```ruby
|
23
|
+
# TODO
|
24
|
+
```
|
25
|
+
|
26
|
+
## Gemfile
|
27
|
+
```ruby
|
28
|
+
gem 'essay', github: 'yivo/essay'
|
29
|
+
```
|
data/essay.gemspec
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require File.expand_path('../lib/essay/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = 'essay'
|
6
|
+
s.version = Essay::VERSION
|
7
|
+
s.authors = ['Yaroslav Konoplov']
|
8
|
+
s.email = ['eahome00@gmail.com']
|
9
|
+
s.summary = 'Feature information of activerecord models'
|
10
|
+
s.description = 'Feature information of activerecord models, attributes and associations'
|
11
|
+
s.homepage = 'http://github.com/yivo/essay'
|
12
|
+
s.license = 'MIT'
|
13
|
+
|
14
|
+
s.executables = `git ls-files -z -- bin/*`.split("\x0").map{ |f| File.basename(f) }
|
15
|
+
s.files = `git ls-files -z`.split("\x0")
|
16
|
+
s.test_files = `git ls-files -z -- {test,spec,features}/*`.split("\x0")
|
17
|
+
s.require_paths = ['lib']
|
18
|
+
|
19
|
+
s.add_dependency 'activesupport', '>= 3.0', '< 6.0'
|
20
|
+
s.add_dependency 'activerecord', '>= 3.0', '< 6.0'
|
21
|
+
s.add_dependency 'traits', '~> 1.0'
|
22
|
+
end
|
data/lib/essay.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'active_support/all'
|
3
|
+
require 'active_record'
|
4
|
+
|
5
|
+
require 'essay/model/model_features'
|
6
|
+
require 'essay/model/base_feature'
|
7
|
+
|
8
|
+
require 'essay/attribute/attribute_collection'
|
9
|
+
require 'essay/attribute/attribute_features'
|
10
|
+
require 'essay/attribute/base_feature'
|
11
|
+
|
12
|
+
require 'essay/association/association_collection'
|
13
|
+
require 'essay/association/association_features'
|
14
|
+
require 'essay/association/base_feature'
|
15
|
+
|
16
|
+
class ActiveRecord::Base
|
17
|
+
class << self
|
18
|
+
def features
|
19
|
+
@features_for_model ||= Essay::ModelFeatures.new(model_class: self)
|
20
|
+
end
|
21
|
+
|
22
|
+
def attribute_features(attr_name = nil)
|
23
|
+
@features_for_attrs ||= Essay::AttributeCollection.new(model_class: self)
|
24
|
+
attr_name ? @features_for_attrs[attr_name] : @features_for_attrs
|
25
|
+
end
|
26
|
+
|
27
|
+
def association_features(assoc_name = nil)
|
28
|
+
@features_for_assocs ||= Essay::AssociationCollection.new(model_class: self)
|
29
|
+
assoc_name ? @features_for_assocs[assoc_name] : @features_for_assocs
|
30
|
+
end
|
31
|
+
|
32
|
+
def essay_for(attr_or_assoc)
|
33
|
+
raise NotImplmentedError
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'essay/helpers/model_helper'
|
3
|
+
|
4
|
+
module Essay
|
5
|
+
class AbstractCollection
|
6
|
+
include ModelHelper
|
7
|
+
|
8
|
+
def initialize(env)
|
9
|
+
@env = env
|
10
|
+
@model_class = env.fetch(:model_class)
|
11
|
+
@features_for = {}
|
12
|
+
end
|
13
|
+
|
14
|
+
def [](name)
|
15
|
+
@features_for[convert_key(name)] ||= construct_features(name)
|
16
|
+
end
|
17
|
+
|
18
|
+
def load_contents
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_hash
|
23
|
+
@features_for.each_with_object({}) do |(k, v), memo|
|
24
|
+
memo[k] = v.to_hash
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
protected
|
29
|
+
def construct_features(name)
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
def convert_key(key)
|
34
|
+
key.kind_of?(Symbol) ? key : key.to_sym
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'essay/helpers/model_helper'
|
3
|
+
require 'essay/helpers/serialize_helper'
|
4
|
+
require 'essay/helpers/description_helper'
|
5
|
+
|
6
|
+
module Essay
|
7
|
+
class AbstractFeature
|
8
|
+
include ModelHelper
|
9
|
+
include SerializeHelper
|
10
|
+
include DescriptionHelper
|
11
|
+
|
12
|
+
def initialize(env)
|
13
|
+
@env = env
|
14
|
+
@model_class = env.fetch(:model_class)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'essay/helpers/model_helper'
|
3
|
+
require 'essay/helpers/feature_helper'
|
4
|
+
require 'essay/helpers/serialize_helper'
|
5
|
+
|
6
|
+
module Essay
|
7
|
+
class AbstractFeatures
|
8
|
+
include ModelHelper
|
9
|
+
include FeatureHelper
|
10
|
+
include SerializeHelper
|
11
|
+
|
12
|
+
attr_reader :env
|
13
|
+
|
14
|
+
def initialize(env)
|
15
|
+
@env = env
|
16
|
+
@model_class = env.fetch(:model_class)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'essay/abstract_collection'
|
3
|
+
|
4
|
+
module Essay
|
5
|
+
class AssociationCollection < AbstractCollection
|
6
|
+
def construct_features(assoc_name)
|
7
|
+
Essay::AssociationFeatures.new(@env.merge(association_name: assoc_name))
|
8
|
+
end
|
9
|
+
|
10
|
+
protected :construct_features
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'essay/abstract_features'
|
3
|
+
require 'essay/helpers/association_helper'
|
4
|
+
|
5
|
+
module Essay
|
6
|
+
class AssociationFeatures < AbstractFeatures
|
7
|
+
include AssociationHelper
|
8
|
+
|
9
|
+
def initialize(env)
|
10
|
+
super
|
11
|
+
@association_name = env.fetch(:association_name)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'essay/abstract_feature'
|
3
|
+
require 'essay/helpers/association_helper'
|
4
|
+
|
5
|
+
module Essay
|
6
|
+
class AssociationFeatures::Base < AbstractFeature
|
7
|
+
include AssociationHelper
|
8
|
+
|
9
|
+
def initialize(env)
|
10
|
+
super
|
11
|
+
@association_name = env.fetch(:association_name)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'essay/abstract_collection'
|
3
|
+
|
4
|
+
module Essay
|
5
|
+
class AttributeCollection < AbstractCollection
|
6
|
+
def construct_features(attr_name)
|
7
|
+
Essay::AttributeFeatures.new(@env.merge(attribute_name: attr_name))
|
8
|
+
end
|
9
|
+
|
10
|
+
protected :construct_features
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'essay/abstract_features'
|
3
|
+
require 'essay/helpers/attribute_helper'
|
4
|
+
|
5
|
+
module Essay
|
6
|
+
class AttributeFeatures < AbstractFeatures
|
7
|
+
include AttributeHelper
|
8
|
+
|
9
|
+
def initialize(env)
|
10
|
+
super
|
11
|
+
@attribute_name = env.fetch(:attribute_name)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'essay/abstract_feature'
|
3
|
+
require 'essay/helpers/attribute_helper'
|
4
|
+
|
5
|
+
module Essay
|
6
|
+
class AttributeFeatures::Base < AbstractFeature
|
7
|
+
include AttributeHelper
|
8
|
+
|
9
|
+
def initialize(env)
|
10
|
+
super
|
11
|
+
@attribute_name = env.fetch(:attribute_name)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Essay
|
3
|
+
module AssociationHelper
|
4
|
+
def association_name
|
5
|
+
@association_name
|
6
|
+
end
|
7
|
+
|
8
|
+
def association_traits
|
9
|
+
model_traits.associations[association_name]
|
10
|
+
end
|
11
|
+
|
12
|
+
alias association association_traits
|
13
|
+
alias this_association association
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Essay
|
3
|
+
module AttributeHelper
|
4
|
+
def attribute_name
|
5
|
+
@attribute_name
|
6
|
+
end
|
7
|
+
|
8
|
+
def attribute_traits
|
9
|
+
model_traits.attributes[attribute_name]
|
10
|
+
end
|
11
|
+
|
12
|
+
alias attribute attribute_traits
|
13
|
+
alias this_attribute attribute
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Essay
|
3
|
+
module DescriptionHelper
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
class_attribute :description, instance_predicate: false, instance_writer: false
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
def describe(description)
|
12
|
+
self.description = description
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Essay
|
3
|
+
module ModelHelper
|
4
|
+
def model_class
|
5
|
+
@model_class
|
6
|
+
end
|
7
|
+
|
8
|
+
def model_traits
|
9
|
+
model_class.traits
|
10
|
+
end
|
11
|
+
|
12
|
+
def model_associations
|
13
|
+
model_traits.associations
|
14
|
+
end
|
15
|
+
|
16
|
+
alias all_associations model_associations
|
17
|
+
|
18
|
+
def model_attributes
|
19
|
+
model_traits.attributes
|
20
|
+
end
|
21
|
+
|
22
|
+
alias all_attributes model_attributes
|
23
|
+
|
24
|
+
def model_features
|
25
|
+
model_class.features
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Essay
|
3
|
+
module SerializeHelper
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
module ClassMethods
|
7
|
+
def serialize(options = {}, &block)
|
8
|
+
serialize_steps << { block: block, options: options }
|
9
|
+
end
|
10
|
+
|
11
|
+
def serialize_steps
|
12
|
+
@serialize_steps ||= []
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_hash
|
17
|
+
serialize_steps.each_with_object({}) do |step, result|
|
18
|
+
condition = step.fetch(:options)[:if]
|
19
|
+
if !condition || try(condition)
|
20
|
+
result.merge!(instance_exec(&step.fetch(:block)))
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def serialize_steps
|
26
|
+
self.class.serialize_steps
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
metadata
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: essay
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Yaroslav Konoplov
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-10-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.0'
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '6.0'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '3.0'
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '6.0'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: activerecord
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '3.0'
|
40
|
+
- - "<"
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '6.0'
|
43
|
+
type: :runtime
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '3.0'
|
50
|
+
- - "<"
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '6.0'
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: traits
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '1.0'
|
60
|
+
type: :runtime
|
61
|
+
prerelease: false
|
62
|
+
version_requirements: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - "~>"
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '1.0'
|
67
|
+
description: Feature information of activerecord models, attributes and associations
|
68
|
+
email:
|
69
|
+
- eahome00@gmail.com
|
70
|
+
executables: []
|
71
|
+
extensions: []
|
72
|
+
extra_rdoc_files: []
|
73
|
+
files:
|
74
|
+
- ".gitignore"
|
75
|
+
- Gemfile
|
76
|
+
- LICENSE.txt
|
77
|
+
- README.md
|
78
|
+
- essay.gemspec
|
79
|
+
- lib/essay.rb
|
80
|
+
- lib/essay/abstract_collection.rb
|
81
|
+
- lib/essay/abstract_feature.rb
|
82
|
+
- lib/essay/abstract_features.rb
|
83
|
+
- lib/essay/association/association_collection.rb
|
84
|
+
- lib/essay/association/association_features.rb
|
85
|
+
- lib/essay/association/base_feature.rb
|
86
|
+
- lib/essay/attribute/attribute_collection.rb
|
87
|
+
- lib/essay/attribute/attribute_features.rb
|
88
|
+
- lib/essay/attribute/base_feature.rb
|
89
|
+
- lib/essay/helpers/association_helper.rb
|
90
|
+
- lib/essay/helpers/attribute_helper.rb
|
91
|
+
- lib/essay/helpers/description_helper.rb
|
92
|
+
- lib/essay/helpers/feature_helper.rb
|
93
|
+
- lib/essay/helpers/model_helper.rb
|
94
|
+
- lib/essay/helpers/serialize_helper.rb
|
95
|
+
- lib/essay/model/base_feature.rb
|
96
|
+
- lib/essay/model/model_features.rb
|
97
|
+
- lib/essay/version.rb
|
98
|
+
homepage: http://github.com/yivo/essay
|
99
|
+
licenses:
|
100
|
+
- MIT
|
101
|
+
metadata: {}
|
102
|
+
post_install_message:
|
103
|
+
rdoc_options: []
|
104
|
+
require_paths:
|
105
|
+
- lib
|
106
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - ">="
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: '0'
|
116
|
+
requirements: []
|
117
|
+
rubyforge_project:
|
118
|
+
rubygems_version: 2.5.1
|
119
|
+
signing_key:
|
120
|
+
specification_version: 4
|
121
|
+
summary: Feature information of activerecord models
|
122
|
+
test_files: []
|