From 756aade11a0016167695c063ea35ac51c9c0529f Mon Sep 17 00:00:00 2001 From: Robbie Wain Date: Thu, 7 Apr 2016 22:51:33 -0700 Subject: [PATCH] Move the OffsetPaginator and the PagedPaginator into the JSONAPI namespace --- lib/jsonapi/paginator.rb | 268 +++++++++--------- test/unit/pagination/offset_paginator_test.rb | 26 +- test/unit/pagination/paged_paginator_test.rb | 26 +- 3 files changed, 160 insertions(+), 160 deletions(-) diff --git a/lib/jsonapi/paginator.rb b/lib/jsonapi/paginator.rb index e21f97f2e..59b652977 100644 --- a/lib/jsonapi/paginator.rb +++ b/lib/jsonapi/paginator.rb @@ -21,185 +21,185 @@ def requires_record_count end def paginator_for(paginator) - paginator_class_name = "#{paginator.to_s.camelize}Paginator" + paginator_class_name = "JSONAPI::#{paginator.to_s.camelize}Paginator" paginator_class_name.safe_constantize if paginator_class_name end end end -end - -class OffsetPaginator < JSONAPI::Paginator - attr_reader :limit, :offset - - def initialize(params) - parse_pagination_params(params) - verify_pagination_params - end - - def self.requires_record_count - true - end - - def apply(relation, _order_options) - relation.offset(@offset).limit(@limit) - end - - def links_page_params(options = {}) - record_count = options[:record_count] - links_page_params = {} - links_page_params['first'] = { - 'offset' => 0, - 'limit' => @limit - } + class OffsetPaginator < JSONAPI::Paginator + attr_reader :limit, :offset - if @offset > 0 - previous_offset = @offset - @limit + def initialize(params) + parse_pagination_params(params) + verify_pagination_params + end - previous_offset = 0 if previous_offset < 0 + def self.requires_record_count + true + end - links_page_params['prev'] = { - 'offset' => previous_offset, - 'limit' => @limit - } + def apply(relation, _order_options) + relation.offset(@offset).limit(@limit) end - next_offset = @offset + @limit + def links_page_params(options = {}) + record_count = options[:record_count] + links_page_params = {} - unless next_offset >= record_count - links_page_params['next'] = { - 'offset' => next_offset, + links_page_params['first'] = { + 'offset' => 0, 'limit' => @limit } - end - if record_count - last_offset = record_count - @limit + if @offset > 0 + previous_offset = @offset - @limit - last_offset = 0 if last_offset < 0 + previous_offset = 0 if previous_offset < 0 - links_page_params['last'] = { - 'offset' => last_offset, - 'limit' => @limit - } - end + links_page_params['prev'] = { + 'offset' => previous_offset, + 'limit' => @limit + } + end - links_page_params - end + next_offset = @offset + @limit - private + unless next_offset >= record_count + links_page_params['next'] = { + 'offset' => next_offset, + 'limit' => @limit + } + end - def parse_pagination_params(params) - if params.nil? - @offset = 0 - @limit = JSONAPI.configuration.default_page_size - elsif params.is_a?(ActionController::Parameters) - validparams = params.permit(:offset, :limit) + if record_count + last_offset = record_count - @limit - @offset = validparams[:offset] ? validparams[:offset].to_i : 0 - @limit = validparams[:limit] ? validparams[:limit].to_i : JSONAPI.configuration.default_page_size - else - fail JSONAPI::Exceptions::InvalidPageObject.new - end - rescue ActionController::UnpermittedParameters => e - raise JSONAPI::Exceptions::PageParametersNotAllowed.new(e.params) - end + last_offset = 0 if last_offset < 0 - def verify_pagination_params - if @limit < 1 - fail JSONAPI::Exceptions::InvalidPageValue.new(:limit, @limit) - elsif @limit > JSONAPI.configuration.maximum_page_size - fail JSONAPI::Exceptions::InvalidPageValue.new(:limit, @limit, - "Limit exceeds maximum page size of #{JSONAPI.configuration.maximum_page_size}.") - end + links_page_params['last'] = { + 'offset' => last_offset, + 'limit' => @limit + } + end - if @offset < 0 - fail JSONAPI::Exceptions::InvalidPageValue.new(:offset, @offset) + links_page_params end - end -end -class PagedPaginator < JSONAPI::Paginator - attr_reader :size, :number + private - def initialize(params) - parse_pagination_params(params) - verify_pagination_params - end + def parse_pagination_params(params) + if params.nil? + @offset = 0 + @limit = JSONAPI.configuration.default_page_size + elsif params.is_a?(ActionController::Parameters) + validparams = params.permit(:offset, :limit) - def self.requires_record_count - true - end + @offset = validparams[:offset] ? validparams[:offset].to_i : 0 + @limit = validparams[:limit] ? validparams[:limit].to_i : JSONAPI.configuration.default_page_size + else + fail JSONAPI::Exceptions::InvalidPageObject.new + end + rescue ActionController::UnpermittedParameters => e + raise JSONAPI::Exceptions::PageParametersNotAllowed.new(e.params) + end - def apply(relation, _order_options) - offset = (@number - 1) * @size - relation.offset(offset).limit(@size) - end + def verify_pagination_params + if @limit < 1 + fail JSONAPI::Exceptions::InvalidPageValue.new(:limit, @limit) + elsif @limit > JSONAPI.configuration.maximum_page_size + fail JSONAPI::Exceptions::InvalidPageValue.new(:limit, @limit, + "Limit exceeds maximum page size of #{JSONAPI.configuration.maximum_page_size}.") + end - def links_page_params(options = {}) - record_count = options[:record_count] - page_count = (record_count / @size.to_f).ceil + if @offset < 0 + fail JSONAPI::Exceptions::InvalidPageValue.new(:offset, @offset) + end + end + end - links_page_params = {} + class PagedPaginator < JSONAPI::Paginator + attr_reader :size, :number - links_page_params['first'] = { - 'number' => 1, - 'size' => @size - } + def initialize(params) + parse_pagination_params(params) + verify_pagination_params + end - if @number > 1 - links_page_params['prev'] = { - 'number' => @number - 1, - 'size' => @size - } + def self.requires_record_count + true end - unless @number >= page_count - links_page_params['next'] = { - 'number' => @number + 1, - 'size' => @size - } + def apply(relation, _order_options) + offset = (@number - 1) * @size + relation.offset(offset).limit(@size) end - if record_count - links_page_params['last'] = { - 'number' => page_count == 0 ? 1 : page_count, + def links_page_params(options = {}) + record_count = options[:record_count] + page_count = (record_count / @size.to_f).ceil + + links_page_params = {} + + links_page_params['first'] = { + 'number' => 1, 'size' => @size } - end - links_page_params - end + if @number > 1 + links_page_params['prev'] = { + 'number' => @number - 1, + 'size' => @size + } + end - private + unless @number >= page_count + links_page_params['next'] = { + 'number' => @number + 1, + 'size' => @size + } + end - def parse_pagination_params(params) - if params.nil? - @number = 1 - @size = JSONAPI.configuration.default_page_size - elsif params.is_a?(ActionController::Parameters) - validparams = params.permit(:number, :size) + if record_count + links_page_params['last'] = { + 'number' => page_count == 0 ? 1 : page_count, + 'size' => @size + } + end - @size = validparams[:size] ? validparams[:size].to_i : JSONAPI.configuration.default_page_size - @number = validparams[:number] ? validparams[:number].to_i : 1 - else - @size = JSONAPI.configuration.default_page_size - @number = params.to_i + links_page_params end - rescue ActionController::UnpermittedParameters => e - raise JSONAPI::Exceptions::PageParametersNotAllowed.new(e.params) - end - def verify_pagination_params - if @size < 1 - fail JSONAPI::Exceptions::InvalidPageValue.new(:size, @size) - elsif @size > JSONAPI.configuration.maximum_page_size - fail JSONAPI::Exceptions::InvalidPageValue.new(:size, @size, - "size exceeds maximum page size of #{JSONAPI.configuration.maximum_page_size}.") + private + + def parse_pagination_params(params) + if params.nil? + @number = 1 + @size = JSONAPI.configuration.default_page_size + elsif params.is_a?(ActionController::Parameters) + validparams = params.permit(:number, :size) + + @size = validparams[:size] ? validparams[:size].to_i : JSONAPI.configuration.default_page_size + @number = validparams[:number] ? validparams[:number].to_i : 1 + else + @size = JSONAPI.configuration.default_page_size + @number = params.to_i + end + rescue ActionController::UnpermittedParameters => e + raise JSONAPI::Exceptions::PageParametersNotAllowed.new(e.params) end - if @number < 1 - fail JSONAPI::Exceptions::InvalidPageValue.new(:number, @number) + def verify_pagination_params + if @size < 1 + fail JSONAPI::Exceptions::InvalidPageValue.new(:size, @size) + elsif @size > JSONAPI.configuration.maximum_page_size + fail JSONAPI::Exceptions::InvalidPageValue.new(:size, @size, + "size exceeds maximum page size of #{JSONAPI.configuration.maximum_page_size}.") + end + + if @number < 1 + fail JSONAPI::Exceptions::InvalidPageValue.new(:number, @number) + end end end end diff --git a/test/unit/pagination/offset_paginator_test.rb b/test/unit/pagination/offset_paginator_test.rb index f072e49b3..512289fb3 100644 --- a/test/unit/pagination/offset_paginator_test.rb +++ b/test/unit/pagination/offset_paginator_test.rb @@ -9,7 +9,7 @@ def test_offset_default_page_params } ) - paginator = OffsetPaginator.new(params) + paginator = JSONAPI::OffsetPaginator.new(params) assert_equal JSONAPI.configuration.default_page_size, paginator.limit assert_equal 0, paginator.offset @@ -22,7 +22,7 @@ def test_offset_parse_page_params_default_offset } ) - paginator = OffsetPaginator.new(params) + paginator = JSONAPI::OffsetPaginator.new(params) assert_equal 20, paginator.limit assert_equal 0, paginator.offset @@ -36,7 +36,7 @@ def test_offset_parse_page_params } ) - paginator = OffsetPaginator.new(params) + paginator = JSONAPI::OffsetPaginator.new(params) assert_equal 5, paginator.limit assert_equal 7, paginator.offset @@ -51,7 +51,7 @@ def test_offset_parse_page_params_limit_too_large ) assert_raises JSONAPI::Exceptions::InvalidPageValue do - OffsetPaginator.new(params) + JSONAPI::OffsetPaginator.new(params) end end @@ -64,7 +64,7 @@ def test_offset_parse_page_params_not_allowed ) assert_raises JSONAPI::Exceptions::PageParametersNotAllowed do - OffsetPaginator.new(params) + JSONAPI::OffsetPaginator.new(params) end end @@ -76,7 +76,7 @@ def test_offset_parse_page_params_start } ) - paginator = OffsetPaginator.new(params) + paginator = JSONAPI::OffsetPaginator.new(params) assert_equal 5, paginator.limit assert_equal 0, paginator.offset @@ -90,7 +90,7 @@ def test_offset_links_page_params_empty_results } ) - paginator = OffsetPaginator.new(params) + paginator = JSONAPI::OffsetPaginator.new(params) links_params = paginator.links_page_params(record_count: 0) assert_equal 2, links_params.size @@ -110,7 +110,7 @@ def test_offset_links_page_params_small_resultsets } ) - paginator = OffsetPaginator.new(params) + paginator = JSONAPI::OffsetPaginator.new(params) links_params = paginator.links_page_params(record_count: 3) assert_equal 2, links_params.size @@ -130,7 +130,7 @@ def test_offset_links_page_params_large_data_set_start } ) - paginator = OffsetPaginator.new(params) + paginator = JSONAPI::OffsetPaginator.new(params) links_params = paginator.links_page_params(record_count: 50) assert_equal 3, links_params.size @@ -153,7 +153,7 @@ def test_offset_links_page_params_large_data_set_before_start } ) - paginator = OffsetPaginator.new(params) + paginator = JSONAPI::OffsetPaginator.new(params) links_params = paginator.links_page_params(record_count: 50) assert_equal 4, links_params.size @@ -179,7 +179,7 @@ def test_offset_links_page_params_large_data_set_middle } ) - paginator = OffsetPaginator.new(params) + paginator = JSONAPI::OffsetPaginator.new(params) links_params = paginator.links_page_params(record_count: 50) assert_equal 4, links_params.size @@ -205,7 +205,7 @@ def test_offset_links_page_params_large_data_set_end } ) - paginator = OffsetPaginator.new(params) + paginator = JSONAPI::OffsetPaginator.new(params) links_params = paginator.links_page_params(record_count: 50) assert_equal 3, links_params.size @@ -228,7 +228,7 @@ def test_offset_links_page_params_large_data_set_past_end } ) - paginator = OffsetPaginator.new(params) + paginator = JSONAPI::OffsetPaginator.new(params) links_params = paginator.links_page_params(record_count: 50) assert_equal 3, links_params.size diff --git a/test/unit/pagination/paged_paginator_test.rb b/test/unit/pagination/paged_paginator_test.rb index 3abcdac04..84df5b644 100644 --- a/test/unit/pagination/paged_paginator_test.rb +++ b/test/unit/pagination/paged_paginator_test.rb @@ -9,7 +9,7 @@ def test_paged_default_page_params } ) - paginator = PagedPaginator.new(params) + paginator = JSONAPI::PagedPaginator.new(params) assert_equal JSONAPI.configuration.default_page_size, paginator.size assert_equal 1, paginator.number @@ -22,7 +22,7 @@ def test_paged_parse_page_params_default_page } ) - paginator = PagedPaginator.new(params) + paginator = JSONAPI::PagedPaginator.new(params) assert_equal 20, paginator.size assert_equal 1, paginator.number @@ -36,7 +36,7 @@ def test_paged_parse_page_params } ) - paginator = PagedPaginator.new(params) + paginator = JSONAPI::PagedPaginator.new(params) assert_equal 5, paginator.size assert_equal 7, paginator.number @@ -51,7 +51,7 @@ def test_paged_parse_page_params_size_too_large ) assert_raises JSONAPI::Exceptions::InvalidPageValue do - PagedPaginator.new(params) + JSONAPI::PagedPaginator.new(params) end end @@ -64,7 +64,7 @@ def test_paged_parse_page_params_not_allowed ) assert_raises JSONAPI::Exceptions::PageParametersNotAllowed do - PagedPaginator.new(params) + JSONAPI::PagedPaginator.new(params) end end @@ -76,7 +76,7 @@ def test_paged_parse_page_params_start } ) - paginator = PagedPaginator.new(params) + paginator = JSONAPI::PagedPaginator.new(params) assert_equal 5, paginator.size assert_equal 1, paginator.number @@ -90,7 +90,7 @@ def test_paged_links_page_params_empty_results } ) - paginator = PagedPaginator.new(params) + paginator = JSONAPI::PagedPaginator.new(params) links_params = paginator.links_page_params(record_count: 0) assert_equal 2, links_params.size @@ -110,7 +110,7 @@ def test_paged_links_page_params_small_resultsets } ) - paginator = PagedPaginator.new(params) + paginator = JSONAPI::PagedPaginator.new(params) links_params = paginator.links_page_params(record_count: 3) assert_equal 2, links_params.size @@ -130,7 +130,7 @@ def test_paged_links_page_params_large_data_set_start_full_pages } ) - paginator = PagedPaginator.new(params) + paginator = JSONAPI::PagedPaginator.new(params) links_params = paginator.links_page_params(record_count: 50) assert_equal 3, links_params.size @@ -153,7 +153,7 @@ def test_paged_links_page_params_large_data_set_start_partial_last } ) - paginator = PagedPaginator.new(params) + paginator = JSONAPI::PagedPaginator.new(params) links_params = paginator.links_page_params(record_count: 51) assert_equal 3, links_params.size @@ -176,7 +176,7 @@ def test_paged_links_page_params_large_data_set_middle } ) - paginator = PagedPaginator.new(params) + paginator = JSONAPI::PagedPaginator.new(params) links_params = paginator.links_page_params(record_count: 50) assert_equal 4, links_params.size @@ -202,7 +202,7 @@ def test_paged_links_page_params_large_data_set_end } ) - paginator = PagedPaginator.new(params) + paginator = JSONAPI::PagedPaginator.new(params) links_params = paginator.links_page_params(record_count: 50) assert_equal 3, links_params.size @@ -225,7 +225,7 @@ def test_paged_links_page_params_large_data_set_past_end } ) - paginator = PagedPaginator.new(params) + paginator = JSONAPI::PagedPaginator.new(params) links_params = paginator.links_page_params(record_count: 50) assert_equal 3, links_params.size