class GraphqlPicker::Picker
Public Class Methods
new(options)
click to toggle source
# File lib/graphql_picker.rb, line 8 def initialize(options) @name = options[:name] @path = options[:path] || './' @definitions = nil end
Public Instance Methods
parse(all)
click to toggle source
# File lib/graphql_picker.rb, line 79 def parse(all) GraphQL.parse(all) end
pick()
click to toggle source
# File lib/graphql_picker.rb, line 14 def pick concat_string = '' search_files.each do |file| string = File.read(file) concat_string += string end parsed = parse(concat_string) @definitions = parsed.definitions target = search_by_name(@name, parsed.definitions) fragments = search_included_fragment(target) results = [] results << "# #{search_file(target.name)}" results << target.to_query_string Array(fragments.keys).each do |fragment_name| results << "# #{search_file(fragment_name)}" results << search_by_name(fragment_name, parsed.definitions).to_query_string end results.join("\n") end
search_by_name(name, definitions)
click to toggle source
# File lib/graphql_picker.rb, line 44 def search_by_name(name, definitions) definitions.each do |definition| if definition.respond_to?(:name) return definition if name == definition.name elsif definition.respond_to?(:selections) if (obj = search_by_name(name, definition.selections)) && !obj.nil? return obj end end end nil end
search_file(name)
click to toggle source
# File lib/graphql_picker.rb, line 35 def search_file(name) search_files.each do |file| string = File.read(file) parsed = parse(string) return file.to_s if search_by_name(name, parsed.definitions) end nil end
search_files()
click to toggle source
# File lib/graphql_picker.rb, line 71 def search_files files = [] Dir.glob("#{@path}/**/*.graphql") do |file| files << file end files end
search_included_fragment(definition, result = {})
click to toggle source
# File lib/graphql_picker.rb, line 57 def search_included_fragment(definition, result = {}) r = result if definition.is_a?(GraphQL::Language::Nodes::FragmentSpread) r[definition.name] = definition r.merge(search_included_fragment(search_by_name(definition.name, @definitions), r)) end if definition.respond_to?(:selections) definition.selections.each do |selection| r.merge(search_included_fragment(selection, r)) end end r end