rails-graphql 0.2.1 → 1.0.0.beta
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 +4 -4
- data/ext/console.rb +18 -0
- data/ext/extconf.h +3 -0
- data/ext/extconf.rb +1 -54
- data/ext/gql_parser.c +646 -0
- data/ext/shared.c +482 -0
- data/ext/shared.h +177 -0
- data/lib/gql_parser.so +0 -0
- data/lib/rails/graphql/adapters/mysql_adapter.rb +59 -0
- data/lib/rails/graphql/adapters/pg_adapter.rb +25 -22
- data/lib/rails/graphql/adapters/sqlite_adapter.rb +17 -14
- data/lib/rails/graphql/alternative/field_set.rb +36 -0
- data/lib/rails/graphql/alternative/mutation.rb +17 -0
- data/lib/rails/graphql/alternative/query.rb +93 -0
- data/lib/rails/graphql/alternative/subscription.rb +17 -0
- data/lib/rails/graphql/alternative.rb +20 -0
- data/lib/rails/graphql/argument.rb +21 -24
- data/lib/rails/graphql/callback.rb +24 -9
- data/lib/rails/graphql/collectors/hash_collector.rb +14 -6
- data/lib/rails/graphql/collectors/idented_collector.rb +10 -7
- data/lib/rails/graphql/collectors/json_collector.rb +22 -17
- data/lib/rails/graphql/collectors.rb +4 -4
- data/lib/rails/graphql/config.rb +130 -15
- data/lib/rails/graphql/directive/cached_directive.rb +33 -0
- data/lib/rails/graphql/directive/deprecated_directive.rb +10 -10
- data/lib/rails/graphql/directive/include_directive.rb +5 -4
- data/lib/rails/graphql/directive/skip_directive.rb +5 -4
- data/lib/rails/graphql/directive.rb +118 -63
- data/lib/rails/graphql/errors.rb +33 -4
- data/lib/rails/graphql/event.rb +16 -5
- data/lib/rails/graphql/field/authorized_field.rb +19 -3
- data/lib/rails/graphql/field/input_field.rb +11 -10
- data/lib/rails/graphql/field/mutation_field.rb +42 -7
- data/lib/rails/graphql/field/output_field.rb +102 -13
- data/lib/rails/graphql/field/proxied_field.rb +31 -22
- data/lib/rails/graphql/field/resolved_field.rb +26 -24
- data/lib/rails/graphql/field/scoped_config.rb +10 -4
- data/lib/rails/graphql/field/subscription_field.rb +140 -0
- data/lib/rails/graphql/field/typed_field.rb +43 -22
- data/lib/rails/graphql/field.rb +70 -56
- data/lib/rails/graphql/global_id.rb +85 -0
- data/lib/rails/graphql/helpers/attribute_delegator.rb +5 -5
- data/lib/rails/graphql/helpers/inherited_collection/array.rb +50 -0
- data/lib/rails/graphql/helpers/inherited_collection/base.rb +43 -0
- data/lib/rails/graphql/helpers/inherited_collection/hash.rb +87 -0
- data/lib/rails/graphql/helpers/inherited_collection.rb +25 -76
- data/lib/rails/graphql/helpers/instantiable.rb +15 -0
- data/lib/rails/graphql/helpers/leaf_from_ar.rb +7 -7
- data/lib/rails/graphql/helpers/registerable.rb +44 -62
- data/lib/rails/graphql/helpers/unregisterable.rb +16 -0
- data/lib/rails/graphql/helpers/with_arguments.rb +31 -27
- data/lib/rails/graphql/helpers/with_assignment.rb +6 -6
- data/lib/rails/graphql/helpers/with_callbacks.rb +25 -8
- data/lib/rails/graphql/helpers/with_description.rb +71 -0
- data/lib/rails/graphql/helpers/with_directives.rb +54 -30
- data/lib/rails/graphql/helpers/with_events.rb +21 -23
- data/lib/rails/graphql/helpers/with_fields.rb +76 -22
- data/lib/rails/graphql/helpers/with_global_id.rb +22 -0
- data/lib/rails/graphql/helpers/with_name.rb +43 -0
- data/lib/rails/graphql/helpers/with_namespace.rb +7 -4
- data/lib/rails/graphql/helpers/with_owner.rb +8 -7
- data/lib/rails/graphql/helpers/with_schema_fields.rb +137 -55
- data/lib/rails/graphql/helpers/with_validator.rb +9 -9
- data/lib/rails/graphql/helpers.rb +10 -3
- data/lib/rails/graphql/introspection.rb +43 -36
- data/lib/rails/graphql/railtie.rb +88 -33
- data/lib/rails/graphql/railties/base_generator.rb +3 -9
- data/lib/rails/graphql/railties/channel.rb +157 -0
- data/lib/rails/graphql/railties/controller.rb +62 -17
- data/lib/rails/graphql/railties/controller_runtime.rb +5 -5
- data/lib/rails/graphql/railties/log_subscriber.rb +81 -14
- data/lib/rails/graphql/request/arguments.rb +24 -49
- data/lib/rails/graphql/request/backtrace.rb +191 -0
- data/lib/rails/graphql/request/component/field.rb +86 -65
- data/lib/rails/graphql/request/component/fragment.rb +72 -24
- data/lib/rails/graphql/request/component/operation/subscription.rb +164 -4
- data/lib/rails/graphql/request/component/operation.rb +63 -31
- data/lib/rails/graphql/request/component/spread.rb +68 -25
- data/lib/rails/graphql/request/component/typename.rb +27 -12
- data/lib/rails/graphql/request/component.rb +75 -36
- data/lib/rails/graphql/request/context.rb +18 -8
- data/lib/rails/graphql/request/errors.rb +16 -6
- data/lib/rails/graphql/request/event.rb +19 -8
- data/lib/rails/graphql/request/helpers/directives.rb +68 -27
- data/lib/rails/graphql/request/helpers/selection_set.rb +51 -25
- data/lib/rails/graphql/request/helpers/value_writers.rb +18 -16
- data/lib/rails/graphql/request/prepared_data.rb +98 -0
- data/lib/rails/graphql/request/steps/authorizable.rb +24 -14
- data/lib/rails/graphql/request/steps/organizable.rb +110 -48
- data/lib/rails/graphql/request/steps/{prepareable.rb → preparable.rb} +20 -7
- data/lib/rails/graphql/request/steps/{resolveable.rb → resolvable.rb} +15 -6
- data/lib/rails/graphql/request/strategy/cached_strategy.rb +64 -0
- data/lib/rails/graphql/request/strategy/dynamic_instance.rb +6 -6
- data/lib/rails/graphql/request/strategy/multi_query_strategy.rb +6 -13
- data/lib/rails/graphql/request/strategy/sequenced_strategy.rb +9 -9
- data/lib/rails/graphql/request/strategy.rb +131 -75
- data/lib/rails/graphql/request/subscription.rb +80 -0
- data/lib/rails/graphql/request.rb +305 -86
- data/lib/rails/graphql/schema.rb +240 -48
- data/lib/rails/graphql/shortcuts.rb +22 -3
- data/lib/rails/graphql/source/active_record/builders.rb +49 -35
- data/lib/rails/graphql/source/active_record_source.rb +70 -54
- data/lib/rails/graphql/source/base.rb +111 -0
- data/lib/rails/graphql/source/builder.rb +128 -0
- data/lib/rails/graphql/source/scoped_arguments.rb +31 -19
- data/lib/rails/graphql/source.rb +89 -213
- data/lib/rails/graphql/subscription/provider/action_cable.rb +112 -0
- data/lib/rails/graphql/subscription/provider/base.rb +191 -0
- data/lib/rails/graphql/subscription/provider.rb +18 -0
- data/lib/rails/graphql/subscription/store/base.rb +145 -0
- data/lib/rails/graphql/subscription/store/memory.rb +127 -0
- data/lib/rails/graphql/subscription/store.rb +19 -0
- data/lib/rails/graphql/subscription.rb +17 -0
- data/lib/rails/graphql/to_gql.rb +29 -32
- data/lib/rails/graphql/type/enum/directive_location_enum.rb +11 -11
- data/lib/rails/graphql/type/enum/type_kind_enum.rb +3 -3
- data/lib/rails/graphql/type/enum.rb +34 -48
- data/lib/rails/graphql/type/input.rb +74 -23
- data/lib/rails/graphql/type/interface.rb +16 -26
- data/lib/rails/graphql/type/object/directive_object.rb +4 -4
- data/lib/rails/graphql/type/object/enum_value_object.rb +3 -3
- data/lib/rails/graphql/type/object/field_object.rb +24 -6
- data/lib/rails/graphql/type/object/input_value_object.rb +3 -3
- data/lib/rails/graphql/type/object/schema_object.rb +5 -8
- data/lib/rails/graphql/type/object/type_object.rb +29 -19
- data/lib/rails/graphql/type/object.rb +26 -23
- data/lib/rails/graphql/type/scalar/any_scalar.rb +30 -0
- data/lib/rails/graphql/type/scalar/bigint_scalar.rb +5 -5
- data/lib/rails/graphql/type/scalar/binary_scalar.rb +3 -3
- data/lib/rails/graphql/type/scalar/boolean_scalar.rb +8 -8
- data/lib/rails/graphql/type/scalar/date_scalar.rb +3 -3
- data/lib/rails/graphql/type/scalar/date_time_scalar.rb +3 -3
- data/lib/rails/graphql/type/scalar/decimal_scalar.rb +3 -3
- data/lib/rails/graphql/type/scalar/float_scalar.rb +5 -5
- data/lib/rails/graphql/type/scalar/id_scalar.rb +6 -5
- data/lib/rails/graphql/type/scalar/int_scalar.rb +6 -5
- data/lib/rails/graphql/type/scalar/json_scalar.rb +39 -0
- data/lib/rails/graphql/type/scalar/string_scalar.rb +18 -4
- data/lib/rails/graphql/type/scalar/time_scalar.rb +5 -5
- data/lib/rails/graphql/type/scalar.rb +25 -22
- data/lib/rails/graphql/type/union.rb +14 -16
- data/lib/rails/graphql/type.rb +34 -25
- data/lib/rails/graphql/type_map.rb +256 -164
- data/lib/rails/graphql/uri.rb +166 -0
- data/lib/rails/graphql/version.rb +15 -3
- data/lib/rails/graphql.rake +3 -0
- data/lib/rails/graphql.rb +85 -52
- data/lib/rails-graphql.rb +1 -1
- data/test/assets/en.yml +29 -0
- data/test/assets/introspection-mem.txt +1 -1
- data/test/assets/mem.gql +18 -45
- data/test/assets/mysql.gql +392 -0
- data/test/assets/sqlite.gql +21 -12
- data/test/assets/translate.gql +335 -0
- data/test/config.rb +18 -8
- data/test/graphql/schema_test.rb +12 -19
- data/test/graphql/source_test.rb +8 -75
- data/test/graphql/type/enum_test.rb +207 -203
- data/test/graphql/type/input_test.rb +14 -9
- data/test/graphql/type/interface_test.rb +4 -4
- data/test/graphql/type/scalar/any_scalar_test.rb +38 -0
- data/test/graphql/type/scalar/boolean_scalar_test.rb +6 -3
- data/test/graphql/type/scalar/json_scalar_test.rb +23 -0
- data/test/graphql/type_map_test.rb +51 -66
- data/test/graphql/type_test.rb +0 -19
- data/test/graphql_test.rb +1 -1
- data/test/integration/{authorization/authorization_test.rb → authorization_test.rb} +40 -14
- data/test/integration/config.rb +36 -3
- data/test/integration/customization_test.rb +39 -0
- data/test/integration/global_id_test.rb +99 -0
- data/test/integration/memory/star_wars_introspection_test.rb +24 -16
- data/test/integration/memory/star_wars_query_test.rb +54 -3
- data/test/integration/memory/star_wars_validation_test.rb +1 -1
- data/test/integration/mysql/star_wars_introspection_test.rb +25 -0
- data/test/integration/persisted_query_test.rb +87 -0
- data/test/integration/resolver_precedence_test.rb +154 -0
- data/test/integration/schemas/memory.rb +22 -7
- data/test/integration/schemas/mysql.rb +62 -0
- data/test/integration/schemas/sqlite.rb +21 -12
- data/test/integration/sqlite/star_wars_global_id_test.rb +83 -0
- data/test/integration/sqlite/star_wars_introspection_test.rb +10 -0
- data/test/integration/sqlite/star_wars_query_test.rb +14 -1
- data/test/integration/translate_test.rb +61 -0
- data/test/test_ext.rb +16 -13
- metadata +108 -157
- data/ext/depend +0 -3
- data/ext/graphqlparser/Ast.cpp +0 -346
- data/ext/graphqlparser/Ast.h +0 -1214
- data/ext/graphqlparser/AstNode.h +0 -36
- data/ext/graphqlparser/AstVisitor.h +0 -137
- data/ext/graphqlparser/GraphQLParser.cpp +0 -76
- data/ext/graphqlparser/GraphQLParser.h +0 -55
- data/ext/graphqlparser/JsonVisitor.cpp +0 -161
- data/ext/graphqlparser/JsonVisitor.cpp.inc +0 -456
- data/ext/graphqlparser/JsonVisitor.h +0 -121
- data/ext/graphqlparser/JsonVisitor.h.inc +0 -110
- data/ext/graphqlparser/VERSION +0 -1
- data/ext/graphqlparser/c/GraphQLAst.cpp +0 -324
- data/ext/graphqlparser/c/GraphQLAst.h +0 -180
- data/ext/graphqlparser/c/GraphQLAstForEachConcreteType.h +0 -44
- data/ext/graphqlparser/c/GraphQLAstNode.cpp +0 -25
- data/ext/graphqlparser/c/GraphQLAstNode.h +0 -33
- data/ext/graphqlparser/c/GraphQLAstToJSON.cpp +0 -21
- data/ext/graphqlparser/c/GraphQLAstToJSON.h +0 -24
- data/ext/graphqlparser/c/GraphQLAstVisitor.cpp +0 -55
- data/ext/graphqlparser/c/GraphQLAstVisitor.h +0 -53
- data/ext/graphqlparser/c/GraphQLParser.cpp +0 -35
- data/ext/graphqlparser/c/GraphQLParser.h +0 -54
- data/ext/graphqlparser/dump_json_ast.cpp +0 -48
- data/ext/graphqlparser/lexer.lpp +0 -324
- data/ext/graphqlparser/parser.ypp +0 -693
- data/ext/graphqlparser/parsergen/lexer.cpp +0 -2633
- data/ext/graphqlparser/parsergen/lexer.h +0 -528
- data/ext/graphqlparser/parsergen/location.hh +0 -189
- data/ext/graphqlparser/parsergen/parser.tab.cpp +0 -3300
- data/ext/graphqlparser/parsergen/parser.tab.hpp +0 -646
- data/ext/graphqlparser/parsergen/position.hh +0 -179
- data/ext/graphqlparser/parsergen/stack.hh +0 -156
- data/ext/graphqlparser/syntaxdefs.h +0 -19
- data/ext/libgraphqlparser/AstNode.h +0 -36
- data/ext/libgraphqlparser/CMakeLists.txt +0 -148
- data/ext/libgraphqlparser/CONTRIBUTING.md +0 -23
- data/ext/libgraphqlparser/GraphQLParser.cpp +0 -76
- data/ext/libgraphqlparser/GraphQLParser.h +0 -55
- data/ext/libgraphqlparser/JsonVisitor.cpp +0 -161
- data/ext/libgraphqlparser/JsonVisitor.h +0 -121
- data/ext/libgraphqlparser/LICENSE +0 -22
- data/ext/libgraphqlparser/README.clang-tidy +0 -7
- data/ext/libgraphqlparser/README.md +0 -84
- data/ext/libgraphqlparser/ast/ast.ast +0 -203
- data/ext/libgraphqlparser/ast/ast.py +0 -61
- data/ext/libgraphqlparser/ast/c.py +0 -100
- data/ext/libgraphqlparser/ast/c.pyc +0 -0
- data/ext/libgraphqlparser/ast/c_impl.py +0 -61
- data/ext/libgraphqlparser/ast/c_impl.pyc +0 -0
- data/ext/libgraphqlparser/ast/c_visitor_impl.py +0 -39
- data/ext/libgraphqlparser/ast/c_visitor_impl.pyc +0 -0
- data/ext/libgraphqlparser/ast/casing.py +0 -26
- data/ext/libgraphqlparser/ast/casing.pyc +0 -0
- data/ext/libgraphqlparser/ast/cxx.py +0 -197
- data/ext/libgraphqlparser/ast/cxx.pyc +0 -0
- data/ext/libgraphqlparser/ast/cxx_impl.py +0 -61
- data/ext/libgraphqlparser/ast/cxx_impl.pyc +0 -0
- data/ext/libgraphqlparser/ast/cxx_json_visitor_header.py +0 -42
- data/ext/libgraphqlparser/ast/cxx_json_visitor_header.pyc +0 -0
- data/ext/libgraphqlparser/ast/cxx_json_visitor_impl.py +0 -80
- data/ext/libgraphqlparser/ast/cxx_json_visitor_impl.pyc +0 -0
- data/ext/libgraphqlparser/ast/cxx_visitor.py +0 -64
- data/ext/libgraphqlparser/ast/cxx_visitor.pyc +0 -0
- data/ext/libgraphqlparser/ast/js.py +0 -65
- data/ext/libgraphqlparser/ast/license.py +0 -10
- data/ext/libgraphqlparser/ast/license.pyc +0 -0
- data/ext/libgraphqlparser/c/GraphQLAstNode.cpp +0 -25
- data/ext/libgraphqlparser/c/GraphQLAstNode.h +0 -33
- data/ext/libgraphqlparser/c/GraphQLAstToJSON.cpp +0 -21
- data/ext/libgraphqlparser/c/GraphQLAstToJSON.h +0 -24
- data/ext/libgraphqlparser/c/GraphQLAstVisitor.cpp +0 -55
- data/ext/libgraphqlparser/c/GraphQLAstVisitor.h +0 -53
- data/ext/libgraphqlparser/c/GraphQLParser.cpp +0 -35
- data/ext/libgraphqlparser/c/GraphQLParser.h +0 -54
- data/ext/libgraphqlparser/clang-tidy-all.sh +0 -3
- data/ext/libgraphqlparser/cmake/version.cmake +0 -16
- data/ext/libgraphqlparser/dump_json_ast.cpp +0 -48
- data/ext/libgraphqlparser/go/README.md +0 -20
- data/ext/libgraphqlparser/go/callbacks.go +0 -18
- data/ext/libgraphqlparser/go/gotest.go +0 -64
- data/ext/libgraphqlparser/lexer.lpp +0 -324
- data/ext/libgraphqlparser/libgraphqlparser.pc.in +0 -11
- data/ext/libgraphqlparser/parser.ypp +0 -693
- data/ext/libgraphqlparser/parsergen/lexer.cpp +0 -2633
- data/ext/libgraphqlparser/parsergen/lexer.h +0 -528
- data/ext/libgraphqlparser/parsergen/location.hh +0 -189
- data/ext/libgraphqlparser/parsergen/parser.tab.cpp +0 -3300
- data/ext/libgraphqlparser/parsergen/parser.tab.hpp +0 -646
- data/ext/libgraphqlparser/parsergen/position.hh +0 -179
- data/ext/libgraphqlparser/parsergen/stack.hh +0 -156
- data/ext/libgraphqlparser/python/CMakeLists.txt +0 -14
- data/ext/libgraphqlparser/python/README.md +0 -5
- data/ext/libgraphqlparser/python/example.py +0 -31
- data/ext/libgraphqlparser/syntaxdefs.h +0 -19
- data/ext/libgraphqlparser/test/BuildCAPI.c +0 -5
- data/ext/libgraphqlparser/test/CMakeLists.txt +0 -25
- data/ext/libgraphqlparser/test/JsonVisitorTests.cpp +0 -28
- data/ext/libgraphqlparser/test/ParserTests.cpp +0 -352
- data/ext/libgraphqlparser/test/kitchen-sink.graphql +0 -59
- data/ext/libgraphqlparser/test/kitchen-sink.json +0 -1
- data/ext/libgraphqlparser/test/schema-kitchen-sink.graphql +0 -78
- data/ext/libgraphqlparser/test/schema-kitchen-sink.json +0 -1
- data/ext/libgraphqlparser/test/valgrind.supp +0 -33
- data/ext/version.cpp +0 -21
- data/lib/graphqlparser.so +0 -0
- data/lib/rails/graphql/native/functions.rb +0 -38
- data/lib/rails/graphql/native/location.rb +0 -41
- data/lib/rails/graphql/native/pointers.rb +0 -23
- data/lib/rails/graphql/native/visitor.rb +0 -349
- data/lib/rails/graphql/native.rb +0 -56
- data/test/integration/schemas/authorization.rb +0 -12
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
module Rails
|
4
|
-
module GraphQL
|
5
|
-
module Helpers
|
3
|
+
module Rails
|
4
|
+
module GraphQL
|
5
|
+
module Helpers
|
6
6
|
# Helper module that allows other objects to hold events, either from a
|
7
7
|
# singleton point-of-view, or for instances
|
8
8
|
module WithEvents
|
@@ -19,7 +19,12 @@ module Rails # :nodoc:
|
|
19
19
|
other.delegate(:event_types, to: :class)
|
20
20
|
|
21
21
|
other.define_method(:events) { @events ||= Hash.new { |h, k| h[k] = [] } }
|
22
|
+
other.define_method(:all_events) { @events if defined?(@events) }
|
23
|
+
other.define_method(:events?) { defined?(@events) && @events.present? }
|
24
|
+
|
22
25
|
other.define_method(:listeners) { @listeners ||= Set.new }
|
26
|
+
other.define_method(:all_listeners) { @listeners if defined?(@listeners) }
|
27
|
+
other.define_method(:listeners?) { defined?(@listeners) && @listeners.present? }
|
23
28
|
end
|
24
29
|
|
25
30
|
# Helper module to define static list of valid event types
|
@@ -27,10 +32,11 @@ module Rails # :nodoc:
|
|
27
32
|
# Set or get the list of possible event types when attaching events
|
28
33
|
def event_types(*list, append: false, expose: false)
|
29
34
|
return (defined?(@event_types) && @event_types.presence) ||
|
30
|
-
superclass.try(:event_types) ||
|
35
|
+
superclass.try(:event_types) || EMPTY_ARRAY if list.blank?
|
36
|
+
|
37
|
+
new_list = list.flatten.compact.map(&:to_sym)
|
38
|
+
new_list = event_types + new_list if append
|
31
39
|
|
32
|
-
new_list = append ? event_types : []
|
33
|
-
new_list += list.flatten.compact.map(&:to_sym)
|
34
40
|
@event_types = new_list.uniq.freeze
|
35
41
|
expose_events!(*list) if expose
|
36
42
|
@event_types
|
@@ -38,7 +44,7 @@ module Rails # :nodoc:
|
|
38
44
|
|
39
45
|
protected
|
40
46
|
|
41
|
-
#
|
47
|
+
# Auxiliary method that creates easy-accessible callback assignment
|
42
48
|
def expose_events!(*list)
|
43
49
|
list.each do |event_name|
|
44
50
|
next if method_defined?(event_name)
|
@@ -49,31 +55,23 @@ module Rails # :nodoc:
|
|
49
55
|
end
|
50
56
|
end
|
51
57
|
|
52
|
-
# Mostly for correct inheritance on instances
|
53
|
-
def all_events
|
54
|
-
current = defined?(@events) ? @events : {}
|
55
|
-
return current unless defined? super
|
56
|
-
Helpers.merge_hash_array(current, super)
|
57
|
-
end
|
58
|
-
|
59
|
-
# Mostly for correct inheritance on instances
|
60
|
-
def all_listeners
|
61
|
-
current = (defined?(@listeners) && @listeners) || Set.new
|
62
|
-
defined?(super) ? (current + super) : current
|
63
|
-
end
|
64
|
-
|
65
58
|
# Add a new event listener for the given +event_name+. It is possible
|
66
59
|
# to prepend the event by setting +unshift: true+. This checks if the
|
67
60
|
# event name is a valid one due to +event_types+.
|
68
|
-
def on(event_name, unshift: false, &block)
|
61
|
+
def on(event_name, callback = nil, unshift: false, &block)
|
69
62
|
event_name = event_name.to_sym
|
70
63
|
valid = !event_types || event_types.include?(event_name)
|
71
|
-
raise ArgumentError,
|
64
|
+
raise ArgumentError, (+<<~MSG).squish unless valid
|
72
65
|
The #{event_name} is not a valid event type.
|
73
66
|
MSG
|
74
67
|
|
68
|
+
invalid_callback = callback.nil? || callback.is_a?(Callback)
|
69
|
+
raise ArgumentError, (+<<~MSG).squish unless invalid_callback
|
70
|
+
The provided #{callback.class.name} is not a valid callback.
|
71
|
+
MSG
|
72
|
+
|
75
73
|
listeners << event_name
|
76
|
-
events[event_name].send(unshift ? :unshift : :push, block)
|
74
|
+
events[event_name].send(unshift ? :unshift : :push, callback || block)
|
77
75
|
end
|
78
76
|
end
|
79
77
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
module Rails
|
4
|
-
module GraphQL
|
5
|
-
module Helpers
|
3
|
+
module Rails
|
4
|
+
module GraphQL
|
5
|
+
module Helpers
|
6
6
|
# Helper module that allows other objects to hold fields during the
|
7
7
|
# definition process. Works very similar to Arguments, but it's more
|
8
8
|
# flexible, since the type of the fields can be dynamic defined by the
|
@@ -12,19 +12,31 @@ module Rails # :nodoc:
|
|
12
12
|
# related to the base type, but it's closer associated with the strategy
|
13
13
|
# used to handle them.
|
14
14
|
module WithFields
|
15
|
-
module ClassMethods
|
15
|
+
module ClassMethods
|
16
16
|
def inherited(subclass)
|
17
17
|
super if defined? super
|
18
18
|
return unless defined?(@fields)
|
19
19
|
fields.each_value(&subclass.method(:proxy_field))
|
20
20
|
end
|
21
|
+
|
22
|
+
# Return the list of fileds, only initialize when explicitly told
|
23
|
+
def fields(initialize = nil)
|
24
|
+
return @fields if defined?(@fields)
|
25
|
+
return unless initialize
|
26
|
+
|
27
|
+
@fields = Concurrent::Map.new
|
28
|
+
end
|
29
|
+
|
30
|
+
# Check if there are any fields defined
|
31
|
+
def fields?
|
32
|
+
defined?(@fields) && @fields.present?
|
33
|
+
end
|
21
34
|
end
|
22
35
|
|
23
|
-
def self.extended(other)
|
36
|
+
def self.extended(other)
|
24
37
|
other.extend(WithFields::ClassMethods)
|
25
|
-
other.
|
26
|
-
other.class_attribute(:
|
27
|
-
other.class_attribute(:valid_field_types, instance_writer: false, default: [])
|
38
|
+
other.class_attribute(:field_type, instance_accessor: false)
|
39
|
+
other.class_attribute(:valid_field_types, instance_accessor: false, default: [])
|
28
40
|
end
|
29
41
|
|
30
42
|
# Check if the field is already defined before actually creating it
|
@@ -37,32 +49,31 @@ module Rails # :nodoc:
|
|
37
49
|
|
38
50
|
# See {Field}[rdoc-ref:Rails::GraphQL::Field] class.
|
39
51
|
def field(name, *args, **xargs, &block)
|
40
|
-
xargs
|
41
|
-
object = field_type.new(name, *args, **xargs, &block)
|
52
|
+
object = field_type.new(name, *args, **xargs, owner: self, &block)
|
42
53
|
|
43
|
-
raise DuplicatedError,
|
54
|
+
raise DuplicatedError, (+<<~MSG).squish if field?(object.name)
|
44
55
|
The #{name.inspect} field is already defined and can't be redefined.
|
45
56
|
MSG
|
46
57
|
|
47
|
-
fields[object.name] = object
|
58
|
+
fields(true)[object.name] = object
|
48
59
|
rescue DefinitionError => e
|
49
|
-
raise e.class, e.message
|
60
|
+
raise e.class, +"#{e.message}\n Defined at: #{caller(2)[0]}"
|
50
61
|
end
|
51
62
|
|
52
63
|
# Add a new field to the list but use a proxy instead of a hard copy of
|
53
64
|
# a given +field+
|
54
65
|
def proxy_field(field, *args, **xargs, &block)
|
55
|
-
raise ArgumentError,
|
66
|
+
raise ArgumentError, (+<<~MSG).squish unless field.is_a?(field_type)
|
56
67
|
The #{field.class.name} is not a valid field.
|
57
68
|
MSG
|
58
69
|
|
59
70
|
xargs[:owner] = self
|
60
71
|
object = field.to_proxy(*args, **xargs, &block)
|
61
|
-
raise DuplicatedError,
|
72
|
+
raise DuplicatedError, (+<<~MSG).squish if field?(object.name)
|
62
73
|
The #{field.name.inspect} field is already defined and can't be replaced.
|
63
74
|
MSG
|
64
75
|
|
65
|
-
fields[object.name] = object
|
76
|
+
fields(true)[object.name] = object
|
66
77
|
end
|
67
78
|
|
68
79
|
# Overwrite attributes of a given field named as +name+, it also allows
|
@@ -90,33 +101,65 @@ module Rails # :nodoc:
|
|
90
101
|
|
91
102
|
# Check wheter a given field +object+ is defined in the list of fields
|
92
103
|
def field?(object)
|
104
|
+
return false unless fields?
|
93
105
|
object = object.name if object.is_a?(GraphQL::Field)
|
94
106
|
fields.key?(object.is_a?(String) ? object.underscore.to_sym : object)
|
95
107
|
end
|
96
108
|
|
97
109
|
# Allow accessing fields using the hash notation
|
98
|
-
def
|
110
|
+
def find_field(object)
|
111
|
+
return unless fields?
|
99
112
|
object = object.name if object.is_a?(GraphQL::Field)
|
100
113
|
fields[object.is_a?(String) ? object.underscore.to_sym : object]
|
101
114
|
end
|
102
115
|
|
103
|
-
alias
|
116
|
+
alias [] find_field
|
104
117
|
|
105
118
|
# If the field is not found it will raise an exception
|
106
119
|
def find_field!(object)
|
107
|
-
find_field(object) || raise(
|
120
|
+
find_field(object) || raise(NotFoundError, (+<<~MSG).squish)
|
108
121
|
The #{object.inspect} field is not defined yet.
|
109
122
|
MSG
|
110
123
|
end
|
111
124
|
|
112
125
|
# Get the list of GraphQL names of all the fields difined
|
113
126
|
def field_names(enabled_only = true)
|
114
|
-
(enabled_only ? enabled_fields :
|
127
|
+
(enabled_only ? enabled_fields : lazy_each_field)&.map(&:gql_name)&.eager
|
115
128
|
end
|
116
129
|
|
117
130
|
# Return a lazy enumerator for enabled fields
|
118
131
|
def enabled_fields
|
119
|
-
|
132
|
+
lazy_each_field&.select(&:enabled?)
|
133
|
+
end
|
134
|
+
|
135
|
+
# Import one or more field into the current list of fields
|
136
|
+
def import(klass, ignore_abstract: false)
|
137
|
+
return if ignore_abstract && klass.try(:abstract?)
|
138
|
+
|
139
|
+
if klass.is_a?(Module) && klass <= Alternative::Query
|
140
|
+
# Import an alternative declaration of a field
|
141
|
+
proxy_field(klass.field)
|
142
|
+
elsif klass.is_a?(Helpers::WithFields)
|
143
|
+
# Import a set of fields
|
144
|
+
klass.fields.each_value { |field| proxy_field(field) }
|
145
|
+
else
|
146
|
+
return if GraphQL.config.silence_import_warnings
|
147
|
+
GraphQL.logger.warn(+"Unable to import #{klass.inspect} into #{self.name}.")
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
# Import a module containing several classes to be imported
|
152
|
+
def import_all(mod, recursive: false, ignore_abstract: false)
|
153
|
+
mod.constants.each do |const_name|
|
154
|
+
object = mod.const_get(const_name)
|
155
|
+
|
156
|
+
if object.is_a?(Class)
|
157
|
+
import(object, ignore_abstract: ignore_abstract)
|
158
|
+
elsif object.is_a?(Module) && recursive
|
159
|
+
# TODO: Maybe add deepness into the recursive value
|
160
|
+
import_all(object, recursive: recursive, ignore_abstract: ignore_abstract)
|
161
|
+
end
|
162
|
+
end
|
120
163
|
end
|
121
164
|
|
122
165
|
# Validate all the fields to make sure the definition is valid
|
@@ -125,7 +168,12 @@ module Rails # :nodoc:
|
|
125
168
|
|
126
169
|
# TODO: Maybe find a way to freeze the fields, since after validation
|
127
170
|
# the best thing to do is block changes
|
128
|
-
fields
|
171
|
+
fields&.each_value(&:validate!)
|
172
|
+
end
|
173
|
+
|
174
|
+
# Find a specific field using its id as +gql_name.type+
|
175
|
+
def find_by_gid(gid)
|
176
|
+
find_field!(gid.name)
|
129
177
|
end
|
130
178
|
|
131
179
|
protected
|
@@ -135,6 +183,12 @@ module Rails # :nodoc:
|
|
135
183
|
xargs[:owner] = self
|
136
184
|
GraphQL::Argument.new(*args, **xargs, &block)
|
137
185
|
end
|
186
|
+
|
187
|
+
private
|
188
|
+
|
189
|
+
def lazy_each_field
|
190
|
+
fields.each_pair.lazy.each_entry.map(&:last) if fields?
|
191
|
+
end
|
138
192
|
end
|
139
193
|
end
|
140
194
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Rails
|
4
|
+
module GraphQL
|
5
|
+
module Helpers
|
6
|
+
# Helper module that is a different implementation of the
|
7
|
+
# +GlobalID::Identification+, but instead of things being found by the
|
8
|
+
# class that they are, it uses owners and base classes.
|
9
|
+
module WithGlobalID
|
10
|
+
def to_global_id(options = nil) # :nodoc:
|
11
|
+
GlobalID.create(self, options)
|
12
|
+
end
|
13
|
+
|
14
|
+
alias to_gid to_global_id
|
15
|
+
|
16
|
+
def to_gid_param(options = nil) # :nodoc:
|
17
|
+
to_global_id(options).to_param
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_support/core_ext/module/anonymous'
|
4
|
+
|
5
|
+
module Rails
|
6
|
+
module GraphQL
|
7
|
+
module Helpers
|
8
|
+
# Helper module responsible for name stuff
|
9
|
+
module WithName
|
10
|
+
NAME_EXP = /GraphQL::(?:Type::\w+::|Directive::)?([:\w]+?)([A-Z][a-z]+)?\z/.freeze
|
11
|
+
|
12
|
+
# Here we define a couple of attributes used by registration
|
13
|
+
def self.extended(other)
|
14
|
+
# TODO: Move to registerable
|
15
|
+
# An abstract type won't appear in the introspection and will not be
|
16
|
+
# instantiated by requests
|
17
|
+
other.class_attribute :abstract, instance_accessor: false, default: false
|
18
|
+
end
|
19
|
+
|
20
|
+
# Return the name of the object as a GraphQL name
|
21
|
+
def gql_name
|
22
|
+
@gql_name ||= begin
|
23
|
+
name.match(NAME_EXP).try(:[], 1)&.tr(':', '')
|
24
|
+
end unless anonymous?
|
25
|
+
end
|
26
|
+
|
27
|
+
alias graphql_name gql_name
|
28
|
+
|
29
|
+
# Return the name of the object as a symbol
|
30
|
+
def to_sym
|
31
|
+
@gql_key ||= gql_name&.underscore&.to_sym
|
32
|
+
end
|
33
|
+
|
34
|
+
protected
|
35
|
+
|
36
|
+
# Change the gql name of the object
|
37
|
+
def rename!(name)
|
38
|
+
@gql_name = name.to_s
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
module Rails
|
4
|
-
module GraphQL
|
5
|
-
module Helpers
|
3
|
+
module Rails
|
4
|
+
module GraphQL
|
5
|
+
module Helpers
|
6
6
|
# Helper module that allows other objects to hold namespaces. It can
|
7
7
|
# either work as an extension of the superclass using +add_namespace+ or
|
8
8
|
# it can be reset then set using +namespace+.
|
@@ -10,7 +10,10 @@ module Rails # :nodoc:
|
|
10
10
|
# Returns the list of defined namespaces
|
11
11
|
def namespaces
|
12
12
|
return @namespaces if defined?(@namespaces)
|
13
|
-
superclass.try(:namespaces) ||
|
13
|
+
superclass.try(:namespaces) || begin
|
14
|
+
value = GraphQL.type_map.associated_namespace_of(self)
|
15
|
+
@namespaces = value unless value.nil?
|
16
|
+
end
|
14
17
|
end
|
15
18
|
|
16
19
|
# Set or overwrite the list of namespaces
|
@@ -1,16 +1,17 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
module Rails
|
4
|
-
module GraphQL
|
5
|
-
module Helpers
|
6
|
-
# Helper
|
3
|
+
module Rails
|
4
|
+
module GraphQL
|
5
|
+
module Helpers
|
6
|
+
# Helper focus on event execution when objects have a owner property,
|
7
|
+
# pratically allowing resolvers and similar to be called in the owner
|
7
8
|
module WithOwner
|
8
9
|
def self.included(other)
|
9
10
|
other.extend(WithOwner::ClassMethods)
|
10
11
|
other.class_attribute(:owner, instance_writer: false)
|
11
12
|
end
|
12
13
|
|
13
|
-
module ClassMethods
|
14
|
+
module ClassMethods
|
14
15
|
def method_defined?(method_name)
|
15
16
|
super || owner&.method_defined?(method_name)
|
16
17
|
end
|
@@ -18,11 +19,11 @@ module Rails # :nodoc:
|
|
18
19
|
|
19
20
|
private
|
20
21
|
|
21
|
-
def respond_to_missing?(*args)
|
22
|
+
def respond_to_missing?(*args)
|
22
23
|
owner_respond_to?(*args) || super
|
23
24
|
end
|
24
25
|
|
25
|
-
def method_missing(method_name, *args, **xargs, &block)
|
26
|
+
def method_missing(method_name, *args, **xargs, &block)
|
26
27
|
return super unless owner_respond_to?(method_name)
|
27
28
|
event.on_instance(owner) do |obj|
|
28
29
|
obj.public_send(method_name, *args, **xargs, &block)
|