json_api_toolbox 1.2.0 → 2.0.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
- SHA1:
3
- metadata.gz: 7038c336858ee4ac23c97beaab29792b1ded14e7
4
- data.tar.gz: 94f61f5dee12030051d01bf760aed3e8976fa78b
2
+ SHA256:
3
+ metadata.gz: fc9706da38e740273930904f1f8c2921fa7172ac47f73a1f4130683c5774c624
4
+ data.tar.gz: dd5b01dfad5c434d8b569769ad6149da78e317aaa8bb3f58102e1eb53b8f4630
5
5
  SHA512:
6
- metadata.gz: 51f83d87385cce4c0830c6dbede7e304f5ffe47e32de626e5aed3915a54d9eb3962eb8146218bf5689aa0a90c14a27ffc3d57ff0fe7c66710279508b86f80d10
7
- data.tar.gz: 4056d9c5a4fe7a1457b8a5afb76d98302beac94a0faf5b5afcd02f88aba23403ea133b9f0f0486ac3ddd032d0a4192e61b273f5b425e79c859c8a711ae78a743
6
+ metadata.gz: 91111bdba8cbe7562eb92f1b73172fbefbf062c501e298546ff6a795573e585ee3e53dfcafeee86a78631735f8b5f8935d5f9f11e499f3a7f8e64de60425b399
7
+ data.tar.gz: 11a64750e2c53a541e9df20bce0032d122352bfacbf976500ebb22c1c8a2f949a9f93ee50570bb7dcf99dc905382b348c5e6089f9d5e3ac13fdb26c141499873
data/.gitignore CHANGED
@@ -1,6 +1,5 @@
1
1
  /.bundle/
2
2
  /.yardoc
3
- /Gemfile.lock
4
3
  /_yardoc/
5
4
  /coverage/
6
5
  /doc/
@@ -10,3 +9,5 @@
10
9
 
11
10
  # rspec failure tracking
12
11
  .rspec_status
12
+
13
+ .rubocop.base.yml
data/.rubocop.yml ADDED
@@ -0,0 +1,6 @@
1
+ inherit_from:
2
+ - '.rubocop.base.yml'
3
+
4
+ AllCops:
5
+ TargetRubyVersion: 2.6
6
+ SuggestExtensions: false
data/CHANGELOG.md CHANGED
@@ -5,9 +5,45 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
5
5
  and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
6
6
 
7
7
  ## [Unreleased]
8
+
9
+ ## [2.0.0] - 2021-06-23
8
10
  ### Added
11
+ - New README file describing the gem and it's uses
12
+ - Added support for default rubocop config
13
+ - New setup script
14
+ - Added docker to run rubocop and rspec
15
+
16
+ ### Changed
17
+ - New 2.0 branch! With better support for semver and ruby updates
18
+ - Moved the rspec examples file for easier manual import
19
+ - Updated all dependencies
20
+ - Moved some dependencies into development dependencies
21
+
22
+ ### Removed
23
+ - Removed support for ruby 2.5 series
24
+ - Removed unneeded files (old CI files, ruby version lock, etc…)
25
+ - Removed auto import for rspec examples. It now need to be added manually on `rails_helper.rb`
9
26
 
10
27
  ## [Released]
28
+
29
+ ## [1.5.1] - 2021-05-26
30
+ ### Fixed
31
+ - Fixed a pagination bug that happened when building the resource_path from the controller name
32
+
33
+ ## [1.5.0] - 2021-02-04
34
+ ### Added
35
+ - Require `will_paginate`
36
+ - Remove limit of version to `log_toolbox` dependence
37
+ - Update ruby of 2.4.x to 2.5.x
38
+
39
+ ## [1.4.0] - 2020‑11‑16
40
+ ### Added
41
+ - Adding per_page limit
42
+
43
+ ## [1.3.0] - 2020-02-19
44
+ ### Added
45
+ - Remove gem rescue responsibility
46
+
11
47
  ## [1.2.0] - 2020-01-16
12
48
  ### Added
13
49
  - Added param `headers` to `#get`, `#post`, `#patch`, `#put`, to send extra headers
data/Dockerfile ADDED
@@ -0,0 +1,18 @@
1
+ FROM ruby:2.6-alpine
2
+
3
+ RUN apk update \
4
+ && apk upgrade \
5
+ && apk add --update \
6
+ git \
7
+ openssh \
8
+ build-base \
9
+ && rm -rf /var/cache/apk/*
10
+
11
+ RUN gem update --system
12
+
13
+ WORKDIR /gem
14
+ COPY . .
15
+
16
+ ENTRYPOINT ["sh", "docker-entrypoint.sh"]
17
+
18
+ CMD ["rake", "lint-and-test"]
data/Gemfile.lock ADDED
@@ -0,0 +1,237 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ json_api_toolbox (2.0.0)
5
+ activerecord (>= 5.1.0)
6
+ activesupport (>= 5.1.0)
7
+ json-api-vanilla
8
+ jsonapi-serializable
9
+ log_toolbox
10
+ request_store
11
+ rest-client
12
+ will_paginate
13
+
14
+ GEM
15
+ remote: https://rubygems.org/
16
+ specs:
17
+ actioncable (6.1.4)
18
+ actionpack (= 6.1.4)
19
+ activesupport (= 6.1.4)
20
+ nio4r (~> 2.0)
21
+ websocket-driver (>= 0.6.1)
22
+ actionmailbox (6.1.4)
23
+ actionpack (= 6.1.4)
24
+ activejob (= 6.1.4)
25
+ activerecord (= 6.1.4)
26
+ activestorage (= 6.1.4)
27
+ activesupport (= 6.1.4)
28
+ mail (>= 2.7.1)
29
+ actionmailer (6.1.4)
30
+ actionpack (= 6.1.4)
31
+ actionview (= 6.1.4)
32
+ activejob (= 6.1.4)
33
+ activesupport (= 6.1.4)
34
+ mail (~> 2.5, >= 2.5.4)
35
+ rails-dom-testing (~> 2.0)
36
+ actionpack (6.1.4)
37
+ actionview (= 6.1.4)
38
+ activesupport (= 6.1.4)
39
+ rack (~> 2.0, >= 2.0.9)
40
+ rack-test (>= 0.6.3)
41
+ rails-dom-testing (~> 2.0)
42
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
43
+ actiontext (6.1.4)
44
+ actionpack (= 6.1.4)
45
+ activerecord (= 6.1.4)
46
+ activestorage (= 6.1.4)
47
+ activesupport (= 6.1.4)
48
+ nokogiri (>= 1.8.5)
49
+ actionview (6.1.4)
50
+ activesupport (= 6.1.4)
51
+ builder (~> 3.1)
52
+ erubi (~> 1.4)
53
+ rails-dom-testing (~> 2.0)
54
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
55
+ activejob (6.1.4)
56
+ activesupport (= 6.1.4)
57
+ globalid (>= 0.3.6)
58
+ activemodel (6.1.4)
59
+ activesupport (= 6.1.4)
60
+ activerecord (6.1.4)
61
+ activemodel (= 6.1.4)
62
+ activesupport (= 6.1.4)
63
+ activestorage (6.1.4)
64
+ actionpack (= 6.1.4)
65
+ activejob (= 6.1.4)
66
+ activerecord (= 6.1.4)
67
+ activesupport (= 6.1.4)
68
+ marcel (~> 1.0.0)
69
+ mini_mime (>= 1.1.0)
70
+ activesupport (6.1.4)
71
+ concurrent-ruby (~> 1.0, >= 1.0.2)
72
+ i18n (>= 1.6, < 2)
73
+ minitest (>= 5.1)
74
+ tzinfo (~> 2.0)
75
+ zeitwerk (~> 2.3)
76
+ ast (2.4.2)
77
+ builder (3.2.4)
78
+ byebug (11.1.3)
79
+ coderay (1.1.3)
80
+ concurrent-ruby (1.1.9)
81
+ crass (1.0.6)
82
+ diff-lcs (1.4.4)
83
+ domain_name (0.5.20190701)
84
+ unf (>= 0.0.5, < 1.0.0)
85
+ erubi (1.10.0)
86
+ globalid (0.4.2)
87
+ activesupport (>= 4.2.0)
88
+ http-accept (1.7.0)
89
+ http-cookie (1.0.4)
90
+ domain_name (~> 0.5)
91
+ i18n (1.8.10)
92
+ concurrent-ruby (~> 1.0)
93
+ json-api-vanilla (1.0.2)
94
+ jsonapi-renderer (0.2.2)
95
+ jsonapi-serializable (0.3.1)
96
+ jsonapi-renderer (~> 0.2.0)
97
+ log_toolbox (1.3.11)
98
+ lograge (>= 0.11.1)
99
+ logstash-event (>= 1.2.02)
100
+ logstash-logger (>= 0.26.1)
101
+ rails (>= 5.0)
102
+ lograge (0.11.2)
103
+ actionpack (>= 4)
104
+ activesupport (>= 4)
105
+ railties (>= 4)
106
+ request_store (~> 1.0)
107
+ logstash-event (1.2.02)
108
+ logstash-logger (0.26.1)
109
+ logstash-event (~> 1.2)
110
+ loofah (2.10.0)
111
+ crass (~> 1.0.2)
112
+ nokogiri (>= 1.5.9)
113
+ mail (2.7.1)
114
+ mini_mime (>= 0.1.1)
115
+ marcel (1.0.1)
116
+ method_source (1.0.0)
117
+ mime-types (3.3.1)
118
+ mime-types-data (~> 3.2015)
119
+ mime-types-data (3.2021.0704)
120
+ mini_mime (1.1.0)
121
+ minitest (5.14.4)
122
+ netrc (0.11.0)
123
+ nio4r (2.5.7)
124
+ nokogiri (1.11.7-x86_64-linux)
125
+ racc (~> 1.4)
126
+ parallel (1.20.1)
127
+ parser (3.0.1.1)
128
+ ast (~> 2.4.1)
129
+ pry (0.13.1)
130
+ coderay (~> 1.1)
131
+ method_source (~> 1.0)
132
+ pry-byebug (3.9.0)
133
+ byebug (~> 11.0)
134
+ pry (~> 0.13.0)
135
+ racc (1.5.2)
136
+ rack (2.2.3)
137
+ rack-test (1.1.0)
138
+ rack (>= 1.0, < 3)
139
+ rails (6.1.4)
140
+ actioncable (= 6.1.4)
141
+ actionmailbox (= 6.1.4)
142
+ actionmailer (= 6.1.4)
143
+ actionpack (= 6.1.4)
144
+ actiontext (= 6.1.4)
145
+ actionview (= 6.1.4)
146
+ activejob (= 6.1.4)
147
+ activemodel (= 6.1.4)
148
+ activerecord (= 6.1.4)
149
+ activestorage (= 6.1.4)
150
+ activesupport (= 6.1.4)
151
+ bundler (>= 1.15.0)
152
+ railties (= 6.1.4)
153
+ sprockets-rails (>= 2.0.0)
154
+ rails-dom-testing (2.0.3)
155
+ activesupport (>= 4.2.0)
156
+ nokogiri (>= 1.6)
157
+ rails-html-sanitizer (1.3.0)
158
+ loofah (~> 2.3)
159
+ railties (6.1.4)
160
+ actionpack (= 6.1.4)
161
+ activesupport (= 6.1.4)
162
+ method_source
163
+ rake (>= 0.13)
164
+ thor (~> 1.0)
165
+ rainbow (3.0.0)
166
+ rake (13.0.4)
167
+ regexp_parser (2.1.1)
168
+ request_store (1.5.0)
169
+ rack (>= 1.4)
170
+ rest-client (2.1.0)
171
+ http-accept (>= 1.7.0, < 2.0)
172
+ http-cookie (>= 1.0.2, < 2.0)
173
+ mime-types (>= 1.16, < 4.0)
174
+ netrc (~> 0.8)
175
+ rexml (3.2.5)
176
+ rspec (3.10.0)
177
+ rspec-core (~> 3.10.0)
178
+ rspec-expectations (~> 3.10.0)
179
+ rspec-mocks (~> 3.10.0)
180
+ rspec-core (3.10.1)
181
+ rspec-support (~> 3.10.0)
182
+ rspec-expectations (3.10.1)
183
+ diff-lcs (>= 1.2.0, < 2.0)
184
+ rspec-support (~> 3.10.0)
185
+ rspec-mocks (3.10.2)
186
+ diff-lcs (>= 1.2.0, < 2.0)
187
+ rspec-support (~> 3.10.0)
188
+ rspec-support (3.10.2)
189
+ rubocop (1.18.3)
190
+ parallel (~> 1.10)
191
+ parser (>= 3.0.0.0)
192
+ rainbow (>= 2.2.2, < 4.0)
193
+ regexp_parser (>= 1.8, < 3.0)
194
+ rexml
195
+ rubocop-ast (>= 1.7.0, < 2.0)
196
+ ruby-progressbar (~> 1.7)
197
+ unicode-display_width (>= 1.4.0, < 3.0)
198
+ rubocop-ast (1.7.0)
199
+ parser (>= 3.0.1.1)
200
+ ruby-progressbar (1.11.0)
201
+ shoulda-matchers (4.5.1)
202
+ activesupport (>= 4.2.0)
203
+ sprockets (4.0.2)
204
+ concurrent-ruby (~> 1.0)
205
+ rack (> 1, < 3)
206
+ sprockets-rails (3.2.2)
207
+ actionpack (>= 4.0)
208
+ activesupport (>= 4.0)
209
+ sprockets (>= 3.0.0)
210
+ thor (1.1.0)
211
+ tzinfo (2.0.4)
212
+ concurrent-ruby (~> 1.0)
213
+ unf (0.1.4)
214
+ unf_ext
215
+ unf_ext (0.0.7.7)
216
+ unicode-display_width (2.0.0)
217
+ websocket-driver (0.7.5)
218
+ websocket-extensions (>= 0.1.0)
219
+ websocket-extensions (0.1.5)
220
+ will_paginate (3.3.0)
221
+ zeitwerk (2.4.2)
222
+
223
+ PLATFORMS
224
+ x86_64-darwin-20
225
+ x86_64-linux
226
+
227
+ DEPENDENCIES
228
+ bundler
229
+ json_api_toolbox!
230
+ pry-byebug
231
+ rake
232
+ rspec
233
+ rubocop
234
+ shoulda-matchers
235
+
236
+ BUNDLED WITH
237
+ 2.2.22
data/README.md CHANGED
@@ -1,42 +1,32 @@
1
1
  # JsonApiToolbox
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/json_api_toolbox`. To experiment with that code, run `bin/console` for an interactive prompt.
3
+ This toolbox serve as a JSON API helper within Guide TI specs
4
4
 
5
- TODO: Delete this and the text above, and describe your gem
5
+ The current features are:
6
+ - Integrates the gems `jsonapi-serializable`, `json-api-vanilla` and `log_toolbox`
7
+ - Rspec support through a series of shares examples
8
+ - Suport for JSON API services
6
9
 
7
10
  ## Installation
8
11
 
9
- Add this line to your application's Gemfile:
12
+ Add this line in your `Gemfile`:
10
13
 
11
- ```ruby
12
- gem 'json_api_toolbox'
13
- ```
14
-
15
- And then execute:
16
-
17
- $ bundle
18
-
19
- Or install it yourself as:
20
-
21
- $ gem install json_api_toolbox
14
+ gem 'json_api_toolbox'
22
15
 
23
- ## Usage
16
+ then execute:
24
17
 
25
- TODO: Write usage instructions here
18
+ $ bundle install
26
19
 
27
- ## Development
28
-
29
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
20
+ For rspec support, add this line on your `rails_helper.rb`:
30
21
 
31
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
22
+ require 'json_api_toolbox/rspec'
32
23
 
33
- ## Contributing
24
+ ## Usage Examples
34
25
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/abacha/json_api_toolbox.
26
+ You can check some gem uses within the examples below:
36
27
 
37
- ## Examples
28
+ ### Service
38
29
 
39
- #Service
40
30
  ```ruby
41
31
  class MyService < JsonApiToolbox::Service
42
32
  BASE_URL = 'http://localhost:3000/my_model'
@@ -61,9 +51,10 @@ class MyService < JsonApiToolbox::Service
61
51
  end
62
52
  ```
63
53
 
64
- #Renderizable
54
+ ### Renderizable
55
+
56
+ A simple render:
65
57
 
66
- Render common
67
58
  ```ruby
68
59
  render_object(Quota.all)
69
60
  ```
@@ -76,7 +67,7 @@ new Hash, the key must be 'Hash' and the value must be your Serializable.
76
67
  render_object(QuotaGap.all, class: { Hash: SerializableQuotaGap })
77
68
  ```
78
69
 
79
- #Paginable
70
+ ### Paginable
80
71
 
81
72
  To render a collection with a json api pagination, you will need to send a Hash
82
73
  that contains two keys called 'links' and 'meta', and its values must be Hashs.
@@ -96,35 +87,33 @@ class MyController
96
87
  end
97
88
  ```
98
89
 
99
- ##ShareExamplesForControllers
90
+ ### Rspec Shared Examples
100
91
 
101
- it_behaves_like 'a http method'
102
- validate if your response have http status 200
92
+ `it_behaves_like 'a http method'`
93
+ - validate if your response have http status 200
103
94
 
104
- it_behaves_like 'a get method'
105
- validate if your response have http status 200
106
- validate if your response responde to body method
95
+ `it_behaves_like 'a get method'`
96
+ - validate if your response have http status 200
97
+ - validate if your response responde to body method
107
98
 
108
- it_behaves_like 'a json api response with included node'
109
- validate if yor response.body has included node
99
+ `it_behaves_like 'a json api response with included node'`
100
+ - validate if yor response.body has included node
110
101
 
111
- it_behaves_like 'a get with jsonapi with default value of', SomeModel
112
- validate if all attributes are present on your data
113
- obs:
114
- 1 - for enums who have '_cd' in the end of attribute name, '_cd' is removed.
115
- ex: enum_cd => enum
116
- 2 - id attributes are removed from validation
117
- 3 - for attributes who have _id in the end of attribute name, they are
118
- removed from validation
102
+ `it_behaves_like 'a get with jsonapi with default value of', SomeModel`
103
+ - validate if all attributes are present on your data based on the current criteria:
104
+ 1. for enums who have `_cd` in the end of attribute name, `_cd` is removed.
119
105
 
120
- it_behaves_like 'a json api response with all relations of', SomeModel
121
- validate if all relations are included on your data
106
+ ex: `enum_cd` => `enum`
107
+ 1. id attributes are removed from validation
108
+ 1. for attributes who have `_id` in the end of attribute name, they are removed from validation
122
109
 
123
- it_behaves_like 'a failed attempt to retrieve a resource'
124
- check if the api response will include an error when `find` raise a exception retrieving a resource.
110
+ `it_behaves_like 'a json api response with all relations of', SomeModel`
111
+ - validate if all relations are included on your data
125
112
 
126
- ## Example Tests
113
+ `it_behaves_like 'a failed attempt to retrieve a resource'`
114
+ - checks if the api response will include an error when `find` raise a exception retrieving a resource.
127
115
 
116
+ ## Test example
128
117
 
129
118
  ```ruby
130
119
  # frozen_string_literal: true
@@ -221,3 +210,26 @@ RSpec.describe ManagersController, type: :controller do
221
210
  end
222
211
  end
223
212
  ```
213
+
214
+ ## Development
215
+
216
+ To change the gem is simple, just clone this repository and run the `bin/setup` script
217
+
218
+ Then you can make your changes and check them with `rspec` or `rubocop .`.
219
+
220
+
221
+ ### On docker
222
+
223
+ #### Building
224
+ ```bash
225
+ docker build . -t json-api-toolbox-dev
226
+ ```
227
+
228
+ #### Running tests
229
+ ```bash
230
+ docker run --rm -it -v "$(echo $HOME)/.ssh:/root/.ssh" -v "$(pwd):/gem" json-api-toolbox-dev
231
+ ```
232
+
233
+ ## Contributing
234
+
235
+ > To be written
data/Rakefile CHANGED
@@ -1,6 +1,11 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rspec/core/rake_task"
3
+ require "rubocop/rake_task"
3
4
 
4
5
  RSpec::Core::RakeTask.new(:spec)
6
+ RuboCop::RakeTask.new(:lint)
5
7
 
6
- task :default => :spec
8
+ task default: :spec
9
+
10
+ desc 'Execute both RuboCop and RSpec'
11
+ task "lint-and-test" => [:lint, :spec]
data/bin/setup.sh ADDED
@@ -0,0 +1,54 @@
1
+ #! /bin/sh
2
+
3
+ DEFAULT_REPO=git@bitbucket.org:guideinvestimentos/rails_defaults.git
4
+ STRICT=${1:-no}
5
+ ONE_WEEK_AGO=$(( $(date +%s) - 604800 ))
6
+ FILE_TIME=$(date +%s -r .rubocop.base.yml 2> /dev/null)
7
+
8
+ info(){
9
+ echo -e "\\e[34;1m$1\\e[0m"
10
+ }
11
+
12
+ step(){
13
+ printf "- $1: \\e7\n"
14
+ }
15
+
16
+ success(){
17
+ printf "\\e8\\e[32;1mOK!\\e[0m\n\\e[2K"
18
+ }
19
+
20
+ skipped(){
21
+ printf "\\e8\\e[33;1mSKIPPED ($1)\\e[0m\n\\e[2K"
22
+ }
23
+
24
+ error() {
25
+ printf "\\e8\\e[31;1mERRO!\\e[0m\n\\e[2K"
26
+ printf "\\e[31m $1\\e[0m\n"
27
+ [ $STRICT == "--strict" ] && exit $2
28
+ }
29
+
30
+ info "Configurando o projeto\n"
31
+
32
+ step "Atualizando configuração base do Rubocop"
33
+
34
+ if [ ${FILE_TIME:-0} -lt $ONE_WEEK_AGO ]; then
35
+ RUBOCOP_FILE=$(git archive --remote=$DEFAULT_REPO HEAD .rubocop.yml 2> /dev/null | tar xO 2> /dev/null)
36
+
37
+ if [ -z "$RUBOCOP_FILE" ]; then
38
+ error "Não foi possível baixar o arquivo de configuração" 1
39
+ else
40
+ echo "$RUBOCOP_FILE" > .rubocop.base.yml
41
+ success
42
+ fi
43
+ else
44
+ skipped "Arquivo recente"
45
+ fi
46
+
47
+ step "Instalando dependências"
48
+
49
+ bundle check 2>&1 > /dev/null && skipped "up-to date" || {
50
+ RESULT=$(bundle install 2>&1 > /dev/null)
51
+ [ $? == 0 ] && success || error "$RESULT" 2
52
+ }
53
+
54
+ info "\nConfiguração executada com sucesso"
@@ -1,20 +1,58 @@
1
- image: ruby:2.4.1
1
+ image: ruby:2.6
2
2
 
3
- pipelines:
4
- default:
5
- - step:
3
+ definitions:
4
+ caches:
5
+ bundler-26: vendor/bundle
6
+ bundler-27: vendor/bundle
7
+ bundler-30: vendor/bundle
8
+
9
+ steps:
10
+ - step: &test
11
+ name: Testing
12
+ script:
13
+ - apt-get install git
14
+ - gem update --system
15
+ - bundle config set --local path "vendor/bundle"
16
+ - bin/setup.sh --strict
17
+ - bundle exec rake lint-and-test
18
+ - step: &release
19
+ name: Release gem
6
20
  script:
7
- - git archive --remote=git@bitbucket.org:guideinvestimentos/rails_defaults.git HEAD .rubocop.yml | tar -x
21
+ - apt-get install git
22
+ - gem update --system
23
+ - bundle config set --local path "vendor/bundle"
8
24
  - bundle install
9
- - gem install rubocop
10
- - rspec -fdoc
11
- - rubocop .
25
+ - "[ -d ~/.gem/ ] || mkdir -p ~/.gem/"
26
+ - curl -u $RUBYGEMS_USERNAME:$RUBYGEMS_PASSWORD https://rubygems.org/api/v1/api_key.yaml -o ~/.gem/credentials
27
+ - chmod 0600 ~/.gem/credentials
28
+ - bundle exec rake release
29
+ caches:
30
+ - bundler-26
12
31
 
32
+ pipelines:
33
+ pull-requests:
34
+ '**':
35
+ - parallel:
36
+ - step:
37
+ <<: *test
38
+ name: Ruby 2.6
39
+ image: ruby:2.6
40
+ caches:
41
+ - bundler-26
42
+ - step:
43
+ <<: *test
44
+ name: Ruby 2.7
45
+ image: ruby:2.7
46
+ caches:
47
+ - bundler-27
48
+ - step:
49
+ <<: *test
50
+ name: Ruby 3.0
51
+ image: ruby:3.0
52
+ caches:
53
+ - bundler-30
13
54
  branches:
14
55
  master:
15
- - step:
16
- script:
17
- - gem build json_api_toolbox.gemspec
18
- - curl -u $RUBYGEMS_USERNAME:$RUBYGEMS_PASSWORD https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials
19
- - chmod 0600 ~/.gem/credentials
20
- - gem push $(ls *.gem)
56
+ - step: *release
57
+ 'branch-1.x':
58
+ - step: *release
@@ -0,0 +1,3 @@
1
+ #! /bin/sh
2
+
3
+ . bin/setup.sh && bundle exec "$@"
@@ -1,41 +1,38 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # rubocop:disable Metrics/BlockLength
4
3
  lib = File.expand_path('lib', __dir__)
5
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
5
  require 'json_api_toolbox/version'
7
6
 
8
7
  Gem::Specification.new do |spec|
9
- spec.name = 'json_api_toolbox'
10
- spec.version = JsonApiToolbox::VERSION
11
- spec.authors = ['Adriano Bacha']
12
- spec.email = ['abacha@gmail.com']
8
+ spec.required_ruby_version = '>= 2.6.0'
9
+ spec.name = 'json_api_toolbox'
10
+ spec.version = JsonApiToolbox::VERSION
13
11
 
14
- spec.summary = 'Json API usefull tools'
15
- spec.homepage = 'http://bitbucket.org/guideinvestimentos/json_api_toolbox'
12
+ spec.authors = ['Adriano Bacha']
13
+ spec.email = ['abacha@gmail.com']
16
14
 
17
- spec.files = `git ls-files -z`.split("\x0").reject do |f|
15
+ spec.summary = 'Json API usefull tools'
16
+ spec.homepage = 'http://bitbucket.org/guideinvestimentos/json_api_toolbox'
17
+
18
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
18
19
  f.match(%r{^(test|spec|features)/})
19
20
  end
20
21
  spec.require_paths = ['lib']
21
22
 
22
- spec.add_dependency 'actionpack', '>= 4.0.0'
23
- spec.add_dependency 'activerecord', '>= 4.0.0'
24
- spec.add_dependency 'activesupport', '>= 4.0.0'
25
- spec.add_dependency 'json-api-vanilla', '~> 1.0.1'
26
- spec.add_dependency 'jsonapi-serializable', '>= 0.3.0'
27
- spec.add_dependency 'log_toolbox', '>= 1.0.0'
28
- spec.add_dependency 'request_store', '~> 1.3.2'
29
- spec.add_dependency 'rest-client', '>= 2.0.1'
30
- spec.add_dependency 'rspec', '>= 3.0.0'
31
- spec.add_dependency 'will_paginate', '>= 3.1.0'
23
+ spec.add_dependency 'activerecord', '>= 5.1.0'
24
+ spec.add_dependency 'activesupport', '>= 5.1.0'
25
+ spec.add_dependency 'jsonapi-serializable'
26
+ spec.add_dependency 'json-api-vanilla'
27
+ spec.add_dependency 'log_toolbox'
28
+ spec.add_dependency 'request_store'
29
+ spec.add_dependency 'rest-client'
30
+ spec.add_dependency 'will_paginate'
32
31
 
33
32
  spec.add_development_dependency 'bundler'
34
- spec.add_development_dependency 'json'
35
- spec.add_development_dependency 'pry'
36
33
  spec.add_development_dependency 'pry-byebug'
37
34
  spec.add_development_dependency 'rake'
35
+ spec.add_development_dependency 'rspec'
38
36
  spec.add_development_dependency 'rubocop'
39
- spec.add_development_dependency 'shoulda-matchers', '~> 3.1'
37
+ spec.add_development_dependency 'shoulda-matchers'
40
38
  end
41
- # rubocop:enable Metrics/BlockLength
@@ -8,8 +8,9 @@ require 'postable'
8
8
  require 'service'
9
9
  require 'jsonapi/serializable'
10
10
  require 'json_api_toolbox/paginable'
11
+ require 'will_paginate'
12
+ require 'will_paginate/active_record'
11
13
 
12
- require_relative 'json_api_toolbox/spec_support/shared_examples_for_controllers'
13
14
  require_relative 'json_api_toolbox/serializables/serializable_enum_option'
14
15
  require_relative 'json_api_toolbox/serializables/serializable_job'
15
16
  require_relative 'json_api_toolbox/serializables/serializable_version'
@@ -2,6 +2,9 @@
2
2
 
3
3
  module JsonApiToolbox
4
4
  module Paginable
5
+ DEFAULT_PER_PAGE = 20
6
+ MAX_PER_PAGE = 100
7
+
5
8
  def pagination_meta(collection_resource)
6
9
  {
7
10
  'current-page': collection_resource.current_page,
@@ -30,14 +33,23 @@ module JsonApiToolbox
30
33
  end
31
34
  end
32
35
 
36
+ def per_page
37
+ return DEFAULT_PER_PAGE if params[:per_page].nil?
38
+
39
+ per_page_limit = (ENV['MAX_PER_PAGE'] || MAX_PER_PAGE).to_i
40
+
41
+ [per_page_limit, params[:per_page].to_i].min
42
+ end
43
+
44
+ private
45
+
33
46
  def create_page_link(link, page)
34
- link_path = collection_resource_path(page: page,
35
- per_page: params[:per_page])
47
+ link_path = collection_resource_path(page: page, per_page: per_page)
36
48
  { link => link_path }
37
49
  end
38
50
 
39
51
  def collection_resource_path(options)
40
- path_method = "#{controller_name.pluralize.underscore}_path"
52
+ path_method = "#{controller_path.parameterize.pluralize.underscore}_path"
41
53
  public_send(path_method, options)
42
54
  end
43
55
  end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rspec'
4
+
5
+ module JsonApiToolbox
6
+ module Rspec
7
+ RSpec.shared_examples 'a http method' do
8
+ it 'returns http success' do
9
+ expect(response).to have_http_status(:success)
10
+ end
11
+ end
12
+
13
+ RSpec.shared_examples 'a post with status 422 Unprocessable Entity' do
14
+ it 'returns http code 422 Unprocessable Entity' do
15
+ expect(response).to have_http_status(422)
16
+ end
17
+ end
18
+
19
+ RSpec.shared_examples 'a get method' do
20
+ it_behaves_like 'a http method'
21
+
22
+ it 'response with JSON body' do
23
+ expect { response.body }.not_to raise_exception
24
+ end
25
+ end
26
+
27
+ RSpec.shared_examples 'a json api response with included node' do
28
+ it 'returns with included node' do
29
+ expect(JSON.parse(response.body)['included'].count).not_to eql(0)
30
+ end
31
+ end
32
+
33
+ RSpec.shared_examples 'a get with jsonapi with default value of' do |model|
34
+ let(:attributes) { data['attributes'].keys }
35
+ let(:model_keys) do
36
+ enums = []
37
+ model.new.attributes.keys.map do |attr|
38
+ case attr
39
+ when /_cd$/
40
+ enums << attr
41
+ attr.gsub(/_cd/, '')
42
+ when /_id$|^id$/
43
+ nil
44
+ else
45
+ attr
46
+ end
47
+ end.compact + enums
48
+ end
49
+
50
+ it 'returns response with default values' do
51
+ expect((model_keys & attributes).size).to eq(model_keys.size)
52
+ end
53
+ end
54
+
55
+ RSpec.shared_examples 'a json api response with all relations of' do |model|
56
+ let(:attributes) { data['relationships'].keys }
57
+ let(:relation_keys) { model.reflections.keys }
58
+
59
+ it 'returns response with default relationships' do
60
+ expect(attributes).to match_array(relation_keys)
61
+ end
62
+ end
63
+
64
+ RSpec.shared_examples 'a json api response' do
65
+ let(:body) { JSON.parse(response.body) }
66
+ let(:data) { body['data'].first }
67
+
68
+ it { expect(body).to have_key('data') }
69
+ it { expect(data).to have_key('type') }
70
+ it { expect(data).to have_key('id') }
71
+ it { expect(data).to have_key('attributes') }
72
+ end
73
+
74
+ RSpec.shared_examples 'a failed attempt to retrieve a resource' do
75
+ let(:errors) { JSON.parse(response.body)['errors'] }
76
+
77
+ it 'returns response with error\'s title including RecordNotFound' do
78
+ expect(errors.first['title']).to eq('ActiveRecord::RecordNotFound')
79
+ end
80
+ end
81
+ end
82
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module JsonApiToolbox
4
- VERSION = '1.2.0'
4
+ VERSION = '2.0.0'
5
5
  end
data/lib/postable.rb CHANGED
@@ -11,7 +11,7 @@ module JsonApiToolbox
11
11
  hash_value = check_child_association(value, key, model, child_model)
12
12
  [key, hash_value]
13
13
  end
14
- Hash[normalized_hash]
14
+ normalized_hash.to_h
15
15
  end
16
16
 
17
17
  private
data/lib/renderizable.rb CHANGED
@@ -20,9 +20,9 @@ module JsonApiToolbox
20
20
  def fields
21
21
  return {} unless fields?
22
22
 
23
- params[:fields].permit!.to_h.map do |field, attributes|
24
- [field, attributes.split(',')]
25
- end.to_h
23
+ params[:fields].permit!.to_h.transform_values do |attributes|
24
+ attributes.split(',')
25
+ end
26
26
  end
27
27
 
28
28
  def permitted_params
@@ -82,9 +82,8 @@ module JsonApiToolbox
82
82
  end
83
83
 
84
84
  def build_error_options(object, options)
85
- if options[:status].blank?
86
- options = options.merge(status: :unprocessable_entity)
87
- end
85
+ options = options.merge(status: :unprocessable_entity) if options[:status].blank?
86
+
88
87
  { jsonapi_errors: object.errors }.merge(options)
89
88
  end
90
89
  end
data/lib/service.rb CHANGED
@@ -16,10 +16,7 @@ module JsonApiToolbox
16
16
  end
17
17
 
18
18
  def execute
19
- response = request
20
- return if response.code == 404
21
-
22
- Service.parse_response(response)
19
+ Service.parse_response(request)
23
20
  end
24
21
 
25
22
  def request
@@ -29,8 +26,6 @@ module JsonApiToolbox
29
26
  payload: build_body,
30
27
  headers: build_header
31
28
  )
32
- rescue RestClient::ExceptionWithResponse => e
33
- e.response
34
29
  end
35
30
 
36
31
  def build_header
metadata CHANGED
@@ -1,155 +1,127 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json_api_toolbox
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adriano Bacha
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-01-16 00:00:00.000000000 Z
11
+ date: 2021-08-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: actionpack
14
+ name: activerecord
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 4.0.0
19
+ version: 5.1.0
20
20
  type: :runtime
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: 4.0.0
26
+ version: 5.1.0
27
27
  - !ruby/object:Gem::Dependency
28
- name: activerecord
28
+ name: activesupport
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 4.0.0
33
+ version: 5.1.0
34
34
  type: :runtime
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: 4.0.0
40
+ version: 5.1.0
41
41
  - !ruby/object:Gem::Dependency
42
- name: activesupport
42
+ name: jsonapi-serializable
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 4.0.0
47
+ version: '0'
48
48
  type: :runtime
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: 4.0.0
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: json-api-vanilla
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: 1.0.1
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: 1.0.1
69
- - !ruby/object:Gem::Dependency
70
- name: jsonapi-serializable
71
57
  requirement: !ruby/object:Gem::Requirement
72
58
  requirements:
73
59
  - - ">="
74
60
  - !ruby/object:Gem::Version
75
- version: 0.3.0
61
+ version: '0'
76
62
  type: :runtime
77
63
  prerelease: false
78
64
  version_requirements: !ruby/object:Gem::Requirement
79
65
  requirements:
80
66
  - - ">="
81
67
  - !ruby/object:Gem::Version
82
- version: 0.3.0
68
+ version: '0'
83
69
  - !ruby/object:Gem::Dependency
84
70
  name: log_toolbox
85
71
  requirement: !ruby/object:Gem::Requirement
86
72
  requirements:
87
73
  - - ">="
88
74
  - !ruby/object:Gem::Version
89
- version: 1.0.0
75
+ version: '0'
90
76
  type: :runtime
91
77
  prerelease: false
92
78
  version_requirements: !ruby/object:Gem::Requirement
93
79
  requirements:
94
80
  - - ">="
95
81
  - !ruby/object:Gem::Version
96
- version: 1.0.0
82
+ version: '0'
97
83
  - !ruby/object:Gem::Dependency
98
84
  name: request_store
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - "~>"
102
- - !ruby/object:Gem::Version
103
- version: 1.3.2
104
- type: :runtime
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - "~>"
109
- - !ruby/object:Gem::Version
110
- version: 1.3.2
111
- - !ruby/object:Gem::Dependency
112
- name: rest-client
113
85
  requirement: !ruby/object:Gem::Requirement
114
86
  requirements:
115
87
  - - ">="
116
88
  - !ruby/object:Gem::Version
117
- version: 2.0.1
89
+ version: '0'
118
90
  type: :runtime
119
91
  prerelease: false
120
92
  version_requirements: !ruby/object:Gem::Requirement
121
93
  requirements:
122
94
  - - ">="
123
95
  - !ruby/object:Gem::Version
124
- version: 2.0.1
96
+ version: '0'
125
97
  - !ruby/object:Gem::Dependency
126
- name: rspec
98
+ name: rest-client
127
99
  requirement: !ruby/object:Gem::Requirement
128
100
  requirements:
129
101
  - - ">="
130
102
  - !ruby/object:Gem::Version
131
- version: 3.0.0
103
+ version: '0'
132
104
  type: :runtime
133
105
  prerelease: false
134
106
  version_requirements: !ruby/object:Gem::Requirement
135
107
  requirements:
136
108
  - - ">="
137
109
  - !ruby/object:Gem::Version
138
- version: 3.0.0
110
+ version: '0'
139
111
  - !ruby/object:Gem::Dependency
140
112
  name: will_paginate
141
113
  requirement: !ruby/object:Gem::Requirement
142
114
  requirements:
143
115
  - - ">="
144
116
  - !ruby/object:Gem::Version
145
- version: 3.1.0
117
+ version: '0'
146
118
  type: :runtime
147
119
  prerelease: false
148
120
  version_requirements: !ruby/object:Gem::Requirement
149
121
  requirements:
150
122
  - - ">="
151
123
  - !ruby/object:Gem::Version
152
- version: 3.1.0
124
+ version: '0'
153
125
  - !ruby/object:Gem::Dependency
154
126
  name: bundler
155
127
  requirement: !ruby/object:Gem::Requirement
@@ -165,7 +137,7 @@ dependencies:
165
137
  - !ruby/object:Gem::Version
166
138
  version: '0'
167
139
  - !ruby/object:Gem::Dependency
168
- name: json
140
+ name: pry-byebug
169
141
  requirement: !ruby/object:Gem::Requirement
170
142
  requirements:
171
143
  - - ">="
@@ -179,7 +151,7 @@ dependencies:
179
151
  - !ruby/object:Gem::Version
180
152
  version: '0'
181
153
  - !ruby/object:Gem::Dependency
182
- name: pry
154
+ name: rake
183
155
  requirement: !ruby/object:Gem::Requirement
184
156
  requirements:
185
157
  - - ">="
@@ -193,7 +165,7 @@ dependencies:
193
165
  - !ruby/object:Gem::Version
194
166
  version: '0'
195
167
  - !ruby/object:Gem::Dependency
196
- name: pry-byebug
168
+ name: rspec
197
169
  requirement: !ruby/object:Gem::Requirement
198
170
  requirements:
199
171
  - - ">="
@@ -207,7 +179,7 @@ dependencies:
207
179
  - !ruby/object:Gem::Version
208
180
  version: '0'
209
181
  - !ruby/object:Gem::Dependency
210
- name: rake
182
+ name: rubocop
211
183
  requirement: !ruby/object:Gem::Requirement
212
184
  requirements:
213
185
  - - ">="
@@ -221,7 +193,7 @@ dependencies:
221
193
  - !ruby/object:Gem::Version
222
194
  version: '0'
223
195
  - !ruby/object:Gem::Dependency
224
- name: rubocop
196
+ name: shoulda-matchers
225
197
  requirement: !ruby/object:Gem::Requirement
226
198
  requirements:
227
199
  - - ">="
@@ -234,20 +206,6 @@ dependencies:
234
206
  - - ">="
235
207
  - !ruby/object:Gem::Version
236
208
  version: '0'
237
- - !ruby/object:Gem::Dependency
238
- name: shoulda-matchers
239
- requirement: !ruby/object:Gem::Requirement
240
- requirements:
241
- - - "~>"
242
- - !ruby/object:Gem::Version
243
- version: '3.1'
244
- type: :development
245
- prerelease: false
246
- version_requirements: !ruby/object:Gem::Requirement
247
- requirements:
248
- - - "~>"
249
- - !ruby/object:Gem::Version
250
- version: '3.1'
251
209
  description:
252
210
  email:
253
211
  - abacha@gmail.com
@@ -257,22 +215,25 @@ extra_rdoc_files: []
257
215
  files:
258
216
  - ".gitignore"
259
217
  - ".rspec"
260
- - ".ruby-version"
261
- - ".travis.yml"
218
+ - ".rubocop.yml"
262
219
  - CHANGELOG.md
220
+ - Dockerfile
263
221
  - Gemfile
222
+ - Gemfile.lock
264
223
  - README.md
265
224
  - Rakefile
225
+ - bin/setup.sh
266
226
  - bitbucket-pipelines.yml
227
+ - docker-entrypoint.sh
267
228
  - json_api_toolbox.gemspec
268
229
  - lib/enums.rb
269
230
  - lib/json_api_toolbox.rb
270
231
  - lib/json_api_toolbox/paginable.rb
232
+ - lib/json_api_toolbox/rspec.rb
271
233
  - lib/json_api_toolbox/serializables/serializable_enum_option.rb
272
234
  - lib/json_api_toolbox/serializables/serializable_exception.rb
273
235
  - lib/json_api_toolbox/serializables/serializable_job.rb
274
236
  - lib/json_api_toolbox/serializables/serializable_version.rb
275
- - lib/json_api_toolbox/spec_support/shared_examples_for_controllers.rb
276
237
  - lib/json_api_toolbox/version.rb
277
238
  - lib/postable.rb
278
239
  - lib/renderizable.rb
@@ -289,15 +250,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
289
250
  requirements:
290
251
  - - ">="
291
252
  - !ruby/object:Gem::Version
292
- version: '0'
253
+ version: 2.6.0
293
254
  required_rubygems_version: !ruby/object:Gem::Requirement
294
255
  requirements:
295
256
  - - ">="
296
257
  - !ruby/object:Gem::Version
297
258
  version: '0'
298
259
  requirements: []
299
- rubyforge_project:
300
- rubygems_version: 2.6.13
260
+ rubygems_version: 3.2.25
301
261
  signing_key:
302
262
  specification_version: 4
303
263
  summary: Json API usefull tools
data/.ruby-version DELETED
@@ -1 +0,0 @@
1
- ruby-2.5.0
data/.travis.yml DELETED
@@ -1,5 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- rvm:
4
- - 2.2.5
5
- before_install: gem install bundler -v 1.15.1
@@ -1,85 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rspec'
4
-
5
- module JsonApiToolbox
6
- module SpecSupport
7
- module SharedExamplesForControllers
8
- RSpec.shared_examples 'a http method' do
9
- it 'returns http success' do
10
- expect(response).to have_http_status(:success)
11
- end
12
- end
13
-
14
- RSpec.shared_examples 'a post with status 422 Unprocessable Entity' do
15
- it 'returns http code 422 Unprocessable Entity' do
16
- expect(response).to have_http_status(422)
17
- end
18
- end
19
-
20
- RSpec.shared_examples 'a get method' do
21
- it_behaves_like 'a http method'
22
-
23
- it 'response with JSON body' do
24
- expect { response.body }.not_to raise_exception
25
- end
26
- end
27
-
28
- RSpec.shared_examples 'a json api response with included node' do
29
- it 'returns with included node' do
30
- expect(JSON.parse(response.body)['included'].count).not_to eql(0)
31
- end
32
- end
33
-
34
- RSpec.
35
- shared_examples 'a get with jsonapi with default value of' do |model|
36
- let(:attributes) { data['attributes'].keys }
37
- let(:model_keys) do
38
- enums = []
39
- model.new.attributes.keys.map do |attr|
40
- if attr.match?(/_cd$/)
41
- enums << attr
42
- attr.gsub(/_cd/, '')
43
- elsif attr.match?(/_id$|^id$/)
44
- nil
45
- else
46
- attr
47
- end
48
- end.compact + enums
49
- end
50
-
51
- it 'returns response with default values' do
52
- expect((model_keys & attributes).size).to eq(model_keys.size)
53
- end
54
- end
55
-
56
- RSpec.
57
- shared_examples 'a json api response with all relations of' do |model|
58
- let(:attributes) { data['relationships'].keys }
59
- let(:relation_keys) { model.reflections.keys }
60
-
61
- it 'returns response with default relationships' do
62
- expect(attributes).to match_array(relation_keys)
63
- end
64
- end
65
-
66
- RSpec.shared_examples 'a json api response' do
67
- let(:body) { JSON.parse(response.body) }
68
- let(:data) { body['data'].first }
69
-
70
- it { expect(body).to have_key('data') }
71
- it { expect(data).to have_key('type') }
72
- it { expect(data).to have_key('id') }
73
- it { expect(data).to have_key('attributes') }
74
- end
75
-
76
- RSpec.shared_examples 'a failed attempt to retrieve a resource' do
77
- let(:errors) { JSON.parse(response.body)['errors'] }
78
-
79
- it 'returns response with error\'s title including RecordNotFound' do
80
- expect(errors.first['title']).to eq('ActiveRecord::RecordNotFound')
81
- end
82
- end
83
- end
84
- end
85
- end