Class: GraphqlPicker::Picker

Inherits:
Object
  • Object
show all
Defined in:
lib/graphql_picker.rb

Instance Method Summary collapse

Constructor Details

#initialize(options) ⇒ Picker

Returns a new instance of Picker.



9
10
11
12
13
# File 'lib/graphql_picker.rb', line 9

def initialize(options)
  @name = options[:name]
  @path = options[:path] || './'
  @definitions = nil
end

Instance Method Details

#parse(all) ⇒ Object



80
81
82
# File 'lib/graphql_picker.rb', line 80

def parse(all)
  GraphQL.parse(all)
end

#pickObject



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/graphql_picker.rb', line 15

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) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/graphql_picker.rb', line 45

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) ⇒ Object



36
37
38
39
40
41
42
43
# File 'lib/graphql_picker.rb', line 36

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_filesObject



72
73
74
75
76
77
78
# File 'lib/graphql_picker.rb', line 72

def search_files
  files = []
  Dir.glob("#{@path}/**/*.graphql") do |file|
    files << file
  end
  files
end

#search_included_fragment(definition, result = {}) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/graphql_picker.rb', line 58

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