Skip to content

Commit

Permalink
Load reqs with zeitwerk (#209)
Browse files Browse the repository at this point in the history
* Modify gem files structure to match Zeitwerk requeriments

* Remove unneeded requires

* Remove support for ruby 2.3

* Require rails generator explicitely & avoid constant name clash

* Avoid using generators directory as namespace

* Address code review comments

* Add deprecation messages to legacy concerns and create new ones

* Modify generator to use new concerns

* Remove namespace of error classes after rebase

* Address code review comments
  • Loading branch information
00dav00 committed Mar 5, 2022
1 parent 502c555 commit 80db213
Show file tree
Hide file tree
Showing 48 changed files with 317 additions and 349 deletions.
19 changes: 0 additions & 19 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ workflows:
matrix:
parameters:
ruby-version:
- '2.3'
- '2.4'
- '2.5'
- '2.6'
Expand All @@ -73,24 +72,6 @@ workflows:
- gemfiles/rails7.0_graphql1.12.gemfile
- gemfiles/rails7.0_graphql1.13.gemfile
exclude:
- ruby-version: '2.3'
gemfile: gemfiles/rails6.0_graphql1.11.gemfile
- ruby-version: '2.3'
gemfile: gemfiles/rails6.0_graphql1.12.gemfile
- ruby-version: '2.3'
gemfile: gemfiles/rails6.0_graphql1.13.gemfile
- ruby-version: '2.3'
gemfile: gemfiles/rails6.1_graphql1.11.gemfile
- ruby-version: '2.3'
gemfile: gemfiles/rails6.1_graphql1.12.gemfile
- ruby-version: '2.3'
gemfile: gemfiles/rails6.1_graphql1.13.gemfile
- ruby-version: '2.3'
gemfile: gemfiles/rails7.0_graphql1.11.gemfile
- ruby-version: '2.3'
gemfile: gemfiles/rails7.0_graphql1.12.gemfile
- ruby-version: '2.3'
gemfile: gemfiles/rails7.0_graphql1.13.gemfile
- ruby-version: '2.4'
gemfile: gemfiles/rails6.0_graphql1.11.gemfile
- ruby-version: '2.4'
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,4 @@ README.md.*

.env
/spec/tmp/config/routes.rb
/.byebug_history
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -386,7 +386,7 @@ GQL schema execution like this:
# app/controllers/my_controller.rb

class MyController < ApplicationController
include GraphqlDevise::Concerns::SetUserByToken
include GraphqlDevise::SetUserByToken

def my_action
result = DummySchema.execute(params[:query], context: gql_devise_context(User))
Expand All @@ -399,7 +399,7 @@ end
# app/controllers/my_controller.rb

class MyController < ApplicationController
include GraphqlDevise::Concerns::SetUserByToken
include GraphqlDevise::SetUserByToken

def my_action
result = DummySchema.execute(params[:query], context: gql_devise_context(User, Admin))
Expand Down

This file was deleted.

14 changes: 0 additions & 14 deletions app/controllers/graphql_devise/concerns/set_user_by_token.rb

This file was deleted.

6 changes: 3 additions & 3 deletions app/controllers/graphql_devise/graphql_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,17 @@

module GraphqlDevise
class GraphqlController < ApplicationController
include GraphqlDevise::Concerns::SetUserByToken
include SetUserByToken

def auth
result = if params[:_json]
GraphqlDevise::Schema.multiplex(
Schema.multiplex(
params[:_json].map do |param|
{ query: param[:query] }.merge(execute_params(param))
end
)
else
GraphqlDevise::Schema.execute(params[:query], **execute_params(params))
Schema.execute(params[:query], **execute_params(params))
end

render json: result unless performed?
Expand Down
21 changes: 0 additions & 21 deletions app/models/graphql_devise/concerns/additional_model_methods.rb

This file was deleted.

16 changes: 0 additions & 16 deletions app/models/graphql_devise/concerns/model.rb

This file was deleted.

3 changes: 2 additions & 1 deletion graphql_devise.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,12 @@ Gem::Specification.new do |spec|
`git ls-files -z`.split("\x0").select { |f| f.match(%r{^spec/}) }
end

spec.required_ruby_version = '>= 2.3.0'
spec.required_ruby_version = '>= 2.4.4'

spec.add_dependency 'devise_token_auth', '>= 0.1.43', '< 2.0'
spec.add_dependency 'graphql', '>= 1.8', '< 1.14.0'
spec.add_dependency 'rails', '>= 4.2', '< 7.1'
spec.add_dependency 'zeitwerk'

spec.add_development_dependency 'appraisal'
spec.add_development_dependency 'coveralls-ruby', '~> 0.2'
Expand Down
8 changes: 4 additions & 4 deletions lib/generators/graphql_devise/install_generator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,13 @@ def execute_dta_installer
if File.exist?(File.expand_path("app/models/#{user_class.underscore}.rb", destination_root))
gsub_file(
"app/models/#{user_class.underscore}.rb",
'GraphqlDevise::Concerns::Model',
'GraphqlDevise::Authenticatable',
'DeviseTokenAuth::Concerns::User'
)
end
gsub_file(
'app/controllers/application_controller.rb',
'GraphqlDevise::Concerns::SetUserByToken',
'GraphqlDevise::SetUserByToken',
'DeviseTokenAuth::Concerns::SetUserByToken'
)

Expand Down Expand Up @@ -54,15 +54,15 @@ def replace_model_concern
gsub_file(
"app/models/#{user_class.underscore}.rb",
/^\s+include DeviseTokenAuth::Concerns::User/,
' include GraphqlDevise::Concerns::Model'
' include GraphqlDevise::Authenticatable'
)
end

def replace_controller_concern
gsub_file(
'app/controllers/application_controller.rb',
/^\s+include DeviseTokenAuth::Concerns::SetUserByToken/,
' include GraphqlDevise::Concerns::SetUserByToken'
' include GraphqlDevise::SetUserByToken'
)
end

Expand Down
53 changes: 28 additions & 25 deletions lib/graphql_devise.rb
Original file line number Diff line number Diff line change
@@ -1,13 +1,40 @@
# frozen_string_literal: true

require 'rails'
require 'rails/generators'
require 'graphql'
require 'devise_token_auth'
require 'zeitwerk'

GraphQL::Field.accepts_definitions(authenticate: GraphQL::Define.assign_metadata_key(:authenticate))
GraphQL::Schema::Field.accepts_definition(:authenticate)

legacy_concerns = ['set_user_by_token', 'model']
loader = Zeitwerk::Loader.for_gem

legacy_concerns.each do |concern_name|
loader.ignore("#{__dir__}/graphql_devise/concerns/legacy/#{concern_name}.rb")
end

loader.collapse("#{__dir__}/graphql_devise/concerns")
loader.collapse("#{__dir__}/graphql_devise/errors")
loader.collapse("#{__dir__}/generators")

loader.inflector.inflect('error_codes' => 'ERROR_CODES')
loader.inflector.inflect('supported_options' => 'SUPPORTED_OPTIONS')

loader.setup

legacy_concerns.each do |concern_name|
require_relative "graphql_devise/concerns/legacy/#{concern_name}"
end

ActionDispatch::Routing::Mapper.include(GraphqlDevise::RouteMounter)

module GraphqlDevise
class Error < StandardError; end

class InvalidMountOptionsError < GraphqlDevise::Error; end
class InvalidMountOptionsError < ::GraphqlDevise::Error; end

@schema_loaded = false
@mounted_resources = []
Expand Down Expand Up @@ -53,27 +80,3 @@ def self.configure_warden_serializer_for_model(model)
end

require 'graphql_devise/engine'
require 'graphql_devise/version'
require 'graphql_devise/errors/error_codes'
require 'graphql_devise/errors/execution_error'
require 'graphql_devise/errors/user_error'
require 'graphql_devise/errors/authentication_error'
require 'graphql_devise/errors/detailed_user_error'

require 'graphql_devise/concerns/controller_methods'
require 'graphql_devise/schema'
require 'graphql_devise/types/authenticatable_type'
require 'graphql_devise/types/credential_type'
require 'graphql_devise/types/mutation_type'
require 'graphql_devise/types/query_type'
require 'graphql_devise/default_operations/mutations'
require 'graphql_devise/default_operations/resolvers'
require 'graphql_devise/resolvers/dummy'

require 'graphql_devise/mount_method/option_sanitizer'
require 'graphql_devise/mount_method/options_validator'
require 'graphql_devise/mount_method/operation_preparer'
require 'graphql_devise/mount_method/operation_sanitizer'

require 'graphql_devise/resource_loader'
require 'graphql_devise/schema_plugin'
48 changes: 48 additions & 0 deletions lib/graphql_devise/concerns/additional_controller_methods.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# frozen_string_literal: true

module GraphqlDevise
module AdditionalControllerMethods
extend ActiveSupport::Concern

included do
attr_accessor :client_id, :token, :resource
end

def gql_devise_context(*models)
{
current_resource: authenticate_model(*models),
controller: self
}
end

def authenticate_model(*models)
models.each do |model|
set_resource_by_token(model)
return @resource if @resource.present?
end

nil
end

def resource_class(resource = nil)
# Return the resource class instead of looking for a Devise mapping if resource is already a resource class
return resource if resource.respond_to?(:find_by)

super
end

def set_resource_by_token(resource)
set_user_by_token(resource)
end

def build_redirect_headers(access_token, client, redirect_header_options = {})
{
DeviseTokenAuth.headers_names[:"access-token"] => access_token,
DeviseTokenAuth.headers_names[:client] => client,
:config => params[:config],
:client_id => client,
:token => access_token
}.merge(redirect_header_options)
end
end
end
23 changes: 23 additions & 0 deletions lib/graphql_devise/concerns/authenticatable.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# frozen_string_literal: true

module GraphqlDevise
module Authenticatable
extend ActiveSupport::Concern

included do
include DeviseTokenAuth::Concerns::User

::GraphqlDevise.configure_warden_serializer_for_model(self)
end

class_methods do
def reconfirmable
devise_modules.include?(:confirmable) && column_names.include?('unconfirmed_email')
end
end

def update_with_email(attributes = {})
Model::WithEmailUpdater.new(self, attributes).call
end
end
end
Loading

0 comments on commit 80db213

Please sign in to comment.