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,161 +0,0 @@
1
- /**
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
-
8
- #include "position.hh"
9
- #include "JsonVisitor.h"
10
-
11
- #include <cassert>
12
- #include <iterator>
13
-
14
- namespace facebook {
15
- namespace graphql {
16
- namespace ast {
17
- namespace visitor {
18
-
19
- static std::string escape(const char *s) {
20
- static char hex[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
21
- std::string result;
22
- while (unsigned char ch = *s++) {
23
- if (ch >= '\0' && ch <= '\x1f') {
24
- result.push_back('\\');
25
- result.push_back('u');
26
- result.push_back('0');
27
- result.push_back('0');
28
- result.push_back(ch >= 16 ? '1' : '0');
29
- result.push_back(hex[ch % 16]);
30
- } else if (ch == '"') {
31
- result.push_back('\\');
32
- result.push_back('"');
33
- } else if (ch == '\\') {
34
- result.push_back('\\');
35
- result.push_back('\\');
36
- } else {
37
- result.push_back(ch);
38
- }
39
- }
40
- return result;
41
- }
42
-
43
- JsonVisitor::NodeFieldPrinter::NodeFieldPrinter(
44
- JsonVisitor &visitor,
45
- const char *nodeKind,
46
- const Node &node)
47
- : visitor_(visitor)
48
- {
49
- if (!visitor_.printed_.empty()) {
50
- nextChild_ = visitor_.printed_.back().begin();
51
- }
52
- // NOTE: If you're an Emacs user and this file's use of C++11 raw
53
- // strings doesn't highlight correctly in c++-mode, try upgrading to
54
- // Emacs 26 if you can.
55
- out_ << R"({"kind":")" << nodeKind << R"(","loc":)";
56
- printLocation(out_, node.getLocation());
57
- }
58
-
59
- std::string JsonVisitor::NodeFieldPrinter::finishPrinting() {
60
- assert(!out_.str().empty());
61
- out_ << '}';
62
- auto result(out_.str());
63
- #ifndef NDEBUG
64
- out_.str("");
65
- #endif
66
- return result;
67
-
68
- }
69
-
70
- void JsonVisitor::NodeFieldPrinter::printFieldSeparator()
71
- {
72
- out_ << ',';
73
- }
74
-
75
- void JsonVisitor::NodeFieldPrinter::printSingularPrimitiveField(
76
- const char *fieldName,
77
- const char *value) {
78
- printFieldSeparator();
79
- out_ << '"' << fieldName << R"(":)";
80
- out_ << '"' << escape(value) << '"';
81
- }
82
-
83
- void JsonVisitor::NodeFieldPrinter::printSingularBooleanField(
84
- const char *fieldName,
85
- bool value) {
86
- printFieldSeparator();
87
- out_ << '"' << fieldName << R"(":)";
88
- out_ << (value ? "true" : "false");
89
- }
90
-
91
- void JsonVisitor::NodeFieldPrinter::printSingularObjectField(const char *fieldName) {
92
- printFieldSeparator();
93
- out_ << '"' << fieldName << R"(":)";
94
- assert(!visitor_.printed_.empty());
95
- out_ << *nextChild_++;
96
- }
97
-
98
- void JsonVisitor::NodeFieldPrinter::printNullableSingularObjectField(
99
- const char *fieldName,
100
- const void *value) {
101
- printFieldSeparator();
102
- out_ << '"' << fieldName << R"(":)";
103
- if (value != nullptr) {
104
- assert(!visitor_.printed_.empty());
105
- out_ << *nextChild_++;
106
- } else {
107
- out_ << "null";
108
- }
109
- }
110
-
111
- // Method invariant: printed_ contains strings for this node's children.
112
- void JsonVisitor::NodeFieldPrinter::printLocation(
113
- std::ostringstream &out,
114
- const yy::location &location)
115
- {
116
- out << R"({"start": {"line": )" << location.begin.line
117
- << R"(,"column":)" << location.begin.column
118
- << R"(}, "end": {"line":)" << location.end.line
119
- << R"(,"column":)" << location.end.column
120
- << "}}";
121
- }
122
-
123
- void JsonVisitor::NodeFieldPrinter::printChildList(
124
- std::ostringstream &out,
125
- const std::vector<std::string>::const_iterator &childIterator,
126
- size_t numChildren) {
127
- out << '[';
128
- for (size_t ii = 0; ii < numChildren; ++ii) {
129
- if (ii != 0) {
130
- out << ',';
131
- }
132
- out << *(childIterator + ii);
133
- }
134
- out << ']';
135
- }
136
-
137
- JsonVisitor::JsonVisitor() {
138
- printed_.emplace_back();
139
- }
140
-
141
- void JsonVisitor::visitNode() {
142
- printed_.emplace_back();
143
- }
144
-
145
- void JsonVisitor::endVisitNode(std::string &&str) {
146
- printed_.pop_back();
147
- printed_.back().emplace_back(std::move(str));
148
- }
149
-
150
- std::string JsonVisitor::getResult() const {
151
- assert(printed_.size() == 1);
152
- assert(printed_[0].size() == 1);
153
- return printed_[0][0];
154
- }
155
-
156
- #include "JsonVisitor.cpp.inc"
157
-
158
- } // namespace visitor
159
- } // namespace ast
160
- } // namespace graphql
161
- } // namespace facebook
@@ -1,121 +0,0 @@
1
- /**
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
-
8
- #pragma once
9
-
10
- #include "AstNode.h"
11
- #include "AstVisitor.h"
12
-
13
- #include <sstream>
14
- #include <vector>
15
-
16
- namespace facebook {
17
- namespace graphql {
18
- namespace ast {
19
- namespace visitor {
20
-
21
- /**
22
- * Produces a JSON string describing the visited AST, in a format that
23
- * would be a valid graphql-js AST when parsed.
24
- */
25
- class JsonVisitor : public AstVisitor {
26
- private:
27
- using ChildrenList = std::vector<std::string>;
28
- // Stack of lists of printed children.
29
- // Postvisit method precondition: printed.back() contains strings
30
- // for this node's children.
31
- // Postvisit method postcondition: *(printed.rbegin() - 1) has had this
32
- std::vector<ChildrenList> printed_;
33
-
34
- // Interface to print fields for each kind of node.
35
- // Note that, because of the post-order traversal for printing,
36
- // field values need not be passed explicitly; they are grabbed from
37
- // the passed-in visitor!
38
- class NodeFieldPrinter {
39
- private:
40
- JsonVisitor &visitor_;
41
- ChildrenList::const_iterator nextChild_;
42
- std::ostringstream out_;
43
-
44
- void printFieldSeparator();
45
-
46
- // Prints a non-null array of n children from the given
47
- // iterator. Does not update the iterator.
48
- void printChildList(
49
- std::ostringstream &out,
50
- const std::vector<std::string>::const_iterator &childIterator,
51
- size_t numChildren);
52
-
53
- void printLocation(std::ostringstream &out, const yy::location &location);
54
-
55
- public:
56
- // Begin printing the fields for a node of the given kind at the
57
- // given location.
58
- NodeFieldPrinter(
59
- JsonVisitor &visitor,
60
- const char *nodeKind,
61
- const Node &node);
62
-
63
- std::string finishPrinting();
64
-
65
- void printSingularPrimitiveField(const char *fieldName, const char *value);
66
- void printSingularBooleanField(const char *fieldName, bool value);
67
- void printSingularObjectField(const char *fieldName);
68
- void printNullableSingularObjectField(const char *fieldName, const void *value);
69
-
70
- template <typename T>
71
- void printPluralField(
72
- const char *fieldName,
73
- const std::vector<std::unique_ptr<T>> &value) {
74
- printFieldSeparator();
75
- out_ << '"' << fieldName << "\":";
76
- printChildList(out_, nextChild_, value.size());
77
- nextChild_ += value.size();
78
- }
79
-
80
- template <typename T>
81
- void printNullablePluralField(
82
- const char *fieldName,
83
- const std::vector<std::unique_ptr<T>> *value) {
84
- printFieldSeparator();
85
- out_ << '"' << fieldName << "\":";
86
- if (value == nullptr) {
87
- out_ << "null";
88
- } else {
89
- printChildList(out_, nextChild_, value->size());
90
- nextChild_ += value->size();
91
- }
92
- }
93
- };
94
-
95
- // Must be called at the start of all visit methods for node types
96
- // that have children. Maintains printed_.
97
- void visitNode();
98
-
99
- // Must be called at the end of all visit methods for node types
100
- // that have children, passing the text for this node. Maintains
101
- // printed_.
102
- void endVisitNode(std::string &&str);
103
-
104
- // Prints one of the many FooValue types that is prepresented with a
105
- // single string.
106
- template <typename ValueNode>
107
- void endVisitValueRepresentedAsString(const char *valueKind, const ValueNode &value);
108
-
109
- public:
110
- JsonVisitor();
111
- ~JsonVisitor() {}
112
-
113
- std::string getResult() const;
114
-
115
- #include "JsonVisitor.h.inc"
116
- };
117
-
118
- }
119
- }
120
- }
121
- }
@@ -1,22 +0,0 @@
1
- MIT License
2
-
3
- Copyright 2015-2018, Facebook, Inc.
4
- Copyright 2019-present, GraphQL Foundation
5
-
6
- Permission is hereby granted, free of charge, to any person obtaining a copy
7
- of this software and associated documentation files (the "Software"), to deal
8
- in the Software without restriction, including without limitation the rights
9
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
- copies of the Software, and to permit persons to whom the Software is
11
- furnished to do so, subject to the following conditions:
12
-
13
- The above copyright notice and this permission notice shall be included in all
14
- copies or substantial portions of the Software.
15
-
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
- SOFTWARE.
@@ -1,7 +0,0 @@
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().
@@ -1,84 +0,0 @@
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)
@@ -1,203 +0,0 @@
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
@@ -1,61 +0,0 @@
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'))