browse-everything 0.16.1 → 1.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +3 -0
  3. data/CODE_OF_CONDUCT.md +36 -0
  4. data/CONTRIBUTING.md +21 -19
  5. data/Gemfile +1 -0
  6. data/README.md +29 -9
  7. data/SUPPORT.md +5 -0
  8. data/app/controllers/browse_everything_controller.rb +7 -3
  9. data/app/views/browse_everything/_files.html.erb +14 -6
  10. data/app/views/browse_everything/index.html.erb +7 -1
  11. data/browse-everything.gemspec +5 -5
  12. data/lib/browse_everything/driver/base.rb +1 -1
  13. data/lib/browse_everything/driver/box.rb +4 -14
  14. data/lib/browse_everything/driver/dropbox.rb +34 -11
  15. data/lib/browse_everything/driver/google_drive.rb +2 -2
  16. data/lib/browse_everything/driver/s3.rb +8 -14
  17. data/lib/browse_everything/retriever.rb +4 -5
  18. data/lib/browse_everything/version.rb +1 -1
  19. data/lib/generators/browse_everything/templates/browse_everything_providers.yml.example +2 -2
  20. data/spec/controllers/browse_everything_controller_spec.rb +8 -1
  21. data/spec/lib/browse_everything/driver/box_spec.rb +114 -34
  22. data/spec/lib/browse_everything/driver/dropbox_spec.rb +53 -5
  23. data/spec/lib/browse_everything/driver/google_drive_spec.rb +41 -4
  24. data/spec/lib/browse_everything/driver/s3_spec.rb +27 -18
  25. data/spec/lib/browse_everything/retriever_spec.rb +65 -2
  26. data/spec/spec_helper.rb +4 -9
  27. data/spec/support/capybara.rb +14 -10
  28. metadata +31 -37
  29. data/spec/fixtures/vcr_cassettes/box.yml +0 -498
  30. data/spec/fixtures/vcr_cassettes/dropbox.yml +0 -282
  31. data/spec/fixtures/vcr_cassettes/google_drive.yml +0 -331
  32. data/spec/fixtures/vcr_cassettes/retriever.yml +0 -170
@@ -1,282 +0,0 @@
1
- ---
2
- http_interactions:
3
- - request:
4
- method: post
5
- uri: https://api.dropboxapi.com/oauth2/token
6
- body:
7
- encoding: UTF-8
8
- string: client_id=id&client_secret=secret&code=code&grant_type=authorization_code
9
- headers:
10
- User-Agent:
11
- - Faraday v0.12.2
12
- Content-Type:
13
- - application/x-www-form-urlencoded
14
- Accept-Encoding:
15
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
16
- Accept:
17
- - "*/*"
18
- response:
19
- status:
20
- code: 200
21
- message: OK
22
- headers:
23
- Server:
24
- - nginx
25
- Date:
26
- - Wed, 01 Nov 2017 15:23:50 GMT
27
- Content-Type:
28
- - text/javascript
29
- Transfer-Encoding:
30
- - chunked
31
- Connection:
32
- - keep-alive
33
- Vary:
34
- - Accept-Encoding
35
- Cache-Control:
36
- - no-cache
37
- Pragma:
38
- - no-cache
39
- X-Content-Type-Options:
40
- - nosniff
41
- X-Dropbox-Request-Id:
42
- - f2f4174c641db0b51f5d82987fefca9b
43
- X-Frame-Options:
44
- - SAMEORIGIN
45
- X-Server-Response-Time:
46
- - '380'
47
- body:
48
- encoding: ASCII-8BIT
49
- string: '{"access_token": "test-access-token",
50
- "token_type": "bearer", "uid": "test-user-id", "account_id": "dbid:id"}'
51
- http_version:
52
- recorded_at: Wed, 01 Nov 2017 15:23:50 GMT
53
- - request:
54
- method: post
55
- uri: https://api.dropboxapi.com/2/files/list_folder
56
- body:
57
- encoding: UTF-8
58
- string: '{"recursive":false,"include_media_info":false,"include_deleted":false,"path":""}'
59
- headers:
60
- Authorization:
61
- - Bearer test-token
62
- User-Agent:
63
- - Faraday v0.12.2
64
- Content-Type:
65
- - application/json
66
- Accept-Encoding:
67
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
68
- Accept:
69
- - "*/*"
70
- response:
71
- status:
72
- code: 200
73
- message: OK
74
- headers:
75
- Server:
76
- - nginx
77
- Date:
78
- - Thu, 02 Nov 2017 17:24:35 GMT
79
- Content-Type:
80
- - application/json
81
- Transfer-Encoding:
82
- - chunked
83
- Connection:
84
- - keep-alive
85
- Vary:
86
- - Accept-Encoding
87
- Cache-Control:
88
- - no-cache
89
- Pragma:
90
- - no-cache
91
- X-Content-Type-Options:
92
- - nosniff
93
- X-Dropbox-Request-Id:
94
- - 88a1f2ef2510ba6e8d39629d0950c5cd
95
- X-Frame-Options:
96
- - SAMEORIGIN
97
- X-Server-Response-Time:
98
- - '420'
99
- body:
100
- encoding: ASCII-8BIT
101
- string: '{"entries": [{".tag": "folder", "name": "Photos", "path_lower": "/photos",
102
- "path_display": "/Photos", "id": "id:XAAAAAAAAAALA"}, {".tag": "file", "name":
103
- "Getting Started.pdf", "path_lower": "/getting started.pdf", "path_display":
104
- "/Getting Started.pdf", "id": "id:XAAAAAAAAAAKg", "client_modified":
105
- "2012-11-10T18:33:28Z", "server_modified": "2012-11-10T18:33:27Z", "rev":
106
- "60b9427f2", "size": 249159, "content_hash": "c3dfdd86981548e48bc8efb6c4162c76ba961ec92e60f6ba26189068a41fcaf2"}],
107
- "cursor": "AAFu-_dOPQTQnqOIb9JklCPYSxWtNRrBBOU4nNkY78wTCc-ktCP4MtIoN1nmOESizkoue2dpu3FbMwDM6BQbgkLObH_Ge-H0BYaPwjfLk5cUHZHd1swkMYGLWELfX_PIHH9hCmU0C8sUL2EJ-7y6BcRFpdOvPmxiu6azVyCx_Il7kA",
108
- "has_more": false}'
109
- http_version:
110
- recorded_at: Thu, 02 Nov 2017 17:24:35 GMT
111
- - request:
112
- method: post
113
- uri: https://api.dropboxapi.com/2/files/list_folder
114
- body:
115
- encoding: UTF-8
116
- string: '{"recursive":false,"include_media_info":false,"include_deleted":false,"path":"/Photos"}'
117
- headers:
118
- Authorization:
119
- - Bearer test-token
120
- User-Agent:
121
- - Faraday v0.12.2
122
- Content-Type:
123
- - application/json
124
- Accept-Encoding:
125
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
126
- Accept:
127
- - "*/*"
128
- response:
129
- status:
130
- code: 200
131
- message: OK
132
- headers:
133
- Server:
134
- - nginx
135
- Date:
136
- - Thu, 02 Nov 2017 18:24:47 GMT
137
- Content-Type:
138
- - application/json
139
- Transfer-Encoding:
140
- - chunked
141
- Connection:
142
- - keep-alive
143
- Vary:
144
- - Accept-Encoding
145
- Cache-Control:
146
- - no-cache
147
- Pragma:
148
- - no-cache
149
- X-Content-Type-Options:
150
- - nosniff
151
- X-Dropbox-Request-Id:
152
- - 99449c0009a0b11d68c7be3fd95c344e
153
- X-Frame-Options:
154
- - SAMEORIGIN
155
- X-Server-Response-Time:
156
- - '249'
157
- body:
158
- encoding: ASCII-8BIT
159
- string: '{"entries": [{".tag": "folder", "name": "Sample Album", "path_lower":
160
- "/photos/sample album", "path_display": "/Photos/Sample Album", "id": "id:XAAAAAAAAAAKw"}],
161
- "cursor": "AAGbwaeSAvSMoUMUP1PFBFovGux_ng7wnPb1sj0d7ovjMe6lvtB0NG1xwOtwFWfyNjIHPx1gkKGFSxn-6A5WsL59EZKn3XbJxk1kZzNTtwcDCVj2GIG7cHSTnCdjeAeNf1e6VEpsaXdnh67WrSjSUu9fsfok4H83z_JlXT1LZ_XVCA",
162
- "has_more": false}'
163
- http_version:
164
- recorded_at: Thu, 02 Nov 2017 18:24:47 GMT
165
- - request:
166
- method: post
167
- uri: https://api.dropboxapi.com/2/files/get_metadata
168
- body:
169
- encoding: UTF-8
170
- string: '{"path":"/Getting Started.pdf"}'
171
- headers:
172
- Authorization:
173
- - Bearer test-token
174
- User-Agent:
175
- - Faraday v0.12.2
176
- Content-Type:
177
- - application/json
178
- Accept-Encoding:
179
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
180
- Accept:
181
- - "*/*"
182
- response:
183
- status:
184
- code: 200
185
- message: OK
186
- headers:
187
- Server:
188
- - nginx
189
- Date:
190
- - Thu, 02 Nov 2017 18:24:47 GMT
191
- Content-Type:
192
- - application/json
193
- Transfer-Encoding:
194
- - chunked
195
- Connection:
196
- - keep-alive
197
- Vary:
198
- - Accept-Encoding
199
- Cache-Control:
200
- - no-cache
201
- Pragma:
202
- - no-cache
203
- X-Content-Type-Options:
204
- - nosniff
205
- X-Dropbox-Request-Id:
206
- - 759ea34f57056e7d7fdf96cf4548014b
207
- X-Frame-Options:
208
- - SAMEORIGIN
209
- X-Server-Response-Time:
210
- - '170'
211
- body:
212
- encoding: ASCII-8BIT
213
- string: '{".tag": "file", "name": "Getting Started.pdf", "path_lower": "/getting
214
- started.pdf", "path_display": "/Getting Started.pdf", "id": "id:XAAAAAAAAAAKw",
215
- "client_modified": "2012-11-10T18:33:28Z", "server_modified": "2012-11-10T18:33:27Z",
216
- "rev": "60b9427f2", "size": 249159, "content_hash": "c3dfdd86981548e48bc8efb6c4162c76ba961ec92e60f6ba26189068a41fcaf2"}'
217
- http_version:
218
- recorded_at: Thu, 02 Nov 2017 18:24:47 GMT
219
- - request:
220
- method: post
221
- uri: https://content.dropboxapi.com/2/files/download
222
- body:
223
- encoding: UTF-8
224
- string: ''
225
- headers:
226
- Authorization:
227
- - Bearer test-token
228
- User-Agent:
229
- - Faraday v0.12.2
230
- Dropbox-Api-Arg:
231
- - '{"path":"/Getting Started.pdf"}'
232
- Content-Type:
233
- - ''
234
- Content-Length:
235
- - '0'
236
- Accept-Encoding:
237
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
238
- Accept:
239
- - "*/*"
240
- response:
241
- status:
242
- code: 200
243
- message: OK
244
- headers:
245
- Server:
246
- - nginx
247
- Date:
248
- - Thu, 02 Nov 2017 17:24:36 GMT
249
- Content-Type:
250
- - application/octet-stream
251
- Content-Length:
252
- - '249159'
253
- Connection:
254
- - keep-alive
255
- Accept-Ranges:
256
- - bytes
257
- Etag:
258
- - W/"60b9427f2"
259
- Pragma:
260
- - no-cache
261
- Cache-Control:
262
- - no-cache
263
- Original-Content-Length:
264
- - '249159'
265
- Dropbox-Api-Result:
266
- - '{"name": "Getting Started.pdf", "path_lower": "/getting started.pdf", "path_display":
267
- "/Getting Started.pdf", "id": "id:XAAAAAAAAAAKg", "client_modified":
268
- "2012-11-10T18:33:28Z", "server_modified": "2012-11-10T18:33:27Z", "rev":
269
- "60b9427f2", "size": 249159, "content_hash": "c3dfdd86981548e48bc8efb6c4162c76ba961ec92e60f6ba26189068a41fcaf2"}'
270
- X-Server-Response-Time:
271
- - '568'
272
- X-Dropbox-Request-Id:
273
- - 34e2c5d045bc37e50c1874f668a6c8c6
274
- X-Robots-Tag:
275
- - noindex, nofollow, noimageindex
276
- body:
277
- encoding: ASCII-8BIT
278
- string: !binary |-
279
- JVBERi0xLjcNJeLjz9MNCjU5IDAgb2JqDTw8L0xpbmVhcml6ZWQgMS9MIDI0
280
- http_version:
281
- recorded_at: Thu, 02 Nov 2017 17:24:36 GMT
282
- recorded_with: VCR 3.0.3
@@ -1,331 +0,0 @@
1
- ---
2
- http_interactions:
3
- - request:
4
- method: post
5
- uri: https://www.googleapis.com/oauth2/v4/token
6
- body:
7
- encoding: ASCII-8BIT
8
- string: grant_type=authorization_code&code=code&redirect_uri=uri&client_id=id.apps.googleusercontent.com&client_secret=SECRET
9
- headers:
10
- User-Agent:
11
- - Faraday v0.13.1
12
- Content-Type:
13
- - application/x-www-form-urlencoded
14
- Accept-Encoding:
15
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
16
- Accept:
17
- - "*/*"
18
- response:
19
- status:
20
- code: 200
21
- message: OK
22
- headers:
23
- Cache-Control:
24
- - no-cache, no-store, max-age=0, must-revalidate
25
- Pragma:
26
- - no-cache
27
- Expires:
28
- - Mon, 01 Jan 1990 00:00:00 GMT
29
- Date:
30
- - Mon, 30 Oct 2017 13:55:49 GMT
31
- Vary:
32
- - Origin
33
- - X-Origin
34
- Content-Type:
35
- - application/json; charset=UTF-8
36
- X-Content-Type-Options:
37
- - nosniff
38
- X-Frame-Options:
39
- - SAMEORIGIN
40
- X-Xss-Protection:
41
- - 1; mode=block
42
- Server:
43
- - GSE
44
- Alt-Svc:
45
- - quic=":443"; ma=2592000; v="41,39,38,37,35"
46
- Transfer-Encoding:
47
- - chunked
48
- body:
49
- encoding: ASCII-8BIT
50
- string: |
51
- {
52
- "access_token": "access-token",
53
- "token_type": "Bearer",
54
- "expires_in": 3600,
55
- "refresh_token": "refresh-token"
56
- }
57
- http_version:
58
- recorded_at: Mon, 30 Oct 2017 13:55:49 GMT
59
- - request:
60
- method: get
61
- uri: https://www.googleapis.com/drive/v3/files?fields=nextPageToken,files(name,id,mimeType,size,modifiedTime,parents,webContentLink)&orderBy=folder,modifiedTime%20desc,name&pageSize=1000
62
- body:
63
- encoding: UTF-8
64
- string: ''
65
- headers:
66
- User-Agent:
67
- - |-
68
- Samvera Application/0.0.0 google-api-ruby-client/0.15.0 Mac OS X/10.12.6
69
- (gzip)
70
- Accept:
71
- - "*/*"
72
- Accept-Encoding:
73
- - gzip,deflate
74
- Date:
75
- - Mon, 30 Oct 2017 13:55:49 GMT
76
- Authorization:
77
- - Bearer access-token
78
- Content-Type:
79
- - application/x-www-form-urlencoded
80
- response:
81
- status:
82
- code: 200
83
- message: OK
84
- headers:
85
- Expires:
86
- - Mon, 30 Oct 2017 13:55:50 GMT
87
- Date:
88
- - Mon, 30 Oct 2017 13:55:50 GMT
89
- Cache-Control:
90
- - private, max-age=0, must-revalidate, no-transform
91
- Vary:
92
- - Origin
93
- - X-Origin
94
- Content-Type:
95
- - application/json; charset=UTF-8
96
- Content-Encoding:
97
- - gzip
98
- X-Content-Type-Options:
99
- - nosniff
100
- X-Frame-Options:
101
- - SAMEORIGIN
102
- X-Xss-Protection:
103
- - 1; mode=block
104
- Server:
105
- - GSE
106
- Alt-Svc:
107
- - quic=":443"; ma=2592000; v="41,39,38,37,35"
108
- Transfer-Encoding:
109
- - chunked
110
- body:
111
- encoding: UTF-8
112
- string: |
113
- {
114
- "nextPageToken": "next-page-token",
115
- "files": [
116
- {
117
- "id": "asset-id1",
118
- "name": "asset-name1",
119
- "mimeType": "application/vnd.google-apps.folder",
120
- "parents": [
121
- "asset-id4"
122
- ],
123
- "modifiedTime": "2017-02-08T16:39:53.000Z"
124
- },
125
- {
126
- "id": "asset-id2",
127
- "name": "asset-name2.pdf",
128
- "mimeType": "application/pdf",
129
- "webContentLink": "https://drive.google.com/uc?id=id&export=download",
130
- "modifiedTime": "2017-10-20T16:48:50.001Z",
131
- "size": "891764"
132
- },
133
- {
134
- "id": "asset-id3",
135
- "name": "asset-name3.pdf",
136
- "mimeType": "application/pdf",
137
- "parents": [
138
- "asset-id6"
139
- ],
140
- "webContentLink": "https://drive.google.com/uc?id=id&export=download",
141
- "modifiedTime": "2017-10-20T16:48:50.001Z",
142
- "size": "891764"
143
- }
144
- ]
145
- }
146
- http_version:
147
- recorded_at: Mon, 30 Oct 2017 13:55:50 GMT
148
- - request:
149
- method: get
150
- uri: https://www.googleapis.com/drive/v3/files?fields=nextPageToken,files(name,id,mimeType,size,modifiedTime,parents,webContentLink)&orderBy=folder,modifiedTime%20desc,name&pageSize=1000&pageToken=next-page-token
151
- body:
152
- encoding: UTF-8
153
- string: ''
154
- headers:
155
- User-Agent:
156
- - |-
157
- Samvera Application/0.0.0 google-api-ruby-client/0.15.0 Mac OS X/10.12.6
158
- (gzip)
159
- Accept:
160
- - "*/*"
161
- Accept-Encoding:
162
- - gzip,deflate
163
- Date:
164
- - Mon, 30 Oct 2017 13:55:49 GMT
165
- Authorization:
166
- - Bearer access-token
167
- Content-Type:
168
- - application/x-www-form-urlencoded
169
- response:
170
- status:
171
- code: 200
172
- message: OK
173
- headers:
174
- Expires:
175
- - Mon, 30 Oct 2017 13:55:50 GMT
176
- Date:
177
- - Mon, 30 Oct 2017 13:55:50 GMT
178
- Cache-Control:
179
- - private, max-age=0, must-revalidate, no-transform
180
- Vary:
181
- - Origin
182
- - X-Origin
183
- Content-Type:
184
- - application/json; charset=UTF-8
185
- Content-Encoding:
186
- - gzip
187
- X-Content-Type-Options:
188
- - nosniff
189
- X-Frame-Options:
190
- - SAMEORIGIN
191
- X-Xss-Protection:
192
- - 1; mode=block
193
- Server:
194
- - GSE
195
- Alt-Svc:
196
- - quic=":443"; ma=2592000; v="41,39,38,37,35"
197
- Transfer-Encoding:
198
- - chunked
199
- body:
200
- encoding: UTF-8
201
- string: |
202
- {
203
- "files": []
204
- }
205
- http_version:
206
- recorded_at: Mon, 30 Oct 2017 13:55:50 GMT
207
- - request:
208
- method: post
209
- uri: https://www.googleapis.com/batch/drive/v3
210
- body:
211
- encoding: UTF-8
212
- string: "--a2f3ce3d4c24a197cbba0300e98666b974a6eefc\r\nContent-Type: application/http\r\nContent-Id:
213
- <b9edfb4e-045e-491e-8706-39513675fcc4+0>\r\nContent-Length: 239\r\nContent-Transfer-Encoding:
214
- binary\r\n\r\nGET /drive/v3/files?fields=nextPageToken%2Cfiles%28name%2Cid%2CmimeType%2Csize%2CmodifiedTime%2Cparents%2CwebContentLink%29&orderBy=modifiedByMeTime%2CmodifiedTime%2Cfolder%20desc%2Cname&pageSize=1000
215
- HTTP/1.1\r\nHost: www.googleapis.com\r\n\r\n\r\n--a2f3ce3d4c24a197cbba0300e98666b974a6eefc--\r\n\r\n"
216
- headers:
217
- User-Agent:
218
- - |-
219
- Samvera Application/0.0.0 google-api-ruby-client/0.18.0 Mac OS X/10.12.6
220
- (gzip)
221
- Accept:
222
- - "*/*"
223
- Accept-Encoding:
224
- - gzip,deflate
225
- Date:
226
- - Mon, 18 Dec 2017 01:12:40 GMT
227
- Content-Type:
228
- - multipart/mixed; boundary=a2f3ce3d4c24a197cbba0300e98666b974a6eefc
229
- Authorization:
230
- - Bearer access-token
231
- response:
232
- status:
233
- code: 200
234
- message: OK
235
- headers:
236
- Vary:
237
- - Origin
238
- - X-Origin
239
- Cache-Control:
240
- - no-cache, no-store, max-age=0, must-revalidate
241
- Pragma:
242
- - no-cache
243
- Expires:
244
- - Mon, 01 Jan 1990 00:00:00 GMT
245
- Date:
246
- - Mon, 18 Dec 2017 01:12:43 GMT
247
- Content-Type:
248
- - multipart/mixed; boundary=batch_kIUSyvoB-sA_AAkZDwojjgg
249
- Content-Encoding:
250
- - gzip
251
- X-Content-Type-Options:
252
- - nosniff
253
- X-Frame-Options:
254
- - SAMEORIGIN
255
- X-Xss-Protection:
256
- - 1; mode=block
257
- Server:
258
- - GSE
259
- Alt-Svc:
260
- - hq=":443"; ma=2592000; quic=51303431; quic=51303339; quic=51303338; quic=51303337;
261
- quic=51303335,quic=":443"; ma=2592000; v="41,39,38,37,35"
262
- Transfer-Encoding:
263
- - chunked
264
- body:
265
- encoding: ASCII-8BIT
266
- string: !binary |-
267
- testdata
268
- http_version:
269
- recorded_at: Mon, 18 Dec 2017 01:12:42 GMT
270
- - request:
271
- method: get
272
- uri: https://www.googleapis.com/drive/v3/files/asset-id2?fields=id,%20name,%20size
273
- body:
274
- encoding: UTF-8
275
- string: ''
276
- headers:
277
- User-Agent:
278
- - |-
279
- Samvera Application/0.0.0 google-api-ruby-client/0.15.0 Mac OS X/10.12.6
280
- (gzip)
281
- Accept:
282
- - "*/*"
283
- Accept-Encoding:
284
- - gzip,deflate
285
- Date:
286
- - Mon, 30 Oct 2017 13:55:49 GMT
287
- Authorization:
288
- - Bearer access-token
289
- Content-Type:
290
- - application/x-www-form-urlencoded
291
- response:
292
- status:
293
- code: 200
294
- message: OK
295
- headers:
296
- Expires:
297
- - Mon, 30 Oct 2017 18:33:52 GMT
298
- Date:
299
- - Mon, 30 Oct 2017 18:33:52 GMT
300
- Cache-Control:
301
- - private, max-age=0, must-revalidate, no-transform
302
- Vary:
303
- - Origin
304
- - X-Origin
305
- Content-Type:
306
- - application/json; charset=UTF-8
307
- Content-Encoding:
308
- - gzip
309
- X-Content-Type-Options:
310
- - nosniff
311
- X-Frame-Options:
312
- - SAMEORIGIN
313
- X-Xss-Protection:
314
- - 1; mode=block
315
- Server:
316
- - GSE
317
- Alt-Svc:
318
- - quic=":443"; ma=2592000; v="41,39,38,37,35"
319
- Transfer-Encoding:
320
- - chunked
321
- body:
322
- encoding: UTF-8
323
- string: |
324
- {
325
- "id": "asset-id2",
326
- "name": "asset-name2.pdf",
327
- "webContentLink": "https://drive.google.com/uc?id=id&export=download"
328
- }
329
- http_version:
330
- recorded_at: Mon, 30 Oct 2017 18:33:52 GMT
331
- recorded_with: VCR 3.0.3