{"id":13878567,"url":"https://github.com/maxd/graphql-dsl","last_synced_at":"2025-04-24T05:38:16.161Z","repository":{"id":56875193,"uuid":"391350126","full_name":"maxd/graphql-dsl","owner":"maxd","description":"🚀 Ruby DSL for build GraphQL queries by code.","archived":false,"fork":false,"pushed_at":"2021-10-09T13:44:27.000Z","size":296,"stargazers_count":6,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-24T05:38:09.124Z","etag":null,"topics":["dsl","graphql","ruby"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/maxd.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-07-31T12:27:54.000Z","updated_at":"2024-11-17T17:04:04.000Z","dependencies_parsed_at":"2022-08-20T10:11:01.199Z","dependency_job_id":null,"html_url":"https://github.com/maxd/graphql-dsl","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxd%2Fgraphql-dsl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxd%2Fgraphql-dsl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxd%2Fgraphql-dsl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxd%2Fgraphql-dsl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/maxd","download_url":"https://codeload.github.com/maxd/graphql-dsl/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250573274,"owners_count":21452335,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dsl","graphql","ruby"],"created_at":"2024-08-06T08:01:53.363Z","updated_at":"2025-04-24T05:38:16.142Z","avatar_url":"https://github.com/maxd.png","language":"Ruby","funding_links":[],"categories":["Ruby"],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e✨ GraphQL DSL ✨\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/maxd/graphql-dsl/actions/workflows/main.yml\"\u003e\u003cimg src=\"https://github.com/maxd/graphql-dsl/actions/workflows/main.yml/badge.svg\" alt=\"main\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.ruby-lang.org/en/\"\u003e\u003cimg src=\"https://img.shields.io/static/v1?label=language\u0026message=Ruby\u0026color=CC342D\u0026style=flat\u0026logo=ruby\u0026logoColor=CC342D\" alt=\"ruby\" /\u003e\u003c/a\u003e \n  \u003ca href=\"https://graphql.org/\"\u003e\u003cimg src=\"https://img.shields.io/static/v1?label=language\u0026message=GraphQL\u0026color=E10098\u0026style=flat\u0026logo=graphql\u0026logoColor=E10098\" alt=\"GraphQL\" /\u003e\u003c/a\u003e \n\u003c/p\u003e\n\n`graphql-dsl` lets you easy create GraphQL queries by code:\n\n```ruby\nextend GraphQL::DSL # Include DSL methods like `query`, `mutation`, etc. \nusing GraphQL::DSL  # Include refine methods like `variable` and `directive` if required.\n\n# Query alive characters from Rick and Morty unofficial GraphQL API:\n#   https://rickandmortyapi.com/graphql\nputs query(:aliveCharacters, species: variable(:String!, 'Human')) {\n  characters(filter: { status: 'Alive', species: :$species }) {\n    results {\n      name\n      image\n    }\n  }\n}.to_gql\n```\n\n```graphql\nquery aliveCharacters($species: String! = \"Human\")\n{\n  characters(filter: {status: \"Alive\", species: $species})\n  {\n    results\n    {\n      name\n      image\n    }\n  }\n}\n```\n\n## 🧩 Supported GraphQL features\n\nThe GraphQL DSL base on [draft](https://spec.graphql.org/draft/) version of GraphQL specification (updated at Wed, Sep 15, 2021)\nand support these features:\n\n- [x] Executable Documents (exclude type system definition documents)\n- [x] All operations (`query`, `mutation`, `subscription`) and their features (variable, directives, selection sets, etc.)\n- [x] All field features (aliases, arguments, directives, etc.)\n- [x] Fragments (include inline fragments)\n\n## ⚙️ Installation\n\nAdd this line to your application's Gemfile:\n\n```ruby\ngem 'graphql-dsl', '~\u003e 1.0.0'\n```\n\nAnd then execute `bundle install`.\n\n## ⚡️ Getting Started\n\nChoose an appropriate way to use GraphQL DSL:\n\n1. Call methods of `GraphQL::DSL` module directly\n\n    ```ruby\n    rockets_query = GraphQL::DSL.query {\n      rockets {\n        name\n      }\n    }.to_gql\n    \n    puts rockets_query\n    ```\n\n    \u003cdetails\u003e\n      \u003csummary\u003eSTDOUT\u003c/summary\u003e\n\n      ```graphql\n      {\n        rockets\n        {\n          name\n        }\n      }\n      ```\n    \u003c/details\u003e\n\n1. Extend class or module use `GraphQL::DSL` module\n\n    ```ruby\n    module SpaceXQueries\n      extend GraphQL::DSL\n      \n      # Create constant with GraphQL query\n      ROCKETS = query {\n        rockets {\n          name\n        }\n      }.to_gql\n    end\n    \n    puts SpaceXQueries::ROCKETS\n    ```\n\n    \u003cdetails\u003e\n      \u003csummary\u003eSTDOUT\u003c/summary\u003e\n\n      ```graphql\n      {\n        rockets\n        {\n          name\n        }\n      }\n      ```\n    \u003c/details\u003e\n\n    ```ruby\n    module SpaceXQueries\n      extend GraphQL::DSL\n   \n      # `extend self` or `module_function` required to \n      # call of `SpaceXQueries.rockets`\n      extend self    \n   \n      # use memorization or lazy initialization \n      # to avoid generation of query on each method call \n      def rockets\n        query {\n          rockets {\n            name\n          }\n        }.to_gql\n      end \n    end\n    \n    puts SpaceXQueries.rockets\n    ```\n\n    \u003cdetails\u003e\n      \u003csummary\u003eSTDOUT\u003c/summary\u003e\n\n      ```graphql\n      {\n        rockets\n        {\n          name\n        }\n      }\n      ```\n    \u003c/details\u003e\n\n1. Include `GraphQL::DSL` module to class\n\n    ```ruby\n    class SpaceXQueries\n      include GraphQL::DSL\n      \n      # use memorization or lazy initialization \n      # to avoid generation of query on each method call \n      def rockets\n        query {\n          rockets {\n            name\n          }\n        }.to_gql\n      end\n    end\n    \n    queries = SpaceXQueries.new\n    puts queries.rockets\n    ```\n\n    \u003cdetails\u003e\n      \u003csummary\u003eSTDOUT\u003c/summary\u003e\n\n      ```graphql\n      {\n        rockets\n        {\n          name\n        }\n      }\n      ```\n    \u003c/details\u003e\n\n## 👀 Documentation\n\n:bulb: _Non-official SpaceX GraphQL and Rick and Morty APIs are using for most of examples. \nSo, you can test generated GraphQL queries [here](https://api.spacex.land/graphql/) and [here](https://rickandmortyapi.com/graphql)._  \n\n### Operations\n\nThe GraphQL support three types of operations: \n\n* `query` - for fetch data.\n* `mutation` - for update data.\n* `subscription` - for fetch stream of data during a log time.\n\nTo create these operations use correspond GraphQL DSL methods: \n\n* `GraphQL::DSL#query`\n* `GraphQL::DSL#mutation`\n* `GraphQL::DSL#subscription`\n\n:bulb: _All of them have the same signatures therefore all examples below will use `query` operation._\n\n#### Anonymous operations\n\nCall correspond `GraphQL::DSL` method without any arguments to create anonymous operation:\n\n```ruby\nputs GraphQL::DSL.query {\n  rockets {\n    name\n  }\n}.to_gql\n```\n\n\u003cdetails\u003e\n  \u003csummary\u003eSTDOUT\u003c/summary\u003e\n\n  ```graphql\n  {\n    rockets\n    {\n      name\n    }\n  }\n  ```\n\u003c/details\u003e\n\n#### Named operations\n\nUse string or symbol to specify operation name:\n\n```ruby\nputs GraphQL::DSL.query(:rockets) {\n  rockets {\n    name\n  }\n}.to_gql\n```\n\n\u003cdetails\u003e\n  \u003csummary\u003eSTDOUT\u003c/summary\u003e\n\n  ```graphql\n  query rockets\n  {\n    rockets\n    {\n      name\n    }\n  }\n  ```\n\u003c/details\u003e\n\n#### Parameterized operations\n\nPass variable definitions to second argument of correspond `GraphQL::DSL` method:\n\n```ruby\nusing GraphQL::DSL # Include refined `variable` method\n\nputs GraphQL::DSL.query(:capsules, type: :String, status: variable(:String!, 'active')) {\n  capsules(find: { type: :$type, status: :$status }) {\n    type\n    status\n    landings\n  }\n}.to_gql\n```\n\n\u003cdetails\u003e\n  \u003csummary\u003eSTDOUT\u003c/summary\u003e\n\n  ```graphql\n  query capsules($type: String, $status: String! = \"active\")\n  {\n    capsules(find: {type: $type, status: $status})\n    {\n      type\n      status\n      landings\n    }\n  }\n  ```\n\u003c/details\u003e\n\nChoose appropriate notation to define variable type, default value and directives:\n\n:bulb: _See more about types definition [here](#types)._\n\n\u003cdetails\u003e\n  \u003csummary\u003eUse \u003ccode\u003eSymbol\u003c/code\u003e or \u003ccode\u003eString\u003c/code\u003e\u003c/summary\u003e\n  \n  ```ruby\n  # \u003cvariable name\u003e: \u003ctype\u003e, ...\n\n  puts GraphQL::DSL.query(:capsules, status: :String!) {\n    capsules(find: { status: :$status }) {\n      type\n      status\n      landings\n    }\n  }.to_gql\n  ```\n\n  ```graphql\n  query capsules($status: String!)\n  {\n    capsules(find: {status: $status})\n    {\n      type\n      status\n      landings\n    }\n  }\n  ```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eUse \u003ccode\u003evariable\u003c/code\u003e refined method\u003c/summary\u003e\n  \n  ```ruby\n  # \u003cvariable name\u003e: variable(\u003ctype\u003e, [\u003cdefault value\u003e], [\u003cdirectives\u003e]), ...\n\n  using GraphQL::DSL # Required to refine `variable` method\n\n  puts GraphQL::DSL.query(:capsules, status: variable(:String!, 'active')) {\n    capsules(find: { status: :$status }) {\n      type\n      status\n      landings\n    }\n  }.to_gql\n  ```\n\n  ```graphql\n  query capsules($status: String! = \"active\")\n  {\n    capsules(find: {status: $status})\n    {\n      type\n      status\n      landings\n    }\n  }\n  ```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eUse \u003ccode\u003e__var\u003c/code\u003e method\u003c/summary\u003e\n\n  ```ruby\n  # __var \u003cvariable name\u003e, \u003ctype\u003e, [default: \u003cdefault value\u003e], [directives: \u003cdirectives\u003e]\n\n  puts GraphQL::DSL.query(:capsules) {\n     __var :status, :String!, default: \"active\"\n     \n    capsules(find: { status: :$status }) {\n      type\n      status\n      landings\n    }\n  }.to_gql\n  ```\n\n  ```graphql\n  query capsules($status: String! = \"active\")\n  {\n    capsules(find: {status: $status})\n    {\n      type\n      status\n      landings\n    }\n  }\n  ```\n\u003c/details\u003e\n\n:bulb: _More information about directives you can find [here](#directives)._\n\n#### Operation's directives\n\nPass operation's directives to third argument of correspond `GraphQL::DSL` method:\n\n```ruby\nusing GraphQL::DSL # Include refined `variable` and `directive` methods\n\nputs GraphQL::DSL.query(:capsules, { status: variable(:String!, 'active') }, [ directive(:priority, level: :LOW) ]) {\n  capsules(find: { status: :$status }) {\n    type\n    status\n    landings\n  }\n}.to_gql\n```\n\n\u003cdetails\u003e\n  \u003csummary\u003eSTDOUT\u003c/summary\u003e\n\n  ```graphql\n  query capsules($status: String! = \"active\") @priority(level: LOW)\n  {\n    capsules(find: {status: $status})\n    {\n      type\n      status\n      landings\n    }\n  }\n  ```\n\u003c/details\u003e\n\n:bulb: _More information about directives you can find [here](#directives)._\n\n### Selection Sets\n\n[Selection Set](https://spec.graphql.org/draft/#sec-Selection-Sets) is a block that contains fields, spread or\ninternal fragments. Operations (`query`, `mutation`, `subscription`), fragment operations, spread and internal fragments \nmust have `Selection Set` for select or update (in case of mutation) data. Even a field can contains `Selection Set`. \n\n```ruby\nputs GraphQL::DSL.query {    # this is `Selection Set` of query\n  company {                  # this is `Selection Set` of `company` field\n    name\n    ceo\n    cto\n  }\n}.to_gql\n```\n\n\u003cdetails\u003e\n  \u003csummary\u003eSTDOUT\u003c/summary\u003e\n\n  ```graphql\n  {\n    company\n    {\n      name\n      ceo\n      cto\n    }\n  }\n  ```\n\u003c/details\u003e\n\n### Fields\n\n[Selection Set](#selection-set) should contains one or more fields to select or update (in case of mutation) data.\n\nTo create field just declare it name inside of `Selection Set` block:\n\n```ruby\nputs GraphQL::DSL.query {    \n  company {                  # this is `company` field\n    name                     # this is `name` fields declared in `Selection Set` of `company` field \n  }\n}.to_gql\n```\n\n\u003cdetails\u003e\n  \u003csummary\u003eSTDOUT\u003c/summary\u003e\n\n  ```graphql\n  {\n    company\n    {\n      name\n    }\n  }\n  ```\n\u003c/details\u003e\n\nAs you can see above some fields can have `Selection Set` and allow to declare sub-fields. \n\nIn rare cases will be impossible to declare field in such way because its name can conflict with Ruby's keywords and \nmethods. In this case you can declare field use `__field` method:\n\n```ruby\n# __field \u003cname\u003e, [__alias: \u003calias name\u003e], [__directives: \u003cdirectives\u003e], [\u003carguments\u003e]\n\nputs GraphQL::DSL.query {\n  __field(:class) {          # `class` is Ruby's keyword\n     __field(:object_id)     # `object_id` is `Object` method\n  }\n}.to_gql\n```\n\n\u003cdetails\u003e\n  \u003csummary\u003eSTDOUT\u003c/summary\u003e\n\n  ```graphql\n  {\n    class\n    {\n      object_id\n    }\n  }\n  ```\n\u003c/details\u003e\n\nTo rename field in GraphQL response specify alias in `__alias` argument:\n\n```ruby\nputs GraphQL::DSL.query {\n  company {\n     name __alias: :businessName\n  }\n}.to_gql\n```\n\n\u003cdetails\u003e\n  \u003csummary\u003eSTDOUT\u003c/summary\u003e\n\n  ```graphql\n  {\n    company\n    {\n      businessName: name\n    }\n  }\n  ```\n\u003c/details\u003e\n\nSome field can accept arguments and change their data base on them:\n\n```ruby\nputs GraphQL::DSL.query {\n  company {\n    revenue currency: :RUB   # convert revenue value to Russian Rubles\n  }\n}.to_gql\n```\n\n\u003cdetails\u003e\n  \u003csummary\u003eSTDOUT\u003c/summary\u003e\n\n  ```graphql\n  {\n    company\n    {\n      revenue(currency: RUB)\n    }\n  }\n  ```\n\u003c/details\u003e\n\nAny field can have directives. Pass them though `__directives` argument:\n\n```ruby\nusing GraphQL::DSL # Required to refine `directive` method\n\nputs GraphQL::DSL.query(:company, additionalInfo: :Boolean) {\n  company {\n    name \n    revenue __directives: [ directive(:include, if: :$additionalInfo) ]\n  }\n}.to_gql\n```\n\n\u003cdetails\u003e\n  \u003csummary\u003eSTDOUT\u003c/summary\u003e\n\n  ```graphql\n  query company($additionalInfo: Boolean)\n  {\n    company\n    {\n      name\n      revenue @include(if: $additionalInfo)\n    }\n  }\n  ```\n\u003c/details\u003e\n\n### Executable Documents\n\nExecutable Document helps to union several operations or fragments to one request:\n\n```ruby\nputs GraphQL::DSL.executable_document {\n  query(:companies) {\n    company {\n      name\n    }\n  }\n  \n  query(:rockets) {\n    rockets {\n      name\n    }\n  }\n}.to_gql\n```\n\n\u003cdetails\u003e\n  \u003csummary\u003eSTDOUT\u003c/summary\u003e\n\n  ```graphql\n  query companies\n  {\n    company\n    {\n      name\n    }\n  }\n  \n  query rockets\n  {\n    rockets\n    {\n      name\n    }\n  }\n  ```\n\u003c/details\u003e\n\n### Fragments\n\nFragments may contains common repeated selections of fields and can be reused in different operations.\nEach fragment must have a name, type and optional directives.\n\n:bulb: _See more about type definitions [here](#types)._\n\n```ruby\n# fragment(\u003cfragment name\u003e, \u003ctype\u003e, [\u003cdirectives\u003e])\n\nfragment(:ship, :Ship) {\n  id\n  name\n}\n```\n\nFragment spread is using to insert fragment to other operations or fragments. Use `__frgment` command to create fragment\nspread and insert fragment by its name.\n\n```ruby\n# __fragment(\u003cfragment name\u003e, [__directives: \u003cdirectives\u003e])\n\nputs GraphQL::DSL.executable_document {\n  query(:cargo_ships) {\n    ships(find: { type: \"Cargo\" }) {\n      __fragment :ship\n    }\n  }\n  query(:barges) {\n    ships(find: { type: \"Barge\" }) {\n      __fragment :ship\n    }\n  }\n  \n  fragment(:ship, :Ship) {\n    id\n    name\n  }\n}.to_gql\n```\n\n\u003cdetails\u003e\n  \u003csummary\u003eSTDOUT\u003c/summary\u003e\n\n  ```graphql\n  query cargo_ships\n  {\n    ships(find: {type: \"Cargo\"})\n    {\n      ...ship\n    }\n  }\n  \n  query barges\n  {\n    ships(find: {type: \"Barge\"})\n    {\n      ...ship\n    }\n  }\n  \n  fragment ship on Ship\n  {\n    id\n    name\n  }\n  ```\n\u003c/details\u003e\n\n### Inline fragments\n\nInline fragments helps to define fields from heterogeneous collections \n(collections which can contains different types of objects). Use `__inline_fragment` to insert inline fragment \nto operation or fragment.\n\n:bulb: _See more about type definitions [here](#types)._\n\n```ruby\n# __inline_fragment([\u003ctype\u003e]) { Selections Set }\n\nputs GraphQL::DSL.query {\n  messages {\n    __inline_fragment(:AdSection) {\n      title\n      image\n    }\n    \n    __inline_fragment(:MessageSection) {\n      title\n      message\n      author\n    }\n  }\n}.to_gql\n```\n\n\u003cdetails\u003e\n  \u003csummary\u003eSTDOUT\u003c/summary\u003e\n\n  ```graphql\n  {\n    messages\n    {\n      ... on AdSection\n      {\n        title\n        image\n      }\n      ... on MessageSection\n      {\n        title\n        message\n        author\n      }\n    }\n  }\n  ```\n\u003c/details\u003e\n\nInline fragments may also be used to apply a directive to a group of fields:\n\n```ruby\nusing GraphQL::DSL # Required to refine `directive` method\n\n# __inline_fragment([\u003ctype\u003e]) { Selections Set }\n\nputs GraphQL::DSL.query(:company, additionalInfo: :Boolean) {\n  company {\n    name\n    \n    __inline_fragment(nil, __directives: [ directive(:include, if: :$additionalInfo) ]) {\n      revenue\n      valuation\n    }\n  }\n}.to_gql\n```\n\n\u003cdetails\u003e\n  \u003csummary\u003eSTDOUT\u003c/summary\u003e\n\n  ```graphql\n  query company($additionalInfo: Boolean)\n  {\n    company\n    {\n      name\n      ... @include(if: $additionalInfo)\n      {\n        revenue\n        valuation\n      }\n    }\n  }\n  ```\n\u003c/details\u003e\n\n### Directives\n\n:warning: Non-official SpaceX GraphQL API doesn't support any directives therefore examples below will be fail with error.\n\nChoose appropriate notation to define directive:\n\n\u003cdetails\u003e\n  \u003csummary\u003eUse \u003ccode\u003eSymbol\u003c/code\u003e or \u003ccode\u003eString\u003c/code\u003e\u003c/summary\u003e\n\n  ```ruby\n  # (:\u003cname\u003e | \"name\"), ...\n   \n  puts GraphQL::DSL.query(:rockets, {}, [ :lowPriority ]) {\n     rockets {\n        name\n     }\n  }.to_gql\n  ```\n\n  ```graphql\n  query rockets @lowPriority\n  {\n    rockets\n    {\n      name\n    }\n  }\n  ```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eUse refined \u003ccode\u003edirective\u003c/code\u003e method\u003c/summary\u003e\n\n  ```ruby\n  # directive(\u003cdirective name\u003e, [\u003carguments\u003e]), ...\n\n  using GraphQL::DSL # Include refined `directive` method\n\n  puts GraphQL::DSL.query(:rockets, {}, [ directive(:lowPriority) ]) {\n     rockets {\n        name\n     }\n  }.to_gql\n  ```\n\n  ```graphql\n  query rockets @lowPriority\n  {\n    rockets\n    {\n      name\n    }\n  }\n  ```\n\u003c/details\u003e\n\n### Types\n\nTypes for operation variables and fragments may be declared in several ways in GraphQL DSL.\n\n#### Named Types\n\nNamed Type can be declared like a symbol or string, for instance: `:Int`, `'Int'` \n\n#### List Types\n\nList Type can be declared like a string only, for instance: `'[Int]'`\n\n#### Not Null Types\n\nNot Null Type can be declared like a string or symbol, for instance: `:Int!`, `'Int!'`, `'[Int!]!'`\n\n## 🚲 Example App\n\n[graphql-dsl-example](https://github.com/maxd/graphql-dsl-example) shows how to use GraphQL DSL in Ruby applications.\n\n## 🛣 Roadmap\n\n* [ ] `[Fearure]` Implement `ExecutableDocument#include` to include external operations\n* [ ] `[Fearure]` Strict validation of any argument\n* [ ] `[Fearure]` Compact format of GraphQL queries\n* [ ] `[Improvement]` Overload `__inline_fragment` for signature without type\n\n## 💻 Development\n\nAfter checking out the repo, run `bin/setup` to install dependencies. Then, run `bundle exec rspec` to run the tests. \nYou can also run `bin/console` for an interactive prompt that will allow you to experiment.\n\nTo release a new version:\n\n* update the version number in `lib/graphql/dsl/version.rb` file\n* run `bundle exec rake readme:update` to update `README.md` file \n* run `bundle exec rake release` to create a git tag for the version, push git commits and the created tag, \n  and push the `.gem` file to [rubygems.org](https://rubygems.org).\n\n## 👍 Contributing\n\nContributions are what make the open source community such an amazing place to learn, inspire, and create. \nAny contributions you make are **greatly appreciated**.\n\n1. Fork the Project\n2. Create your Feature Branch (`git checkout -b feature/NewFeature`)\n3. Commit your Changes (`git commit -m 'Add some NewFeature'`)\n4. Push to the Branch (`git push origin feature/NewFeature`)\n5. Open a Pull Request\n\n## 📜 License\n\nDistributed under the MIT License. See `LICENSE` for more information.\n\n## 🥰 Code of Conduct\n\nEveryone interacting in the GraphQL DSL project's codebases and issue trackers is expected to \nfollow the [code of conduct](https://github.com/maxd/graphql-dsl/blob/master/CODE_OF_CONDUCT.md).\n\n## 📚 Resources\n\n* [Introduction to GraphQL](https://graphql.org/learn/)\n* [GraphQL Specification](https://spec.graphql.org/)\n* Inspired by [gqli.rb](https://github.com/contentful-labs/gqli.rb) gem\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxd%2Fgraphql-dsl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaxd%2Fgraphql-dsl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxd%2Fgraphql-dsl/lists"}