rom-files 0.2.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.
- 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,44 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'rom/memory/dataset'
|
|
4
|
+
require_relative '../constants'
|
|
5
|
+
|
|
6
|
+
module ROM
|
|
7
|
+
module Files
|
|
8
|
+
class Dataset < Memory::Dataset
|
|
9
|
+
module MimeType
|
|
10
|
+
def self.included(other)
|
|
11
|
+
super(other)
|
|
12
|
+
other.module_eval do
|
|
13
|
+
option :mime_type, Types::MimeType.optional,
|
|
14
|
+
default: -> { nil }
|
|
15
|
+
|
|
16
|
+
prepend Initializer
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
module Initializer
|
|
21
|
+
def initialize(data, mime_type: nil, include_patterns: ALL, **options)
|
|
22
|
+
if mime_type && include_patterns.all? { |pattern| pattern !~ /\./ }
|
|
23
|
+
include_patterns = include_patterns.inject([]) do |result, pattern|
|
|
24
|
+
result + mime_type.extensions.map { |ext| "#{pattern}.#{ext}" }
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
super(data, mime_type: mime_type, include_patterns: include_patterns, **options)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# @!attribute [r] mime_type
|
|
32
|
+
# MIME-type of files to include
|
|
33
|
+
# @return [MIME::Type?]
|
|
34
|
+
|
|
35
|
+
# @param type [String, nil]
|
|
36
|
+
# @return [Dataset]
|
|
37
|
+
def mime(type = nil)
|
|
38
|
+
type = Types::MimeType[type] if type
|
|
39
|
+
with(mime_type: type)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'rom/memory/dataset'
|
|
4
|
+
require 'rom/files/constants'
|
|
5
|
+
|
|
6
|
+
module ROM
|
|
7
|
+
module Files
|
|
8
|
+
class Dataset < Memory::Dataset
|
|
9
|
+
module Paths
|
|
10
|
+
def self.included(other)
|
|
11
|
+
super(other)
|
|
12
|
+
other.extend ClassInterface
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
module ClassInterface
|
|
16
|
+
# @return [Proc]
|
|
17
|
+
def row_proc
|
|
18
|
+
->(path) { Hash[ID => path] }
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# @!attribute [r] row_proc
|
|
23
|
+
# @return [Proc]
|
|
24
|
+
|
|
25
|
+
# @return [Array<Pathname>]
|
|
26
|
+
def paths
|
|
27
|
+
connection.search(search_patterns, exclude_patterns: exclude_patterns, sorting: sorting, path: path)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Pluck values from a pathname property
|
|
31
|
+
#
|
|
32
|
+
# @overload pluck(field)
|
|
33
|
+
#
|
|
34
|
+
# @example Usage with Symbol
|
|
35
|
+
# users.pluck(:extname).uniq
|
|
36
|
+
# # %w[.rb .rbw]
|
|
37
|
+
#
|
|
38
|
+
# @param [#to_proc, nil] field A name of the property for extracting values from pathname
|
|
39
|
+
#
|
|
40
|
+
# @overload pluck { |pathname| ... }
|
|
41
|
+
#
|
|
42
|
+
# @example Usage with block
|
|
43
|
+
# users.pluck { |pathname| pathname.basename.to_s }
|
|
44
|
+
# # [1, 2, 3]
|
|
45
|
+
#
|
|
46
|
+
# @return [Array]
|
|
47
|
+
#
|
|
48
|
+
# @api public
|
|
49
|
+
def pluck(field = nil, &block)
|
|
50
|
+
block ||= field&.to_proc || row_proc
|
|
51
|
+
paths.map(&block)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# @return [Array<Hash{Symbol => Pathname, String}>]
|
|
55
|
+
def data
|
|
56
|
+
pluck(row_proc)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
alias to_a data
|
|
60
|
+
alias to_ary to_a
|
|
61
|
+
|
|
62
|
+
# Iterate over data using row_proc
|
|
63
|
+
#
|
|
64
|
+
# @return [Enumerator, Array] if block is not given
|
|
65
|
+
#
|
|
66
|
+
# @api private
|
|
67
|
+
def each
|
|
68
|
+
return to_enum unless block_given?
|
|
69
|
+
paths.each { |tuple| yield(row_proc[tuple]) }
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# @return [Integer]
|
|
73
|
+
def count
|
|
74
|
+
to_a.size
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'rom/memory/dataset'
|
|
4
|
+
|
|
5
|
+
module ROM
|
|
6
|
+
module Files
|
|
7
|
+
class Dataset < Memory::Dataset
|
|
8
|
+
module Sorting
|
|
9
|
+
def self.included(other)
|
|
10
|
+
super(other)
|
|
11
|
+
other.module_eval do
|
|
12
|
+
option :sorting, Types::Symbol.optional,
|
|
13
|
+
default: proc { nil }
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# @!attribute [r] sorting
|
|
18
|
+
# @return [Symbol, Proc, nil]
|
|
19
|
+
|
|
20
|
+
# @return [Dataset]
|
|
21
|
+
def sort(sorting = :to_s)
|
|
22
|
+
with(sorting: sorting)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'dry/core/extensions'
|
|
4
|
+
|
|
5
|
+
module ROM
|
|
6
|
+
module Files
|
|
7
|
+
module Extensions
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
extend Dry::Core::Extensions
|
|
11
|
+
|
|
12
|
+
register_extension :text do
|
|
13
|
+
require_relative 'extensions/text/attributes_inferrer'
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
register_extension :markdown do
|
|
17
|
+
require_relative 'extensions/markdown/attributes_inferrer'
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
register_extension :ruby do
|
|
21
|
+
require_relative 'extensions/ruby/attributes_inferrer'
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
register_extension :gem do
|
|
25
|
+
require 'pathname/extensions'
|
|
26
|
+
Pathname.load_extensions :pathmap
|
|
27
|
+
require_relative 'extensions/gem'
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'rom/files/extensions'
|
|
4
|
+
require_relative 'gem/relations/documentations'
|
|
5
|
+
require_relative 'gem/relations/executables'
|
|
6
|
+
require_relative 'gem/relations/implementations'
|
|
7
|
+
require_relative 'gem/relations/specifications'
|
|
8
|
+
|
|
9
|
+
module ROM
|
|
10
|
+
module Files
|
|
11
|
+
load_extensions :ruby, :markdown
|
|
12
|
+
|
|
13
|
+
module Extensions
|
|
14
|
+
module Gem
|
|
15
|
+
# @param config [ROM::Configuration]
|
|
16
|
+
def self.register_extension(config, gateway: :default)
|
|
17
|
+
relations = [Relations::Documentations,
|
|
18
|
+
Relations::Executables,
|
|
19
|
+
Relations::Implementations,
|
|
20
|
+
Relations::Specifications]
|
|
21
|
+
relations.map do |relation|
|
|
22
|
+
relation.gateway gateway
|
|
23
|
+
end
|
|
24
|
+
config.register_relation(*relations)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module ROM
|
|
4
|
+
module Files
|
|
5
|
+
module Extensions
|
|
6
|
+
module Gem
|
|
7
|
+
module Relations
|
|
8
|
+
class Documentations < ROM::Files::Relation
|
|
9
|
+
dataset { recursive }
|
|
10
|
+
|
|
11
|
+
schema 'text/markdown', as: :documentations, infer: true do
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module ROM
|
|
4
|
+
module Files
|
|
5
|
+
module Extensions
|
|
6
|
+
module Gem
|
|
7
|
+
module Relations
|
|
8
|
+
class Executables < ROM::Files::Relation
|
|
9
|
+
dataset { inside('exe') }
|
|
10
|
+
|
|
11
|
+
schema '.', as: :executables, infer: true do
|
|
12
|
+
use :shebang
|
|
13
|
+
use :contents, type: ROM::Files::Types::Ruby::ASTWithComments
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module ROM
|
|
4
|
+
module Files
|
|
5
|
+
module Extensions
|
|
6
|
+
module Gem
|
|
7
|
+
module Relations
|
|
8
|
+
class Implementations < ROM::Files::Relation
|
|
9
|
+
dataset { recursive.inside('lib') }
|
|
10
|
+
|
|
11
|
+
schema 'application/x-ruby', as: :implementations, infer: true do
|
|
12
|
+
use :stat
|
|
13
|
+
|
|
14
|
+
attribute :implementation_path, Types::Path
|
|
15
|
+
attribute :specification_path, Types.ForeignKey(
|
|
16
|
+
:specifications,
|
|
17
|
+
map: ->(path) { path.pathmap('spec/%X_spec.rb') }
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
associations do
|
|
21
|
+
has_one :specification, foreign_key: :specification_path
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module ROM
|
|
4
|
+
module Files
|
|
5
|
+
module Extensions
|
|
6
|
+
module Gem
|
|
7
|
+
module Relations
|
|
8
|
+
class Specifications < ROM::Files::Relation
|
|
9
|
+
dataset { select('*_spec.rb').recursive.inside('spec') }
|
|
10
|
+
|
|
11
|
+
schema 'application/x-ruby', as: :specifications, infer: true do
|
|
12
|
+
use :stat
|
|
13
|
+
|
|
14
|
+
attribute :specification_path, Types::Path
|
|
15
|
+
attribute :implementation_path, Types.ForeignKey(
|
|
16
|
+
:implementations,
|
|
17
|
+
map: ->(path) { path.pathmap('%{^spec,}X.rb') }
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
associations do
|
|
21
|
+
has_one :implementation, foreign_key: :implementation_path
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'types'
|
|
4
|
+
require_relative '../markup/attributes_inferrer'
|
|
5
|
+
|
|
6
|
+
module ROM
|
|
7
|
+
module Files
|
|
8
|
+
module Extensions
|
|
9
|
+
module Markdown
|
|
10
|
+
class AttributesInferrer < Markup::AttributesInferrer
|
|
11
|
+
def markup_type
|
|
12
|
+
Types::Markdown::Document
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
Schema::AttributesInferrer.register 'text/markdown', Extensions::Markdown::AttributesInferrer.new.freeze
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'kramdown'
|
|
4
|
+
require 'rom/files/types'
|
|
5
|
+
|
|
6
|
+
module ROM
|
|
7
|
+
module Files
|
|
8
|
+
module Types
|
|
9
|
+
module Markdown
|
|
10
|
+
KDocument = ::Kramdown::Document
|
|
11
|
+
|
|
12
|
+
Document = Dry::Types::Definition[KDocument].new(KDocument).constructor do |doc|
|
|
13
|
+
doc.is_a?(KDocument) ? doc : KDocument.new(doc)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'rom/files/schema/attributes_inferrer'
|
|
4
|
+
|
|
5
|
+
module ROM
|
|
6
|
+
module Files
|
|
7
|
+
module Extensions
|
|
8
|
+
module Markup
|
|
9
|
+
class AttributesInferrer < Schema::AttributesInferrer
|
|
10
|
+
def infer_attributes(schema, gateway)
|
|
11
|
+
super + infer_markup_attributes(schema, gateway)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def infer_markup_attributes(schema, _gateway)
|
|
15
|
+
[
|
|
16
|
+
build(markup_type.meta(DATA: true), DATA, schema)
|
|
17
|
+
]
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# @return [Dry::Types::Definition]
|
|
21
|
+
def markup_type
|
|
22
|
+
raise NotImplementedError, "#{self.class}#markup_type is not implemented"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def columns
|
|
26
|
+
super + [DATA]
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'types'
|
|
4
|
+
require_relative '../markup/attributes_inferrer'
|
|
5
|
+
|
|
6
|
+
module ROM
|
|
7
|
+
module Files
|
|
8
|
+
module Extensions
|
|
9
|
+
module Ruby
|
|
10
|
+
class AttributesInferrer < Markup::AttributesInferrer
|
|
11
|
+
# @return [Dry::Types::Definition]
|
|
12
|
+
def markup_type
|
|
13
|
+
Types::Ruby::ASTWithComments
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
Schema::AttributesInferrer.register 'application/x-ruby', Extensions::Ruby::AttributesInferrer.new.freeze
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
old_verbose = $VERBOSE
|
|
4
|
+
$VERBOSE = nil
|
|
5
|
+
require 'parser/current'
|
|
6
|
+
$VERBOSE = old_verbose
|
|
7
|
+
require 'rom/files/types'
|
|
8
|
+
|
|
9
|
+
module ROM
|
|
10
|
+
module Files
|
|
11
|
+
module Types
|
|
12
|
+
module Ruby
|
|
13
|
+
ASTNode = Parser::AST::Node
|
|
14
|
+
|
|
15
|
+
AST = ROM::Types.Constructor(ASTNode) do |doc|
|
|
16
|
+
case doc
|
|
17
|
+
when ASTNode
|
|
18
|
+
doc
|
|
19
|
+
when String
|
|
20
|
+
Parser::CurrentRuby.parse(doc)
|
|
21
|
+
when Pathname
|
|
22
|
+
Parser::CurrentRuby.parse(doc.read)
|
|
23
|
+
else
|
|
24
|
+
raise ArgumentError, "Cannot convert #{doc.inspect} to Ruby AST"
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
Comments = Types::Array.of(Parser::Source::Comment)
|
|
29
|
+
|
|
30
|
+
ASTWithComments = ROM::Types.Constructor(Array) do |doc|
|
|
31
|
+
case doc
|
|
32
|
+
when Array
|
|
33
|
+
doc
|
|
34
|
+
when String
|
|
35
|
+
Parser::CurrentRuby.parse_with_comments(doc)
|
|
36
|
+
when Pathname
|
|
37
|
+
Parser::CurrentRuby.parse_file_with_comments(doc.to_s)
|
|
38
|
+
else
|
|
39
|
+
raise ArgumentError, "Cannot convert #{doc.inspect} to Ruby AST"
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|