rails-graphql 0.1.0

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 (266) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +19 -0
  4. data/Rakefile +31 -0
  5. data/ext/depend +3 -0
  6. data/ext/extconf.rb +57 -0
  7. data/ext/graphqlparser/Ast.cpp +346 -0
  8. data/ext/graphqlparser/Ast.h +1214 -0
  9. data/ext/graphqlparser/AstNode.h +36 -0
  10. data/ext/graphqlparser/AstVisitor.h +137 -0
  11. data/ext/graphqlparser/GraphQLParser.cpp +76 -0
  12. data/ext/graphqlparser/GraphQLParser.h +55 -0
  13. data/ext/graphqlparser/JsonVisitor.cpp +161 -0
  14. data/ext/graphqlparser/JsonVisitor.cpp.inc +456 -0
  15. data/ext/graphqlparser/JsonVisitor.h +121 -0
  16. data/ext/graphqlparser/JsonVisitor.h.inc +110 -0
  17. data/ext/graphqlparser/VERSION +1 -0
  18. data/ext/graphqlparser/c/GraphQLAst.cpp +324 -0
  19. data/ext/graphqlparser/c/GraphQLAst.h +180 -0
  20. data/ext/graphqlparser/c/GraphQLAstForEachConcreteType.h +44 -0
  21. data/ext/graphqlparser/c/GraphQLAstNode.cpp +25 -0
  22. data/ext/graphqlparser/c/GraphQLAstNode.h +33 -0
  23. data/ext/graphqlparser/c/GraphQLAstToJSON.cpp +21 -0
  24. data/ext/graphqlparser/c/GraphQLAstToJSON.h +24 -0
  25. data/ext/graphqlparser/c/GraphQLAstVisitor.cpp +55 -0
  26. data/ext/graphqlparser/c/GraphQLAstVisitor.h +53 -0
  27. data/ext/graphqlparser/c/GraphQLParser.cpp +35 -0
  28. data/ext/graphqlparser/c/GraphQLParser.h +54 -0
  29. data/ext/graphqlparser/dump_json_ast.cpp +48 -0
  30. data/ext/graphqlparser/lexer.lpp +324 -0
  31. data/ext/graphqlparser/parser.ypp +693 -0
  32. data/ext/graphqlparser/parsergen/lexer.cpp +2633 -0
  33. data/ext/graphqlparser/parsergen/lexer.h +528 -0
  34. data/ext/graphqlparser/parsergen/location.hh +189 -0
  35. data/ext/graphqlparser/parsergen/parser.tab.cpp +3300 -0
  36. data/ext/graphqlparser/parsergen/parser.tab.hpp +646 -0
  37. data/ext/graphqlparser/parsergen/position.hh +179 -0
  38. data/ext/graphqlparser/parsergen/stack.hh +156 -0
  39. data/ext/graphqlparser/syntaxdefs.h +19 -0
  40. data/ext/libgraphqlparser/AstNode.h +36 -0
  41. data/ext/libgraphqlparser/CMakeLists.txt +148 -0
  42. data/ext/libgraphqlparser/CONTRIBUTING.md +23 -0
  43. data/ext/libgraphqlparser/GraphQLParser.cpp +76 -0
  44. data/ext/libgraphqlparser/GraphQLParser.h +55 -0
  45. data/ext/libgraphqlparser/JsonVisitor.cpp +161 -0
  46. data/ext/libgraphqlparser/JsonVisitor.h +121 -0
  47. data/ext/libgraphqlparser/LICENSE +22 -0
  48. data/ext/libgraphqlparser/README.clang-tidy +7 -0
  49. data/ext/libgraphqlparser/README.md +84 -0
  50. data/ext/libgraphqlparser/ast/ast.ast +203 -0
  51. data/ext/libgraphqlparser/ast/ast.py +61 -0
  52. data/ext/libgraphqlparser/ast/c.py +100 -0
  53. data/ext/libgraphqlparser/ast/c.pyc +0 -0
  54. data/ext/libgraphqlparser/ast/c_impl.py +61 -0
  55. data/ext/libgraphqlparser/ast/c_impl.pyc +0 -0
  56. data/ext/libgraphqlparser/ast/c_visitor_impl.py +39 -0
  57. data/ext/libgraphqlparser/ast/c_visitor_impl.pyc +0 -0
  58. data/ext/libgraphqlparser/ast/casing.py +26 -0
  59. data/ext/libgraphqlparser/ast/casing.pyc +0 -0
  60. data/ext/libgraphqlparser/ast/cxx.py +197 -0
  61. data/ext/libgraphqlparser/ast/cxx.pyc +0 -0
  62. data/ext/libgraphqlparser/ast/cxx_impl.py +61 -0
  63. data/ext/libgraphqlparser/ast/cxx_impl.pyc +0 -0
  64. data/ext/libgraphqlparser/ast/cxx_json_visitor_header.py +42 -0
  65. data/ext/libgraphqlparser/ast/cxx_json_visitor_header.pyc +0 -0
  66. data/ext/libgraphqlparser/ast/cxx_json_visitor_impl.py +80 -0
  67. data/ext/libgraphqlparser/ast/cxx_json_visitor_impl.pyc +0 -0
  68. data/ext/libgraphqlparser/ast/cxx_visitor.py +64 -0
  69. data/ext/libgraphqlparser/ast/cxx_visitor.pyc +0 -0
  70. data/ext/libgraphqlparser/ast/js.py +65 -0
  71. data/ext/libgraphqlparser/ast/license.py +10 -0
  72. data/ext/libgraphqlparser/ast/license.pyc +0 -0
  73. data/ext/libgraphqlparser/c/GraphQLAstNode.cpp +25 -0
  74. data/ext/libgraphqlparser/c/GraphQLAstNode.h +33 -0
  75. data/ext/libgraphqlparser/c/GraphQLAstToJSON.cpp +21 -0
  76. data/ext/libgraphqlparser/c/GraphQLAstToJSON.h +24 -0
  77. data/ext/libgraphqlparser/c/GraphQLAstVisitor.cpp +55 -0
  78. data/ext/libgraphqlparser/c/GraphQLAstVisitor.h +53 -0
  79. data/ext/libgraphqlparser/c/GraphQLParser.cpp +35 -0
  80. data/ext/libgraphqlparser/c/GraphQLParser.h +54 -0
  81. data/ext/libgraphqlparser/clang-tidy-all.sh +3 -0
  82. data/ext/libgraphqlparser/cmake/version.cmake +16 -0
  83. data/ext/libgraphqlparser/dump_json_ast.cpp +48 -0
  84. data/ext/libgraphqlparser/go/README.md +20 -0
  85. data/ext/libgraphqlparser/go/callbacks.go +18 -0
  86. data/ext/libgraphqlparser/go/gotest.go +64 -0
  87. data/ext/libgraphqlparser/lexer.lpp +324 -0
  88. data/ext/libgraphqlparser/libgraphqlparser.pc.in +11 -0
  89. data/ext/libgraphqlparser/parser.ypp +693 -0
  90. data/ext/libgraphqlparser/parsergen/lexer.cpp +2633 -0
  91. data/ext/libgraphqlparser/parsergen/lexer.h +528 -0
  92. data/ext/libgraphqlparser/parsergen/location.hh +189 -0
  93. data/ext/libgraphqlparser/parsergen/parser.tab.cpp +3300 -0
  94. data/ext/libgraphqlparser/parsergen/parser.tab.hpp +646 -0
  95. data/ext/libgraphqlparser/parsergen/position.hh +179 -0
  96. data/ext/libgraphqlparser/parsergen/stack.hh +156 -0
  97. data/ext/libgraphqlparser/python/CMakeLists.txt +14 -0
  98. data/ext/libgraphqlparser/python/README.md +5 -0
  99. data/ext/libgraphqlparser/python/example.py +31 -0
  100. data/ext/libgraphqlparser/syntaxdefs.h +19 -0
  101. data/ext/libgraphqlparser/test/BuildCAPI.c +5 -0
  102. data/ext/libgraphqlparser/test/CMakeLists.txt +25 -0
  103. data/ext/libgraphqlparser/test/JsonVisitorTests.cpp +28 -0
  104. data/ext/libgraphqlparser/test/ParserTests.cpp +352 -0
  105. data/ext/libgraphqlparser/test/kitchen-sink.graphql +59 -0
  106. data/ext/libgraphqlparser/test/kitchen-sink.json +1 -0
  107. data/ext/libgraphqlparser/test/schema-kitchen-sink.graphql +78 -0
  108. data/ext/libgraphqlparser/test/schema-kitchen-sink.json +1 -0
  109. data/ext/libgraphqlparser/test/valgrind.supp +33 -0
  110. data/ext/version.cpp +21 -0
  111. data/lib/generators/graphql/controller_generator.rb +22 -0
  112. data/lib/generators/graphql/schema_generator.rb +22 -0
  113. data/lib/generators/graphql/templates/controller.erb +5 -0
  114. data/lib/generators/graphql/templates/schema.erb +6 -0
  115. data/lib/graphqlparser.so +0 -0
  116. data/lib/rails-graphql.rb +2 -0
  117. data/lib/rails/graphql.rake +1 -0
  118. data/lib/rails/graphql.rb +185 -0
  119. data/lib/rails/graphql/adapters/mysql_adapter.rb +0 -0
  120. data/lib/rails/graphql/adapters/pg_adapter.rb +50 -0
  121. data/lib/rails/graphql/adapters/sqlite_adapter.rb +39 -0
  122. data/lib/rails/graphql/argument.rb +220 -0
  123. data/lib/rails/graphql/callback.rb +124 -0
  124. data/lib/rails/graphql/collectors.rb +14 -0
  125. data/lib/rails/graphql/collectors/hash_collector.rb +83 -0
  126. data/lib/rails/graphql/collectors/idented_collector.rb +73 -0
  127. data/lib/rails/graphql/collectors/json_collector.rb +114 -0
  128. data/lib/rails/graphql/config.rb +61 -0
  129. data/lib/rails/graphql/directive.rb +203 -0
  130. data/lib/rails/graphql/directive/deprecated_directive.rb +59 -0
  131. data/lib/rails/graphql/directive/include_directive.rb +24 -0
  132. data/lib/rails/graphql/directive/skip_directive.rb +24 -0
  133. data/lib/rails/graphql/errors.rb +42 -0
  134. data/lib/rails/graphql/event.rb +141 -0
  135. data/lib/rails/graphql/field.rb +318 -0
  136. data/lib/rails/graphql/field/input_field.rb +92 -0
  137. data/lib/rails/graphql/field/mutation_field.rb +52 -0
  138. data/lib/rails/graphql/field/output_field.rb +96 -0
  139. data/lib/rails/graphql/field/proxied_field.rb +131 -0
  140. data/lib/rails/graphql/field/resolved_field.rb +96 -0
  141. data/lib/rails/graphql/field/scoped_config.rb +22 -0
  142. data/lib/rails/graphql/field/typed_field.rb +104 -0
  143. data/lib/rails/graphql/helpers.rb +40 -0
  144. data/lib/rails/graphql/helpers/attribute_delegator.rb +39 -0
  145. data/lib/rails/graphql/helpers/inherited_collection.rb +152 -0
  146. data/lib/rails/graphql/helpers/leaf_from_ar.rb +141 -0
  147. data/lib/rails/graphql/helpers/registerable.rb +103 -0
  148. data/lib/rails/graphql/helpers/with_arguments.rb +125 -0
  149. data/lib/rails/graphql/helpers/with_assignment.rb +113 -0
  150. data/lib/rails/graphql/helpers/with_callbacks.rb +55 -0
  151. data/lib/rails/graphql/helpers/with_directives.rb +126 -0
  152. data/lib/rails/graphql/helpers/with_events.rb +81 -0
  153. data/lib/rails/graphql/helpers/with_fields.rb +141 -0
  154. data/lib/rails/graphql/helpers/with_namespace.rb +40 -0
  155. data/lib/rails/graphql/helpers/with_owner.rb +35 -0
  156. data/lib/rails/graphql/helpers/with_schema_fields.rb +230 -0
  157. data/lib/rails/graphql/helpers/with_validator.rb +52 -0
  158. data/lib/rails/graphql/introspection.rb +53 -0
  159. data/lib/rails/graphql/native.rb +56 -0
  160. data/lib/rails/graphql/native/functions.rb +38 -0
  161. data/lib/rails/graphql/native/location.rb +41 -0
  162. data/lib/rails/graphql/native/pointers.rb +23 -0
  163. data/lib/rails/graphql/native/visitor.rb +349 -0
  164. data/lib/rails/graphql/railtie.rb +85 -0
  165. data/lib/rails/graphql/railties/base_generator.rb +35 -0
  166. data/lib/rails/graphql/railties/controller.rb +101 -0
  167. data/lib/rails/graphql/railties/controller_runtime.rb +40 -0
  168. data/lib/rails/graphql/railties/log_subscriber.rb +62 -0
  169. data/lib/rails/graphql/request.rb +343 -0
  170. data/lib/rails/graphql/request/arguments.rb +93 -0
  171. data/lib/rails/graphql/request/component.rb +100 -0
  172. data/lib/rails/graphql/request/component/field.rb +225 -0
  173. data/lib/rails/graphql/request/component/fragment.rb +118 -0
  174. data/lib/rails/graphql/request/component/operation.rb +178 -0
  175. data/lib/rails/graphql/request/component/operation/subscription.rb +16 -0
  176. data/lib/rails/graphql/request/component/spread.rb +119 -0
  177. data/lib/rails/graphql/request/component/typename.rb +82 -0
  178. data/lib/rails/graphql/request/context.rb +51 -0
  179. data/lib/rails/graphql/request/errors.rb +54 -0
  180. data/lib/rails/graphql/request/event.rb +112 -0
  181. data/lib/rails/graphql/request/helpers/directives.rb +64 -0
  182. data/lib/rails/graphql/request/helpers/selection_set.rb +87 -0
  183. data/lib/rails/graphql/request/helpers/value_writers.rb +115 -0
  184. data/lib/rails/graphql/request/steps/organizable.rb +146 -0
  185. data/lib/rails/graphql/request/steps/prepareable.rb +33 -0
  186. data/lib/rails/graphql/request/steps/resolveable.rb +32 -0
  187. data/lib/rails/graphql/request/strategy.rb +249 -0
  188. data/lib/rails/graphql/request/strategy/dynamic_instance.rb +41 -0
  189. data/lib/rails/graphql/request/strategy/multi_query_strategy.rb +36 -0
  190. data/lib/rails/graphql/request/strategy/sequenced_strategy.rb +28 -0
  191. data/lib/rails/graphql/schema.rb +272 -0
  192. data/lib/rails/graphql/shortcuts.rb +77 -0
  193. data/lib/rails/graphql/source.rb +371 -0
  194. data/lib/rails/graphql/source/active_record/builders.rb +154 -0
  195. data/lib/rails/graphql/source/active_record_source.rb +231 -0
  196. data/lib/rails/graphql/source/scoped_arguments.rb +87 -0
  197. data/lib/rails/graphql/to_gql.rb +368 -0
  198. data/lib/rails/graphql/type.rb +138 -0
  199. data/lib/rails/graphql/type/enum.rb +206 -0
  200. data/lib/rails/graphql/type/enum/directive_location_enum.rb +30 -0
  201. data/lib/rails/graphql/type/enum/type_kind_enum.rb +57 -0
  202. data/lib/rails/graphql/type/input.rb +134 -0
  203. data/lib/rails/graphql/type/interface.rb +82 -0
  204. data/lib/rails/graphql/type/object.rb +111 -0
  205. data/lib/rails/graphql/type/object/directive_object.rb +34 -0
  206. data/lib/rails/graphql/type/object/enum_value_object.rb +25 -0
  207. data/lib/rails/graphql/type/object/field_object.rb +54 -0
  208. data/lib/rails/graphql/type/object/input_value_object.rb +49 -0
  209. data/lib/rails/graphql/type/object/schema_object.rb +40 -0
  210. data/lib/rails/graphql/type/object/type_object.rb +136 -0
  211. data/lib/rails/graphql/type/scalar.rb +71 -0
  212. data/lib/rails/graphql/type/scalar/bigint_scalar.rb +34 -0
  213. data/lib/rails/graphql/type/scalar/binary_scalar.rb +30 -0
  214. data/lib/rails/graphql/type/scalar/boolean_scalar.rb +37 -0
  215. data/lib/rails/graphql/type/scalar/date_scalar.rb +34 -0
  216. data/lib/rails/graphql/type/scalar/date_time_scalar.rb +32 -0
  217. data/lib/rails/graphql/type/scalar/decimal_scalar.rb +35 -0
  218. data/lib/rails/graphql/type/scalar/float_scalar.rb +32 -0
  219. data/lib/rails/graphql/type/scalar/id_scalar.rb +39 -0
  220. data/lib/rails/graphql/type/scalar/int_scalar.rb +36 -0
  221. data/lib/rails/graphql/type/scalar/string_scalar.rb +28 -0
  222. data/lib/rails/graphql/type/scalar/time_scalar.rb +40 -0
  223. data/lib/rails/graphql/type/union.rb +87 -0
  224. data/lib/rails/graphql/type_map.rb +347 -0
  225. data/lib/rails/graphql/version.rb +7 -0
  226. data/test/assets/introspection-db.json +0 -0
  227. data/test/assets/introspection-mem.txt +1 -0
  228. data/test/assets/introspection.gql +91 -0
  229. data/test/assets/luke.jpg +0 -0
  230. data/test/assets/mem.gql +428 -0
  231. data/test/assets/sqlite.gql +423 -0
  232. data/test/config.rb +80 -0
  233. data/test/graphql/request/context_test.rb +70 -0
  234. data/test/graphql/schema_test.rb +190 -0
  235. data/test/graphql/source_test.rb +237 -0
  236. data/test/graphql/type/enum_test.rb +203 -0
  237. data/test/graphql/type/input_test.rb +138 -0
  238. data/test/graphql/type/interface_test.rb +72 -0
  239. data/test/graphql/type/object_test.rb +104 -0
  240. data/test/graphql/type/scalar/bigint_scalar_test.rb +42 -0
  241. data/test/graphql/type/scalar/binary_scalar_test.rb +17 -0
  242. data/test/graphql/type/scalar/boolean_scalar_test.rb +40 -0
  243. data/test/graphql/type/scalar/date_scalar_test.rb +29 -0
  244. data/test/graphql/type/scalar/date_time_scalar_test.rb +29 -0
  245. data/test/graphql/type/scalar/decimal_scalar_test.rb +28 -0
  246. data/test/graphql/type/scalar/float_scalar_test.rb +22 -0
  247. data/test/graphql/type/scalar/id_scalar_test.rb +26 -0
  248. data/test/graphql/type/scalar/int_scalar_test.rb +26 -0
  249. data/test/graphql/type/scalar/string_scalar_test.rb +17 -0
  250. data/test/graphql/type/scalar/time_scalar_test.rb +36 -0
  251. data/test/graphql/type/scalar_test.rb +45 -0
  252. data/test/graphql/type/union_test.rb +82 -0
  253. data/test/graphql/type_map_test.rb +362 -0
  254. data/test/graphql/type_test.rb +68 -0
  255. data/test/graphql_test.rb +55 -0
  256. data/test/integration/config.rb +56 -0
  257. data/test/integration/memory/star_wars_introspection_test.rb +144 -0
  258. data/test/integration/memory/star_wars_query_test.rb +184 -0
  259. data/test/integration/memory/star_wars_validation_test.rb +99 -0
  260. data/test/integration/schemas/memory.rb +232 -0
  261. data/test/integration/schemas/sqlite.rb +82 -0
  262. data/test/integration/sqlite/star_wars_introspection_test.rb +15 -0
  263. data/test/integration/sqlite/star_wars_mutation_test.rb +82 -0
  264. data/test/integration/sqlite/star_wars_query_test.rb +71 -0
  265. data/test/test_ext.rb +48 -0
  266. metadata +509 -0
@@ -0,0 +1,7 @@
1
+ * readability-implicit-bool is disabled because I disagree with it.
2
+
3
+ * cppcoreguidelines-pro-type-reinterpret-cast is disabled because we use it
4
+ to implement our C API.
5
+
6
+ * cppcoreguidelines-pro-bounds-array-to-pointer-decay is disabled
7
+ because it fires a false positive on every use of assert().
@@ -0,0 +1,84 @@
1
+ # libgraphqlparser
2
+
3
+ libgraphqlparser is a parser for
4
+ [GraphQL](http://graphql.org/), a query language for describing data
5
+ requirements on complex application data models, implemented in C++11.
6
+ It can be used on its own in C++ code (or in C code via the pure C API
7
+ defined in the `c` subdirectory), or you can use it as the basis for an
8
+ extension module for your favorite programming language instead of writing
9
+ your own parser from scratch.
10
+
11
+ ## Example
12
+
13
+ The provided `dump_json_ast` is a simple program that reads GraphQL
14
+ text on stdin and prints a JSON representation of the AST to stdout.
15
+
16
+ The `python` subdirectory contains an example Python binding for the
17
+ pure C API.
18
+
19
+ ## Requirements
20
+
21
+ libgraphqlparser requires a C++ compiler that supports C++11. It
22
+ also requires Mac OS X or Linux.
23
+
24
+ To run tests, first, compile and install the library as described above. Then,
25
+ please download googletest from
26
+ https://github.com/google/googletest/archive/release-1.8.0.zip
27
+ and unzip it in the `test` subdirectory. In consequence, a folder
28
+ `googletest-release-1.8.0` should be contained in `test`. Next, within the
29
+ `test` folder, run `cmake .` and `make` to generate the `runTests` binary.
30
+ To execute the tests run `./test/runTests` from the main folder.
31
+
32
+ ## Building libgraphqlparser
33
+
34
+ libgraphqlparser is built with [CMake](http://www.cmake.org/). If a
35
+ sufficiently-recent version of [Flex](http://flex.sourceforge.net/) and [Bison](http://www.gnu.org/software/bison/) are installed on your
36
+ system, it will use them; otherwise, it will rely on the checked-in
37
+ `parser.tab.{c,h}pp` and `lexer.{h,cpp}`.
38
+
39
+ To build libgraphqlparser from source:
40
+
41
+ ```
42
+ $ # inside the project root:
43
+ $ cmake .
44
+ $ make
45
+ ```
46
+
47
+ Then, to install it on your system:
48
+
49
+ ```
50
+ $ make install
51
+ ```
52
+
53
+ ## How libgraphqlparser works
54
+
55
+ libgraphqlparser uses flex and bison to generate a C++ parser for
56
+ GraphQL. These tools work well but have idiosyncratic interfaces by
57
+ modern standards, so GraphQLParser.h provides a simple interface to
58
+ parse GraphQL.
59
+
60
+ In order to make it simpler to write code based around the GraphQL
61
+ AST, libgraphqlparser includes an extremely simple code generation
62
+ framework in the `ast/` subdirectory. This framework is used to build
63
+ the AST classes themselves, as well as a visitor over the AST. It may
64
+ be easier to understand the output of the generation steps directly
65
+ (i.e., Ast.h, Ast.cpp, and AstVisitor.h) rather than trying to read
66
+ the generation scripts. Simply building libgraphqlparser will cause
67
+ these files to be generated.
68
+
69
+ libgraphqlparser also uses the AST generation framework to build a
70
+ pure C API in the `c` subdirectory. This API can be used from C code,
71
+ and it should also simplify the task of creating bindings to other
72
+ programming languages.
73
+
74
+ ## License
75
+
76
+ libgraphqlparser is MIT-licensed.
77
+
78
+ ## Related Projects
79
+
80
+ - [graphql-parser (Ruby interface)](https://github.com/Shopify/graphql-parser)
81
+ - [py-graphqlparser (Python interface)](https://github.com/elastic-coders/py-graphqlparser)
82
+ - [graphql_parser (Elixir interface)](https://github.com/aarvay/graphql_parser)
83
+ - [graphql-parser-php (PHP interface)](https://github.com/dosten/graphql-parser-php)
84
+ - [graphql-libgraphqlparser (Ruby interface)](https://github.com/rmosolgo/graphql-libgraphqlparser-ruby)
@@ -0,0 +1,203 @@
1
+ # Copyright 2019-present, GraphQL Foundation
2
+
3
+ # Mini-language for AST definition.
4
+ # All AST nodes extend AstNode.
5
+ # All AST nodes are visitible.
6
+ # All AST fields have a getter and a setter and are a constructor argument.
7
+ # We have concrete types (code T) and unions (code U).
8
+ # S for singular field, P for plural, ? for nullable.
9
+ # O for option in a union.
10
+ # Scalar type ontology: string, boolean
11
+
12
+ # Definitions other than OperationDefinition and FragmentDefinition
13
+ # are experimental additions for schema parsing. (We don't support
14
+ # nested unions in the AST mini-language, so I've flattened and elided
15
+ # TypeSystemDefinition and TypeDefinition.)
16
+ U Definition
17
+ O OperationDefinition
18
+ O FragmentDefinition
19
+ O SchemaDefinition
20
+ O ScalarTypeDefinition
21
+ O ObjectTypeDefinition
22
+ O InterfaceTypeDefinition
23
+ O UnionTypeDefinition
24
+ O EnumTypeDefinition
25
+ O InputObjectTypeDefinition
26
+ O TypeExtensionDefinition
27
+ O DirectiveDefinition
28
+
29
+
30
+ T Document
31
+ P Definition definitions
32
+
33
+ T OperationDefinition
34
+ S OperationKind operation
35
+ S? Name name
36
+ P? VariableDefinition variableDefinitions
37
+ P? Directive directives
38
+ S SelectionSet selectionSet
39
+
40
+ T VariableDefinition
41
+ S Variable variable
42
+ S Type type
43
+ S? Value defaultValue
44
+
45
+ T SelectionSet
46
+ P Selection selections
47
+
48
+ U Selection
49
+ O Field
50
+ O FragmentSpread
51
+ O InlineFragment
52
+
53
+ T Field
54
+ S? Name alias
55
+ S Name name
56
+ P? Argument arguments
57
+ P? Directive directives
58
+ S? SelectionSet selectionSet
59
+
60
+ T Argument
61
+ S Name name
62
+ S Value value
63
+
64
+ T FragmentSpread
65
+ S Name name
66
+ P? Directive directives
67
+
68
+ T InlineFragment
69
+ S? NamedType typeCondition
70
+ P? Directive directives
71
+ S SelectionSet selectionSet
72
+
73
+ T FragmentDefinition
74
+ S Name name
75
+ S NamedType typeCondition
76
+ P? Directive directives
77
+ S SelectionSet selectionSet
78
+
79
+ U Value
80
+ O Variable
81
+ O IntValue
82
+ O FloatValue
83
+ O StringValue
84
+ O BooleanValue
85
+ O NullValue
86
+ O EnumValue
87
+ O ListValue
88
+ O ObjectValue
89
+
90
+ T Variable
91
+ S Name name
92
+
93
+ T IntValue
94
+ S string value
95
+
96
+ T FloatValue
97
+ S string value
98
+
99
+ T StringValue
100
+ S string value
101
+
102
+ T BooleanValue
103
+ S boolean value
104
+
105
+ T NullValue
106
+
107
+ T EnumValue
108
+ S string value
109
+
110
+ T ListValue
111
+ P Value values
112
+
113
+ T ObjectValue
114
+ P ObjectField fields
115
+
116
+ T ObjectField
117
+ S Name name
118
+ S Value value
119
+
120
+ T Directive
121
+ S Name name
122
+ P? Argument arguments
123
+
124
+ U Type
125
+ O NamedType
126
+ O ListType
127
+ O NonNullType
128
+
129
+ T NamedType
130
+ S Name name
131
+
132
+ T ListType
133
+ S Type type
134
+
135
+ T NonNullType
136
+ # JS version prohibits nesting nonnull in nonnull, we can't because we
137
+ # can't support multiple unions. Fix?
138
+ S Type type
139
+
140
+ T Name
141
+ S string value
142
+
143
+ T SchemaDefinition
144
+ P? Directive directives
145
+ P OperationTypeDefinition operationTypes
146
+
147
+ T OperationTypeDefinition
148
+ S OperationKind operation
149
+ S NamedType type
150
+
151
+ T ScalarTypeDefinition
152
+ S Name name
153
+ P? Directive directives
154
+
155
+ T ObjectTypeDefinition
156
+ S Name name
157
+ P? NamedType interfaces
158
+ P? Directive directives
159
+ P FieldDefinition fields
160
+
161
+ T FieldDefinition
162
+ S Name name
163
+ P? InputValueDefinition arguments
164
+ S Type type
165
+ P? Directive directives
166
+
167
+ T InputValueDefinition
168
+ S Name name
169
+ S Type type
170
+ S? Value defaultValue
171
+ P? Directive directives
172
+
173
+ T InterfaceTypeDefinition
174
+ S Name name
175
+ P? Directive directives
176
+ P FieldDefinition fields
177
+
178
+ T UnionTypeDefinition
179
+ S Name name
180
+ P? Directive directives
181
+ P NamedType types
182
+
183
+ T EnumTypeDefinition
184
+ S Name name
185
+ P? Directive directives
186
+ P EnumValueDefinition values
187
+
188
+ T EnumValueDefinition
189
+ S Name name
190
+ P? Directive directives
191
+
192
+ T InputObjectTypeDefinition
193
+ S Name name
194
+ P? Directive directives
195
+ P InputValueDefinition fields
196
+
197
+ T TypeExtensionDefinition
198
+ S ObjectTypeDefinition definition
199
+
200
+ T DirectiveDefinition
201
+ S Name name
202
+ P? InputValueDefinition arguments
203
+ P Name locations
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env python
2
+ # Copyright 2019-present, GraphQL Foundation
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 importlib import import_module
8
+
9
+ def load_lang(lang):
10
+ return import_module(lang).Printer()
11
+
12
+
13
+ def print_ast(lang_module, input_file):
14
+ lang_module.start_file()
15
+ line = input_file.readline()
16
+ while line:
17
+ line = line.strip()
18
+ if line.startswith('#') or not line:
19
+ line = input_file.readline()
20
+ continue
21
+
22
+ code, rest = line.split(None, 1)
23
+ if code[0] == 'T':
24
+ lang_module.start_type(rest)
25
+ field_line = input_file.readline().strip()
26
+ while field_line:
27
+ if field_line.startswith('#'):
28
+ field_line = input_file.readline().strip()
29
+ continue
30
+ field_kind, field_type, field_name = field_line.split()
31
+ nullable = len(field_kind) > 1 and field_kind[1] == '?'
32
+ if field_kind[0] == 'S':
33
+ plural = False
34
+ elif field_kind[0] == 'P':
35
+ plural = True
36
+ else:
37
+ raise Error('Unknown field kind: ' + field_kind)
38
+ lang_module.field(field_type, field_name, nullable, plural)
39
+ field_line = input_file.readline().strip()
40
+ lang_module.end_type(rest)
41
+ elif code[0] == 'U':
42
+ lang_module.start_union(rest)
43
+ field_line = input_file.readline().strip()
44
+ while field_line:
45
+ option_code, option_type = field_line.split()
46
+ if option_code != 'O':
47
+ raise Error('Unknown code in union: ' + option_code)
48
+ lang_module.union_option(option_type)
49
+ field_line = input_file.readline().strip()
50
+ lang_module.end_union(rest)
51
+ line = input_file.readline()
52
+
53
+ lang_module.end_file()
54
+ if __name__ == '__main__':
55
+ import sys
56
+ lang = sys.argv[1]
57
+ filename = sys.argv[2]
58
+
59
+ lang_module = load_lang(lang)
60
+
61
+ print_ast(lang_module, open(filename, 'r'))
@@ -0,0 +1,100 @@
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