Module: Quail::SchemaBuilder::Discovery

Defined in:
lib/quail/schema_builder/discovery.rb

Overview

Discovers custom mutation and query classes from the app/graphql directory.

Class Method Summary collapse

Class Method Details

.custom_mutationsObject



7
8
9
# File 'lib/quail/schema_builder/discovery.rb', line 7

def self.custom_mutations
  discover_classes("mutations", Quail::Mutation)
end

.custom_queriesObject



11
12
13
# File 'lib/quail/schema_builder/discovery.rb', line 11

def self.custom_queries
  discover_classes("queries", Quail::Query)
end

.discover_classes(dir, base_class) ⇒ Object



15
16
17
18
19
20
21
22
23
24
# File 'lib/quail/schema_builder/discovery.rb', line 15

def self.discover_classes(dir, base_class)
  return {} unless defined?(Rails)

  result = {}
  Dir[Rails.root.join("app/graphql/#{dir}/**/*.rb")].each do |f|
    name, klass = resolve_class(f, dir, base_class)
    result[name] = klass if klass
  end
  result
end

.resolve_class(file, dir, base_class) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/quail/schema_builder/discovery.rb', line 26

def self.resolve_class(file, dir, base_class)
  relative = Pathname.new(file).relative_path_from(Rails.root.join("app/graphql/#{dir}"))
  base_name = relative.to_s.delete_suffix(".rb").camelize

  # Try top-level constant first (autoload root convention), fall back to namespaced
  klass = begin
    base_name.constantize
  rescue NameError
    "#{dir.camelize}::#{base_name}".constantize
  end
  return nil unless klass < base_class

  [klass.name.demodulize.camelize(:lower).to_sym, klass]
end