gauze 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e2e3f518dd71ce727fe94b67cd76d74c949c5e8a
4
- data.tar.gz: 9e308e8bea3e14e4c750c01eaea2a9a5a28cedbe
3
+ metadata.gz: 527dae15f5adffa62ef1b3325a193b704a8894c2
4
+ data.tar.gz: 96b137d7878a66b32b8a52abddfd9ffb4bc178ab
5
5
  SHA512:
6
- metadata.gz: ab9ea811399e221c4cbd38e5cbceed77d6cee6e6a5bf4756289441a1d1a213d80c0b144512fb60199e4a8636f5517b119cabe5a89ee08b0f90283f1c8f419abd
7
- data.tar.gz: 93d44f6f4c34e350f995b76b9f89638ef53c8b920aa222426e96ca5adc13b0256dfd4770d65c3efcb0a7a6a18424467d83ebe9465fc722e076f66a45f708fe08
6
+ metadata.gz: 78c419437f8fa15ca7f28fbc26c690b26fac850841d26f8ee19a49f1f5c31cc1d4ad400e53b044294f871210dd7704061075a30821ea0f52c2200ee0c375e51b
7
+ data.tar.gz: 4257f394a2244ef6a9ef140aa9f7a275b018572fedbb055b91ed512b3e11554849d6ab6809edee3b050908aadf17bb2903813f06af8ed8cc9b8d1f926a3840e6
data/README.md CHANGED
@@ -28,7 +28,7 @@ Or install it yourself as:
28
28
  ## Usage
29
29
 
30
30
  Create a class that your controller can find.
31
- Define filters using the Gauze DSL.
31
+ Define filters & sorters using the Gauze DSL.
32
32
 
33
33
  The filter method accepts 4 arguments.
34
34
 
@@ -56,6 +56,17 @@ Then in your controller:
56
56
  end
57
57
  ```
58
58
 
59
+ The sorter method accepts 2 arguments.
60
+
61
+ `sorter :param_key, :column_name`
62
+
63
+
64
+ ```ruby
65
+ class EventFilters < Gauze::Base
66
+ sorter :event_name, :name
67
+ end
68
+ ```
69
+
59
70
  Because **Gauze** uses AREL to construct queries, you can use `.build` just like any other scope. You can pass relational objects & chain more relations as you need.
60
71
  ```ruby
61
72
  def index
@@ -64,6 +75,44 @@ def index
64
75
  end
65
76
  ```
66
77
 
78
+ ### Using Joins
79
+
80
+ It is possible to filter & sort across joined tables.
81
+
82
+ To start, you need to let **Gauze** know that you are going to make use of a join.
83
+ Simply add the `needs` method to your gauze classes.
84
+
85
+ ```ruby
86
+ class CustomerFilters < Gauze::Base
87
+ needs :person
88
+ end
89
+ ```
90
+
91
+ This can also be a hash or array, a-la activerecord:
92
+ ```ruby
93
+ needs person: :location, orders: {transaction: :charge}
94
+ ```
95
+
96
+ ```ruby
97
+ needs :person, :location
98
+ ```
99
+
100
+ After you have all of your gauze needs met, you simply use a hash style syntax to filter across the join.
101
+ ```ruby
102
+ class CustomerFilters < Gauze::Base
103
+ needs :person
104
+ filter :name, {person: :last_name}, :matches, -> val {"%#{val}%"}
105
+ sorter :last_name, {person: :last_name}
106
+ end
107
+ ```
108
+
109
+
110
+ ## TO-DO
111
+ - [ ] Write tests.
112
+ - [ ] Add controller hooks.
113
+
114
+
115
+
67
116
  ## Contributing
68
117
 
69
118
  1. Fork it ( https://github.com/TheKidCoder/gauze/fork )
data/lib/gauze/base.rb CHANGED
@@ -17,8 +17,13 @@ module Gauze
17
17
  @filters.push param_key: param_key, column: column_name, method: arel_method, preprocessor: preprocessor
18
18
  end
19
19
 
20
+ def self.sorter(param_key, column)
21
+ @sorters ||= []
22
+ @sorters.push param_key: param_key, column: column
23
+ end
24
+
20
25
  def self.build(resource, params = {})
21
- new(resource, params).build_nodes
26
+ new(resource, params).build
22
27
  end
23
28
 
24
29
  def initialize(resource, params = {})
@@ -26,13 +31,17 @@ module Gauze
26
31
  @params = params.symbolize_keys
27
32
  end
28
33
 
29
- def build_nodes
34
+ def build
30
35
  wheres = applied_filters.map {|obj| build_arel_filter(obj)}
31
36
  _query = @resource
32
37
  wheres.each {|node| _query = _query.where(node)}
33
38
 
34
- if self.class.instance_variable_get(:@join_stanza).present?
35
- _query = _query.joins(self.class.instance_variable_get(:@join_stanza))
39
+ if get_klass_var(:@join_stanza).present?
40
+ _query = _query.joins(get_klass_var(:@join_stanza))
41
+ end
42
+
43
+ if get_klass_var(:@sorters).present?
44
+ _query = build_order_query(_query)
36
45
  end
37
46
 
38
47
  return _query
@@ -42,18 +51,41 @@ module Gauze
42
51
  filter_val = @params[filter_hash[:param_key]]
43
52
  filter_val = filter_hash[:preprocessor].call(filter_val) if filter_hash[:preprocessor]
44
53
 
45
- @resource.arel_table[filter_hash[:column]].method(filter_hash[:method]).call(filter_val)
54
+ if filter_hash[:column].is_a?(Hash)
55
+ arel_column_from_hash(filter_hash[:column]).method(filter_hash[:method]).call(filter_val)
56
+ else
57
+ @resource.arel_table[filter_hash[:column]].method(filter_hash[:method]).call(filter_val)
58
+ end
59
+ end
60
+
61
+ def build_order_query(query)
62
+ return query unless @params[:sort].present?
63
+ sort_column = get_klass_var(:@sorters).find {|h| h[:param_key].to_s == @params[:sort].underscore}
64
+ return query unless sort_column.present?
65
+
66
+ if sort_column[:column].is_a?(Hash)
67
+ query.order(arel_column_from_hash(sort_column[:column]))
68
+ else
69
+ query.order(sort_column[:column])
70
+ end
46
71
  end
47
72
 
48
73
  private
49
- def arel_column(hash_param)
74
+ def get_klass_var(var)
75
+ self.class.instance_variable_get(var)
76
+ end
77
+
78
+ def arel_column_from_hash(hash_param)
79
+ raise ArgumentError, "Hash can only have one key." if hash_param.length > 1
80
+ _resource = hash_param.keys.first.to_s.classify.constantize
81
+ _resource.arel_table[hash_param.values.first]
50
82
  end
51
83
 
52
84
  def applied_filters
53
85
  _filters = []
54
86
  @params.each do |k,v|
55
87
  next unless v.present?
56
- next unless filter = self.class.instance_variable_get(:@filters).find {|obj| obj[:param_key] == k}
88
+ next unless filter = get_klass_var(:@filters).find {|obj| obj[:param_key] == k}
57
89
  _filters.push filter
58
90
  end
59
91
 
data/lib/gauze/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Gauze
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gauze
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Ostrowski
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-14 00:00:00.000000000 Z
11
+ date: 2015-02-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails