Sha256: da95d871558b3279f4eea29e4815f26f4447dbe31cabf55537a95b46b3618e9a

Contents?: true

Size: 1.44 KB

Versions: 2

Compression:

Stored size: 1.44 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|
            namespace.const_set(sym, fragment)
            ::Fragment.const_set(sym, fragment) unless namespace == ::Fragment
          end
        end

        private

        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

2 entries across 2 versions & 1 rubygems

Version Path
ecoportal-api-graphql-0.3.7 lib/ecoportal/api/graphql/fragment.rb
ecoportal-api-graphql-0.3.6 lib/ecoportal/api/graphql/fragment.rb