rest_framework 0.3.0 → 0.3.6

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
  SHA256:
3
- metadata.gz: 5a4c53fa557df9090c749745efce556214252b76e2115df09917970e9a9c8b5e
4
- data.tar.gz: 5c33946ae697618f726532e9b45056f2e112d3f81f6efb5c9a37ab8d9b3b002e
3
+ metadata.gz: 86f1b6f94bf7074dd30cf16be9f07fdc83df2bd477e09584f12882456e1405cf
4
+ data.tar.gz: b0d8bacaac76492876f13e8f402bb090a3e490f3bbf6656c88efb3cf52d2d1c8
5
5
  SHA512:
6
- metadata.gz: ddfd6544b96284e871684d2f448e622631bd88631ea78ebe4170d2ff2fe4f1654901ef86a96584e3c5d0a2538bcef5d29f85152795aa689df58fc98cb05f7b3b
7
- data.tar.gz: 1ab60515fcf543c0df574a6cf3913648736d19d559b1d9fbe55f891ce3e6926026357369580430ada33b6e294a081d8058b297bb3f146b3d17f4671b10683d55
6
+ metadata.gz: '02179633392aa9f9e7c873e38bcacfb1cd7c93b5caeef57c2ec112707b16fc069cae17686d899d4d6bf5cb0582dff469bac38e71081f7b5f20b5915298e6eb44'
7
+ data.tar.gz: 432da0162809905fc29e93194d616561ee0b9d93c23b194e77792fb9a7814062ae10025986c466510d3d5adfe2e4300de4104213444a30835626ed17c076f7b4
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.3.6
@@ -182,9 +182,9 @@ module RESTFramework::BaseControllerMixin
182
182
  hkwargs = kwargs.merge(html_kwargs)
183
183
  begin
184
184
  render(**hkwargs)
185
- rescue ActionView::MissingTemplate # fallback to rest_framework layout/view
185
+ rescue ActionView::MissingTemplate # fallback to rest_framework layout
186
186
  hkwargs[:layout] = "rest_framework"
187
- hkwargs[:template] = "rest_framework/default"
187
+ hkwargs[:html] = ''
188
188
  render(**hkwargs)
189
189
  end
190
190
  }
@@ -37,6 +37,10 @@ module RESTFramework::BaseModelControllerMixin
37
37
  filterset_fields: nil,
38
38
  ordering_fields: nil,
39
39
  ordering_query_param: 'ordering',
40
+ ordering_no_reorder: false,
41
+ search_fields: nil,
42
+ search_query_param: 'search',
43
+ search_ilike: false,
40
44
 
41
45
  # Other misc attributes.
42
46
  create_from_recordset: true, # Option for `recordset.create` vs `Model.create` behavior.
@@ -89,6 +93,11 @@ module RESTFramework::BaseModelControllerMixin
89
93
  return self.class.ordering_fields&.map(&:to_s) || self.get_fields
90
94
  end
91
95
 
96
+ # Get a list of search fields for the current action.
97
+ def get_search_fields
98
+ return self.class.search_fields&.map(&:to_s) || self.get_fields
99
+ end
100
+
92
101
  # Get a list of parameters allowed for the current action.
93
102
  def get_allowed_parameters
94
103
  return _get_specific_action_config(:allowed_action_parameters, :allowed_parameters)&.map(&:to_s)
@@ -14,15 +14,3 @@ class RESTFramework::NilPassedToAPIResponseError < RESTFramework::Error
14
14
  MSG
15
15
  end
16
16
  end
17
-
18
-
19
- class RESTFramework::UnserializableError < RESTFramework::Error
20
- def initialize(object)
21
- @object = object
22
- return super
23
- end
24
-
25
- def message
26
- return "Unable to serialize `#{@object.inspect}` (of type `#{@object.class}`)."
27
- end
28
- end
@@ -15,7 +15,7 @@ class RESTFramework::ModelFilter < RESTFramework::BaseFilter
15
15
  # Filter params for keys allowed by the current action's filterset_fields/fields config.
16
16
  def _get_filter_params
17
17
  fields = @controller.send(:get_filterset_fields)
18
- return @controller.request.query_parameters.select { |p|
18
+ return @controller.request.query_parameters.select { |p, _|
19
19
  fields.include?(p)
20
20
  }.to_h.symbolize_keys # convert from HashWithIndifferentAccess to Hash w/keys
21
21
  end
@@ -38,8 +38,8 @@ class RESTFramework::ModelOrderingFilter < RESTFramework::BaseFilter
38
38
  def _get_ordering
39
39
  return nil if @controller.class.ordering_query_param.blank?
40
40
  ordering_fields = @controller.send(:get_ordering_fields)
41
-
42
41
  order_string = @controller.params[@controller.class.ordering_query_param]
42
+
43
43
  unless order_string.blank?
44
44
  ordering = {}
45
45
  order_string.split(',').each do |field|
@@ -63,14 +63,31 @@ class RESTFramework::ModelOrderingFilter < RESTFramework::BaseFilter
63
63
  # Order data according to the request query parameters.
64
64
  def get_filtered_data(data)
65
65
  ordering = self._get_ordering
66
+ reorder = !@controller.send(:ordering_no_reorder)
67
+
66
68
  if ordering && !ordering.empty?
67
- return data.order(_get_ordering)
69
+ return data.send(reorder ? :reorder : :order, _get_ordering)
68
70
  end
71
+
69
72
  return data
70
73
  end
71
74
  end
72
75
 
73
76
 
74
- # TODO: implement searching within fields rather than exact match filtering (ModelFilter)
75
- # class RESTFramework::ModelSearchFilter < RESTFramework::BaseFilter
76
- # end
77
+ # Multi-field text searching on models.
78
+ class RESTFramework::ModelSearchFilter < RESTFramework::BaseFilter
79
+ # Filter data according to the request query parameters.
80
+ def get_filtered_data(data)
81
+ fields = @controller.send(:get_search_fields)
82
+ search = @controller.request.query_parameters[@controller.send(:search_query_param)]
83
+
84
+ # Ensure we use array conditions to prevent SQL injection.
85
+ unless search.blank?
86
+ return data.where(fields.map { |f|
87
+ "CAST(#{f} AS CHAR) #{@controller.send(:search_ilike) ? "ILIKE" : "LIKE"} ?"
88
+ }.join(' OR '), *(["%#{search}%"] * fields.length))
89
+ end
90
+
91
+ return data
92
+ end
93
+ end
@@ -83,6 +83,7 @@ class RESTFramework::PageNumberPaginator < RESTFramework::BasePaginator
83
83
  return {
84
84
  count: @count,
85
85
  page: @page_number,
86
+ page_size: @page_size,
86
87
  total_pages: @total_pages,
87
88
  results: serialized_page,
88
89
  }
@@ -105,18 +105,12 @@ class RESTFramework::NativeSerializer < RESTFramework::BaseSerializer
105
105
 
106
106
  # Convert the object (record or recordset) to Ruby primitives.
107
107
  def serialize
108
- if @object
109
- begin
110
- if @object.is_a?(Enumerable)
111
- return @object.map { |r| r.serializable_hash(self.get_serializer_config) }
112
- end
113
- return @object.serializable_hash(self.get_serializer_config)
114
- rescue NoMethodError
115
- end
116
- end
108
+ raise "No object available to serialize!" unless @object
117
109
 
118
- # Raise an error if we cannot serialize the object.
119
- raise RESTFramework::UnserializableError.new(@object)
110
+ if @object.is_a?(Enumerable)
111
+ return @object.map { |r| r.serializable_hash(self.get_serializer_config) }
112
+ end
113
+ return @object.serializable_hash(self.get_serializer_config)
120
114
  end
121
115
 
122
116
  # Allow a serializer instance to be used as a hash directly in a nested serializer config.
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rest_framework
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gregory N. Schmit
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-04-11 00:00:00.000000000 Z
11
+ date: 2021-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -37,7 +37,6 @@ files:
37
37
  - app/views/layouts/rest_framework.html.erb
38
38
  - app/views/rest_framework/_head.html.erb
39
39
  - app/views/rest_framework/_routes.html.erb
40
- - app/views/rest_framework/default.html.erb
41
40
  - lib/rest_framework.rb
42
41
  - lib/rest_framework/controller_mixins.rb
43
42
  - lib/rest_framework/controller_mixins/base.rb
@@ -73,7 +72,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
73
72
  - !ruby/object:Gem::Version
74
73
  version: '0'
75
74
  requirements: []
76
- rubygems_version: 3.0.9
75
+ rubygems_version: 3.1.4
77
76
  signing_key:
78
77
  specification_version: 4
79
78
  summary: A framework for DRY RESTful APIs in Ruby on Rails.
File without changes