standardapi 1.0.4 → 1.0.5

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: dcce074ca51a9c5d78cc73fee9c8849b54216100
4
- data.tar.gz: 39e43f30d1541ada3c5d4e9fe8b8955fd2f3c677
3
+ metadata.gz: cb2bcb0df75b9410634d0fec29e4391a6830ba3e
4
+ data.tar.gz: 9ef3bc3fd6e4b4d7d5d704ae09255f20182bb04d
5
5
  SHA512:
6
- metadata.gz: bf58c08c89b8585923f6328de5a1cdd48cf49c8b8edf14dcc72b682ee4275172b7b91e4174302fe29eb6e76c78f9c5c0aa8b93a05f2df14193959f5e41ca9b88
7
- data.tar.gz: ec704819998b18aa742caa6d30d1a6b4d9403cfba95c46cc64e24ccfec0a8585647db6f821e61c87a96989887e8eed4d73bf356605f31007cb1754e92013d407
6
+ metadata.gz: e3ef2868b977624aa84a784020647292d90baa82fc98bf4c34a25fc86c32138b6c6d4c7e902f339f2b54532513ebb9ca4f10c385add0a42a5dfda4031fc02040
7
+ data.tar.gz: dbfd5941419c1a41fb27d96407a7e98855e8f790a6132fbefe7f54b27ad68de6f70369ff5c471ef0ea49505b6529fad78aafbf93dc885a3ce1fb4b039f73b806
data/lib/standard_api.rb CHANGED
@@ -6,11 +6,13 @@ require 'jbuilder'
6
6
  require 'jbuilder/railtie'
7
7
  require 'active_record/filter'
8
8
  require 'active_record/sort'
9
+ require 'active_support/core_ext/hash/indifferent_access'
9
10
 
10
11
  if !ActionView::Template.registered_template_handler(:jbuilder)
11
12
  ActionView::Template.register_template_handler :jbuilder, JbuilderHandler
12
13
  end
13
14
 
15
+ require 'standard_api/orders'
14
16
  require 'standard_api/includes'
15
17
 
16
18
  module StandardAPI
@@ -88,49 +90,11 @@ module StandardAPI
88
90
  end
89
91
 
90
92
  def includes
91
- @includes ||= StandardAPI::Includes.normalize(params[:include] || [])
93
+ @includes ||= StandardAPI::Includes.normalize(params[:include])
92
94
  end
93
95
 
94
- # TODO: sanitize orders
95
96
  def orders
96
- normalized_order(params[:order])
97
- end
98
-
99
- def normalized_order(orderings)
100
- return nil if orderings.nil?
101
-
102
- orderings = Array(orderings)
103
-
104
- orderings.map! do |order|
105
- if order.is_a?(Symbol) || order.is_a?(String)
106
- order = order.to_s
107
- if order.index(".")
108
- relation, column = order.split('.').map(&:to_sym)
109
- { relation => [column] }
110
- else
111
- order.to_sym
112
- end
113
- elsif order.is_a?(Hash)
114
- normalized_order = {}
115
- order.each do |key, value|
116
- key = key.to_s
117
-
118
- if key.index(".")
119
- relation, column = key.split('.').map(&:to_sym)
120
- normalized_order[relation] ||= []
121
- normalized_order[relation] << { column => value }
122
- elsif value.is_a?(Hash) && value.keys.first.to_s != 'desc' && value.keys.first.to_s != 'asc'
123
- normalized_order[key.to_sym] ||= []
124
- normalized_order[key.to_sym] << value
125
- else
126
- normalized_order[key.to_sym] = value
127
- end
128
- end
129
- normalized_order
130
- end
131
- end
132
-
133
- orderings
97
+ @orders ||= params[:order]
134
98
  end
135
99
 
136
100
  # Used in #calculate
@@ -1,5 +1,3 @@
1
- require 'active_support/core_ext/hash/indifferent_access'
2
- # require 'active_support/core_ext/hash'
3
1
  module StandardAPI
4
2
  module Includes
5
3
 
@@ -17,6 +15,8 @@ module StandardAPI
17
15
  includes.flatten.compact.each { |v| normalized.merge!(normalize(v)) }
18
16
  when Hash
19
17
  includes.each_pair { |k, v| normalized[k] = normalize(v) }
18
+ when nil
19
+ {}
20
20
  else
21
21
  if ![true, 'true'].include?(includes)
22
22
  normalized[includes] = {}
@@ -33,8 +33,8 @@ module StandardAPI
33
33
  # sanitize({:key => {:value => {}}}, {:key => [:value]}) # => {:key => {:value => {}}}
34
34
  # sanitize({:key => {:value => {}}}, {:key => {:value => true}}) # => {:key => {:value => {}}}
35
35
  # sanitize({:key => {:value => {}}}, [:key]) => # Raises ParseError
36
- def self.sanitize(includes, permit)
37
- includes = normalize(includes)
36
+ def self.sanitize(includes, permit, normalized=false)
37
+ includes = normalize(includes) if !normalized
38
38
  permitted = ActiveSupport::HashWithIndifferentAccess.new
39
39
 
40
40
  if permit.is_a?(Array)
@@ -44,7 +44,7 @@ module StandardAPI
44
44
  permit = normalize(permit.with_indifferent_access)
45
45
  includes.each do |k, v|
46
46
  if permit.has_key?(k) || ['where', 'order'].include?(k.to_s)
47
- permitted[k] = sanitize(v, permit[k] || {})
47
+ permitted[k] = sanitize(v, permit[k] || {}, true)
48
48
  else
49
49
  if [:raise, nil].include?(Rails.configuration.try(:action_on_unpermitted_includes))
50
50
  raise(ActionDispatch::ParamsParser::ParseError.new(<<-ERR.squish, nil))
@@ -0,0 +1,85 @@
1
+ module StandardAPI
2
+ module Orders
3
+
4
+ # # :size => [:size]
5
+ # # { :size => :asc } => [{:size => :asc}]
6
+ # # { :size => :desc } => [{:size => :desc}]
7
+ # # {:size => {:desc => :nulls_first}} => [{:size => {:desc => :nulls_first}}]
8
+ # # [:size, :id] => [:size, :id]
9
+ # # { :size => :asc, :id => :desc } => [{ :size => :asc, :id => :desc }]
10
+ # # 'listings.size' => [{:listings => [:size]}]
11
+ # # { 'listings.size' => :asc } => [{:listings => [{:size => :asc}]}]
12
+ # # { 'listings.size' => :desc } => [{:listings => [{:size => :desc}]}]
13
+ # # ['listings.size', 'property.id'] => [{:listings => [:size]}, {:property => [:id]}]
14
+ # # { 'size' => :asc, 'property.id' => :desc } => [{:size => :asc}, {:property => [{:id => :desc}]}]
15
+ # # { :size => {:asc => :nulls_first}, 'property.id' => {:desc => :null_last} } => [{:size => {:asc => :nulls_first}}, {:property => [{:id => {:desc => :nulls_first}}]}]
16
+ # def self.normalize(orderings)
17
+ # return nil if orderings.nil?
18
+ # orderings = orderings.is_a?(Array) ? orderings : [orderings]
19
+ #
20
+ # orderings.map! do |order|
21
+ # case order
22
+ # when Hash
23
+ # normalized = ActiveSupport::HashWithIndifferentAccess.new
24
+ # order.each do |key, value|
25
+ # key = key.to_s
26
+ # if key.index(".")
27
+ # relation, column = key.split('.').map(&:to_sym)
28
+ # normalized[relation] ||= []
29
+ # normalized[relation] << { column => value }
30
+ # elsif value.is_a?(Hash) && value.keys.first.to_s != 'desc' && value.keys.first.to_s != 'asc'
31
+ # normalized[key.to_sym] ||= []
32
+ # normalized[key.to_sym] << value
33
+ # else
34
+ # normalized[key.to_sym] = value
35
+ # end
36
+ # end
37
+ # normalized
38
+ # else
39
+ # order = order.to_s
40
+ # if order.index(".")
41
+ # relation, column = order.split('.').map(&:to_sym)
42
+ # { relation => [column] }
43
+ # else
44
+ # order.to_sym
45
+ # end
46
+ # end
47
+ # end
48
+ # end
49
+
50
+ def self.sanitize(orders, permit, normalized=false)
51
+ return nil if orders.nil?
52
+
53
+ permit = [permit] if !permit.is_a?(Array)
54
+ permit = permit.flatten.map { |x| x.is_a?(Hash) ? x.with_indifferent_access : x.to_s }
55
+ permitted = []
56
+
57
+ case orders
58
+ when Hash
59
+ orders.each do |key, value|
60
+ if permit.include?(key.to_s)
61
+ value = value.symbolize_keys if value.is_a?(Hash)
62
+ permitted = { key.to_sym => value }
63
+ elsif permit.find { |x| x.is_a?(Hash) && x.has_key?(key.to_s) }
64
+ subpermit = permit.find { |x| x.is_a?(Hash) && x.has_key?(key.to_s) }[key.to_s]
65
+ sanitized_value = sanitize(value, subpermit, true)
66
+ permitted = { key.to_sym => sanitized_value }
67
+ else
68
+ raise(ActionDispatch::ParamsParser::ParseError.new("Invalid Ordering #{orders.inspect}", nil))
69
+ end
70
+ end
71
+ when Array
72
+ orders.each { |order| permitted << sanitize(order, permit, true); }
73
+ else
74
+ if permit.include?(orders.to_s)
75
+ permitted = orders
76
+ else
77
+ raise(ActionDispatch::ParamsParser::ParseError.new("Invalid Ordering #{orders.inspect}", nil))
78
+ end
79
+ end
80
+
81
+ permitted
82
+ end
83
+
84
+ end
85
+ end
@@ -38,8 +38,8 @@ module StandardAPI::TestCase
38
38
  self.class.model
39
39
  end
40
40
 
41
- def create_model(attrs={})
42
- create(model.name.underscore, attrs)
41
+ def create_model(*args)
42
+ create(model.name.underscore, *args)
43
43
  end
44
44
 
45
45
  def singular_name
@@ -24,6 +24,7 @@ module StandardAPI
24
24
 
25
25
  test '#index.json params[:order]' do
26
26
  orders.each do |order|
27
+ @controller.instance_variable_set('@orders', nil) # Hack for dealing with caching / multiple request per controller life
27
28
  if order.is_a?(Hash)
28
29
  order.values.last.each do |o|
29
30
  get :index, order: {order.keys.first => o}, format: 'json'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: standardapi
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Bracy
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-05 00:00:00.000000000 Z
11
+ date: 2015-08-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord-sort
@@ -190,6 +190,7 @@ files:
190
190
  - README.md
191
191
  - lib/standard_api.rb
192
192
  - lib/standard_api/includes.rb
193
+ - lib/standard_api/orders.rb
193
194
  - lib/standard_api/test_case.rb
194
195
  - lib/standard_api/test_case/calculate_tests.rb
195
196
  - lib/standard_api/test_case/create_tests.rb