bootstrap_pager 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +18 -0
- data/.idea/encodings.xml +5 -0
- data/.idea/misc.xml +5 -0
- data/.idea/modules.xml +9 -0
- data/.idea/pager.iml +50 -0
- data/.idea/scopes/scope_settings.xml +5 -0
- data/.idea/vcs.xml +7 -0
- data/Gemfile +4 -0
- data/LICENSE +20 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +307 -0
- data/Rakefile +42 -0
- data/app/assets/javascripts/infinitescroll.js +8 -0
- data/app/helpers/pager_helper.rb +5 -0
- data/app/views/pager/_first_page.html.erb +11 -0
- data/app/views/pager/_first_page.html.haml +9 -0
- data/app/views/pager/_first_page.html.slim +10 -0
- data/app/views/pager/_gap.html.erb +8 -0
- data/app/views/pager/_gap.html.haml +8 -0
- data/app/views/pager/_gap.html.slim +10 -0
- data/app/views/pager/_last_page.html.erb +11 -0
- data/app/views/pager/_last_page.html.haml +9 -0
- data/app/views/pager/_last_page.html.slim +10 -0
- data/app/views/pager/_next_page.html.erb +11 -0
- data/app/views/pager/_next_page.html.haml +9 -0
- data/app/views/pager/_next_page.html.slim +10 -0
- data/app/views/pager/_page.html.erb +14 -0
- data/app/views/pager/_page.html.haml +11 -0
- data/app/views/pager/_page.html.slim +13 -0
- data/app/views/pager/_paginator.html.erb +25 -0
- data/app/views/pager/_paginator.html.haml +19 -0
- data/app/views/pager/_paginator.html.slim +20 -0
- data/app/views/pager/_prev_page.html.erb +11 -0
- data/app/views/pager/_prev_page.html.haml +9 -0
- data/app/views/pager/_prev_page.html.slim +10 -0
- data/bootstrap_pager.gemspec +36 -0
- data/config/locales/pager.yml +19 -0
- data/gemfiles/active_record_30.gemfile +9 -0
- data/gemfiles/active_record_31.gemfile +7 -0
- data/gemfiles/active_record_32.gemfile +10 -0
- data/gemfiles/active_record_40.gemfile +8 -0
- data/gemfiles/active_record_edge.gemfile +11 -0
- data/gemfiles/data_mapper_12.gemfile +15 -0
- data/gemfiles/mongo_mapper.gemfile +10 -0
- data/gemfiles/mongoid_24.gemfile +7 -0
- data/gemfiles/mongoid_30.gemfile +12 -0
- data/gemfiles/sinatra_13.gemfile +13 -0
- data/gemfiles/sinatra_14.gemfile +13 -0
- data/lib/bootstrap_pager/config.rb +51 -0
- data/lib/bootstrap_pager/grape.rb +4 -0
- data/lib/bootstrap_pager/helpers/action_view_extension.rb +152 -0
- data/lib/bootstrap_pager/helpers/paginator.rb +186 -0
- data/lib/bootstrap_pager/helpers/sinatra_helpers.rb +144 -0
- data/lib/bootstrap_pager/helpers/tags.rb +96 -0
- data/lib/bootstrap_pager/hooks.rb +41 -0
- data/lib/bootstrap_pager/models/active_record_extension.rb +22 -0
- data/lib/bootstrap_pager/models/active_record_model_extension.rb +20 -0
- data/lib/bootstrap_pager/models/active_record_relation_methods.rb +29 -0
- data/lib/bootstrap_pager/models/array_extension.rb +58 -0
- data/lib/bootstrap_pager/models/configuration_methods.rb +48 -0
- data/lib/bootstrap_pager/models/data_mapper_collection_methods.rb +15 -0
- data/lib/bootstrap_pager/models/data_mapper_extension.rb +48 -0
- data/lib/bootstrap_pager/models/mongo_mapper_extension.rb +18 -0
- data/lib/bootstrap_pager/models/mongoid_criteria_methods.rb +23 -0
- data/lib/bootstrap_pager/models/mongoid_extension.rb +33 -0
- data/lib/bootstrap_pager/models/page_scope_methods.rb +70 -0
- data/lib/bootstrap_pager/models/plucky_criteria_methods.rb +18 -0
- data/lib/bootstrap_pager/railtie.rb +7 -0
- data/lib/bootstrap_pager/sinatra.rb +5 -0
- data/lib/bootstrap_pager/version.rb +3 -0
- data/lib/bootstrap_pager.rb +38 -0
- data/lib/generators/pager/config_generator.rb +16 -0
- data/lib/generators/pager/templates/pager_config.rb +10 -0
- data/lib/generators/pager/views_generator.rb +118 -0
- data/spec/config/config_spec.rb +91 -0
- data/spec/fake_app/active_record/config.rb +3 -0
- data/spec/fake_app/active_record/models.rb +57 -0
- data/spec/fake_app/data_mapper/config.rb +7 -0
- data/spec/fake_app/data_mapper/models.rb +27 -0
- data/spec/fake_app/log/development.log +832 -0
- data/spec/fake_app/mongo_mapper/config.rb +2 -0
- data/spec/fake_app/mongo_mapper/models.rb +9 -0
- data/spec/fake_app/mongoid/config.rb +16 -0
- data/spec/fake_app/mongoid/models.rb +22 -0
- data/spec/fake_app/rails_app.rb +67 -0
- data/spec/fake_app/sinatra_app.rb +22 -0
- data/spec/fake_gem.rb +4 -0
- data/spec/helpers/action_view_extension_spec.rb +292 -0
- data/spec/helpers/helpers_spec.rb +135 -0
- data/spec/helpers/sinatra_helpers_spec.rb +170 -0
- data/spec/helpers/tags_spec.rb +140 -0
- data/spec/models/active_record/active_record_relation_methods_spec.rb +47 -0
- data/spec/models/active_record/default_per_page_spec.rb +32 -0
- data/spec/models/active_record/max_pages_spec.rb +23 -0
- data/spec/models/active_record/max_per_page_spec.rb +32 -0
- data/spec/models/active_record/scopes_spec.rb +242 -0
- data/spec/models/array_spec.rb +150 -0
- data/spec/models/data_mapper/data_mapper_spec.rb +207 -0
- data/spec/models/mongo_mapper/mongo_mapper_spec.rb +84 -0
- data/spec/models/mongoid/mongoid_spec.rb +126 -0
- data/spec/requests/users_spec.rb +53 -0
- data/spec/spec_helper.rb +33 -0
- data/spec/spec_helper_for_sinatra.rb +34 -0
- data/spec/support/database_cleaner.rb +16 -0
- data/spec/support/matchers.rb +52 -0
- data/vendor/assets/javascripts/jquery.infinitescroll.js +814 -0
- data/vendor/assets/javascripts/jquery.infinitescroll.min.js +1 -0
- metadata +311 -0
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'bootstrap_pager/models/data_mapper_collection_methods'
|
2
|
+
|
3
|
+
module BootstrapPager
|
4
|
+
module DataMapperExtension
|
5
|
+
module Paginatable
|
6
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
7
|
+
def #{BootstrapPager.config.page_method_name}(num = 1)
|
8
|
+
num = [num.to_i, 1].max - 1
|
9
|
+
all(:limit => default_per_page, :offset => default_per_page * num).extend Paginating
|
10
|
+
end
|
11
|
+
RUBY
|
12
|
+
end
|
13
|
+
|
14
|
+
module Paginating
|
15
|
+
include BootstrapPager::PageScopeMethods
|
16
|
+
|
17
|
+
def all(options={})
|
18
|
+
super.extend Paginating
|
19
|
+
end
|
20
|
+
|
21
|
+
def per(num)
|
22
|
+
super.extend Paginating
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
module Collection
|
27
|
+
extend ActiveSupport::Concern
|
28
|
+
included do
|
29
|
+
include BootstrapPager::ConfigurationMethods::ClassMethods
|
30
|
+
include BootstrapPager::DataMapperCollectionMethods
|
31
|
+
include Paginatable
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
module Model
|
36
|
+
include BootstrapPager::ConfigurationMethods::ClassMethods
|
37
|
+
include Paginatable
|
38
|
+
|
39
|
+
def limit(val)
|
40
|
+
all(:limit => val)
|
41
|
+
end
|
42
|
+
|
43
|
+
def offset(val)
|
44
|
+
all(:offset => val)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'bootstrap_pager/models/plucky_criteria_methods'
|
2
|
+
|
3
|
+
module BootstrapPager
|
4
|
+
module MongoMapperExtension
|
5
|
+
module Document
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
include BootstrapPager::ConfigurationMethods
|
8
|
+
|
9
|
+
included do
|
10
|
+
# Fetch the values at the specified page number
|
11
|
+
# Model.page(5)
|
12
|
+
scope BootstrapPager.config.page_method_name, Proc.new {|num|
|
13
|
+
limit(default_per_page).offset(default_per_page * ([num.to_i, 1].max - 1))
|
14
|
+
}
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module BootstrapPager
|
2
|
+
module MongoidCriteriaMethods
|
3
|
+
def limit_value #:nodoc:
|
4
|
+
options[:limit]
|
5
|
+
end
|
6
|
+
|
7
|
+
def offset_value #:nodoc:
|
8
|
+
options[:skip]
|
9
|
+
end
|
10
|
+
|
11
|
+
def total_count #:nodoc:
|
12
|
+
embedded? ? unpage.count : count
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
def unpage
|
17
|
+
clone.tap do |crit|
|
18
|
+
crit.options.delete :limit
|
19
|
+
crit.options.delete :skip
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'bootstrap_pager/models/mongoid_criteria_methods'
|
2
|
+
|
3
|
+
module BootstrapPager
|
4
|
+
module MongoidExtension
|
5
|
+
module Criteria
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
10
|
+
def #{BootstrapPager.config.page_method_name}(*args)
|
11
|
+
super(*args).criteria.merge(self)
|
12
|
+
end
|
13
|
+
RUBY
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module Document
|
18
|
+
extend ActiveSupport::Concern
|
19
|
+
include BootstrapPager::ConfigurationMethods
|
20
|
+
|
21
|
+
included do
|
22
|
+
# Fetch the values at the specified page number
|
23
|
+
# Model.page(5)
|
24
|
+
scope BootstrapPager.config.page_method_name, Proc.new {|num|
|
25
|
+
limit(default_per_page).offset(default_per_page * ([num.to_i, 1].max - 1))
|
26
|
+
} do
|
27
|
+
include BootstrapPager::MongoidCriteriaMethods
|
28
|
+
include BootstrapPager::PageScopeMethods
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module BootstrapPager
|
2
|
+
module PageScopeMethods
|
3
|
+
# Specify the <tt>per_page</tt> value for the preceding <tt>page</tt> scope
|
4
|
+
# Model.page(3).per(10)
|
5
|
+
def per(num)
|
6
|
+
if (n = num.to_i) <= 0
|
7
|
+
self
|
8
|
+
elsif max_per_page && max_per_page < n
|
9
|
+
limit(max_per_page).offset(offset_value / limit_value * max_per_page)
|
10
|
+
else
|
11
|
+
limit(n).offset(offset_value / limit_value * n)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def padding(num)
|
16
|
+
@_padding = num
|
17
|
+
offset(offset_value + num.to_i)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Total number of pages
|
21
|
+
def total_pages
|
22
|
+
count_without_padding = total_count
|
23
|
+
count_without_padding -= @_padding if defined?(@_padding) && @_padding
|
24
|
+
count_without_padding = 0 if count_without_padding < 0
|
25
|
+
|
26
|
+
total_pages_count = (count_without_padding.to_f / limit_value).ceil
|
27
|
+
if max_pages.present? && max_pages < total_pages_count
|
28
|
+
max_pages
|
29
|
+
else
|
30
|
+
total_pages_count
|
31
|
+
end
|
32
|
+
end
|
33
|
+
#FIXME for compatibility. remove num_pages at some time in the future
|
34
|
+
alias num_pages total_pages
|
35
|
+
|
36
|
+
# Current page number
|
37
|
+
def current_page
|
38
|
+
offset_without_padding = offset_value
|
39
|
+
offset_without_padding -= @_padding if defined?(@_padding) && @_padding
|
40
|
+
offset_without_padding = 0 if offset_without_padding < 0
|
41
|
+
|
42
|
+
(offset_without_padding / limit_value) + 1
|
43
|
+
end
|
44
|
+
|
45
|
+
# Next page number in the collection
|
46
|
+
def next_page
|
47
|
+
current_page + 1 unless last_page?
|
48
|
+
end
|
49
|
+
|
50
|
+
# Previous page number in the collection
|
51
|
+
def prev_page
|
52
|
+
current_page - 1 unless first_page?
|
53
|
+
end
|
54
|
+
|
55
|
+
# First page of the collection?
|
56
|
+
def first_page?
|
57
|
+
current_page == 1
|
58
|
+
end
|
59
|
+
|
60
|
+
# Last page of the collection?
|
61
|
+
def last_page?
|
62
|
+
current_page >= total_pages
|
63
|
+
end
|
64
|
+
|
65
|
+
# Out of range of the collection?
|
66
|
+
def out_of_range?
|
67
|
+
current_page > total_pages
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module BootstrapPager
|
2
|
+
module PluckyCriteriaMethods
|
3
|
+
include BootstrapPager::PageScopeMethods
|
4
|
+
include BootstrapPager::ConfigurationMethods::ClassMethods
|
5
|
+
|
6
|
+
def limit_value #:nodoc:
|
7
|
+
options[:limit]
|
8
|
+
end
|
9
|
+
|
10
|
+
def offset_value #:nodoc:
|
11
|
+
options[:skip]
|
12
|
+
end
|
13
|
+
|
14
|
+
def total_count #:nodoc:
|
15
|
+
count
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module BootstrapPager
|
2
|
+
end
|
3
|
+
|
4
|
+
# load Rails/Railtie
|
5
|
+
begin
|
6
|
+
require 'rails'
|
7
|
+
rescue LoadError
|
8
|
+
#do nothing
|
9
|
+
end
|
10
|
+
|
11
|
+
$stderr.puts <<-EOC if !defined?(Rails) && !defined?(Sinatra) && !defined?(Grape)
|
12
|
+
warning: no framework detected.
|
13
|
+
|
14
|
+
Your Gemfile might not be configured properly.
|
15
|
+
---- e.g. ----
|
16
|
+
Rails:
|
17
|
+
gem 'bootstrap_pager'
|
18
|
+
|
19
|
+
Sinatra/Padrino:
|
20
|
+
gem 'bootstrap_pager', :require => 'bootstrap_pager/sinatra'
|
21
|
+
|
22
|
+
Grape:
|
23
|
+
gem 'bootstrap_pager', :require => 'bootstrap_pager/grape'
|
24
|
+
|
25
|
+
EOC
|
26
|
+
|
27
|
+
# load BootstrapPager components
|
28
|
+
require 'bootstrap_pager/config'
|
29
|
+
require 'bootstrap_pager/helpers/paginator'
|
30
|
+
require 'bootstrap_pager/models/page_scope_methods'
|
31
|
+
require 'bootstrap_pager/models/configuration_methods'
|
32
|
+
require 'bootstrap_pager/hooks'
|
33
|
+
|
34
|
+
# if not using Railtie, call `BootstrapPager::Hooks.init` directly
|
35
|
+
if defined? Rails
|
36
|
+
require 'bootstrap_pager/railtie'
|
37
|
+
require 'bootstrap_pager/engine'
|
38
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module BootstrapPager
|
2
|
+
module Generators
|
3
|
+
class ConfigGenerator < Rails::Generators::Base
|
4
|
+
source_root File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
|
5
|
+
|
6
|
+
desc <<DESC
|
7
|
+
Description:
|
8
|
+
Copies BootstrapPager configuration file to your application's initializer directory.
|
9
|
+
DESC
|
10
|
+
|
11
|
+
def copy_config_file
|
12
|
+
template 'bootstrap_pager_config.rb', 'config/initializers/bootstrap_pager_config.rb'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
BootstrapPager.configure do |config|
|
2
|
+
# config.default_per_page = 25
|
3
|
+
# config.max_per_page = nil
|
4
|
+
# config.window = 4
|
5
|
+
# config.outer_window = 0
|
6
|
+
# config.left = 0
|
7
|
+
# config.right = 0
|
8
|
+
# config.page_method_name = :page
|
9
|
+
# config.param_name = :page
|
10
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
module BootstrapPager
|
2
|
+
module Generators
|
3
|
+
|
4
|
+
class ViewsGenerator < Rails::Generators::NamedBase
|
5
|
+
source_root File.expand_path('../../../../app/views/bootstrap_pager', __FILE__)
|
6
|
+
|
7
|
+
class_option :template_engine, :type => :string, :aliases => '-e', :desc => 'Template engine for the views. Available options are "erb", "haml", and "slim".'
|
8
|
+
|
9
|
+
def self.banner #:nodoc:
|
10
|
+
<<-BANNER.chomp
|
11
|
+
rails g bootstrap_pager:views THEME [options]
|
12
|
+
|
13
|
+
Copies all paginator partial templates to your application.
|
14
|
+
You can choose a template THEME by specifying one from the list below:
|
15
|
+
|
16
|
+
- default
|
17
|
+
The default one.
|
18
|
+
This one is used internally while you don't override the partials.
|
19
|
+
#{themes.map {|t| " - #{t.name}\n#{t.description}"}.join("\n")}
|
20
|
+
BANNER
|
21
|
+
end
|
22
|
+
|
23
|
+
desc ''
|
24
|
+
def copy_or_fetch #:nodoc:
|
25
|
+
return copy_default_views if file_name == 'default'
|
26
|
+
|
27
|
+
themes = self.class.themes
|
28
|
+
if theme = themes.detect {|t| t.name == file_name}
|
29
|
+
download_templates theme
|
30
|
+
else
|
31
|
+
say %Q[no such theme: #{file_name}\n avaliable themes: #{themes.map(&:name).join ", "}]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
def self.themes
|
37
|
+
begin
|
38
|
+
@themes ||= GitHubApiHelper.get_files_in_master.group_by {|fn, _| fn[0...(fn.index('/') || 0)]}.delete_if {|fn, _| fn.blank?}.map do |name, files|
|
39
|
+
Theme.new name, files
|
40
|
+
end
|
41
|
+
rescue SocketError
|
42
|
+
[]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def download_templates(theme)
|
47
|
+
theme.templates_for(template_engine).each do |template|
|
48
|
+
say " downloading #{template.name} from bootstrap_pager_themes..."
|
49
|
+
create_file template.name, GitHubApiHelper.get_content_for("#{theme.name}/#{template.name}")
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def copy_default_views
|
54
|
+
filename_pattern = File.join self.class.source_root, "*.html.#{template_engine}"
|
55
|
+
Dir.glob(filename_pattern).map {|f| File.basename f}.each do |f|
|
56
|
+
copy_file f, "app/views/bootstrap_pager/#{f}"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def template_engine
|
61
|
+
options[:template_engine].try(:to_s).try(:downcase) || 'erb'
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
Template = Struct.new(:name, :sha) do
|
66
|
+
def description?
|
67
|
+
name == 'DESCRIPTION'
|
68
|
+
end
|
69
|
+
|
70
|
+
def view?
|
71
|
+
name =~ /^app\/views\//
|
72
|
+
end
|
73
|
+
|
74
|
+
def engine #:nodoc:
|
75
|
+
File.extname(name).sub /^\./, ''
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
class Theme
|
80
|
+
attr_accessor :name
|
81
|
+
def initialize(name, templates) #:nodoc:
|
82
|
+
@name, @templates = name, templates.map {|fn, sha| Template.new fn.sub(/^#{name}\//, ''), sha}
|
83
|
+
end
|
84
|
+
|
85
|
+
def description #:nodoc:
|
86
|
+
file = @templates.detect(&:description?)
|
87
|
+
return "#{' ' * 12}#{name}" unless file
|
88
|
+
GitHubApiHelper.get_content_for("#{@name}/#{file.name}").chomp.gsub(/^/, ' ' * 12)
|
89
|
+
end
|
90
|
+
|
91
|
+
def templates_for(template_engine) #:nodoc:
|
92
|
+
@templates.select {|t| !t.description?}.select {|t| !t.view? || (t.engine == template_engine)}
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
module GitHubApiHelper
|
97
|
+
def get_files_in_master
|
98
|
+
master_tree_sha = open('https://api.github.com/repos/amatsuda/bootstrap_pager_themes/git/refs/heads/master') do |json|
|
99
|
+
ActiveSupport::JSON.decode(json)['object']['sha']
|
100
|
+
end
|
101
|
+
open('https://api.github.com/repos/amatsuda/bootstrap_pager_themes/git/trees/' + master_tree_sha + '?recursive=1') do |json|
|
102
|
+
blobs = ActiveSupport::JSON.decode(json)['tree'].find_all {|i| i['type'] == 'blob' }
|
103
|
+
blobs.map do |blob|
|
104
|
+
[blob['path'], blob['sha']]
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
module_function :get_files_in_master
|
109
|
+
|
110
|
+
def get_content_for(path)
|
111
|
+
open('https://api.github.com/repos/amatsuda/bootstrap_pager_themes/contents/' + path) do |json|
|
112
|
+
Base64.decode64(ActiveSupport::JSON.decode(json)['content'])
|
113
|
+
end
|
114
|
+
end
|
115
|
+
module_function :get_content_for
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe BootstrapPager::Configuration do
|
4
|
+
subject { BootstrapPager.config }
|
5
|
+
describe 'default_per_page' do
|
6
|
+
context 'by default' do
|
7
|
+
its(:default_per_page) { should == 25 }
|
8
|
+
end
|
9
|
+
context 'configured via config block' do
|
10
|
+
before do
|
11
|
+
BootstrapPager.configure {|c| c.default_per_page = 17}
|
12
|
+
end
|
13
|
+
its(:default_per_page) { should == 17 }
|
14
|
+
after do
|
15
|
+
BootstrapPager.configure {|c| c.default_per_page = 25}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe 'max_per_page' do
|
21
|
+
context 'by default' do
|
22
|
+
its(:max_per_page) { should == nil }
|
23
|
+
end
|
24
|
+
context 'configure via config block' do
|
25
|
+
before do
|
26
|
+
BootstrapPager.configure {|c| c.max_per_page = 100}
|
27
|
+
end
|
28
|
+
its(:max_per_page) { should == 100 }
|
29
|
+
after do
|
30
|
+
BootstrapPager.configure {|c| c.max_per_page = nil}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe 'window' do
|
36
|
+
context 'by default' do
|
37
|
+
its(:window) { should == 4 }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe 'outer_window' do
|
42
|
+
context 'by default' do
|
43
|
+
its(:outer_window) { should == 0 }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe 'left' do
|
48
|
+
context 'by default' do
|
49
|
+
its(:left) { should == 0 }
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe 'right' do
|
54
|
+
context 'by default' do
|
55
|
+
its(:right) { should == 0 }
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe 'param_name' do
|
60
|
+
context 'by default' do
|
61
|
+
its(:param_name) { should == :page }
|
62
|
+
end
|
63
|
+
|
64
|
+
context 'configured via config block' do
|
65
|
+
before do
|
66
|
+
BootstrapPager.configure {|c| c.param_name = lambda { :test } }
|
67
|
+
end
|
68
|
+
|
69
|
+
its(:param_name) { should == :test }
|
70
|
+
|
71
|
+
after do
|
72
|
+
BootstrapPager.configure {|c| c.param_name = :page }
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
describe 'max_pages' do
|
78
|
+
context 'by default' do
|
79
|
+
its(:max_pages) { should == nil }
|
80
|
+
end
|
81
|
+
context 'configure via config block' do
|
82
|
+
before do
|
83
|
+
BootstrapPager.configure {|c| c.max_pages = 5}
|
84
|
+
end
|
85
|
+
its(:max_pages) { should == 5 }
|
86
|
+
after do
|
87
|
+
BootstrapPager.configure {|c| c.max_pages = nil}
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# models
|
2
|
+
class User < ActiveRecord::Base
|
3
|
+
has_many :authorships
|
4
|
+
has_many :readerships
|
5
|
+
has_many :books_authored, :through => :authorships, :source => :book
|
6
|
+
has_many :books_read, :through => :readerships, :source => :book
|
7
|
+
has_many :addresses, :class_name => 'User::Address'
|
8
|
+
|
9
|
+
def readers
|
10
|
+
User.joins(:books_read => :authors).where(:authors_books => {:id => self})
|
11
|
+
end
|
12
|
+
|
13
|
+
scope :by_name, order(:name)
|
14
|
+
scope :by_read_count, lambda {
|
15
|
+
cols = if connection.adapter_name == "PostgreSQL"
|
16
|
+
column_names.map { |column| %{"users"."#{column}"} }.join(", ")
|
17
|
+
else
|
18
|
+
'"users"."id"'
|
19
|
+
end
|
20
|
+
group(cols).select("count(readerships.id) AS read_count, #{cols}").order('read_count DESC')
|
21
|
+
}
|
22
|
+
end
|
23
|
+
class Authorship < ActiveRecord::Base
|
24
|
+
belongs_to :user
|
25
|
+
belongs_to :book
|
26
|
+
end
|
27
|
+
class Readership < ActiveRecord::Base
|
28
|
+
belongs_to :user
|
29
|
+
belongs_to :book
|
30
|
+
end
|
31
|
+
class Book < ActiveRecord::Base
|
32
|
+
has_many :authorships
|
33
|
+
has_many :readerships
|
34
|
+
has_many :authors, :through => :authorships, :source => :user
|
35
|
+
has_many :readers, :through => :readerships, :source => :user
|
36
|
+
end
|
37
|
+
# a model that is a descendant of AR::Base but doesn't directly inherit AR::Base
|
38
|
+
class Admin < User
|
39
|
+
end
|
40
|
+
# a model with namespace
|
41
|
+
class User::Address < ActiveRecord::Base
|
42
|
+
belongs_to :user
|
43
|
+
end
|
44
|
+
|
45
|
+
#migrations
|
46
|
+
class CreateAllTables < ActiveRecord::Migration
|
47
|
+
def self.up
|
48
|
+
create_table(:gem_defined_models) { |t| t.string :name; t.integer :age }
|
49
|
+
create_table(:users) {|t| t.string :name; t.integer :age}
|
50
|
+
create_table(:books) {|t| t.string :title}
|
51
|
+
create_table(:readerships) {|t| t.integer :user_id; t.integer :book_id }
|
52
|
+
create_table(:authorships) {|t| t.integer :user_id; t.integer :book_id }
|
53
|
+
create_table(:user_addresses) {|t| t.string :street; t.integer :user_id }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
ActiveRecord::Migration.verbose = false
|
57
|
+
CreateAllTables.up
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class User
|
2
|
+
include ::DataMapper::Resource
|
3
|
+
|
4
|
+
property :id, Serial
|
5
|
+
property :name, String, :required => true
|
6
|
+
property :age, Integer
|
7
|
+
|
8
|
+
has n, :projects, :through => Resource
|
9
|
+
end
|
10
|
+
|
11
|
+
class User::Address
|
12
|
+
include ::DataMapper::Resource
|
13
|
+
|
14
|
+
property :id, Serial
|
15
|
+
end
|
16
|
+
|
17
|
+
class Project
|
18
|
+
include ::DataMapper::Resource
|
19
|
+
|
20
|
+
property :id, Serial
|
21
|
+
property :name, String, :required => true
|
22
|
+
|
23
|
+
has n, :users, :through => Resource
|
24
|
+
end
|
25
|
+
|
26
|
+
DataMapper.finalize
|
27
|
+
DataMapper.auto_migrate!
|