graphql-client 0.0.14 → 0.0.15

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 278405e1d3ed9e52b3544297dbdd9a6b6d8ce5c7
4
- data.tar.gz: aa9c7f764f7e31a02e5cb2ee0b98a1058282ec70
3
+ metadata.gz: 82a2932b4b6e2c7a9bda10a683f88835c6e21a2c
4
+ data.tar.gz: c01bfc95eee130530808e40a3c83b32f2a3dcb0c
5
5
  SHA512:
6
- metadata.gz: 4bc190c10a0541b8ec37907f81511f57097d496a910194e2315b2683efba60b329f00a93298ef69ce9d5bb967acaa72fbd2fe33196c3687247f23336da70121b
7
- data.tar.gz: 2367e53f7b06fd919218eeb0dcffc5d4be6274d1a96e03a76fe64e9ff3aa5b464232efaf5b6e7f3dbb1b1b7fd3af017d9f166bb401ed410b8b2b02add7ccc2ec
6
+ metadata.gz: 541ce88dda647e3a7f38240d3f53144a5fd2b0739b70b514016419db8d1edb036dd8e8f3fa431f73943dc309e6c818cd7be6bb0f2182515b98e3cf9201439f27
7
+ data.tar.gz: f612df0408bfdfdef608faf5edc01869c8bad3dc05787c6942bf1db7902bdc3f903d4d5cd9b4d7d45499a936a4e43e6aa83c4a1f6e9109b49bad5ff513e46302
@@ -17,6 +17,22 @@ module GraphQL
17
17
  end
18
18
  end
19
19
 
20
+ class ResponseErrors < Error
21
+ include Enumerable
22
+
23
+ attr_reader :errors
24
+
25
+ def initialize(definition, errors)
26
+ @request_definition = definition
27
+ @errors = errors.map { |error| ResponseError.new(definition, error) }
28
+ super @errors.map(&:message).join(", ")
29
+ end
30
+
31
+ def each(&block)
32
+ errors.each(&block)
33
+ end
34
+ end
35
+
20
36
  attr_reader :schema, :fetch
21
37
 
22
38
  attr_accessor :document_tracking_enabled
@@ -59,7 +75,13 @@ module GraphQL
59
75
  #
60
76
  # Returns String.
61
77
  def definition_name
62
- @definition_name ||= (name || "#{self.class.name}_#{object_id}").gsub("::", "__").freeze
78
+ return @definition_name if defined?(@definition_name)
79
+
80
+ if name
81
+ @definition_name = name.gsub("::", "__").freeze
82
+ else
83
+ "#{self.class.name}_#{object_id}".gsub("::", "__").freeze
84
+ end
63
85
  end
64
86
 
65
87
  # Public: Get document with only the definitions needed to perform this
@@ -205,13 +227,13 @@ module GraphQL
205
227
  end
206
228
 
207
229
  document = definition.document
208
- result = fetch.call(document, variables, context)
230
+ result = fetch.call(document, definition.operation_name, variables, context)
209
231
  data, errors, extensions = result.values_at("data", "errors", "extensions")
210
232
 
211
233
  if data && errors
212
234
  PartialResponse.new(
213
235
  data: definition.new(data),
214
- errors: errors.map { |error| ResponseError.new(definition, error) },
236
+ errors: ResponseErrors.new(definition, errors),
215
237
  extensions: extensions
216
238
  )
217
239
  elsif data && !errors
@@ -221,7 +243,7 @@ module GraphQL
221
243
  )
222
244
  elsif !data && errors
223
245
  FailedResponse.new(
224
- errors: errors.map { |error| ResponseError.new(definition, error) },
246
+ errors: ResponseErrors.new(definition, errors),
225
247
  extensions: extensions
226
248
  )
227
249
  else
@@ -0,0 +1,17 @@
1
+ require "action_view"
2
+
3
+ module GraphQL
4
+ class Client
5
+ class Erubis < ActionView::Template::Handlers::Erubis
6
+ def self.extract_graphql_sections(src)
7
+ src.scan(/<%graphql([^%]+)%>/).flatten.first
8
+ end
9
+
10
+ # Ignore static <%graphql sections
11
+ def convert_input(src, input)
12
+ input = input.gsub(/<%graphql/, "<%#")
13
+ super(src, input)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,145 @@
1
+ require "active_support/dependencies"
2
+ require "active_support/inflector"
3
+ require "graphql/client/erubis"
4
+
5
+ module GraphQL
6
+ class Client
7
+ module ViewModule
8
+ attr_accessor :client
9
+
10
+ # Public: Eager load module and all subdependencies.
11
+ #
12
+ # Use in production when cache_classes is true.
13
+ #
14
+ # Traverses all app/views/**/*.erb and loads all static constants defined in
15
+ # ERB files.
16
+ #
17
+ # Examples
18
+ #
19
+ # Views.eager_load!
20
+ #
21
+ # Returns nothing.
22
+ def eager_load!
23
+ return unless File.directory?(self.path)
24
+
25
+ Dir.entries(self.path).each do |entry|
26
+ next if entry == "." || entry == ".."
27
+ name = entry.sub(/(\.\w+)+$/, "").camelize.to_sym
28
+ if ViewModule.valid_constant_name?(name) && loadable_const_defined?(name)
29
+ mod = const_get(name, false)
30
+ mod.eager_load!
31
+ else
32
+ # Ignore template names that don't camelize to safe constants:
33
+ # 404, foo-dash
34
+ end
35
+ end
36
+
37
+ nil
38
+ end
39
+
40
+ # Internal: Check if name is a valid Ruby constant identifier.
41
+ #
42
+ # name - String or Symbol constant name
43
+ #
44
+ # Examples
45
+ #
46
+ # valid_constant_name?("Foo") #=> true
47
+ # valid_constant_name?("404") #=> false
48
+ #
49
+ # Returns true if name is a valid constant, otherwise false if name would
50
+ # result in a "NameError: wrong constant name".
51
+ def self.valid_constant_name?(name)
52
+ name.to_s =~ /^[A-Z][a-zA-Z0-9_]*$/
53
+ end
54
+
55
+ # Public: Override constant defined to check if constant name matches a
56
+ # view directory or template namespace.
57
+ #
58
+ # name - String or Symbol constant name
59
+ # inherit - If the lookup will also search the ancestors (default: true)
60
+ #
61
+ # Returns true if definition is found, otherwise false.
62
+ # def const_defined?(name, inherit = true)
63
+ # if super(name.to_sym, inherit)
64
+ # true
65
+ # elsif const_path(name)
66
+ # true
67
+ # else
68
+ # false
69
+ # end
70
+ # end
71
+
72
+ def loadable_const_defined?(name)
73
+ if const_defined?(name.to_sym, false)
74
+ true
75
+ elsif const_path(name)
76
+ true
77
+ else
78
+ false
79
+ end
80
+ end
81
+
82
+ # Public: Source location that defined the Module.
83
+ #
84
+ # Returns absolute String path under app/views.
85
+ attr_accessor :path
86
+
87
+ # Internal: Detect source location for constant name.
88
+ #
89
+ # name - String or Symbol constant name
90
+ #
91
+ # Examples
92
+ #
93
+ # Views.const_path(:Users) #=> "app/views/users"
94
+ # Views::Users.const_path(:Show) #=> "app/views/users/show.html.erb"
95
+ # Views::Users.const_path(:Profile) #=> "app/views/users/_profile.html.erb"
96
+ #
97
+ # Returns String absolute path to file, otherwise nil.
98
+ def const_path(name)
99
+ pathname = ActiveSupport::Inflector.underscore(name.to_s)
100
+ Dir[File.join(self.path, "{#{pathname},_#{pathname}}{/,.*}")].map { |fn| File.expand_path(fn) }.first
101
+ end
102
+
103
+ # Internal: Initialize new module for constant name and load ERB statics.
104
+ #
105
+ # path - String path of directory or erb file.
106
+ #
107
+ # Examples
108
+ #
109
+ # load_module("app/views/users")
110
+ # load_module("app/views/users/show.html.erb")
111
+ #
112
+ # Returns new Module implementing Loadable concern.
113
+ def load_module(path)
114
+ mod = Module.new
115
+
116
+ if File.extname(path) == ".erb"
117
+ contents = File.read(path)
118
+ query = GraphQL::Client::Erubis.extract_graphql_sections(contents)
119
+ mod = client.parse(query) if query
120
+ end
121
+
122
+ mod.extend(ViewModule)
123
+ mod.client = self.client
124
+ mod.path = path
125
+ mod
126
+ end
127
+
128
+ # Public: Implement constant missing hook to autoload View ERB statics.
129
+ #
130
+ # name - String or Symbol constant name
131
+ #
132
+ # Returns module or raises NameError if missing.
133
+ def const_missing(name)
134
+ if path = const_path(name)
135
+ mod = load_module(path)
136
+ const_set(name, mod)
137
+ mod.unloadable
138
+ mod
139
+ else
140
+ super
141
+ end
142
+ end
143
+ end
144
+ end
145
+ end
metadata CHANGED
@@ -1,15 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphql-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.14
4
+ version: 0.0.15
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitHub
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-09 00:00:00.000000000 Z
11
+ date: 2016-09-10 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: actionpack
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '6.0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '3.0'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '6.0'
13
33
  - !ruby/object:Gem::Dependency
14
34
  name: activesupport
15
35
  requirement: !ruby/object:Gem::Requirement
@@ -17,9 +37,9 @@ dependencies:
17
37
  - - ">="
18
38
  - !ruby/object:Gem::Version
19
39
  version: '3.0'
20
- - - "<="
40
+ - - "<"
21
41
  - !ruby/object:Gem::Version
22
- version: '5.0'
42
+ version: '6.0'
23
43
  type: :runtime
24
44
  prerelease: false
25
45
  version_requirements: !ruby/object:Gem::Requirement
@@ -27,9 +47,9 @@ dependencies:
27
47
  - - ">="
28
48
  - !ruby/object:Gem::Version
29
49
  version: '3.0'
30
- - - "<="
50
+ - - "<"
31
51
  - !ruby/object:Gem::Version
32
- version: '5.0'
52
+ version: '6.0'
33
53
  - !ruby/object:Gem::Dependency
34
54
  name: graphql
35
55
  requirement: !ruby/object:Gem::Requirement
@@ -80,7 +100,9 @@ extra_rdoc_files: []
80
100
  files:
81
101
  - LICENSE
82
102
  - lib/graphql/client.rb
103
+ - lib/graphql/client/erubis.rb
83
104
  - lib/graphql/client/query_result.rb
105
+ - lib/graphql/client/view_module.rb
84
106
  - lib/graphql/language/nodes/deep_freeze_ext.rb
85
107
  - lib/graphql/language/operation_slice.rb
86
108
  homepage: https://github.com/github/graphql-client