pg_rails 7.5.7 → 7.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (28) hide show
  1. checksums.yaml +4 -4
  2. data/pg_associable/app/helpers/pg_associable/form_builder_methods.rb +1 -1
  3. data/pg_engine/app/components/asociable_modal_component.html.slim +1 -0
  4. data/pg_engine/app/controllers/pg_engine/base_controller.rb +9 -1
  5. data/pg_engine/app/controllers/pg_engine/base_users_controller.rb +0 -4
  6. data/pg_engine/app/controllers/public/webhooks_controller.rb +6 -0
  7. data/pg_engine/app/controllers/users/dashboard_controller.rb +9 -0
  8. data/pg_engine/app/models/user.rb +6 -0
  9. data/pg_engine/app/views/users/account_switcher/list.html.slim +1 -1
  10. data/pg_engine/app/views/users/dashboard/dashboard.html.slim +1 -0
  11. data/pg_engine/config/initializers/action_controller.rb +7 -0
  12. data/pg_engine/config/routes.rb +2 -1
  13. data/pg_engine/lib/pg_engine/configuracion.rb +2 -5
  14. data/pg_engine/lib/pg_engine/navigator.rb +67 -0
  15. data/pg_engine/lib/pg_engine.rb +1 -0
  16. data/pg_engine/spec/requests/base_controller_requests_spec.rb +11 -0
  17. data/pg_engine/spec/{controllers/public/webhooks_controller_spec.rb → requests/public/webhooks_spec.rb} +13 -5
  18. data/pg_engine/spec/requests/users/dashboard_spec.rb +19 -0
  19. data/pg_engine/spec/requests/users/switcher_spec.rb +1 -1
  20. data/pg_engine/spec/system/noticed_spec.rb +0 -1
  21. data/pg_engine/spec/system/tenants_spec.rb +1 -1
  22. data/pg_layout/app/javascript/controllers/clear_timeout_controller.js +18 -5
  23. data/pg_layout/app/lib/navbar.rb +11 -6
  24. data/pg_layout/app/views/pg_layout/_sidebar.html.erb +1 -1
  25. data/pg_layout/spec/lib/navbar_spec.rb +5 -1
  26. data/pg_rails/lib/pg_rails/capybara_support.rb +1 -1
  27. data/pg_rails/lib/version.rb +1 -1
  28. metadata +8 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d700901741523887ccac3c92bc1e266a4ec57f1cf2794865aa2c1bc4a30a5ae2
4
- data.tar.gz: e8e55331eb22f7168d483ce8e1eec5965b23cec8f8421bfbe4ff58e870d874af
3
+ metadata.gz: 9e8749da8dcc608499fc64c9af83a9889069d9384e861508688c40e41b33ae52
4
+ data.tar.gz: 51fcd1231c11477379842419333ceda58bd14b1ca5d058fdf0775b92b6caf867
5
5
  SHA512:
6
- metadata.gz: 63ea0b3be1e39bcdc8436269b539945000b11e6f40f03e69eb3f5e897bf1ba1ca45a5a054d13c0e3f37c5fd5eb878d91b092b31174a796012b5a8b87ccd0e625
7
- data.tar.gz: c6808a080fe3a4dc2769bf35ac29662f4875229d323c31f793481c3460b44d41a8984010f328a4a380d842f2aa3e5ddbeaed9853ce5013b4913cf53516dc848d
6
+ metadata.gz: 06c02fbcf25d4eb7c34c8272d9b3e3f0af6a93052a882cdc8adb1f17452b39dc002145e19cd17321e6a273216393309e7b9d0efac307aa9fc33b9348fd9dc999
7
+ data.tar.gz: 2a3bc5f762458f385813fbba264e9644843680d6d924a77bbb671711bd6c3fe06adb14cae59453dc38f2614fbefda264101f12106f0720e12c66c8d2bd967c39
@@ -20,7 +20,7 @@ module PgAssociable
20
20
  # porque de todos modos se pisaría en el create
21
21
  if !object.persisted? &&
22
22
  template.nested_record.present? &&
23
- object.send(template.nested_key) == (template.nested_record.id)
23
+ object.send(atributo) == (template.nested_record)
24
24
  options[:disabled] = true
25
25
  end
26
26
 
@@ -1,3 +1,4 @@
1
+ / TODO: usar ModalComponent?
1
2
  .modal[class="#{@klass} modal-#{@modal_id}" tabindex="-1" data-controller="modal"
2
3
  data-auto-show="true" data-remove-on-hide="false"
3
4
  data-modal-asociable-outlet=".asociable-#{@modal_id}"
@@ -76,6 +76,7 @@ module PgEngine
76
76
  rescue_from ActsAsTenant::Errors::NoTenantSet, with: :no_tenant_set
77
77
 
78
78
  rescue_from PgEngine::BadUserInput, with: :bad_user_input
79
+ rescue_from ActionController::UnknownFormat, with: :unknown_format
79
80
 
80
81
  rescue_from ActionController::InvalidAuthenticityToken,
81
82
  with: :invalid_authenticity_token
@@ -96,6 +97,10 @@ module PgEngine
96
97
  render_my_component(BadUserInputComponent.new(error_msg: error.message), :bad_request)
97
98
  end
98
99
 
100
+ def unknown_format(_error)
101
+ render_my_component(BadUserInputComponent.new(error_msg: 'Formato incorrecto'), :bad_request)
102
+ end
103
+
99
104
  def internal_error(error)
100
105
  pg_err error
101
106
 
@@ -144,7 +149,10 @@ module PgEngine
144
149
  navbar_expanded = cookies[:navbar_expand] != 'false'
145
150
  @navbar_opened_class = navbar_expanded ? 'opened' : ''
146
151
  @navbar_chevron_class = navbar_expanded ? 'bi-chevron-left' : 'bi-chevron-right'
147
- @navbar = Navbar.new(Current.user)
152
+ @navbar = Navbar.new
153
+ PgEngine.configuracion.navigators.each do |navigator|
154
+ navigator.configure(@navbar)
155
+ end
148
156
 
149
157
  if defined?(Rollbar) && Rollbar.configuration.enabled && Rails.application.credentials.rollbar.present?
150
158
  @rollbar_token = Rails.application.credentials.rollbar.access_token_client
@@ -9,9 +9,5 @@ module PgEngine
9
9
 
10
10
  add_breadcrumb 'Inicio', :users_root_path unless using_modal2? || frame_embedded?
11
11
  end
12
-
13
- def home
14
- render html: '<h1>Inicio</h1>'.html_safe, layout: 'pg_layout/centered'
15
- end
16
12
  end
17
13
  end
@@ -2,6 +2,12 @@ module Public
2
2
  class WebhooksController < PublicController
3
3
  skip_before_action :verify_authenticity_token
4
4
 
5
+ # TODO: mover a un namespace de webhooks
6
+ around_action :set_without_tenant
7
+ def set_without_tenant(&)
8
+ ActsAsTenant.without_tenant(&)
9
+ end
10
+
5
11
  before_action :verify_signature, only: :mailgun
6
12
 
7
13
  rescue_from StandardError do |err|
@@ -0,0 +1,9 @@
1
+ module Users
2
+ class DashboardController < PgEngine.config.users_controller
3
+ layout 'pg_layout/containerized'
4
+
5
+ def dashboard
6
+ add_breadcrumb 'Resumen'
7
+ end
8
+ end
9
+ end
@@ -102,6 +102,12 @@ class User < ApplicationRecord
102
102
 
103
103
  class Error < PgEngine::Error; end
104
104
 
105
+ def user_accounts_without_tenant
106
+ ActsAsTenant.without_tenant do
107
+ user_accounts.to_a
108
+ end
109
+ end
110
+
105
111
  def default_account
106
112
  raise Error, 'El usuario debe tener cuenta' if accounts.empty?
107
113
 
@@ -1,4 +1,4 @@
1
- h1 Cambiar a otra cuenta
1
+ h1 ¿Qué cuenta te gustaría utilizar?
2
2
 
3
3
  / FIXME!: user_accounts add active column
4
4
  - if @user_accounts.empty?
@@ -0,0 +1 @@
1
+ h1 Dashboard
@@ -0,0 +1,7 @@
1
+ ActiveSupport.on_load :action_controller do
2
+ if defined? UsersController
3
+ PgEngine.configurar do |config|
4
+ config.users_controller = UsersController
5
+ end
6
+ end
7
+ end
@@ -21,6 +21,7 @@ Rails.application.routes.draw do
21
21
  registrations: 'users/registrations'
22
22
  }, failure_app: PgEngine::DeviseFailureApp
23
23
  namespace :users, path: 'u' do
24
+ get 'dashboard', to: 'dashboard#dashboard'
24
25
  post 'notifications/mark_as_seen', to: 'notifications#mark_as_seen'
25
26
  post 'notifications/mark_as_unseen', to: 'notifications#mark_as_unseen'
26
27
  get 'date_jumper/jump'
@@ -33,7 +34,7 @@ Rails.application.routes.draw do
33
34
  # get 'account', to: 'accounts#show'
34
35
  end
35
36
 
36
- get '/u', to: 'users#home', as: :users_root
37
+ get '/u', to: 'users/dashboard#dashboard', as: :users_root
37
38
 
38
39
  namespace :admin, path: 'a' do
39
40
  pg_resource(:emails)
@@ -4,14 +4,11 @@
4
4
 
5
5
  module PgEngine
6
6
  class Configuracion
7
- attr_accessor :users_controller, :global_domains
7
+ attr_accessor :users_controller, :global_domains, :navigators
8
8
 
9
9
  def initialize
10
- if defined? UsersController
11
- @users_controller = UsersController
12
- end
13
-
14
10
  @global_domains = ['app.localhost.com', 'test.host', 'localhost']
11
+ @navigators = [PgEngine::Navigator.new]
15
12
  end
16
13
  end
17
14
  end
@@ -0,0 +1,67 @@
1
+ module PgEngine
2
+ class Navigator
3
+ # rubocop:disable Metrics/MethodLength
4
+ def configure(navbar)
5
+ navbar.add_item('sidebar.not_signed_in', {
6
+ name: 'Crear una cuenta',
7
+ path: 'new_user_registration_path'
8
+ })
9
+ navbar.add_item('sidebar.not_signed_in', {
10
+ name: 'Iniciar sesión',
11
+ path: 'new_user_session_path'
12
+ })
13
+ navbar.add_item('sidebar.not_signed_in', {
14
+ name: 'Contacto',
15
+ path: 'new_public_mensaje_contacto_path'
16
+ })
17
+
18
+ # *****************************************************
19
+
20
+ navbar.add_item('sidebar.signed_in', {
21
+ name: 'Inicio',
22
+ path: 'users_root_path',
23
+ priority: 0
24
+ })
25
+ navbar.add_item('sidebar.signed_in', {
26
+ name: 'Mi perfil',
27
+ path: 'edit_user_registration_path',
28
+ policy: 'policy(Current.user).edit?'
29
+ })
30
+ navbar.add_item('sidebar.signed_in', {
31
+ name: 'Cerrar sesión',
32
+ path: 'destroy_user_session_path',
33
+ attributes: 'data-turbo-method="delete"'
34
+ })
35
+
36
+ # *****************************************************
37
+
38
+ return unless Current.user&.developer?
39
+
40
+ navbar.add_item('sidebar.signed_in', {
41
+ name: 'Eventos',
42
+ path: 'admin_eventos_path'
43
+ })
44
+ navbar.add_item('sidebar.signed_in', {
45
+ name: 'Emails',
46
+ path: 'admin_emails_path'
47
+ })
48
+ navbar.add_item('sidebar.signed_in', {
49
+ name: 'Email logs',
50
+ path: 'admin_email_logs_path'
51
+ })
52
+ navbar.add_item('sidebar.signed_in', {
53
+ name: 'Users',
54
+ path: 'admin_users_path'
55
+ })
56
+ navbar.add_item('sidebar.signed_in', {
57
+ name: 'Accounts',
58
+ path: 'admin_accounts_path'
59
+ })
60
+ navbar.add_item('sidebar.signed_in', {
61
+ name: 'User Accounts',
62
+ path: 'admin_user_accounts_path'
63
+ })
64
+ end
65
+ # rubocop:enable Metrics/MethodLength
66
+ end
67
+ end
@@ -4,6 +4,7 @@ require_relative 'pg_engine/engine'
4
4
  require_relative 'pg_engine/core_ext'
5
5
  require_relative 'pg_engine/error'
6
6
  require_relative 'pg_engine/configuracion'
7
+ require_relative 'pg_engine/navigator'
7
8
  require_relative 'pg_engine/email_observer'
8
9
  require_relative 'pg_engine/mailgun/log_sync'
9
10
  require_relative 'pg_engine/route_helpers'
@@ -76,4 +76,15 @@ describe 'Base requests' do
76
76
  include_examples 'manda el status correcto'
77
77
  end
78
78
  end
79
+
80
+ describe 'unknown format' do
81
+ subject do
82
+ get '/users/sign_in', headers: { accept: 'application/json' }
83
+ end
84
+
85
+ it 'returns bad request' do
86
+ subject
87
+ expect(response).to have_http_status(:bad_request)
88
+ end
89
+ end
79
90
  end
@@ -26,14 +26,18 @@ def build_body(log_id, signature, timestamp)
26
26
  JSON
27
27
  end
28
28
 
29
- describe Public::WebhooksController do
29
+ describe 'webhooks' do
30
30
  include ActiveSupport::Testing::TimeHelpers
31
31
 
32
- before { travel_to Time.zone.at(1_716_564_587) }
32
+ before do
33
+ travel_to Time.zone.at(1_716_564_587)
34
+ ActsAsTenant.current_tenant = nil
35
+ ActsAsTenant.test_tenant = nil
36
+ end
33
37
 
34
38
  describe '#mailgun' do
35
39
  subject do
36
- post :mailgun, body:, as: :json
40
+ post '/webhook/mailgun', params: body, headers: { 'content-type': 'application/json' }
37
41
  end
38
42
 
39
43
  let(:signature) { 'c524037907046276117758afae8a340e77a43a6e48eb35a9521426e7a3ff675b' }
@@ -114,11 +118,15 @@ describe Public::WebhooksController do
114
118
 
115
119
  context 'cuando ya se usó el token' do
116
120
  subject do
117
- post :mailgun, body: build_body('otro id', signature, timestamp), as: :json
121
+ post '/webhook/mailgun',
122
+ params: build_body('otro id', signature, timestamp),
123
+ headers: { 'content-type': 'application/json' }
118
124
  end
119
125
 
120
126
  before do
121
- post :mailgun, body: build_body(log_id, signature, timestamp), as: :json
127
+ post '/webhook/mailgun',
128
+ params: build_body(log_id, signature, timestamp),
129
+ headers: { 'content-type': 'application/json' }
122
130
  end
123
131
 
124
132
  it_behaves_like 'todo bien pero no guarda el log'
@@ -0,0 +1,19 @@
1
+ require 'rails_helper'
2
+
3
+ describe 'DASHBOARD' do
4
+ let(:logged_user) { create :user }
5
+
6
+ before do
7
+ sign_in logged_user
8
+ end
9
+
10
+ it 'when requesting /u' do
11
+ get '/u'
12
+ expect(response.body).to include '<h1>Dashboard</h1>'
13
+ end
14
+
15
+ it 'when requesting /u/dashboard' do
16
+ get '/u/dashboard'
17
+ expect(response.body).to include '<h1>Dashboard</h1>'
18
+ end
19
+ end
@@ -55,7 +55,7 @@ describe 'redirection' do
55
55
  get '/u/cosas'
56
56
  expect(response).to redirect_to users_account_switcher_path
57
57
  follow_redirect!
58
- expect(response.body).to include 'Cambiar a otra cuenta'
58
+ expect(response.body).to include '¿Qué cuenta te gustaría utilizar?'
59
59
  post "/u/switcher/#{other_user_account.to_param}"
60
60
  expect(response).to redirect_to(root_path)
61
61
  follow_redirect!
@@ -8,7 +8,6 @@ describe 'Notifications' do
8
8
  let(:user) { create :user }
9
9
 
10
10
  before do
11
- driven_by ENV['DRIVER']&.to_sym || :selenium_chrome_headless_iphone
12
11
  login_as user
13
12
  end
14
13
 
@@ -37,7 +37,7 @@ describe 'Tenants' do
37
37
  it 'shows the switcher' do
38
38
  visitar
39
39
 
40
- expect(page).to have_text 'Cambiar a otra cuenta'
40
+ expect(page).to have_text '¿Qué cuenta te gustaría utilizar?'
41
41
  end
42
42
 
43
43
  it 'switches to account' do
@@ -3,11 +3,24 @@ import { Controller } from '@hotwired/stimulus'
3
3
  // Connects to data-controller="clear-timeout"
4
4
  export default class extends Controller {
5
5
  connect () {
6
- this.element.dataset.timeoutId.split(',').forEach((el) => {
7
- const timeoutId = parseInt(el)
8
- clearTimeout(timeoutId)
9
- console.log(`clearedTimeout: ${timeoutId}`)
10
- })
6
+ if (this.element.dataset.timeoutId) {
7
+ this.element.dataset.timeoutId.split(',').forEach((el) => {
8
+ this.clear(el)
9
+ })
10
+ } else {
11
+ const headId = document.head.dataset.timeoutId
12
+ if (headId) {
13
+ headId.split(',').forEach((el) => {
14
+ this.clear(el)
15
+ })
16
+ }
17
+ }
11
18
  this.element.remove()
12
19
  }
20
+
21
+ clear (id) {
22
+ const timeoutId = parseInt(id)
23
+ clearTimeout(timeoutId)
24
+ console.log(`clearedTimeout: ${timeoutId}`)
25
+ }
13
26
  }
@@ -4,10 +4,9 @@ class Navbar
4
4
  attr_reader :extensiones
5
5
  attr_accessor :logo, :logo_xl, :logo_xl_url
6
6
 
7
- def initialize(user)
8
- @user = user
9
- @yaml_data = YAML.load_file("#{Rails.application.root}/config/pg_rails.yml")
10
- @yaml_data = ActiveSupport::HashWithIndifferentAccess.new(@yaml_data)
7
+ def initialize
8
+ @user = Current.user
9
+ @yaml_data = ActiveSupport::HashWithIndifferentAccess.new({})
11
10
  @extensiones = []
12
11
  end
13
12
 
@@ -31,15 +30,21 @@ class Navbar
31
30
  return [] if bar_data.blank?
32
31
 
33
32
  # rubocop:disable Security/Eval
33
+ # rubocop:disable Style/MultilineBlockChain:
34
+ orig_idx = 0
34
35
  bar_data.map do |item|
36
+ orig_idx += 1
35
37
  {
36
38
  title: item['name'],
37
39
  attributes: item['attributes']&.html_safe,
38
40
  path: eval(item['path']),
39
- show: item['policy'] ? eval(item['policy']) : true
41
+ show: item['policy'] ? eval(item['policy']) : true,
42
+ priority: item['priority'] || 999_999,
43
+ orig_idx:
40
44
  }
41
- end
45
+ end.sort_by { |a| [a[:priority], a[:orig_idx]] }
42
46
  # rubocop:enable Security/Eval
47
+ # rubocop:enable Style/MultilineBlockChain:
43
48
  end
44
49
 
45
50
  def all_children_hidden?(entry)
@@ -6,7 +6,7 @@
6
6
  <% if user_signed_in? %>
7
7
  <span class="d-inline-block px-3 text-end text-light"><%= Current.user %></span>
8
8
  <span class="d-block px-3 text-secondary">
9
- <% if Current.user.user_accounts.count > 1 %>
9
+ <% if Current.user.user_accounts_without_tenant.count > 1 %>
10
10
  <%= link_to ActsAsTenant.current_tenant, [:users, ActsAsTenant.current_tenant] if ActsAsTenant.current_tenant.present? %>
11
11
  <%= link_to users_account_switcher_path do %>
12
12
  <% if ActsAsTenant.current_tenant.present? %>
@@ -2,7 +2,11 @@ require 'rails_helper'
2
2
 
3
3
  describe Navbar do
4
4
  let(:user) { create :user }
5
- let(:instancia) { described_class.new(user) }
5
+ let(:instancia) { described_class.new }
6
+
7
+ before do
8
+ Current.user = user
9
+ end
6
10
 
7
11
  describe '#add_html' do
8
12
  subject { instancia.add_html(some_html) }
@@ -49,4 +49,4 @@ Capybara.register_driver :selenium_chrome_headless_iphone,
49
49
  &chrome_driver_gen(headless: true, emulate_device: 'iPhone 6')
50
50
  Capybara.register_driver :selenium_chrome_debugger, &chrome_driver_gen(headless: false, debugger: true)
51
51
 
52
- Capybara.javascript_driver = ENV.fetch('WEBDRIVER') { 'selenium_chrome_notebook' }.to_sym
52
+ Capybara.javascript_driver = ENV.fetch('DRIVER') { 'selenium_chrome_notebook' }.to_sym
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PgRails
4
- VERSION = '7.5.7'
4
+ VERSION = '7.6.1'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pg_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.5.7
4
+ version: 7.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martín Rosso
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-09-20 00:00:00.000000000 Z
11
+ date: 2024-09-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -691,6 +691,7 @@ files:
691
691
  - pg_engine/app/controllers/users/account_switcher_controller.rb
692
692
  - pg_engine/app/controllers/users/accounts_controller.rb
693
693
  - pg_engine/app/controllers/users/confirmations_controller.rb
694
+ - pg_engine/app/controllers/users/dashboard_controller.rb
694
695
  - pg_engine/app/controllers/users/date_jumper_controller.rb
695
696
  - pg_engine/app/controllers/users/notifications_controller.rb
696
697
  - pg_engine/app/controllers/users/registrations_controller.rb
@@ -779,6 +780,8 @@ files:
779
780
  - pg_engine/app/views/public/mensaje_contactos/new.html.slim
780
781
  - pg_engine/app/views/users/account_switcher/list.html.slim
781
782
  - pg_engine/app/views/users/accounts/show.html.slim
783
+ - pg_engine/app/views/users/dashboard/dashboard.html.slim
784
+ - pg_engine/config/initializers/action_controller.rb
782
785
  - pg_engine/config/initializers/action_mailer.rb
783
786
  - pg_engine/config/initializers/active_admin.rb
784
787
  - pg_engine/config/initializers/acts_as_tenant.rb
@@ -822,6 +825,7 @@ files:
822
825
  - pg_engine/lib/pg_engine/engine.rb
823
826
  - pg_engine/lib/pg_engine/error.rb
824
827
  - pg_engine/lib/pg_engine/mailgun/log_sync.rb
828
+ - pg_engine/lib/pg_engine/navigator.rb
825
829
  - pg_engine/lib/pg_engine/route_helpers.rb
826
830
  - pg_engine/lib/pg_engine/utils/check_invalid_records.rb
827
831
  - pg_engine/lib/pg_engine/utils/pdf_preview_generator.rb
@@ -847,7 +851,6 @@ files:
847
851
  - pg_engine/spec/controllers/devise/sessions_controller_spec.rb
848
852
  - pg_engine/spec/controllers/pg_engine/base_controller_spec.rb
849
853
  - pg_engine/spec/controllers/public/mensaje_contactos_controller_spec.rb
850
- - pg_engine/spec/controllers/public/webhooks_controller_spec.rb
851
854
  - pg_engine/spec/controllers/users/confirmations_controller_spec.rb
852
855
  - pg_engine/spec/decorators/email_decorator_spec.rb
853
856
  - pg_engine/spec/factories/accounts.rb
@@ -880,8 +883,10 @@ files:
880
883
  - pg_engine/spec/requests/base_controller_requests_spec.rb
881
884
  - pg_engine/spec/requests/current_attributes_spec.rb
882
885
  - pg_engine/spec/requests/devise_spec.rb
886
+ - pg_engine/spec/requests/public/webhooks_spec.rb
883
887
  - pg_engine/spec/requests/users/accounts_spec.rb
884
888
  - pg_engine/spec/requests/users/base_controller_spec.rb
889
+ - pg_engine/spec/requests/users/dashboard_spec.rb
885
890
  - pg_engine/spec/requests/users/date_jumper_spec.rb
886
891
  - pg_engine/spec/requests/users/registrations_spec.rb
887
892
  - pg_engine/spec/requests/users/switcher_spec.rb