middleman-data_source 0.7.1 → 0.8.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c171a11ee4a3c842ff19e9da42ef88fa4db97efe
4
- data.tar.gz: c68e86e0c5b7bd274cd4fb1bf94bd6dd7668b88b
3
+ metadata.gz: 44c1b70621ff4a70696742d721daea2dffee76ac
4
+ data.tar.gz: 22cf1ed7c44ba3d5aa5c2c0626b236f05e19a8dc
5
5
  SHA512:
6
- metadata.gz: f781063b434454cbe0051dc59e60a49ba52f4e6cabc77dcced2c06c6dde231e9652f0b539fd5e648052880391c483c1d6b657cb5fcdeca5567b81ca1424f17c8
7
- data.tar.gz: 4067143433e37ed48fefeb716b44ace151b7ba8efbfb7b82dbde3c605c41421aa15b735db6ecf185398289784a75a69fc523bdc4564432deaec6519f7bb7dfc4
6
+ metadata.gz: e6c6aa484e291c1bba697dedd88410f3289df2a0c7d4194caf34e0cd5f28965ace6b37dbc15ab4fa00f3127963a5b260f3a28c4b2f9d29b49166fbc99a442040
7
+ data.tar.gz: a61eccd9fe52b00cc0eeecaa63a7656b2340b623c37f571965304c95cbdec7fc33153157a76d0b35fbdfb318bc69f495611c7b725f6247b71a80ced39ffb3dad
data/changelog.md CHANGED
@@ -1,3 +1,7 @@
1
+ # 0.8.0
2
+ - add feature for passing `middleware:` option with sources to alter incoming data
3
+ - allow passing `index:` option to collections to define custom index (or `false` for no index)
4
+
1
5
  # 0.7.1
2
6
  - allow passing data type to collection
3
7
  - fix access to data object in middleman 3.x code branches
@@ -11,8 +11,7 @@ module Middleman
11
11
  option :decoders, {}, 'callable functions to decode data sources'
12
12
  option :collection, {}, 'group of recursive resources'
13
13
 
14
- attr_reader :decoders, :sources, :collection,
15
- :app_inst
14
+ attr_reader :decoders, :sources, :app_inst
16
15
 
17
16
  def rack_app
18
17
  @_rack_app ||= ::Rack::Test::Session.new( ::Rack::MockSession.new( options.rack_app ) )
@@ -20,24 +19,26 @@ module Middleman
20
19
 
21
20
  def initialize app, options_hash={}, &block
22
21
  super app, options_hash, &block
23
- @app_inst = app.respond_to?(:inst) ? app.inst : app
24
-
25
- @sources = options.sources.dup + convert_files_to_sources(options.files)
26
- @decoders = default_decoders.merge(options.decoders)
27
22
 
28
- if options.collection.empty?
29
- @collection = false
30
- else
31
- @collection = options.collection
32
- sources.push options.collection.merge alias: File.join( options.collection[:alias], 'all' )
33
- end
23
+ @app_inst = app.respond_to?(:inst) ? app.inst : app
24
+ @sources = options.sources.dup + convert_files_to_sources(options.files)
25
+ @decoders = default_decoders.merge(options.decoders)
34
26
 
35
27
  sources.each do |source|
36
- add_data_callback_for_source(source)
28
+ add_data_callback_for_source source
37
29
  end
38
30
 
39
- if collection
40
- collection[:items].call( app_inst.data[collection[:alias]]['all'] ).map do |source|
31
+ if !options.collection.empty?
32
+ collection = { index: 'all' }.merge options.collection
33
+
34
+ if collection[:index]
35
+ add_data_callback_for_source collection.merge alias: File.join( collection[:alias], collection[:index] )
36
+ collection_data_callback = lambda { app_inst.data[collection[:alias]][collection[:index]] }
37
+ else
38
+ collection_data_callback = lambda { get_data(collection) }
39
+ end
40
+
41
+ collection[:items].call( collection_data_callback.call() ).map do |source|
41
42
  source[:alias] = File.join(collection[:alias], source[:alias])
42
43
  source
43
44
  end.each do |source|
@@ -49,21 +50,18 @@ module Middleman
49
50
  private
50
51
 
51
52
  def add_data_callback_for_source source
52
- raw_extension = File.extname(source[:path])
53
- extension = raw_extension.split('?').first
54
- parts = source[:alias].split(File::SEPARATOR)
55
- basename = File.basename(parts.pop, raw_extension)
53
+ basename, parts, extension = extract_basename_parts_and_extension source
56
54
 
57
55
  if parts.empty?
58
56
  original_callback = app_inst.data.callbacks[basename]
59
57
  app_inst.data.callbacks[basename] = Proc.new do
60
- attempt_merge_then_enhance decode_data(source, extension), original_callback
58
+ attempt_merge_then_enhance get_data(source, extension), original_callback
61
59
  end
62
60
  else
63
61
  original_callback = app_inst.data.callbacks[parts.first]
64
62
  app_inst.data.callbacks[parts.first] = Proc.new do
65
63
  begin
66
- built_data = { basename => decode_data(source, extension) }
64
+ built_data = { basename => get_data(source, extension) }
67
65
  parts[1..-1].reverse.each do |part|
68
66
  built_data = { part => built_data }
69
67
  end
@@ -111,10 +109,20 @@ module Middleman
111
109
  return ::Middleman::Util.recursively_enhance new_data
112
110
  end
113
111
 
114
- def decode_data source, extension
112
+ def extract_basename_parts_and_extension source
113
+ raw_extension = File.extname(source[:path])
114
+ extension = raw_extension.split('?').first
115
+ parts = source[:alias].split(File::SEPARATOR)
116
+ basename = File.basename(parts.pop, raw_extension)
117
+
118
+ [basename, parts, extension]
119
+ end
120
+
121
+ def get_data source, extension=nil
115
122
  if source.has_key? :type
116
123
  decoder = decoders[source[:type]]
117
124
  else
125
+ _, _, extension = extract_basename_parts_and_extension(source) unless extension
118
126
  decoder = decoders.find do |candidate|
119
127
  candidate[1][:extensions].include? extension
120
128
  end
@@ -123,7 +131,13 @@ module Middleman
123
131
 
124
132
  raise UnsupportedDataExtension unless decoder
125
133
 
126
- decoder[:decoder].call get_file_contents source[:path]
134
+ data = decoder[:decoder].call get_file_contents source[:path]
135
+
136
+ if source[:middleware]
137
+ data = source[:middleware].call data
138
+ end
139
+
140
+ return data
127
141
  end
128
142
 
129
143
  def get_file_contents file_path
@@ -1,7 +1,7 @@
1
1
  module Middleman
2
2
  module DataSource
3
3
 
4
- VERSION = "0.7.1"
4
+ VERSION = "0.8.0"
5
5
 
6
6
  end
7
7
  end
data/readme.md CHANGED
@@ -155,7 +155,7 @@ Collections allow you to collection sources that have belong together in an arra
155
155
  }
156
156
  ```
157
157
 
158
- Then set up a collection to access them through Middleman. A collection requires 3 keys, an `alias`, `path`, and `items`. The alias & path act just like a source, except that data will be available at `#{all}.all`. Items should be an object that responds to `#call` and returns an array of sources when given the data from the collection index. A collection for our example API:
158
+ Then set up a collection to access them through Middleman. A collection requires 3 keys, an `alias`, `path`, and `items`. The alias & path act just like a source, except that data will be available at `#{alias}.#{index}`. Items should be an object that responds to `#call` and returns an array of sources when given the data from the collection index. A collection for our example API:
159
159
 
160
160
  ```ruby
161
161
  activate :data_source do |c|
@@ -163,6 +163,7 @@ activate :data_source do |c|
163
163
  c.collection = {
164
164
  alias: 'got_chars',
165
165
  path: '/got/index.json',
166
+ index: 'all',
166
167
  items: Proc.new { |data|
167
168
  data.map do |char|
168
169
  {
@@ -185,6 +186,35 @@ data.got_chars['eddard-stark'].quote
185
186
  # => Winter is coming
186
187
  ```
187
188
 
189
+ For index_name, you can also pass `false` to not generate the index data.
190
+
191
+
192
+ ### Adding Middleware
193
+
194
+ You may wish to alter the incoming data before it gets added to Middleman's data object, to do so you'll add middleware. Middleware should respond to `#call` and return your altered data. Here's an example where we add "1" to each item in an array:
195
+
196
+ ```yaml
197
+ # count.yaml
198
+ - 1
199
+ - 2
200
+ - 3
201
+ ```
202
+
203
+ ```ruby
204
+ # config.rb
205
+ activate :data_source do |c|
206
+ c.root = "http://example.com"
207
+ c.sources = [{
208
+ alias: 'altered',
209
+ path: 'count.yaml',
210
+ middleware: Proc.new { |data| data.map { |i| i + 1 } }
211
+ }]
212
+ end
213
+
214
+ data.altered
215
+ # => [2, 3, 4]
216
+ ```
217
+
188
218
 
189
219
  # Testing
190
220
 
@@ -1,7 +1,7 @@
1
1
  set :environment, :test
2
2
  set :show_exceptions, false
3
3
 
4
-
4
+ # base collection spec
5
5
  activate :data_source do |c|
6
6
 
7
7
  c.root = File.join( Dir.pwd, 'remote_data' )
@@ -21,7 +21,7 @@ activate :data_source do |c|
21
21
 
22
22
  end
23
23
 
24
-
24
+ # extensionless
25
25
  activate :data_source do |c|
26
26
 
27
27
  c.root = File.join( Dir.pwd, 'remote_data' )
@@ -35,3 +35,31 @@ activate :data_source do |c|
35
35
 
36
36
  end
37
37
 
38
+ # custom index key
39
+ activate :data_source do |c|
40
+
41
+ c.root = File.join( Dir.pwd, 'remote_data' )
42
+
43
+ c.collection = {
44
+ alias: 'custom_index',
45
+ index: 'dem_things',
46
+ path: 'custom_index/index.yaml',
47
+ items: Proc.new { |d| [] }
48
+ }
49
+
50
+ end
51
+
52
+ # no index key
53
+ activate :data_source do |c|
54
+
55
+ c.root = File.join( Dir.pwd, 'remote_data' )
56
+
57
+ c.collection = {
58
+ alias: 'no_index',
59
+ index: false,
60
+ path: 'no_index/index.yaml',
61
+ items: Proc.new { |d| [{ alias: 'data',
62
+ path: 'no_index/index.yaml' }] }
63
+ }
64
+
65
+ end
@@ -0,0 +1,18 @@
1
+ set :environment, :test
2
+ set :show_exceptions, false
3
+
4
+ activate :data_source do |c|
5
+
6
+ c.root = File.join( Dir.pwd, 'remote_data' )
7
+
8
+ c.sources = [
9
+ {
10
+ alias: 'altered',
11
+ path: 'zero_index_array.yaml',
12
+ middleware: Proc.new { |data|
13
+ data.map { |i| i + 1 }
14
+ }
15
+ }
16
+ ]
17
+
18
+ end
@@ -0,0 +1,37 @@
1
+ RSpec.describe "Middleman::DataSource::Extension (feat) collection" do
2
+
3
+ before :each do
4
+ Given.fixture 'collection'
5
+ @mm = Middleman::Fixture.app
6
+ end
7
+
8
+ after :each do
9
+ Given.cleanup!
10
+ end
11
+
12
+ it "makes collection items available at aliases" do
13
+ expect( @mm.data.root.john.title ).to eq "John"
14
+ expect( @mm.data.root.hodor.title ).to eq "Hodor"
15
+ end
16
+
17
+ it "makes collection index available at #all" do
18
+ expect( @mm.data.root.all.map(&:to_h) ).to match_array [{ "extra" => "info",
19
+ "slug" => "hodor" },
20
+ { "extra" => "info",
21
+ "slug" => "john" }]
22
+ end
23
+
24
+ it "allows passing an extension type" do
25
+ expect( @mm.data.extensionless.all.foo ).to eq "bar"
26
+ end
27
+
28
+ it "sets custom index key if given one" do
29
+ expect( @mm.data.custom_index.dem_things.map(&:to_h) ).to match_array [{"dem" => "things"}]
30
+ end
31
+
32
+ it "removes index if given index false" do
33
+ expect( @mm.data.no_index.all ).to be_nil
34
+ expect( @mm.data.no_index.data.missing ).to eq "index"
35
+ end
36
+
37
+ end
@@ -0,0 +1,16 @@
1
+ RSpec.describe "Middleman::DataSource::Extension (feat) middleware" do
2
+
3
+ before :each do
4
+ Given.fixture 'middleware'
5
+ @mm = Middleman::Fixture.app
6
+ end
7
+
8
+ after :each do
9
+ Given.cleanup!
10
+ end
11
+
12
+ it "sets data after being passed through middleware" do
13
+ expect( @mm.data.altered ).to match_array [1, 2, 3, 4]
14
+ end
15
+
16
+ end
@@ -148,32 +148,4 @@ RSpec.describe Middleman::DataSource::Extension do
148
148
 
149
149
  end
150
150
 
151
-
152
- context "with collection app" do
153
- before :each do
154
- Given.fixture 'collection'
155
- @mm = Middleman::Fixture.app
156
- end
157
-
158
- after :each do
159
- Given.cleanup!
160
- end
161
-
162
- it "makes collection items available at aliases" do
163
- expect( @mm.data.root.john.title ).to eq "John"
164
- expect( @mm.data.root.hodor.title ).to eq "Hodor"
165
- end
166
-
167
- it "makes collection index available at #all" do
168
- expect( @mm.data.root.all.map(&:to_h) ).to match_array [{ "extra" => "info",
169
- "slug" => "hodor" },
170
- { "extra" => "info",
171
- "slug" => "john" }]
172
- end
173
-
174
- it "allows passing an extension type" do
175
- expect( @mm.data.extensionless.all.foo ).to eq "bar"
176
- end
177
- end
178
-
179
151
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: middleman-data_source
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steven Sloan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-05 00:00:00.000000000 Z
11
+ date: 2016-01-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: middleman
@@ -70,10 +70,13 @@ files:
70
70
  - spec/fixtures/collection/config.rb
71
71
  - spec/fixtures/files_as_hash/config.rb
72
72
  - spec/fixtures/imediate_use/config.rb
73
+ - spec/fixtures/middleware/config.rb
73
74
  - spec/fixtures/multiple_instances/config.rb
74
75
  - spec/fixtures/nested_alias/config.rb
75
76
  - spec/fixtures/unsupported_extension/config.rb
76
77
  - spec/lib/middleman-data_source_spec.rb
78
+ - spec/lib/middleman/data_source/extension/collection_spec.rb
79
+ - spec/lib/middleman/data_source/extension/middleware_spec.rb
77
80
  - spec/lib/middleman/data_source/extension_spec.rb
78
81
  - spec/lib/middleman/data_source/version_spec.rb
79
82
  - spec/spec_helper.rb
@@ -110,9 +113,12 @@ test_files:
110
113
  - spec/fixtures/collection/config.rb
111
114
  - spec/fixtures/files_as_hash/config.rb
112
115
  - spec/fixtures/imediate_use/config.rb
116
+ - spec/fixtures/middleware/config.rb
113
117
  - spec/fixtures/multiple_instances/config.rb
114
118
  - spec/fixtures/nested_alias/config.rb
115
119
  - spec/fixtures/unsupported_extension/config.rb
120
+ - spec/lib/middleman/data_source/extension/collection_spec.rb
121
+ - spec/lib/middleman/data_source/extension/middleware_spec.rb
116
122
  - spec/lib/middleman/data_source/extension_spec.rb
117
123
  - spec/lib/middleman/data_source/version_spec.rb
118
124
  - spec/lib/middleman-data_source_spec.rb