simple_resource_controller 0.1.4 → 0.2.0

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