graphql 1.9.4 → 1.9.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/lib/graphql/execution/execute.rb +3 -0
- data/lib/graphql/execution/interpreter/runtime.rb +2 -2
- data/lib/graphql/execution/lookahead.rb +57 -22
- data/lib/graphql/introspection/input_value_type.rb +5 -1
- data/lib/graphql/language/parser.rb +57 -54
- data/lib/graphql/language/parser.y +12 -9
- data/lib/graphql/language/token.rb +1 -1
- data/lib/graphql/language/visitor.rb +1 -1
- data/lib/graphql/query/arguments.rb +3 -3
- data/lib/graphql/query/context.rb +6 -6
- data/lib/graphql/query/variable_validation_error.rb +14 -0
- data/lib/graphql/schema.rb +2 -2
- data/lib/graphql/schema/argument.rb +1 -1
- data/lib/graphql/schema/field.rb +6 -3
- data/lib/graphql/schema/object.rb +2 -2
- data/lib/graphql/schema/relay_classic_mutation.rb +1 -1
- data/lib/graphql/schema/rescue_middleware.rb +7 -2
- data/lib/graphql/schema/validation.rb +9 -4
- data/lib/graphql/static_validation/base_visitor.rb +8 -5
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +3 -1
- data/lib/graphql/tracing.rb +3 -3
- data/lib/graphql/types.rb +1 -0
- data/lib/graphql/types/json.rb +25 -0
- data/lib/graphql/types/relay/base_edge.rb +3 -2
- data/lib/graphql/unauthorized_field_error.rb +1 -1
- data/lib/graphql/version.rb +1 -1
- data/spec/dummy/Gemfile.lock +157 -0
- data/spec/dummy/log/test.log +199 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4w/4wzXRZrAkwKdgYaSE0pid5eB-fer8vSfSku_NPg4rMA.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7I/7IHVBiJT06QSpgLpLoJIxboQ0B-D_tMTxsvoezBTV3Q.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8w/8wY_SKagj8wHuwGNAAf6JnQ8joMbC6cEYpHrTAI8Urc.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/AK/AKzz1u6bGb4auXcrObA_g5LL-oV0ejNGa448AgAi_WQ.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ET/ETW4uxvaYpruL8y6_ZptUH82ZowMaHIqvg5WexBFdEM.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F1/F1TWpjjyA56k9Z90n5B3xRn7DUdGjX73QCkYC6k07JQ.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F8/F8MUNRzORGFgr329fNM0xLaoWCXdv3BIalT7dsvLfjs.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/KB/KB07ZaKNC5uXJ7TjLi-WqnY6g7dq8wWp_8N3HNjBNxg.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ms/MsKSimH_UCB-H1tLvDABDHuvGciuoW6kVqQWDrXU5FQ.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Mt/Mtci-Kim50aPOmeClD4AIicKn1d1WJ0n454IjSd94sk.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/QH/QHt3Tc1Y6M66Oo_pDuMyWrQNs4Pp3SMeZR5K1wJj2Ts.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/XU/XU4k1OXnfMils5SrirorPvDSyDSqiOWLZNtmAH1HH8k.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ZI/ZIof7mZxWWCnraIFOCuV6a8QRWzKJXJnx2Xd7C0ZyX0.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/cG/cGc_puuPS5pZKgUcy1Y_i1L6jl5UtsiIrMH59rTzR6c.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/df/dfro_B6bx3KP1Go-7jEOqqZ2j4hVRseXIc3es9PKQno.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jO/jO1DfbqnG0mTULsjJJANc3fefrG2zt7DIMmcptMT628.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pE/pE7gO6pQ-z187Swb4hT554wmqsq-cNzgPWLrCz-LQQQ.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/r9/r9iU1l58a6rxkZSW5RSC52_tD-_UQuHxoMVnkfJ7Mhs.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xi/xitPPFfPIyDMpaznV0sBBcw8eSCV8PJcLLWin78sCgE.cache +0 -0
- data/spec/dummy/tmp/screenshots/failures_test_it_handles_subscriptions.png +0 -0
- data/spec/graphql/authorization_spec.rb +47 -14
- data/spec/graphql/execution/lookahead_spec.rb +29 -2
- data/spec/graphql/function_spec.rb +28 -5
- data/spec/graphql/introspection/input_value_type_spec.rb +40 -1
- data/spec/graphql/language/parser_spec.rb +8 -0
- data/spec/graphql/query/executor_spec.rb +30 -3
- data/spec/graphql/schema/object_spec.rb +71 -0
- data/spec/graphql/schema/relay_classic_mutation_spec.rb +18 -0
- data/spec/graphql/schema/rescue_middleware_spec.rb +14 -0
- data/spec/graphql/schema/warden_spec.rb +1 -1
- data/spec/graphql/types/relay/base_edge_spec.rb +33 -0
- data/spec/integration/rails/graphql/schema_spec.rb +13 -0
- data/spec/integration/tmp/app/graphql/types/bird_type.rb +7 -0
- data/spec/support/dummy/schema.rb +19 -0
- data/spec/support/jazz.rb +16 -14
- metadata +57 -7
|
@@ -14,12 +14,12 @@ module GraphQL
|
|
|
14
14
|
self.argument_definitions = argument_definitions
|
|
15
15
|
|
|
16
16
|
argument_definitions.each do |_arg_name, arg_definition|
|
|
17
|
-
expose_as = arg_definition.expose_as.to_s
|
|
18
|
-
expose_as_underscored = GraphQL::Schema::Member::BuildType.underscore(expose_as)
|
|
17
|
+
expose_as = -arg_definition.expose_as.to_s
|
|
18
|
+
expose_as_underscored = -GraphQL::Schema::Member::BuildType.underscore(expose_as)
|
|
19
19
|
method_names = [expose_as, expose_as_underscored].uniq
|
|
20
20
|
method_names.each do |method_name|
|
|
21
21
|
# Don't define a helper method if it would override something.
|
|
22
|
-
if
|
|
22
|
+
if method_defined?(method_name)
|
|
23
23
|
warn(
|
|
24
24
|
"Unable to define a helper for argument with name '#{method_name}' "\
|
|
25
25
|
"as this is a reserved name. If you're using an argument such as "\
|
|
@@ -44,11 +44,11 @@ module GraphQL
|
|
|
44
44
|
# @api private
|
|
45
45
|
def spawn_child(key:, irep_node:, object:)
|
|
46
46
|
FieldResolutionContext.new(
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
47
|
+
@context,
|
|
48
|
+
key,
|
|
49
|
+
irep_node,
|
|
50
|
+
self,
|
|
51
|
+
object
|
|
52
52
|
)
|
|
53
53
|
end
|
|
54
54
|
|
|
@@ -203,7 +203,7 @@ module GraphQL
|
|
|
203
203
|
attr_reader :irep_node, :field, :parent_type, :query, :schema, :parent, :key, :type
|
|
204
204
|
alias :selection :irep_node
|
|
205
205
|
|
|
206
|
-
def initialize(context
|
|
206
|
+
def initialize(context, key, irep_node, parent, object)
|
|
207
207
|
@context = context
|
|
208
208
|
@key = key
|
|
209
209
|
@parent = parent
|
|
@@ -9,6 +9,11 @@ module GraphQL
|
|
|
9
9
|
@validation_result = validation_result
|
|
10
10
|
|
|
11
11
|
msg = "Variable #{variable_ast.name} of type #{type} was provided invalid value"
|
|
12
|
+
|
|
13
|
+
if problem_fields.any?
|
|
14
|
+
msg += " for #{problem_fields.join(", ")}"
|
|
15
|
+
end
|
|
16
|
+
|
|
12
17
|
super(msg)
|
|
13
18
|
self.ast_node = variable_ast
|
|
14
19
|
end
|
|
@@ -25,6 +30,15 @@ module GraphQL
|
|
|
25
30
|
end
|
|
26
31
|
end
|
|
27
32
|
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
def problem_fields
|
|
37
|
+
@problem_fields ||= @validation_result
|
|
38
|
+
.problems
|
|
39
|
+
.reject { |problem| problem["path"].empty? }
|
|
40
|
+
.map { |problem| "#{problem['path'].join('.')} (#{problem['explanation']})" }
|
|
41
|
+
end
|
|
28
42
|
end
|
|
29
43
|
end
|
|
30
44
|
end
|
data/lib/graphql/schema.rb
CHANGED
|
@@ -246,13 +246,13 @@ module GraphQL
|
|
|
246
246
|
# Validate a query string according to this schema.
|
|
247
247
|
# @param string_or_document [String, GraphQL::Language::Nodes::Document]
|
|
248
248
|
# @return [Array<GraphQL::StaticValidation::Error >]
|
|
249
|
-
def validate(string_or_document, rules: nil)
|
|
249
|
+
def validate(string_or_document, rules: nil, context: nil)
|
|
250
250
|
doc = if string_or_document.is_a?(String)
|
|
251
251
|
GraphQL.parse(string_or_document)
|
|
252
252
|
else
|
|
253
253
|
string_or_document
|
|
254
254
|
end
|
|
255
|
-
query = GraphQL::Query.new(self, document: doc)
|
|
255
|
+
query = GraphQL::Query.new(self, document: doc, context: context)
|
|
256
256
|
validator_opts = { schema: self }
|
|
257
257
|
rules && (validator_opts[:rules] = rules)
|
|
258
258
|
validator = GraphQL::StaticValidation::Validator.new(validator_opts)
|
|
@@ -32,7 +32,7 @@ module GraphQL
|
|
|
32
32
|
# @param camelize [Boolean] if true, the name will be camelized when building the schema
|
|
33
33
|
def initialize(arg_name = nil, type_expr = nil, desc = nil, required:, type: nil, name: nil, description: nil, default_value: NO_DEFAULT, as: nil, camelize: true, prepare: nil, owner:, &definition_block)
|
|
34
34
|
arg_name ||= name
|
|
35
|
-
@name = camelize ? Member::BuildType.camelize(arg_name.to_s) : arg_name.to_s
|
|
35
|
+
@name = -(camelize ? Member::BuildType.camelize(arg_name.to_s) : arg_name.to_s)
|
|
36
36
|
@type_expr = type_expr || type
|
|
37
37
|
@description = desc || description
|
|
38
38
|
@null = !required
|
data/lib/graphql/schema/field.rb
CHANGED
|
@@ -130,7 +130,7 @@ module GraphQL
|
|
|
130
130
|
# The default was overridden
|
|
131
131
|
@scope
|
|
132
132
|
else
|
|
133
|
-
@return_type_expr.is_a?(Array) || (@return_type_expr.is_a?(String) && @return_type_expr.include?("[")) || connection?
|
|
133
|
+
@return_type_expr && (@return_type_expr.is_a?(Array) || (@return_type_expr.is_a?(String) && @return_type_expr.include?("[")) || connection?)
|
|
134
134
|
end
|
|
135
135
|
end
|
|
136
136
|
|
|
@@ -173,8 +173,8 @@ module GraphQL
|
|
|
173
173
|
raise ArgumentError, "keyword `extras:` may only be used with method-based resolve and class-based field such as mutation class, please remove `field:`, `function:` or `resolve:`"
|
|
174
174
|
end
|
|
175
175
|
@original_name = name
|
|
176
|
-
@underscored_name = Member::BuildType.underscore(name.to_s)
|
|
177
|
-
@name = camelize ? Member::BuildType.camelize(name.to_s) : name.to_s
|
|
176
|
+
@underscored_name = -Member::BuildType.underscore(name.to_s)
|
|
177
|
+
@name = -(camelize ? Member::BuildType.camelize(name.to_s) : name.to_s)
|
|
178
178
|
@description = description
|
|
179
179
|
if field.is_a?(GraphQL::Schema::Field)
|
|
180
180
|
raise ArgumentError, "Instead of passing a field as `field:`, use `add_field(field)` to add an already-defined field."
|
|
@@ -504,6 +504,9 @@ module GraphQL
|
|
|
504
504
|
err = GraphQL::UnauthorizedFieldError.new(object: application_object, type: object.class, context: ctx, field: self)
|
|
505
505
|
ctx.schema.unauthorized_field(err)
|
|
506
506
|
end
|
|
507
|
+
rescue GraphQL::UnauthorizedFieldError => err
|
|
508
|
+
err.field ||= self
|
|
509
|
+
ctx.schema.unauthorized_field(err)
|
|
507
510
|
rescue GraphQL::UnauthorizedError => err
|
|
508
511
|
ctx.schema.unauthorized_object(err)
|
|
509
512
|
end
|
|
@@ -37,8 +37,8 @@ module GraphQL
|
|
|
37
37
|
def authorized_new(object, context)
|
|
38
38
|
auth_val = begin
|
|
39
39
|
authorized?(object, context)
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
rescue GraphQL::UnauthorizedError => err
|
|
41
|
+
context.schema.unauthorized_object(err)
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
context.schema.after_lazy(auth_val) do |is_authorized|
|
|
@@ -32,7 +32,7 @@ module GraphQL
|
|
|
32
32
|
# Without the interpreter, the inputs are unwrapped by an instrumenter.
|
|
33
33
|
# But when using the interpreter, no instrumenters are applied.
|
|
34
34
|
if context.interpreter?
|
|
35
|
-
input = inputs[:input].
|
|
35
|
+
input = inputs[:input].to_kwargs
|
|
36
36
|
# Transfer these from the top-level hash to the
|
|
37
37
|
# shortcutted `input:` object
|
|
38
38
|
self.class.extras.each do |ext|
|
|
@@ -43,8 +43,13 @@ module GraphQL
|
|
|
43
43
|
def attempt_rescue(err)
|
|
44
44
|
rescue_table.each { |klass, handler|
|
|
45
45
|
if klass.is_a?(Class) && err.is_a?(klass) && handler
|
|
46
|
-
|
|
47
|
-
|
|
46
|
+
result = handler.call(err)
|
|
47
|
+
case result
|
|
48
|
+
when String
|
|
49
|
+
return GraphQL::ExecutionError.new(result)
|
|
50
|
+
when GraphQL::ExecutionError
|
|
51
|
+
return result
|
|
52
|
+
end
|
|
48
53
|
end
|
|
49
54
|
}
|
|
50
55
|
|
|
@@ -12,11 +12,16 @@ module GraphQL
|
|
|
12
12
|
# @param object [Object] something to be validated
|
|
13
13
|
# @return [String, Nil] error message, if there was one
|
|
14
14
|
def self.validate(object)
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
RULES.each do |parent_class, validations|
|
|
16
|
+
if object.is_a?(parent_class)
|
|
17
|
+
validations.each do |rule|
|
|
18
|
+
if error = rule.call(object)
|
|
19
|
+
return error
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
17
23
|
end
|
|
18
|
-
|
|
19
|
-
rules.reduce(nil) { |memo, rule| memo || rule.call(object) }
|
|
24
|
+
nil
|
|
20
25
|
end
|
|
21
26
|
|
|
22
27
|
module Rules
|
|
@@ -146,11 +146,14 @@ module GraphQL
|
|
|
146
146
|
end
|
|
147
147
|
|
|
148
148
|
def on_input_object(node, parent)
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
149
|
+
arg_defn = @argument_definitions.last
|
|
150
|
+
if arg_defn && arg_defn.type.list?
|
|
151
|
+
@path.push(parent.children.index(node))
|
|
152
|
+
super
|
|
153
|
+
@path.pop
|
|
154
|
+
else
|
|
155
|
+
super
|
|
156
|
+
end
|
|
154
157
|
end
|
|
155
158
|
|
|
156
159
|
# @return [GraphQL::BaseType] The current object type
|
|
@@ -26,7 +26,9 @@ module GraphQL
|
|
|
26
26
|
# variables = ensure_hash(data["variables"])
|
|
27
27
|
# operation_name = data["operationName"]
|
|
28
28
|
# context = {
|
|
29
|
-
#
|
|
29
|
+
# # Re-implement whatever context methods you need
|
|
30
|
+
# # in this channel or ApplicationCable::Channel
|
|
31
|
+
# # current_user: current_user,
|
|
30
32
|
# # Make sure the channel is in the context
|
|
31
33
|
# channel: self,
|
|
32
34
|
# }
|
data/lib/graphql/tracing.rb
CHANGED
|
@@ -42,12 +42,12 @@ module GraphQL
|
|
|
42
42
|
# execute_multiplex | `{ multiplex: GraphQL::Execution::Multiplex }`
|
|
43
43
|
# execute_query | `{ query: GraphQL::Query }`
|
|
44
44
|
# execute_query_lazy | `{ query: GraphQL::Query?, multiplex: GraphQL::Execution::Multiplex? }`
|
|
45
|
-
# execute_field | `{ context: GraphQL::Query::Context::FieldResolutionContext?, owner: Class?, field: GraphQL::Schema::Field?, path: Array<String, Integer>?}`
|
|
46
|
-
# execute_field_lazy | `{ context: GraphQL::Query::Context::FieldResolutionContext?, owner: Class?, field: GraphQL::Schema::Field?, path: Array<String, Integer>?}`
|
|
45
|
+
# execute_field | `{ context: GraphQL::Query::Context::FieldResolutionContext?, owner: Class?, field: GraphQL::Schema::Field?, query: GraphQL::Query?, path: Array<String, Integer>?}`
|
|
46
|
+
# execute_field_lazy | `{ context: GraphQL::Query::Context::FieldResolutionContext?, owner: Class?, field: GraphQL::Schema::Field?, query: GraphqL::Query?, path: Array<String, Integer>?}`
|
|
47
47
|
#
|
|
48
48
|
# Note that `execute_field` and `execute_field_lazy` receive different data in different settings:
|
|
49
49
|
#
|
|
50
|
-
# - When using {GraphQL::Execution::Interpreter}, they receive `{field:, path:}`
|
|
50
|
+
# - When using {GraphQL::Execution::Interpreter}, they receive `{field:, path:, query:}`
|
|
51
51
|
# - Otherwise, they receive `{context: ...}`
|
|
52
52
|
#
|
|
53
53
|
module Tracing
|
data/lib/graphql/types.rb
CHANGED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
module GraphQL
|
|
3
|
+
module Types
|
|
4
|
+
# An untyped JSON scalar that maps to Ruby hashes, arrays, strings, integers, floats, booleans and nils.
|
|
5
|
+
# This should be used judiciously because it subverts the GraphQL type system.
|
|
6
|
+
#
|
|
7
|
+
# Use it for fields or arguments as follows:
|
|
8
|
+
#
|
|
9
|
+
# field :template_parameters, GraphQL::Types::JSON, null: false
|
|
10
|
+
#
|
|
11
|
+
# argument :template_parameters, GraphQL::Types::JSON, null: false
|
|
12
|
+
#
|
|
13
|
+
class JSON < GraphQL::Schema::Scalar
|
|
14
|
+
description "Represents untyped JSON"
|
|
15
|
+
|
|
16
|
+
def self.coerce_input(value, _context)
|
|
17
|
+
value
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def self.coerce_result(value, _context)
|
|
21
|
+
value
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -28,14 +28,15 @@ module GraphQL
|
|
|
28
28
|
# Get or set the Object type that this edge wraps.
|
|
29
29
|
#
|
|
30
30
|
# @param node_type [Class] A `Schema::Object` subclass
|
|
31
|
-
|
|
31
|
+
# @param null [Boolean]
|
|
32
|
+
def node_type(node_type = nil, null: true)
|
|
32
33
|
if node_type
|
|
33
34
|
@node_type = node_type
|
|
34
35
|
wrapped_type_name = node_type.graphql_name
|
|
35
36
|
# Set this to be named like the node type, but suffixed with `Edge`
|
|
36
37
|
graphql_name("#{wrapped_type_name}Edge")
|
|
37
38
|
# Add a default `node` field
|
|
38
|
-
field :node, node_type, null:
|
|
39
|
+
field :node, node_type, null: null, description: "The item at the end of the edge."
|
|
39
40
|
end
|
|
40
41
|
@node_type
|
|
41
42
|
end
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
module GraphQL
|
|
3
3
|
class UnauthorizedFieldError < GraphQL::UnauthorizedError
|
|
4
4
|
# @return [Field] the field that failed the authorization check
|
|
5
|
-
|
|
5
|
+
attr_accessor :field
|
|
6
6
|
|
|
7
7
|
def initialize(message = nil, object: nil, type: nil, context: nil, field: nil)
|
|
8
8
|
if message.nil? && [field, type].any?(&:nil?)
|
data/lib/graphql/version.rb
CHANGED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
PATH
|
|
2
|
+
remote: /Users/rmosolgo/code/graphql-ruby
|
|
3
|
+
specs:
|
|
4
|
+
graphql (1.9.0.pre2)
|
|
5
|
+
|
|
6
|
+
GEM
|
|
7
|
+
remote: https://rubygems.org/
|
|
8
|
+
specs:
|
|
9
|
+
actioncable (5.2.1)
|
|
10
|
+
actionpack (= 5.2.1)
|
|
11
|
+
nio4r (~> 2.0)
|
|
12
|
+
websocket-driver (>= 0.6.1)
|
|
13
|
+
actionmailer (5.2.1)
|
|
14
|
+
actionpack (= 5.2.1)
|
|
15
|
+
actionview (= 5.2.1)
|
|
16
|
+
activejob (= 5.2.1)
|
|
17
|
+
mail (~> 2.5, >= 2.5.4)
|
|
18
|
+
rails-dom-testing (~> 2.0)
|
|
19
|
+
actionpack (5.2.1)
|
|
20
|
+
actionview (= 5.2.1)
|
|
21
|
+
activesupport (= 5.2.1)
|
|
22
|
+
rack (~> 2.0)
|
|
23
|
+
rack-test (>= 0.6.3)
|
|
24
|
+
rails-dom-testing (~> 2.0)
|
|
25
|
+
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
|
26
|
+
actionview (5.2.1)
|
|
27
|
+
activesupport (= 5.2.1)
|
|
28
|
+
builder (~> 3.1)
|
|
29
|
+
erubi (~> 1.4)
|
|
30
|
+
rails-dom-testing (~> 2.0)
|
|
31
|
+
rails-html-sanitizer (~> 1.0, >= 1.0.3)
|
|
32
|
+
activejob (5.2.1)
|
|
33
|
+
activesupport (= 5.2.1)
|
|
34
|
+
globalid (>= 0.3.6)
|
|
35
|
+
activemodel (5.2.1)
|
|
36
|
+
activesupport (= 5.2.1)
|
|
37
|
+
activerecord (5.2.1)
|
|
38
|
+
activemodel (= 5.2.1)
|
|
39
|
+
activesupport (= 5.2.1)
|
|
40
|
+
arel (>= 9.0)
|
|
41
|
+
activestorage (5.2.1)
|
|
42
|
+
actionpack (= 5.2.1)
|
|
43
|
+
activerecord (= 5.2.1)
|
|
44
|
+
marcel (~> 0.3.1)
|
|
45
|
+
activesupport (5.2.1)
|
|
46
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
|
47
|
+
i18n (>= 0.7, < 2)
|
|
48
|
+
minitest (~> 5.1)
|
|
49
|
+
tzinfo (~> 1.1)
|
|
50
|
+
addressable (2.5.2)
|
|
51
|
+
public_suffix (>= 2.0.2, < 4.0)
|
|
52
|
+
arel (9.0.0)
|
|
53
|
+
builder (3.2.3)
|
|
54
|
+
capybara (3.7.2)
|
|
55
|
+
addressable
|
|
56
|
+
mini_mime (>= 0.1.3)
|
|
57
|
+
nokogiri (~> 1.8)
|
|
58
|
+
rack (>= 1.6.0)
|
|
59
|
+
rack-test (>= 0.6.3)
|
|
60
|
+
xpath (~> 3.1)
|
|
61
|
+
childprocess (0.9.0)
|
|
62
|
+
ffi (~> 1.0, >= 1.0.11)
|
|
63
|
+
concurrent-ruby (1.0.5)
|
|
64
|
+
crass (1.0.4)
|
|
65
|
+
erubi (1.7.1)
|
|
66
|
+
ffi (1.9.25)
|
|
67
|
+
globalid (0.4.1)
|
|
68
|
+
activesupport (>= 4.2.0)
|
|
69
|
+
i18n (1.1.0)
|
|
70
|
+
concurrent-ruby (~> 1.0)
|
|
71
|
+
listen (3.1.5)
|
|
72
|
+
rb-fsevent (~> 0.9, >= 0.9.4)
|
|
73
|
+
rb-inotify (~> 0.9, >= 0.9.7)
|
|
74
|
+
ruby_dep (~> 1.2)
|
|
75
|
+
loofah (2.2.2)
|
|
76
|
+
crass (~> 1.0.2)
|
|
77
|
+
nokogiri (>= 1.5.9)
|
|
78
|
+
mail (2.7.0)
|
|
79
|
+
mini_mime (>= 0.1.1)
|
|
80
|
+
marcel (0.3.3)
|
|
81
|
+
mimemagic (~> 0.3.2)
|
|
82
|
+
method_source (0.9.0)
|
|
83
|
+
mimemagic (0.3.2)
|
|
84
|
+
mini_mime (1.0.1)
|
|
85
|
+
mini_portile2 (2.3.0)
|
|
86
|
+
minitest (5.11.3)
|
|
87
|
+
nio4r (2.3.1)
|
|
88
|
+
nokogiri (1.8.4)
|
|
89
|
+
mini_portile2 (~> 2.3.0)
|
|
90
|
+
public_suffix (3.0.3)
|
|
91
|
+
puma (3.12.0)
|
|
92
|
+
rack (2.0.5)
|
|
93
|
+
rack-test (1.1.0)
|
|
94
|
+
rack (>= 1.0, < 3)
|
|
95
|
+
rails (5.2.1)
|
|
96
|
+
actioncable (= 5.2.1)
|
|
97
|
+
actionmailer (= 5.2.1)
|
|
98
|
+
actionpack (= 5.2.1)
|
|
99
|
+
actionview (= 5.2.1)
|
|
100
|
+
activejob (= 5.2.1)
|
|
101
|
+
activemodel (= 5.2.1)
|
|
102
|
+
activerecord (= 5.2.1)
|
|
103
|
+
activestorage (= 5.2.1)
|
|
104
|
+
activesupport (= 5.2.1)
|
|
105
|
+
bundler (>= 1.3.0)
|
|
106
|
+
railties (= 5.2.1)
|
|
107
|
+
sprockets-rails (>= 2.0.0)
|
|
108
|
+
rails-dom-testing (2.0.3)
|
|
109
|
+
activesupport (>= 4.2.0)
|
|
110
|
+
nokogiri (>= 1.6)
|
|
111
|
+
rails-html-sanitizer (1.0.4)
|
|
112
|
+
loofah (~> 2.2, >= 2.2.2)
|
|
113
|
+
railties (5.2.1)
|
|
114
|
+
actionpack (= 5.2.1)
|
|
115
|
+
activesupport (= 5.2.1)
|
|
116
|
+
method_source
|
|
117
|
+
rake (>= 0.8.7)
|
|
118
|
+
thor (>= 0.19.0, < 2.0)
|
|
119
|
+
rake (12.3.1)
|
|
120
|
+
rb-fsevent (0.10.3)
|
|
121
|
+
rb-inotify (0.9.10)
|
|
122
|
+
ffi (>= 0.5.0, < 2)
|
|
123
|
+
ruby_dep (1.5.0)
|
|
124
|
+
rubyzip (1.2.2)
|
|
125
|
+
selenium-webdriver (3.14.0)
|
|
126
|
+
childprocess (~> 0.5)
|
|
127
|
+
rubyzip (~> 1.2)
|
|
128
|
+
sprockets (3.7.2)
|
|
129
|
+
concurrent-ruby (~> 1.0)
|
|
130
|
+
rack (> 1, < 3)
|
|
131
|
+
sprockets-rails (3.2.1)
|
|
132
|
+
actionpack (>= 4.0)
|
|
133
|
+
activesupport (>= 4.0)
|
|
134
|
+
sprockets (>= 3.0.0)
|
|
135
|
+
thor (0.20.0)
|
|
136
|
+
thread_safe (0.3.6)
|
|
137
|
+
tzinfo (1.2.5)
|
|
138
|
+
thread_safe (~> 0.1)
|
|
139
|
+
websocket-driver (0.7.0)
|
|
140
|
+
websocket-extensions (>= 0.1.0)
|
|
141
|
+
websocket-extensions (0.1.3)
|
|
142
|
+
xpath (3.1.0)
|
|
143
|
+
nokogiri (~> 1.8)
|
|
144
|
+
|
|
145
|
+
PLATFORMS
|
|
146
|
+
ruby
|
|
147
|
+
|
|
148
|
+
DEPENDENCIES
|
|
149
|
+
capybara
|
|
150
|
+
graphql!
|
|
151
|
+
listen
|
|
152
|
+
puma
|
|
153
|
+
rails (~> 5.2.1)
|
|
154
|
+
selenium-webdriver
|
|
155
|
+
|
|
156
|
+
BUNDLED WITH
|
|
157
|
+
2.0.1
|