From 4ab2f20b8ff800be2638cb373371b8a37249695a Mon Sep 17 00:00:00 2001 From: theduke Date: Sat, 24 Jun 2017 13:21:11 +0200 Subject: [PATCH 01/14] Restructure repository to Cargo workspace. This makes it possible to: * extract parser to own crate * add juniper_codegen crate for custom derive stuff * add integration tests --- .travis.yml | 12 +- Cargo.toml | 61 +-------- juniper/Cargo.toml | 57 ++++++++ juniper/appveyor.yml | 64 +++++++++ juniper/benches/bench.rs | 127 ++++++++++++++++++ {src => juniper/src}/ast.rs | 0 {src => juniper/src}/executor.rs | 0 .../src}/executor_tests/directives.rs | 0 {src => juniper/src}/executor_tests/enums.rs | 0 .../src}/executor_tests/executor.rs | 0 .../src}/executor_tests/interfaces_unions.rs | 0 .../src}/executor_tests/introspection.rs | 0 {src => juniper/src}/executor_tests/mod.rs | 0 .../src}/executor_tests/variables.rs | 0 {src => juniper/src}/graphiql.rs | 0 {src => juniper/src}/http.rs | 0 .../src}/integrations/iron_handlers.rs | 0 {src => juniper/src}/integrations/mod.rs | 0 .../src}/integrations/rocket_handlers.rs | 0 {src => juniper/src}/integrations/serde.rs | 0 {src => juniper/src}/lib.rs | 0 {src => juniper/src}/macros/args.rs | 0 {src => juniper/src}/macros/enums.rs | 0 {src => juniper/src}/macros/field.rs | 0 {src => juniper/src}/macros/input_object.rs | 0 {src => juniper/src}/macros/interface.rs | 0 {src => juniper/src}/macros/mod.rs | 0 {src => juniper/src}/macros/object.rs | 0 {src => juniper/src}/macros/scalar.rs | 0 {src => juniper/src}/macros/tests/args.rs | 0 {src => juniper/src}/macros/tests/enums.rs | 0 {src => juniper/src}/macros/tests/field.rs | 0 .../src}/macros/tests/input_object.rs | 0 .../src}/macros/tests/interface.rs | 0 {src => juniper/src}/macros/tests/mod.rs | 0 {src => juniper/src}/macros/tests/object.rs | 0 {src => juniper/src}/macros/tests/scalar.rs | 0 {src => juniper/src}/macros/tests/union.rs | 0 {src => juniper/src}/macros/union.rs | 0 {src => juniper/src}/parser/document.rs | 0 {src => juniper/src}/parser/lexer.rs | 0 {src => juniper/src}/parser/mod.rs | 0 {src => juniper/src}/parser/parser.rs | 0 {src => juniper/src}/parser/tests/document.rs | 0 {src => juniper/src}/parser/tests/lexer.rs | 0 {src => juniper/src}/parser/tests/mod.rs | 0 {src => juniper/src}/parser/tests/value.rs | 0 {src => juniper/src}/parser/utils.rs | 0 {src => juniper/src}/parser/value.rs | 0 {src => juniper/src}/result_ext.rs | 0 {src => juniper/src}/schema/meta.rs | 0 {src => juniper/src}/schema/mod.rs | 0 {src => juniper/src}/schema/model.rs | 0 {src => juniper/src}/schema/schema.rs | 0 .../src}/tests/introspection_tests.rs | 0 {src => juniper/src}/tests/mod.rs | 0 {src => juniper/src}/tests/model.rs | 0 {src => juniper/src}/tests/query_tests.rs | 0 {src => juniper/src}/tests/schema.rs | 0 {src => juniper/src}/types/base.rs | 0 {src => juniper/src}/types/containers.rs | 0 {src => juniper/src}/types/mod.rs | 0 {src => juniper/src}/types/pointers.rs | 0 {src => juniper/src}/types/scalars.rs | 0 {src => juniper/src}/types/utilities.rs | 0 {src => juniper/src}/validation/context.rs | 0 .../src}/validation/input_value.rs | 0 {src => juniper/src}/validation/mod.rs | 0 .../src}/validation/multi_visitor.rs | 0 .../rules/arguments_of_correct_type.rs | 0 .../rules/default_values_of_correct_type.rs | 0 .../rules/fields_on_correct_type.rs | 0 .../rules/fragments_on_composite_types.rs | 0 .../validation/rules/known_argument_names.rs | 0 .../src}/validation/rules/known_directives.rs | 0 .../validation/rules/known_fragment_names.rs | 0 .../src}/validation/rules/known_type_names.rs | 0 .../rules/lone_anonymous_operation.rs | 0 {src => juniper/src}/validation/rules/mod.rs | 0 .../validation/rules/no_fragment_cycles.rs | 0 .../rules/no_undefined_variables.rs | 0 .../validation/rules/no_unused_fragments.rs | 0 .../validation/rules/no_unused_variables.rs | 0 .../rules/overlapping_fields_can_be_merged.rs | 0 .../rules/possible_fragment_spreads.rs | 0 .../rules/provided_non_null_arguments.rs | 0 .../src}/validation/rules/scalar_leafs.rs | 0 .../validation/rules/unique_argument_names.rs | 0 .../validation/rules/unique_fragment_names.rs | 0 .../rules/unique_input_field_names.rs | 0 .../rules/unique_operation_names.rs | 0 .../validation/rules/unique_variable_names.rs | 0 .../rules/variables_are_input_types.rs | 0 .../rules/variables_in_allowed_position.rs | 0 .../src}/validation/test_harness.rs | 0 {src => juniper/src}/validation/traits.rs | 0 {src => juniper/src}/validation/visitor.rs | 0 {src => juniper/src}/value.rs | 0 98 files changed, 258 insertions(+), 63 deletions(-) create mode 100644 juniper/Cargo.toml create mode 100644 juniper/appveyor.yml create mode 100644 juniper/benches/bench.rs rename {src => juniper/src}/ast.rs (100%) rename {src => juniper/src}/executor.rs (100%) rename {src => juniper/src}/executor_tests/directives.rs (100%) rename {src => juniper/src}/executor_tests/enums.rs (100%) rename {src => juniper/src}/executor_tests/executor.rs (100%) rename {src => juniper/src}/executor_tests/interfaces_unions.rs (100%) rename {src => juniper/src}/executor_tests/introspection.rs (100%) rename {src => juniper/src}/executor_tests/mod.rs (100%) rename {src => juniper/src}/executor_tests/variables.rs (100%) rename {src => juniper/src}/graphiql.rs (100%) rename {src => juniper/src}/http.rs (100%) rename {src => juniper/src}/integrations/iron_handlers.rs (100%) rename {src => juniper/src}/integrations/mod.rs (100%) rename {src => juniper/src}/integrations/rocket_handlers.rs (100%) rename {src => juniper/src}/integrations/serde.rs (100%) rename {src => juniper/src}/lib.rs (100%) rename {src => juniper/src}/macros/args.rs (100%) rename {src => juniper/src}/macros/enums.rs (100%) rename {src => juniper/src}/macros/field.rs (100%) rename {src => juniper/src}/macros/input_object.rs (100%) rename {src => juniper/src}/macros/interface.rs (100%) rename {src => juniper/src}/macros/mod.rs (100%) rename {src => juniper/src}/macros/object.rs (100%) rename {src => juniper/src}/macros/scalar.rs (100%) rename {src => juniper/src}/macros/tests/args.rs (100%) rename {src => juniper/src}/macros/tests/enums.rs (100%) rename {src => juniper/src}/macros/tests/field.rs (100%) rename {src => juniper/src}/macros/tests/input_object.rs (100%) rename {src => juniper/src}/macros/tests/interface.rs (100%) rename {src => juniper/src}/macros/tests/mod.rs (100%) rename {src => juniper/src}/macros/tests/object.rs (100%) rename {src => juniper/src}/macros/tests/scalar.rs (100%) rename {src => juniper/src}/macros/tests/union.rs (100%) rename {src => juniper/src}/macros/union.rs (100%) rename {src => juniper/src}/parser/document.rs (100%) rename {src => juniper/src}/parser/lexer.rs (100%) rename {src => juniper/src}/parser/mod.rs (100%) rename {src => juniper/src}/parser/parser.rs (100%) rename {src => juniper/src}/parser/tests/document.rs (100%) rename {src => juniper/src}/parser/tests/lexer.rs (100%) rename {src => juniper/src}/parser/tests/mod.rs (100%) rename {src => juniper/src}/parser/tests/value.rs (100%) rename {src => juniper/src}/parser/utils.rs (100%) rename {src => juniper/src}/parser/value.rs (100%) rename {src => juniper/src}/result_ext.rs (100%) rename {src => juniper/src}/schema/meta.rs (100%) rename {src => juniper/src}/schema/mod.rs (100%) rename {src => juniper/src}/schema/model.rs (100%) rename {src => juniper/src}/schema/schema.rs (100%) rename {src => juniper/src}/tests/introspection_tests.rs (100%) rename {src => juniper/src}/tests/mod.rs (100%) rename {src => juniper/src}/tests/model.rs (100%) rename {src => juniper/src}/tests/query_tests.rs (100%) rename {src => juniper/src}/tests/schema.rs (100%) rename {src => juniper/src}/types/base.rs (100%) rename {src => juniper/src}/types/containers.rs (100%) rename {src => juniper/src}/types/mod.rs (100%) rename {src => juniper/src}/types/pointers.rs (100%) rename {src => juniper/src}/types/scalars.rs (100%) rename {src => juniper/src}/types/utilities.rs (100%) rename {src => juniper/src}/validation/context.rs (100%) rename {src => juniper/src}/validation/input_value.rs (100%) rename {src => juniper/src}/validation/mod.rs (100%) rename {src => juniper/src}/validation/multi_visitor.rs (100%) rename {src => juniper/src}/validation/rules/arguments_of_correct_type.rs (100%) rename {src => juniper/src}/validation/rules/default_values_of_correct_type.rs (100%) rename {src => juniper/src}/validation/rules/fields_on_correct_type.rs (100%) rename {src => juniper/src}/validation/rules/fragments_on_composite_types.rs (100%) rename {src => juniper/src}/validation/rules/known_argument_names.rs (100%) rename {src => juniper/src}/validation/rules/known_directives.rs (100%) rename {src => juniper/src}/validation/rules/known_fragment_names.rs (100%) rename {src => juniper/src}/validation/rules/known_type_names.rs (100%) rename {src => juniper/src}/validation/rules/lone_anonymous_operation.rs (100%) rename {src => juniper/src}/validation/rules/mod.rs (100%) rename {src => juniper/src}/validation/rules/no_fragment_cycles.rs (100%) rename {src => juniper/src}/validation/rules/no_undefined_variables.rs (100%) rename {src => juniper/src}/validation/rules/no_unused_fragments.rs (100%) rename {src => juniper/src}/validation/rules/no_unused_variables.rs (100%) rename {src => juniper/src}/validation/rules/overlapping_fields_can_be_merged.rs (100%) rename {src => juniper/src}/validation/rules/possible_fragment_spreads.rs (100%) rename {src => juniper/src}/validation/rules/provided_non_null_arguments.rs (100%) rename {src => juniper/src}/validation/rules/scalar_leafs.rs (100%) rename {src => juniper/src}/validation/rules/unique_argument_names.rs (100%) rename {src => juniper/src}/validation/rules/unique_fragment_names.rs (100%) rename {src => juniper/src}/validation/rules/unique_input_field_names.rs (100%) rename {src => juniper/src}/validation/rules/unique_operation_names.rs (100%) rename {src => juniper/src}/validation/rules/unique_variable_names.rs (100%) rename {src => juniper/src}/validation/rules/variables_are_input_types.rs (100%) rename {src => juniper/src}/validation/rules/variables_in_allowed_position.rs (100%) rename {src => juniper/src}/validation/test_harness.rs (100%) rename {src => juniper/src}/validation/traits.rs (100%) rename {src => juniper/src}/validation/visitor.rs (100%) rename {src => juniper/src}/value.rs (100%) diff --git a/.travis.yml b/.travis.yml index 27c10a8e..eb5f294b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,18 +20,18 @@ env: script: # Build library standalone, with Iron, and with Rocket integrations enabled, respectively - - cargo build --verbose - - cargo build --verbose --features iron-handlers + - cargo build --all --verbose + - cargo build --all --verbose --features iron-handlers - | if [ "$TRAVIS_RUST_VERSION" = "nightly" ]; then - cargo build --verbose --features rocket-handlers + cargo build --all --verbose --features rocket-handlers fi # Build example binaries; first Iron, then Rocket examples - - cargo build --verbose --example server --features "iron-handlers expose-test-schema" + - cargo build --all --verbose --example server --features "iron-handlers expose-test-schema" - | if [ "TRAVIS_RUST_VERSION" = "nightly" ]; then - cargo build --verbose --example rocket-server --features "rocket-handlers expose-test-schema" + cargo build --all --verbose --example rocket-server --features "rocket-handlers expose-test-schema" fi # Run all tests for the base library and available integrations @@ -41,7 +41,7 @@ script: export TEST_FEATURES="$TEST_FEATURES rocket-handlers rocket/testing" fi - - cargo test --verbose --features "$TEST_FEATURES" + - cargo test --all --verbose --features "$TEST_FEATURES" before_deploy: diff --git a/Cargo.toml b/Cargo.toml index a9565cd2..39214423 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,57 +1,4 @@ -[package] -name = "juniper" -version = "0.8.1" -authors = ["Magnus Hallin "] -description = "GraphQL server library" -license = "BSD-2-Clause" -documentation = "https://docs.rs/juniper/0.8.1/juniper/" -repository = "https://github.com/mhallin/juniper" -readme = "README.md" -keywords = ["graphql", "server", "iron", "web", "rocket"] -categories = ["web-programming"] - -[package.metadata.docs.rs] -features = [ "iron-handlers" ] - -[badges] -travis-ci = { repository = "mhallin/juniper" } -appveyor = { repository = "mhallin/juniper" } - -[[bench]] -name = "bench" -harness = false -path = "benches/bench.rs" - -[[example]] -name = "server" -required-features = ["iron-handlers", "expose-test-schema"] - -[[example]] -name = "rocket-server" -required-features = ["rocket-handlers", "expose-test-schema"] - -[features] -nightly = [] -iron-handlers = ["iron", "serde_json", "urlencoded"] -rocket-handlers = ["rocket", "rocket_codegen", "serde_json"] -expose-test-schema = [] - -[dependencies] -serde = { version = "^1.0.8" } -serde_derive = {version="^1.0.8" } - -serde_json = { version = "^1.0.2", optional = true } - -iron = { version = "^0.5.1", optional = true } -urlencoded = { version = "^0.5.0", optional = true } - -rocket = { version = "^0.2.8", optional = true } -rocket_codegen = { version = "^0.2.8", optional = true } - -[dev-dependencies] -iron = "^0.5.1" -router = "^0.5.0" -mount = "^0.3.0" -logger = "^0.3.0" -iron-test = "^0.5.0" -bencher = "^0.1.2" +[workspace] +members = [ + "juniper" +] diff --git a/juniper/Cargo.toml b/juniper/Cargo.toml new file mode 100644 index 00000000..a9565cd2 --- /dev/null +++ b/juniper/Cargo.toml @@ -0,0 +1,57 @@ +[package] +name = "juniper" +version = "0.8.1" +authors = ["Magnus Hallin "] +description = "GraphQL server library" +license = "BSD-2-Clause" +documentation = "https://docs.rs/juniper/0.8.1/juniper/" +repository = "https://github.com/mhallin/juniper" +readme = "README.md" +keywords = ["graphql", "server", "iron", "web", "rocket"] +categories = ["web-programming"] + +[package.metadata.docs.rs] +features = [ "iron-handlers" ] + +[badges] +travis-ci = { repository = "mhallin/juniper" } +appveyor = { repository = "mhallin/juniper" } + +[[bench]] +name = "bench" +harness = false +path = "benches/bench.rs" + +[[example]] +name = "server" +required-features = ["iron-handlers", "expose-test-schema"] + +[[example]] +name = "rocket-server" +required-features = ["rocket-handlers", "expose-test-schema"] + +[features] +nightly = [] +iron-handlers = ["iron", "serde_json", "urlencoded"] +rocket-handlers = ["rocket", "rocket_codegen", "serde_json"] +expose-test-schema = [] + +[dependencies] +serde = { version = "^1.0.8" } +serde_derive = {version="^1.0.8" } + +serde_json = { version = "^1.0.2", optional = true } + +iron = { version = "^0.5.1", optional = true } +urlencoded = { version = "^0.5.0", optional = true } + +rocket = { version = "^0.2.8", optional = true } +rocket_codegen = { version = "^0.2.8", optional = true } + +[dev-dependencies] +iron = "^0.5.1" +router = "^0.5.0" +mount = "^0.3.0" +logger = "^0.3.0" +iron-test = "^0.5.0" +bencher = "^0.1.2" diff --git a/juniper/appveyor.yml b/juniper/appveyor.yml new file mode 100644 index 00000000..768a0355 --- /dev/null +++ b/juniper/appveyor.yml @@ -0,0 +1,64 @@ +# Build and test on stable, beta, and nightly on Windows. +# +# Copied general structure from https://github.com/japaric/rust-everywhere/blob/master/appveyor.yml + +environment: + matrix: + # Stable channel + - TARGET: i686-pc-windows-gnu + CHANNEL: stable + - TARGET: i686-pc-windows-msvc + CHANNEL: stable + - TARGET: x86_64-pc-windows-gnu + CHANNEL: stable + - TARGET: x86_64-pc-windows-msvc + CHANNEL: stable + # Beta channel + - TARGET: i686-pc-windows-gnu + CHANNEL: beta + - TARGET: i686-pc-windows-msvc + CHANNEL: beta + - TARGET: x86_64-pc-windows-gnu + CHANNEL: beta + - TARGET: x86_64-pc-windows-msvc + CHANNEL: beta + # Nightly channel + - TARGET: i686-pc-windows-gnu + CHANNEL: nightly + - TARGET: i686-pc-windows-msvc + CHANNEL: nightly + - TARGET: x86_64-pc-windows-gnu + CHANNEL: nightly + - TARGET: x86_64-pc-windows-msvc + CHANNEL: nightly + +# Install Rust and Cargo +# (Based on from https://github.com/rust-lang/libc/blob/master/appveyor.yml) +install: + - curl -sSf -o rustup-init.exe https://win.rustup.rs + - rustup-init.exe --default-host %TARGET% --default-toolchain %CHANNEL% -y + - set PATH=%PATH%;C:\Users\appveyor\.cargo\bin + - rustc -Vv + - cargo -V + + +# 'cargo test' takes care of building for us, so disable Appveyor's build stage. This prevents +# the "directory does not contain a project or solution file" error. +# source: https://github.com/starkat99/appveyor-rust/blob/master/appveyor.yml#L113 +build: false + +test_script: + # Build library standalone, with Iron, and with Rocket integrations enabled, respectively + - cargo build --verbose + - cargo build --verbose --features iron-handlers + - IF "%CHANNEL%"=="nightly" (cargo build --verbose --features rocket-handlers) + + # Build example binaries; first Iron, then Rocket examples + - cargo build --verbose --example server --features "iron-handlers expose-test-schema" + - IF "%CHANNEL%"=="nightly" (cargo build --verbose --example rocket-server --features "rocket-handlers expose-test-schema") + + # Run all tests for the base library and available integrations + - set TEST_FEATURES=iron-handlers expose-test-schema + - IF "%CHANNEL%"=="nightly" (set TEST_FEATURES=%TEST_FEATURES% rocket-handlers rocket/testing) + + - cargo test --verbose --features "%TEST_FEATURES%" diff --git a/juniper/benches/bench.rs b/juniper/benches/bench.rs new file mode 100644 index 00000000..5d707527 --- /dev/null +++ b/juniper/benches/bench.rs @@ -0,0 +1,127 @@ +#[macro_use] extern crate bencher; +extern crate juniper; + +use bencher::Bencher; + +use juniper::{execute, RootNode, EmptyMutation, Variables}; +use juniper::tests::model::Database; + +fn query_type_name(b: &mut Bencher) { + let database = Database::new(); + let schema = RootNode::new(&database, EmptyMutation::::new()); + + let doc = r#" + query IntrospectionQueryTypeQuery { + __schema { + queryType { + name + } + } + }"#; + + b.iter(|| execute(doc, None, &schema, &Variables::new(), &database)); +} + +fn introspection_query(b: &mut Bencher) { + let database = Database::new(); + let schema = RootNode::new(&database, EmptyMutation::::new()); + + let doc = r#" + query IntrospectionQuery { + __schema { + queryType { name } + mutationType { name } + subscriptionType { name } + types { + ...FullType + } + directives { + name + description + locations + args { + ...InputValue + } + } + } + } + + fragment FullType on __Type { + kind + name + description + fields(includeDeprecated: true) { + name + description + args { + ...InputValue + } + type { + ...TypeRef + } + isDeprecated + deprecationReason + } + inputFields { + ...InputValue + } + interfaces { + ...TypeRef + } + enumValues(includeDeprecated: true) { + name + description + isDeprecated + deprecationReason + } + possibleTypes { + ...TypeRef + } + } + + fragment InputValue on __InputValue { + name + description + type { ...TypeRef } + defaultValue + } + + fragment TypeRef on __Type { + kind + name + ofType { + kind + name + ofType { + kind + name + ofType { + kind + name + ofType { + kind + name + ofType { + kind + name + ofType { + kind + name + ofType { + kind + name + } + } + } + } + } + } + } + } +"#; + + b.iter(|| execute(doc, None, &schema, &Variables::new(), &database)); +} + +benchmark_group!(queries, query_type_name, introspection_query); +benchmark_main!(queries); diff --git a/src/ast.rs b/juniper/src/ast.rs similarity index 100% rename from src/ast.rs rename to juniper/src/ast.rs diff --git a/src/executor.rs b/juniper/src/executor.rs similarity index 100% rename from src/executor.rs rename to juniper/src/executor.rs diff --git a/src/executor_tests/directives.rs b/juniper/src/executor_tests/directives.rs similarity index 100% rename from src/executor_tests/directives.rs rename to juniper/src/executor_tests/directives.rs diff --git a/src/executor_tests/enums.rs b/juniper/src/executor_tests/enums.rs similarity index 100% rename from src/executor_tests/enums.rs rename to juniper/src/executor_tests/enums.rs diff --git a/src/executor_tests/executor.rs b/juniper/src/executor_tests/executor.rs similarity index 100% rename from src/executor_tests/executor.rs rename to juniper/src/executor_tests/executor.rs diff --git a/src/executor_tests/interfaces_unions.rs b/juniper/src/executor_tests/interfaces_unions.rs similarity index 100% rename from src/executor_tests/interfaces_unions.rs rename to juniper/src/executor_tests/interfaces_unions.rs diff --git a/src/executor_tests/introspection.rs b/juniper/src/executor_tests/introspection.rs similarity index 100% rename from src/executor_tests/introspection.rs rename to juniper/src/executor_tests/introspection.rs diff --git a/src/executor_tests/mod.rs b/juniper/src/executor_tests/mod.rs similarity index 100% rename from src/executor_tests/mod.rs rename to juniper/src/executor_tests/mod.rs diff --git a/src/executor_tests/variables.rs b/juniper/src/executor_tests/variables.rs similarity index 100% rename from src/executor_tests/variables.rs rename to juniper/src/executor_tests/variables.rs diff --git a/src/graphiql.rs b/juniper/src/graphiql.rs similarity index 100% rename from src/graphiql.rs rename to juniper/src/graphiql.rs diff --git a/src/http.rs b/juniper/src/http.rs similarity index 100% rename from src/http.rs rename to juniper/src/http.rs diff --git a/src/integrations/iron_handlers.rs b/juniper/src/integrations/iron_handlers.rs similarity index 100% rename from src/integrations/iron_handlers.rs rename to juniper/src/integrations/iron_handlers.rs diff --git a/src/integrations/mod.rs b/juniper/src/integrations/mod.rs similarity index 100% rename from src/integrations/mod.rs rename to juniper/src/integrations/mod.rs diff --git a/src/integrations/rocket_handlers.rs b/juniper/src/integrations/rocket_handlers.rs similarity index 100% rename from src/integrations/rocket_handlers.rs rename to juniper/src/integrations/rocket_handlers.rs diff --git a/src/integrations/serde.rs b/juniper/src/integrations/serde.rs similarity index 100% rename from src/integrations/serde.rs rename to juniper/src/integrations/serde.rs diff --git a/src/lib.rs b/juniper/src/lib.rs similarity index 100% rename from src/lib.rs rename to juniper/src/lib.rs diff --git a/src/macros/args.rs b/juniper/src/macros/args.rs similarity index 100% rename from src/macros/args.rs rename to juniper/src/macros/args.rs diff --git a/src/macros/enums.rs b/juniper/src/macros/enums.rs similarity index 100% rename from src/macros/enums.rs rename to juniper/src/macros/enums.rs diff --git a/src/macros/field.rs b/juniper/src/macros/field.rs similarity index 100% rename from src/macros/field.rs rename to juniper/src/macros/field.rs diff --git a/src/macros/input_object.rs b/juniper/src/macros/input_object.rs similarity index 100% rename from src/macros/input_object.rs rename to juniper/src/macros/input_object.rs diff --git a/src/macros/interface.rs b/juniper/src/macros/interface.rs similarity index 100% rename from src/macros/interface.rs rename to juniper/src/macros/interface.rs diff --git a/src/macros/mod.rs b/juniper/src/macros/mod.rs similarity index 100% rename from src/macros/mod.rs rename to juniper/src/macros/mod.rs diff --git a/src/macros/object.rs b/juniper/src/macros/object.rs similarity index 100% rename from src/macros/object.rs rename to juniper/src/macros/object.rs diff --git a/src/macros/scalar.rs b/juniper/src/macros/scalar.rs similarity index 100% rename from src/macros/scalar.rs rename to juniper/src/macros/scalar.rs diff --git a/src/macros/tests/args.rs b/juniper/src/macros/tests/args.rs similarity index 100% rename from src/macros/tests/args.rs rename to juniper/src/macros/tests/args.rs diff --git a/src/macros/tests/enums.rs b/juniper/src/macros/tests/enums.rs similarity index 100% rename from src/macros/tests/enums.rs rename to juniper/src/macros/tests/enums.rs diff --git a/src/macros/tests/field.rs b/juniper/src/macros/tests/field.rs similarity index 100% rename from src/macros/tests/field.rs rename to juniper/src/macros/tests/field.rs diff --git a/src/macros/tests/input_object.rs b/juniper/src/macros/tests/input_object.rs similarity index 100% rename from src/macros/tests/input_object.rs rename to juniper/src/macros/tests/input_object.rs diff --git a/src/macros/tests/interface.rs b/juniper/src/macros/tests/interface.rs similarity index 100% rename from src/macros/tests/interface.rs rename to juniper/src/macros/tests/interface.rs diff --git a/src/macros/tests/mod.rs b/juniper/src/macros/tests/mod.rs similarity index 100% rename from src/macros/tests/mod.rs rename to juniper/src/macros/tests/mod.rs diff --git a/src/macros/tests/object.rs b/juniper/src/macros/tests/object.rs similarity index 100% rename from src/macros/tests/object.rs rename to juniper/src/macros/tests/object.rs diff --git a/src/macros/tests/scalar.rs b/juniper/src/macros/tests/scalar.rs similarity index 100% rename from src/macros/tests/scalar.rs rename to juniper/src/macros/tests/scalar.rs diff --git a/src/macros/tests/union.rs b/juniper/src/macros/tests/union.rs similarity index 100% rename from src/macros/tests/union.rs rename to juniper/src/macros/tests/union.rs diff --git a/src/macros/union.rs b/juniper/src/macros/union.rs similarity index 100% rename from src/macros/union.rs rename to juniper/src/macros/union.rs diff --git a/src/parser/document.rs b/juniper/src/parser/document.rs similarity index 100% rename from src/parser/document.rs rename to juniper/src/parser/document.rs diff --git a/src/parser/lexer.rs b/juniper/src/parser/lexer.rs similarity index 100% rename from src/parser/lexer.rs rename to juniper/src/parser/lexer.rs diff --git a/src/parser/mod.rs b/juniper/src/parser/mod.rs similarity index 100% rename from src/parser/mod.rs rename to juniper/src/parser/mod.rs diff --git a/src/parser/parser.rs b/juniper/src/parser/parser.rs similarity index 100% rename from src/parser/parser.rs rename to juniper/src/parser/parser.rs diff --git a/src/parser/tests/document.rs b/juniper/src/parser/tests/document.rs similarity index 100% rename from src/parser/tests/document.rs rename to juniper/src/parser/tests/document.rs diff --git a/src/parser/tests/lexer.rs b/juniper/src/parser/tests/lexer.rs similarity index 100% rename from src/parser/tests/lexer.rs rename to juniper/src/parser/tests/lexer.rs diff --git a/src/parser/tests/mod.rs b/juniper/src/parser/tests/mod.rs similarity index 100% rename from src/parser/tests/mod.rs rename to juniper/src/parser/tests/mod.rs diff --git a/src/parser/tests/value.rs b/juniper/src/parser/tests/value.rs similarity index 100% rename from src/parser/tests/value.rs rename to juniper/src/parser/tests/value.rs diff --git a/src/parser/utils.rs b/juniper/src/parser/utils.rs similarity index 100% rename from src/parser/utils.rs rename to juniper/src/parser/utils.rs diff --git a/src/parser/value.rs b/juniper/src/parser/value.rs similarity index 100% rename from src/parser/value.rs rename to juniper/src/parser/value.rs diff --git a/src/result_ext.rs b/juniper/src/result_ext.rs similarity index 100% rename from src/result_ext.rs rename to juniper/src/result_ext.rs diff --git a/src/schema/meta.rs b/juniper/src/schema/meta.rs similarity index 100% rename from src/schema/meta.rs rename to juniper/src/schema/meta.rs diff --git a/src/schema/mod.rs b/juniper/src/schema/mod.rs similarity index 100% rename from src/schema/mod.rs rename to juniper/src/schema/mod.rs diff --git a/src/schema/model.rs b/juniper/src/schema/model.rs similarity index 100% rename from src/schema/model.rs rename to juniper/src/schema/model.rs diff --git a/src/schema/schema.rs b/juniper/src/schema/schema.rs similarity index 100% rename from src/schema/schema.rs rename to juniper/src/schema/schema.rs diff --git a/src/tests/introspection_tests.rs b/juniper/src/tests/introspection_tests.rs similarity index 100% rename from src/tests/introspection_tests.rs rename to juniper/src/tests/introspection_tests.rs diff --git a/src/tests/mod.rs b/juniper/src/tests/mod.rs similarity index 100% rename from src/tests/mod.rs rename to juniper/src/tests/mod.rs diff --git a/src/tests/model.rs b/juniper/src/tests/model.rs similarity index 100% rename from src/tests/model.rs rename to juniper/src/tests/model.rs diff --git a/src/tests/query_tests.rs b/juniper/src/tests/query_tests.rs similarity index 100% rename from src/tests/query_tests.rs rename to juniper/src/tests/query_tests.rs diff --git a/src/tests/schema.rs b/juniper/src/tests/schema.rs similarity index 100% rename from src/tests/schema.rs rename to juniper/src/tests/schema.rs diff --git a/src/types/base.rs b/juniper/src/types/base.rs similarity index 100% rename from src/types/base.rs rename to juniper/src/types/base.rs diff --git a/src/types/containers.rs b/juniper/src/types/containers.rs similarity index 100% rename from src/types/containers.rs rename to juniper/src/types/containers.rs diff --git a/src/types/mod.rs b/juniper/src/types/mod.rs similarity index 100% rename from src/types/mod.rs rename to juniper/src/types/mod.rs diff --git a/src/types/pointers.rs b/juniper/src/types/pointers.rs similarity index 100% rename from src/types/pointers.rs rename to juniper/src/types/pointers.rs diff --git a/src/types/scalars.rs b/juniper/src/types/scalars.rs similarity index 100% rename from src/types/scalars.rs rename to juniper/src/types/scalars.rs diff --git a/src/types/utilities.rs b/juniper/src/types/utilities.rs similarity index 100% rename from src/types/utilities.rs rename to juniper/src/types/utilities.rs diff --git a/src/validation/context.rs b/juniper/src/validation/context.rs similarity index 100% rename from src/validation/context.rs rename to juniper/src/validation/context.rs diff --git a/src/validation/input_value.rs b/juniper/src/validation/input_value.rs similarity index 100% rename from src/validation/input_value.rs rename to juniper/src/validation/input_value.rs diff --git a/src/validation/mod.rs b/juniper/src/validation/mod.rs similarity index 100% rename from src/validation/mod.rs rename to juniper/src/validation/mod.rs diff --git a/src/validation/multi_visitor.rs b/juniper/src/validation/multi_visitor.rs similarity index 100% rename from src/validation/multi_visitor.rs rename to juniper/src/validation/multi_visitor.rs diff --git a/src/validation/rules/arguments_of_correct_type.rs b/juniper/src/validation/rules/arguments_of_correct_type.rs similarity index 100% rename from src/validation/rules/arguments_of_correct_type.rs rename to juniper/src/validation/rules/arguments_of_correct_type.rs diff --git a/src/validation/rules/default_values_of_correct_type.rs b/juniper/src/validation/rules/default_values_of_correct_type.rs similarity index 100% rename from src/validation/rules/default_values_of_correct_type.rs rename to juniper/src/validation/rules/default_values_of_correct_type.rs diff --git a/src/validation/rules/fields_on_correct_type.rs b/juniper/src/validation/rules/fields_on_correct_type.rs similarity index 100% rename from src/validation/rules/fields_on_correct_type.rs rename to juniper/src/validation/rules/fields_on_correct_type.rs diff --git a/src/validation/rules/fragments_on_composite_types.rs b/juniper/src/validation/rules/fragments_on_composite_types.rs similarity index 100% rename from src/validation/rules/fragments_on_composite_types.rs rename to juniper/src/validation/rules/fragments_on_composite_types.rs diff --git a/src/validation/rules/known_argument_names.rs b/juniper/src/validation/rules/known_argument_names.rs similarity index 100% rename from src/validation/rules/known_argument_names.rs rename to juniper/src/validation/rules/known_argument_names.rs diff --git a/src/validation/rules/known_directives.rs b/juniper/src/validation/rules/known_directives.rs similarity index 100% rename from src/validation/rules/known_directives.rs rename to juniper/src/validation/rules/known_directives.rs diff --git a/src/validation/rules/known_fragment_names.rs b/juniper/src/validation/rules/known_fragment_names.rs similarity index 100% rename from src/validation/rules/known_fragment_names.rs rename to juniper/src/validation/rules/known_fragment_names.rs diff --git a/src/validation/rules/known_type_names.rs b/juniper/src/validation/rules/known_type_names.rs similarity index 100% rename from src/validation/rules/known_type_names.rs rename to juniper/src/validation/rules/known_type_names.rs diff --git a/src/validation/rules/lone_anonymous_operation.rs b/juniper/src/validation/rules/lone_anonymous_operation.rs similarity index 100% rename from src/validation/rules/lone_anonymous_operation.rs rename to juniper/src/validation/rules/lone_anonymous_operation.rs diff --git a/src/validation/rules/mod.rs b/juniper/src/validation/rules/mod.rs similarity index 100% rename from src/validation/rules/mod.rs rename to juniper/src/validation/rules/mod.rs diff --git a/src/validation/rules/no_fragment_cycles.rs b/juniper/src/validation/rules/no_fragment_cycles.rs similarity index 100% rename from src/validation/rules/no_fragment_cycles.rs rename to juniper/src/validation/rules/no_fragment_cycles.rs diff --git a/src/validation/rules/no_undefined_variables.rs b/juniper/src/validation/rules/no_undefined_variables.rs similarity index 100% rename from src/validation/rules/no_undefined_variables.rs rename to juniper/src/validation/rules/no_undefined_variables.rs diff --git a/src/validation/rules/no_unused_fragments.rs b/juniper/src/validation/rules/no_unused_fragments.rs similarity index 100% rename from src/validation/rules/no_unused_fragments.rs rename to juniper/src/validation/rules/no_unused_fragments.rs diff --git a/src/validation/rules/no_unused_variables.rs b/juniper/src/validation/rules/no_unused_variables.rs similarity index 100% rename from src/validation/rules/no_unused_variables.rs rename to juniper/src/validation/rules/no_unused_variables.rs diff --git a/src/validation/rules/overlapping_fields_can_be_merged.rs b/juniper/src/validation/rules/overlapping_fields_can_be_merged.rs similarity index 100% rename from src/validation/rules/overlapping_fields_can_be_merged.rs rename to juniper/src/validation/rules/overlapping_fields_can_be_merged.rs diff --git a/src/validation/rules/possible_fragment_spreads.rs b/juniper/src/validation/rules/possible_fragment_spreads.rs similarity index 100% rename from src/validation/rules/possible_fragment_spreads.rs rename to juniper/src/validation/rules/possible_fragment_spreads.rs diff --git a/src/validation/rules/provided_non_null_arguments.rs b/juniper/src/validation/rules/provided_non_null_arguments.rs similarity index 100% rename from src/validation/rules/provided_non_null_arguments.rs rename to juniper/src/validation/rules/provided_non_null_arguments.rs diff --git a/src/validation/rules/scalar_leafs.rs b/juniper/src/validation/rules/scalar_leafs.rs similarity index 100% rename from src/validation/rules/scalar_leafs.rs rename to juniper/src/validation/rules/scalar_leafs.rs diff --git a/src/validation/rules/unique_argument_names.rs b/juniper/src/validation/rules/unique_argument_names.rs similarity index 100% rename from src/validation/rules/unique_argument_names.rs rename to juniper/src/validation/rules/unique_argument_names.rs diff --git a/src/validation/rules/unique_fragment_names.rs b/juniper/src/validation/rules/unique_fragment_names.rs similarity index 100% rename from src/validation/rules/unique_fragment_names.rs rename to juniper/src/validation/rules/unique_fragment_names.rs diff --git a/src/validation/rules/unique_input_field_names.rs b/juniper/src/validation/rules/unique_input_field_names.rs similarity index 100% rename from src/validation/rules/unique_input_field_names.rs rename to juniper/src/validation/rules/unique_input_field_names.rs diff --git a/src/validation/rules/unique_operation_names.rs b/juniper/src/validation/rules/unique_operation_names.rs similarity index 100% rename from src/validation/rules/unique_operation_names.rs rename to juniper/src/validation/rules/unique_operation_names.rs diff --git a/src/validation/rules/unique_variable_names.rs b/juniper/src/validation/rules/unique_variable_names.rs similarity index 100% rename from src/validation/rules/unique_variable_names.rs rename to juniper/src/validation/rules/unique_variable_names.rs diff --git a/src/validation/rules/variables_are_input_types.rs b/juniper/src/validation/rules/variables_are_input_types.rs similarity index 100% rename from src/validation/rules/variables_are_input_types.rs rename to juniper/src/validation/rules/variables_are_input_types.rs diff --git a/src/validation/rules/variables_in_allowed_position.rs b/juniper/src/validation/rules/variables_in_allowed_position.rs similarity index 100% rename from src/validation/rules/variables_in_allowed_position.rs rename to juniper/src/validation/rules/variables_in_allowed_position.rs diff --git a/src/validation/test_harness.rs b/juniper/src/validation/test_harness.rs similarity index 100% rename from src/validation/test_harness.rs rename to juniper/src/validation/test_harness.rs diff --git a/src/validation/traits.rs b/juniper/src/validation/traits.rs similarity index 100% rename from src/validation/traits.rs rename to juniper/src/validation/traits.rs diff --git a/src/validation/visitor.rs b/juniper/src/validation/visitor.rs similarity index 100% rename from src/validation/visitor.rs rename to juniper/src/validation/visitor.rs diff --git a/src/value.rs b/juniper/src/value.rs similarity index 100% rename from src/value.rs rename to juniper/src/value.rs From d33db983deb7f6f05b3e724bf45508956b33e2ff Mon Sep 17 00:00:00 2001 From: theduke Date: Sat, 24 Jun 2017 13:23:20 +0200 Subject: [PATCH 02/14] Add juniper_codegen crate. This crate will contain multiple custom_derive implementations. For now, only enum is supported. --- juniper_codegen/Cargo.toml | 19 ++++ juniper_codegen/src/enums.rs | 179 +++++++++++++++++++++++++++++++++++ juniper_codegen/src/lib.rs | 19 ++++ juniper_codegen/src/util.rs | 48 ++++++++++ 4 files changed, 265 insertions(+) create mode 100644 juniper_codegen/Cargo.toml create mode 100644 juniper_codegen/src/enums.rs create mode 100644 juniper_codegen/src/lib.rs create mode 100644 juniper_codegen/src/util.rs diff --git a/juniper_codegen/Cargo.toml b/juniper_codegen/Cargo.toml new file mode 100644 index 00000000..6c979a91 --- /dev/null +++ b/juniper_codegen/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "juniper_codegen" +version = "0.8.1" +authors = ["Magnus Hallin "] +description = "Internal custom derive trait for Juniper GraphQL" +license = "BSD-2-Clause" +documentation = "https://docs.rs/juniper" +repository = "https://github.com/mhallin/juniper" + +[lib] +proc-macro = true + +[dependencies] +syn = "0.11.11" +quote = "0.3.15" + +[badges] +travis-ci = { repository = "mhallin/juniper" } +appveyor = { repository = "mhallin/juniper" } diff --git a/juniper_codegen/src/enums.rs b/juniper_codegen/src/enums.rs new file mode 100644 index 00000000..edbde797 --- /dev/null +++ b/juniper_codegen/src/enums.rs @@ -0,0 +1,179 @@ +use syn; +use syn::*; +use quote::Tokens; + +use ::util::*; + + +#[derive(Default, Debug)] +struct EnumAttrs { + name: Option, + description: Option, +} + +impl EnumAttrs { + fn from_input(input: &DeriveInput) -> EnumAttrs { + let mut res = EnumAttrs::default(); + + // Check attributes for name and description. + if let Some(items) = get_graphl_attr(&input.attrs) { + for item in items { + if let Some(val) = keyed_item_value(item, "name", true) { + res.name = Some(val); + continue; + } + if let Some(val) = keyed_item_value(item, "description", true) { + res.description = Some(val); + continue; + } + panic!(format!( + "Unknown attribute for #[derive(GraphQLEnum)]: {:?}", + item)); + } + } + res + } +} + +#[derive(Default)] +struct EnumVariantAttrs { + name: Option, + description: Option, + deprecation: Option, +} + +impl EnumVariantAttrs { + fn from_input(variant: &Variant) -> EnumVariantAttrs { + let mut res = EnumVariantAttrs::default(); + + // Check attributes for name and description. + if let Some(items) = get_graphl_attr(&variant.attrs) { + for item in items { + if let Some(val) = keyed_item_value(item, "name", true) { + res.name = Some(val); + continue; + } + if let Some(val) = keyed_item_value(item, "description", true) { + res.description = Some(val); + continue; + } + if let Some(val) = keyed_item_value(item, "deprecated", true) { + res.deprecation = Some(val); + continue; + } + panic!(format!( + "Unknown attribute for #[derive(GraphQLEnum)]: {:?}", + item)); + } + } + res + } +} + + +pub fn impl_enum(ast: &syn::DeriveInput) -> Tokens { + let variants = match ast.body { + Body::Enum(ref var) => var, + Body::Struct(_) => { + panic!("#[derive(GraphlQLEnum)] may only be applied to enums, not to structs"); + }, + }; + + // Parse attributes. + let ident = &ast.ident; + let attrs = EnumAttrs::from_input(ast); + let name = attrs.name.unwrap_or(ast.ident.to_string()); + + let mut values = Vec::::new(); + let mut resolves = Vec::::new(); + let mut from_inputs = Vec::::new(); + let mut to_inputs = Vec::::new(); + + for variant in variants { + if variant.data != VariantData::Unit { + panic!(format!( + "Invalid enum variant {}.\nGraphQL enums may only contain unit variants.", + variant.ident)); + } + let vattrs = EnumVariantAttrs::from_input(variant); + let vident = &variant.ident; + + // Build value. + let name = vattrs.name.unwrap_or(variant.ident.to_string()); + let descr = match vattrs.description { + Some(s) => quote!{ Some(#s.to_string()) }, + None => quote!{ None }, + }; + let depr = match vattrs.deprecation { + Some(s) => quote!{ Some(#s.to_string()) }, + None => quote!{ None }, + }; + let value = quote!{ + ::juniper::meta::EnumValue{ + name: #name.to_string(), + description: #descr, + deprecation_reason: #depr, + }, + }; + values.push(value); + + // Build resolve match clause. + let resolve = quote!{ + &#ident::#vident => ::juniper::Value::String(#name.to_string()), + }; + resolves.push(resolve); + + // Buil from_input clause. + let from_input = quote!{ + Some(#name) => Some(#ident::#vident), + }; + from_inputs.push(from_input); + + // Buil to_input clause. + let to_input = quote!{ + &#ident::#vident => + ::juniper::InputValue::string(#name.to_string()), + }; + to_inputs.push(to_input); + }; + + quote! { + impl ::juniper::GraphQLType for #ident { + type Context = (); + + fn name() -> Option<&'static str> { + Some(#name) + } + + fn meta<'r>(registry: &mut ::juniper::Registry<'r>) -> ::juniper::meta::MetaType<'r> { + registry.build_enum_type::<#ident>(&[ + #(#values)* + ]) + .into_meta() + } + + fn resolve(&self, _: Option<&[::juniper::Selection]>, _: &::juniper::Executor) -> ::juniper::Value { + match self { + #(#resolves)* + } + } + } + + impl ::juniper::FromInputValue for #ident { + fn from(v: &::juniper::InputValue) -> Option<#ident> { + match v.as_enum_value().or_else(|| v.as_string_value()) { + #(#from_inputs)* + _ => None, + } + } + } + + impl ::juniper::ToInputValue for #ident { + fn to(&self) -> ::juniper::InputValue { + match self { + #(#to_inputs)* + } + } + } + } +} diff --git a/juniper_codegen/src/lib.rs b/juniper_codegen/src/lib.rs new file mode 100644 index 00000000..e555579d --- /dev/null +++ b/juniper_codegen/src/lib.rs @@ -0,0 +1,19 @@ +#![recursion_limit = "1024"] + +extern crate proc_macro; +extern crate syn; +#[macro_use] +extern crate quote; + +mod util; +mod enums; + +use proc_macro::TokenStream; + +#[proc_macro_derive(GraphQLEnum, attributes(graphql))] +pub fn derive_enum(input: TokenStream) -> TokenStream { + let s = input.to_string(); + let ast = syn::parse_derive_input(&s).unwrap(); + let gen = enums::impl_enum(&ast); + gen.parse().unwrap() +} diff --git a/juniper_codegen/src/util.rs b/juniper_codegen/src/util.rs new file mode 100644 index 00000000..e38169da --- /dev/null +++ b/juniper_codegen/src/util.rs @@ -0,0 +1,48 @@ +use syn::*; + +pub fn get_graphl_attr(attrs: &Vec) -> Option<&Vec> { + for attr in attrs { + match attr.value { + MetaItem::List(ref attr_name, ref items) => { + if attr_name == "graphql" { + return Some(items); + } + }, + _ => {}, + } + } + None +} + +pub fn keyed_item_value(item: &NestedMetaItem, name: &str, must_be_string: bool) + -> Option +{ + let item = match item { + &NestedMetaItem::MetaItem(ref item) => item, + _ => { return None; } + }; + let lit = match item { + &MetaItem::NameValue(ref ident, ref lit) => { + if ident == name { + lit + } else { + return None; + } + }, + _ => { return None; }, + }; + match lit { + &Lit::Str(ref val, _) => { + Some(val.clone()) + }, + _ => { + if must_be_string { + panic!(format!( + "Invalid format for attribute \"{:?}\": expected a string", + item)); + } else { + None + } + }, + } +} From 3b42c97a4a192cf300fdad270bb27b41fb89c96d Mon Sep 17 00:00:00 2001 From: theduke Date: Sat, 24 Jun 2017 13:25:21 +0200 Subject: [PATCH 03/14] Add juniper_tests crate with integration tests --- juniper_tests/Cargo.toml | 12 +++++++++ juniper_tests/src/codegen/mod.rs | 46 ++++++++++++++++++++++++++++++++ juniper_tests/src/lib.rs | 4 +++ 3 files changed, 62 insertions(+) create mode 100644 juniper_tests/Cargo.toml create mode 100644 juniper_tests/src/codegen/mod.rs create mode 100644 juniper_tests/src/lib.rs diff --git a/juniper_tests/Cargo.toml b/juniper_tests/Cargo.toml new file mode 100644 index 00000000..23853710 --- /dev/null +++ b/juniper_tests/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "juniper_tests" +version = "0.1.0" + +[dependencies] +juniper = { path = "../juniper" } +juniper_codegen = { path = "../juniper_codegen" } + +[[test]] +name = "integration_tests" +path = "src/lib.rs" +harness = true diff --git a/juniper_tests/src/codegen/mod.rs b/juniper_tests/src/codegen/mod.rs new file mode 100644 index 00000000..4c476b6c --- /dev/null +++ b/juniper_tests/src/codegen/mod.rs @@ -0,0 +1,46 @@ +use std::collections::HashMap; + +use juniper::{self, InputValue, ToInputValue, GraphQLType, FromInputValue}; + +#[derive(GraphQLEnum, Debug, PartialEq)] +#[graphql(name="Some", description="enum descr")] +enum SomeEnum { + Regular, + + #[graphql( + name="FULL", + description="field descr", + deprecated="depr" + )] + Full, +} + +#[test] +fn test_derived_enum() { + // Ensure that rename works. + assert_eq!(SomeEnum::name(), Some("Some")); + + // Ensure validity of meta info. + let mut registry = juniper::Registry::new(HashMap::new()); + let meta = SomeEnum::meta(&mut registry); + + // Test Regular variant. + assert_eq!( + SomeEnum::Regular.to(), + InputValue::String("Regular".into()) + ); + assert_eq!( + FromInputValue::from(&InputValue::String("Regular".into())), + Some(SomeEnum::Regular) + ); + + // Test FULL variant. + assert_eq!( + SomeEnum::Full.to(), + InputValue::String("FULL".into()) + ); + assert_eq!( + FromInputValue::from(&InputValue::String("FULL".into())), + Some(SomeEnum::Full) + ); +} diff --git a/juniper_tests/src/lib.rs b/juniper_tests/src/lib.rs new file mode 100644 index 00000000..3396c71a --- /dev/null +++ b/juniper_tests/src/lib.rs @@ -0,0 +1,4 @@ +#[macro_use] extern crate juniper; +#[macro_use] extern crate juniper_codegen; + +mod codegen; From 35ea9529619a3332f098b52ea61dabc8f203a9da Mon Sep 17 00:00:00 2001 From: theduke Date: Sat, 24 Jun 2017 13:52:01 +0200 Subject: [PATCH 04/14] Added new crates to workspace manifest. --- Cargo.toml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 39214423..cc833d78 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,4 +1,6 @@ [workspace] members = [ - "juniper" + "juniper", + "juniper_codegen", + "juniper_tests", ] From 2bcfc315ad4b36c725b1c054c139d562e598f8e9 Mon Sep 17 00:00:00 2001 From: theduke Date: Sat, 24 Jun 2017 20:19:06 +0200 Subject: [PATCH 05/14] Use more descriptive variant variable names for enum deriving --- juniper_codegen/src/enums.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/juniper_codegen/src/enums.rs b/juniper_codegen/src/enums.rs index edbde797..d08396c4 100644 --- a/juniper_codegen/src/enums.rs +++ b/juniper_codegen/src/enums.rs @@ -95,16 +95,16 @@ pub fn impl_enum(ast: &syn::DeriveInput) -> Tokens { "Invalid enum variant {}.\nGraphQL enums may only contain unit variants.", variant.ident)); } - let vattrs = EnumVariantAttrs::from_input(variant); - let vident = &variant.ident; + let var_attrs = EnumVariantAttrs::from_input(variant); + let var_ident = &variant.ident; // Build value. - let name = vattrs.name.unwrap_or(variant.ident.to_string()); - let descr = match vattrs.description { + let name = var_attrs.name.unwrap_or(variant.ident.to_string()); + let descr = match var_attrs.description { Some(s) => quote!{ Some(#s.to_string()) }, None => quote!{ None }, }; - let depr = match vattrs.deprecation { + let depr = match var_attrs.deprecation { Some(s) => quote!{ Some(#s.to_string()) }, None => quote!{ None }, }; @@ -119,19 +119,19 @@ pub fn impl_enum(ast: &syn::DeriveInput) -> Tokens { // Build resolve match clause. let resolve = quote!{ - &#ident::#vident => ::juniper::Value::String(#name.to_string()), + &#ident::#var_ident => ::juniper::Value::String(#name.to_string()), }; resolves.push(resolve); // Buil from_input clause. let from_input = quote!{ - Some(#name) => Some(#ident::#vident), + Some(#name) => Some(#ident::#var_ident), }; from_inputs.push(from_input); // Buil to_input clause. let to_input = quote!{ - &#ident::#vident => + &#ident::#var_ident => ::juniper::InputValue::string(#name.to_string()), }; to_inputs.push(to_input); From e42228e2d507234438d9d2a1ea3c2981c4808847 Mon Sep 17 00:00:00 2001 From: theduke Date: Sat, 24 Jun 2017 20:19:43 +0200 Subject: [PATCH 06/14] Duplicating to_camel_case in codegen --- juniper_codegen/src/util.rs | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/juniper_codegen/src/util.rs b/juniper_codegen/src/util.rs index e38169da..78125122 100644 --- a/juniper_codegen/src/util.rs +++ b/juniper_codegen/src/util.rs @@ -46,3 +46,40 @@ pub fn keyed_item_value(item: &NestedMetaItem, name: &str, must_be_string: bool) }, } } + +// Note: duplicated from juniper crate! +#[doc(hidden)] +pub fn to_camel_case(s: &str) -> String { + let mut dest = String::new(); + + for (i, part) in s.split('_').enumerate() { + if i > 0 && part.len() == 1 { + dest.push_str(&part.to_uppercase()); + } + else if i > 0 && part.len() > 1 { + let first = part.chars().next().unwrap().to_uppercase().collect::(); + let second = &part[1..]; + + dest.push_str(&first); + dest.push_str(second); + } + else if i == 0 { + dest.push_str(part); + } + } + + dest +} + +#[test] +fn test_to_camel_case() { + assert_eq!(&to_camel_case("test")[..], "test"); + assert_eq!(&to_camel_case("_test")[..], "Test"); + assert_eq!(&to_camel_case("first_second")[..], "firstSecond"); + assert_eq!(&to_camel_case("first_")[..], "first"); + assert_eq!(&to_camel_case("a_b_c")[..], "aBC"); + assert_eq!(&to_camel_case("a_bc")[..], "aBc"); + assert_eq!(&to_camel_case("a_b")[..], "aB"); + assert_eq!(&to_camel_case("a")[..], "a"); + assert_eq!(&to_camel_case("")[..], ""); +} From 1312c6a026c962808a4926eac8e53685d4eaf470 Mon Sep 17 00:00:00 2001 From: theduke Date: Sat, 24 Jun 2017 20:20:00 +0200 Subject: [PATCH 07/14] Implement derive for input objects --- juniper_codegen/src/input_objects.rs | 212 +++++++++++++++++++++++++++ juniper_codegen/src/lib.rs | 9 ++ 2 files changed, 221 insertions(+) create mode 100644 juniper_codegen/src/input_objects.rs diff --git a/juniper_codegen/src/input_objects.rs b/juniper_codegen/src/input_objects.rs new file mode 100644 index 00000000..78440b14 --- /dev/null +++ b/juniper_codegen/src/input_objects.rs @@ -0,0 +1,212 @@ +use syn; +use syn::*; +use quote::Tokens; + +use ::util::*; + + +#[derive(Default, Debug)] +struct ObjAttrs { + name: Option, + description: Option, +} + +impl ObjAttrs { + fn from_input(input: &DeriveInput) -> ObjAttrs { + let mut res = ObjAttrs::default(); + + // Check attributes for name and description. + if let Some(items) = get_graphl_attr(&input.attrs) { + for item in items { + if let Some(val) = keyed_item_value(item, "name", true) { + res.name = Some(val); + continue; + } + if let Some(val) = keyed_item_value(item, "description", true) { + res.description = Some(val); + continue; + } + panic!(format!( + "Unknown attribute for #[derive(GraphQLInputObject)]: {:?}", + item)); + } + } + res + } +} + +#[derive(Default)] +struct ObjFieldAttrs { + name: Option, + description: Option, + default: Option, +} + +impl ObjFieldAttrs { + fn from_input(variant: &Field) -> ObjFieldAttrs { + let mut res = ObjFieldAttrs::default(); + + // Check attributes for name and description. + if let Some(items) = get_graphl_attr(&variant.attrs) { + for item in items { + if let Some(val) = keyed_item_value(item, "name", true) { + res.name = Some(val); + continue; + } + if let Some(val) = keyed_item_value(item, "description", true) { + res.description = Some(val); + continue; + } + if let Some(val) = keyed_item_value(item, "default", true) { + res.default = Some(val); + continue; + } + panic!(format!( + "Unknown attribute for #[derive(GraphQLInputObject)]: {:?}", + item)); + } + } + res + } +} + +pub fn impl_input_object(ast: &syn::DeriveInput) -> Tokens { + let fields = match ast.body { + Body::Struct(ref data) => { + match data { + &VariantData::Struct(ref fields) => fields, + _ => { + panic!("#[derive(GraphQLInputObject)] may only be used on regular structs with fields"); + }, + } + }, + Body::Enum(_) => { + panic!("#[derive(GraphlQLInputObject)] may only be applied to structs, not to enums"); + }, + }; + + // Parse attributes. + let ident = &ast.ident; + let attrs = ObjAttrs::from_input(ast); + let name = attrs.name.unwrap_or(ast.ident.to_string()); + + let mut meta_fields = Vec::::new(); + let mut from_inputs = Vec::::new(); + let mut to_inputs = Vec::::new(); + + for field in fields { + let field_ty = &field.ty; + let field_attrs = ObjFieldAttrs::from_input(field); + let field_ident = field.ident.as_ref().unwrap(); + + // Build value. + let name = match field_attrs.name { + Some(ref name) => { + // Custom name specified. + name.to_string() + }, + None => { + // Note: auto camel casing when no custom name specified. + ::util::to_camel_case(field_ident.as_ref()) + }, + }; + let descr = match field_attrs.description { + Some(s) => quote!{ Some(#s.to_string()) }, + None => quote!{ None }, + }; + + let default = match field_attrs.default { + Some(ref def) => { + match syn::parse_token_trees(def) { + Ok(t) => Some(quote!{ #(#t)* }), + Err(_) => { + panic!("#graphql(default = ?) must be a valid Rust expression inside a string"); + }, + } + }, + None => None, + }; + + let meta_field = match default { + Some(ref def) => { + quote!{ + registry.arg_with_default::<#field_ty>( #name, &#def), + } + }, + None => { + quote!{ + registry.arg::<#field_ty>(#name), + } + } + }; + meta_fields.push(meta_field); + + // Buil from_input clause. + + let from_input_default = match default { + Some(ref def) => { + quote!{ + Some(&&::juniper::InputValue::Null) | None if true => #def, + } + }, + None => quote!{}, + }; + + let from_input = quote!{ + #field_ident: { + // TODO: investigate the unwraps here, they seem dangerous! + match obj.get(#name) { + #from_input_default + Some(v) => ::juniper::FromInputValue::from(v).unwrap(), + _ => ::juniper::FromInputValue::from(&::juniper::InputValue::null()).unwrap() + } + }, + }; + from_inputs.push(from_input); + + // Build to_input clause. + let to_input = quote!{ + (#name, self.#field_ident.to()), + }; + to_inputs.push(to_input); + } + + quote! { + impl ::juniper::GraphQLType for #ident { + type Context = (); + + fn name() -> Option<&'static str> { + Some(#name) + } + + fn meta<'r>(registry: &mut ::juniper::Registry<'r>) -> ::juniper::meta::MetaType<'r> { + let fields = &[ + #(#meta_fields)* + ]; + registry.build_input_object_type::<#ident>(fields).into_meta() + } + } + + impl ::juniper::FromInputValue for #ident { + fn from(value: &::juniper::InputValue) -> Option<#ident> { + if let Some(obj) = value.to_object_value() { + let item = #ident { + #(#from_inputs)* + }; + Some(item) + } + else { + None + } + } + } + + impl ::juniper::ToInputValue for #ident { + fn to(&self) -> ::juniper::InputValue { + ::juniper::InputValue::object(vec![ + #(#to_inputs)* + ].into_iter().collect()) + } + } + } +} diff --git a/juniper_codegen/src/lib.rs b/juniper_codegen/src/lib.rs index e555579d..16375fb9 100644 --- a/juniper_codegen/src/lib.rs +++ b/juniper_codegen/src/lib.rs @@ -7,6 +7,7 @@ extern crate quote; mod util; mod enums; +mod input_objects; use proc_macro::TokenStream; @@ -17,3 +18,11 @@ pub fn derive_enum(input: TokenStream) -> TokenStream { let gen = enums::impl_enum(&ast); gen.parse().unwrap() } + +#[proc_macro_derive(GraphQLInputObject, attributes(graphql))] +pub fn derive_input_object(input: TokenStream) -> TokenStream { + let s = input.to_string(); + let ast = syn::parse_derive_input(&s).unwrap(); + let gen = input_objects::impl_input_object(&ast); + gen.parse().unwrap() +} From 03f694fff68568a581d0450291f5b0f9e71208fe Mon Sep 17 00:00:00 2001 From: theduke Date: Sat, 24 Jun 2017 20:20:54 +0200 Subject: [PATCH 08/14] Add nesting layer for codegen tests and add test for input_object derive --- juniper_tests/Cargo.toml | 1 + juniper_tests/src/codegen/enums.rs | 46 +++++++++++++++++++++ juniper_tests/src/codegen/input_objects.rs | 21 ++++++++++ juniper_tests/src/codegen/mod.rs | 48 +--------------------- juniper_tests/src/lib.rs | 1 + 5 files changed, 71 insertions(+), 46 deletions(-) create mode 100644 juniper_tests/src/codegen/enums.rs create mode 100644 juniper_tests/src/codegen/input_objects.rs diff --git a/juniper_tests/Cargo.toml b/juniper_tests/Cargo.toml index 23853710..ad456fa9 100644 --- a/juniper_tests/Cargo.toml +++ b/juniper_tests/Cargo.toml @@ -5,6 +5,7 @@ version = "0.1.0" [dependencies] juniper = { path = "../juniper" } juniper_codegen = { path = "../juniper_codegen" } +serde_json = { version = "^1.0.2" } [[test]] name = "integration_tests" diff --git a/juniper_tests/src/codegen/enums.rs b/juniper_tests/src/codegen/enums.rs new file mode 100644 index 00000000..4c476b6c --- /dev/null +++ b/juniper_tests/src/codegen/enums.rs @@ -0,0 +1,46 @@ +use std::collections::HashMap; + +use juniper::{self, InputValue, ToInputValue, GraphQLType, FromInputValue}; + +#[derive(GraphQLEnum, Debug, PartialEq)] +#[graphql(name="Some", description="enum descr")] +enum SomeEnum { + Regular, + + #[graphql( + name="FULL", + description="field descr", + deprecated="depr" + )] + Full, +} + +#[test] +fn test_derived_enum() { + // Ensure that rename works. + assert_eq!(SomeEnum::name(), Some("Some")); + + // Ensure validity of meta info. + let mut registry = juniper::Registry::new(HashMap::new()); + let meta = SomeEnum::meta(&mut registry); + + // Test Regular variant. + assert_eq!( + SomeEnum::Regular.to(), + InputValue::String("Regular".into()) + ); + assert_eq!( + FromInputValue::from(&InputValue::String("Regular".into())), + Some(SomeEnum::Regular) + ); + + // Test FULL variant. + assert_eq!( + SomeEnum::Full.to(), + InputValue::String("FULL".into()) + ); + assert_eq!( + FromInputValue::from(&InputValue::String("FULL".into())), + Some(SomeEnum::Full) + ); +} diff --git a/juniper_tests/src/codegen/input_objects.rs b/juniper_tests/src/codegen/input_objects.rs new file mode 100644 index 00000000..6f70a7b8 --- /dev/null +++ b/juniper_tests/src/codegen/input_objects.rs @@ -0,0 +1,21 @@ +use juniper::{self, InputValue, ToInputValue, GraphQLType, FromInputValue}; + +#[derive(GraphQLInputObject, Debug, PartialEq)] +#[graphql(name="MyInput")] +struct Input { + regular_field: String, + #[graphql(name="haha", default="33")] + c: i32, +} + +#[test] +fn test_derived_input_object() { + assert_eq!(Input::name(), Some("MyInput")); + + let obj = Input { + regular_field: "a".to_string(), + c: 33, + }; + let restored: Input = FromInputValue::from(&obj.to()).unwrap(); + assert_eq!(obj, restored); +} diff --git a/juniper_tests/src/codegen/mod.rs b/juniper_tests/src/codegen/mod.rs index 4c476b6c..33366cf9 100644 --- a/juniper_tests/src/codegen/mod.rs +++ b/juniper_tests/src/codegen/mod.rs @@ -1,46 +1,2 @@ -use std::collections::HashMap; - -use juniper::{self, InputValue, ToInputValue, GraphQLType, FromInputValue}; - -#[derive(GraphQLEnum, Debug, PartialEq)] -#[graphql(name="Some", description="enum descr")] -enum SomeEnum { - Regular, - - #[graphql( - name="FULL", - description="field descr", - deprecated="depr" - )] - Full, -} - -#[test] -fn test_derived_enum() { - // Ensure that rename works. - assert_eq!(SomeEnum::name(), Some("Some")); - - // Ensure validity of meta info. - let mut registry = juniper::Registry::new(HashMap::new()); - let meta = SomeEnum::meta(&mut registry); - - // Test Regular variant. - assert_eq!( - SomeEnum::Regular.to(), - InputValue::String("Regular".into()) - ); - assert_eq!( - FromInputValue::from(&InputValue::String("Regular".into())), - Some(SomeEnum::Regular) - ); - - // Test FULL variant. - assert_eq!( - SomeEnum::Full.to(), - InputValue::String("FULL".into()) - ); - assert_eq!( - FromInputValue::from(&InputValue::String("FULL".into())), - Some(SomeEnum::Full) - ); -} +mod enums; +mod input_objects; diff --git a/juniper_tests/src/lib.rs b/juniper_tests/src/lib.rs index 3396c71a..cce45dc6 100644 --- a/juniper_tests/src/lib.rs +++ b/juniper_tests/src/lib.rs @@ -1,4 +1,5 @@ #[macro_use] extern crate juniper; #[macro_use] extern crate juniper_codegen; +#[macro_use] extern crate serde_json; mod codegen; From 4516790572abc294a79046eff18b60e2a3593e59 Mon Sep 17 00:00:00 2001 From: theduke Date: Tue, 4 Jul 2017 20:08:20 +0200 Subject: [PATCH 09/14] Fix up travis/appveyo specs --- .travis.yml | 17 +++++++++++------ appveyor.yml | 8 ++++++-- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index eb5f294b..fa490d95 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,19 +19,24 @@ env: - secure: "SsepHEYRmW9ee3RhxPpqGuPigZINFfA/yOwUJFseQt4t+Zs90r1xdl3Q8eDfPlnvBsL7Rd0QQrFDO7JUaimVLlgQkUnrl62o0CYzkodp+qtocyAHS00W6WTqi8Y6E6KBxPshCl03dRLaySUfx5TqTLTIHkJ0G6vDW35k7hRrA3221lRphs5rrpvAZ21pqsDsNLH3HVo792L6A0kOtBa3ocw1pgHLxnBbArIViu2htUuFvY/TgsmVbAdlow0efw/xkcJ/p0/r5q7igLek6Iqk8udfRc7CktvoiFQ2vUnhtNtQu/zYll3Q7OUx5d+w5lhbzz2QINmsezBEisH9k1haL7dMviLPp0pn4WZed60KovO0Iqfgjy1utTaKvJVfNWYsgkfU8c9a/z2rcZOKwXNKQW2ptBrtVjaB9dk7eMoyuFCDZwNtKqvG+ZKmvMpun+R8mmx+buOmN8Vlf5ygIoGxz3nbEtlLYGVTXHfdXXqRkFIwtiYVJEO7SLRKT9pbx1E++ARsi2+y8bXJT4e4z0osYMq9EsiFUpw3J2gcshrgseqkB7UgCZ3SXuitJnJNfDAU3a3nwwS/JiAunZMNnC4rKUBbl7WbTB4Cpw7EgVOlCqcyyzlkNl3xabLzTFzLOfSHLTVX5FmGNsD21vBoS5/8ejftx9wuV3rGHxuO3i3+A3k=" script: - # Build library standalone, with Iron, and with Rocket integrations enabled, respectively + # Build all crates. - cargo build --all --verbose - - cargo build --all --verbose --features iron-handlers + # Run all tests for all crates. + - cargo test --all + + # Build and run tests for main juniper crate with certain features. + - cd juniper + - cargo build --verbose --features iron-handlers - | if [ "$TRAVIS_RUST_VERSION" = "nightly" ]; then - cargo build --all --verbose --features rocket-handlers + cargo build --verbose --features rocket-handlers fi # Build example binaries; first Iron, then Rocket examples - - cargo build --all --verbose --example server --features "iron-handlers expose-test-schema" + - cargo build --verbose --example server --features "iron-handlers expose-test-schema" - | if [ "TRAVIS_RUST_VERSION" = "nightly" ]; then - cargo build --all --verbose --example rocket-server --features "rocket-handlers expose-test-schema" + cargo build --verbose --example rocket-server --features "rocket-handlers expose-test-schema" fi # Run all tests for the base library and available integrations @@ -41,7 +46,7 @@ script: export TEST_FEATURES="$TEST_FEATURES rocket-handlers rocket/testing" fi - - cargo test --all --verbose --features "$TEST_FEATURES" + - cargo test --verbose --features "$TEST_FEATURES" before_deploy: diff --git a/appveyor.yml b/appveyor.yml index 768a0355..2914ac34 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -48,8 +48,12 @@ install: build: false test_script: - # Build library standalone, with Iron, and with Rocket integrations enabled, respectively - - cargo build --verbose + # Build and test all crates. + - cargo build --all --verbose + - cargo test --all + + # Build and test main juniper crate with certain features. + - cd juniper - cargo build --verbose --features iron-handlers - IF "%CHANNEL%"=="nightly" (cargo build --verbose --features rocket-handlers) From c0086580523b489501ec11377a6a56a22800cb4b Mon Sep 17 00:00:00 2001 From: theduke Date: Tue, 4 Jul 2017 20:48:17 +0200 Subject: [PATCH 10/14] Moving examples to juniper crate (for now) --- {examples => juniper/examples}/rocket-server.rs | 0 {examples => juniper/examples}/server.rs | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename {examples => juniper/examples}/rocket-server.rs (100%) rename {examples => juniper/examples}/server.rs (100%) diff --git a/examples/rocket-server.rs b/juniper/examples/rocket-server.rs similarity index 100% rename from examples/rocket-server.rs rename to juniper/examples/rocket-server.rs diff --git a/examples/server.rs b/juniper/examples/server.rs similarity index 100% rename from examples/server.rs rename to juniper/examples/server.rs From 07bb75bd79d58350cbc18217c27957fda9dcc717 Mon Sep 17 00:00:00 2001 From: theduke Date: Tue, 4 Jul 2017 21:01:00 +0200 Subject: [PATCH 11/14] Fix test specs... for real --- .travis.yml | 19 ++++++++++++++----- appveyor.yml | 16 ++++++++++++---- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index fa490d95..d1ae2804 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,13 +19,9 @@ env: - secure: "SsepHEYRmW9ee3RhxPpqGuPigZINFfA/yOwUJFseQt4t+Zs90r1xdl3Q8eDfPlnvBsL7Rd0QQrFDO7JUaimVLlgQkUnrl62o0CYzkodp+qtocyAHS00W6WTqi8Y6E6KBxPshCl03dRLaySUfx5TqTLTIHkJ0G6vDW35k7hRrA3221lRphs5rrpvAZ21pqsDsNLH3HVo792L6A0kOtBa3ocw1pgHLxnBbArIViu2htUuFvY/TgsmVbAdlow0efw/xkcJ/p0/r5q7igLek6Iqk8udfRc7CktvoiFQ2vUnhtNtQu/zYll3Q7OUx5d+w5lhbzz2QINmsezBEisH9k1haL7dMviLPp0pn4WZed60KovO0Iqfgjy1utTaKvJVfNWYsgkfU8c9a/z2rcZOKwXNKQW2ptBrtVjaB9dk7eMoyuFCDZwNtKqvG+ZKmvMpun+R8mmx+buOmN8Vlf5ygIoGxz3nbEtlLYGVTXHfdXXqRkFIwtiYVJEO7SLRKT9pbx1E++ARsi2+y8bXJT4e4z0osYMq9EsiFUpw3J2gcshrgseqkB7UgCZ3SXuitJnJNfDAU3a3nwwS/JiAunZMNnC4rKUBbl7WbTB4Cpw7EgVOlCqcyyzlkNl3xabLzTFzLOfSHLTVX5FmGNsD21vBoS5/8ejftx9wuV3rGHxuO3i3+A3k=" script: - # Build all crates. - - cargo build --all --verbose - # Run all tests for all crates. - - cargo test --all - # Build and run tests for main juniper crate with certain features. - cd juniper + - cargo build --verbose - cargo build --verbose --features iron-handlers - | if [ "$TRAVIS_RUST_VERSION" = "nightly" ]; then @@ -47,6 +43,19 @@ script: fi - cargo test --verbose --features "$TEST_FEATURES" + - cd .. + + # Build juniper_codegen and run tests. + - cd juniper_codegen + - cargo build --verbose + - cargo test + - cd .. + + # Build and run integration tests. + - cd juniper_tests + - cargo build --verbose + - cargo test + before_deploy: diff --git a/appveyor.yml b/appveyor.yml index 2914ac34..b1453af4 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -48,10 +48,6 @@ install: build: false test_script: - # Build and test all crates. - - cargo build --all --verbose - - cargo test --all - # Build and test main juniper crate with certain features. - cd juniper - cargo build --verbose --features iron-handlers @@ -66,3 +62,15 @@ test_script: - IF "%CHANNEL%"=="nightly" (set TEST_FEATURES=%TEST_FEATURES% rocket-handlers rocket/testing) - cargo test --verbose --features "%TEST_FEATURES%" + - cd .. + + # Build juniper_codegen and run tests. + - cd juniper_codegen + - cargo build --verbose + - cargo test + - cd .. + + # Build and run integration tests. + - cd juniper_tests + - cargo build --verbose + - cargo test From 8a27cb3cb5912a5c3aa40dcb81049d3d9c15e380 Mon Sep 17 00:00:00 2001 From: theduke Date: Tue, 4 Jul 2017 23:00:59 +0200 Subject: [PATCH 12/14] Fix appveyor (retrigger) --- appveyor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/appveyor.yml b/appveyor.yml index b1453af4..2923889d 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -74,3 +74,4 @@ test_script: - cd juniper_tests - cargo build --verbose - cargo test + From c27d2c7a23f7cc07d753cc19010725391ef0923d Mon Sep 17 00:00:00 2001 From: theduke Date: Wed, 5 Jul 2017 08:24:50 +0200 Subject: [PATCH 13/14] Make variant name for derived enums upper case by default --- juniper_codegen/src/enums.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/juniper_codegen/src/enums.rs b/juniper_codegen/src/enums.rs index d08396c4..2e254858 100644 --- a/juniper_codegen/src/enums.rs +++ b/juniper_codegen/src/enums.rs @@ -99,7 +99,7 @@ pub fn impl_enum(ast: &syn::DeriveInput) -> Tokens { let var_ident = &variant.ident; // Build value. - let name = var_attrs.name.unwrap_or(variant.ident.to_string()); + let name = var_attrs.name.unwrap_or(variant.ident.as_ref().to_uppercase()); let descr = match var_attrs.description { Some(s) => quote!{ Some(#s.to_string()) }, None => quote!{ None }, From 359b348b973721cb62da63c3c210e687e237fe48 Mon Sep 17 00:00:00 2001 From: theduke Date: Thu, 6 Jul 2017 16:47:46 +0200 Subject: [PATCH 14/14] Fix custom derive enum test. --- juniper_tests/src/codegen/enums.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/juniper_tests/src/codegen/enums.rs b/juniper_tests/src/codegen/enums.rs index 4c476b6c..f9ba66a9 100644 --- a/juniper_tests/src/codegen/enums.rs +++ b/juniper_tests/src/codegen/enums.rs @@ -27,10 +27,10 @@ fn test_derived_enum() { // Test Regular variant. assert_eq!( SomeEnum::Regular.to(), - InputValue::String("Regular".into()) + InputValue::String("REGULAR".into()) ); assert_eq!( - FromInputValue::from(&InputValue::String("Regular".into())), + FromInputValue::from(&InputValue::String("REGULAR".into())), Some(SomeEnum::Regular) );