rom-files 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.editorconfig +9 -0
- data/.gitignore +11 -0
- data/.rspec +3 -0
- data/.rubocop.yml +112 -0
- data/.rubocop_todo.yml +7 -0
- data/.ruby-version +1 -0
- data/.simplecov +6 -0
- data/.travis.yml +24 -0
- data/.yardopts +6 -0
- data/CHANGELOG.md +10 -0
- data/Gemfile +25 -0
- data/Guardfile +48 -0
- data/LICENSE.md +21 -0
- data/README.md +44 -0
- data/Rakefile +37 -0
- data/Roadmap.taskpaper +44 -0
- data/bin/_guard-core +21 -0
- data/bin/console +7 -0
- data/bin/guard +21 -0
- data/bin/rake +21 -0
- data/bin/rspec +21 -0
- data/bin/yard +21 -0
- data/bin/yardoc +21 -0
- data/bin/yri +21 -0
- data/lib/dry/types/pathname.rb +25 -0
- data/lib/pathname/extensions.rb +32 -0
- data/lib/pathname/extensions/constants.rb +12 -0
- data/lib/pathname/extensions/explode.rb +27 -0
- data/lib/pathname/extensions/ext.rb +28 -0
- data/lib/pathname/extensions/partial.rb +30 -0
- data/lib/pathname/extensions/pathmap.rb +128 -0
- data/lib/rom-files.rb +3 -0
- data/lib/rom/files.rb +28 -0
- data/lib/rom/files/associations.rb +6 -0
- data/lib/rom/files/associations/many_to_many.rb +12 -0
- data/lib/rom/files/associations/many_to_one.rb +12 -0
- data/lib/rom/files/associations/one_to_many.rb +12 -0
- data/lib/rom/files/associations/one_to_one.rb +12 -0
- data/lib/rom/files/attribute.rb +21 -0
- data/lib/rom/files/commands/create.rb +18 -0
- data/lib/rom/files/commands/delete.rb +17 -0
- data/lib/rom/files/commands/update.rb +17 -0
- data/lib/rom/files/connection.rb +120 -0
- data/lib/rom/files/constants.rb +16 -0
- data/lib/rom/files/dataset.rb +89 -0
- data/lib/rom/files/dataset/filtering.rb +96 -0
- data/lib/rom/files/dataset/mime_type.rb +44 -0
- data/lib/rom/files/dataset/paths.rb +79 -0
- data/lib/rom/files/dataset/sorting.rb +27 -0
- data/lib/rom/files/extensions.rb +30 -0
- data/lib/rom/files/extensions/gem.rb +29 -0
- data/lib/rom/files/extensions/gem/relations/documentations.rb +18 -0
- data/lib/rom/files/extensions/gem/relations/executables.rb +20 -0
- data/lib/rom/files/extensions/gem/relations/implementations.rb +29 -0
- data/lib/rom/files/extensions/gem/relations/specifications.rb +29 -0
- data/lib/rom/files/extensions/markdown/attributes_inferrer.rb +20 -0
- data/lib/rom/files/extensions/markdown/types.rb +18 -0
- data/lib/rom/files/extensions/markup/attributes_inferrer.rb +32 -0
- data/lib/rom/files/extensions/ruby/attributes_inferrer.rb +21 -0
- data/lib/rom/files/extensions/ruby/types.rb +45 -0
- data/lib/rom/files/extensions/text/attributes_inferrer.rb +20 -0
- data/lib/rom/files/gateway.rb +63 -0
- data/lib/rom/files/plugins/configuration/gem.rb +30 -0
- data/lib/rom/files/plugins/relation/instrumentation.rb +28 -0
- data/lib/rom/files/plugins/schema/contents.rb +72 -0
- data/lib/rom/files/plugins/schema/mime.rb +59 -0
- data/lib/rom/files/plugins/schema/shebang.rb +79 -0
- data/lib/rom/files/plugins/schema/stat.rb +108 -0
- data/lib/rom/files/relation.rb +143 -0
- data/lib/rom/files/schema.rb +77 -0
- data/lib/rom/files/schema/attributes_inferrer.rb +79 -0
- data/lib/rom/files/schema/inferrer.rb +36 -0
- data/lib/rom/files/types.rb +37 -0
- data/lib/rom/files/version.rb +7 -0
- data/rom-files.gemspec +48 -0
- data/spec/integration/rom/files/gateway_spec.rb +28 -0
- data/spec/integration/rom/files/gem_spec.rb +98 -0
- data/spec/integration/rom/files/relations_spec.rb +63 -0
- data/spec/integration/rom/files/schema/inferrer_spec.rb +77 -0
- data/spec/lib/dry/types/pathname_spec.rb +50 -0
- data/spec/lib/pathname/extensions/explode_spec.rb +25 -0
- data/spec/lib/pathname/extensions/ext_spec.rb +33 -0
- data/spec/lib/pathname/extensions/partial_spec.rb +17 -0
- data/spec/lib/pathname/extensions/pathmap_spec.rb +147 -0
- data/spec/lib/rom/files/attribute_spec.rb +43 -0
- data/spec/lib/rom/files/connection_spec.rb +76 -0
- data/spec/lib/rom/files/dataset/inside_spec.rb +22 -0
- data/spec/lib/rom/files/dataset/mime_type_spec.rb +23 -0
- data/spec/lib/rom/files/dataset/recursive_question_mark_spec.rb +42 -0
- data/spec/lib/rom/files/dataset/recursive_spec.rb +29 -0
- data/spec/lib/rom/files/dataset/reject_append_spec.rb +68 -0
- data/spec/lib/rom/files/dataset/reject_spec.rb +26 -0
- data/spec/lib/rom/files/dataset/select_append_spec.rb +69 -0
- data/spec/lib/rom/files/dataset/select_spec.rb +38 -0
- data/spec/lib/rom/files/dataset/sort_spec.rb +22 -0
- data/spec/lib/rom/files/dataset_spec.rb +52 -0
- data/spec/lib/rom/files/extensions/text/attributes_inferrer_spec.rb +54 -0
- data/spec/lib/rom/files/gateway_spec.rb +39 -0
- data/spec/lib/rom/files/plugins/schema/contents_spec.rb +66 -0
- data/spec/lib/rom/files/plugins/schema/mime_spec.rb +66 -0
- data/spec/lib/rom/files/plugins/schema/stat_spec.rb +109 -0
- data/spec/lib/rom/files/relation/pluck_spec.rb +20 -0
- data/spec/lib/rom/files/relation/reject_spec.rb +22 -0
- data/spec/lib/rom/files/relation/select_spec.rb +35 -0
- data/spec/lib/rom/files/relation/sort_spec.rb +21 -0
- data/spec/lib/rom/files/relation/to_a_spec.rb +39 -0
- data/spec/lib/rom/files/relation_spec.rb +10 -0
- data/spec/lib/rom/files/schema/attributes_inferrer_spec.rb +45 -0
- data/spec/lib/rom/files/schema/inferrer_spec.rb +29 -0
- data/spec/lib/rom/files/schema_spec.rb +109 -0
- data/spec/lib/rom/files/types/mime_type_spec.rb +9 -0
- data/spec/lib/rom/files/types/path_spec.rb +10 -0
- data/spec/lib/rom/files/types_spec.rb +6 -0
- data/spec/shared/rom/files/files_setup.rb +19 -0
- data/spec/shared/rom/files/filesystem_setup.rb +10 -0
- data/spec/shared/rom/files/gateway_setup.rb +17 -0
- data/spec/shared/rom/files/media_dataset.rb +10 -0
- data/spec/shared/rom/files/media_files.rb +17 -0
- data/spec/shared/rom/files/media_relation.rb +30 -0
- data/spec/spec_helper.rb +10 -0
- metadata +421 -0
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../markup/attributes_inferrer'
|
4
|
+
|
5
|
+
module ROM
|
6
|
+
module Files
|
7
|
+
module Extensions
|
8
|
+
module Text
|
9
|
+
class AttributesInferrer < Markup::AttributesInferrer
|
10
|
+
# @return [Dry::Types::Definition]
|
11
|
+
def markup_type
|
12
|
+
Types::String
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
Schema::AttributesInferrer.register 'text/plain', Extensions::Text::AttributesInferrer.new.freeze
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'forwardable'
|
4
|
+
require_relative 'connection'
|
5
|
+
require_relative 'extensions'
|
6
|
+
|
7
|
+
module ROM
|
8
|
+
module Files
|
9
|
+
# Files gateway interface
|
10
|
+
#
|
11
|
+
# @example
|
12
|
+
# gateway = ROM::Files::Gateway.new('.')
|
13
|
+
# gateway.dataset(:lib)
|
14
|
+
# gateway[:lib].insert(name: 'rom.rb')
|
15
|
+
#
|
16
|
+
# @api public
|
17
|
+
class Gateway < ROM::Gateway
|
18
|
+
extend Forwardable
|
19
|
+
|
20
|
+
adapter :files
|
21
|
+
|
22
|
+
# @!attribute [r] connection
|
23
|
+
# @return [Connection]
|
24
|
+
|
25
|
+
# @param root [Pathname, #to_s]
|
26
|
+
# @param extensions [Array<Symbol>, Symbol]
|
27
|
+
def initialize(root = Pathname.pwd, extensions: [])
|
28
|
+
@connection = Connection.new(root)
|
29
|
+
Files.load_extensions(*Array(extensions))
|
30
|
+
end
|
31
|
+
|
32
|
+
# @return [Object] default logger
|
33
|
+
#
|
34
|
+
# @api public
|
35
|
+
attr_reader :logger
|
36
|
+
|
37
|
+
# Set default logger for the gateway
|
38
|
+
#
|
39
|
+
# @param logger [Logger] object
|
40
|
+
#
|
41
|
+
# @api public
|
42
|
+
def use_logger(logger)
|
43
|
+
@logger = logger
|
44
|
+
end
|
45
|
+
|
46
|
+
# @param name [Pathname, #to_s]
|
47
|
+
# @return [Dataset]
|
48
|
+
def dataset(name)
|
49
|
+
self[name] || connection.create_dataset(name)
|
50
|
+
end
|
51
|
+
|
52
|
+
# @!method []
|
53
|
+
# @param (see Connection#[])
|
54
|
+
# @return (see Connection#[])
|
55
|
+
def_instance_delegators :connection, :[]
|
56
|
+
|
57
|
+
# @!method dataset?
|
58
|
+
# @param (see Connection#key?)
|
59
|
+
# @return (see Connection#key?)
|
60
|
+
def_instance_delegator :connection, :key?, :dataset?
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rom/files/extensions'
|
4
|
+
|
5
|
+
module ROM
|
6
|
+
module Files
|
7
|
+
module Plugins
|
8
|
+
module Configuration
|
9
|
+
module Gem
|
10
|
+
# Provide methods for registering files relations with common gem setup
|
11
|
+
#
|
12
|
+
# @param configuration [ROM::Configuration]
|
13
|
+
# @param relations [Boolean]
|
14
|
+
# @return [ROM::Configuration]
|
15
|
+
def self.apply(configuration, relations: true, **options)
|
16
|
+
configuration.extend Methods
|
17
|
+
configuration.register_gem_relations(**options) if relations
|
18
|
+
end
|
19
|
+
|
20
|
+
module Methods
|
21
|
+
def register_gem_relations(**options)
|
22
|
+
Files.load_extensions(:gem)
|
23
|
+
Files::Extensions::Gem.register_extension(self, **options)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rom/plugins/relation/instrumentation'
|
4
|
+
|
5
|
+
module ROM
|
6
|
+
module Files
|
7
|
+
module Plugins
|
8
|
+
module Relation
|
9
|
+
# @api private
|
10
|
+
module Instrumentation
|
11
|
+
def self.included(klass)
|
12
|
+
super
|
13
|
+
|
14
|
+
klass.class_eval do
|
15
|
+
include ROM::Plugins::Relation::Instrumentation
|
16
|
+
|
17
|
+
# @api private
|
18
|
+
# @param [ROM::Files::Relation] relation
|
19
|
+
def notification_payload(relation)
|
20
|
+
super.merge(**relation.dataset.options)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rom/files/constants'
|
4
|
+
require 'rom/files/types'
|
5
|
+
|
6
|
+
module ROM
|
7
|
+
module Files
|
8
|
+
module Plugins
|
9
|
+
module Schema
|
10
|
+
# A plugin for automatically adding contents of file
|
11
|
+
# to the schema definition
|
12
|
+
#
|
13
|
+
# @example Generic `DATA` field with String type
|
14
|
+
# schema do
|
15
|
+
# use :contents
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# @example Specify another type
|
19
|
+
# schema do
|
20
|
+
# use :contents, type: Types::YAML
|
21
|
+
# end
|
22
|
+
#
|
23
|
+
# @example Specify another name
|
24
|
+
# # using other types
|
25
|
+
# schema do
|
26
|
+
# use :contents, name: :contents
|
27
|
+
# end
|
28
|
+
#
|
29
|
+
# @api public
|
30
|
+
module Contents
|
31
|
+
NAME = Files::DATA
|
32
|
+
TYPE = Types::String
|
33
|
+
|
34
|
+
# @api private
|
35
|
+
def self.apply(schema, name: NAME, type: TYPE)
|
36
|
+
contents = type.meta(name: name, source: schema.name, DATA: true)
|
37
|
+
|
38
|
+
schema.attributes.concat(
|
39
|
+
schema.class.attributes([contents], schema.attr_class)
|
40
|
+
)
|
41
|
+
end
|
42
|
+
|
43
|
+
# @api private
|
44
|
+
module DSL
|
45
|
+
# Sets non-default contents attribute
|
46
|
+
#
|
47
|
+
# @example Set custom attribute name
|
48
|
+
# schema do
|
49
|
+
# use :contents
|
50
|
+
# contents :contents
|
51
|
+
# end
|
52
|
+
#
|
53
|
+
# @example Set custom type
|
54
|
+
# schema do
|
55
|
+
# use :contents
|
56
|
+
# contents type: Types::JSON
|
57
|
+
# end
|
58
|
+
#
|
59
|
+
# @api public
|
60
|
+
def contents(name = NAME, inline_type = TYPE, type: inline_type)
|
61
|
+
options = plugin_options(:contents)
|
62
|
+
options[:name] = name
|
63
|
+
options[:type] = type
|
64
|
+
|
65
|
+
self
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rom/files/constants'
|
4
|
+
require 'rom/files/types'
|
5
|
+
require 'mime/types/full'
|
6
|
+
|
7
|
+
module ROM
|
8
|
+
module Files
|
9
|
+
module Plugins
|
10
|
+
module Schema
|
11
|
+
# A plugin for obtaining MIME-type of file using its name
|
12
|
+
#
|
13
|
+
# @example Generic `mime_type` field
|
14
|
+
# schema do
|
15
|
+
# use :mime_type
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# @api public
|
19
|
+
module Mime
|
20
|
+
PROC = ->(path) { MIME::Types.type_for(path.basename.to_s).first }
|
21
|
+
TYPE = Types::MimeType.optional
|
22
|
+
|
23
|
+
# @api private
|
24
|
+
def self.apply(schema, name: :mime_type, type: TYPE)
|
25
|
+
mime_type = type.meta(
|
26
|
+
name: name,
|
27
|
+
__proc__: PROC,
|
28
|
+
source: schema.name
|
29
|
+
)
|
30
|
+
|
31
|
+
schema.attributes.concat(
|
32
|
+
schema.class.attributes([mime_type], schema.attr_class)
|
33
|
+
)
|
34
|
+
end
|
35
|
+
|
36
|
+
# @api private
|
37
|
+
module DSL
|
38
|
+
# Sets non-default contents attribute
|
39
|
+
#
|
40
|
+
# @example Set custom attribute name `#type` for MIME-type
|
41
|
+
# schema do
|
42
|
+
# use :mime
|
43
|
+
# mime :type
|
44
|
+
# end
|
45
|
+
#
|
46
|
+
# @api public
|
47
|
+
def mime(name = :mime_type, inline_type = TYPE, type: inline_type)
|
48
|
+
options = plugin_options(:mime)
|
49
|
+
options[:name] = name
|
50
|
+
options[:type] = type
|
51
|
+
|
52
|
+
self
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rom/files/constants'
|
4
|
+
require 'rom/files/types'
|
5
|
+
|
6
|
+
module ROM
|
7
|
+
module Files
|
8
|
+
module Plugins
|
9
|
+
module Schema
|
10
|
+
# A plugin for automatically adding shebang of file
|
11
|
+
# to the schema definition
|
12
|
+
#
|
13
|
+
# @example Generic `DATA` field with String type
|
14
|
+
# schema do
|
15
|
+
# use :shebang
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# @example Specify another type
|
19
|
+
# schema do
|
20
|
+
# use :shebang, type: Types::YAML
|
21
|
+
# end
|
22
|
+
#
|
23
|
+
# @example Specify another name
|
24
|
+
# # using other types
|
25
|
+
# schema do
|
26
|
+
# use :shebang, name: :shebang
|
27
|
+
# end
|
28
|
+
#
|
29
|
+
# @api public
|
30
|
+
module Shebang
|
31
|
+
TYPE = Types::String
|
32
|
+
NAME = :run_with
|
33
|
+
|
34
|
+
# @param path [Pathname]
|
35
|
+
# @return [String, nil]
|
36
|
+
def self.read_shebang(path)
|
37
|
+
shebang = path.readlines.first || ''
|
38
|
+
shebang[2..-1].chomp if shebang.match?(/\A#!/)
|
39
|
+
end
|
40
|
+
|
41
|
+
# @api private
|
42
|
+
def self.apply(schema, name: NAME, type: TYPE)
|
43
|
+
shebang = type.meta(name: name, source: schema.name, __proc__: method(:read_shebang))
|
44
|
+
|
45
|
+
schema.attributes.concat(
|
46
|
+
schema.class.attributes([shebang], schema.attr_class)
|
47
|
+
)
|
48
|
+
end
|
49
|
+
|
50
|
+
# @api private
|
51
|
+
module DSL
|
52
|
+
# Sets non-default shebang attribute
|
53
|
+
#
|
54
|
+
# @example Set custom attribute name
|
55
|
+
# schema do
|
56
|
+
# use :shebang
|
57
|
+
# shebang :shebang
|
58
|
+
# end
|
59
|
+
#
|
60
|
+
# @example Set custom type
|
61
|
+
# schema do
|
62
|
+
# use :shebang
|
63
|
+
# shebang type: Types::JSON
|
64
|
+
# end
|
65
|
+
#
|
66
|
+
# @api public
|
67
|
+
def shebang(name = NAME, inline = TYPE, type: inline)
|
68
|
+
options = plugin_options(:shebang)
|
69
|
+
options[:name] = name
|
70
|
+
options[:type] = type
|
71
|
+
|
72
|
+
self
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rom/files/types'
|
4
|
+
|
5
|
+
module ROM
|
6
|
+
module Files
|
7
|
+
module Plugins
|
8
|
+
module Schema
|
9
|
+
# A plugin for automatically adding stat properties of file
|
10
|
+
# to the schema definition
|
11
|
+
#
|
12
|
+
# @example Generic `__stat__` field with String type
|
13
|
+
# schema do
|
14
|
+
# use :stat
|
15
|
+
# end
|
16
|
+
#
|
17
|
+
# @example Specify another set of properties
|
18
|
+
# schema do
|
19
|
+
# use :stat, properties: %i[]
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# @api public
|
23
|
+
module Stat
|
24
|
+
NAME = :stat
|
25
|
+
|
26
|
+
TYPES = {
|
27
|
+
atime: Types::Time,
|
28
|
+
basename: Types::String,
|
29
|
+
birthtime: Types::Time,
|
30
|
+
blksize: Types::Int.optional,
|
31
|
+
blocks: Types::Int.optional,
|
32
|
+
ctime: Types::Time,
|
33
|
+
dev: Types::Int,
|
34
|
+
dev_major: Types::Int,
|
35
|
+
dev_minor: Types::Int,
|
36
|
+
ftype: Types::FileType,
|
37
|
+
gid: Types::Int,
|
38
|
+
ino: Types::Int,
|
39
|
+
mode: Types::Int,
|
40
|
+
mtime: Types::Time,
|
41
|
+
nlink: Types::Int,
|
42
|
+
rdev: Types::Int,
|
43
|
+
rdev_major: Types::Int,
|
44
|
+
rdev_minor: Types::Int,
|
45
|
+
size: Types::Int,
|
46
|
+
uid: Types::Int
|
47
|
+
}.freeze
|
48
|
+
|
49
|
+
ALIASES = {
|
50
|
+
accessed_at: :atime,
|
51
|
+
changed_at: :ctime,
|
52
|
+
updated_at: :mtime,
|
53
|
+
created_at: :birthtime,
|
54
|
+
type: :ftype
|
55
|
+
}.freeze
|
56
|
+
|
57
|
+
class << self
|
58
|
+
# @api private
|
59
|
+
def apply(schema, name: NAME, stats: EMPTY_ARRAY, aliases: EMPTY_HASH)
|
60
|
+
attributes = []
|
61
|
+
attributes = [build_property(schema, name, type: Types::FileStat)] if name
|
62
|
+
attributes += stats.map { |stat| build_property(schema, stat) }
|
63
|
+
attributes += aliases.map do |as, stat|
|
64
|
+
build_property(schema, as, stat: stat)
|
65
|
+
end
|
66
|
+
|
67
|
+
schema.attributes.concat(
|
68
|
+
schema.class.attributes(attributes, schema.attr_class)
|
69
|
+
)
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def build_property(schema, name, stat: ALIASES[name] || name, type: TYPES[stat])
|
75
|
+
raise ArgumentError, "Unknown property #{(stat || name).inspect}" unless type
|
76
|
+
type.meta(name: name, source: schema.name, __stat__: (stat == NAME) || stat)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# @api private
|
81
|
+
module DSL
|
82
|
+
# @example Sets non-default list of stat properties
|
83
|
+
# schema do
|
84
|
+
# use :stat
|
85
|
+
# stat :basename
|
86
|
+
# end
|
87
|
+
#
|
88
|
+
# @example Sets list of aliased properties
|
89
|
+
# schema do
|
90
|
+
# use :stat
|
91
|
+
# stat aliased: { created_at: :ctime }
|
92
|
+
# end
|
93
|
+
#
|
94
|
+
# @api public
|
95
|
+
def stat(name = NAME, stats: EMPTY_ARRAY, aliases: EMPTY_HASH)
|
96
|
+
options = plugin_options(:stat)
|
97
|
+
options[:name] = name
|
98
|
+
options[:stats] = stats
|
99
|
+
options[:aliases] = aliases
|
100
|
+
|
101
|
+
self
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|