restful_query 0.3.3 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,9 @@
1
+ == 0.3.4 2011-08-15
2
+
3
+ * Added support for extra options to sort. Specifically this allows you to do NULLS FIRST/LAST
4
+ * You can supply :sort_options => to the restful query parser that will get added to all sorts
5
+ * Changed single_sort => true to the default
6
+
1
7
  == 0.3.3 2011-05-15
2
8
 
3
9
  * Added 'restful_query/rails' for bundler requires
data/lib/restful_query.rb CHANGED
@@ -9,7 +9,7 @@ rescue LoadError
9
9
  end
10
10
 
11
11
  module RestfulQuery
12
- VERSION = '0.3.3'
12
+ VERSION = '0.3.4'
13
13
 
14
14
  class Error < RuntimeError; end
15
15
  end
@@ -1,15 +1,16 @@
1
1
  module RestfulQuery
2
2
  class Parser
3
- attr_reader :query, :exclude_columns, :map_columns, :integer_columns, :options
3
+ attr_reader :query, :exclude_columns, :map_columns, :integer_columns, :options, :default_sort_options
4
4
 
5
5
  def initialize(query, options = {})
6
6
  @options = options || {}
7
7
  @exclude_columns = columns_from_options(:exclude, options)
8
8
  @integer_columns = columns_from_options(:integer, options)
9
9
  @map_columns = options[:map_columns] || {}
10
- @default_sort = options[:default_sort] ? [Sort.parse(options[:default_sort])] : []
11
- @single_sort = options[:single_sort] || false
10
+ @single_sort = options[:single_sort] || true
11
+ @default_sort_options = options[:sort_options] || {}
12
12
  @query = (query || {}).dup
13
+ @query['_sort'] ||= options[:default_sort] if options[:default_sort]
13
14
  @default_join = @query.delete(:join) || :and
14
15
  extract_sorts_from_conditions
15
16
  map_conditions
@@ -18,7 +19,7 @@ module RestfulQuery
18
19
  def conditions
19
20
  conditions_hash.values.flatten
20
21
  end
21
-
22
+
22
23
  def has_conditions?
23
24
  !conditions.empty?
24
25
  end
@@ -32,46 +33,46 @@ module RestfulQuery
32
33
  join_string = (join == :or) ? ' OR ' : ' AND '
33
34
  conditions_string = []
34
35
  conditions_values = []
35
- conditions.each do |c|
36
+ conditions.each do |c|
36
37
  ca = c.to_condition_array
37
38
  conditions_string << ca[0]
38
39
  conditions_values << ca[1]
39
40
  end
40
41
  conditions_values.unshift(conditions_string.join(join_string))
41
42
  end
42
-
43
+
43
44
  def to_query_hash
44
45
  hash = @query
45
46
  hash['_sort'] = sorts.collect {|s| s.to_s } unless sorts.empty?
46
47
  hash
47
48
  end
48
-
49
+
49
50
  def sort_sql
50
51
  @sorts.collect {|s| s.to_sql }.join(', ')
51
52
  end
52
-
53
+
53
54
  def has_sort?
54
55
  !sorts.empty?
55
56
  end
56
-
57
+
57
58
  def sorts
58
59
  @sorts ||= []
59
60
  end
60
-
61
+
61
62
  def sorted_columns
62
63
  sorts.collect {|s| s.column }
63
64
  end
64
-
65
+
65
66
  def sorted_by?(column_name)
66
67
  column = map_column(column_name)
67
68
  sorted_columns.include?(column.to_s)
68
69
  end
69
-
70
+
70
71
  def sort(column_name)
71
72
  column = map_column(column_name)
72
73
  sorts.detect {|s| s && s.column == column }
73
74
  end
74
-
75
+
75
76
  def set_sort(column_name, direction)
76
77
  column = map_column(column_name)
77
78
  if new_sort = self.sort(column_name)
@@ -86,7 +87,7 @@ module RestfulQuery
86
87
  end
87
88
  new_sort
88
89
  end
89
-
90
+
90
91
  def clear_default_sort!
91
92
  @sorts.reject! {|s| s == @default_sort.first }
92
93
  end
@@ -108,7 +109,7 @@ module RestfulQuery
108
109
  []
109
110
  end
110
111
  end
111
-
112
+
112
113
  def extract_sorts_from_conditions
113
114
  @sorts = sorts_from_hash(@query.delete('_sort'))
114
115
  @sorts = @default_sort if @sorts.empty?
@@ -142,25 +143,26 @@ module RestfulQuery
142
143
  end
143
144
  end
144
145
  end
145
-
146
+
146
147
  def sorts_from_hash(sorts)
147
148
  sort_conditions = [sorts].flatten.compact
148
- sort_conditions.collect do |c|
149
+ sort_conditions.collect do |c|
149
150
  s = Sort.parse(c)
150
151
  s.column = map_column(s.column)
152
+ s.options = default_sort_options
151
153
  s
152
154
  end
153
- end
154
-
155
+ end
156
+
155
157
  def columns_from_options(column_type, options)
156
158
  option = "#{column_type}_columns".to_sym
157
159
  options[option] ? [options.delete(option)].flatten.collect {|c| c.to_s } : []
158
160
  end
159
-
161
+
160
162
  def map_column(column_name)
161
163
  map_columns[column_name.to_s] || column_name.to_s
162
164
  end
163
-
164
-
165
+
166
+
165
167
  end
166
- end
168
+ end
@@ -1,11 +1,11 @@
1
1
  module RestfulQuery
2
2
  class InvalidDirection < Error; end
3
-
3
+
4
4
  class Sort
5
5
  include Comparable
6
-
7
- attr_reader :column, :direction
8
-
6
+
7
+ attr_reader :column, :direction, :options
8
+
9
9
  DIRECTIONS = {
10
10
  'up' => 'ASC',
11
11
  'asc' => 'ASC',
@@ -14,37 +14,51 @@ module RestfulQuery
14
14
  'desc' => 'DESC',
15
15
  'DESC' => 'DESC'
16
16
  }.freeze
17
-
18
-
19
- def initialize(column, direction)
17
+
18
+
19
+ def initialize(column, direction, options = {})
20
20
  self.column = column
21
21
  self.direction = direction
22
+ self.options = options
22
23
  end
23
-
24
+
24
25
  def self.parse(sort_string, split_on = /\-|\ /)
25
26
  return unless sort_string
26
- column, direction = sort_string.split(split_on)
27
- new(column, direction)
27
+ column, direction, options = sort_string.split(split_on, 3)
28
+ new(column, direction, options)
28
29
  end
29
-
30
+
30
31
  def column=(column)
31
32
  @column = column.to_s
32
33
  end
33
-
34
+
34
35
  def direction=(direction)
35
36
  @direction = DIRECTIONS[direction.to_s]
36
37
  raise(InvalidDirection, "'#{direction}' is not a valid order direction") unless @direction
37
38
  end
38
-
39
+
40
+ def options=(options)
41
+ @options = if options.is_a?(String)
42
+ opts = {}
43
+ options.split(/ /).each_slice(2) do |k|
44
+ k.map! {|v| v.to_s.downcase.to_sym }
45
+ opts[k[0]] = k[1]
46
+ end
47
+ opts
48
+ else
49
+ options || {}
50
+ end
51
+ end
52
+
39
53
  def reverse_direction
40
54
  direction == 'ASC' ? 'DESC' : 'ASC'
41
55
  end
42
-
56
+
43
57
  def ==(other)
44
58
  return false unless other.is_a?(Sort)
45
59
  column == other.column && direction == other.direction
46
60
  end
47
-
61
+
48
62
  # Makes a roundabout for directions nil -> desc -> asc -> nil
49
63
  def self.next_direction(current_direction)
50
64
  case current_direction.to_s.downcase
@@ -56,17 +70,23 @@ module RestfulQuery
56
70
  'desc'
57
71
  end
58
72
  end
59
-
73
+
60
74
  def next_direction
61
75
  self.class.next_direction(direction)
62
76
  end
63
-
77
+
64
78
  def to_s(join = '-')
65
- "#{column}#{join}#{direction.downcase}"
79
+ s = "#{column}#{join}#{direction.downcase}"
80
+ s << " #{options.inspect}" unless options.empty?
81
+ s
66
82
  end
67
-
83
+
68
84
  def to_sql
69
- "#{column} #{direction}"
85
+ sql = "#{column} #{direction}"
86
+ unless options.empty?
87
+ sql << ' ' << options.to_a.flatten.collect {|k| k.to_s.upcase }.join(' ')
88
+ end
89
+ sql
70
90
  end
71
91
  end
72
- end
92
+ end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{restful_query}
8
- s.version = "0.3.3"
8
+ s.version = "0.3.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Aaron Quint"]
12
- s.date = %q{2011-05-17}
12
+ s.date = %q{2011-08-15}
13
13
  s.description = %q{RestfulQuery provides a simple interface in front of a complex parser to parse specially formatted query hashes into complex SQL queries. It includes ActiveRecord and Sequel extensions.}
14
14
  s.extra_rdoc_files = [
15
15
  "LICENSE",
@@ -39,11 +39,10 @@ Gem::Specification.new do |s|
39
39
  ]
40
40
  s.require_paths = ["lib"]
41
41
  s.rubyforge_project = %q{quirkey}
42
- s.rubygems_version = %q{1.3.7}
42
+ s.rubygems_version = %q{1.6.2}
43
43
  s.summary = %q{Simple ActiveRecord and Sequel queries from a RESTful and safe interface}
44
44
 
45
45
  if s.respond_to? :specification_version then
46
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
47
46
  s.specification_version = 3
48
47
 
49
48
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
@@ -100,7 +100,7 @@ class RestfulQueryParserTest < Test::Unit::TestCase
100
100
  assert_not_equal Chronic.parse('1 day ago').to_s, @parser.conditions_for(:updated_at).first.value.to_s
101
101
  end
102
102
  end
103
-
103
+
104
104
  context "with blank values" do
105
105
  setup do
106
106
  new_parser_from_hash({'isblank' => ''})
@@ -115,7 +115,7 @@ class RestfulQueryParserTest < Test::Unit::TestCase
115
115
  assert_nil @parser.conditions_for('isblank')
116
116
  end
117
117
  end
118
-
118
+
119
119
  context "with map_columns" do
120
120
  setup do
121
121
  new_parser_from_hash({'section' => 4, '_sort' => 'category-up'}, {:map_columns => {
@@ -123,22 +123,22 @@ class RestfulQueryParserTest < Test::Unit::TestCase
123
123
  'category' => 'category_id'
124
124
  }})
125
125
  end
126
-
126
+
127
127
  should "return parser object" do
128
128
  assert @parser.is_a?(RestfulQuery::Parser)
129
129
  end
130
-
130
+
131
131
  should "set the map_columns attribute" do
132
132
  assert @parser.map_columns.is_a?(Hash)
133
133
  end
134
-
134
+
135
135
  should "map condition column" do
136
136
  assert @parser.conditions_for('section')
137
137
  assert_equal 'section_id', @parser.conditions_for('section').first.column
138
138
  end
139
-
139
+
140
140
  should "map sort column" do
141
- @sort = @parser.sorts.first
141
+ @sort = @parser.sorts.first
142
142
  assert @sort.is_a?(RestfulQuery::Sort)
143
143
  assert_equal 'ASC', @sort.direction
144
144
  assert_equal 'category_id', @sort.column
@@ -155,7 +155,7 @@ class RestfulQueryParserTest < Test::Unit::TestCase
155
155
  end
156
156
 
157
157
  should "parse sort string" do
158
- @sort = @parser.sorts.first
158
+ @sort = @parser.sorts.first
159
159
  assert @sort.is_a?(RestfulQuery::Sort)
160
160
  assert_equal 'ASC', @sort.direction
161
161
  assert_equal 'created_at', @sort.column
@@ -184,26 +184,41 @@ class RestfulQueryParserTest < Test::Unit::TestCase
184
184
  assert sort.is_a?(RestfulQuery::Sort)
185
185
  end
186
186
  end
187
+ end
187
188
 
189
+ context "with sort options" do
190
+ setup do
191
+ new_parser_from_hash({'_sort' => ['created_at-up']}, :sort_options => {:nulls => :first})
192
+ end
193
+
194
+ should "return parser object" do
195
+ assert @parser.is_a?(RestfulQuery::Parser)
196
+ end
197
+
198
+ should "add sorts to sorts" do
199
+ assert @parser.sorts
200
+ assert_equal 1, @parser.sorts.length
201
+ assert_equal 'created_at ASC NULLS FIRST', @parser.sort_sql
202
+ end
188
203
  end
189
-
204
+
190
205
  context "with a default_sort" do
191
206
  context "with no sorts defined in the query hash" do
192
207
  setup do
193
208
  new_parser_from_hash({}, {:default_sort => 'created_at DESC'})
194
209
  end
195
-
210
+
196
211
  should "return parser object" do
197
212
  assert @parser.is_a?(RestfulQuery::Parser)
198
213
  end
199
-
214
+
200
215
  should "have default sort in sorts" do
201
216
  assert @parser.sorts
202
217
  assert_equal 1, @parser.sorts.length
203
218
  assert_equal 'created_at DESC', @parser.sort_sql
204
219
  end
205
220
  end
206
-
221
+
207
222
  context "with sorts defined in the query hash" do
208
223
  setup do
209
224
  new_parser_from_hash({'_sort' => 'created_at-up'})
@@ -212,7 +227,7 @@ class RestfulQueryParserTest < Test::Unit::TestCase
212
227
  should "return parser object" do
213
228
  assert @parser.is_a?(RestfulQuery::Parser)
214
229
  end
215
-
230
+
216
231
  should "have query hash sorts in sorts and not default sort" do
217
232
  assert @parser.sorts
218
233
  assert_equal 1, @parser.sorts.length
@@ -221,20 +236,20 @@ class RestfulQueryParserTest < Test::Unit::TestCase
221
236
  end
222
237
  end
223
238
  end
224
-
239
+
225
240
  context "from an array of conditions" do
226
241
  setup do
227
242
  @array_of_conditions = [
228
- {'column' => 'created_at', 'operator' => 'gt', 'value' => '1 week ago'},
229
- {'column' => 'created_at', 'operator' => 'lt', 'value' => '1 hour ago'},
230
- {'column' => 'updated_at', 'operator' => 'lt', 'value' => '1 day ago'},
231
- {'column' => 'title', 'operator' => 'eq', 'value' => 'Test'},
243
+ {'column' => 'created_at', 'operator' => 'gt', 'value' => '1 week ago'},
244
+ {'column' => 'created_at', 'operator' => 'lt', 'value' => '1 hour ago'},
245
+ {'column' => 'updated_at', 'operator' => 'lt', 'value' => '1 day ago'},
246
+ {'column' => 'title', 'operator' => 'eq', 'value' => 'Test'},
232
247
  {'column' => 'other_time', 'operator' => 'gt', 'value' => 'oct 1'},
233
248
  {'column' => 'name', 'value' => 'Aaron'}
234
249
  ]
235
250
  @parser = RestfulQuery::Parser.new(:conditions => @array_of_conditions)
236
251
  end
237
-
252
+
238
253
  should "return parser object" do
239
254
  assert @parser.is_a?(RestfulQuery::Parser)
240
255
  end
@@ -250,7 +265,7 @@ class RestfulQueryParserTest < Test::Unit::TestCase
250
265
  assert @parser.conditions_for(:name).first.is_a?(RestfulQuery::Condition)
251
266
  assert_equal '=', @parser.conditions_for(:name).first.operator
252
267
  end
253
-
268
+
254
269
  end
255
270
 
256
271
  context "a loaded parser" do
@@ -327,45 +342,45 @@ class RestfulQueryParserTest < Test::Unit::TestCase
327
342
  assert_match(/(([a-z_]) (\<|\>|\=|\<\=|\>\=) \? OR)+/,@conditions[0])
328
343
  end
329
344
  end
330
-
345
+
331
346
  context "to_query_hash" do
332
347
  context "with no altering" do
333
348
  setup do
334
349
  @query_hash = @parser.to_query_hash
335
350
  end
336
-
351
+
337
352
  should "return hash" do
338
353
  assert @query_hash.is_a?(Hash)
339
354
  end
340
-
355
+
341
356
  should "return initial query hash" do
342
357
  assert_equal({'gt' => '1 week ago', 'lt' => '1 hour ago'}, @query_hash['created_at'])
343
358
  end
344
359
  end
345
-
360
+
346
361
  context "with altered sorts" do
347
362
  setup do
348
363
  @parser.set_sort('title', 'up')
349
364
  @parser.set_sort('created_at', 'down')
350
365
  @query_hash = @parser.to_query_hash
351
366
  end
352
-
367
+
353
368
  should "include unaltered sort conditions" do
354
369
  assert_equal({'gt' => '1 week ago', 'lt' => '1 hour ago'}, @query_hash['created_at'])
355
370
  end
356
-
371
+
357
372
  should "include altered sorts" do
358
373
  assert_equal(['title-asc','created_at-desc'], @query_hash['_sort'])
359
374
  end
360
375
  end
361
376
  end
362
-
377
+
363
378
  context "sorts" do
364
379
  setup do
365
380
  new_parser_from_hash({'_sort' => ['title-down', 'updated_at-asc']})
366
- @sorts = @parser.sorts
381
+ @sorts = @parser.sorts
367
382
  end
368
-
383
+
369
384
  should "return an array of sort objects" do
370
385
  assert @sorts
371
386
  assert_equal 2, @sorts.length
@@ -373,7 +388,7 @@ class RestfulQueryParserTest < Test::Unit::TestCase
373
388
  assert sort.is_a?(RestfulQuery::Sort)
374
389
  end
375
390
  end
376
-
391
+
377
392
  context "sorted_columns" do
378
393
  should "return an array of columns" do
379
394
  @sorted_columns = @parser.sorted_columns
@@ -381,73 +396,73 @@ class RestfulQueryParserTest < Test::Unit::TestCase
381
396
  assert @sorted_columns.include?('title')
382
397
  end
383
398
  end
384
-
399
+
385
400
  context "sorted_by?" do
386
401
  should "return true if column is sorted" do
387
402
  assert @parser.sorted_by?('title')
388
403
  end
389
-
404
+
390
405
  should "return false if column is not sorted" do
391
406
  assert !@parser.sorted_by?('created_at')
392
407
  end
393
408
  end
394
-
409
+
395
410
  context "sort()" do
396
411
  should "return Sort object if column is sorted" do
397
412
  sort = @parser.sort('title')
398
413
  assert sort.is_a?(RestfulQuery::Sort)
399
414
  assert_equal 'title', sort.column
400
415
  end
401
-
416
+
402
417
  should "return nil if col" do
403
418
  assert_nil @parser.sort('created_at')
404
419
  end
405
420
  end
406
-
421
+
407
422
  context "set_sort" do
408
- context "with an existing sort" do
423
+ context "with an existing sort" do
409
424
  setup do
410
425
  @parser.set_sort('title','up')
411
426
  end
412
-
427
+
413
428
  should "not add new sort" do
414
429
  assert_equal 2, @parser.sorts.length
415
430
  end
416
-
431
+
417
432
  should "update sort direction" do
418
433
  assert_equal 'ASC', @parser.sort('title').direction
419
434
  end
420
435
  end
421
-
436
+
422
437
  context "with direction: nil" do
423
438
  setup do
424
439
  @parser.set_sort('title', nil)
425
440
  end
426
-
441
+
427
442
  should "remove sort" do
428
443
  assert_equal 1, @parser.sorts.length
429
444
  assert !@parser.sorted_by?('title')
430
445
  end
431
446
  end
432
-
447
+
433
448
  context "with a new sort" do
434
449
  setup do
435
450
  @parser.set_sort('name', 'down')
436
451
  end
437
-
452
+
438
453
  should "add sort to sorts" do
439
454
  assert_equal 3, @parser.sorts.length
440
455
  end
441
-
456
+
442
457
  should "set sort direction" do
443
458
  assert_equal 'DESC', @parser.sort('name').direction
444
459
  end
445
460
  end
446
-
461
+
447
462
  end
448
-
463
+
449
464
  end
450
-
465
+
451
466
 
452
467
  context "sort_sql" do
453
468
  should "join order with ," do
@@ -8,16 +8,34 @@ class RestfulQuerySortTest < Test::Unit::TestCase
8
8
  setup do
9
9
  @sort = RestfulQuery::Sort.new(:attribute, 'up')
10
10
  end
11
-
11
+
12
12
  should "save column name as string" do
13
13
  assert_equal 'attribute', @sort.column
14
14
  end
15
-
15
+
16
16
  should "interpret direction" do
17
17
  assert_equal 'ASC', @sort.direction
18
18
  end
19
19
  end
20
-
20
+
21
+ context "with extra options" do
22
+ setup do
23
+ @sort = RestfulQuery::Sort.new(:attribute, 'up', :nulls => :first)
24
+ end
25
+
26
+ should "save column name as string" do
27
+ assert_equal 'attribute', @sort.column
28
+ end
29
+
30
+ should "interpret direction" do
31
+ assert_equal 'ASC', @sort.direction
32
+ end
33
+
34
+ should "add nulls option" do
35
+ assert_equal :first, @sort.options[:nulls]
36
+ end
37
+ end
38
+
21
39
  context "with an invalid direction" do
22
40
  should "raise error" do
23
41
  assert_raise(RestfulQuery::InvalidDirection) do
@@ -25,28 +43,28 @@ class RestfulQuerySortTest < Test::Unit::TestCase
25
43
  end
26
44
  end
27
45
  end
28
-
46
+
29
47
  end
30
-
48
+
31
49
  context "parse" do
32
50
  context "with a query hash like condition" do
33
51
  setup do
34
52
  @sort = RestfulQuery::Sort.parse('long_name_attribute-down')
35
53
  end
36
-
54
+
37
55
  should "return sort object" do
38
56
  assert @sort.is_a?(RestfulQuery::Sort)
39
57
  end
40
-
58
+
41
59
  should "set column and direction" do
42
60
  assert_equal 'long_name_attribute', @sort.column
43
61
  assert_equal 'DESC', @sort.direction
44
62
  end
45
63
  end
46
-
64
+
47
65
  context "with a standard SQL like condition" do
48
66
  setup do
49
- @sort = RestfulQuery::Sort.parse('long_name_attribute DESC')
67
+ @sort = RestfulQuery::Sort.parse('long_name_attribute DESC NULLS LAST')
50
68
  end
51
69
 
52
70
  should "return sort object" do
@@ -57,16 +75,25 @@ class RestfulQuerySortTest < Test::Unit::TestCase
57
75
  assert_equal 'long_name_attribute', @sort.column
58
76
  assert_equal 'DESC', @sort.direction
59
77
  end
78
+
79
+ should "set other options" do
80
+ assert_equal :last, @sort.options[:nulls]
81
+ end
60
82
  end
61
83
  end
62
-
84
+
63
85
  context "to_sql" do
64
86
  should "join the column and attribute" do
65
87
  @sort = RestfulQuery::Sort.new(:attribute, 'down')
66
88
  assert_equal 'attribute DESC', @sort.to_sql
67
89
  end
90
+
91
+ should "parse null option" do
92
+ @sort = RestfulQuery::Sort.new(:attribute, 'down', :nulls => :last)
93
+ assert_equal 'attribute DESC NULLS LAST', @sort.to_sql
94
+ end
68
95
  end
69
-
96
+
70
97
  end
71
-
72
- end
98
+
99
+ end
metadata CHANGED
@@ -1,77 +1,60 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: restful_query
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 3
8
- - 3
9
- version: 0.3.3
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.4
5
+ prerelease:
10
6
  platform: ruby
11
- authors:
7
+ authors:
12
8
  - Aaron Quint
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2011-05-17 00:00:00 -07:00
12
+ date: 2011-08-15 00:00:00.000000000 -04:00
18
13
  default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
21
16
  name: activesupport
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
17
+ requirement: &2152029040 !ruby/object:Gem::Requirement
24
18
  none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- segments:
29
- - 2
30
- - 2
31
- - 0
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
32
22
  version: 2.2.0
33
23
  type: :runtime
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: chronic
37
24
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
25
+ version_requirements: *2152029040
26
+ - !ruby/object:Gem::Dependency
27
+ name: chronic
28
+ requirement: &2152028020 !ruby/object:Gem::Requirement
39
29
  none: false
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- segments:
44
- - 0
45
- - 2
46
- - 3
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
47
33
  version: 0.2.3
48
34
  type: :runtime
49
- version_requirements: *id002
50
- - !ruby/object:Gem::Dependency
51
- name: Shoulda
52
35
  prerelease: false
53
- requirement: &id003 !ruby/object:Gem::Requirement
36
+ version_requirements: *2152028020
37
+ - !ruby/object:Gem::Dependency
38
+ name: Shoulda
39
+ requirement: &2152027080 !ruby/object:Gem::Requirement
54
40
  none: false
55
- requirements:
56
- - - ">="
57
- - !ruby/object:Gem::Version
58
- segments:
59
- - 1
60
- - 2
61
- - 0
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
62
44
  version: 1.2.0
63
45
  type: :development
64
- version_requirements: *id003
65
- description: RestfulQuery provides a simple interface in front of a complex parser to parse specially formatted query hashes into complex SQL queries. It includes ActiveRecord and Sequel extensions.
46
+ prerelease: false
47
+ version_requirements: *2152027080
48
+ description: RestfulQuery provides a simple interface in front of a complex parser
49
+ to parse specially formatted query hashes into complex SQL queries. It includes
50
+ ActiveRecord and Sequel extensions.
66
51
  email:
67
52
  executables: []
68
-
69
53
  extensions: []
70
-
71
- extra_rdoc_files:
54
+ extra_rdoc_files:
72
55
  - LICENSE
73
56
  - README.rdoc
74
- files:
57
+ files:
75
58
  - History.txt
76
59
  - LICENSE
77
60
  - README.rdoc
@@ -95,34 +78,26 @@ files:
95
78
  has_rdoc: true
96
79
  homepage:
97
80
  licenses: []
98
-
99
81
  post_install_message:
100
82
  rdoc_options: []
101
-
102
- require_paths:
83
+ require_paths:
103
84
  - lib
104
- required_ruby_version: !ruby/object:Gem::Requirement
85
+ required_ruby_version: !ruby/object:Gem::Requirement
105
86
  none: false
106
- requirements:
107
- - - ">="
108
- - !ruby/object:Gem::Version
109
- segments:
110
- - 0
111
- version: "0"
112
- required_rubygems_version: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ! '>='
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ required_rubygems_version: !ruby/object:Gem::Requirement
113
92
  none: false
114
- requirements:
115
- - - ">="
116
- - !ruby/object:Gem::Version
117
- segments:
118
- - 0
119
- version: "0"
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
120
97
  requirements: []
121
-
122
98
  rubyforge_project: quirkey
123
- rubygems_version: 1.3.7
99
+ rubygems_version: 1.6.2
124
100
  signing_key:
125
101
  specification_version: 3
126
102
  summary: Simple ActiveRecord and Sequel queries from a RESTful and safe interface
127
103
  test_files: []
128
-