├── rails_root
├── log
│ └── .gitkeep
├── app
│ ├── mailers
│ │ └── .gitkeep
│ ├── models
│ │ └── .gitkeep
│ ├── helpers
│ │ └── application_helper.rb
│ ├── assets
│ │ ├── images
│ │ │ └── rails.png
│ │ ├── stylesheets
│ │ │ └── application.css
│ │ └── javascripts
│ │ │ └── application.js
│ ├── controllers
│ │ └── application_controller.rb
│ └── views
│ │ └── layouts
│ │ └── application.html.erb
├── lib
│ ├── assets
│ │ └── .gitkeep
│ └── tasks
│ │ └── .gitkeep
├── public
│ ├── favicon.ico
│ ├── robots.txt
│ ├── 422.html
│ ├── 404.html
│ ├── 500.html
│ └── index.html
├── test
│ ├── fixtures
│ │ └── .gitkeep
│ ├── unit
│ │ └── .gitkeep
│ ├── functional
│ │ └── .gitkeep
│ ├── integration
│ │ └── .gitkeep
│ ├── performance
│ │ └── browsing_test.rb
│ └── test_helper.rb
├── vendor
│ ├── plugins
│ │ └── .gitkeep
│ └── assets
│ │ └── stylesheets
│ │ └── .gitkeep
├── config.ru
├── config
│ ├── environment.rb
│ ├── boot.rb
│ ├── locales
│ │ └── en.yml
│ ├── initializers
│ │ ├── mime_types.rb
│ │ ├── inflections.rb
│ │ ├── backtrace_silencers.rb
│ │ ├── session_store.rb
│ │ ├── secret_token.rb
│ │ └── wrap_parameters.rb
│ ├── database.yml
│ ├── environments
│ │ ├── development.rb
│ │ ├── test.rb
│ │ └── production.rb
│ ├── routes.rb
│ └── application.rb
├── Rakefile
├── script
│ └── rails
├── db
│ └── seeds.rb
├── .gitignore
├── Gemfile
└── README
├── .gitignore
├── public
├── images
│ └── pagem
│ │ ├── arrow_left.gif
│ │ ├── arrow_leftend.gif
│ │ ├── arrow_right.gif
│ │ └── arrow_rightend.gif
└── stylesheets
│ └── pagem.css
├── spec
├── spec_helper.rb
├── pagem_spec.rb
└── pagemmultiscope_spec.rb
├── Gemfile
├── rails
└── init.rb
├── Rakefile
├── README.rdoc
├── Manifest
├── pagem.gemspec
├── Gemfile.lock
└── lib
└── pagem.rb
/rails_root/log/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | pkg
2 | doc
3 |
--------------------------------------------------------------------------------
/rails_root/app/mailers/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/rails_root/app/models/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/rails_root/lib/assets/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/rails_root/lib/tasks/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/rails_root/public/favicon.ico:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/rails_root/test/fixtures/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/rails_root/test/unit/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/rails_root/test/functional/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/rails_root/test/integration/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/rails_root/vendor/plugins/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/rails_root/vendor/assets/stylesheets/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/rails_root/app/helpers/application_helper.rb:
--------------------------------------------------------------------------------
1 | module ApplicationHelper
2 | end
3 |
--------------------------------------------------------------------------------
/public/images/pagem/arrow_left.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdsol/pagem/master/public/images/pagem/arrow_left.gif
--------------------------------------------------------------------------------
/public/images/pagem/arrow_leftend.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdsol/pagem/master/public/images/pagem/arrow_leftend.gif
--------------------------------------------------------------------------------
/public/images/pagem/arrow_right.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdsol/pagem/master/public/images/pagem/arrow_right.gif
--------------------------------------------------------------------------------
/public/images/pagem/arrow_rightend.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdsol/pagem/master/public/images/pagem/arrow_rightend.gif
--------------------------------------------------------------------------------
/rails_root/app/assets/images/rails.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdsol/pagem/master/rails_root/app/assets/images/rails.png
--------------------------------------------------------------------------------
/rails_root/app/controllers/application_controller.rb:
--------------------------------------------------------------------------------
1 | class ApplicationController < ActionController::Base
2 | protect_from_forgery
3 | end
4 |
--------------------------------------------------------------------------------
/public/stylesheets/pagem.css:
--------------------------------------------------------------------------------
1 | .pagination { padding:8px; border-top:solid 1px #CDCDCD; text-align:center;}
2 | .pagination .page_picker, .pagination a.iconlink { margin: 0 8px; }
3 |
--------------------------------------------------------------------------------
/rails_root/config.ru:
--------------------------------------------------------------------------------
1 | # This file is used by Rack-based servers to start the application.
2 |
3 | require ::File.expand_path('../config/environment', __FILE__)
4 | run RailsRoot::Application
5 |
--------------------------------------------------------------------------------
/rails_root/config/environment.rb:
--------------------------------------------------------------------------------
1 | # Load the rails application
2 | require File.expand_path('../application', __FILE__)
3 |
4 | # Initialize the rails application
5 | RailsRoot::Application.initialize!
6 |
--------------------------------------------------------------------------------
/rails_root/config/boot.rb:
--------------------------------------------------------------------------------
1 | require 'rubygems'
2 |
3 | # Set up gems listed in the Gemfile.
4 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
5 |
6 | require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])
7 |
--------------------------------------------------------------------------------
/rails_root/public/robots.txt:
--------------------------------------------------------------------------------
1 | # See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file
2 | #
3 | # To ban all spiders from the entire site uncomment the next two lines:
4 | # User-Agent: *
5 | # Disallow: /
6 |
--------------------------------------------------------------------------------
/rails_root/config/locales/en.yml:
--------------------------------------------------------------------------------
1 | # Sample localization file for English. Add more files in this directory for other locales.
2 | # See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
3 |
4 | en:
5 | hello: "Hello world"
6 |
--------------------------------------------------------------------------------
/rails_root/config/initializers/mime_types.rb:
--------------------------------------------------------------------------------
1 | # Be sure to restart your server when you modify this file.
2 |
3 | # Add new mime types for use in respond_to blocks:
4 | # Mime::Type.register "text/richtext", :rtf
5 | # Mime::Type.register_alias "text/html", :iphone
6 |
--------------------------------------------------------------------------------
/rails_root/Rakefile:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env rake
2 | # Add your own tasks in files placed in lib/tasks ending in .rake,
3 | # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
4 |
5 | require File.expand_path('../config/application', __FILE__)
6 |
7 | RailsRoot::Application.load_tasks
8 |
--------------------------------------------------------------------------------
/rails_root/app/views/layouts/application.html.erb:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | RailsRoot
5 | <%= stylesheet_link_tag "application" %>
6 | <%= javascript_include_tag "application" %>
7 | <%= csrf_meta_tags %>
8 |
9 |
10 |
11 | <%= yield %>
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/rails_root/script/rails:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env ruby
2 | # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3 |
4 | APP_PATH = File.expand_path('../../config/application', __FILE__)
5 | require File.expand_path('../../config/boot', __FILE__)
6 | require 'rails/commands'
7 |
--------------------------------------------------------------------------------
/spec/spec_helper.rb:
--------------------------------------------------------------------------------
1 | ENV['RAILS_ENV'] = 'test'
2 |
3 | rails_root = File.dirname(__FILE__) + '/../rails_root'
4 | migration_dir= "#{rails_root}/db/migrate"
5 |
6 | require "#{rails_root}/config/environment.rb"
7 | require 'fileutils'
8 | require 'ruby-debug'
9 |
10 | module MedidataButtonsHelpers
11 | end
12 |
13 | Debugger.start
14 |
15 |
--------------------------------------------------------------------------------
/rails_root/db/seeds.rb:
--------------------------------------------------------------------------------
1 | # This file should contain all the record creation needed to seed the database with its default values.
2 | # The data can then be loaded with the rake db:seed (or created alongside the db with db:setup).
3 | #
4 | # Examples:
5 | #
6 | # cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }])
7 | # Mayor.create(name: 'Emanuel', city: cities.first)
8 |
--------------------------------------------------------------------------------
/Gemfile:
--------------------------------------------------------------------------------
1 | source :gemcutter
2 |
3 | source "http://gems.github.com"
4 |
5 | gem "rails", "=3.1.12"
6 | gem "echoe"
7 |
8 | group :test, :development do
9 | ## If you add gems in this section you will require the gems
10 | ## to be ONLY on :test,:conduct_cruise,:development environments.
11 | gem 'debugger', '~> 1.6'
12 | gem "rspec", "~> 2.13"
13 | end
14 |
--------------------------------------------------------------------------------
/rails_root/app/assets/stylesheets/application.css:
--------------------------------------------------------------------------------
1 | /*
2 | * This is a manifest file that'll automatically include all the stylesheets available in this directory
3 | * and any sub-directories. You're free to add application-wide styles to this file and they'll appear at
4 | * the top of the compiled file, but it's generally better to create a new file per style scope.
5 | *= require_self
6 | *= require_tree .
7 | */
--------------------------------------------------------------------------------
/rails_root/config/initializers/inflections.rb:
--------------------------------------------------------------------------------
1 | # Be sure to restart your server when you modify this file.
2 |
3 | # Add new inflection rules using the following format
4 | # (all these examples are active by default):
5 | # ActiveSupport::Inflector.inflections do |inflect|
6 | # inflect.plural /^(ox)$/i, '\1en'
7 | # inflect.singular /^(ox)en/i, '\1'
8 | # inflect.irregular 'person', 'people'
9 | # inflect.uncountable %w( fish sheep )
10 | # end
11 |
--------------------------------------------------------------------------------
/rails_root/test/performance/browsing_test.rb:
--------------------------------------------------------------------------------
1 | require 'test_helper'
2 | require 'rails/performance_test_help'
3 |
4 | class BrowsingTest < ActionDispatch::PerformanceTest
5 | # Refer to the documentation for all available options
6 | # self.profile_options = { :runs => 5, :metrics => [:wall_time, :memory]
7 | # :output => 'tmp/performance', :formats => [:flat] }
8 |
9 | def test_homepage
10 | get '/'
11 | end
12 | end
13 |
--------------------------------------------------------------------------------
/rails/init.rb:
--------------------------------------------------------------------------------
1 | require "pagem"
2 |
3 | ['/public/stylesheets/pagem.css'].each do |file|
4 | source = File.join(directory,file)
5 | dest = RAILS_ROOT + file
6 | FileUtils.cp(source, dest)
7 | end
8 |
9 |
10 | # move images to public/images/medidata_buttons
11 | ['/public/images/pagem'].each do |dir|
12 | source = File.join(directory,dir)
13 | dest = RAILS_ROOT + dir
14 | FileUtils.mkdir_p(dest)
15 | FileUtils.cp(Dir.glob(source+'/*.*'), dest)
16 | end
--------------------------------------------------------------------------------
/rails_root/config/initializers/backtrace_silencers.rb:
--------------------------------------------------------------------------------
1 | # Be sure to restart your server when you modify this file.
2 |
3 | # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
4 | # Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
5 |
6 | # You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.
7 | # Rails.backtrace_cleaner.remove_silencers!
8 |
--------------------------------------------------------------------------------
/rails_root/config/initializers/session_store.rb:
--------------------------------------------------------------------------------
1 | # Be sure to restart your server when you modify this file.
2 |
3 | RailsRoot::Application.config.session_store :cookie_store, key: '_rails_root_session'
4 |
5 | # Use the database for sessions instead of the cookie-based default,
6 | # which shouldn't be used to store highly confidential information
7 | # (create the session table with "rails generate session_migration")
8 | # RailsRoot::Application.config.session_store :active_record_store
9 |
--------------------------------------------------------------------------------
/rails_root/.gitignore:
--------------------------------------------------------------------------------
1 | # See http://help.github.com/ignore-files/ for more about ignoring files.
2 | #
3 | # If you find yourself ignoring temporary files generated by your text editor
4 | # or operating system, you probably want to add a global ignore instead:
5 | # git config --global core.excludesfile ~/.gitignore_global
6 |
7 | # Ignore bundler config
8 | /.bundle
9 |
10 | # Ignore the default SQLite database.
11 | /db/*.sqlite3
12 |
13 | # Ignore all logfiles and tempfiles.
14 | /log/*.log
15 | /tmp
16 |
--------------------------------------------------------------------------------
/rails_root/test/test_helper.rb:
--------------------------------------------------------------------------------
1 | ENV["RAILS_ENV"] = "test"
2 | require File.expand_path('../../config/environment', __FILE__)
3 | require 'rails/test_help'
4 |
5 | class ActiveSupport::TestCase
6 | # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order.
7 | #
8 | # Note: You'll currently still have to declare fixtures explicitly in integration tests
9 | # -- they do not yet inherit this setting
10 | fixtures :all
11 |
12 | # Add more helper methods to be used by all tests here...
13 | end
14 |
--------------------------------------------------------------------------------
/rails_root/app/assets/javascripts/application.js:
--------------------------------------------------------------------------------
1 | // This is a manifest file that'll be compiled into including all the files listed below.
2 | // Add new JavaScript/Coffee code in separate files in this directory and they'll automatically
3 | // be included in the compiled file accessible from http://example.com/assets/application.js
4 | // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
5 | // the compiled file.
6 | //
7 | //= require jquery
8 | //= require jquery_ujs
9 | //= require_tree .
10 |
--------------------------------------------------------------------------------
/rails_root/config/initializers/secret_token.rb:
--------------------------------------------------------------------------------
1 | # Be sure to restart your server when you modify this file.
2 |
3 | # Your secret key for verifying the integrity of signed cookies.
4 | # If you change this key, all old signed cookies will become invalid!
5 | # Make sure the secret is at least 30 characters and all random,
6 | # no regular words or you'll be exposed to dictionary attacks.
7 | RailsRoot::Application.config.secret_token = '12579093f4bbc00410e2c3b3c7c5bbe19cdebb0b9b128e8d4e7821b28a9803eb28a4bf4c07644765bf035c4844a83c308a63f9afb5e6a40014d4dfe06bce4d62'
8 |
--------------------------------------------------------------------------------
/rails_root/config/initializers/wrap_parameters.rb:
--------------------------------------------------------------------------------
1 | # Be sure to restart your server when you modify this file.
2 | #
3 | # This file contains settings for ActionController::ParamsWrapper which
4 | # is enabled by default.
5 |
6 | # Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
7 | ActiveSupport.on_load(:action_controller) do
8 | wrap_parameters format: [:json]
9 | end
10 |
11 | # Disable root element in JSON by default.
12 | ActiveSupport.on_load(:active_record) do
13 | self.include_root_in_json = false
14 | end
15 |
--------------------------------------------------------------------------------
/rails_root/config/database.yml:
--------------------------------------------------------------------------------
1 | # SQLite version 3.x
2 | # gem install sqlite3
3 | #
4 | # Ensure the SQLite 3 gem is defined in your Gemfile
5 | # gem 'sqlite3'
6 | development:
7 | adapter: sqlite3
8 | database: db/development.sqlite3
9 | pool: 5
10 | timeout: 5000
11 |
12 | # Warning: The database defined as "test" will be erased and
13 | # re-generated from your development database when you run "rake".
14 | # Do not set this db to the same as development or production.
15 | test:
16 | adapter: sqlite3
17 | database: db/test.sqlite3
18 | pool: 5
19 | timeout: 5000
20 |
21 | production:
22 | adapter: sqlite3
23 | database: db/production.sqlite3
24 | pool: 5
25 | timeout: 5000
26 |
--------------------------------------------------------------------------------
/rails_root/public/422.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | The change you wanted was rejected (422)
5 |
17 |
18 |
19 |
20 |
21 |
22 |
The change you wanted was rejected.
23 |
Maybe you tried to change something you didn't have access to.
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/rails_root/public/404.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | The page you were looking for doesn't exist (404)
5 |
17 |
18 |
19 |
20 |
21 |
22 |
The page you were looking for doesn't exist.
23 |
You may have mistyped the address or the page may have moved.
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/rails_root/public/500.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | We're sorry, but something went wrong (500)
5 |
17 |
18 |
19 |
20 |
21 |
22 |
We're sorry, but something went wrong.
23 |
We've been notified about this issue and we'll take a look at it shortly.
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Rakefile:
--------------------------------------------------------------------------------
1 | require 'rubygems'
2 | require 'rake'
3 | require 'echoe'
4 | require 'rake/testtask'
5 | require 'rdoc/task'
6 |
7 | desc 'Default: run unit tests.'
8 | task :default => :test
9 |
10 | desc 'Test the gem.'
11 | Rake::TestTask.new(:test) do |t|
12 | t.libs << 'lib'
13 | t.pattern = 'spec/pagem_spec.rb'
14 | t.verbose = true
15 | end
16 |
17 | Echoe.new('pagem', '1.0.7') do |p|
18 | p.description = "Pagination helper that works off of scopes (named) to facilitate data retrieval and display."
19 | p.url = "http://github.com/mdsol/pagem"
20 | p.author = "Ben Young"
21 | p.email = "byoung@mdsol.com"
22 | p.ignore_pattern = []
23 | p.development_dependencies = ['rails =3.1.12']
24 | p.retain_gemspec = true
25 | end
26 |
27 | Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext }
28 |
--------------------------------------------------------------------------------
/rails_root/Gemfile:
--------------------------------------------------------------------------------
1 | source 'http://rubygems.org'
2 |
3 | gem 'rails', '3.1.12'
4 |
5 | # Bundle edge Rails instead:
6 | # gem 'rails', :git => 'git://github.com/rails/rails.git'
7 |
8 | gem 'sqlite3'
9 |
10 |
11 | # Gems used only for assets and not required
12 | # in production environments by default.
13 | group :assets do
14 | gem 'sass-rails', '~> 3.1.5'
15 | gem 'coffee-rails', '~> 3.1.1'
16 |
17 | # See https://github.com/sstephenson/execjs#readme for more supported runtimes
18 | # gem 'therubyracer'
19 |
20 | gem 'uglifier', '>= 1.0.3'
21 | end
22 |
23 | gem 'jquery-rails'
24 |
25 | # To use ActiveModel has_secure_password
26 | # gem 'bcrypt-ruby', '~> 3.0.0'
27 |
28 | # Use unicorn as the web server
29 | # gem 'unicorn'
30 |
31 | # Deploy with Capistrano
32 | # gem 'capistrano'
33 |
34 | # To use debugger
35 | # gem 'ruby-debug19', :require => 'ruby-debug'
36 |
37 | group :test do
38 | # Pretty printed test output
39 | gem 'turn', '~> 0.8.3', :require => false
40 | end
41 |
--------------------------------------------------------------------------------
/README.rdoc:
--------------------------------------------------------------------------------
1 | = Pagem
2 |
3 | Rails gem pagination helper that works off of scopes (named) to facilitate data retrieval and display.
4 |
5 | == Install
6 |
7 | Use the bundler gem (sudo gem install bundler)
8 | Add the following to your Gemfile
9 |
10 | gem "pagem", :git => "git://github.com/mdsol/pagem.git"
11 |
12 | == Testing
13 |
14 | rvm use ruby-1.9.3-p125
15 | bundle install
16 | bundle exec rspec spec/*
17 |
18 | == Usage
19 |
20 | === Controller
21 | In your controller, create an instance of the helper. Pass your scope and the params hash as arguments.
22 |
23 | @pager = Pagem.new(@study.subjects, params)
24 |
25 | Retrieve the paged scope from the Pagem instance.
26 |
27 | @subjects = @pager.paged_scope
28 |
29 |
30 | === View
31 |
32 | In your view, use the paged scope to display the data as you would for any data set.
33 | Then, render the pagination controls at the bottom.
34 |
35 | <%= @pager %>
36 |
37 | The pagem class can work with remote forms (AJAX) as well.
38 |
39 | <%= @pager.render(:is_remote => true) %>
40 |
--------------------------------------------------------------------------------
/rails_root/config/environments/development.rb:
--------------------------------------------------------------------------------
1 | RailsRoot::Application.configure do
2 | # Settings specified here will take precedence over those in config/application.rb
3 |
4 | # In the development environment your application's code is reloaded on
5 | # every request. This slows down response time but is perfect for development
6 | # since you don't have to restart the web server when you make code changes.
7 | config.cache_classes = false
8 |
9 | # Log error messages when you accidentally call methods on nil.
10 | config.whiny_nils = true
11 |
12 | # Show full error reports and disable caching
13 | config.consider_all_requests_local = true
14 | config.action_controller.perform_caching = false
15 |
16 | # Don't care if the mailer can't send
17 | config.action_mailer.raise_delivery_errors = false
18 |
19 | # Print deprecation notices to the Rails logger
20 | config.active_support.deprecation = :log
21 |
22 | # Only use best-standards-support built into browsers
23 | config.action_dispatch.best_standards_support = :builtin
24 |
25 | # Do not compress assets
26 | config.assets.compress = false
27 |
28 | # Expands the lines which load the assets
29 | config.assets.debug = true
30 | end
31 |
--------------------------------------------------------------------------------
/Manifest:
--------------------------------------------------------------------------------
1 | Gemfile
2 | Gemfile.lock
3 | Manifest
4 | README.rdoc
5 | Rakefile
6 | lib/pagem.rb
7 | pagem.gemspec
8 | public/images/pagem/arrow_left.gif
9 | public/images/pagem/arrow_leftend.gif
10 | public/images/pagem/arrow_right.gif
11 | public/images/pagem/arrow_rightend.gif
12 | public/stylesheets/pagem.css
13 | rails/init.rb
14 | rails_root/Gemfile
15 | rails_root/README
16 | rails_root/Rakefile
17 | rails_root/app/assets/images/rails.png
18 | rails_root/app/assets/javascripts/application.js
19 | rails_root/app/assets/stylesheets/application.css
20 | rails_root/app/controllers/application_controller.rb
21 | rails_root/app/helpers/application_helper.rb
22 | rails_root/app/views/layouts/application.html.erb
23 | rails_root/config.ru
24 | rails_root/config/application.rb
25 | rails_root/config/boot.rb
26 | rails_root/config/database.yml
27 | rails_root/config/environment.rb
28 | rails_root/config/environments/development.rb
29 | rails_root/config/environments/production.rb
30 | rails_root/config/environments/test.rb
31 | rails_root/config/initializers/backtrace_silencers.rb
32 | rails_root/config/initializers/inflections.rb
33 | rails_root/config/initializers/mime_types.rb
34 | rails_root/config/initializers/secret_token.rb
35 | rails_root/config/initializers/session_store.rb
36 | rails_root/config/initializers/wrap_parameters.rb
37 | rails_root/config/locales/en.yml
38 | rails_root/config/routes.rb
39 | rails_root/db/seeds.rb
40 | rails_root/doc/README_FOR_APP
41 | rails_root/public/404.html
42 | rails_root/public/422.html
43 | rails_root/public/500.html
44 | rails_root/public/favicon.ico
45 | rails_root/public/index.html
46 | rails_root/public/robots.txt
47 | rails_root/script/rails
48 | rails_root/test/performance/browsing_test.rb
49 | rails_root/test/test_helper.rb
50 | spec/pagem_spec.rb
51 | spec/spec_helper.rb
52 |
--------------------------------------------------------------------------------
/rails_root/config/environments/test.rb:
--------------------------------------------------------------------------------
1 | RailsRoot::Application.configure do
2 | # Settings specified here will take precedence over those in config/application.rb
3 |
4 | # The test environment is used exclusively to run your application's
5 | # test suite. You never need to work with it otherwise. Remember that
6 | # your test database is "scratch space" for the test suite and is wiped
7 | # and recreated between test runs. Don't rely on the data there!
8 | config.cache_classes = true
9 |
10 | # Configure static asset server for tests with Cache-Control for performance
11 | config.serve_static_assets = true
12 | config.static_cache_control = "public, max-age=3600"
13 |
14 | # Log error messages when you accidentally call methods on nil
15 | config.whiny_nils = true
16 |
17 | # Show full error reports and disable caching
18 | config.consider_all_requests_local = true
19 | config.action_controller.perform_caching = false
20 |
21 | # Raise exceptions instead of rendering exception templates
22 | config.action_dispatch.show_exceptions = false
23 |
24 | # Disable request forgery protection in test environment
25 | config.action_controller.allow_forgery_protection = false
26 |
27 | # Tell Action Mailer not to deliver emails to the real world.
28 | # The :test delivery method accumulates sent emails in the
29 | # ActionMailer::Base.deliveries array.
30 | config.action_mailer.delivery_method = :test
31 |
32 | # Use SQL instead of Active Record's schema dumper when creating the test database.
33 | # This is necessary if your schema can't be completely dumped by the schema dumper,
34 | # like if you have constraints or database-specific column types
35 | # config.active_record.schema_format = :sql
36 |
37 | # Print deprecation notices to the stderr
38 | config.active_support.deprecation = :stderr
39 | end
40 |
--------------------------------------------------------------------------------
/rails_root/config/routes.rb:
--------------------------------------------------------------------------------
1 | RailsRoot::Application.routes.draw do
2 | # The priority is based upon order of creation:
3 | # first created -> highest priority.
4 |
5 | # Sample of regular route:
6 | # match 'products/:id' => 'catalog#view'
7 | # Keep in mind you can assign values other than :controller and :action
8 |
9 | # Sample of named route:
10 | # match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase
11 | # This route can be invoked with purchase_url(:id => product.id)
12 |
13 | # Sample resource route (maps HTTP verbs to controller actions automatically):
14 | # resources :products
15 |
16 | # Sample resource route with options:
17 | # resources :products do
18 | # member do
19 | # get 'short'
20 | # post 'toggle'
21 | # end
22 | #
23 | # collection do
24 | # get 'sold'
25 | # end
26 | # end
27 |
28 | # Sample resource route with sub-resources:
29 | # resources :products do
30 | # resources :comments, :sales
31 | # resource :seller
32 | # end
33 |
34 | # Sample resource route with more complex sub-resources
35 | # resources :products do
36 | # resources :comments
37 | # resources :sales do
38 | # get 'recent', :on => :collection
39 | # end
40 | # end
41 |
42 | # Sample resource route within a namespace:
43 | # namespace :admin do
44 | # # Directs /admin/products/* to Admin::ProductsController
45 | # # (app/controllers/admin/products_controller.rb)
46 | # resources :products
47 | # end
48 |
49 | # You can have the root of your site routed with "root"
50 | # just remember to delete public/index.html.
51 | # root :to => 'welcome#index'
52 |
53 | # See how all your routes lay out with "rake routes"
54 |
55 | # This is a legacy wild controller route that's not recommended for RESTful applications.
56 | # Note: This route will make all actions in every controller accessible via GET requests.
57 | # match ':controller(/:action(/:id(.:format)))'
58 | end
59 |
--------------------------------------------------------------------------------
/rails_root/config/application.rb:
--------------------------------------------------------------------------------
1 | require File.expand_path('../boot', __FILE__)
2 |
3 | require 'rails/all'
4 |
5 | if defined?(Bundler)
6 | # If you precompile assets before deploying to production, use this line
7 | Bundler.require(*Rails.groups(:assets => %w(development test)))
8 | # If you want your assets lazily compiled in production, use this line
9 | # Bundler.require(:default, :assets, Rails.env)
10 | end
11 |
12 | module RailsRoot
13 | class Application < Rails::Application
14 | # Settings in config/environments/* take precedence over those specified here.
15 | # Application configuration should go into files in config/initializers
16 | # -- all .rb files in that directory are automatically loaded.
17 |
18 | # Custom directories with classes and modules you want to be autoloadable.
19 | # config.autoload_paths += %W(#{config.root}/extras)
20 |
21 | # Only load the plugins named here, in the order given (default is alphabetical).
22 | # :all can be used as a placeholder for all plugins not explicitly named.
23 | # config.plugins = [ :exception_notification, :ssl_requirement, :all ]
24 |
25 | # Activate observers that should always be running.
26 | # config.active_record.observers = :cacher, :garbage_collector, :forum_observer
27 |
28 | # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
29 | # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
30 | # config.time_zone = 'Central Time (US & Canada)'
31 |
32 | # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
33 | # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
34 | # config.i18n.default_locale = :de
35 |
36 | # Configure the default encoding used in templates for Ruby 1.9.
37 | config.encoding = "utf-8"
38 |
39 | # Configure sensitive parameters which will be filtered from the log file.
40 | config.filter_parameters += [:password]
41 |
42 | # Enable the asset pipeline
43 | config.assets.enabled = true
44 |
45 | # Version of your assets, change this if you want to expire all your assets
46 | config.assets.version = '1.0'
47 | end
48 | end
49 |
--------------------------------------------------------------------------------
/rails_root/config/environments/production.rb:
--------------------------------------------------------------------------------
1 | RailsRoot::Application.configure do
2 | # Settings specified here will take precedence over those in config/application.rb
3 |
4 | # Code is not reloaded between requests
5 | config.cache_classes = true
6 |
7 | # Full error reports are disabled and caching is turned on
8 | config.consider_all_requests_local = false
9 | config.action_controller.perform_caching = true
10 |
11 | # Disable Rails's static asset server (Apache or nginx will already do this)
12 | config.serve_static_assets = false
13 |
14 | # Compress JavaScripts and CSS
15 | config.assets.compress = true
16 |
17 | # Don't fallback to assets pipeline if a precompiled asset is missed
18 | config.assets.compile = false
19 |
20 | # Generate digests for assets URLs
21 | config.assets.digest = true
22 |
23 | # Defaults to Rails.root.join("public/assets")
24 | # config.assets.manifest = YOUR_PATH
25 |
26 | # Specifies the header that your server uses for sending files
27 | # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
28 | # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
29 |
30 | # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
31 | # config.force_ssl = true
32 |
33 | # See everything in the log (default is :info)
34 | # config.log_level = :debug
35 |
36 | # Use a different logger for distributed setups
37 | # config.logger = SyslogLogger.new
38 |
39 | # Use a different cache store in production
40 | # config.cache_store = :mem_cache_store
41 |
42 | # Enable serving of images, stylesheets, and JavaScripts from an asset server
43 | # config.action_controller.asset_host = "http://assets.example.com"
44 |
45 | # Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added)
46 | # config.assets.precompile += %w( search.js )
47 |
48 | # Disable delivery errors, bad email addresses will be ignored
49 | # config.action_mailer.raise_delivery_errors = false
50 |
51 | # Enable threaded mode
52 | # config.threadsafe!
53 |
54 | # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
55 | # the I18n.default_locale when a translation can not be found)
56 | config.i18n.fallbacks = true
57 |
58 | # Send deprecation notices to registered listeners
59 | config.active_support.deprecation = :notify
60 | end
61 |
--------------------------------------------------------------------------------
/pagem.gemspec:
--------------------------------------------------------------------------------
1 | # -*- encoding: utf-8 -*-
2 |
3 | Gem::Specification.new do |s|
4 | s.name = "pagem"
5 | s.version = "1.0.7"
6 |
7 | s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8 | s.authors = ["Ben Young"]
9 | s.date = "2014-05-20"
10 | s.description = "Pagination helper that works off of scopes (named) to facilitate data retrieval and display."
11 | s.email = "byoung@mdsol.com"
12 | s.extra_rdoc_files = ["README.rdoc", "lib/pagem.rb"]
13 | s.files = ["Gemfile", "Gemfile.lock", "Manifest", "README.rdoc", "Rakefile", "lib/pagem.rb", "pagem.gemspec", "public/images/pagem/arrow_left.gif", "public/images/pagem/arrow_leftend.gif", "public/images/pagem/arrow_right.gif", "public/images/pagem/arrow_rightend.gif", "public/stylesheets/pagem.css", "rails/init.rb", "rails_root/Gemfile", "rails_root/README", "rails_root/Rakefile", "rails_root/app/assets/images/rails.png", "rails_root/app/assets/javascripts/application.js", "rails_root/app/assets/stylesheets/application.css", "rails_root/app/controllers/application_controller.rb", "rails_root/app/helpers/application_helper.rb", "rails_root/app/views/layouts/application.html.erb", "rails_root/config.ru", "rails_root/config/application.rb", "rails_root/config/boot.rb", "rails_root/config/database.yml", "rails_root/config/environment.rb", "rails_root/config/environments/development.rb", "rails_root/config/environments/production.rb", "rails_root/config/environments/test.rb", "rails_root/config/initializers/backtrace_silencers.rb", "rails_root/config/initializers/inflections.rb", "rails_root/config/initializers/mime_types.rb", "rails_root/config/initializers/secret_token.rb", "rails_root/config/initializers/session_store.rb", "rails_root/config/initializers/wrap_parameters.rb", "rails_root/config/locales/en.yml", "rails_root/config/routes.rb", "rails_root/db/seeds.rb", "rails_root/doc/README_FOR_APP", "rails_root/public/404.html", "rails_root/public/422.html", "rails_root/public/500.html", "rails_root/public/favicon.ico", "rails_root/public/index.html", "rails_root/public/robots.txt", "rails_root/script/rails", "rails_root/test/performance/browsing_test.rb", "rails_root/test/test_helper.rb", "spec/pagem_spec.rb", "spec/spec_helper.rb"]
14 | s.homepage = "http://github.com/mdsol/pagem"
15 | s.rdoc_options = ["--line-numbers", "--title", "Pagem", "--main", "README.rdoc"]
16 | s.require_paths = ["lib"]
17 | s.rubyforge_project = "pagem"
18 | s.rubygems_version = "1.8.28"
19 | s.summary = "Pagination helper that works off of scopes (named) to facilitate data retrieval and display."
20 |
21 | if s.respond_to? :specification_version then
22 | s.specification_version = 3
23 |
24 | if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
25 | s.add_development_dependency(%q, ["= 3.1.12"])
26 | else
27 | s.add_dependency(%q, ["= 3.1.12"])
28 | end
29 | else
30 | s.add_dependency(%q, ["= 3.1.12"])
31 | end
32 | end
33 |
--------------------------------------------------------------------------------
/Gemfile.lock:
--------------------------------------------------------------------------------
1 | GEM
2 | remote: http://rubygems.org/
3 | remote: http://gems.github.com/
4 | specs:
5 | actionmailer (3.1.12)
6 | actionpack (= 3.1.12)
7 | mail (~> 2.4.4)
8 | actionpack (3.1.12)
9 | activemodel (= 3.1.12)
10 | activesupport (= 3.1.12)
11 | builder (~> 3.0.0)
12 | erubis (~> 2.7.0)
13 | i18n (~> 0.6)
14 | rack (~> 1.3.6)
15 | rack-cache (~> 1.2)
16 | rack-mount (~> 0.8.2)
17 | rack-test (~> 0.6.1)
18 | sprockets (~> 2.0.4)
19 | activemodel (3.1.12)
20 | activesupport (= 3.1.12)
21 | builder (~> 3.0.0)
22 | i18n (~> 0.6)
23 | activerecord (3.1.12)
24 | activemodel (= 3.1.12)
25 | activesupport (= 3.1.12)
26 | arel (~> 2.2.3)
27 | tzinfo (~> 0.3.29)
28 | activeresource (3.1.12)
29 | activemodel (= 3.1.12)
30 | activesupport (= 3.1.12)
31 | activesupport (3.1.12)
32 | multi_json (~> 1.0)
33 | allison (2.0.3)
34 | arel (2.2.3)
35 | builder (3.0.4)
36 | columnize (0.3.6)
37 | debugger (1.6.6)
38 | columnize (>= 0.3.1)
39 | debugger-linecache (~> 1.2.0)
40 | debugger-ruby_core_source (~> 1.3.2)
41 | debugger-linecache (1.2.0)
42 | debugger-ruby_core_source (1.3.2)
43 | diff-lcs (1.2.5)
44 | echoe (4.6.6)
45 | allison (>= 2.0.3)
46 | rake (>= 0.9.2)
47 | rdoc (>= 2.5.11)
48 | rubyforge (>= 2.0.4)
49 | erubis (2.7.0)
50 | hike (1.2.3)
51 | i18n (0.6.9)
52 | json (1.8.1)
53 | json_pure (1.8.1)
54 | mail (2.4.4)
55 | i18n (>= 0.4.0)
56 | mime-types (~> 1.16)
57 | treetop (~> 1.4.8)
58 | mime-types (1.25.1)
59 | multi_json (1.10.1)
60 | polyglot (0.3.4)
61 | rack (1.3.10)
62 | rack-cache (1.2)
63 | rack (>= 0.4)
64 | rack-mount (0.8.3)
65 | rack (>= 1.0.0)
66 | rack-ssl (1.3.4)
67 | rack
68 | rack-test (0.6.2)
69 | rack (>= 1.0)
70 | rails (3.1.12)
71 | actionmailer (= 3.1.12)
72 | actionpack (= 3.1.12)
73 | activerecord (= 3.1.12)
74 | activeresource (= 3.1.12)
75 | activesupport (= 3.1.12)
76 | bundler (~> 1.0)
77 | railties (= 3.1.12)
78 | railties (3.1.12)
79 | actionpack (= 3.1.12)
80 | activesupport (= 3.1.12)
81 | rack-ssl (~> 1.3.2)
82 | rake (>= 0.8.7)
83 | rdoc (~> 3.4)
84 | thor (~> 0.14.6)
85 | rake (10.3.2)
86 | rdoc (3.12.2)
87 | json (~> 1.4)
88 | rspec (2.14.1)
89 | rspec-core (~> 2.14.0)
90 | rspec-expectations (~> 2.14.0)
91 | rspec-mocks (~> 2.14.0)
92 | rspec-core (2.14.8)
93 | rspec-expectations (2.14.5)
94 | diff-lcs (>= 1.1.3, < 2.0)
95 | rspec-mocks (2.14.6)
96 | rubyforge (2.0.4)
97 | json_pure (>= 1.1.7)
98 | sprockets (2.0.4)
99 | hike (~> 1.2)
100 | rack (~> 1.0)
101 | tilt (~> 1.1, != 1.3.0)
102 | thor (0.14.6)
103 | tilt (1.4.1)
104 | treetop (1.4.15)
105 | polyglot
106 | polyglot (>= 0.3.1)
107 | tzinfo (0.3.39)
108 |
109 | PLATFORMS
110 | ruby
111 |
112 | DEPENDENCIES
113 | debugger (~> 1.6)
114 | echoe
115 | rails (= 3.1.12)
116 | rspec (~> 2.13)
117 |
--------------------------------------------------------------------------------
/spec/pagem_spec.rb:
--------------------------------------------------------------------------------
1 | require File.dirname(__FILE__) + '/spec_helper'
2 | require File.expand_path("../../lib/pagem", __FILE__)
3 |
4 | describe Pagem do
5 | before(:each) do
6 | @scope = double("Scope")
7 | @scope.stub(:count).and_return(101)
8 | @scope.stub(:where => @scope, :limit => @scope, :offset => @scope)
9 | @pager = Pagem.new(@scope, {:page => 1})
10 | @pager.stub('medidata_icon_link').and_return('')
11 | end
12 |
13 | it "should default the page_variable to 'page'" do
14 | @pager.instance_eval { @page_variable }.should == :page
15 | end
16 |
17 | it "should properly set the page_variable" do
18 | @pager = Pagem.new(@scope, {:page => 1}, {:page_variable => :foo})
19 | @pager.instance_eval { @page_variable}.should == :foo
20 | end
21 |
22 | it "should return the original scope" do
23 | @pager.scope.should == @scope
24 | end
25 |
26 | describe "#paged_scope" do
27 | it "limits to items_per_page" do
28 | @scope.should_receive(:limit).with(@pager.items_per_page)
29 | @pager.paged_scope
30 | end
31 |
32 | it "applies an offset for the current page" do
33 | @scope.should_receive(:offset).with(0)
34 | @pager.paged_scope
35 | end
36 |
37 |
38 | it "returns the paged scope" do
39 | @scope.stub(:offset => @scope)
40 | @pager.paged_scope.should == @scope
41 | end
42 |
43 | it "builds the offset for the 2nd page" do
44 | @pager = Pagem.new(@scope, {:page => 2})
45 | @scope.should_receive(:offset).with(10)
46 | @pager.paged_scope
47 | end
48 |
49 | it "returns an empty array if there are no results" do
50 | @scope = double("Scope")
51 | @scope.stub(:count => 0, :where => [])
52 | @pager = Pagem.new(@scope, {:page => 1})
53 | @pager.paged_scope.should == []
54 | end
55 | end
56 |
57 | it "should return the default items per page" do
58 | @pager.items_per_page.should == 10
59 | end
60 |
61 | it "should return the proper items per page" do
62 | @pager = Pagem.new(@scope, {:page => 1}, {:items_per_page => 20})
63 | @pager.items_per_page.should == 20
64 | end
65 |
66 | it "should return the count" do
67 | @pager.count.should == 101
68 | end
69 |
70 | it "should return the total page count" do
71 | @pager.pages.should == 11
72 | end
73 |
74 | it "should return the current page" do
75 | @pager.current_page.should == 1
76 | end
77 |
78 | it "should return the first page if the page is less than 1" do
79 | @pager = Pagem.new(@scope, {:page => 0})
80 | @pager.current_page.should == 1
81 | end
82 |
83 | it "should return the first page if the page is invalid" do
84 | @pager = Pagem.new(@scope, {:page => 'a'})
85 | @pager.current_page.should == 1
86 | end
87 |
88 | it "should return the first page if the page is not given" do
89 | @pager = Pagem.new(@scope, {})
90 | @pager.current_page.should == 1
91 | end
92 |
93 | it "should return the last page if the page is greater than the total pages" do
94 | @pager = Pagem.new(@scope, {:page => 100})
95 | @pager.current_page.should == 11
96 | end
97 |
98 | it "should render" do
99 | @pager.render
100 | end
101 |
102 | it "should render empty if there are no pages" do
103 | @scope = double("Scope")
104 | @scope.stub(:count).and_return(0)
105 | @pager = Pagem.new(@scope, {:page => 1})
106 | @pager.render.should == ""
107 | end
108 |
109 | it "should render empty if there is one page" do
110 | @scope = double("Scope")
111 | @scope.stub(:count).and_return(10)
112 | @pager = Pagem.new(@scope, {:page => 1})
113 | @pager.render.should == ""
114 | end
115 |
116 | it "should render for remote forms (ajax) if given an is_remote option parameter" do
117 | @pager.render :is_remote => true
118 | end
119 |
120 | it "should convert to string" do
121 | @pager.to_s.should == @pager.render
122 | end
123 | end
124 |
125 |
126 |
--------------------------------------------------------------------------------
/spec/pagemmultiscope_spec.rb:
--------------------------------------------------------------------------------
1 | describe PagemMultiscope do
2 | let(:scope) { double('Scope') }
3 | let(:second_scope) { double('Scope') }
4 |
5 | it 'inherits from Pagem' do
6 | expect(PagemMultiscope).to be < Pagem
7 | end
8 |
9 | context "initialize" do
10 |
11 | before(:each) do
12 | scope.stub(where: scope, limit: scope, offset: scope)
13 | second_scope.stub(where: second_scope, limit: second_scope, offset: second_scope)
14 | end
15 |
16 | after(:each) do
17 | @multipager.instance_eval { @count }.should == 303
18 | @multipager.instance_eval { @first_scope_count }.should == 101
19 | @multipager.instance_eval { @second_scope_count }.should == 202
20 | end
21 |
22 | it 'gets the sizes of the scopes if they are not passed in' do
23 | scope.should_receive(:count).and_return(101)
24 | scope.stub(:size).and_return(101)
25 | second_scope.stub(:size).and_return(202)
26 | @multipager = PagemMultiscope.new(scope, second_scope, { page: 1 })
27 | end
28 |
29 | it 'assigns the scopes if they are passed in' do
30 | @multipager = PagemMultiscope.new(scope, second_scope, { page: 1 },
31 | {
32 | count_number: 303,
33 | first_scope_count: 101,
34 | second_scope_count: 202
35 | })
36 | end
37 |
38 | it 'calculates the scopes if count number is inaccurate' do
39 | scope.should_receive(:size).and_return(101)
40 | second_scope.should_receive(:size).and_return(202)
41 | @multipager = PagemMultiscope.new(scope, second_scope, { page: 1 },
42 | {
43 | count_number: 603,
44 | first_scope_count: 101,
45 | second_scope_count: 202
46 | })
47 | end
48 |
49 | it 'calculates the scopes if either or both scope counts are inaccurate' do
50 | scope.should_receive(:size).and_return(101)
51 | second_scope.should_receive(:size).and_return(202)
52 | @multipager = PagemMultiscope.new(scope, second_scope, { page: 1 },
53 | {
54 | count_number: 603,
55 | first_scope_count: 201,
56 | second_scope_count: 302
57 | })
58 | end
59 | end
60 |
61 | describe "#paged_scope" do
62 | before(:each) do
63 | scope.stub(:where => scope, :limit => scope, :offset => scope)
64 | second_scope.stub(:where => second_scope, :limit => second_scope, :offset => second_scope)
65 | end
66 |
67 | context 'current page > 0' do
68 | context 'end_offset <= first scope count' do
69 | it "returns only the first scope" do
70 | @multipager = PagemMultiscope.new(scope, second_scope, { page: 1 },
71 | {
72 | count_number: 303,
73 | first_scope_count: 101,
74 | second_scope_count: 202
75 | })
76 | scope.should_receive(:limit).with(@multipager.items_per_page)
77 | scope.should_receive(:offset)
78 | @multipager.paged_scope
79 | end
80 | end
81 |
82 | context 'start_offset +1 > first scope count' do
83 | it "returns only the first scope" do
84 | @multipager = PagemMultiscope.new(scope, second_scope, { page: 200 },
85 | {
86 | count_number: 303,
87 | first_scope_count: 101,
88 | second_scope_count: 202
89 | })
90 | second_scope.should_receive(:limit).with(@multipager.items_per_page)
91 | second_scope.should_receive(:offset)
92 | @multipager.paged_scope
93 | end
94 | end
95 |
96 | it "uses a combine method" do
97 | @multipager = PagemMultiscope.new(scope, second_scope, { page: 11 },
98 | {
99 | count_number: 303,
100 | first_scope_count: 101,
101 | second_scope_count: 202
102 | })
103 | scope.should_receive(:offset)
104 | second_scope.should_receive(:limit)
105 | combine_method = Proc.new{ }
106 | @multipager.paged_scope(&combine_method)
107 | end
108 | end
109 | end
110 | end
111 |
--------------------------------------------------------------------------------
/lib/pagem.rb:
--------------------------------------------------------------------------------
1 | class Pagem
2 | include ActionView::Helpers::TagHelper
3 | include ActionView::Helpers::AssetTagHelper
4 | include ActionView::Helpers::UrlHelper
5 | include ActionView::Helpers::FormTagHelper
6 |
7 | ITEMS_PER_PAGE = 10
8 |
9 | def initialize(scope, params, opt = {})
10 | @page_variable = opt[:page_variable] || :page
11 | @count = opt[:count_number] || scope.count
12 | @scope = scope
13 | @params = params
14 | @items_per_page = opt[:items_per_page] || ITEMS_PER_PAGE
15 | end
16 |
17 | def icon_link(icon, text, url, options = {})
18 | options = options.merge(
19 | class: "#{options[:class] if options[:class]} iconlink",
20 | style: "background-image:url(" + (options[:global_url] ? icon.to_s : "/images/medidata_buttons/#{icon}.gif") + ")",
21 | global_url: nil
22 | )
23 | link_to text, url, options
24 | end
25 |
26 | def scope
27 | @scope
28 | end
29 |
30 | # Returns a scope for the currently selected page, or an empty scope if current_page is not valid.
31 | def paged_scope
32 | (current_page > 0) ? scope.limit(items_per_page).offset((current_page - 1) * items_per_page) : scope.where('0=1')
33 | end
34 |
35 | def items_per_page
36 | @items_per_page
37 | end
38 |
39 | def count
40 | @count
41 | end
42 |
43 | def pages
44 | (count.to_f / items_per_page).ceil
45 | end
46 |
47 | def current_page
48 | page = (@params[@page_variable] || 1).to_i rescue 1
49 | page = page < 1 ? 1 : page > pages ? pages : page
50 | end
51 |
52 | def render(opt = {})
53 | @is_remote = opt[:is_remote] || false
54 | p = current_page
55 | tp = pages
56 |
57 | if(tp > 1)
58 | href = "##{@page_variable}"
59 |
60 | content_tag('div',
61 | (icon_link('/images/pagem/arrow_leftend.gif', I18n.t('application.pagination.first', :default => "First"), href, link_options(1, p > 1)) +
62 | icon_link('/images/pagem/arrow_left.gif', I18n.t('application.pagination.previous', :default => "Previous"), href, link_options(p - 1, p > 1)) +
63 | pager_section(p, tp) +
64 | icon_link('/images/pagem/arrow_right.gif', I18n.t('application.pagination.next', :default => "Next"), href, link_options(p + 1, p < tp, true)) +
65 | icon_link('/images/pagem/arrow_rightend.gif', I18n.t('application.pagination.last', :default => "Last"), href, link_options(tp, p < tp, true))) +
66 | hidden_field_tag(@page_variable, ""),
67 | {:class => 'pagination', :name => @page_variable})
68 | else
69 | ""
70 | end
71 | end
72 |
73 | def to_s
74 | render
75 | end
76 |
77 | private
78 | def link_options(page_number, enabled, right_side = false)
79 | if(enabled)
80 | options = {:onclick => onclick_script(page_number)}
81 | else
82 | options = {:class => 'disabled', :disabled => 'true'}
83 | end
84 | options[:class] = (options[:class] ? "iconlink_right #{options[:class]}" : "iconlink_right") if(right_side)
85 | options[:global_url] = true
86 | return options
87 | end
88 |
89 | def pager_section(page_number, total_pages)
90 | content_tag('span', text_field_tag(nil, page_number, :maxlength => '5', :style => "width:30px; margin:0;", :onkeypress => onkeypress_script) + " #{I18n.t('application.pagination.of', :default => "of")} #{total_pages} ", {:class => 'page_picker'})
91 | end
92 |
93 | def onclick_script(page_number)
94 | "Pager.setPage(this, '#{@page_variable}', #{page_number}, #{@is_remote});"
95 | end
96 |
97 | def onkeypress_script
98 | "if(event.keyCode == 13) Pager.setPage(this, '#{@page_variable}', this.value, #{@is_remote});"
99 | end
100 | end
101 |
102 | # PagemMultiscope class inherits from Pagem and allows pagination of 2 scopes, returning either the paginated
103 | # set of the first scope with limit and offset, the paginated set of the second scope with limit and offset,
104 | # or results of a combined scope proc combining both scopes if the page is rendering a combination
105 | # of both table records on the same page
106 | # TODO Move this back to the Pagem class and extend it to allow more than 2 scopes
107 | class PagemMultiscope < Pagem
108 | def initialize(first_scope, second_scope, params, opt = {})
109 | super(first_scope, params, opt)
110 | @first_scope, @second_scope = first_scope, second_scope
111 | @first_scope_count = opt[:first_scope_count] || first_scope.size
112 | @second_scope_count = opt[:second_scope_count] || second_scope.size
113 | if opt[:count_number].blank?
114 | # Add the scope counts together only if count is a number since if otherwise count should be provided
115 | # via the count_number optional arg in the inherited class
116 | @count = @first_scope_count + @second_scope_count if @count.is_a?(Integer)
117 | elsif @first_scope_count + @second_scope_count != @count
118 | # Get the scope sizes if they were not passed in as options
119 | @first_scope_count = first_scope.size
120 | @second_scope_count = second_scope.size
121 | @count = @first_scope_count + @second_scope_count
122 | end
123 | end
124 |
125 | # Return the paginated scope result of some combination of the 2 scopes using the current page and per page
126 | # as limit and offset, or empty scope
127 | def paged_scope(&combine_method)
128 | if current_page > 0
129 | start_offset = (current_page - 1) * items_per_page
130 | end_offset = current_page * items_per_page
131 | # If end offset of the current page is less than or equal to the first scope count, return only first scope results
132 | if end_offset <= @first_scope_count
133 | @first_scope.limit(items_per_page).offset(start_offset)
134 | # If starting offset of current page is greater than the first scope count,
135 | # return only second scope results
136 | elsif start_offset + 1 > @first_scope_count
137 | @second_scope.limit(items_per_page).offset(start_offset - @first_scope_count)
138 | # Otherwise return a combined scope of both scopes using the combined scope proc
139 | else
140 | # TODO Implement a better default behavior here if no combine_method instead of just raising
141 | raise ArgumentError, 'Multiscope paged scope call must have a method for combining scopes passed in args' unless combine_method
142 | first_scope = @first_scope.offset(start_offset)
143 | second_scope = @second_scope.limit(end_offset - @first_scope_count)
144 | combine_scopes = combine_method.call(first_scope, second_scope)
145 | end
146 | else
147 | @first_scope.where('0=1')
148 | end
149 | end
150 |
151 | # Return nil for inherited scope method because it's ambiguous for multiple scopes
152 | def scope
153 | nil
154 | end
155 | end
156 |
--------------------------------------------------------------------------------
/rails_root/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Ruby on Rails: Welcome aboard
5 |
174 |
187 |
188 |
189 |
190 |
203 |
204 |
205 |
209 |
210 |
214 |
215 |
216 |
Getting started
217 |
Here’s how to get rolling:
218 |
219 |
220 | -
221 |
Use rails generate to create your models and controllers
222 | To see all available options, run it without parameters.
223 |
224 |
225 | -
226 |
Set up a default route and remove public/index.html
227 | Routes are set up in config/routes.rb.
228 |
229 |
230 | -
231 |
Create your database
232 | Run rake db:create to create your database. If you're not using SQLite (the default), edit config/database.yml with your username and password.
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
--------------------------------------------------------------------------------
/rails_root/README:
--------------------------------------------------------------------------------
1 | == Welcome to Rails
2 |
3 | Rails is a web-application framework that includes everything needed to create
4 | database-backed web applications according to the Model-View-Control pattern.
5 |
6 | This pattern splits the view (also called the presentation) into "dumb"
7 | templates that are primarily responsible for inserting pre-built data in between
8 | HTML tags. The model contains the "smart" domain objects (such as Account,
9 | Product, Person, Post) that holds all the business logic and knows how to
10 | persist themselves to a database. The controller handles the incoming requests
11 | (such as Save New Account, Update Product, Show Post) by manipulating the model
12 | and directing data to the view.
13 |
14 | In Rails, the model is handled by what's called an object-relational mapping
15 | layer entitled Active Record. This layer allows you to present the data from
16 | database rows as objects and embellish these data objects with business logic
17 | methods. You can read more about Active Record in
18 | link:files/vendor/rails/activerecord/README.html.
19 |
20 | The controller and view are handled by the Action Pack, which handles both
21 | layers by its two parts: Action View and Action Controller. These two layers
22 | are bundled in a single package due to their heavy interdependence. This is
23 | unlike the relationship between the Active Record and Action Pack that is much
24 | more separate. Each of these packages can be used independently outside of
25 | Rails. You can read more about Action Pack in
26 | link:files/vendor/rails/actionpack/README.html.
27 |
28 |
29 | == Getting Started
30 |
31 | 1. At the command prompt, create a new Rails application:
32 | rails new myapp (where myapp is the application name)
33 |
34 | 2. Change directory to myapp and start the web server:
35 | cd myapp; rails server (run with --help for options)
36 |
37 | 3. Go to http://localhost:3000/ and you'll see:
38 | "Welcome aboard: You're riding Ruby on Rails!"
39 |
40 | 4. Follow the guidelines to start developing your application. You can find
41 | the following resources handy:
42 |
43 | * The Getting Started Guide: http://guides.rubyonrails.org/getting_started.html
44 | * Ruby on Rails Tutorial Book: http://www.railstutorial.org/
45 |
46 |
47 | == Debugging Rails
48 |
49 | Sometimes your application goes wrong. Fortunately there are a lot of tools that
50 | will help you debug it and get it back on the rails.
51 |
52 | First area to check is the application log files. Have "tail -f" commands
53 | running on the server.log and development.log. Rails will automatically display
54 | debugging and runtime information to these files. Debugging info will also be
55 | shown in the browser on requests from 127.0.0.1.
56 |
57 | You can also log your own messages directly into the log file from your code
58 | using the Ruby logger class from inside your controllers. Example:
59 |
60 | class WeblogController < ActionController::Base
61 | def destroy
62 | @weblog = Weblog.find(params[:id])
63 | @weblog.destroy
64 | logger.info("#{Time.now} Destroyed Weblog ID ##{@weblog.id}!")
65 | end
66 | end
67 |
68 | The result will be a message in your log file along the lines of:
69 |
70 | Mon Oct 08 14:22:29 +1000 2007 Destroyed Weblog ID #1!
71 |
72 | More information on how to use the logger is at http://www.ruby-doc.org/core/
73 |
74 | Also, Ruby documentation can be found at http://www.ruby-lang.org/. There are
75 | several books available online as well:
76 |
77 | * Programming Ruby: http://www.ruby-doc.org/docs/ProgrammingRuby/ (Pickaxe)
78 | * Learn to Program: http://pine.fm/LearnToProgram/ (a beginners guide)
79 |
80 | These two books will bring you up to speed on the Ruby language and also on
81 | programming in general.
82 |
83 |
84 | == Debugger
85 |
86 | Debugger support is available through the debugger command when you start your
87 | Mongrel or WEBrick server with --debugger. This means that you can break out of
88 | execution at any point in the code, investigate and change the model, and then,
89 | resume execution! You need to install ruby-debug to run the server in debugging
90 | mode. With gems, use sudo gem install ruby-debug. Example:
91 |
92 | class WeblogController < ActionController::Base
93 | def index
94 | @posts = Post.all
95 | debugger
96 | end
97 | end
98 |
99 | So the controller will accept the action, run the first line, then present you
100 | with a IRB prompt in the server window. Here you can do things like:
101 |
102 | >> @posts.inspect
103 | => "[#nil, "body"=>nil, "id"=>"1"}>,
105 | #"Rails", "body"=>"Only ten..", "id"=>"2"}>]"
107 | >> @posts.first.title = "hello from a debugger"
108 | => "hello from a debugger"
109 |
110 | ...and even better, you can examine how your runtime objects actually work:
111 |
112 | >> f = @posts.first
113 | => #nil, "body"=>nil, "id"=>"1"}>
114 | >> f.
115 | Display all 152 possibilities? (y or n)
116 |
117 | Finally, when you're ready to resume execution, you can enter "cont".
118 |
119 |
120 | == Console
121 |
122 | The console is a Ruby shell, which allows you to interact with your
123 | application's domain model. Here you'll have all parts of the application
124 | configured, just like it is when the application is running. You can inspect
125 | domain models, change values, and save to the database. Starting the script
126 | without arguments will launch it in the development environment.
127 |
128 | To start the console, run rails console from the application
129 | directory.
130 |
131 | Options:
132 |
133 | * Passing the -s, --sandbox argument will rollback any modifications
134 | made to the database.
135 | * Passing an environment name as an argument will load the corresponding
136 | environment. Example: rails console production.
137 |
138 | To reload your controllers and models after launching the console run
139 | reload!
140 |
141 | More information about irb can be found at:
142 | link:http://www.rubycentral.org/pickaxe/irb.html
143 |
144 |
145 | == dbconsole
146 |
147 | You can go to the command line of your database directly through rails
148 | dbconsole. You would be connected to the database with the credentials
149 | defined in database.yml. Starting the script without arguments will connect you
150 | to the development database. Passing an argument will connect you to a different
151 | database, like rails dbconsole production. Currently works for MySQL,
152 | PostgreSQL and SQLite 3.
153 |
154 | == Description of Contents
155 |
156 | The default directory structure of a generated Ruby on Rails application:
157 |
158 | |-- app
159 | | |-- assets
160 | | |-- images
161 | | |-- javascripts
162 | | `-- stylesheets
163 | | |-- controllers
164 | | |-- helpers
165 | | |-- mailers
166 | | |-- models
167 | | `-- views
168 | | `-- layouts
169 | |-- config
170 | | |-- environments
171 | | |-- initializers
172 | | `-- locales
173 | |-- db
174 | |-- doc
175 | |-- lib
176 | | `-- tasks
177 | |-- log
178 | |-- public
179 | |-- script
180 | |-- test
181 | | |-- fixtures
182 | | |-- functional
183 | | |-- integration
184 | | |-- performance
185 | | `-- unit
186 | |-- tmp
187 | | |-- cache
188 | | |-- pids
189 | | |-- sessions
190 | | `-- sockets
191 | `-- vendor
192 | |-- assets
193 | `-- stylesheets
194 | `-- plugins
195 |
196 | app
197 | Holds all the code that's specific to this particular application.
198 |
199 | app/assets
200 | Contains subdirectories for images, stylesheets, and JavaScript files.
201 |
202 | app/controllers
203 | Holds controllers that should be named like weblogs_controller.rb for
204 | automated URL mapping. All controllers should descend from
205 | ApplicationController which itself descends from ActionController::Base.
206 |
207 | app/models
208 | Holds models that should be named like post.rb. Models descend from
209 | ActiveRecord::Base by default.
210 |
211 | app/views
212 | Holds the template files for the view that should be named like
213 | weblogs/index.html.erb for the WeblogsController#index action. All views use
214 | eRuby syntax by default.
215 |
216 | app/views/layouts
217 | Holds the template files for layouts to be used with views. This models the
218 | common header/footer method of wrapping views. In your views, define a layout
219 | using the layout :default and create a file named default.html.erb.
220 | Inside default.html.erb, call <% yield %> to render the view using this
221 | layout.
222 |
223 | app/helpers
224 | Holds view helpers that should be named like weblogs_helper.rb. These are
225 | generated for you automatically when using generators for controllers.
226 | Helpers can be used to wrap functionality for your views into methods.
227 |
228 | config
229 | Configuration files for the Rails environment, the routing map, the database,
230 | and other dependencies.
231 |
232 | db
233 | Contains the database schema in schema.rb. db/migrate contains all the
234 | sequence of Migrations for your schema.
235 |
236 | doc
237 | This directory is where your application documentation will be stored when
238 | generated using rake doc:app
239 |
240 | lib
241 | Application specific libraries. Basically, any kind of custom code that
242 | doesn't belong under controllers, models, or helpers. This directory is in
243 | the load path.
244 |
245 | public
246 | The directory available for the web server. Also contains the dispatchers and the
247 | default HTML files. This should be set as the DOCUMENT_ROOT of your web
248 | server.
249 |
250 | script
251 | Helper scripts for automation and generation.
252 |
253 | test
254 | Unit and functional tests along with fixtures. When using the rails generate
255 | command, template test files will be generated for you and placed in this
256 | directory.
257 |
258 | vendor
259 | External libraries that the application depends on. Also includes the plugins
260 | subdirectory. If the app has frozen rails, those gems also go here, under
261 | vendor/rails/. This directory is in the load path.
262 |
--------------------------------------------------------------------------------