Sha256: 4f399fd665471ba41bc8d2330e5cd4f4cd5adc4fb1c2429a5472a29111b887b2

Contents?: true

Size: 1.69 KB

Versions: 4

Compression:

Stored size: 1.69 KB

Contents

# Namespace to create custom fragments from client scripts
module Fragment
  include Ecoportal::API::Common::GraphQL::ClassHelpers
end
# Class to define/parse fragments
module Ecoportal
  module API
    class GraphQL
      class Fragment
        include Ecoportal::API::Common::GraphQL::ClassHelpers

        class << self
          def fragment(sym, heredoc)
            fragments[sym] = heredoc
          end

          def fragments
            @fragments ||= {}
          end
        end

        attr_reader :client, :fragments

        def initialize(client)
          @client = client
          parse
        end

        def define(sym, heredoc, namespace: ::Fragment)
          namespace.send(:remove_const, sym) if namespace.const_defined?(sym)
          client.parse(heredoc).tap do |fragment|
            without_warnings do
              namespace.const_set(sym, fragment)
              ::Fragment.const_set(sym, fragment) unless namespace == ::Fragment
            end
          end
        end

        private

        def without_warnings
          original_verbose = $VERBOSE
          $VERBOSE         = nil

          yield if block_given?
        ensure
          $VERBOSE = original_verbose
        end

        def parse
          fragments = self.class.fragments.each_with_object({}) do |(sym, heredoc), out|
            out[sym] = define(sym, heredoc, namespace: self.class)
          end
        end
      end
    end
  end
end

require 'ecoportal/api/graphql/fragment/pagination'
require 'ecoportal/api/graphql/fragment/location_node'
require 'ecoportal/api/graphql/fragment/action'
require 'ecoportal/api/graphql/fragment/contractor_entity'

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
ecoportal-api-graphql-0.4.3 lib/ecoportal/api/graphql/fragment.rb
ecoportal-api-graphql-0.4.2 lib/ecoportal/api/graphql/fragment.rb
ecoportal-api-graphql-0.4.1 lib/ecoportal/api/graphql/fragment.rb
ecoportal-api-graphql-0.4.0 lib/ecoportal/api/graphql/fragment.rb