# SchemaGen
Schema Gen is a simple CLI tool that generates Python GraphQL implementations(using Graphene) from a Graphql Schema file.

# Installation
```shell
pip install schemagen
```

# Usage
Here's the content of a sample input file(we will call it *test.graphql*)
```graphql
type User {
    id: ID!
    username: String
    first_name: String
    last_name: String
    full_name: String
    name: String
    name: String
}
```

Now let's use SchemaGen to generate python code from it.

As a CLI tool:
```shell
schemagen parse test.graphql -o test.py
```
As a Python Package:

```python
from schemagen import SchemaGen

gen = SchemaGen(
  input_file='test.graphql',
  output_file='test.py'
)

# parse input file
gen()
```

Output(*test.py*):
```python
# This file was generated by CodegenTool
from graphene import *

class User(ObjectType):
	id = Field(ID, required=True)
	username = Field(String)
	first_name = Field(String)
	last_name = Field(String)
	full_name = Field(String)
	name = Field(String)

```

# Notes
Here are some things you should know about using SchemaGen:
* SchemaGen is not guaranteed to catch errors in your GraphQL schema file.
  
  SchemaGen will only catch a very small percentage of errors that might occur in defining a GraphQL schema.
  It is the developer's responsibility to ensure the GraphQL schema file is error-free.
  
  
* SchemaGen will not install the graphene package on your local machine however it will import it in the generated python file.
  
  You can easily install the package by running:
  ```shell
  pip install graphene
  ```
* GraphQL type declarations in your schema file **must be ordered**. 
  
  Because of the way Python and SchemaGen works, you cannot use a GraphQL type
  before declaring it. For example, the following graphql schema definition would be invalid because we are using the **Url** scalar in our **User** type before declaring it:
  ```graphql
    type User {
        id: ID!
        username: String
        avatar_url: Url
    }
  
    scalar Url    
  ```
  The correct version of the above code is:
    ```graphql
    scalar Url 
     
    type User {
        id: ID!
        username: String
        avatar_url: Url
    }
  ```

* Using a GraphQL SDL keyword as an object field name in your schema will throw an error.

  For example, doing this:
  ```graphql
  enum UserType {
    Example
  }
  
  type User{
    name: String
    type: UserType
  }
  ```
  will throw an error.
  
  Do this instead:
  ```graphql
  enum UserType {
    Example
  }
  
  type User{
    name: String
    user_type: UserType
  }
  ```
  
I plan to fix the last two issues stated above in the future. Pull requests are welcome!
  


