active_record_api-rest 1.0.54 → 2.0.1

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: 898ffa7ea257eda6c96aa5279f453bd24b3ff689a7ec059ce1439167dd356c89
4
- data.tar.gz: a959ff84e4fc4c3451411e09f87a61f9e18b4aa695ef12b3aff6d6aaf18b84dd
3
+ metadata.gz: 651a4dbcd6458363f53f7927e065962ab7128a4bb5a10f2992692d930bd524b9
4
+ data.tar.gz: 9cf183d70bf89d81fd01cddae62cb651dbabc6ffb4ce8486f62cc00452908b84
5
5
  SHA512:
6
- metadata.gz: dc800667ca1920e8b9abd8df9ca54738005b8387cb0bee216d5d198d64a92a1a36181972f36e5833ee18fc78019fe2a96a519f3f85d54637888fa5d732881e4e
7
- data.tar.gz: 38d8bd4f2c21a7804376162318dcfd55c9b4f4bae8d4345db615e144c33806c270f856cca8aefc19146539a825b1bf020a868a9406ee8f81524d4e91a2dd682e
6
+ metadata.gz: 49d775122abd877d98846e40e7bf51fb6f5d19302858bdee3d40d34caf0cb6b07dde5a42abff6278d1106b94981d3129934c460727b0fcf597d0342d7fed6bdc
7
+ data.tar.gz: 7371ba23cc2adadc3f7b8e3efbf099c6694546a03b68695b0ec11e3707f0bd91634a14629b30b1b8d4ddec25b3f60905db2071abec2e39ccbb6b4ea0a6dcd5a9
data/.gitignore CHANGED
@@ -8,6 +8,7 @@
8
8
  /tmp/
9
9
  .idea
10
10
  /spec/dummy/log
11
+ vendor/
11
12
 
12
13
  # rspec failure tracking
13
14
  .rspec_status
@@ -1,33 +1,36 @@
1
1
  stages:
2
2
  - build
3
+ - test
3
4
  - deploy
4
5
  - qa
5
6
 
6
7
  code_quality:
7
8
  retry: 2
8
- stage: deploy
9
+ stage: test
10
+ allow_failure: true
9
11
  image: docker:stable
10
12
  variables:
11
13
  DOCKER_DRIVER: overlay2
12
14
  services:
13
15
  - docker:stable-dind
14
16
  script:
15
- - export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/')
16
17
  - docker run
17
18
  --env SOURCE_CODE="$PWD"
18
19
  --volume "$PWD":/code
19
- --volume /var/run/docker.sock:/var/run/docker.sock
20
- "registry.gitlab.com/gitlab-org/security-products/codequality:$SP_VERSION" /code
20
+ --volume /var/run/docker.sock:/var/run/docker.sock
21
+ "registry.gitlab.com/gitlab-org/ci-cd/codequality:0.85.10" /code
21
22
  artifacts:
22
23
  paths: [gl-code-quality-report.json]
23
24
  expire_in: 3 weeks
24
25
 
25
- .rspec:
26
- image: ruby:2.5.1
27
- stage: build
26
+ rspec:
27
+ image: ruby:2.7.1
28
+ stage: test
28
29
  variables:
29
- POSTGRES_USER: runner
30
- POSTGRES_PASSWORD: ""
30
+ POSTGRES_DB: active_record_api_rest_controller_test
31
+ POSTGRES_USER: postgres
32
+ POSTGRES_PASSWORD: postgres
33
+ POSTGRES_HOST_AUTH_METHOD: trust
31
34
  RAILS_ENV: test
32
35
  services:
33
36
  - docker:dind
@@ -48,14 +51,14 @@ codequality-verify:
48
51
  retry: 2
49
52
  stage: qa
50
53
  allow_failure: true
51
- image: ruby:2.5.1
54
+ image: ruby:2.7.1
52
55
  script:
53
56
  - ruby -r json -r yaml -e "puts JSON.parse(File.open('gl-code-quality-report.json', 'r', &:read)).to_yaml"
54
57
  - "! grep fingerprint gl-code-quality-report.json > /dev/null 2>&1"
55
58
 
56
59
  release:
57
60
  stage: deploy
58
- image: ruby:2.5.1
61
+ image: ruby:2.7.1
59
62
  before_script:
60
63
  - git config --global user.email dev@fullmeasureed.com
61
64
  - git config --global user.name fme-ci
@@ -64,7 +67,7 @@ release:
64
67
  - git fetch origin master
65
68
  - git checkout master
66
69
  - git branch -u origin/master
67
- - gem install gem-release -v 2.0.0.rc.3
70
+ - gem install gem-release
68
71
  script:
69
72
  - "echo -e \"---\n:rubygems_api_key: ${RUBYGEMS_KEY}\" > ~/.gem/credentials"
70
73
  - chmod 0600 ~/.gem/credentials
@@ -1,38 +1,51 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- active_record_api-rest (1.0.49)
4
+ active_record_api-rest (2.0.0)
5
5
  active_attr
6
6
  active_model_serializers
7
7
  oj
8
- rails (>= 5.1)
8
+ rails
9
9
 
10
10
  GEM
11
11
  remote: https://rubygems.org/
12
12
  specs:
13
- actioncable (5.2.3)
14
- actionpack (= 5.2.3)
13
+ actioncable (6.0.3.4)
14
+ actionpack (= 6.0.3.4)
15
15
  nio4r (~> 2.0)
16
16
  websocket-driver (>= 0.6.1)
17
- actionmailer (5.2.3)
18
- actionpack (= 5.2.3)
19
- actionview (= 5.2.3)
20
- activejob (= 5.2.3)
17
+ actionmailbox (6.0.3.4)
18
+ actionpack (= 6.0.3.4)
19
+ activejob (= 6.0.3.4)
20
+ activerecord (= 6.0.3.4)
21
+ activestorage (= 6.0.3.4)
22
+ activesupport (= 6.0.3.4)
23
+ mail (>= 2.7.1)
24
+ actionmailer (6.0.3.4)
25
+ actionpack (= 6.0.3.4)
26
+ actionview (= 6.0.3.4)
27
+ activejob (= 6.0.3.4)
21
28
  mail (~> 2.5, >= 2.5.4)
22
29
  rails-dom-testing (~> 2.0)
23
- actionpack (5.2.3)
24
- actionview (= 5.2.3)
25
- activesupport (= 5.2.3)
26
- rack (~> 2.0)
30
+ actionpack (6.0.3.4)
31
+ actionview (= 6.0.3.4)
32
+ activesupport (= 6.0.3.4)
33
+ rack (~> 2.0, >= 2.0.8)
27
34
  rack-test (>= 0.6.3)
28
35
  rails-dom-testing (~> 2.0)
29
- rails-html-sanitizer (~> 1.0, >= 1.0.2)
30
- actionview (5.2.3)
31
- activesupport (= 5.2.3)
36
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
37
+ actiontext (6.0.3.4)
38
+ actionpack (= 6.0.3.4)
39
+ activerecord (= 6.0.3.4)
40
+ activestorage (= 6.0.3.4)
41
+ activesupport (= 6.0.3.4)
42
+ nokogiri (>= 1.8.5)
43
+ actionview (6.0.3.4)
44
+ activesupport (= 6.0.3.4)
32
45
  builder (~> 3.1)
33
46
  erubi (~> 1.4)
34
47
  rails-dom-testing (~> 2.0)
35
- rails-html-sanitizer (~> 1.0, >= 1.0.3)
48
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
36
49
  active_attr (0.15.0)
37
50
  actionpack (>= 3.0.2, < 6.1)
38
51
  activemodel (>= 3.0.2, < 6.1)
@@ -42,155 +55,154 @@ GEM
42
55
  activemodel (>= 4.1, < 6.1)
43
56
  case_transform (>= 0.2)
44
57
  jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
45
- activejob (5.2.3)
46
- activesupport (= 5.2.3)
58
+ activejob (6.0.3.4)
59
+ activesupport (= 6.0.3.4)
47
60
  globalid (>= 0.3.6)
48
- activemodel (5.2.3)
49
- activesupport (= 5.2.3)
50
- activerecord (5.2.3)
51
- activemodel (= 5.2.3)
52
- activesupport (= 5.2.3)
53
- arel (>= 9.0)
54
- activestorage (5.2.3)
55
- actionpack (= 5.2.3)
56
- activerecord (= 5.2.3)
61
+ activemodel (6.0.3.4)
62
+ activesupport (= 6.0.3.4)
63
+ activerecord (6.0.3.4)
64
+ activemodel (= 6.0.3.4)
65
+ activesupport (= 6.0.3.4)
66
+ activestorage (6.0.3.4)
67
+ actionpack (= 6.0.3.4)
68
+ activejob (= 6.0.3.4)
69
+ activerecord (= 6.0.3.4)
57
70
  marcel (~> 0.3.1)
58
- activesupport (5.2.3)
71
+ activesupport (6.0.3.4)
59
72
  concurrent-ruby (~> 1.0, >= 1.0.2)
60
73
  i18n (>= 0.7, < 2)
61
74
  minitest (~> 5.1)
62
75
  tzinfo (~> 1.1)
63
- addressable (2.6.0)
64
- public_suffix (>= 2.0.2, < 4.0)
65
- arel (9.0.0)
66
- builder (3.2.3)
67
- byebug (11.0.1)
76
+ zeitwerk (~> 2.2, >= 2.2.2)
77
+ addressable (2.7.0)
78
+ public_suffix (>= 2.0.2, < 5.0)
79
+ builder (3.2.4)
80
+ byebug (11.1.3)
68
81
  case_transform (0.2)
69
82
  activesupport
70
- coderay (1.1.2)
71
- concurrent-ruby (1.1.5)
72
- crack (0.4.3)
73
- safe_yaml (~> 1.0.0)
74
- crass (1.0.4)
75
- database_cleaner (1.7.0)
76
- diff-lcs (1.3)
83
+ coderay (1.1.3)
84
+ concurrent-ruby (1.1.7)
85
+ crack (0.4.4)
86
+ crass (1.0.6)
87
+ database_cleaner (1.8.5)
88
+ diff-lcs (1.4.4)
77
89
  docile (1.3.2)
78
- erubi (1.8.0)
79
- factory_bot (5.0.2)
80
- activesupport (>= 4.2.0)
81
- factory_bot_rails (5.0.2)
82
- factory_bot (~> 5.0.2)
83
- railties (>= 4.2.0)
84
- faker (1.9.6)
85
- i18n (>= 0.7)
90
+ erubi (1.9.0)
91
+ factory_bot (6.1.0)
92
+ activesupport (>= 5.0.0)
93
+ factory_bot_rails (6.1.0)
94
+ factory_bot (~> 6.1.0)
95
+ railties (>= 5.0.0)
96
+ faker (2.14.0)
97
+ i18n (>= 1.6, < 2)
86
98
  globalid (0.4.2)
87
99
  activesupport (>= 4.2.0)
88
- hashdiff (1.0.0)
89
- i18n (1.6.0)
100
+ hashdiff (1.0.1)
101
+ i18n (1.8.5)
90
102
  concurrent-ruby (~> 1.0)
91
- json (2.2.0)
92
103
  json_spec (1.1.5)
93
104
  multi_json (~> 1.0)
94
105
  rspec (>= 2.0, < 4.0)
95
106
  jsonapi-renderer (0.2.2)
96
- loofah (2.2.3)
107
+ loofah (2.7.0)
97
108
  crass (~> 1.0.2)
98
109
  nokogiri (>= 1.5.9)
99
110
  mail (2.7.1)
100
111
  mini_mime (>= 0.1.1)
101
112
  marcel (0.3.3)
102
113
  mimemagic (~> 0.3.2)
103
- method_source (0.9.2)
104
- mimemagic (0.3.3)
114
+ method_source (1.0.0)
115
+ mimemagic (0.3.5)
105
116
  mini_mime (1.0.2)
106
117
  mini_portile2 (2.4.0)
107
- minitest (5.11.3)
108
- multi_json (1.13.1)
109
- nio4r (2.5.1)
110
- nokogiri (1.10.3)
118
+ minitest (5.14.2)
119
+ multi_json (1.15.0)
120
+ nio4r (2.5.4)
121
+ nokogiri (1.10.10)
111
122
  mini_portile2 (~> 2.4.0)
112
- oj (3.9.1)
113
- pg (1.1.4)
114
- pry (0.12.2)
115
- coderay (~> 1.1.0)
116
- method_source (~> 0.9.0)
117
- pry-byebug (3.7.0)
123
+ oj (3.10.15)
124
+ pg (1.2.3)
125
+ pry (0.13.1)
126
+ coderay (~> 1.1)
127
+ method_source (~> 1.0)
128
+ pry-byebug (3.9.0)
118
129
  byebug (~> 11.0)
119
- pry (~> 0.10)
120
- public_suffix (3.1.1)
121
- rack (2.0.7)
130
+ pry (~> 0.13.0)
131
+ public_suffix (4.0.6)
132
+ rack (2.2.3)
122
133
  rack-test (1.1.0)
123
134
  rack (>= 1.0, < 3)
124
- rails (5.2.3)
125
- actioncable (= 5.2.3)
126
- actionmailer (= 5.2.3)
127
- actionpack (= 5.2.3)
128
- actionview (= 5.2.3)
129
- activejob (= 5.2.3)
130
- activemodel (= 5.2.3)
131
- activerecord (= 5.2.3)
132
- activestorage (= 5.2.3)
133
- activesupport (= 5.2.3)
135
+ rails (6.0.3.4)
136
+ actioncable (= 6.0.3.4)
137
+ actionmailbox (= 6.0.3.4)
138
+ actionmailer (= 6.0.3.4)
139
+ actionpack (= 6.0.3.4)
140
+ actiontext (= 6.0.3.4)
141
+ actionview (= 6.0.3.4)
142
+ activejob (= 6.0.3.4)
143
+ activemodel (= 6.0.3.4)
144
+ activerecord (= 6.0.3.4)
145
+ activestorage (= 6.0.3.4)
146
+ activesupport (= 6.0.3.4)
134
147
  bundler (>= 1.3.0)
135
- railties (= 5.2.3)
148
+ railties (= 6.0.3.4)
136
149
  sprockets-rails (>= 2.0.0)
137
150
  rails-dom-testing (2.0.3)
138
151
  activesupport (>= 4.2.0)
139
152
  nokogiri (>= 1.6)
140
- rails-html-sanitizer (1.0.4)
141
- loofah (~> 2.2, >= 2.2.2)
142
- railties (5.2.3)
143
- actionpack (= 5.2.3)
144
- activesupport (= 5.2.3)
153
+ rails-html-sanitizer (1.3.0)
154
+ loofah (~> 2.3)
155
+ railties (6.0.3.4)
156
+ actionpack (= 6.0.3.4)
157
+ activesupport (= 6.0.3.4)
145
158
  method_source
146
159
  rake (>= 0.8.7)
147
- thor (>= 0.19.0, < 2.0)
148
- rake (10.5.0)
149
- rspec (3.8.0)
150
- rspec-core (~> 3.8.0)
151
- rspec-expectations (~> 3.8.0)
152
- rspec-mocks (~> 3.8.0)
153
- rspec-core (3.8.2)
154
- rspec-support (~> 3.8.0)
155
- rspec-expectations (3.8.4)
160
+ thor (>= 0.20.3, < 2.0)
161
+ rake (13.0.1)
162
+ rspec (3.9.0)
163
+ rspec-core (~> 3.9.0)
164
+ rspec-expectations (~> 3.9.0)
165
+ rspec-mocks (~> 3.9.0)
166
+ rspec-core (3.9.3)
167
+ rspec-support (~> 3.9.3)
168
+ rspec-expectations (3.9.2)
156
169
  diff-lcs (>= 1.2.0, < 2.0)
157
- rspec-support (~> 3.8.0)
158
- rspec-mocks (3.8.1)
170
+ rspec-support (~> 3.9.0)
171
+ rspec-mocks (3.9.1)
159
172
  diff-lcs (>= 1.2.0, < 2.0)
160
- rspec-support (~> 3.8.0)
161
- rspec-rails (3.8.2)
162
- actionpack (>= 3.0)
163
- activesupport (>= 3.0)
164
- railties (>= 3.0)
165
- rspec-core (~> 3.8.0)
166
- rspec-expectations (~> 3.8.0)
167
- rspec-mocks (~> 3.8.0)
168
- rspec-support (~> 3.8.0)
169
- rspec-support (3.8.2)
170
- safe_yaml (1.0.5)
171
- simplecov (0.17.0)
173
+ rspec-support (~> 3.9.0)
174
+ rspec-rails (4.0.1)
175
+ actionpack (>= 4.2)
176
+ activesupport (>= 4.2)
177
+ railties (>= 4.2)
178
+ rspec-core (~> 3.9)
179
+ rspec-expectations (~> 3.9)
180
+ rspec-mocks (~> 3.9)
181
+ rspec-support (~> 3.9)
182
+ rspec-support (3.9.3)
183
+ simplecov (0.19.0)
172
184
  docile (~> 1.1)
173
- json (>= 1.8, < 3)
174
- simplecov-html (~> 0.10.0)
175
- simplecov-html (0.10.2)
176
- sprockets (3.7.2)
185
+ simplecov-html (~> 0.11)
186
+ simplecov-html (0.12.3)
187
+ sprockets (4.0.2)
177
188
  concurrent-ruby (~> 1.0)
178
189
  rack (> 1, < 3)
179
- sprockets-rails (3.2.1)
190
+ sprockets-rails (3.2.2)
180
191
  actionpack (>= 4.0)
181
192
  activesupport (>= 4.0)
182
193
  sprockets (>= 3.0.0)
183
- thor (0.20.3)
194
+ thor (1.0.1)
184
195
  thread_safe (0.3.6)
185
- tzinfo (1.2.5)
196
+ tzinfo (1.2.7)
186
197
  thread_safe (~> 0.1)
187
- webmock (3.6.0)
198
+ webmock (3.9.3)
188
199
  addressable (>= 2.3.6)
189
200
  crack (>= 0.3.2)
190
201
  hashdiff (>= 0.4.0, < 2.0.0)
191
- websocket-driver (0.7.1)
202
+ websocket-driver (0.7.3)
192
203
  websocket-extensions (>= 0.1.0)
193
- websocket-extensions (0.1.4)
204
+ websocket-extensions (0.1.5)
205
+ zeitwerk (2.4.0)
194
206
 
195
207
  PLATFORMS
196
208
  ruby
@@ -198,7 +210,7 @@ PLATFORMS
198
210
  DEPENDENCIES
199
211
  active_model_serializers
200
212
  active_record_api-rest!
201
- bundler (~> 1.16)
213
+ bundler
202
214
  database_cleaner
203
215
  factory_bot_rails
204
216
  faker
@@ -206,11 +218,11 @@ DEPENDENCIES
206
218
  pg
207
219
  pry
208
220
  pry-byebug
209
- rake (~> 10.0)
210
- rspec (~> 3.0)
221
+ rake
222
+ rspec
211
223
  rspec-rails
212
224
  simplecov
213
225
  webmock
214
226
 
215
227
  BUNDLED WITH
216
- 1.17.3
228
+ 2.1.4
@@ -5,15 +5,15 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
  require 'active_record_api/rest/version'
6
6
 
7
7
  Gem::Specification.new do |spec|
8
- spec.name = 'active_record_api-rest'
9
- spec.version = ActiveRecordApi::Rest::VERSION
10
- spec.authors = ['Full Measure Education']
11
- spec.email = ['devops@fullmeasureed.com']
8
+ spec.name = 'active_record_api-rest'
9
+ spec.version = ActiveRecordApi::Rest::VERSION
10
+ spec.authors = ['Full Measure Education']
11
+ spec.email = ['devops@fullmeasureed.com']
12
12
 
13
- spec.summary = 'A simple library for RESTful rails controllers.'
14
- spec.description = 'A simple library for RESTful rails controllers.'
15
- spec.homepage = 'https://gitlab.com/fullmeasure/public/gems/active_record_api-rest_controller'
16
- spec.license = 'MIT'
13
+ spec.summary = 'A simple library for RESTful rails controllers.'
14
+ spec.description = 'A simple library for RESTful rails controllers.'
15
+ spec.homepage = 'https://gitlab.com/fullmeasure/public/gems/active_record_api-rest_controller'
16
+ spec.license = 'MIT'
17
17
 
18
18
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
19
19
  # to allow pushing to a single host or delete this section to allow pushing to any host.
@@ -23,20 +23,20 @@ Gem::Specification.new do |spec|
23
23
  raise 'RubyGems 2.0 or newer is required to protect against public gem pushes.'
24
24
  end
25
25
 
26
- spec.files = `git ls-files -z`.split("\x0").reject do |f|
26
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
27
27
  f.match(%r{^(test|spec|features)/})
28
28
  end
29
- spec.bindir = 'exe'
30
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
29
+ spec.bindir = 'exe'
30
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
31
31
  spec.require_paths = ['lib']
32
32
 
33
- spec.add_development_dependency 'bundler', '~> 1.16'
33
+ spec.add_development_dependency 'bundler'
34
34
  spec.add_development_dependency 'factory_bot_rails'
35
- spec.add_development_dependency 'rake', '~> 10.0'
36
- spec.add_development_dependency 'rspec', '~> 3.0'
35
+ spec.add_development_dependency 'rake'
36
+ spec.add_development_dependency 'rspec'
37
37
  spec.add_development_dependency 'rspec-rails'
38
38
  spec.add_dependency 'active_attr'
39
39
  spec.add_dependency 'oj'
40
40
  spec.add_dependency 'active_model_serializers'
41
- spec.add_dependency 'rails', '>= 5.1'
41
+ spec.add_dependency 'rails'
42
42
  end
@@ -6,10 +6,6 @@ module ActiveRecordApi
6
6
 
7
7
  protected
8
8
 
9
- def initialize_model
10
- @model = authorized_models
11
- end
12
-
13
9
  def authorize
14
10
  raise BadSessionException.new(controller_name, action_name) if fullmeasure_session.nil?
15
11
  raise AccessDeniedException.new(controller_name, action_name, 'Insufficient permissions') unless can?
@@ -19,10 +15,6 @@ module ActiveRecordApi
19
15
  @can ||= policy.can?
20
16
  end
21
17
 
22
- def authorized_models
23
- @authorized_models ||= policy.authorized_models
24
- end
25
-
26
18
  def policy
27
19
  @policy ||= policy_klass.new(
28
20
  fullmeasure_session: fullmeasure_session,
@@ -30,12 +22,12 @@ module ActiveRecordApi
30
22
  action_name: action_name,
31
23
  params: params,
32
24
  queryable_params: queryable_params,
33
- modifiable_params: modifiable_params
25
+ modifiable_params: modifiable_params,
34
26
  )
35
27
  end
36
28
 
37
29
  def policy_klass
38
- "#{self.class.name.remove(/Controller$/)}Policy".safe_constantize || Policy
30
+ "Policy::#{self.class.name.remove(/Controller$/)}Policy".safe_constantize || "#{self.class.name.remove(/Controller$/)}Policy".safe_constantize || Policy
39
31
  end
40
32
  end
41
33
  end
@@ -5,14 +5,11 @@ module ActiveRecordApi
5
5
  include ActiveAttr::Model
6
6
  attr_accessor :fullmeasure_session, :model_klass, :action_name, :modifiable_params, :queryable_params, :params
7
7
 
8
- def authorized_models
9
- send(action_name)
10
- end
11
-
12
8
  def can?
13
9
  send("can_#{action_name}?")
14
10
  end
15
11
 
12
+ # :nocov:
16
13
  def can_manage?
17
14
  false
18
15
  end
@@ -20,6 +17,7 @@ module ActiveRecordApi
20
17
  def can_read?
21
18
  false
22
19
  end
20
+ # :nocov:
23
21
 
24
22
  protected
25
23
 
@@ -31,9 +29,11 @@ module ActiveRecordApi
31
29
  can_read? || can_manage?
32
30
  end
33
31
 
32
+ # :nocov:
34
33
  def can_new?
35
34
  can_read? || can_manage?
36
35
  end
36
+ # :nocov:
37
37
 
38
38
  def can_create?
39
39
  can_manage?
@@ -46,34 +46,6 @@ module ActiveRecordApi
46
46
  def can_destroy?
47
47
  can_manage?
48
48
  end
49
-
50
- def can_destroy_by?
51
- can_manage?
52
- end
53
-
54
- def index
55
- model_klass.where('1=0')
56
- end
57
-
58
- def show
59
- model_klass.where('1=0')
60
- end
61
-
62
- def new
63
- model_klass.where('1=0')
64
- end
65
-
66
- def create
67
- model_klass.new
68
- end
69
-
70
- def update
71
- model_klass.where('1=0')
72
- end
73
-
74
- def destroy_by
75
- model_klass.where('1=0')
76
- end
77
49
  end
78
50
  end
79
51
  end
@@ -2,25 +2,27 @@ module ActiveRecordApi
2
2
  module Rest
3
3
  class Controller < ApplicationController
4
4
  include GracefulErrors
5
- delegate :previous_id, :limit, :queryable_params, :modifiable_params, :not_allowed_params, to: :parameters
6
- delegate :next_url, :redirect_url, to: :request_url_generator
5
+ delegate :previous_id, :limit, :offset, :page, :queryable_params, :modifiable_params, :not_allowed_params, :required_parameters, to: :parameters
6
+ delegate :next_url, to: :request_url_generator
7
7
  before_action :initialize_model, only: :create
8
8
  before_action :validate_params
9
9
 
10
10
  def index
11
11
  response.headers['x-total'] = models_count
12
12
  response.headers['x-link-next'] = next_url unless next_url.nil?
13
- render json: models_remaining.limit(limit), each_serializer: serializer
13
+ render json: models_full_results.limit(limit).offset(offset).order(:id => :asc), each_serializer: serializer
14
14
  end
15
15
 
16
16
  def show
17
17
  render json: model, serializer: serializer
18
18
  end
19
19
 
20
+ # :nocov:
20
21
  def new
21
22
  action = request.query_parameters[:action]
22
23
  render json: authorized_models.send(action, queryable_params.deep_symbolize_keys), serializer: serializer
23
24
  end
25
+ # :nocov:
24
26
 
25
27
  def create
26
28
  if model.save
@@ -42,26 +44,17 @@ module ActiveRecordApi
42
44
  if model.destroy
43
45
  render json: model
44
46
  else
47
+ # :nocov:
45
48
  render json: model.errors, status: :unprocessable_entity
46
- end
47
- end
48
-
49
- def destroy_by
50
- found_model = authorized_models.find_by(queryable_params)
51
- if !found_model
52
- head :not_found
53
- elsif found_model.destroy
54
- render json: found_model
55
- else
56
- render json: found_model.errors, status: :unprocessable_entity
49
+ # :nocov:
57
50
  end
58
51
  end
59
52
 
60
53
  protected
61
54
 
62
55
  def validate_params
63
- return unless not_allowed_params.present?
64
- render json: { base: "Extra parameters are not allow: #{not_allowed_params.join(', ')}" }, status: :unprocessable_entity
56
+ render json: { base: "Extra parameters are not allow: #{not_allowed_params.join(', ')}" }, status: :unprocessable_entity if not_allowed_params.present?
57
+ render json: { base: "Missing parameters: #{required_parameters.join(', ')}" }, status: :unprocessable_entity if required_parameters.present?
65
58
  end
66
59
 
67
60
  def model
@@ -69,21 +62,13 @@ module ActiveRecordApi
69
62
  end
70
63
 
71
64
  def models_full_results
72
- return @models_full_results unless @models_full_results.nil?
73
- @models_full_results = authorized_models.where(queryable_params).order(pagination_param_name => pagination_param_direction)
65
+ @models_full_results ||= authorized_models.where(queryable_params)
74
66
  end
75
67
 
76
68
  def models_count
77
69
  @total = models_full_results.count
78
70
  end
79
71
 
80
- def models_remaining
81
- return @models_remaining unless @models_remaining.nil?
82
- @models_remaining = models_full_results
83
- @models_remaining = @models_remaining&.where("\"#{pagination_param_name}\" > ?", pagination_param_value) if pagination_param_value.present?
84
- @models_remaining
85
- end
86
-
87
72
  def initialize_model
88
73
  @model = model_klass.new(modifiable_params)
89
74
  end
@@ -96,18 +81,6 @@ module ActiveRecordApi
96
81
  @model_klass ||= controller_name.classify.constantize
97
82
  end
98
83
 
99
- def pagination_param_name
100
- @pagination_param_name ||= params[:pagination_param] || :id
101
- end
102
-
103
- def pagination_param_direction
104
- @pagination_param_direction ||= params[:pagination_param_direction] || :asc # from params
105
- end
106
-
107
- def pagination_param_value
108
- @pagination_param_value ||= params[pagination_param_name]
109
- end
110
-
111
84
  def serializer
112
85
  "#{model_klass.name}Serializer".safe_constantize
113
86
  end
@@ -116,9 +89,8 @@ module ActiveRecordApi
116
89
  @parameters ||= Parameters.new(
117
90
  model_klass: model_klass,
118
91
  controller_name: controller_name,
119
- pagination_param_name: pagination_param_name,
120
92
  params: params,
121
- action_name: action_name
93
+ action_name: action_name,
122
94
  )
123
95
  end
124
96
 
@@ -126,18 +98,10 @@ module ActiveRecordApi
126
98
  RequestUrlGenerator.new(
127
99
  action_name: action_name,
128
100
  request: request,
129
- models_remaining: models_remaining,
130
101
  parameters: parameters,
131
102
  total_count: models_count,
132
- pagination_param_name: pagination_param_name
133
103
  )
134
104
  end
135
-
136
- def pagination_param_column_definition
137
- @column_definition = model_klass.columns.detect do |column|
138
- column.name.to_sym == pagination_param_name
139
- end
140
- end
141
105
  end
142
106
  end
143
107
  end
@@ -8,10 +8,6 @@ module ActiveRecordApi
8
8
  render status: :not_found, json: { base: exception.message }
9
9
  end
10
10
 
11
- rescue_from ActiveRecordApi::Rest::Auth::BadRequestException do |exception|
12
- render status: :bad_request, json: { base: 'Bad Request', message: exception.message }
13
- end
14
-
15
11
  rescue_from ActiveRecordApi::Rest::Auth::BadSessionException do |exception|
16
12
  render status: :unauthorized, json: { base: "No user for fullmeasure_session on #{exception.action} #{exception.controller}", message: exception.message }
17
13
  end
@@ -2,7 +2,7 @@ module ActiveRecordApi
2
2
  module Rest
3
3
  class Parameters
4
4
  include ActiveAttr::Model
5
- attr_accessor :model_klass, :pagination_param_name, :params, :controller_name, :action_name, :additional_valid_params
5
+ attr_accessor :model_klass, :params, :controller_name, :action_name, :additional_valid_params
6
6
 
7
7
  def modifiable_params
8
8
  @modifiable ||= params.permit!.to_h.select! { |key, _value| valid_params(modifiable_names).include?(key.to_sym) }
@@ -21,8 +21,28 @@ module ActiveRecordApi
21
21
  @limit ||= params[:limit]&.to_i || 50
22
22
  end
23
23
 
24
+ def offset
25
+ @offset ||= (params[:offset]&.to_i || 0) + (limit * (page - 1))
26
+ end
27
+
28
+ def page
29
+ @page ||= params[:page]&.to_i || 1
30
+ end
31
+
32
+ def additional_valid_params
33
+ []
34
+ end
35
+
36
+ def rest_valid_params
37
+ [:limit, :offset, :page]
38
+ end
39
+
24
40
  def not_allowed_params
25
- @not_allowed_params ||= clean_request_names - (valid_params(queryable_names) + Array.wrap(additional_valid_params))
41
+ @not_allowed_params ||= clean_request_names - (valid_params(queryable_names) + Array.wrap(rest_valid_params) + Array.wrap(additional_valid_params))
42
+ end
43
+
44
+ def required_parameters
45
+ []
26
46
  end
27
47
 
28
48
  protected
@@ -1,32 +1,23 @@
1
1
  require 'active_attr'
2
+
2
3
  module ActiveRecordApi
3
4
  module Rest
4
5
  class RequestUrlGenerator
5
6
  include ActiveAttr::Model
6
7
  attribute :request
7
8
  attribute :action_name
8
- attribute :models_remaining
9
- attribute :pagination_param_name
10
9
  attribute :parameters
11
10
  attribute :total_count
12
11
  delegate :host_with_port, :path, :query_parameters, to: :request
13
- delegate :limit, to: :parameters
12
+ delegate :limit, :offset, :page, to: :parameters
14
13
 
15
14
  def next_url
16
- return if total_count == 0 || models_remaining.count <= limit
15
+ return if total_count == 0 || total_count <= (page + 1) * limit
17
16
  "#{current_url}?#{new_params.to_param}"
18
17
  end
19
18
 
20
- def redirect_url(model)
21
- if action_name == 'update'
22
- current_url
23
- else
24
- "#{current_url}/#{model.id}"
25
- end
26
- end
27
-
28
19
  def new_params
29
- query_parameters.dup.merge(pagination_param_name.to_s => models_remaining.limit(limit).last.send(pagination_param_name))
20
+ query_parameters.dup.merge('page' => page + 1)
30
21
  end
31
22
 
32
23
  def current_url
@@ -38,8 +29,7 @@ module ActiveRecordApi
38
29
  end
39
30
 
40
31
  def protocol
41
- return 'http://' if Rails.env.development?
42
- 'https://'
32
+ Rails.env.development? ? 'http://' : 'https://'
43
33
  end
44
34
  end
45
35
  end
@@ -1,12 +1,9 @@
1
1
  shared_examples 'all::rest::actions' do
2
- let(:authorize_read) { mock_valid_auth([permission_name(model_klass, 'read')]) }
3
- let(:unauthorize_read) { mock_valid_auth([permission_name(model_klass, '')]) }
4
- let(:authorize_create) { mock_valid_auth([permission_name(model_klass, 'manage')]) }
5
- let(:unauthorize_create) { mock_valid_auth([permission_name(model_klass, '')]) }
6
- let(:authorize_update) { mock_valid_auth([permission_name(model_klass, 'manage')]) }
7
- let(:unauthorize_update) { mock_valid_auth([permission_name(model_klass, '')]) }
8
- let(:authorize_delete) { mock_valid_auth([permission_name(model_klass, 'manage')]) }
9
- let(:unauthorize_delete) { mock_valid_auth([permission_name(model_klass, '')]) }
2
+ let(:authorize_read) { mock_valid_auth('read') }
3
+ let(:authorize_create) { mock_valid_auth('manage') }
4
+ let(:authorize_update) { mock_valid_auth('manage') }
5
+ let(:authorize_delete) { mock_valid_auth('manage') }
6
+
10
7
  let(:factory_symbol) { model_klass.to_s.underscore.to_sym }
11
8
  let(:model_array) { [model] + create_list(factory_symbol, 4) }
12
9
  let(:base_model_klass) do
@@ -16,7 +13,7 @@ shared_examples 'all::rest::actions' do
16
13
  model_klass.superclass
17
14
  end
18
15
  end
19
- let(:host) { ActiveRecordApi::Rest::RequestUrlGenerator.new(request: request).micro_service_url }
16
+ let(:host) { ActiveRecordApi::Rest::RequestUrlGenerator.new(request: request).current_url }
20
17
  let(:create_new_attributes) { serializer.new(model).as_json.except(:id) }
21
18
  let(:update_new_attributes) { serializer.new(model).as_json }
22
19
  let(:update_invalid_attributes) { serializer.new(update_invalid_model).as_json.merge(id: model.id) }
@@ -60,7 +57,7 @@ shared_examples 'get::show' do
60
57
  end
61
58
  context 'when not authorized' do
62
59
  before(:each) do
63
- unauthorize_read
60
+ request.headers['session'] = {}
64
61
  get :show, params: { id: model.to_param }
65
62
  end
66
63
  it { expect(response.status).to eq 403 }
@@ -93,23 +90,19 @@ shared_examples 'get::index' do
93
90
  end
94
91
 
95
92
  context 'when paged results' do
96
- let(:previous_id) { model_klass.limit(1).pluck(:id).first }
97
- let(:next_previous_id) { model_klass.where('id > ?', previous_id).limit(1).pluck(:id).last }
98
93
  before(:each) do
99
94
  model_array
100
- get :index, params: { previous_id: previous_id, limit: 1 }
95
+ get :index, params: { limit: 1, offset: 1 }
101
96
  end
102
97
  it { expect(response.status).to eq 200 }
103
98
  it { expect(response.headers['x-total']).to eq model_array.length }
104
- it { expect(response.headers['x-link-next']).to eq "#{host}#{request.path}?limit=1&previous_id=#{next_previous_id}" }
105
- it { expect(response.body).to be_json_eql model_klass.where('id > ?', previous_id).limit(1).map { |o| serializer.new(o) }.to_json }
99
+ it { expect(response.headers['x-link-next']).to eq "#{host}?limit=1&offset=1&page=2" }
100
+ it { expect(response.body).to be_json_eql model_klass.offset(1).limit(1).map { |o| serializer.new(o) }.to_json }
106
101
  end
107
102
  end
108
103
  context 'when not authorized' do
109
104
  before(:each) do
110
- unauthorize_read
111
- end
112
- before(:each) do
105
+ request.headers['session'] = {}
113
106
  get :index
114
107
  end
115
108
  it { expect(response.status).to eq 403 }
@@ -131,8 +124,7 @@ shared_examples 'put::update' do
131
124
  before(:each) do
132
125
  put :update, params: new_attributes
133
126
  end
134
- it { expect(response.status).to eq 303 }
135
- it { expect(response).to redirect_to "#{host}#{relative_url}" }
127
+ it { expect(response.status).to eq 200 }
136
128
  end
137
129
  context 'when invalid param values provided' do
138
130
  before(:each) do
@@ -152,7 +144,7 @@ shared_examples 'put::update' do
152
144
  end
153
145
  context 'when not authorized' do
154
146
  before(:each) do
155
- unauthorize_update
147
+ request.headers['session'] = {}
156
148
  get :show, params: new_attributes
157
149
  end
158
150
  it { expect(response.status).to eq 403 }
@@ -162,9 +154,8 @@ shared_examples 'put::update' do
162
154
  end
163
155
 
164
156
  shared_examples 'post::create' do
165
- let(:new_attributes) { serializer.new(model).as_json.except(:id) }
166
157
  let(:model_id) { model.id }
167
- let(:relative_url) { Rails.application.routes.url_helpers.url_for(controller: base_model_klass.to_s.underscore.pluralize, action: 'show', id: model_klass.last.id, only_path: true) }
158
+ let(:new_params) { serializer.new(model).as_json(except: [:id]) }
168
159
  describe 'POST create' do
169
160
  context 'when authorized' do
170
161
  before(:each) do
@@ -181,16 +172,23 @@ shared_examples 'post::create' do
181
172
  it 'creates record with attributes' do
182
173
  model.delete
183
174
  expect {
184
- post :create, params: new_attributes
185
- expect(response).to redirect_to "#{host}#{relative_url}"
175
+ post :create, params: new_params
186
176
  }.to change(model_klass, :count).by(1)
177
+ expect(response.status).to eq 200
178
+ expect(JSON.parse(response.body).keys).to contain_exactly('id',
179
+ 'organization_id',
180
+ 'column1',
181
+ 'column2',
182
+ 'column3',
183
+ 'created_at',
184
+ 'updated_at')
187
185
  expect(model_klass.last.id).not_to eq model_id
188
186
  end
189
187
  end
190
188
  end
191
189
  context 'when not authorized' do
192
190
  before(:each) do
193
- unauthorize_create
191
+ request.headers['session'] = {}
194
192
  post :create, params: new_attributes
195
193
  end
196
194
  it { expect(response.status).to eq 403 }
@@ -214,7 +212,7 @@ shared_examples 'delete::delete' do
214
212
  end
215
213
  context 'when not authorized' do
216
214
  before(:each) do
217
- unauthorize_delete
215
+ request.headers['session'] = {}
218
216
  delete :destroy, params: { id: model.id }
219
217
  end
220
218
  it { expect(response.status).to eq 403 }
@@ -2,6 +2,6 @@
2
2
 
3
3
  module ActiveRecordApi
4
4
  module Rest
5
- VERSION = '1.0.54'.freeze
5
+ VERSION = '2.0.1'.freeze
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_record_api-rest
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.54
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Full Measure Education
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-01-06 00:00:00.000000000 Z
11
+ date: 2020-10-22 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.16'
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.16'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: factory_bot_rails
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -42,30 +42,30 @@ dependencies:
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '10.0'
47
+ version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '10.0'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '3.0'
61
+ version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '3.0'
68
+ version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec-rails
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -128,14 +128,14 @@ dependencies:
128
128
  requirements:
129
129
  - - ">="
130
130
  - !ruby/object:Gem::Version
131
- version: '5.1'
131
+ version: '0'
132
132
  type: :runtime
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - ">="
137
137
  - !ruby/object:Gem::Version
138
- version: '5.1'
138
+ version: '0'
139
139
  description: A simple library for RESTful rails controllers.
140
140
  email:
141
141
  - devops@fullmeasureed.com
@@ -190,8 +190,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
190
190
  - !ruby/object:Gem::Version
191
191
  version: '0'
192
192
  requirements: []
193
- rubyforge_project:
194
- rubygems_version: 2.7.7
193
+ rubygems_version: 3.1.2
195
194
  signing_key:
196
195
  specification_version: 4
197
196
  summary: A simple library for RESTful rails controllers.