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.
Files changed (297) hide show
  1. checksums.yaml +4 -4
  2. data/ext/console.rb +18 -0
  3. data/ext/extconf.h +3 -0
  4. data/ext/extconf.rb +1 -54
  5. data/ext/gql_parser.c +646 -0
  6. data/ext/shared.c +482 -0
  7. data/ext/shared.h +177 -0
  8. data/lib/gql_parser.so +0 -0
  9. data/lib/rails/graphql/adapters/mysql_adapter.rb +59 -0
  10. data/lib/rails/graphql/adapters/pg_adapter.rb +25 -22
  11. data/lib/rails/graphql/adapters/sqlite_adapter.rb +17 -14
  12. data/lib/rails/graphql/alternative/field_set.rb +36 -0
  13. data/lib/rails/graphql/alternative/mutation.rb +17 -0
  14. data/lib/rails/graphql/alternative/query.rb +93 -0
  15. data/lib/rails/graphql/alternative/subscription.rb +17 -0
  16. data/lib/rails/graphql/alternative.rb +20 -0
  17. data/lib/rails/graphql/argument.rb +21 -24
  18. data/lib/rails/graphql/callback.rb +24 -9
  19. data/lib/rails/graphql/collectors/hash_collector.rb +14 -6
  20. data/lib/rails/graphql/collectors/idented_collector.rb +10 -7
  21. data/lib/rails/graphql/collectors/json_collector.rb +22 -17
  22. data/lib/rails/graphql/collectors.rb +4 -4
  23. data/lib/rails/graphql/config.rb +130 -15
  24. data/lib/rails/graphql/directive/cached_directive.rb +33 -0
  25. data/lib/rails/graphql/directive/deprecated_directive.rb +10 -10
  26. data/lib/rails/graphql/directive/include_directive.rb +5 -4
  27. data/lib/rails/graphql/directive/skip_directive.rb +5 -4
  28. data/lib/rails/graphql/directive.rb +118 -63
  29. data/lib/rails/graphql/errors.rb +33 -4
  30. data/lib/rails/graphql/event.rb +16 -5
  31. data/lib/rails/graphql/field/authorized_field.rb +19 -3
  32. data/lib/rails/graphql/field/input_field.rb +11 -10
  33. data/lib/rails/graphql/field/mutation_field.rb +42 -7
  34. data/lib/rails/graphql/field/output_field.rb +102 -13
  35. data/lib/rails/graphql/field/proxied_field.rb +31 -22
  36. data/lib/rails/graphql/field/resolved_field.rb +26 -24
  37. data/lib/rails/graphql/field/scoped_config.rb +10 -4
  38. data/lib/rails/graphql/field/subscription_field.rb +140 -0
  39. data/lib/rails/graphql/field/typed_field.rb +43 -22
  40. data/lib/rails/graphql/field.rb +70 -56
  41. data/lib/rails/graphql/global_id.rb +85 -0
  42. data/lib/rails/graphql/helpers/attribute_delegator.rb +5 -5
  43. data/lib/rails/graphql/helpers/inherited_collection/array.rb +50 -0
  44. data/lib/rails/graphql/helpers/inherited_collection/base.rb +43 -0
  45. data/lib/rails/graphql/helpers/inherited_collection/hash.rb +87 -0
  46. data/lib/rails/graphql/helpers/inherited_collection.rb +25 -76
  47. data/lib/rails/graphql/helpers/instantiable.rb +15 -0
  48. data/lib/rails/graphql/helpers/leaf_from_ar.rb +7 -7
  49. data/lib/rails/graphql/helpers/registerable.rb +44 -62
  50. data/lib/rails/graphql/helpers/unregisterable.rb +16 -0
  51. data/lib/rails/graphql/helpers/with_arguments.rb +31 -27
  52. data/lib/rails/graphql/helpers/with_assignment.rb +6 -6
  53. data/lib/rails/graphql/helpers/with_callbacks.rb +25 -8
  54. data/lib/rails/graphql/helpers/with_description.rb +71 -0
  55. data/lib/rails/graphql/helpers/with_directives.rb +54 -30
  56. data/lib/rails/graphql/helpers/with_events.rb +21 -23
  57. data/lib/rails/graphql/helpers/with_fields.rb +76 -22
  58. data/lib/rails/graphql/helpers/with_global_id.rb +22 -0
  59. data/lib/rails/graphql/helpers/with_name.rb +43 -0
  60. data/lib/rails/graphql/helpers/with_namespace.rb +7 -4
  61. data/lib/rails/graphql/helpers/with_owner.rb +8 -7
  62. data/lib/rails/graphql/helpers/with_schema_fields.rb +137 -55
  63. data/lib/rails/graphql/helpers/with_validator.rb +9 -9
  64. data/lib/rails/graphql/helpers.rb +10 -3
  65. data/lib/rails/graphql/introspection.rb +43 -36
  66. data/lib/rails/graphql/railtie.rb +88 -33
  67. data/lib/rails/graphql/railties/base_generator.rb +3 -9
  68. data/lib/rails/graphql/railties/channel.rb +157 -0
  69. data/lib/rails/graphql/railties/controller.rb +62 -17
  70. data/lib/rails/graphql/railties/controller_runtime.rb +5 -5
  71. data/lib/rails/graphql/railties/log_subscriber.rb +81 -14
  72. data/lib/rails/graphql/request/arguments.rb +24 -49
  73. data/lib/rails/graphql/request/backtrace.rb +191 -0
  74. data/lib/rails/graphql/request/component/field.rb +86 -65
  75. data/lib/rails/graphql/request/component/fragment.rb +72 -24
  76. data/lib/rails/graphql/request/component/operation/subscription.rb +164 -4
  77. data/lib/rails/graphql/request/component/operation.rb +63 -31
  78. data/lib/rails/graphql/request/component/spread.rb +68 -25
  79. data/lib/rails/graphql/request/component/typename.rb +27 -12
  80. data/lib/rails/graphql/request/component.rb +75 -36
  81. data/lib/rails/graphql/request/context.rb +18 -8
  82. data/lib/rails/graphql/request/errors.rb +16 -6
  83. data/lib/rails/graphql/request/event.rb +19 -8
  84. data/lib/rails/graphql/request/helpers/directives.rb +68 -27
  85. data/lib/rails/graphql/request/helpers/selection_set.rb +51 -25
  86. data/lib/rails/graphql/request/helpers/value_writers.rb +18 -16
  87. data/lib/rails/graphql/request/prepared_data.rb +98 -0
  88. data/lib/rails/graphql/request/steps/authorizable.rb +24 -14
  89. data/lib/rails/graphql/request/steps/organizable.rb +110 -48
  90. data/lib/rails/graphql/request/steps/{prepareable.rb → preparable.rb} +20 -7
  91. data/lib/rails/graphql/request/steps/{resolveable.rb → resolvable.rb} +15 -6
  92. data/lib/rails/graphql/request/strategy/cached_strategy.rb +64 -0
  93. data/lib/rails/graphql/request/strategy/dynamic_instance.rb +6 -6
  94. data/lib/rails/graphql/request/strategy/multi_query_strategy.rb +6 -13
  95. data/lib/rails/graphql/request/strategy/sequenced_strategy.rb +9 -9
  96. data/lib/rails/graphql/request/strategy.rb +131 -75
  97. data/lib/rails/graphql/request/subscription.rb +80 -0
  98. data/lib/rails/graphql/request.rb +305 -86
  99. data/lib/rails/graphql/schema.rb +240 -48
  100. data/lib/rails/graphql/shortcuts.rb +22 -3
  101. data/lib/rails/graphql/source/active_record/builders.rb +49 -35
  102. data/lib/rails/graphql/source/active_record_source.rb +70 -54
  103. data/lib/rails/graphql/source/base.rb +111 -0
  104. data/lib/rails/graphql/source/builder.rb +128 -0
  105. data/lib/rails/graphql/source/scoped_arguments.rb +31 -19
  106. data/lib/rails/graphql/source.rb +89 -213
  107. data/lib/rails/graphql/subscription/provider/action_cable.rb +112 -0
  108. data/lib/rails/graphql/subscription/provider/base.rb +191 -0
  109. data/lib/rails/graphql/subscription/provider.rb +18 -0
  110. data/lib/rails/graphql/subscription/store/base.rb +145 -0
  111. data/lib/rails/graphql/subscription/store/memory.rb +127 -0
  112. data/lib/rails/graphql/subscription/store.rb +19 -0
  113. data/lib/rails/graphql/subscription.rb +17 -0
  114. data/lib/rails/graphql/to_gql.rb +29 -32
  115. data/lib/rails/graphql/type/enum/directive_location_enum.rb +11 -11
  116. data/lib/rails/graphql/type/enum/type_kind_enum.rb +3 -3
  117. data/lib/rails/graphql/type/enum.rb +34 -48
  118. data/lib/rails/graphql/type/input.rb +74 -23
  119. data/lib/rails/graphql/type/interface.rb +16 -26
  120. data/lib/rails/graphql/type/object/directive_object.rb +4 -4
  121. data/lib/rails/graphql/type/object/enum_value_object.rb +3 -3
  122. data/lib/rails/graphql/type/object/field_object.rb +24 -6
  123. data/lib/rails/graphql/type/object/input_value_object.rb +3 -3
  124. data/lib/rails/graphql/type/object/schema_object.rb +5 -8
  125. data/lib/rails/graphql/type/object/type_object.rb +29 -19
  126. data/lib/rails/graphql/type/object.rb +26 -23
  127. data/lib/rails/graphql/type/scalar/any_scalar.rb +30 -0
  128. data/lib/rails/graphql/type/scalar/bigint_scalar.rb +5 -5
  129. data/lib/rails/graphql/type/scalar/binary_scalar.rb +3 -3
  130. data/lib/rails/graphql/type/scalar/boolean_scalar.rb +8 -8
  131. data/lib/rails/graphql/type/scalar/date_scalar.rb +3 -3
  132. data/lib/rails/graphql/type/scalar/date_time_scalar.rb +3 -3
  133. data/lib/rails/graphql/type/scalar/decimal_scalar.rb +3 -3
  134. data/lib/rails/graphql/type/scalar/float_scalar.rb +5 -5
  135. data/lib/rails/graphql/type/scalar/id_scalar.rb +6 -5
  136. data/lib/rails/graphql/type/scalar/int_scalar.rb +6 -5
  137. data/lib/rails/graphql/type/scalar/json_scalar.rb +39 -0
  138. data/lib/rails/graphql/type/scalar/string_scalar.rb +18 -4
  139. data/lib/rails/graphql/type/scalar/time_scalar.rb +5 -5
  140. data/lib/rails/graphql/type/scalar.rb +25 -22
  141. data/lib/rails/graphql/type/union.rb +14 -16
  142. data/lib/rails/graphql/type.rb +34 -25
  143. data/lib/rails/graphql/type_map.rb +256 -164
  144. data/lib/rails/graphql/uri.rb +166 -0
  145. data/lib/rails/graphql/version.rb +15 -3
  146. data/lib/rails/graphql.rake +3 -0
  147. data/lib/rails/graphql.rb +85 -52
  148. data/lib/rails-graphql.rb +1 -1
  149. data/test/assets/en.yml +29 -0
  150. data/test/assets/introspection-mem.txt +1 -1
  151. data/test/assets/mem.gql +18 -45
  152. data/test/assets/mysql.gql +392 -0
  153. data/test/assets/sqlite.gql +21 -12
  154. data/test/assets/translate.gql +335 -0
  155. data/test/config.rb +18 -8
  156. data/test/graphql/schema_test.rb +12 -19
  157. data/test/graphql/source_test.rb +8 -75
  158. data/test/graphql/type/enum_test.rb +207 -203
  159. data/test/graphql/type/input_test.rb +14 -9
  160. data/test/graphql/type/interface_test.rb +4 -4
  161. data/test/graphql/type/scalar/any_scalar_test.rb +38 -0
  162. data/test/graphql/type/scalar/boolean_scalar_test.rb +6 -3
  163. data/test/graphql/type/scalar/json_scalar_test.rb +23 -0
  164. data/test/graphql/type_map_test.rb +51 -66
  165. data/test/graphql/type_test.rb +0 -19
  166. data/test/graphql_test.rb +1 -1
  167. data/test/integration/{authorization/authorization_test.rb → authorization_test.rb} +40 -14
  168. data/test/integration/config.rb +36 -3
  169. data/test/integration/customization_test.rb +39 -0
  170. data/test/integration/global_id_test.rb +99 -0
  171. data/test/integration/memory/star_wars_introspection_test.rb +24 -16
  172. data/test/integration/memory/star_wars_query_test.rb +54 -3
  173. data/test/integration/memory/star_wars_validation_test.rb +1 -1
  174. data/test/integration/mysql/star_wars_introspection_test.rb +25 -0
  175. data/test/integration/persisted_query_test.rb +87 -0
  176. data/test/integration/resolver_precedence_test.rb +154 -0
  177. data/test/integration/schemas/memory.rb +22 -7
  178. data/test/integration/schemas/mysql.rb +62 -0
  179. data/test/integration/schemas/sqlite.rb +21 -12
  180. data/test/integration/sqlite/star_wars_global_id_test.rb +83 -0
  181. data/test/integration/sqlite/star_wars_introspection_test.rb +10 -0
  182. data/test/integration/sqlite/star_wars_query_test.rb +14 -1
  183. data/test/integration/translate_test.rb +61 -0
  184. data/test/test_ext.rb +16 -13
  185. metadata +108 -157
  186. data/ext/depend +0 -3
  187. data/ext/graphqlparser/Ast.cpp +0 -346
  188. data/ext/graphqlparser/Ast.h +0 -1214
  189. data/ext/graphqlparser/AstNode.h +0 -36
  190. data/ext/graphqlparser/AstVisitor.h +0 -137
  191. data/ext/graphqlparser/GraphQLParser.cpp +0 -76
  192. data/ext/graphqlparser/GraphQLParser.h +0 -55
  193. data/ext/graphqlparser/JsonVisitor.cpp +0 -161
  194. data/ext/graphqlparser/JsonVisitor.cpp.inc +0 -456
  195. data/ext/graphqlparser/JsonVisitor.h +0 -121
  196. data/ext/graphqlparser/JsonVisitor.h.inc +0 -110
  197. data/ext/graphqlparser/VERSION +0 -1
  198. data/ext/graphqlparser/c/GraphQLAst.cpp +0 -324
  199. data/ext/graphqlparser/c/GraphQLAst.h +0 -180
  200. data/ext/graphqlparser/c/GraphQLAstForEachConcreteType.h +0 -44
  201. data/ext/graphqlparser/c/GraphQLAstNode.cpp +0 -25
  202. data/ext/graphqlparser/c/GraphQLAstNode.h +0 -33
  203. data/ext/graphqlparser/c/GraphQLAstToJSON.cpp +0 -21
  204. data/ext/graphqlparser/c/GraphQLAstToJSON.h +0 -24
  205. data/ext/graphqlparser/c/GraphQLAstVisitor.cpp +0 -55
  206. data/ext/graphqlparser/c/GraphQLAstVisitor.h +0 -53
  207. data/ext/graphqlparser/c/GraphQLParser.cpp +0 -35
  208. data/ext/graphqlparser/c/GraphQLParser.h +0 -54
  209. data/ext/graphqlparser/dump_json_ast.cpp +0 -48
  210. data/ext/graphqlparser/lexer.lpp +0 -324
  211. data/ext/graphqlparser/parser.ypp +0 -693
  212. data/ext/graphqlparser/parsergen/lexer.cpp +0 -2633
  213. data/ext/graphqlparser/parsergen/lexer.h +0 -528
  214. data/ext/graphqlparser/parsergen/location.hh +0 -189
  215. data/ext/graphqlparser/parsergen/parser.tab.cpp +0 -3300
  216. data/ext/graphqlparser/parsergen/parser.tab.hpp +0 -646
  217. data/ext/graphqlparser/parsergen/position.hh +0 -179
  218. data/ext/graphqlparser/parsergen/stack.hh +0 -156
  219. data/ext/graphqlparser/syntaxdefs.h +0 -19
  220. data/ext/libgraphqlparser/AstNode.h +0 -36
  221. data/ext/libgraphqlparser/CMakeLists.txt +0 -148
  222. data/ext/libgraphqlparser/CONTRIBUTING.md +0 -23
  223. data/ext/libgraphqlparser/GraphQLParser.cpp +0 -76
  224. data/ext/libgraphqlparser/GraphQLParser.h +0 -55
  225. data/ext/libgraphqlparser/JsonVisitor.cpp +0 -161
  226. data/ext/libgraphqlparser/JsonVisitor.h +0 -121
  227. data/ext/libgraphqlparser/LICENSE +0 -22
  228. data/ext/libgraphqlparser/README.clang-tidy +0 -7
  229. data/ext/libgraphqlparser/README.md +0 -84
  230. data/ext/libgraphqlparser/ast/ast.ast +0 -203
  231. data/ext/libgraphqlparser/ast/ast.py +0 -61
  232. data/ext/libgraphqlparser/ast/c.py +0 -100
  233. data/ext/libgraphqlparser/ast/c.pyc +0 -0
  234. data/ext/libgraphqlparser/ast/c_impl.py +0 -61
  235. data/ext/libgraphqlparser/ast/c_impl.pyc +0 -0
  236. data/ext/libgraphqlparser/ast/c_visitor_impl.py +0 -39
  237. data/ext/libgraphqlparser/ast/c_visitor_impl.pyc +0 -0
  238. data/ext/libgraphqlparser/ast/casing.py +0 -26
  239. data/ext/libgraphqlparser/ast/casing.pyc +0 -0
  240. data/ext/libgraphqlparser/ast/cxx.py +0 -197
  241. data/ext/libgraphqlparser/ast/cxx.pyc +0 -0
  242. data/ext/libgraphqlparser/ast/cxx_impl.py +0 -61
  243. data/ext/libgraphqlparser/ast/cxx_impl.pyc +0 -0
  244. data/ext/libgraphqlparser/ast/cxx_json_visitor_header.py +0 -42
  245. data/ext/libgraphqlparser/ast/cxx_json_visitor_header.pyc +0 -0
  246. data/ext/libgraphqlparser/ast/cxx_json_visitor_impl.py +0 -80
  247. data/ext/libgraphqlparser/ast/cxx_json_visitor_impl.pyc +0 -0
  248. data/ext/libgraphqlparser/ast/cxx_visitor.py +0 -64
  249. data/ext/libgraphqlparser/ast/cxx_visitor.pyc +0 -0
  250. data/ext/libgraphqlparser/ast/js.py +0 -65
  251. data/ext/libgraphqlparser/ast/license.py +0 -10
  252. data/ext/libgraphqlparser/ast/license.pyc +0 -0
  253. data/ext/libgraphqlparser/c/GraphQLAstNode.cpp +0 -25
  254. data/ext/libgraphqlparser/c/GraphQLAstNode.h +0 -33
  255. data/ext/libgraphqlparser/c/GraphQLAstToJSON.cpp +0 -21
  256. data/ext/libgraphqlparser/c/GraphQLAstToJSON.h +0 -24
  257. data/ext/libgraphqlparser/c/GraphQLAstVisitor.cpp +0 -55
  258. data/ext/libgraphqlparser/c/GraphQLAstVisitor.h +0 -53
  259. data/ext/libgraphqlparser/c/GraphQLParser.cpp +0 -35
  260. data/ext/libgraphqlparser/c/GraphQLParser.h +0 -54
  261. data/ext/libgraphqlparser/clang-tidy-all.sh +0 -3
  262. data/ext/libgraphqlparser/cmake/version.cmake +0 -16
  263. data/ext/libgraphqlparser/dump_json_ast.cpp +0 -48
  264. data/ext/libgraphqlparser/go/README.md +0 -20
  265. data/ext/libgraphqlparser/go/callbacks.go +0 -18
  266. data/ext/libgraphqlparser/go/gotest.go +0 -64
  267. data/ext/libgraphqlparser/lexer.lpp +0 -324
  268. data/ext/libgraphqlparser/libgraphqlparser.pc.in +0 -11
  269. data/ext/libgraphqlparser/parser.ypp +0 -693
  270. data/ext/libgraphqlparser/parsergen/lexer.cpp +0 -2633
  271. data/ext/libgraphqlparser/parsergen/lexer.h +0 -528
  272. data/ext/libgraphqlparser/parsergen/location.hh +0 -189
  273. data/ext/libgraphqlparser/parsergen/parser.tab.cpp +0 -3300
  274. data/ext/libgraphqlparser/parsergen/parser.tab.hpp +0 -646
  275. data/ext/libgraphqlparser/parsergen/position.hh +0 -179
  276. data/ext/libgraphqlparser/parsergen/stack.hh +0 -156
  277. data/ext/libgraphqlparser/python/CMakeLists.txt +0 -14
  278. data/ext/libgraphqlparser/python/README.md +0 -5
  279. data/ext/libgraphqlparser/python/example.py +0 -31
  280. data/ext/libgraphqlparser/syntaxdefs.h +0 -19
  281. data/ext/libgraphqlparser/test/BuildCAPI.c +0 -5
  282. data/ext/libgraphqlparser/test/CMakeLists.txt +0 -25
  283. data/ext/libgraphqlparser/test/JsonVisitorTests.cpp +0 -28
  284. data/ext/libgraphqlparser/test/ParserTests.cpp +0 -352
  285. data/ext/libgraphqlparser/test/kitchen-sink.graphql +0 -59
  286. data/ext/libgraphqlparser/test/kitchen-sink.json +0 -1
  287. data/ext/libgraphqlparser/test/schema-kitchen-sink.graphql +0 -78
  288. data/ext/libgraphqlparser/test/schema-kitchen-sink.json +0 -1
  289. data/ext/libgraphqlparser/test/valgrind.supp +0 -33
  290. data/ext/version.cpp +0 -21
  291. data/lib/graphqlparser.so +0 -0
  292. data/lib/rails/graphql/native/functions.rb +0 -38
  293. data/lib/rails/graphql/native/location.rb +0 -41
  294. data/lib/rails/graphql/native/pointers.rb +0 -23
  295. data/lib/rails/graphql/native/visitor.rb +0 -349
  296. data/lib/rails/graphql/native.rb +0 -56
  297. data/test/integration/schemas/authorization.rb +0 -12
@@ -1,100 +0,0 @@
1
- # Copyright 2019-present, GraphQL Foundation
2
- #
3
- # This source code is licensed under the MIT license found in the
4
- # LICENSE file in the root directory of this source tree.
5
-
6
- from casing import snake
7
-
8
- from license import C_LICENSE_COMMENT
9
-
10
- def struct_name(type):
11
- return 'GraphQLAst' + type
12
-
13
-
14
- def return_type(type):
15
- if type == 'OperationKind' or type == 'string':
16
- return 'const char *'
17
-
18
- if type == 'boolean':
19
- return 'int'
20
-
21
- return 'const struct %s *' % struct_name(type)
22
-
23
-
24
- def field_prototype(owning_type, type, name, nullable, plural):
25
- st_name = struct_name(owning_type)
26
- if plural:
27
- return 'int %s_get_%s_size(const struct %s *node)' % (
28
- st_name, snake(name), st_name)
29
- else:
30
- ret_type = return_type(type)
31
- return '%s %s_get_%s(const struct %s *node)' % (
32
- ret_type, st_name, snake(name), st_name)
33
-
34
-
35
- class Printer(object):
36
- '''Printer for the pure C interface to the AST.
37
-
38
- Merely a set of wrappers around the C++ interface; makes it possible
39
- to use the AST from C code and simplifies the task of writing
40
- bindings for other langugages.
41
-
42
- The mapping is as follows:
43
-
44
- - For each concrete type, you get an opaque C struct type,
45
- accessible only by pointer.
46
-
47
- - For each singular field of a concrete type, you get an accessor
48
- function, returning said field in the obvious way.
49
-
50
- - For each plural field of a concrete type, you get an accessor
51
- function telling you its size. For access to elements of a plural
52
- field, you can use the visitor API.
53
-
54
- - For each union type, you get nothing specific (REVIEW), but you
55
- can use the visitor API to work around this entirely.
56
-
57
- '''
58
-
59
- def __init__(self):
60
- self._current_type = None
61
-
62
- def start_file(self):
63
- print C_LICENSE_COMMENT + '''/** @generated */
64
-
65
- #pragma once
66
-
67
- #ifdef __cplusplus
68
- extern "C" {
69
- #endif
70
-
71
- '''
72
-
73
- def end_file(self):
74
- print '''
75
-
76
- #ifdef __cplusplus
77
- }
78
- #endif
79
- '''
80
-
81
- def start_type(self, name):
82
- # Forward declarations for AST nodes.
83
- st_name = struct_name(name)
84
- print 'struct ' + st_name + ';'
85
- self._current_type = name
86
-
87
- def field(self, type, name, nullable, plural):
88
- print field_prototype(self._current_type, type, name, nullable, plural) + ';'
89
-
90
- def end_type(self, name):
91
- print
92
-
93
- def start_union(self, name):
94
- print 'struct ' + struct_name(name) + ';'
95
-
96
- def union_option(self, option):
97
- pass
98
-
99
- def end_union(self, name):
100
- print
Binary file
@@ -1,61 +0,0 @@
1
- # Copyright 2019-present, GraphQL Foundation
2
- #
3
- # This source code is licensed under the MIT license found in the
4
- # LICENSE file in the root directory of this source tree.
5
-
6
- from c import field_prototype, return_type, struct_name
7
- from casing import title
8
- from license import C_LICENSE_COMMENT
9
-
10
- class Printer(object):
11
- '''Printer for the implementation of the pure C interface to the AST.
12
- '''
13
-
14
- def __init__(self):
15
- self._current_type = None
16
-
17
- def start_file(self):
18
- print C_LICENSE_COMMENT + '''/** @generated */
19
-
20
- #include "GraphQLAst.h"
21
- #include "../Ast.h"
22
-
23
- using namespace facebook::graphql::ast; // NOLINT
24
- '''
25
-
26
- def end_file(self):
27
- pass
28
-
29
- def start_type(self, name):
30
- self._current_type = name
31
-
32
- def field(self, type, name, nullable, plural):
33
- print field_prototype(self._current_type, type, name, nullable, plural) + ' {'
34
- print ' const auto *realNode = reinterpret_cast<const %s *>(node);' % self._current_type
35
- title_name = title(name)
36
- call_get = 'realNode->get%s()' % title_name
37
- if plural:
38
- if nullable:
39
- print ' return %s ? %s->size() : 0;' % (call_get, call_get)
40
- else:
41
- print ' return %s.size();' % call_get
42
- else:
43
- if type in ['string', 'OperationKind', 'boolean']:
44
- print ' return %s;' % call_get
45
- else:
46
- fmt = ' return reinterpret_cast<const struct %s *>(%s%s);'
47
- print fmt % (struct_name(type), '' if nullable else '&', call_get)
48
-
49
- print '}'
50
-
51
- def end_type(self, name):
52
- pass
53
-
54
- def start_union(self, name):
55
- pass
56
-
57
- def union_option(self, option):
58
- pass
59
-
60
- def end_union(self, name):
61
- pass
Binary file
@@ -1,39 +0,0 @@
1
- # Copyright 2019-present, GraphQL Foundation
2
- #
3
- # This source code is licensed under the MIT license found in the
4
- # LICENSE file in the root directory of this source tree.
5
-
6
- from casing import snake
7
- from license import C_LICENSE_COMMENT
8
-
9
- class Printer(object):
10
- '''Printer for a simple list of types to be visited by the C visitor.
11
- '''
12
-
13
- def __init__(self):
14
- self._types = []
15
-
16
- def start_file(self):
17
- print C_LICENSE_COMMENT + '/** @generated */'
18
- print '#define FOR_EACH_CONCRETE_TYPE(MACRO) \\'
19
-
20
- def start_type(self, name):
21
- self._types.append(name)
22
-
23
- def field(self, type, name, nullable, plural):
24
- pass
25
-
26
- def end_type(self, name):
27
- pass
28
-
29
- def end_file(self):
30
- print ' \\\n'.join('MACRO(%s, %s)' % (name, snake(name)) for name in self._types)
31
-
32
- def start_union(self, name):
33
- pass
34
-
35
- def union_option(self, option):
36
- pass
37
-
38
- def end_union(self, name):
39
- pass
@@ -1,26 +0,0 @@
1
- # Copyright 2019-present, GraphQL Foundation
2
- #
3
- # This source code is licensed under the MIT license found in the
4
- # LICENSE file in the root directory of this source tree.
5
-
6
- def title(s):
7
- '''Capitalize the first character of s.'''
8
- return s[0].capitalize() + s[1:]
9
-
10
-
11
- def camel(s):
12
- '''Lowercase the first character of s.'''
13
- return s[0].lower() + s[1:]
14
-
15
-
16
- def snake(s):
17
- '''Convert from title or camelCase to snake_case.'''
18
- if len(s) < 2:
19
- return s.lower()
20
- out = s[0].lower()
21
- for c in s[1:]:
22
- if c.isupper():
23
- out += '_'
24
- c = c.lower()
25
- out += c
26
- return out
Binary file
@@ -1,197 +0,0 @@
1
- # Copyright 2019-present, GraphQL Foundation
2
- #
3
- # This source code is licensed under the MIT license found in the
4
- # LICENSE file in the root directory of this source tree.
5
-
6
- import cStringIO as StringIO
7
-
8
- from casing import title
9
- from license import C_LICENSE_COMMENT
10
-
11
- class Printer(object):
12
- def __init__(self):
13
- self._type_name = None
14
- # Map concrete type to base class
15
- self._bases = {}
16
- # HACK: Defer everything we print so that forward declarations for
17
- # all classes come first. Avoids having to do 2 passes over the
18
- # input file.
19
- self._deferredOutput = StringIO.StringIO()
20
-
21
- self._fields = []
22
-
23
- def start_file(self):
24
- print C_LICENSE_COMMENT + '''/** @generated */
25
- #pragma once
26
-
27
- #include "AstNode.h"
28
-
29
- #include <memory>
30
- #include <string>
31
- #include <utility>
32
- #include <vector>
33
-
34
- namespace facebook {
35
- namespace graphql {
36
- namespace ast {
37
-
38
- // The parser uses strdup to move from yytext to the heap, so we need
39
- // to use free instead of delete.
40
- struct CDeleter {
41
- void operator()(const char *p) const { free((void *)p); }
42
- };
43
- '''
44
-
45
- def end_file(self):
46
- print
47
- print self._deferredOutput.getvalue()
48
- print '}'
49
- print '}'
50
- print '}'
51
-
52
- def _base_class(self, type):
53
- return self._bases.get(type, 'Node')
54
-
55
- def start_type(self, name):
56
- self._type_name = name
57
- base = self._base_class(name)
58
- # non-deferred!
59
- print 'class %s;' % name
60
- print >> self._deferredOutput, 'class %s : public %s {' % (name, base)
61
- self._fields = []
62
-
63
- def field(self, type, name, nullable, plural):
64
- if type == 'OperationKind':
65
- type = 'string'
66
- self._fields.append((type, name, nullable, plural))
67
-
68
- def end_type(self, name):
69
- self._print_fields()
70
- print >> self._deferredOutput, ' public:'
71
- self._print_constructor()
72
- print >> self._deferredOutput
73
- self._print_destructor_prototype()
74
- print >> self._deferredOutput
75
- self._print_noncopyable()
76
- print >> self._deferredOutput
77
- self._print_getters()
78
- print >> self._deferredOutput, ' void accept(visitor::AstVisitor *visitor) const override;'
79
- print >> self._deferredOutput, '};'
80
- print >> self._deferredOutput
81
- print >> self._deferredOutput
82
- self._type_name = None
83
- self._fields = []
84
-
85
- def _storage_type(self, type):
86
- if type == 'string':
87
- return 'std::unique_ptr<const char, CDeleter>'
88
- elif type == 'boolean':
89
- return 'bool'
90
- else:
91
- return 'std::unique_ptr<%s>' % type
92
-
93
- def _print_fields(self):
94
- for (type, name, nullable, plural) in self._fields:
95
- storage_type = self._storage_type(type)
96
- if plural:
97
- storage_type = 'std::unique_ptr<std::vector<%s>>' % storage_type
98
- print >> self._deferredOutput, ' %s %s_;' % (storage_type, name)
99
-
100
- def _ctor_singular_type(self, type):
101
- if type == 'string':
102
- return 'const char *'
103
- elif type == 'boolean':
104
- return 'bool'
105
- else:
106
- return '%s *' % type
107
-
108
- def _ctor_plural_type(self, type):
109
- return 'std::vector<%s> *' % self._storage_type(type)
110
-
111
- def _print_constructor(self):
112
- print >> self._deferredOutput, ' explicit %s(' % self._type_name
113
- print >> self._deferredOutput, ' const yy::location &location%s' % (',' if self._fields else '')
114
- def ctor_arg(type, name, plural):
115
- if plural:
116
- ctor_type = self._ctor_plural_type(type)
117
- else:
118
- ctor_type = self._ctor_singular_type(type)
119
- return ' %s %s' % (ctor_type, name)
120
- print >> self._deferredOutput, ',\n'.join(ctor_arg(type, name, plural)
121
- for (type, name, nullable, plural) in self._fields)
122
- print >> self._deferredOutput, ' )'
123
- def ctor_init(type, name, plural):
124
- # Strings are const char *, just pass.
125
- # Vectors are passed by pointer and we take ownership.
126
- # Node types are passed in by pointer and we take ownership.
127
- value = name
128
- return ' %s_(%s)' % (name, value)
129
- print >> self._deferredOutput, ' : %s(location)%s' % (self._base_class(self._type_name), ',' if self._fields else '')
130
- print >> self._deferredOutput, ',\n'.join(ctor_init(type, name, plural)
131
- for (type, name, nullable, plural)
132
- in self._fields)
133
- print >> self._deferredOutput, ' {}'
134
-
135
- def _getter_type(self, type, nullable, plural):
136
- if plural and nullable:
137
- return 'const std::vector<%s>*' % self._storage_type(type)
138
- elif plural:
139
- return 'const std::vector<%s>&' % self._storage_type(type)
140
-
141
- if type == 'string':
142
- assert not nullable
143
- return 'const char *'
144
- elif type == 'boolean':
145
- assert not nullable
146
- return 'bool'
147
- elif nullable:
148
- return 'const %s*' % type
149
- else:
150
- return 'const %s&' % type
151
-
152
- def _getter_value_to_return(self, raw_value, type, nullable, plural):
153
- if plural and nullable:
154
- return raw_value + '.get()'
155
- elif plural:
156
- return '*%s' % raw_value
157
- elif type == 'boolean':
158
- return raw_value
159
- elif nullable or type == 'string':
160
- return '%s.get()' % raw_value
161
- else:
162
- return '*%s' % raw_value
163
-
164
- def _print_getters(self):
165
- for (type, name, nullable, plural) in self._fields:
166
- print >> self._deferredOutput, ' %s get%s() const' % (
167
- self._getter_type(type, nullable, plural),
168
- title(name))
169
- print >> self._deferredOutput, ' { return %s; }' % (
170
- self._getter_value_to_return(name + '_', type, nullable, plural))
171
- print >> self._deferredOutput
172
-
173
- def _print_destructor_prototype(self):
174
- print >> self._deferredOutput, ' ~%s() {}' % self._type_name
175
-
176
- def _print_noncopyable(self):
177
- print >> self._deferredOutput, ' %s(const %s&) = delete;' % (
178
- self._type_name, self._type_name)
179
- print >> self._deferredOutput, ' %s& operator=(const %s&) = delete;' % (
180
- self._type_name, self._type_name)
181
-
182
- def start_union(self, name):
183
- self._type_name = name
184
- # non-deferred!
185
- print 'class %s;' % name
186
- print >> self._deferredOutput, 'class %s : public Node {' % name
187
- print >> self._deferredOutput, ' public:'
188
- self._print_constructor()
189
- print >> self._deferredOutput, '};'
190
- print >> self._deferredOutput
191
-
192
- def union_option(self, type):
193
- assert type not in self._bases, '%s cannot appear in more than one union!' % type
194
- self._bases[type] = self._type_name
195
-
196
- def end_union(self, name):
197
- pass
Binary file
@@ -1,61 +0,0 @@
1
- # Copyright 2019-present, GraphQL Foundation
2
- #
3
- # This source code is licensed under the MIT license found in the
4
- # LICENSE file in the root directory of this source tree.
5
-
6
- from license import C_LICENSE_COMMENT
7
-
8
- class Printer(object):
9
- def __init__(self):
10
- pass
11
-
12
- def start_file(self):
13
- print C_LICENSE_COMMENT + '''/** @generated */
14
-
15
- #include "Ast.h"
16
- #include "AstVisitor.h"
17
-
18
- namespace facebook {
19
- namespace graphql {
20
- namespace ast {
21
- '''
22
-
23
- def end_file(self):
24
- print '} // namespace ast'
25
- print '} // namespace graphql'
26
- print '} // namespace facebook'
27
-
28
- def start_type(self, name):
29
- print '''void %s::accept(visitor::AstVisitor *visitor) const {
30
- if (visitor->visit%s(*this)) {
31
- ''' % (name, name)
32
-
33
- def field(self, type, name, nullable, plural):
34
- if type in ['OperationKind', 'string', 'boolean']:
35
- return
36
-
37
- if plural:
38
- accept = '{ for (const auto &x : *%s_) { x->accept(visitor); } }' % name
39
- if nullable:
40
- accept = 'if (%s_) %s' % (name, accept)
41
- print ' ' + accept
42
- else:
43
- accept = '%s_->accept(visitor);' % name
44
- if nullable:
45
- accept = 'if (%s_) { %s }' % (name, accept)
46
- print ' ' + accept
47
-
48
- def end_type(self, name):
49
- print ''' }
50
- visitor->endVisit%s(*this);
51
- }
52
- ''' % name
53
-
54
- def start_union(self, name):
55
- pass
56
-
57
- def union_option(self, option):
58
- pass
59
-
60
- def end_union(self, name):
61
- pass
Binary file
@@ -1,42 +0,0 @@
1
- # Copyright 2019-present, GraphQL Foundation
2
- # All rights reserved.
3
- #
4
- # This source code is licensed under the MIT license found in the
5
- # LICENSE file in the root directory of this source tree.
6
-
7
- from casing import title
8
- from license import C_LICENSE_COMMENT
9
-
10
- class Printer(object):
11
- def __init__(self):
12
- self._anyFieldIsANode = False
13
-
14
- def start_file(self):
15
- print C_LICENSE_COMMENT + '/** @generated */'
16
-
17
- def end_file(self):
18
- pass
19
-
20
- def start_type(self, name):
21
- self._anyFieldIsANode = False
22
-
23
- def end_type(self, name):
24
- titleName = title(name)
25
- if self._anyFieldIsANode:
26
- print 'bool visit%s(const %s &node) override;' % (titleName, titleName)
27
- print 'void endVisit%s(const %s &node) override;' % (titleName, titleName)
28
- print
29
-
30
- def field(self, type, name, nullable, plural):
31
- if (not self._anyFieldIsANode and
32
- type not in ('OperationKind', 'string', 'boolean')):
33
- self._anyFieldIsANode = True
34
-
35
- def start_union(self, name):
36
- pass
37
-
38
- def union_option(self, option):
39
- pass
40
-
41
- def end_union(self, name):
42
- pass
@@ -1,80 +0,0 @@
1
- # Copyright 2019-present, GraphQL Foundation
2
- # All rights reserved.
3
- #
4
- # This source code is licensed under the MIT license found in the
5
- # LICENSE file in the root directory of this source tree.
6
-
7
- from casing import title
8
- from license import C_LICENSE_COMMENT
9
-
10
- class Printer(object):
11
- def __init__(self):
12
- self._fields = []
13
-
14
- def start_file(self):
15
- print C_LICENSE_COMMENT + '/** @generated */'
16
-
17
- def end_file(self):
18
- pass
19
-
20
- def start_type(self, name):
21
- self._fields = []
22
-
23
- def field(self, type, name, nullable, plural):
24
- if type == 'OperationKind':
25
- type = 'string'
26
- self._fields.append((type, name, nullable, plural))
27
-
28
- def end_type(self, name):
29
- titleName = title(name)
30
- anyFieldIsANode = any(type not in ('string, boolean')
31
- for (type, _, _ ,_) in self._fields)
32
- if anyFieldIsANode:
33
- print '''bool JsonVisitor::visit%s(const %s &node) {
34
- visitNode();
35
- return true;
36
- }
37
- ''' % (titleName, titleName)
38
- print '''void JsonVisitor::endVisit%(tn)s(const %(tn)s &node) {
39
- NodeFieldPrinter fields(*this, "%(tn)s", node);''' % {'tn': titleName}
40
-
41
- for (type, fieldName, nullable, plural) in self._fields:
42
- funcName = None
43
- if type == 'string':
44
- assert not plural, 'plural string fields not supported yet'
45
- funcName = 'printSingularPrimitiveField'
46
- elif type == 'boolean':
47
- assert not plural, 'plural boolean fields not supported yet'
48
- funcName = 'printSingularBooleanField'
49
- elif not nullable and not plural:
50
- # Special case: singular object fields don't need the value passed.
51
- print ' fields.printSingularObjectField("%s");' % fieldName
52
- continue
53
- else:
54
- nullable_str = 'Nullable' if nullable else ''
55
- plural_str = 'Plural' if plural else 'SingularObject'
56
- funcName = 'print%s%sField' % (nullable_str, plural_str)
57
-
58
- assert funcName is not None
59
- print ' fields.%s("%s", node.get%s());' % (
60
- funcName, fieldName, title(fieldName))
61
-
62
- if anyFieldIsANode:
63
- print '''
64
- endVisitNode(fields.finishPrinting());
65
- }
66
- '''
67
- else:
68
- print '''
69
- printed_.back().emplace_back(fields.finishPrinting());
70
- }
71
- '''
72
-
73
- def start_union(self, name):
74
- pass
75
-
76
- def union_option(self, option):
77
- pass
78
-
79
- def end_union(self, name):
80
- pass
@@ -1,64 +0,0 @@
1
- # Copyright 2019-present, GraphQL Foundation
2
- #
3
- # This source code is licensed under the MIT license found in the
4
- # LICENSE file in the root directory of this source tree.
5
-
6
- from casing import camel, title
7
- from license import C_LICENSE_COMMENT
8
-
9
- class Printer(object):
10
- def __init__(self):
11
- pass
12
-
13
- def start_file(self):
14
- print C_LICENSE_COMMENT + '''/** @generated */
15
-
16
- #pragma once
17
-
18
- #include "Ast.h"
19
-
20
- namespace facebook {
21
- namespace graphql {
22
- namespace ast {
23
- namespace visitor {
24
-
25
- class AstVisitor {
26
- public:
27
- virtual ~AstVisitor() {}
28
- '''
29
-
30
- def end_file(self):
31
- print '};' # end AstVisitor
32
- print
33
- print '}'
34
- print '}'
35
- print '}'
36
- print '}'
37
-
38
- def start_type(self, name):
39
- titleName = title(name)
40
- camelName = camel(titleName)
41
- print ' virtual bool visit%s(const %s &%s) { return true; }' % (
42
- titleName,
43
- titleName,
44
- camelName)
45
- print ' virtual void endVisit%s(const %s &%s) { }' % (
46
- titleName,
47
- titleName,
48
- camelName)
49
- print
50
-
51
- def end_type(self, name):
52
- pass
53
-
54
- def field(self, type, name, nullable, plural):
55
- pass
56
-
57
- def start_union(self, name):
58
- pass
59
-
60
- def union_option(self, option):
61
- pass
62
-
63
- def end_union(self, name):
64
- pass