standardapi 1.0.4 → 1.0.5

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
  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