middleman-pagination 1.0.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.
Files changed (34) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.travis.yml +6 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +96 -0
  7. data/Rakefile +6 -0
  8. data/lib/middleman-pagination.rb +1 -0
  9. data/lib/middleman/pagination.rb +11 -0
  10. data/lib/middleman/pagination/configuration.rb +19 -0
  11. data/lib/middleman/pagination/extension.rb +21 -0
  12. data/lib/middleman/pagination/extension_context.rb +21 -0
  13. data/lib/middleman/pagination/in_page_context.rb +32 -0
  14. data/lib/middleman/pagination/manipulated_resources.rb +65 -0
  15. data/lib/middleman/pagination/pageable_context.rb +17 -0
  16. data/lib/middleman/pagination/version.rb +5 -0
  17. data/lib/middleman_extension.rb +2 -0
  18. data/middleman-pagination.gemspec +28 -0
  19. data/spec/features/pagination_feature_spec.rb +90 -0
  20. data/spec/fixtures/recipes/source/index.html.erb +21 -0
  21. data/spec/fixtures/recipes/source/layouts/layout.erb +1 -0
  22. data/spec/fixtures/recipes/source/recipes/bacon.html.erb +5 -0
  23. data/spec/fixtures/recipes/source/recipes/cake.html.erb +5 -0
  24. data/spec/fixtures/recipes/source/recipes/gelato.html.erb +5 -0
  25. data/spec/fixtures/recipes/source/recipes/mead.html.erb +5 -0
  26. data/spec/fixtures/recipes/source/recipes/sandwich.html.erb +5 -0
  27. data/spec/fixtures/recipes/source/recipes/waffles.html.erb +5 -0
  28. data/spec/fixtures/recipes/source/recipes/yeti.html.erb +5 -0
  29. data/spec/middleman/pagination/configuration_spec.rb +42 -0
  30. data/spec/middleman/pagination/extension_context_spec.rb +42 -0
  31. data/spec/middleman/pagination/manipulated_resources_spec.rb +52 -0
  32. data/spec/spec_helper.rb +13 -0
  33. data/spec/support/middleman_server_helpers.rb +41 -0
  34. metadata +175 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fe0923ecf34b591da48f68db56accf21a08c464c
4
+ data.tar.gz: 069471197145f7573a3b6f697caa7b04c420b0db
5
+ SHA512:
6
+ metadata.gz: 7ff7468e609f467d947bf3262edeaad95bff8a22ad167ad9ad193d74b4b18071f3c06b4bbf42be80eb12a74700a4e1fb0e1f401ee2c77acf02ace7a44c854bc7
7
+ data.tar.gz: 812a870bf801ba01fe2da1efbd2c99f236fa4a1c1abb113eb83593a117d16c7f7dbb73e5f32cb2436456a31df753e796438bcb1d1639202a77bedbe953c427e1
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ cache: bundler
3
+ rvm:
4
+ - 1.9.3
5
+ - 2.0.0
6
+ script: bundle exec rspec spec --color --format doc
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in middleman-pagination.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Pete Nicholls
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,96 @@
1
+ # Middleman Pagination
2
+
3
+ [![Build Status](https://travis-ci.org/Aupajo/middleman-pagination.png?branch=master)](https://travis-ci.org/Aupajo/middleman-pagination)
4
+ [![Code Climate](https://codeclimate.com/github/Aupajo/middleman-pagination.png)](https://codeclimate.com/github/Aupajo/middleman-pagination)
5
+ [![Dependency Status](https://gemnasium.com/Aupajo/middleman-pagination.png)](https://gemnasium.com/Aupajo/middleman-pagination)
6
+
7
+ **Warning: this extension is brand-new, and the API liable to change until the prerelease identifier is dropped.**
8
+
9
+ General-purpose pagination support for Middleman pages.
10
+
11
+ ## Installation
12
+
13
+ Coming soon.
14
+
15
+ ## Usage
16
+
17
+ Let's say you have a set of recipes that you want to create pagination for:
18
+
19
+ source/
20
+ all-recipes.html
21
+ recipes/
22
+ apple-pie.html
23
+ bacon.html
24
+ cake.html
25
+
26
+ You can create named pageable resources based on a criteria. In this case, we're going to use any page that lives inside the `recipes` as the criteria for paging through recipes. Inside your `config.rb`:
27
+
28
+ ```ruby
29
+ activate :pagination do
30
+ pageable :recipes do |page|
31
+ # Match any page that lives in the "recipes" directory
32
+ page.path.start_with?('recipes/')
33
+ end
34
+ end
35
+ ```
36
+
37
+ **Note:** If you're using the directory indexes extension, place it *after* `activate :directory_indexes`.
38
+
39
+ Now, let's set up a *pagination index*. Inside `all-recipes.html`:
40
+
41
+ ```erb
42
+ ---
43
+ pagination:
44
+ for: recipes
45
+ per_page: 20
46
+ ---
47
+
48
+ <% pagination.each do |recipe| %>
49
+ - <%= link_to recipe.data.title, recipe.url %>
50
+ <% end %>
51
+
52
+ Page <%= pagination.page_num %> of <%= pagination.total_page_num %>
53
+
54
+ Showing <%= pagination.per_page %> per page
55
+
56
+ <%= link_to "First page", pagination.first_page.url %>
57
+
58
+ <%= link_to "Prev page", pagination.prev_page.url if pagination.prev_page %>
59
+
60
+ <%= link_to "Next page", pagination.next_page.url if pagination.next_page %>
61
+
62
+ <%= link_to "Last page", pagination.first_page.url %>
63
+ ```
64
+
65
+ **Note:** the `for` and `per_page` properties must be indented for the `pagination` frontmatter.
66
+
67
+
68
+ You can define as many different types of pageable resources as you like:
69
+
70
+ ```ruby
71
+ activate :pagination do
72
+ pageable :staff do |page|
73
+ # Match any page whose URL includes "/staff/"
74
+ page.url.include?('/staff/')
75
+ end
76
+
77
+ pageable :news do |page|
78
+ # Match any page that has "news" in its frontmatter
79
+ page.data.news.present?
80
+ end
81
+ end
82
+ ```
83
+
84
+ ## TODO
85
+
86
+ * Customisable path
87
+ * Custom sorting (e.g. by date)
88
+ * Convenience helper methods (e.g. make `pagination.` optional)
89
+
90
+ ## Contributing
91
+
92
+ 1. Fork it
93
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
94
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
95
+ 4. Push to the branch (`git push origin my-new-feature`)
96
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1 @@
1
+ require 'middleman/pagination'
@@ -0,0 +1,11 @@
1
+ require "middleman-core"
2
+ require "ostruct"
3
+ require "middleman/pagination/version"
4
+ require "middleman/pagination/configuration"
5
+ require "middleman/pagination/extension_context"
6
+ require "middleman/pagination/manipulated_resources"
7
+ require "middleman/pagination/pageable_context"
8
+ require "middleman/pagination/in_page_context"
9
+ require "middleman/pagination/extension"
10
+
11
+ ::Middleman::Extensions.register(:pagination, ::Middleman::Pagination::Extension)
@@ -0,0 +1,19 @@
1
+ module Middleman
2
+ module Pagination
3
+ class Configuration
4
+ include Enumerable
5
+
6
+ def initialize
7
+ @pageable = {}
8
+ end
9
+
10
+ def pageable(name, &block)
11
+ @pageable[name] = block
12
+ end
13
+
14
+ def each(&block)
15
+ @pageable.each(&block)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,21 @@
1
+ require "middleman-core/extensions"
2
+
3
+ module Middleman
4
+ module Pagination
5
+ class Extension < Middleman::Extension
6
+ def initialize(app, options = {}, &block)
7
+ @context = ExtensionContext.new(self)
8
+ super
9
+ end
10
+
11
+ def manipulate_resource_list(resources)
12
+ mainpulated = ManipulatedResources.new(@context, resources)
13
+ mainpulated.resource_list
14
+ end
15
+
16
+ def setup_options(options, &block)
17
+ @context.configuration.instance_eval(&block)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ module Middleman
2
+ module Pagination
3
+ class ExtensionContext
4
+ extend Forwardable
5
+
6
+ def_delegators :app, :sitemap, :index_file
7
+
8
+ def initialize(extension)
9
+ @extension = extension
10
+ end
11
+
12
+ def configuration
13
+ @configuration ||= Configuration.new
14
+ end
15
+
16
+ def app
17
+ @extension.app
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,32 @@
1
+ module Middleman
2
+ module Pagination
3
+ class InPageContext < OpenStruct
4
+ extend Forwardable
5
+ include Enumerable
6
+
7
+ def_delegators :pageable_context, :resources,
8
+ :index_resources,
9
+ :total_page_num,
10
+ :per_page,
11
+ :first_page,
12
+ :last_page
13
+
14
+ def next_page
15
+ index_resources[page_num]
16
+ end
17
+
18
+ def prev_page
19
+ index_resources[page_num - 2] if page_num > 1
20
+ end
21
+
22
+ def current_resources
23
+ num_previous = per_page * (page_num - 1)
24
+ resources.drop(num_previous).take(per_page)
25
+ end
26
+
27
+ def each(&block)
28
+ current_resources.each(&block)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,65 @@
1
+ module Middleman
2
+ module Pagination
3
+ class ManipulatedResources
4
+ attr_reader :context, :original_resources
5
+
6
+ def initialize(context, resources)
7
+ @context = context
8
+ @original_resources = resources
9
+ end
10
+
11
+ def resource_list
12
+ original_resources + new_resources
13
+ end
14
+
15
+ private
16
+
17
+ def new_resources
18
+ context.configuration.map do |name, filter|
19
+ new_resources_for_pageable(name, filter)
20
+ end.flatten
21
+ end
22
+
23
+ def new_resources_for_pageable(name, filter)
24
+ original_resources.map do |resource|
25
+ if resource.data.pagination.try(:for) == name.to_s
26
+ new_resources_for_index(resource, filter)
27
+ end
28
+ end.compact
29
+ end
30
+
31
+ def new_resources_for_index(first_index, filter)
32
+ pageable_context = PageableContext.new(
33
+ per_page: first_index.data.pagination.per_page || 20,
34
+ resources: original_resources.select(&filter).sort_by(&:path),
35
+ index_resources: [first_index]
36
+ )
37
+
38
+ add_pagination_to(first_index, pageable_context: pageable_context, page_num: 1)
39
+
40
+ (2..pageable_context.total_page_num).map do |n|
41
+ build_new_index(first_index, pageable_context, n)
42
+ end
43
+ end
44
+
45
+ def build_new_index(first_index, pageable_context, page_num)
46
+ sitemap = context.sitemap
47
+ pattern = %r{(^|/)#{Regexp.escape(context.index_file)}}
48
+ path = first_index.path.sub(pattern, "pages/#{page_num}.html")
49
+ source_file = first_index.source_file
50
+
51
+ new_index = ::Middleman::Sitemap::Resource.new(sitemap, path, source_file)
52
+ add_pagination_to(new_index, pageable_context: pageable_context, page_num: page_num)
53
+
54
+ pageable_context.index_resources << new_index
55
+
56
+ new_index
57
+ end
58
+
59
+ def add_pagination_to(resource, attributes = {})
60
+ in_page_context = InPageContext.new(attributes)
61
+ resource.add_metadata(:locals => { 'pagination' => in_page_context })
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,17 @@
1
+ module Middleman
2
+ module Pagination
3
+ class PageableContext < OpenStruct
4
+ def total_page_num
5
+ (resources.length.to_f / per_page).ceil
6
+ end
7
+
8
+ def first_page
9
+ index_resources.first
10
+ end
11
+
12
+ def last_page
13
+ index_resources.last
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,5 @@
1
+ module Middleman
2
+ module Pagination
3
+ VERSION = "1.0.0"
4
+ end
5
+ end
@@ -0,0 +1,2 @@
1
+ # Auto-register extension for Middleman
2
+ require 'middleman-pagination'
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'middleman/pagination/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "middleman-pagination"
8
+ spec.version = Middleman::Pagination::VERSION
9
+ spec.authors = ["Pete Nicholls"]
10
+ spec.email = ["pete@metanation.com"]
11
+ spec.description = "General-purpose pagination support for Middleman pages."
12
+ spec.summary = "Pagination for Middleman pages."
13
+ spec.homepage = "https://github.com/Aupajo/middleman-pagination"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_runtime_dependency "middleman-core", "~> 3.1.6"
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.3"
24
+ spec.add_development_dependency "middleman", "~> 3.1.6"
25
+ spec.add_development_dependency "rake"
26
+ spec.add_development_dependency "rspec"
27
+ spec.add_development_dependency "rack-test"
28
+ end
@@ -0,0 +1,90 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Simple pagination", :feature do
4
+ it "activates without any issues" do
5
+ expect {
6
+ run_site('recipes') { activate :pagination }
7
+ }.not_to raise_error
8
+ end
9
+
10
+ it "produces pages for a set of resources" do
11
+ run_site 'recipes' do
12
+ activate :pagination do
13
+ pageable :recipes do |resource|
14
+ resource.path.start_with?('recipes')
15
+ end
16
+ end
17
+ end
18
+
19
+ visit '/'
20
+ find_on_page 'Showing 2 per page'
21
+ find_on_page 'First page: /'
22
+ find_on_page 'Last page: /pages/4.html'
23
+
24
+ find_on_page 'Bacon'
25
+ find_on_page 'Cake'
26
+ find_on_page 'Page 1 of 4'
27
+ find_on_page 'Prev page: none'
28
+ find_on_page 'Next page: /pages/2.html'
29
+
30
+ visit '/pages/2.html'
31
+ find_on_page 'Gelato'
32
+ find_on_page 'Mead'
33
+ find_on_page 'Page 2 of 4'
34
+ find_on_page 'Prev page: /'
35
+ find_on_page 'Next page: /pages/3.html'
36
+
37
+ visit '/pages/3.html'
38
+ find_on_page 'Sandwich'
39
+ find_on_page 'Waffles'
40
+ find_on_page 'Page 3 of 4'
41
+ find_on_page 'Prev page: /pages/2.html'
42
+ find_on_page 'Next page: /pages/4.html'
43
+
44
+ visit '/pages/4.html'
45
+ find_on_page 'Yeti'
46
+ find_on_page 'Page 4 of 4'
47
+ find_on_page 'Prev page: /pages/3.html'
48
+ find_on_page 'Next page: none'
49
+ end
50
+
51
+ def visit(path)
52
+ expect(get(path)).to be_ok
53
+ end
54
+
55
+ def find_on_page(string)
56
+ expect(last_response.body).to include(string)
57
+ end
58
+ end
59
+
60
+ describe "Pagination with directory indexes", :feature do
61
+ it "produces pages for a set of resources" do
62
+ run_site 'recipes' do
63
+ activate :pagination do
64
+ pageable :recipes do |resource|
65
+ resource.path.start_with?('recipes')
66
+ end
67
+ end
68
+
69
+ activate :directory_indexes
70
+ end
71
+
72
+ visit '/'
73
+ find_on_page 'First page: /'
74
+ find_on_page 'Prev page: none'
75
+ find_on_page 'Last page: /pages/4/'
76
+ find_on_page 'Next page: /pages/2/'
77
+
78
+ visit '/pages/2/'
79
+ find_on_page 'Prev page: /'
80
+ find_on_page 'Next page: /pages/3/'
81
+
82
+ visit '/pages/3/'
83
+ find_on_page 'Prev page: /pages/2/'
84
+ find_on_page 'Next page: /pages/4/'
85
+
86
+ visit '/pages/4/'
87
+ find_on_page 'Prev page: /pages/3/'
88
+ find_on_page 'Next page: none'
89
+ end
90
+ end
@@ -0,0 +1,21 @@
1
+ ---
2
+ pagination:
3
+ for: recipes
4
+ per_page: 2
5
+ ---
6
+
7
+ <% pagination.each do |recipe| %>
8
+ - <%= recipe.data.title %>
9
+ <% end %>
10
+
11
+ Page <%= pagination.page_num %> of <%= pagination.total_page_num %>
12
+
13
+ Showing <%= pagination.per_page %> per page
14
+
15
+ First page: <%= pagination.first_page.url %>
16
+
17
+ Next page: <%= pagination.next_page.try(:url) || 'none' %>
18
+
19
+ Prev page: <%= pagination.prev_page.try(:url) || 'none' %>
20
+
21
+ Last page: <%= pagination.last_page.url %>
@@ -0,0 +1 @@
1
+ <%= yield %>
@@ -0,0 +1,5 @@
1
+ ---
2
+ title: Bacon
3
+ ---
4
+
5
+ Delicious bacon!
@@ -0,0 +1,5 @@
1
+ ---
2
+ title: Cake
3
+ ---
4
+
5
+ Delicious cake!
@@ -0,0 +1,5 @@
1
+ ---
2
+ title: Gelato
3
+ ---
4
+
5
+ Delicious gelato!
@@ -0,0 +1,5 @@
1
+ ---
2
+ title: Mead
3
+ ---
4
+
5
+ Delicious mead!
@@ -0,0 +1,5 @@
1
+ ---
2
+ title: Sandwich
3
+ ---
4
+
5
+ Delicious sandwich!
@@ -0,0 +1,5 @@
1
+ ---
2
+ title: Waffles
3
+ ---
4
+
5
+ Delicious waffles!
@@ -0,0 +1,5 @@
1
+ ---
2
+ title: Yeti
3
+ ---
4
+
5
+ Delicious Yeti!
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ describe Middleman::Pagination::Configuration do
4
+ describe "#pageable" do
5
+ it "accepts a name and a block" do
6
+ config = described_class.new
7
+ expect {
8
+ config.pageable(:key) { }
9
+ }.not_to raise_error
10
+ end
11
+ end
12
+
13
+ describe "#each" do
14
+ it "yields the name and the block" do
15
+ config = described_class.new
16
+ block = lambda {}
17
+ config.pageable(:recipes, &block)
18
+
19
+ collected = []
20
+
21
+ config.each do |name, block|
22
+ collected << [name, block]
23
+ end
24
+
25
+ expect(collected).to eql([[:recipes, block]])
26
+ end
27
+ end
28
+
29
+ context "with instance_eval" do
30
+ it "acts appropriately" do
31
+ config = described_class.new
32
+
33
+ config.instance_eval do
34
+ pageable(:recipes) { :ok }
35
+ end
36
+
37
+ result = nil
38
+ config.each { |name, block| result = block.call }
39
+ expect(result).to be(:ok)
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ describe Middleman::Pagination::ExtensionContext do
4
+ describe "#app" do
5
+ it "returns the extension's app" do
6
+ app_one, app_two = double, double
7
+ extension = double(app: app_one)
8
+
9
+ context = described_class.new(extension)
10
+ expect(context.app).to be(app_one)
11
+
12
+ extension.stub(app: app_two)
13
+ expect(context.app).to be(app_two)
14
+ end
15
+ end
16
+
17
+ describe "#configuration" do
18
+ it "returns a configuration object" do
19
+ context = described_class.new(double)
20
+ expect(context.configuration).to be_a(Middleman::Pagination::Configuration)
21
+ end
22
+ end
23
+
24
+ shared_examples_for "a method delegated to the app" do
25
+ it "return's the app's method" do
26
+ app = double(method_name => :delegated)
27
+ extension = double(app: app)
28
+ context = described_class.new(extension)
29
+ expect(context.send(method_name)).to be(:delegated)
30
+ end
31
+ end
32
+
33
+ describe "#sitemap" do
34
+ let(:method_name) { :sitemap }
35
+ it_should_behave_like "a method delegated to the app"
36
+ end
37
+
38
+ describe "#index_file" do
39
+ let(:method_name) { :index_file }
40
+ it_should_behave_like "a method delegated to the app"
41
+ end
42
+ end
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+
3
+ module Middleman::Pagination
4
+ describe ManipulatedResources do
5
+ let(:context) { double(:context, configuration: configuration).as_null_object }
6
+ let(:configuration) { Configuration.new }
7
+ let(:resource_list) { [] }
8
+
9
+ describe "#initialize" do
10
+ it "accepts a context and a resource list" do
11
+ expect { described_class.new(context, resource_list) }.not_to raise_error
12
+ end
13
+ end
14
+
15
+ describe "#resource_list" do
16
+ context "with an empty configuration" do
17
+ it "returns resources without modification" do
18
+ manipulated = described_class.new(context, resource_list)
19
+ expect(manipulated.resource_list).to eql(resource_list)
20
+ end
21
+ end
22
+
23
+ context "with a pageable configuration and an pagination index" do
24
+ let(:configuration) {
25
+ config = Configuration.new
26
+ config.pageable(:recipes, &:is_recipe?)
27
+ config
28
+ }
29
+
30
+ let(:pagination_index) {
31
+ pagination_data = double(for: 'recipes', per_page: 2)
32
+ resource = double(:resource, path: 'index.html', is_recipe?: false).as_null_object
33
+ resource.stub_chain(:data, pagination: pagination_data)
34
+ resource
35
+ }
36
+
37
+ let(:resource_list) {
38
+ [pagination_index] +
39
+ 7.times.map do |n|
40
+ double(:resource, path: "recipe-#{n}.html", is_recipe?: true).as_null_object
41
+ end
42
+ }
43
+
44
+ it "adds new index pages" do
45
+ expect(resource_list).to have(8).pages
46
+ manipulated = described_class.new(context, resource_list)
47
+ expect(manipulated.resource_list).to have(11).pages
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,13 @@
1
+ require 'rspec'
2
+ require 'middleman/pagination'
3
+
4
+ # Include support files
5
+ support_files_pattern = File.expand_path('../support/**/*.rb', __FILE__)
6
+ Dir.glob(support_files_pattern).each { |f| require f }
7
+
8
+ RSpec.configure do |config|
9
+ # Will be the default in RSpec 3
10
+ config.treat_symbols_as_metadata_keys_with_true_values = true
11
+
12
+ config.include MiddlemanServerHelpers, :feature
13
+ end
@@ -0,0 +1,41 @@
1
+ require 'middleman/rack'
2
+ require 'rack/test'
3
+
4
+ module MiddlemanServerHelpers
5
+ include Rack::Test::Methods
6
+
7
+ def app
8
+ @app.call
9
+ end
10
+
11
+ def visit(path)
12
+ expect(get(path)).to be_ok
13
+ end
14
+
15
+ def find_on_page(string)
16
+ expect(last_response.body).to include(string)
17
+ end
18
+
19
+ def run_site(path, &block)
20
+ setup_environment(path)
21
+
22
+ @app = lambda do
23
+ instance = Middleman::Application.server.inst do
24
+ # Require the pagination extension after the
25
+ # server has booted, as would typically happen.
26
+ require File.expand_path('../../../lib/middleman_extension', __FILE__)
27
+
28
+ instance_exec(&block)
29
+ end
30
+
31
+ instance.class.to_rack_app
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def setup_environment(path)
38
+ ENV['MM_ROOT'] = File.expand_path("../../fixtures/#{path}", __FILE__)
39
+ ENV['TEST'] = "true"
40
+ end
41
+ end
metadata ADDED
@@ -0,0 +1,175 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: middleman-pagination
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Pete Nicholls
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-10-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: middleman-core
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 3.1.6
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 3.1.6
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '1.3'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '1.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: middleman
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: 3.1.6
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 3.1.6
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rack-test
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: General-purpose pagination support for Middleman pages.
98
+ email:
99
+ - pete@metanation.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - .gitignore
105
+ - .travis.yml
106
+ - Gemfile
107
+ - LICENSE.txt
108
+ - README.md
109
+ - Rakefile
110
+ - lib/middleman-pagination.rb
111
+ - lib/middleman/pagination.rb
112
+ - lib/middleman/pagination/configuration.rb
113
+ - lib/middleman/pagination/extension.rb
114
+ - lib/middleman/pagination/extension_context.rb
115
+ - lib/middleman/pagination/in_page_context.rb
116
+ - lib/middleman/pagination/manipulated_resources.rb
117
+ - lib/middleman/pagination/pageable_context.rb
118
+ - lib/middleman/pagination/version.rb
119
+ - lib/middleman_extension.rb
120
+ - middleman-pagination.gemspec
121
+ - spec/features/pagination_feature_spec.rb
122
+ - spec/fixtures/recipes/source/index.html.erb
123
+ - spec/fixtures/recipes/source/layouts/layout.erb
124
+ - spec/fixtures/recipes/source/recipes/bacon.html.erb
125
+ - spec/fixtures/recipes/source/recipes/cake.html.erb
126
+ - spec/fixtures/recipes/source/recipes/gelato.html.erb
127
+ - spec/fixtures/recipes/source/recipes/mead.html.erb
128
+ - spec/fixtures/recipes/source/recipes/sandwich.html.erb
129
+ - spec/fixtures/recipes/source/recipes/waffles.html.erb
130
+ - spec/fixtures/recipes/source/recipes/yeti.html.erb
131
+ - spec/middleman/pagination/configuration_spec.rb
132
+ - spec/middleman/pagination/extension_context_spec.rb
133
+ - spec/middleman/pagination/manipulated_resources_spec.rb
134
+ - spec/spec_helper.rb
135
+ - spec/support/middleman_server_helpers.rb
136
+ homepage: https://github.com/Aupajo/middleman-pagination
137
+ licenses:
138
+ - MIT
139
+ metadata: {}
140
+ post_install_message:
141
+ rdoc_options: []
142
+ require_paths:
143
+ - lib
144
+ required_ruby_version: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - '>='
147
+ - !ruby/object:Gem::Version
148
+ version: '0'
149
+ required_rubygems_version: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - '>='
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ requirements: []
155
+ rubyforge_project:
156
+ rubygems_version: 2.0.7
157
+ signing_key:
158
+ specification_version: 4
159
+ summary: Pagination for Middleman pages.
160
+ test_files:
161
+ - spec/features/pagination_feature_spec.rb
162
+ - spec/fixtures/recipes/source/index.html.erb
163
+ - spec/fixtures/recipes/source/layouts/layout.erb
164
+ - spec/fixtures/recipes/source/recipes/bacon.html.erb
165
+ - spec/fixtures/recipes/source/recipes/cake.html.erb
166
+ - spec/fixtures/recipes/source/recipes/gelato.html.erb
167
+ - spec/fixtures/recipes/source/recipes/mead.html.erb
168
+ - spec/fixtures/recipes/source/recipes/sandwich.html.erb
169
+ - spec/fixtures/recipes/source/recipes/waffles.html.erb
170
+ - spec/fixtures/recipes/source/recipes/yeti.html.erb
171
+ - spec/middleman/pagination/configuration_spec.rb
172
+ - spec/middleman/pagination/extension_context_spec.rb
173
+ - spec/middleman/pagination/manipulated_resources_spec.rb
174
+ - spec/spec_helper.rb
175
+ - spec/support/middleman_server_helpers.rb