simple_resource_controller 0.1.4 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cb28b4c9ce2a17fae1264f71a4091cd4913ed6fc2aeb727b395c27764ffe0f60
4
- data.tar.gz: 16aaee6c115b1a59ba7d083290db63693103da35099cf24f17296a4ec133cf4c
3
+ metadata.gz: 11ecf5e2bc0b286fa0709a401ed41a7a204a15cd0cc54e4379a31ae70c77d492
4
+ data.tar.gz: d382ef1a1b0752b8cd8e5e23dcb247e9bfe485d01af6b4149765a0fa26768cd7
5
5
  SHA512:
6
- metadata.gz: 7a845c5c753d2b4a7c14dd38c4b216a72d23a5d8b85bd4a2f7db591e4f9bed28d1b5121a59c61bb93bc17e8388235013d8c77f0045c76e8051f4d064cae328b4
7
- data.tar.gz: 7c8b9ad5385472b79a5cc96fb09e81858e96a9201382257130e62b388b6812260ea93aee060578b10808e9e69b5432d8ee481a9cc4762ddafd11c95dca91e32d
6
+ metadata.gz: 19582cab4d75ae48b61f42d92c3a9485949cd470f9e900b5565d9bcc92e21a8f5dd5c6e8faa9786429b751e0ee8fca2a9c8fa4f8f2b281e58dcf1948c3a0b922
7
+ data.tar.gz: aedab8f8ca87baac41c871668af80e392c7f064c7d27a4429e3864db17fb7bd226afa5a2b9f56f0259852c77aab2dd3a47cc066c4070552a790f5aff2f5c9502
data/.gitignore CHANGED
@@ -13,3 +13,4 @@ coverage
13
13
 
14
14
  *.sqlite3
15
15
  spec/dummy_app/log/
16
+ spec/dummy_app/tmp/
data/Gemfile CHANGED
@@ -5,7 +5,7 @@ group :development, :test do
5
5
  gem 'rails'
6
6
  gem 'byebug'
7
7
  gem 'pry'
8
- gem 'responders', '~> 2.0'
8
+ gem 'responders', '= 3.0'
9
9
  gem 'kaminari'
10
10
  gem 'has_scope'
11
11
  end
@@ -15,6 +15,7 @@ group :test do
15
15
  gem 'database_cleaner'
16
16
  gem 'simplecov'
17
17
  gem 'mutant-rspec'
18
+ gem 'rails-controller-testing'
18
19
  end
19
20
 
20
21
  # Specify your gem's dependencies in simple_resource_controller.gemspec
data/README.md CHANGED
@@ -63,6 +63,36 @@ class AnotherArticlesController < ApplicationController
63
63
  end
64
64
  ```
65
65
 
66
+ ### API examples
67
+
68
+ Gem suppports [jbuilder](https://github.com/rails/jbuilder) and [activemodel_serializer](https://github.com/rails-api/active_model_serializers) as API serializers
69
+
70
+ #### JBuilder
71
+
72
+ ```ruby
73
+ resource_api jbuilder: true
74
+ ```
75
+
76
+ But you will also need to add all view files for your actions, including `new` and `edit`.
77
+
78
+ **You can find example inside tests.**
79
+
80
+ #### ActiveModel::Serializer
81
+
82
+ Minimum config:
83
+
84
+ ```ruby
85
+ resource_api activemodel_serializer: { }
86
+ ```
87
+
88
+ All options:
89
+
90
+ ```ruby
91
+ resource_api activemodel_serializer: { record_serializer: MyArticleSerializer, error_serializer: MyErrorSerializer }
92
+ ```
93
+
94
+ **You can find example inside tests.**
95
+
66
96
  ### Controller configuration
67
97
 
68
98
  The first required configuration is an action name.
@@ -394,6 +424,11 @@ This is my favorite one. The `responders` gem follows the next logic - if a reco
394
424
  If you will get this exception - check your ActiveRecord callbacks, your code has some smells.
395
425
 
396
426
 
427
+ #### `error_serializer should be configured for the activemodel API`
428
+
429
+ You are trying to use the `resource_api` DSL to setup the activemodel_serializer, faced with the validation error in create or update action.
430
+ But didn't configured an error serializer: `resource_api activemodel_serializer: { error_serializer: MyErrorSerializer }`
431
+
397
432
  ## Contributing
398
433
 
399
434
  Bug reports and pull requests are welcome on GitHub at https://github.com/c3gdlk/simple_resource_controller. This project is intended to be a safe, welcoming space for collaboration.
@@ -26,8 +26,7 @@ module SimpleResourceController
26
26
  def create(options={}, &block)
27
27
  build_resource
28
28
  success = save_resource_and_respond!(options, &block)
29
- ensure
30
- setup_flash_messages(after_create_messages) if success
29
+ setup_flash_messages(after_create_messages) if success && !current_controller_api?
31
30
  end
32
31
  alias :create! :create
33
32
  end
@@ -42,8 +41,7 @@ module SimpleResourceController
42
41
  module Update
43
42
  def update(options={}, &block)
44
43
  success = save_resource_and_respond!(options, &block)
45
- ensure
46
- setup_flash_messages(after_update_messages) if success
44
+ setup_flash_messages(after_update_messages) if success && !current_controller_api?
47
45
  end
48
46
  alias :update! :update
49
47
  end
@@ -52,7 +50,7 @@ module SimpleResourceController
52
50
  def destroy(options={}, &block)
53
51
  destroy_resource_and_respond!(options, &block)
54
52
  ensure
55
- setup_flash_messages(after_destroy_messages)
53
+ setup_flash_messages(after_destroy_messages) unless current_controller_api?
56
54
  end
57
55
  alias :destroy! :destroy
58
56
  end
@@ -60,6 +58,20 @@ module SimpleResourceController
60
58
  module CommonMethods
61
59
  private
62
60
 
61
+ def current_controller_api?
62
+ self.class.api_config.present?
63
+ end
64
+
65
+ def activemodel_serializer?
66
+ current_controller_api? && self.class.api_config.dig(:activemodel_serializer).present?
67
+ end
68
+
69
+ def render_resource_with_activemodel_serializer(options)
70
+ record_serializer = self.class.api_config.dig(:activemodel_serializer, :record_serializer)
71
+
72
+ render({ json: resource, status: :ok }.merge(record_serializer ? { serializer: record_serializer } : {} ).merge(options))
73
+ end
74
+
63
75
  def collection
64
76
  return instance_variable_get(:"@#{collection_name}") if instance_variable_get(:"@#{collection_name}").present?
65
77
  instance_variable_set(:"@#{collection_name}", apply_scopes_and_pagination(association_chain))
@@ -96,7 +108,7 @@ module SimpleResourceController
96
108
  end
97
109
 
98
110
  def resource_name
99
- resource_class_name.underscore
111
+ resource_class_name.split('::').last.underscore
100
112
  end
101
113
 
102
114
  def resource_relation_name
@@ -159,11 +171,15 @@ module SimpleResourceController
159
171
  def destroy_resource_and_respond!(options={}, &block)
160
172
  resource.destroy
161
173
 
162
- unless block_given? || options[:location].present?
174
+ unless block_given? || options[:location].present? || current_controller_api?
163
175
  options[:location] = after_destroy_redirect_path
164
176
  end
165
177
 
166
- respond_with resource, options, &block
178
+ if activemodel_serializer?
179
+ render_resource_with_activemodel_serializer(options)
180
+ else
181
+ respond_with resource, options, &block
182
+ end
167
183
  end
168
184
 
169
185
  def save_resource_and_respond!(options={}, &block)
@@ -174,11 +190,22 @@ module SimpleResourceController
174
190
  resource.errors[:base] << resource_wasnt_saved_message
175
191
  end
176
192
 
177
- unless block_given? || options[:location].present?
178
- options[:location] = after_save_redirect_path
193
+ if result.present?
194
+ unless block_given? || options[:location].present? || current_controller_api?
195
+ options[:location] = after_save_redirect_path
196
+ end
197
+ elsif activemodel_serializer?
198
+ error_serializer = self.class.api_config.dig(:activemodel_serializer, :error_serializer)
199
+
200
+ raise "error_serializer should be configured for the activemodel API" unless error_serializer.present?
201
+ options[:serializer] = error_serializer
179
202
  end
180
203
 
181
- respond_with resource, options, &block
204
+ if result.present? && activemodel_serializer?
205
+ render_resource_with_activemodel_serializer(options)
206
+ else
207
+ respond_with resource, options, &block
208
+ end
182
209
 
183
210
  result
184
211
  end
@@ -256,6 +283,14 @@ module SimpleResourceController
256
283
  def paginate_collection(value)
257
284
  @paginate_collection_config = value
258
285
  end
286
+
287
+ def api_config
288
+ @api_config
289
+ end
290
+
291
+ def resource_api(value)
292
+ @api_config = value
293
+ end
259
294
  end
260
295
 
261
296
  class ActionsBuilder
@@ -1,3 +1,3 @@
1
1
  module SimpleResourceController
2
- VERSION = "0.1.4"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -19,11 +19,13 @@ Gem::Specification.new do |spec|
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ["lib"]
21
21
 
22
- spec.add_development_dependency "bundler", "~> 1.11"
23
- spec.add_development_dependency "rake", "~> 10.0"
22
+ spec.add_development_dependency "bundler"
23
+ spec.add_development_dependency "rake"
24
24
  spec.add_development_dependency "rspec", "~> 3.0"
25
+ spec.add_development_dependency "jbuilder"
26
+ spec.add_development_dependency 'active_model_serializers', '~> 0.10.0'
25
27
 
26
- spec.add_dependency "railties", ">= 3.2"
27
- spec.add_dependency "actionpack", ">= 3.2"
28
- spec.add_dependency "responders", "~> 2.0"
28
+ spec.add_dependency "railties"
29
+ spec.add_dependency "actionpack"
30
+ spec.add_dependency "responders"
29
31
  end
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_resource_controller
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oleg Zaporozhchenko
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-06-16 00:00:00.000000000 Z
11
+ date: 2022-01-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.11'
19
+ version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.11'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -52,48 +52,76 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: jbuilder
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: active_model_serializers
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.10.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.10.0
55
83
  - !ruby/object:Gem::Dependency
56
84
  name: railties
57
85
  requirement: !ruby/object:Gem::Requirement
58
86
  requirements:
59
87
  - - ">="
60
88
  - !ruby/object:Gem::Version
61
- version: '3.2'
89
+ version: '0'
62
90
  type: :runtime
63
91
  prerelease: false
64
92
  version_requirements: !ruby/object:Gem::Requirement
65
93
  requirements:
66
94
  - - ">="
67
95
  - !ruby/object:Gem::Version
68
- version: '3.2'
96
+ version: '0'
69
97
  - !ruby/object:Gem::Dependency
70
98
  name: actionpack
71
99
  requirement: !ruby/object:Gem::Requirement
72
100
  requirements:
73
101
  - - ">="
74
102
  - !ruby/object:Gem::Version
75
- version: '3.2'
103
+ version: '0'
76
104
  type: :runtime
77
105
  prerelease: false
78
106
  version_requirements: !ruby/object:Gem::Requirement
79
107
  requirements:
80
108
  - - ">="
81
109
  - !ruby/object:Gem::Version
82
- version: '3.2'
110
+ version: '0'
83
111
  - !ruby/object:Gem::Dependency
84
112
  name: responders
85
113
  requirement: !ruby/object:Gem::Requirement
86
114
  requirements:
87
- - - "~>"
115
+ - - ">="
88
116
  - !ruby/object:Gem::Version
89
- version: '2.0'
117
+ version: '0'
90
118
  type: :runtime
91
119
  prerelease: false
92
120
  version_requirements: !ruby/object:Gem::Requirement
93
121
  requirements:
94
- - - "~>"
122
+ - - ">="
95
123
  - !ruby/object:Gem::Version
96
- version: '2.0'
124
+ version: '0'
97
125
  description: This gem allows to write explicit resource controllers
98
126
  email:
99
127
  - c3.gdlk@gmail.com
@@ -136,7 +164,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
136
164
  - !ruby/object:Gem::Version
137
165
  version: '0'
138
166
  requirements: []
139
- rubygems_version: 3.0.4
167
+ rubygems_version: 3.1.2
140
168
  signing_key:
141
169
  specification_version: 4
142
170
  summary: Simple gem for resource controllers