queryko 1.2.1.beta2 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e4cc16bfe7fdeda3c044386b045f40c265b94ad50d314ec2b2ccdc8d475ba31a
4
- data.tar.gz: 583c6bc540793947a739f57eaeb7c8a748d9263dc76967925bc8b85c0401fbbe
3
+ metadata.gz: 2a59be1cc920578cfddb7246f18fe1435ed9ef7517610bf3ec2f41fe0c5a5556
4
+ data.tar.gz: 14adefec70cd53df2224961010a3118dd5703aa6d094c150ae54622718d81f6d
5
5
  SHA512:
6
- metadata.gz: 5a894d289e142ca9748a330a625750840bc417eb16ce92e92e583d2b1a24c390a8b6f9388dadabc067c99f7cff70185a4a8b2e6b92609ae33b622d63e0d3156b
7
- data.tar.gz: e07d2ca540665d7695f5aae81e0809388531fe8ac80b05462e4f7391d76c7ba268f2c60f35fd7080b4e2e831fdcef883253eef2dd40cbc065556fa0d055baa3d
6
+ metadata.gz: ad6636ad9562467fd758633f97972a885c377b405038f03ed95e9d263e3285ae68dfd07687c22357d2b477187537837a476c9dc0ca303b16e50cef6f53ffff7c
7
+ data.tar.gz: fa822897bea178f2a853b18e86afb0266c5427b97894895aa926ac1e61fe97b8bac025bf34a08902403e7e9a5c2850c375a59833f2ebb9a7bfdba07534c98474
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- queryko (1.2.1.beta)
4
+ queryko (1.2.2)
5
5
  activerecord (>= 4.0)
6
6
  activesupport (>= 4.0)
7
7
 
data/README.md CHANGED
@@ -3,6 +3,7 @@
3
3
  This gem provides additional functionality on your query objects. It will filter and paginate your query by supplying arguments directly from controller params
4
4
 
5
5
  ## Installation
6
+
6
7
  ```ruby
7
8
  # Pagination
8
9
  gem 'kaminari'
@@ -22,33 +23,38 @@ Or install it yourself as:
22
23
  $ gem install queryko
23
24
 
24
25
  ## Usage
26
+
25
27
  ### Create a query object
28
+
26
29
  ``` ruby
27
30
  class ProductsQuery < Queryko::QueryObject
28
- add_range_attributes :created_at, :price
29
- add_searchables :name, :vendor
30
-
31
- table_name 'my_products' # optional
32
-
33
- def initialize params={}, relation = Product.all
34
- super(params, relation)
35
- end
31
+ feature :created_at, :min
32
+ feature :created_at, :max
33
+ feature :price, :min
34
+ feature :price, :max
35
+ feature :name, :search, as: :name
36
+ feature :vendor, :search, as: :vendor
36
37
  end
37
38
  ```
38
39
 
39
40
  ### Using your query object
40
- Filter your query by appending `_min` or `_max` on your defined attributes. You can also filter searc3h by attribute.
41
- As long as you defined it in your query object definition.
41
+ Filter your query by appending `_min` or `_max` on your defined attributes. You can also filter results by attribute with your defined feature.
42
+
42
43
  ``` ruby
43
44
  # Collection
44
45
  products = ProductsQuery.new(price_min: 100, price_max: 150, name: 'Milk').call
45
46
  products = ProductsQuery.new(since_id: 26).call
46
47
 
47
- # Count
48
+ # Count - Counts items on current page. Default page is 1
48
49
  products = ProductsQuery.new(created_at_min: 'Jan 1, 2019').count
49
50
  products = ProductsQuery.new(name: 'Bag').count
51
+
52
+ # Total Count - Counts all items matching defined conditions
53
+ products = ProductsQuery.new(created_at_min: 'Jan 1, 2019').total_count
54
+ products = ProductsQuery.new(name: 'Bag').total_count
50
55
  ```
51
56
 
57
+
52
58
  #### Object Methods
53
59
  - **count** - Returns the filtered count including pagination filter or the size of return object.
54
60
  - **total_count** - Returns the overall count of the filtered total records.
@@ -62,19 +68,71 @@ query = ProductsQuery.new(page: 5, limit: 5)
62
68
  query.count # 1
63
69
  query.total_count # 21
64
70
  ```
71
+ ### Pagination
72
+ Override these methods to customize pagination limits
73
+
74
+ ``` ruby
75
+ ...
76
+
77
+ def upper_limit
78
+ 20 # default is 100
79
+ end
80
+
81
+ def lower_limit
82
+ 5 # default is 10
83
+ end
84
+
85
+ def default_limit
86
+ 10 # default is 50
87
+ end
88
+
89
+ ...
90
+ ```
91
+
92
+ ### Custom Filters
93
+ Create a custom filter class using `Queryko::Filters::Base`
94
+
95
+ ``` ruby
96
+ class CustomFilters::CoolSearch < Queryko::Filters::Base
97
+
98
+ # Optional.
99
+ # Some `options` keys are reserved for basic functionality
100
+ # Use `options` to get data from feature definition
101
+ def intialize(options = {}, feature)
102
+ super options, feature
103
+ end
104
+
105
+ # Required. This method is called by query object. Always return the result of
106
+ # the collection
107
+ def perform(collection, token)
108
+ collection.where("#{table_name}.#{column_name} < ?", "Cool-#{token}")
109
+ end
110
+ end
111
+ ```
112
+
113
+ Then add the filter class to your Queryko::Base object
114
+ ``` ruby
115
+ class QueryObject < Queryko::Base
116
+ filter_class :cool_search, CustomFilters::CoolSearch
117
+ # or
118
+ filter_class :cool_search, "CustomFilters::CoolSearch"
119
+
120
+
121
+ feature :name, :cool_search
122
+ # the :name will be scoped using params[:name_cool_search]
123
+ end
124
+ ```
65
125
 
66
126
  ### Other available options
67
127
  | Option | description |
68
128
  |:---------|:-----------------------------|
69
129
  | since_id | retrieves records after `id` |
70
130
  | page | page to retrieve |
71
- | limit | number of records per page |
72
131
 
73
132
  ## Contributing
74
133
 
75
134
  Bug reports and pull requests are welcome on GitHub at https://github.com/neume/queryko. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
76
135
 
77
-
78
136
  ## License
79
137
 
80
138
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/lib/queryko/able.rb CHANGED
@@ -3,10 +3,10 @@ module Queryko
3
3
  def self.included(base)
4
4
  base.extend(ClassMethods)
5
5
  base.class_eval do
6
- class_attribute :filters, default: {}, instance_writer: false
6
+ class_attribute :defined_filters, default: {}, instance_writer: false
7
7
  class_attribute :features, default: {}, instance_writer: false
8
8
  class_attribute :fields, default: {}, instance_writer: false
9
- self.filters = {}
9
+ self.defined_filters = {}
10
10
  self.features = {}
11
11
  self.fields = {}
12
12
 
@@ -18,11 +18,11 @@ module Queryko
18
18
  def feature(feature_name, filter, options = {})
19
19
  # returns the feature if it exists
20
20
  feat = self.features[feature_name.to_sym] ||= Queryko::Feature.new feature_name, self
21
- self.filters[filter] ||= Array.new
21
+ self.defined_filters[filter] ||= Array.new
22
22
 
23
23
  # creates a filter
24
- filt = feat.create_filter filter, options
25
- self.filters[filter].push(filt)
24
+ filt = feat.add_filter filter, options
25
+ self.defined_filters[filter].push(filt)
26
26
 
27
27
  # appends new field
28
28
  self.fields[filt.field.to_sym] ||= Array.new
@@ -0,0 +1,127 @@
1
+ require "active_support/core_ext/class/attribute"
2
+ require "queryko/range_attributes"
3
+ require "queryko/searchables"
4
+ require "queryko/after_attributes"
5
+ require "queryko/naming"
6
+ require "queryko/able"
7
+ require "queryko/filterer"
8
+ require "queryko/filter_classes"
9
+
10
+ module Queryko
11
+ class Base
12
+ attr_reader :countable_resource
13
+ include Queryko::FilterClasses
14
+ include Queryko::Naming
15
+ include Queryko::RangeAttributes
16
+ include Queryko::Searchables
17
+ include Queryko::Able
18
+ include Queryko::Filterer
19
+ # include AfterAttributes
20
+
21
+ def self.inherited(subclass)
22
+ # It should not be executed when using anonymous class
23
+ subclass.table_name inferred_from_class_name(subclass) if subclass.name
24
+ end
25
+
26
+ def initialize(params = {}, rel)
27
+ @relation = @original_relation = rel || inferred_model.all
28
+ @params = params
29
+ end
30
+
31
+ def call
32
+ perform
33
+ self.relation = paginate if config[:paginate]
34
+ return relation
35
+ end
36
+
37
+ def perform
38
+ return if @performed
39
+
40
+ @performed = true
41
+ pre_filter
42
+ filter
43
+ filter_by_filters
44
+ @countable_resource = relation
45
+ end
46
+
47
+
48
+ def total_count
49
+ perform
50
+ countable_resource.count
51
+ end
52
+
53
+ def count
54
+ call.to_a.count
55
+ end
56
+
57
+ private
58
+
59
+ attr_reader :params, :relation
60
+ attr_writer :relation
61
+
62
+ def config
63
+ @config ||= {
64
+ paginate: true,
65
+ since_id: true,
66
+ ids: true
67
+ }
68
+ end
69
+
70
+ def pre_filter
71
+ self.relation = by_ids if config[:ids] && params[:ids]
72
+ self.relation = since_id if config[:since_id] && params[:since_id]
73
+ end
74
+
75
+ def filter
76
+ end
77
+
78
+ def paginate
79
+ if defined?(WillPaginate)
80
+ relation.paginate(page: page, per_page: limit)
81
+ elsif defined?(Kaminari)
82
+ relation.page(page).per(limit)
83
+ else
84
+ raise 'Only kaminari and wil_paginate are supported'
85
+ end
86
+ end
87
+
88
+ def page
89
+ params[:page] || 1
90
+ end
91
+
92
+ def limit
93
+ @limit ||= get_limit
94
+ end
95
+
96
+ def get_limit
97
+ lim = (params[:limit] || default_limit).to_i
98
+ if lower_limit > lim
99
+ lower_limit
100
+ elsif lim > upper_limit
101
+ upper_limit
102
+ else
103
+ lim
104
+ end
105
+ end
106
+
107
+ def upper_limit
108
+ 100
109
+ end
110
+
111
+ def default_limit
112
+ 50
113
+ end
114
+
115
+ def lower_limit
116
+ 10
117
+ end
118
+
119
+ def by_ids
120
+ relation.where(id: params[:ids].split(','))
121
+ end
122
+
123
+ def since_id
124
+ relation.where("#{defined_table_name}.id > ?", params[:since_id])
125
+ end
126
+ end
127
+ end
@@ -1,28 +1,25 @@
1
1
  class Queryko::Feature
2
- attr_reader :name, :filters, :query_object
2
+ attr_reader :name, :filter_names, :query_object
3
3
  def initialize(name, query_object)
4
4
  @name = name
5
5
  @query_object = query_object
6
- @filters = {}
6
+ @filter_names = {}
7
7
  end
8
8
 
9
9
  def add_filter(filter_name, options = {})
10
- self.filters[filter_name] << create_filter(name, options)
10
+ self.filter_names[filter_name] = create_filter(filter_name, options)
11
11
  end
12
12
 
13
13
  def create_filter(filter_name, options = {})
14
- case filter_name
15
- when :after
16
- result = filters[:after] ||= Queryko::Filters::After.new(options, self)
17
- when :before
18
- result = filters[:before] ||= Queryko::Filters::Before.new(options, self)
19
- when :min
20
- result = filters[:min] ||= Queryko::Filters::Min.new(options, self)
21
- when :max
22
- result = filters[:max] ||= Queryko::Filters::Max.new(options, self)
23
- when :search
24
- result = filters[:search] ||= Queryko::Filters::Search.new(options, self)
14
+ if filter_class = filter_class_for(filter_name)
15
+ result = filter_class.new(options, self)
16
+ else
17
+ raise "Filter class for #{filter_name} not found"
25
18
  end
26
19
  result
27
- end
20
+ end
21
+
22
+ def filter_class_for(filter_name)
23
+ self.query_object.filters.fetch(filter_name.to_sym)
24
+ end
28
25
  end
@@ -0,0 +1,41 @@
1
+ require "queryko/filters/base"
2
+ require "queryko/filters/after"
3
+ require "queryko/filters/before"
4
+ require "queryko/filters/min"
5
+ require "queryko/filters/max"
6
+ require "queryko/filters/search"
7
+
8
+ module Queryko
9
+ module FilterClasses
10
+ def self.included(base)
11
+ base.extend(ClassMethods)
12
+ base.class_eval do
13
+ class_attribute :filters, default: {}
14
+ load_defaults
15
+ end
16
+ end
17
+
18
+ module ClassMethods
19
+ def load_defaults
20
+ self.filters = {
21
+ after: Queryko::Filters::After,
22
+ before: Queryko::Filters::Before,
23
+ min: Queryko::Filters::Min,
24
+ max: Queryko::Filters::Max,
25
+ search: Queryko::Filters::Search
26
+ }
27
+ end
28
+
29
+ def filter_class(symbol, klass)
30
+ filters[symbol.to_sym] = constantize_class(klass)
31
+ end
32
+
33
+ private
34
+
35
+ def constantize_class(klass)
36
+ return klass unless klass.class == String
37
+ klass.constantize
38
+ end
39
+ end
40
+ end
41
+ end
@@ -1,125 +1,9 @@
1
- require "active_support/core_ext/class/attribute"
2
- require "queryko/range_attributes"
3
- require "queryko/searchables"
4
- require "queryko/after_attributes"
5
- require "queryko/naming"
6
- require "queryko/able"
7
- require "queryko/filterer"
8
-
9
- module Queryko
10
- class QueryObject
11
- attr_reader :countable_resource
12
- include Queryko::Naming
13
- include Queryko::RangeAttributes
14
- include Queryko::Searchables
15
- include Queryko::Able
16
- include Queryko::Filterer
17
- # include AfterAttributes
18
-
19
- def self.inherited(subclass)
20
- # It should not be executed when using anonymous class
21
- subclass.table_name inferred_from_class_name(subclass) if subclass.name
22
- end
23
-
24
- def initialize(params = {}, rel)
25
- @relation = @original_relation = rel || inferred_model.all
26
- @params = params
27
- end
28
-
29
- def call
30
- perform
31
- self.relation = paginate if config[:paginate]
32
- return relation
33
- end
34
-
35
- def perform
36
- return if @performed
37
-
38
- @performed = true
39
- pre_filter
40
- filter
41
- filter_by_filters
42
- @countable_resource = relation
43
- end
44
-
45
-
46
- def total_count
47
- perform
48
- countable_resource.count
49
- end
50
-
51
- def count
52
- call.to_a.count
53
- end
54
-
55
- private
56
-
57
- attr_reader :params, :relation
58
- attr_writer :relation
59
-
60
- def config
61
- @config ||= {
62
- paginate: true,
63
- since_id: true,
64
- ids: true
65
- }
66
- end
67
-
68
- def pre_filter
69
- self.relation = by_ids if config[:ids] && params[:ids]
70
- self.relation = since_id if config[:since_id] && params[:since_id]
71
- end
72
-
73
- def filter
74
- end
75
-
76
- def paginate
77
- if defined?(WillPaginate)
78
- relation.paginate(page: page, per_page: limit)
79
- elsif defined?(Kaminari)
80
- relation.page(page).per(limit)
81
- else
82
- raise 'Only kaminari and wil_paginate are supported'
83
- end
84
- end
85
-
86
- def page
87
- params[:page] || 1
88
- end
89
-
90
- def limit
91
- @limit ||= get_limit
92
- end
93
-
94
- def get_limit
95
- lim = (params[:limit] || default_limit).to_i
96
- if lower_limit > lim
97
- lower_limit
98
- elsif lim > upper_limit
99
- upper_limit
100
- else
101
- lim
102
- end
103
- end
104
-
105
- def upper_limit
106
- 100
107
- end
108
-
109
- def default_limit
110
- 50
111
- end
112
-
113
- def lower_limit
114
- 10
115
- end
116
-
117
- def by_ids
118
- relation.where(id: params[:ids].split(','))
119
- end
120
-
121
- def since_id
122
- relation.where("#{defined_table_name}.id > ?", params[:since_id])
123
- end
124
- end
125
- end
1
+ require "queryko/base"
2
+ Queryko::QueryObject = Queryko::Base
3
+
4
+ message = [
5
+ "[DEPRECATION] Inheriting from 'Queryko::QueryObject' is depcrecated",
6
+ "and will be removed on next major release.",
7
+ "Inherit form 'Queryko::Base' instead."
8
+ ]
9
+ warn message.join(' ')
@@ -11,6 +11,7 @@ module Queryko
11
11
  feature arg.to_sym, :min
12
12
  feature arg.to_sym, :max
13
13
  suggestion << "feature :#{arg}, :min"
14
+ suggestion << "feature :#{arg}, :max"
14
15
  end
15
16
  warn "[DEPRECATION] `add_range_attributes` is deprecated. Please use `feature` instead.\nExample:\n#{suggestion.join("\n")}"
16
17
  end
@@ -9,7 +9,7 @@ module Queryko
9
9
  suggestion = []
10
10
  args.each do |arg|
11
11
  feature arg.to_sym, :search, as: arg.to_sym
12
- suggestion << "feature :#{arg}, :search, as: #{arg}"
12
+ suggestion << "feature :#{arg}, :search, as: :#{arg}"
13
13
  end
14
14
  warn "[DEPRECATION] `add_searchables` is deprecated. Please use `feature` instead.\nExample:\n#{suggestion.join("\n")}"
15
15
  end
@@ -1,3 +1,3 @@
1
1
  module Queryko
2
- VERSION = "1.2.1.beta2"
2
+ VERSION = "1.2.2"
3
3
  end
data/lib/queryko.rb CHANGED
@@ -1,14 +1,10 @@
1
1
  require "queryko/version"
2
2
  require "queryko/query_object"
3
- require "queryko/filters/base"
4
- require "queryko/filters/after"
5
- require "queryko/filters/before"
6
- require "queryko/filters/min"
7
- require "queryko/filters/max"
8
- require "queryko/filters/search"
3
+ require "queryko/base"
9
4
  require "queryko/feature"
10
5
  require "queryko/able"
11
6
  require "queryko/filterer"
7
+ require "queryko/filter_classes"
12
8
  module Queryko
13
9
  # Your code goes here...
14
10
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: queryko
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1.beta2
4
+ version: 1.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joseph Nelson Valeros
@@ -145,7 +145,9 @@ files:
145
145
  - lib/queryko.rb
146
146
  - lib/queryko/able.rb
147
147
  - lib/queryko/after_attributes.rb
148
+ - lib/queryko/base.rb
148
149
  - lib/queryko/feature.rb
150
+ - lib/queryko/filter_classes.rb
149
151
  - lib/queryko/filterer.rb
150
152
  - lib/queryko/filters/after.rb
151
153
  - lib/queryko/filters/base.rb
@@ -175,9 +177,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
175
177
  version: '0'
176
178
  required_rubygems_version: !ruby/object:Gem::Requirement
177
179
  requirements:
178
- - - ">"
180
+ - - ">="
179
181
  - !ruby/object:Gem::Version
180
- version: 1.3.1
182
+ version: '0'
181
183
  requirements: []
182
184
  rubyforge_project:
183
185
  rubygems_version: 2.7.6