bitia-rails 0.6.0 → 0.7.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: e7d24cf941604172f699c336f12b2b70161ab79864bd250fd286572c0ae2e293
4
- data.tar.gz: b599c3295878779f0dc19d8dabd71680af9b565cded7c5f14b0b532eae2d1c82
3
+ metadata.gz: '089def456cc0795e8c3d2850968d8eeee89ee4c172624bbf661bab22bdfe2e4b'
4
+ data.tar.gz: 67c3f9650bc2efafa15fa2c7aff17d19e554a641bd92c12348b4228a9882dd92
5
5
  SHA512:
6
- metadata.gz: 5e5979a2c19899ac0afead91a45f78b64968b0354340f5fd26ca70afa516ea978df96a2935fef2c1d6b97fb59d882136c6420a69ba9fb95012ab642acfccc0bc
7
- data.tar.gz: 237a786199a5e3b2f6f03d6c0592c8cfb0c78c6ef5d2bc1f0f188f0eacb535a9a20fff12997d3e057387dfa59f7d08b4efbe9142a65c45cb89082641a2e25537
6
+ metadata.gz: 8d7dd18aba5eae87f3194ab103bb3c8f34914fb3e277cb83ca000c00c26f4730879ba198c196d9a5177d4b45b28f716120dfe80e00c5f1ea9af6a28b1f63b179
7
+ data.tar.gz: 45748385d63ebf2ffe2627efe36276074c29f42c8d96daab0a620ec9d186670d30fd57b4d8e2c1d39ca027629551ce87073de62f5c1c3b0c73030f9457f57d8a
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- bitia-rails (0.4.0)
4
+ bitia-rails (0.7.0)
5
5
  rails (~> 5.2.4, >= 5.2.4.3)
6
6
  responders
7
7
 
@@ -0,0 +1,187 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bitia
4
+ module Purable
5
+ extend ActiveSupport::Concern
6
+ include ActionController::MimeResponds
7
+ include Bitia::Resourceable
8
+
9
+ included do
10
+ respond_to :json
11
+
12
+ before_action :purable_initialize_metavars
13
+ before_action :purable_prepare_resources
14
+
15
+ def index
16
+ check_resource_prepared
17
+
18
+ all = resources.count
19
+ if params.include? :offset
20
+ instance_variable_set("@#{resources_name}", resources.offset(params[:offset]))
21
+ end
22
+ if params.include? :limit
23
+ instance_variable_set("@#{resources_name}", resources.limit(Integer(params[:limit])))
24
+ end
25
+ @metadata[:all] = all unless @metadata[:all]
26
+
27
+ render template: 'bitia/api/index'
28
+ end
29
+
30
+ def new
31
+ check_resource_prepared
32
+
33
+ render template: 'bitia/api/new'
34
+ end
35
+
36
+ def show
37
+ check_resource_prepared
38
+
39
+ render template: 'bitia/api/show'
40
+ end
41
+
42
+ def create
43
+ check_resource_prepared
44
+
45
+ pure_create_or_update
46
+ render template: 'bitia/api/create'
47
+ end
48
+
49
+ def update
50
+ check_resource_prepared
51
+
52
+ pure_create_or_update
53
+ render template: 'bitia/api/update'
54
+ end
55
+
56
+ def destroy
57
+ check_resource_prepared
58
+
59
+ resource.destroy!
60
+
61
+ render template: 'bitia/api/destroy'
62
+ end
63
+
64
+ def pure_filter(param)
65
+ return unless params[param].present?
66
+
67
+ resource.where!(param => params[param])
68
+ end
69
+
70
+ helper_method :pure_filter
71
+
72
+ private
73
+
74
+ def purable_initialize_metavars
75
+ @resource = purable_model.name.underscore.to_sym
76
+ @metadata ||= {}
77
+ nil
78
+ end
79
+
80
+ def purable_prepare_resources
81
+ if params[:action] == 'index'
82
+ instance_variable_set("@#{resources_name}", purable_relation.all)
83
+ elsif params[:action] == 'show'
84
+ id = params[:id].present? ? params[:id] : purable_param_id
85
+
86
+ instance_variable_set(
87
+ "@#{resource_name}", id ? purable_relation.find(id) : purable_relation.new
88
+ )
89
+ elsif purable_resource_params.is_a?(Array)
90
+ resources = purable_resource_params.map do |params|
91
+ if params[:id].present? && params[:id] != 'self'
92
+ purable_relation.find(params[:id]).tap { |r| r.assign_attributes(params) }
93
+ else
94
+ purable_relation.new(params)
95
+ end
96
+ end
97
+
98
+ instance_variable_set("@#{resources_name}", resources)
99
+ else
100
+ resource = purable_relation.new(purable_resource_params)
101
+ instance_variable_set("@#{resource_name}", resource)
102
+ end
103
+ rescue ActiveRecord::RecordNotFound => e
104
+ self._prepare_resources_exception = e
105
+ end
106
+
107
+ def purable_param_id
108
+ purable_resource_params[:id]
109
+ rescue StandardError
110
+ nil
111
+ end
112
+
113
+ def purable_relation
114
+ purable_model_names_chain.inject(nil) do |m, pm|
115
+ if m.nil?
116
+ pm.singularize.classify.constantize
117
+ elsif params.include?("#{m.to_s.underscore}_id")
118
+ m.find(params["#{m.to_s.underscore}_id"]).send(pm.to_sym) # TODO: uncovered
119
+ end
120
+ end
121
+ end
122
+
123
+ def pure_create_or_update
124
+ if resources.present?
125
+ purable_model.transaction { resources.each(&:save!) }
126
+ else
127
+ resource.save!
128
+ end
129
+ end
130
+
131
+ def purable_resource_params
132
+ send :"#{resource_name}_params"
133
+ end
134
+
135
+ def purable_model
136
+ purable_model_chain.last
137
+ end
138
+
139
+ def purable_model_names_chain
140
+ controller_path = self.class.controller_path.dup
141
+
142
+ if defined?(self.class.controller_prefix) and self.class.controller_prefix.present?
143
+ prefix_s = self.class.controller_prefix.map(&:to_s).join('/')
144
+ raise StandardError, 'Bad prefix' if controller_path.index(prefix_s) != 0
145
+
146
+ controller_path.sub! "#{prefix_s}/", ''
147
+ end
148
+
149
+ controller_path.split('/')
150
+ end
151
+
152
+ def purable_model_chain
153
+ purable_model_names_chain.map { |p| p.singularize.classify.constantize }
154
+ end
155
+
156
+ # rubocop:disable Style/MissingRespondToMissing
157
+ def method_missing(method_name)
158
+ resource_accessor_name = purable_model.name.underscore.to_sym
159
+
160
+ return resource if method_name == resource_accessor_name
161
+
162
+ super
163
+ end
164
+ # rubocop:enable Style/MissingRespondToMissing
165
+
166
+ def check_resource_prepared
167
+ if _prepare_resources_exception.present? and
168
+ self.class._prepare_resources_fallback.present? and
169
+ resource.nil? and
170
+ resources.nil?
171
+ raise _prepare_resources_exception
172
+ end
173
+ end
174
+
175
+ class_attribute :_prepare_resources_fallback
176
+ attr_accessor :_prepare_resources_exception
177
+ end
178
+
179
+ module ClassMethods
180
+ def prepare_resources_fallback(fallback, *args, &block)
181
+ self._prepare_resources_fallback = fallback
182
+
183
+ before_action fallback, *args, &block
184
+ end
185
+ end
186
+ end
187
+ end
@@ -0,0 +1,53 @@
1
+ module Bitia
2
+ module Resourceable
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ helper_method :resource_name
7
+
8
+ def resource_name
9
+ @resource
10
+ end
11
+
12
+ helper_method :resources_name
13
+
14
+ def resources_name
15
+ @resource.to_s.pluralize.to_sym
16
+ end
17
+
18
+ helper_method :resource
19
+
20
+ def resource
21
+ instance_variable_get(:"@#{resource_name}")
22
+ end
23
+
24
+ helper_method :resources
25
+
26
+ def resources
27
+ instance_variable_get(:"@#{resources_name}")
28
+ end
29
+
30
+ private
31
+
32
+ def resource=(resource)
33
+ instance_variable_set(:"@#{resource_name}", resource)
34
+ end
35
+
36
+ def resources=(resources)
37
+ instance_variable_set(:"@#{resources_name}", resources)
38
+ end
39
+
40
+ def controller_prefix
41
+ self.class.controller_prefix
42
+ end
43
+
44
+ class_attribute :controller_prefix, default: Array.new
45
+ end
46
+
47
+ module ClassMethods
48
+ def controller_prefix_push(prefix)
49
+ controller_prefix.push(*prefix.to_s.split('/').map(&:to_sym))
50
+ end
51
+ end
52
+ end
53
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Bitia
4
- VERSION = '0.6.0'
4
+ VERSION = '0.7.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bitia-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Artem Levenkov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-17 00:00:00.000000000 Z
11
+ date: 2020-07-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -102,8 +102,8 @@ files:
102
102
  - Gemfile.lock
103
103
  - MIT-LICENSE
104
104
  - Rakefile
105
- - app/controllers/bitia/api_controller.rb
106
- - app/controllers/concerns/resourceable.rb
105
+ - app/controllers/concerns/bitia/purable.rb
106
+ - app/controllers/concerns/bitia/resourceable.rb
107
107
  - app/views/bitia/api/create.json.jbuilder
108
108
  - app/views/bitia/api/destroy.json.jbuilder
109
109
  - app/views/bitia/api/index.json.jbuilder
@@ -135,7 +135,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
135
135
  - !ruby/object:Gem::Version
136
136
  version: '0'
137
137
  requirements: []
138
- rubygems_version: 3.0.8
138
+ rubygems_version: 3.1.2
139
139
  signing_key:
140
140
  specification_version: 4
141
141
  summary: Common modules for Bitia’s Rails projects
@@ -1,154 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Bitia
4
- class ApiController < ActionController::Base
5
- include ActionController::MimeResponds
6
-
7
- respond_to :json
8
-
9
- include Resourceable
10
-
11
- before_action :purable_initialize_metavars
12
- before_action :purable_prepare_resources
13
-
14
- def index
15
- all = resources.count
16
- if params.include? :offset
17
- instance_variable_set("@#{resources_name}", resources.offset(params[:offset]))
18
- end
19
- if params.include? :limit
20
- instance_variable_set("@#{resources_name}", resources.limit(Integer(params[:limit])))
21
- end
22
- @metadata[:all] = all unless @metadata[:all]
23
-
24
- render
25
- end
26
-
27
- def new
28
- authorize resource
29
- render
30
- end
31
-
32
- def show
33
- authorize resource
34
- render
35
- end
36
-
37
- def create
38
- pure_create_or_update
39
- render
40
- end
41
-
42
- def update
43
- pure_create_or_update
44
- render
45
- end
46
-
47
- def destroy
48
- authorize resource
49
- resource.destroy!
50
-
51
- render
52
- end
53
-
54
- def pure_filter(param)
55
- return unless params[param].present?
56
-
57
- instance_variable_get("@#{resources_name}").where!(param => params[param])
58
- end
59
-
60
- helper_method :pure_filter
61
-
62
- private
63
-
64
- def purable_initialize_metavars
65
- @resource = purable_model.name.underscore.to_sym
66
- @metadata ||= {}
67
- nil
68
- end
69
-
70
- def purable_prepare_resources
71
- @current_user = User.find(params[:user_id]) if params.include? :user_id
72
-
73
- if params[:action] == 'index'
74
- instance_variable_set("@#{resources_name}", purable_relation.all)
75
- elsif params[:action] == 'show'
76
- id = params[:id].present? ? params[:id] : purable_param_id
77
-
78
- instance_variable_set(
79
- "@#{resource_name}", id ? purable_relation.find_by(id: id) : purable_relation.new
80
- )
81
- elsif purable_resource_params.is_a?(Array)
82
- resources = purable_resource_params.map do |params|
83
- if params[:id].present? && params[:id] != 'self'
84
- purable_relation.find(params[:id]).tap { |r| r.assign_attributes(params) }
85
- else
86
- purable_relation.new(params)
87
- end
88
- end
89
-
90
- instance_variable_set("@#{resources_name}", resources)
91
- else
92
- resource = purable_relation.new(purable_resource_params)
93
- instance_variable_set("@#{resource_name}", resource)
94
- end
95
- end
96
-
97
- def purable_param_id
98
- purable_resource_params[:id]
99
- rescue StandardError
100
- nil
101
- end
102
-
103
- def purable_relation
104
- purable_model_chain.inject(nil) do |m, pm|
105
- if m.nil?
106
- pm.singularize.classify.constantize
107
- elsif params.include?("#{m.to_s.underscore}_id")
108
- m.find(params["#{m.to_s.underscore}_id"]).send(pm.to_sym) # TODO: uncovered
109
- end
110
- end
111
- end
112
-
113
- def pure_create_or_update
114
- if resources.present?
115
- purable_model.transaction { resources.each(&:save!) }
116
- else
117
- resource.save!
118
- end
119
- end
120
-
121
- def purable_resource_params
122
- send :"#{resource_name}_params"
123
- end
124
-
125
- def purable_model
126
- purable_model_chain.last.singularize.classify.constantize
127
- end
128
-
129
- def purable_model_chain
130
- controller_path = self.class.controller_path.dup
131
-
132
- if defined?(self.class.controller_prefix) and self.class.controller_prefix.present?
133
- prefix_s = self.class.controller_prefix.map(&:to_s).join('/')
134
- raise StandardError, 'Bad prefix' if controller_path.index(prefix_s) != 0
135
-
136
- controller_path.sub! "#{prefix_s}/", ''
137
- end
138
-
139
- controller_path.split('/')
140
- end
141
-
142
- def initialize
143
- super
144
-
145
- resource_accessor_name = send(:purable_model).name.underscore.to_sym
146
- define_singleton_method(resource_accessor_name) { resource }
147
- # rubocop:disable Style/AccessModifierDeclarations
148
- singleton_class.class_eval { private resource_accessor_name }
149
- # rubocop:enable Style/AccessModifierDeclarations
150
- end
151
-
152
- private_class_method :inherited
153
- end
154
- end
@@ -1,41 +0,0 @@
1
- module Resourceable
2
- extend ActiveSupport::Concern
3
-
4
- included do
5
- helper_method :resource_name
6
-
7
- def resource_name
8
- @resource
9
- end
10
-
11
- helper_method :resources_name
12
-
13
- def resources_name
14
- @resource.to_s.pluralize.to_sym
15
- end
16
-
17
- helper_method :resource
18
-
19
- def resource
20
- instance_variable_get(:"@#{resource_name}")
21
- end
22
-
23
- helper_method :resources
24
-
25
- def resources
26
- instance_variable_get(:"@#{resources_name}")
27
- end
28
-
29
- def self.controller_prefix
30
- @@controller_prefix ||= [] # rubocop:disable Style/ClassVars
31
- end
32
-
33
- def self.controller_prefix_push(prefix)
34
- controller_prefix.push(*prefix.to_s.split('/').map(&:to_sym))
35
- end
36
-
37
- def controller_prefix
38
- self.class.controller_prefix
39
- end
40
- end
41
- end