ruby-ext-js 0.3.3 → 0.4.0

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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.3
1
+ 0.4.0
data/lib/ruby-ext-js.rb CHANGED
@@ -80,7 +80,7 @@ module ExtJs
80
80
 
81
81
  # @return [Hash] `find()` conditions for `Mongo::Collection.find( conditions, opts )`
82
82
  def conditions
83
- self.class.search_param( @params )
83
+ self.class.filter_param( @params )
84
84
  end
85
85
 
86
86
  # @return [Hash] `find()` options for `Mongo::Collection.find( conditions, opts )`
@@ -99,6 +99,16 @@ module ExtJs
99
99
  []
100
100
  end
101
101
 
102
+ # Define options for specific filters. Eg:
103
+ # {
104
+ # "field_1" => { :all_caps => true },
105
+ # "field_2" => { :operator => "$all" },
106
+ # "field_3" => { :strip => "true" }
107
+ # }
108
+ def self.filter_opts
109
+ {}
110
+ end
111
+
102
112
  protected
103
113
 
104
114
  def self.skip_param( params )
@@ -120,7 +130,7 @@ module ExtJs
120
130
  { :sort => [sort, dir] }
121
131
  end
122
132
 
123
- def self.search_param( params )
133
+ def self.filter_param( params )
124
134
  conds = {}
125
135
 
126
136
  if params["filter"] && params["filter"].size > 0
@@ -167,9 +177,54 @@ module ExtJs
167
177
  end
168
178
  end
169
179
 
180
+ values = self.apply_filter_opts( field, values )
181
+
170
182
  return field, values
171
183
  end
172
184
 
185
+ def self.apply_filter_opts( field, values )
186
+ return values if values.size == 0
187
+
188
+ opts = {
189
+ :strip => true,
190
+ :all_caps => false,
191
+ :operator => nil
192
+ }.merge( filter_opts[field] || {} )
193
+
194
+ if values.is_a?( String ) || values.is_a?( Array )
195
+ opts[:operator] ||= "$in"
196
+ values = Array( values )
197
+ values.map!{ |value| value.strip } if opts[:strip]
198
+ values.map!{ |value| value.upcase } if opts[:all_caps]
199
+ values = values.size > 1 ? { opts[:operator] => values } : values.first
200
+ elsif values.is_a?( Hash )
201
+ # Values is already a { "$in" => [1, 2] } style hash
202
+ if opts[:operator]
203
+ values = { opts[:operator] => values.values.flatten.uniq }
204
+ end
205
+ if opts[:strip]
206
+ values.each do |k, v|
207
+ if v.is_a?( Array )
208
+ values[k] = v.map{ |value| value.strip }
209
+ elsif v.is_a?( String )
210
+ values[k] = v.strip
211
+ end
212
+ end
213
+ end
214
+ if opts[:all_caps]
215
+ values.each do |k, v|
216
+ if v.is_a?( Array )
217
+ values[k] = v.map{ |value| value.upcase }
218
+ elsif v.is_a?( String )
219
+ values[k] = v.upcase
220
+ end
221
+ end
222
+ end
223
+ end
224
+
225
+ values
226
+ end
227
+
173
228
  def self.comparison_for( str )
174
229
  case str
175
230
  when "lt"; "$lte"
data/ruby-ext-js.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{ruby-ext-js}
8
- s.version = "0.3.3"
8
+ s.version = "0.4.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Tyson Tate"]
12
- s.date = %q{2011-01-24}
12
+ s.date = %q{2011-03-21}
13
13
  s.description = %q{Ultra-basic classes for working with Ext.js requests and translating them to DataMapper / Mongood query opts.}
14
14
  s.email = %q{tyson@doloreslabs.com}
15
15
  s.extra_rdoc_files = [
@@ -31,7 +31,7 @@ Gem::Specification.new do |s|
31
31
  s.homepage = %q{http://github.com/help/ruby-ext-js}
32
32
  s.licenses = ["MIT"]
33
33
  s.require_paths = ["lib"]
34
- s.rubygems_version = %q{1.3.7}
34
+ s.rubygems_version = %q{1.4.2}
35
35
  s.summary = %q{Ultra-basic classes for working with Ext.js requests and translating them to DataMapper / Mongood query opts.}
36
36
  s.test_files = [
37
37
  "spec/ruby-ext-js_spec.rb",
@@ -39,7 +39,6 @@ Gem::Specification.new do |s|
39
39
  ]
40
40
 
41
41
  if s.respond_to? :specification_version then
42
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
43
42
  s.specification_version = 3
44
43
 
45
44
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
@@ -2,19 +2,6 @@ require "date"
2
2
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
3
3
 
4
4
  describe "ExtJs" do
5
- # describe "Postgres" do
6
- # it "sorts on id when you ask it to sort on created_at" do
7
- # ExtJs::Postgres.pagination_opts({
8
- # :sort => "created_at",
9
- # :order => "desc"
10
- # })[:order].should == [:id.asc]
11
- # end
12
- #
13
- # it "specs the rest of the class or it gets the hose" do
14
- # pending "The current spec suite is currently rigidly tied to private models. Someday we'll write a generic spec suite here."
15
- # end
16
- # end
17
-
18
5
  describe "Mongo" do
19
6
  describe "conditions" do
20
7
  class TestMongoNoFilters < ExtJs::Mongo; end
@@ -25,6 +12,20 @@ describe "ExtJs" do
25
12
  end
26
13
  end
27
14
 
15
+ class TestMongoWithFiltersAndFilterOpts < ExtJs::Mongo
16
+ def self.allowed_filters
17
+ ["state", "score", "inserted_at"]
18
+ end
19
+
20
+ def self.filter_opts
21
+ {
22
+ "state" => { :all_caps => true },
23
+ "score" => { :operator => "$all" },
24
+ "inserted_at" => { :strip => true }
25
+ }
26
+ end
27
+ end
28
+
28
29
  it "handles empty params" do
29
30
  mongo = TestMongoNoFilters.new( {} )
30
31
  mongo.conditions.should == {}
@@ -152,6 +153,38 @@ describe "ExtJs" do
152
153
  mongo = TestMongoWithFilters.new( params )
153
154
  mongo.conditions.should == { "inserted_at" => { "$in" => start_time } }
154
155
  end
156
+
157
+ it "allows specifying filter options per-field" do
158
+ params = {
159
+ "filter" => {
160
+ "0" => {
161
+ "field" => "state",
162
+ "data" => {
163
+ "value" => "open"
164
+ }
165
+ },
166
+ "1" => {
167
+ "field" => "score",
168
+ "data" => {
169
+ "value" => ["5", "4"]
170
+ }
171
+ },
172
+ "2" => {
173
+ "field" => "inserted_at",
174
+ "data" => {
175
+ "value" => [" Thursday "]
176
+ }
177
+ }
178
+ }
179
+ }
180
+
181
+ mongo = TestMongoWithFiltersAndFilterOpts.new( params )
182
+ mongo.conditions.should == {
183
+ "state" => "OPEN",
184
+ "score" => { "$all" => ["5", "4"] },
185
+ "inserted_at" => "Thursday"
186
+ }
187
+ end
155
188
  end
156
189
 
157
190
  describe "opts" do
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-ext-js
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
5
- prerelease: false
4
+ hash: 15
5
+ prerelease:
6
6
  segments:
7
7
  - 0
8
- - 3
9
- - 3
10
- version: 0.3.3
8
+ - 4
9
+ - 0
10
+ version: 0.4.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Tyson Tate
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-01-24 00:00:00 -08:00
18
+ date: 2011-03-21 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -100,7 +100,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
100
100
  requirements: []
101
101
 
102
102
  rubyforge_project:
103
- rubygems_version: 1.3.7
103
+ rubygems_version: 1.4.2
104
104
  signing_key:
105
105
  specification_version: 3
106
106
  summary: Ultra-basic classes for working with Ext.js requests and translating them to DataMapper / Mongood query opts.