rom-files 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (122) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +9 -0
  3. data/.gitignore +11 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +112 -0
  6. data/.rubocop_todo.yml +7 -0
  7. data/.ruby-version +1 -0
  8. data/.simplecov +6 -0
  9. data/.travis.yml +24 -0
  10. data/.yardopts +6 -0
  11. data/CHANGELOG.md +10 -0
  12. data/Gemfile +25 -0
  13. data/Guardfile +48 -0
  14. data/LICENSE.md +21 -0
  15. data/README.md +44 -0
  16. data/Rakefile +37 -0
  17. data/Roadmap.taskpaper +44 -0
  18. data/bin/_guard-core +21 -0
  19. data/bin/console +7 -0
  20. data/bin/guard +21 -0
  21. data/bin/rake +21 -0
  22. data/bin/rspec +21 -0
  23. data/bin/yard +21 -0
  24. data/bin/yardoc +21 -0
  25. data/bin/yri +21 -0
  26. data/lib/dry/types/pathname.rb +25 -0
  27. data/lib/pathname/extensions.rb +32 -0
  28. data/lib/pathname/extensions/constants.rb +12 -0
  29. data/lib/pathname/extensions/explode.rb +27 -0
  30. data/lib/pathname/extensions/ext.rb +28 -0
  31. data/lib/pathname/extensions/partial.rb +30 -0
  32. data/lib/pathname/extensions/pathmap.rb +128 -0
  33. data/lib/rom-files.rb +3 -0
  34. data/lib/rom/files.rb +28 -0
  35. data/lib/rom/files/associations.rb +6 -0
  36. data/lib/rom/files/associations/many_to_many.rb +12 -0
  37. data/lib/rom/files/associations/many_to_one.rb +12 -0
  38. data/lib/rom/files/associations/one_to_many.rb +12 -0
  39. data/lib/rom/files/associations/one_to_one.rb +12 -0
  40. data/lib/rom/files/attribute.rb +21 -0
  41. data/lib/rom/files/commands/create.rb +18 -0
  42. data/lib/rom/files/commands/delete.rb +17 -0
  43. data/lib/rom/files/commands/update.rb +17 -0
  44. data/lib/rom/files/connection.rb +120 -0
  45. data/lib/rom/files/constants.rb +16 -0
  46. data/lib/rom/files/dataset.rb +89 -0
  47. data/lib/rom/files/dataset/filtering.rb +96 -0
  48. data/lib/rom/files/dataset/mime_type.rb +44 -0
  49. data/lib/rom/files/dataset/paths.rb +79 -0
  50. data/lib/rom/files/dataset/sorting.rb +27 -0
  51. data/lib/rom/files/extensions.rb +30 -0
  52. data/lib/rom/files/extensions/gem.rb +29 -0
  53. data/lib/rom/files/extensions/gem/relations/documentations.rb +18 -0
  54. data/lib/rom/files/extensions/gem/relations/executables.rb +20 -0
  55. data/lib/rom/files/extensions/gem/relations/implementations.rb +29 -0
  56. data/lib/rom/files/extensions/gem/relations/specifications.rb +29 -0
  57. data/lib/rom/files/extensions/markdown/attributes_inferrer.rb +20 -0
  58. data/lib/rom/files/extensions/markdown/types.rb +18 -0
  59. data/lib/rom/files/extensions/markup/attributes_inferrer.rb +32 -0
  60. data/lib/rom/files/extensions/ruby/attributes_inferrer.rb +21 -0
  61. data/lib/rom/files/extensions/ruby/types.rb +45 -0
  62. data/lib/rom/files/extensions/text/attributes_inferrer.rb +20 -0
  63. data/lib/rom/files/gateway.rb +63 -0
  64. data/lib/rom/files/plugins/configuration/gem.rb +30 -0
  65. data/lib/rom/files/plugins/relation/instrumentation.rb +28 -0
  66. data/lib/rom/files/plugins/schema/contents.rb +72 -0
  67. data/lib/rom/files/plugins/schema/mime.rb +59 -0
  68. data/lib/rom/files/plugins/schema/shebang.rb +79 -0
  69. data/lib/rom/files/plugins/schema/stat.rb +108 -0
  70. data/lib/rom/files/relation.rb +143 -0
  71. data/lib/rom/files/schema.rb +77 -0
  72. data/lib/rom/files/schema/attributes_inferrer.rb +79 -0
  73. data/lib/rom/files/schema/inferrer.rb +36 -0
  74. data/lib/rom/files/types.rb +37 -0
  75. data/lib/rom/files/version.rb +7 -0
  76. data/rom-files.gemspec +48 -0
  77. data/spec/integration/rom/files/gateway_spec.rb +28 -0
  78. data/spec/integration/rom/files/gem_spec.rb +98 -0
  79. data/spec/integration/rom/files/relations_spec.rb +63 -0
  80. data/spec/integration/rom/files/schema/inferrer_spec.rb +77 -0
  81. data/spec/lib/dry/types/pathname_spec.rb +50 -0
  82. data/spec/lib/pathname/extensions/explode_spec.rb +25 -0
  83. data/spec/lib/pathname/extensions/ext_spec.rb +33 -0
  84. data/spec/lib/pathname/extensions/partial_spec.rb +17 -0
  85. data/spec/lib/pathname/extensions/pathmap_spec.rb +147 -0
  86. data/spec/lib/rom/files/attribute_spec.rb +43 -0
  87. data/spec/lib/rom/files/connection_spec.rb +76 -0
  88. data/spec/lib/rom/files/dataset/inside_spec.rb +22 -0
  89. data/spec/lib/rom/files/dataset/mime_type_spec.rb +23 -0
  90. data/spec/lib/rom/files/dataset/recursive_question_mark_spec.rb +42 -0
  91. data/spec/lib/rom/files/dataset/recursive_spec.rb +29 -0
  92. data/spec/lib/rom/files/dataset/reject_append_spec.rb +68 -0
  93. data/spec/lib/rom/files/dataset/reject_spec.rb +26 -0
  94. data/spec/lib/rom/files/dataset/select_append_spec.rb +69 -0
  95. data/spec/lib/rom/files/dataset/select_spec.rb +38 -0
  96. data/spec/lib/rom/files/dataset/sort_spec.rb +22 -0
  97. data/spec/lib/rom/files/dataset_spec.rb +52 -0
  98. data/spec/lib/rom/files/extensions/text/attributes_inferrer_spec.rb +54 -0
  99. data/spec/lib/rom/files/gateway_spec.rb +39 -0
  100. data/spec/lib/rom/files/plugins/schema/contents_spec.rb +66 -0
  101. data/spec/lib/rom/files/plugins/schema/mime_spec.rb +66 -0
  102. data/spec/lib/rom/files/plugins/schema/stat_spec.rb +109 -0
  103. data/spec/lib/rom/files/relation/pluck_spec.rb +20 -0
  104. data/spec/lib/rom/files/relation/reject_spec.rb +22 -0
  105. data/spec/lib/rom/files/relation/select_spec.rb +35 -0
  106. data/spec/lib/rom/files/relation/sort_spec.rb +21 -0
  107. data/spec/lib/rom/files/relation/to_a_spec.rb +39 -0
  108. data/spec/lib/rom/files/relation_spec.rb +10 -0
  109. data/spec/lib/rom/files/schema/attributes_inferrer_spec.rb +45 -0
  110. data/spec/lib/rom/files/schema/inferrer_spec.rb +29 -0
  111. data/spec/lib/rom/files/schema_spec.rb +109 -0
  112. data/spec/lib/rom/files/types/mime_type_spec.rb +9 -0
  113. data/spec/lib/rom/files/types/path_spec.rb +10 -0
  114. data/spec/lib/rom/files/types_spec.rb +6 -0
  115. data/spec/shared/rom/files/files_setup.rb +19 -0
  116. data/spec/shared/rom/files/filesystem_setup.rb +10 -0
  117. data/spec/shared/rom/files/gateway_setup.rb +17 -0
  118. data/spec/shared/rom/files/media_dataset.rb +10 -0
  119. data/spec/shared/rom/files/media_files.rb +17 -0
  120. data/spec/shared/rom/files/media_relation.rb +30 -0
  121. data/spec/spec_helper.rb +10 -0
  122. metadata +421 -0
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rom/files/dataset'
4
+ require 'shared/rom/files/media_dataset'
5
+
6
+ RSpec.describe ROM::Files::Dataset, '#sort' do
7
+ include_context 'media dataset'
8
+
9
+ its(:sorting) { is_expected.to eq nil }
10
+
11
+ context '()' do
12
+ subject { dataset.sort }
13
+
14
+ its(:sorting) { is_expected.to eq :to_s }
15
+ end
16
+
17
+ context '(method)' do
18
+ subject { dataset.sort(:basename) }
19
+
20
+ its(:sorting) { is_expected.to eq :basename }
21
+ end
22
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rom/files/dataset'
4
+ require 'rom/lint/spec'
5
+ require 'shared/rom/files/media_files'
6
+
7
+ RSpec.describe ROM::Files::Dataset do
8
+ include_context 'media files'
9
+
10
+ subject(:dataset) { connection.create_dataset(dir) }
11
+ let(:connection) { ROM::Files::Connection.new(uri) }
12
+
13
+ it_behaves_like "a rom enumerable dataset"
14
+
15
+ its(:path) { is_expected.to eq uri }
16
+ its(:mime_type) { is_expected.to eq nil }
17
+ its(:inside_paths) { is_expected.to eq [Pathname(dir)] }
18
+ its(:include_patterns) { is_expected.to eq %w[*] }
19
+ its(:exclude_patterns) { is_expected.to eq [] }
20
+ its(:sorting) { is_expected.to eq nil }
21
+ its(:row_proc) { is_expected.to be_a Proc }
22
+ its(:count) { is_expected.to eq 3 }
23
+ its(:each) { is_expected.to be_a Enumerator }
24
+
25
+ describe '#with' do
26
+ subject(:new_dataset) { dataset.with(options) }
27
+ let(:options) { {} }
28
+
29
+ context '(path:)' do
30
+ let(:options) { Hash[path: Pathname.pwd] }
31
+ its(:path) { is_expected.to eq Pathname.pwd }
32
+ end
33
+ end
34
+
35
+ context '#at' do
36
+ subject(:new_dataset) { dataset.at('~') }
37
+
38
+ its(:path) { is_expected.to eq Pathname('~') }
39
+ end
40
+
41
+ context '#up' do
42
+ subject(:new_dataset) { dataset.up }
43
+
44
+ its(:path) { is_expected.to eq uri.join('..') }
45
+ end
46
+
47
+ context '#dig' do
48
+ subject(:new_dataset) { dataset.up.dig(dir) }
49
+
50
+ its(:path) { is_expected.to eq uri.join('../media') }
51
+ end
52
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rom/files/extensions/text/attributes_inferrer'
4
+ require 'shared/rom/files/media_relation'
5
+
6
+ RSpec.describe ROM::Files::Extensions::Text::AttributesInferrer do
7
+ include_context 'media files'
8
+
9
+ subject(:inferrer) { described_class.new(attr_class: attr_class) }
10
+ let(:attr_class) { ROM::Files::Attribute }
11
+
12
+ its(:attr_class) { is_expected.to eq attr_class }
13
+
14
+ describe '#call' do
15
+ subject(:result) { inferrer.(schema, gateway) }
16
+ let(:relation_name) { ROM::Relation::Name.new(:text, 'text/plain') }
17
+ let(:schema) { ROM::Files::Schema.new(relation_name) }
18
+
19
+ it { is_expected.to be_a Array }
20
+ its(:size) { is_expected.to eq 2 }
21
+
22
+ describe 'inferred' do
23
+ subject(:inferred) { result.first }
24
+
25
+ it { is_expected.to be_a Array }
26
+ its(:size) { is_expected.to eq 2 }
27
+
28
+ describe '__FILE__' do
29
+ subject(:attribute) { inferred.first }
30
+
31
+ it { is_expected.to be_a attr_class }
32
+ its(:name) { is_expected.to eq ROM::Files::ID }
33
+ its(:primitive) { is_expected.to eq Pathname }
34
+ its(:primary_key?) { is_expected.to be true }
35
+ end
36
+
37
+ describe 'DATA' do
38
+ subject(:attribute) { inferred[1] }
39
+
40
+ it { is_expected.to be_a attr_class }
41
+ its(:name) { is_expected.to eq :DATA }
42
+ its(:primitive) { is_expected.to eq String }
43
+ its(:primary_key?) { is_expected.to be false }
44
+ end
45
+ end
46
+
47
+ describe 'missing' do
48
+ subject(:missing) { result.last }
49
+
50
+ it { is_expected.to be_a Array }
51
+ its(:size) { is_expected.to eq 0 }
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rom/lint/spec'
4
+ require 'rom/files/gateway'
5
+ require 'shared/rom/files/media_relation'
6
+
7
+ RSpec.describe ROM::Files::Gateway do
8
+ include_context 'media relation'
9
+
10
+ subject(:gateway_instance) { ROM::Gateway.setup(identifier, uri) }
11
+ let(:gateway) { described_class }
12
+ let(:identifier) { :files }
13
+
14
+ it_behaves_like "a rom gateway"
15
+
16
+ describe '#use_logger' do
17
+ let(:logger) { Logger.new(STDOUT) }
18
+ it 'sets logger' do
19
+ gateway_instance.use_logger(logger)
20
+ expect(gateway_instance.logger).to eq logger
21
+ end
22
+ end
23
+
24
+ describe '#dataset?' do
25
+ subject { gateway_instance.dataset?(relation) }
26
+
27
+ context 'with existing relation' do
28
+ let(:relation) { :media }
29
+
30
+ it { is_expected.to be true }
31
+ end
32
+
33
+ context 'with non-existing relation' do
34
+ let(:relation) { :not_here }
35
+
36
+ it { is_expected.to be false }
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'shared/rom/files/media_relation'
4
+
5
+ RSpec.describe ROM::Files::Plugins::Schema::Contents do
6
+ include_context 'media relation'
7
+
8
+ subject(:schema) { schema_dsl.() }
9
+ let(:relation) { ROM::Relation::Name[:media] }
10
+ let(:schema_dsl) do
11
+ ROM::Schema::DSL.new(relation, adapter: :files)
12
+ end
13
+
14
+ # @param name [Symbol]
15
+ # @param type [Dry::Types::Definition]
16
+ # @return [ROM::Attribute]
17
+ def build_attribute(name = :DATA, type: ROM::Types::String)
18
+ ROM::Attribute.new(
19
+ type.meta(name: name, source: relation, DATA: true)
20
+ )
21
+ end
22
+
23
+ describe '.apply' do
24
+ let(:type) { ROM::Types::Date }
25
+
26
+ context 'use :contents' do
27
+ before { schema_dsl.use :contents }
28
+ its([:DATA]) { is_expected.to eql build_attribute }
29
+
30
+ context 'contents(name)' do
31
+ before { schema_dsl.contents :custom }
32
+ its([:custom]) { is_expected.to eql build_attribute(:custom) }
33
+ end
34
+
35
+ context 'contents(name, type)' do
36
+ before { schema_dsl.contents :custom, type }
37
+ its([:custom]) { is_expected.to eql build_attribute(:custom, type: type) }
38
+ end
39
+
40
+ context 'contents(name, type:)' do
41
+ before { schema_dsl.contents :custom, type: type }
42
+ its([:custom]) { is_expected.to eql build_attribute(:custom, type: type) }
43
+ end
44
+
45
+ context 'contents(type:)' do
46
+ before { schema_dsl.contents type: type }
47
+ its([:DATA]) { is_expected.to eql build_attribute(type: type) }
48
+ end
49
+ end
50
+
51
+ context 'use :contents, name:' do
52
+ before { schema_dsl.use :contents, name: :contents }
53
+ its([:contents]) { is_expected.to eql build_attribute :contents }
54
+ end
55
+
56
+ context 'use :contents, type:' do
57
+ before { schema_dsl.use :contents, type: type }
58
+ its([:DATA]) { is_expected.to eql build_attribute type: type }
59
+ end
60
+
61
+ context 'use :contents, name:, type:' do
62
+ before { schema_dsl.use :contents, name: :contents, type: type }
63
+ its([:contents]) { is_expected.to eql build_attribute :contents, type: type }
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'shared/rom/files/media_relation'
4
+
5
+ RSpec.describe ROM::Files::Plugins::Schema::Mime do
6
+ include_context 'media relation'
7
+
8
+ subject(:schema) { schema_dsl.() }
9
+ let(:relation) { ROM::Relation::Name[:media] }
10
+ let(:schema_dsl) do
11
+ ROM::Schema::DSL.new(relation, adapter: :files)
12
+ end
13
+
14
+ # @param name [Symbol]
15
+ # @param type [Dry::Types::Definition]
16
+ # @return [ROM::Attribute]
17
+ def build_attribute(name = :mime_type, type: ROM::Files::Types::MimeType.optional)
18
+ ROM::Attribute.new(
19
+ type.meta(name: name, source: relation, __proc__: described_class::PROC)
20
+ )
21
+ end
22
+
23
+ describe '.apply' do
24
+ let(:type) { ROM::Types::Date }
25
+
26
+ context 'use :mime' do
27
+ before { schema_dsl.use :mime }
28
+ its([:mime_type]) { is_expected.to eql build_attribute }
29
+
30
+ context 'mime(name)' do
31
+ before { schema_dsl.mime :custom }
32
+ its([:custom]) { is_expected.to eql build_attribute(:custom) }
33
+ end
34
+
35
+ context 'mime(name, type)' do
36
+ before { schema_dsl.mime :custom, type }
37
+ its([:custom]) { is_expected.to eql build_attribute(:custom, type: type) }
38
+ end
39
+
40
+ context 'mime(name, type:)' do
41
+ before { schema_dsl.mime :custom, type: type }
42
+ its([:custom]) { is_expected.to eql build_attribute(:custom, type: type) }
43
+ end
44
+
45
+ context 'mime(type:)' do
46
+ before { schema_dsl.mime type: type }
47
+ its([:mime_type]) { is_expected.to eql build_attribute(type: type) }
48
+ end
49
+ end
50
+
51
+ context 'use :mime, name:' do
52
+ before { schema_dsl.use :mime, name: :mime }
53
+ its([:mime]) { is_expected.to eql build_attribute :mime }
54
+ end
55
+
56
+ context 'use :mime, type:' do
57
+ before { schema_dsl.use :mime, type: type }
58
+ its([:mime_type]) { is_expected.to eql build_attribute type: type }
59
+ end
60
+
61
+ context 'use :mime, name:, type:' do
62
+ before { schema_dsl.use :mime, name: :mime, type: type }
63
+ its([:mime]) { is_expected.to eql build_attribute :mime, type: type }
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,109 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'shared/rom/files/media_relation'
4
+
5
+ RSpec.describe ROM::Files::Plugins::Schema::Stat do
6
+ FIELD = ROM::Files::Plugins::Schema::Stat::NAME
7
+
8
+ include_context 'media relation'
9
+
10
+ subject(:schema) { schema_dsl.() }
11
+ let(:relation_name) { ROM::Relation::Name[:media] }
12
+ let(:schema_dsl) do
13
+ ROM::Schema::DSL.new(relation_name, adapter: :files)
14
+ end
15
+
16
+ # @param name [Symbol]
17
+ # @param type [Dry::Types::Definition]
18
+ # @param stat [Symbol]
19
+ # @return [ROM::Attribute]
20
+ def build_attribute(name = FIELD,
21
+ type: ROM::Files::Types::FileStat,
22
+ stat: (name == FIELD) || name)
23
+ ROM::Attribute.new(
24
+ type.meta(name: name, source: relation_name, __stat__: stat)
25
+ )
26
+ end
27
+
28
+ describe '.apply' do
29
+ context 'use :stat' do
30
+ before { schema_dsl.use :stat }
31
+
32
+ its([:stat]) { is_expected.to eql build_attribute }
33
+
34
+ context 'stat :stat' do
35
+ before { schema_dsl.stat :stat }
36
+
37
+ its([:stat]) { is_expected.to eql build_attribute(:stat) }
38
+ end
39
+
40
+ context 'stat stats:' do
41
+ before { schema_dsl.stat stats: %i[atime] }
42
+
43
+ its('to_h.keys') { is_expected.to eql %i[stat atime] }
44
+ its([:stat]) { is_expected.to eql build_attribute }
45
+ its([:atime]) { is_expected.to eql build_attribute(:atime, type: ROM::Files::Types::Time) }
46
+ end
47
+
48
+ context 'stat false, stats:' do
49
+ before { schema_dsl.stat false, stats: %i[atime] }
50
+
51
+ its('to_h.keys') { is_expected.to eql %i[atime] }
52
+ its([:atime]) { is_expected.to eql build_attribute(:atime, type: ROM::Files::Types::Time) }
53
+ end
54
+
55
+ context 'stat stats: [aliased]' do
56
+ before { schema_dsl.stat stats: %i[created_at] }
57
+
58
+ its('to_h.keys') { is_expected.to eql %i[stat created_at] }
59
+ its([:stat]) { is_expected.to eql build_attribute }
60
+ its([:created_at]) { is_expected.to eql build_attribute(:created_at, type: ROM::Files::Types::Time, stat: :birthtime) }
61
+ end
62
+
63
+ context 'stat aliases:' do
64
+ before { schema_dsl.stat aliases: { modified_at: :mtime } }
65
+
66
+ its('to_h.keys') { is_expected.to eql %i[stat modified_at] }
67
+ its([:stat]) { is_expected.to eql build_attribute }
68
+ its([:modified_at]) { is_expected.to eql build_attribute(:modified_at, type: ROM::Files::Types::Time, stat: :mtime) }
69
+ end
70
+ end
71
+
72
+ context 'use :stat, name:' do
73
+ before { schema_dsl.use :stat, name: :stat }
74
+
75
+ its([:stat]) { is_expected.to eql build_attribute(:stat) }
76
+ end
77
+
78
+ context 'use :stat, stats:' do
79
+ before { schema_dsl.use :stat, stats: %i[atime] }
80
+
81
+ its('to_h.keys') { is_expected.to eql %i[stat atime] }
82
+ its([:stat]) { is_expected.to eql build_attribute }
83
+ its([:atime]) { is_expected.to eql build_attribute(:atime, type: ROM::Files::Types::Time) }
84
+ end
85
+
86
+ context 'use :stat, name: false, stats:' do
87
+ before { schema_dsl.use :stat, name: false, stats: %i[atime] }
88
+
89
+ its('to_h.keys') { is_expected.to eql %i[atime] }
90
+ its([:atime]) { is_expected.to eql build_attribute(:atime, type: ROM::Files::Types::Time) }
91
+ end
92
+
93
+ context 'use :stat, stats: [aliased]' do
94
+ before { schema_dsl.use :stat, stats: %i[created_at] }
95
+
96
+ its('to_h.keys') { is_expected.to eql %i[stat created_at] }
97
+ its([:stat]) { is_expected.to eql build_attribute }
98
+ its([:created_at]) { is_expected.to eql build_attribute(:created_at, type: ROM::Files::Types::Time, stat: :birthtime) }
99
+ end
100
+
101
+ context 'use :stat, aliases:' do
102
+ before { schema_dsl.use :stat, aliases: { modified_at: :mtime } }
103
+
104
+ its('to_h.keys') { is_expected.to eql %i[stat modified_at] }
105
+ its([:stat]) { is_expected.to eql build_attribute }
106
+ its([:modified_at]) { is_expected.to eql build_attribute(:modified_at, type: ROM::Files::Types::Time, stat: :mtime) }
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rom/files/relation'
4
+ require 'shared/rom/files/media_relation'
5
+
6
+ RSpec.describe ROM::Files::Relation, '#pluck' do
7
+ include_context 'media relation'
8
+
9
+ context 'with method name' do
10
+ subject { relation.pluck(:basename) }
11
+
12
+ it { is_expected.to eql([Pathname('some_image.png'), Pathname('some_file.txt'), Pathname('some_markdown.md')]) }
13
+ end
14
+
15
+ context 'with block' do
16
+ subject { relation.pluck { |path| path.basename.to_s } }
17
+
18
+ it { is_expected.to eql %w[some_image.png some_file.txt some_markdown.md] }
19
+ end
20
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rom/files/relation'
4
+ require 'shared/rom/files/media_relation'
5
+
6
+ RSpec.describe ROM::Files::Relation, '#reject' do
7
+ include_context 'media relation'
8
+
9
+ subject(:names) { relation.pluck(:basename) }
10
+
11
+ context '(list, of, patterns)' do
12
+ let(:relation) { super().reject('*.txt', '*.md') }
13
+
14
+ it { is_expected.to eql [P('some_image.png')] }
15
+ end
16
+
17
+ context '(glob_expression)' do
18
+ let(:relation) { super().reject('*.{txt,md}') }
19
+
20
+ it { is_expected.to eql [P('some_image.png')] }
21
+ end
22
+ end