From 732b1aec1ba65bca8d57f3ce78794e67f564dc67 Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Fri, 20 Nov 2015 16:12:11 -0800 Subject: [PATCH 001/173] Update Connections --- graphene/contrib/django/fields.py | 4 +--- graphene/contrib/django/types.py | 13 +++++++++++-- graphene/core/types/objecttype.py | 4 ++++ graphene/relay/fields.py | 22 +++------------------- graphene/relay/types.py | 12 ++++++++++++ 5 files changed, 31 insertions(+), 24 deletions(-) diff --git a/graphene/contrib/django/fields.py b/graphene/contrib/django/fields.py index c64b9547..0b719586 100644 --- a/graphene/contrib/django/fields.py +++ b/graphene/contrib/django/fields.py @@ -8,9 +8,7 @@ from .utils import get_type_for_model, lazy_map class DjangoConnectionField(ConnectionField): - - def wrap_resolved(self, value, instance, args, info): - return lazy_map(value, self.type) + pass class LazyListField(Field): diff --git a/graphene/contrib/django/types.py b/graphene/contrib/django/types.py index f17893f0..8ef2a6a3 100644 --- a/graphene/contrib/django/types.py +++ b/graphene/contrib/django/types.py @@ -2,10 +2,10 @@ import six from ...core.types import BaseObjectType, ObjectTypeMeta from ...relay.fields import GlobalIDField -from ...relay.types import BaseNode +from ...relay.types import BaseNode, Connection from .converter import convert_django_field from .options import DjangoOptions -from .utils import get_reverse_fields +from .utils import get_reverse_fields, lazy_map class DjangoObjectTypeMeta(ObjectTypeMeta): @@ -71,6 +71,13 @@ class DjangoInterface(six.with_metaclass( pass +class DjangoConnection(Connection): + @classmethod + def from_list(cls, iterable, *args, **kwargs): + iterable = lazy_map(iterable, cls.edge_type.node_type) + return super(DjangoConnection, cls).from_list(iterable, *args, **kwargs) + + class DjangoNode(BaseNode, DjangoInterface): id = GlobalIDField() @@ -81,3 +88,5 @@ class DjangoNode(BaseNode, DjangoInterface): return cls(instance) except cls._meta.model.DoesNotExist: return None + + connection_type = DjangoConnection diff --git a/graphene/core/types/objecttype.py b/graphene/core/types/objecttype.py index e18518e9..14283af5 100644 --- a/graphene/core/types/objecttype.py +++ b/graphene/core/types/objecttype.py @@ -219,6 +219,10 @@ class BaseObjectType(BaseType): return OrderedDict(fields) + @classmethod + def wrap(cls, instance, args, info): + return cls(_root=instance) + class Interface(six.with_metaclass(ObjectTypeMeta, BaseObjectType)): pass diff --git a/graphene/relay/fields.py b/graphene/relay/fields.py index 58e0e8bd..a54140ee 100644 --- a/graphene/relay/fields.py +++ b/graphene/relay/fields.py @@ -1,6 +1,3 @@ -from collections import Iterable - -from graphql_relay.connection.arrayconnection import connection_from_list from graphql_relay.node.node import from_global_id from ..core.fields import Field @@ -30,24 +27,11 @@ class ConnectionField(Field): return value def resolver(self, instance, args, info): - from graphene.relay.types import PageInfo schema = info.schema.graphene_schema - + connection_type = self.get_type(schema) resolved = super(ConnectionField, self).resolver(instance, args, info) - if resolved: - resolved = self.wrap_resolved(resolved, instance, args, info) - assert isinstance( - resolved, Iterable), 'Resolved value from the connection field have to be iterable' - type = schema.T(self.type) - node = schema.objecttype(type) - connection_type = self.get_connection_type(node) - edge_type = self.get_edge_type(node) - - connection = connection_from_list( - resolved, args, connection_type=connection_type, - edge_type=edge_type, pageinfo_type=PageInfo) - connection.set_connection_data(resolved) - return connection + if not isinstance(resolved, connection_type): + return connection_type.from_list(resolved, args, info) def get_connection_type(self, node): connection_type = self.connection_type or node.get_connection_type() diff --git a/graphene/relay/types.py b/graphene/relay/types.py index a803d2f3..3969a09e 100644 --- a/graphene/relay/types.py +++ b/graphene/relay/types.py @@ -1,6 +1,8 @@ import inspect import warnings +from collections import Iterable from functools import wraps +from graphql_relay.connection.arrayconnection import connection_from_list from graphql_relay.node.node import to_global_id from ..core.types import (Boolean, Field, InputObjectType, Interface, List, @@ -63,6 +65,16 @@ class Connection(ObjectType): (cls,), {'edge_type': edge_type, 'edges': edges}) + @classmethod + def from_list(cls, iterable, args, info): + assert isinstance( + iterable, Iterable), 'Resolved value from the connection field have to be iterable' + connection = connection_from_list( + iterable, args, connection_type=cls, + edge_type=cls.edge_type, pageinfo_type=PageInfo) + connection.set_connection_data(iterable) + return connection + def set_connection_data(self, data): self._connection_data = data From c521e181c8da49017d0f5074267d81fe95247a8c Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Sat, 21 Nov 2015 10:51:49 -0800 Subject: [PATCH 002/173] Simplified Django grapheme types removing LazyMap --- graphene/contrib/django/fields.py | 22 ++++++++++------------ graphene/contrib/django/types.py | 6 +++--- graphene/contrib/django/utils.py | 7 +------ 3 files changed, 14 insertions(+), 21 deletions(-) diff --git a/graphene/contrib/django/fields.py b/graphene/contrib/django/fields.py index 0b719586..7b990b86 100644 --- a/graphene/contrib/django/fields.py +++ b/graphene/contrib/django/fields.py @@ -1,24 +1,22 @@ +import warnings + from ...core.exceptions import SkipField from ...core.fields import Field from ...core.types.base import FieldType from ...core.types.definitions import List from ...relay import ConnectionField from ...relay.utils import is_node -from .utils import get_type_for_model, lazy_map +from .utils import get_type_for_model class DjangoConnectionField(ConnectionField): - pass - -class LazyListField(Field): - - def get_type(self, schema): - return List(self.type) - - def resolver(self, instance, args, info): - resolved = super(LazyListField, self).resolver(instance, args, info) - return lazy_map(resolved, self.type) + def __init__(self, *args, **kwargs): + cls = self.__class__ + warnings.warn("Using {} will be not longer supported." + " Use relay.ConnectionField instead".format(cls.__name__), + FutureWarning) + return super(DjangoConnectionField, self).__init__(*args, **kwargs) class ConnectionOrListField(Field): @@ -31,7 +29,7 @@ class ConnectionOrListField(Field): if is_node(field_object_type): field = DjangoConnectionField(field_object_type) else: - field = LazyListField(field_object_type) + field = Field(List(field_object_type)) field.contribute_to_class(self.object_type, self.attname) return schema.T(field) diff --git a/graphene/contrib/django/types.py b/graphene/contrib/django/types.py index 8ef2a6a3..55b76fa7 100644 --- a/graphene/contrib/django/types.py +++ b/graphene/contrib/django/types.py @@ -5,7 +5,7 @@ from ...relay.fields import GlobalIDField from ...relay.types import BaseNode, Connection from .converter import convert_django_field from .options import DjangoOptions -from .utils import get_reverse_fields, lazy_map +from .utils import get_reverse_fields, maybe_queryset class DjangoObjectTypeMeta(ObjectTypeMeta): @@ -30,7 +30,7 @@ class DjangoObjectTypeMeta(ObjectTypeMeta): is_excluded = field.name in cls._meta.exclude_fields or is_already_created if is_not_in_only or is_excluded: # We skip this field if we specify only_fields and is not - # in there. Or when we excldue this field in exclude_fields + # in there. Or when we exclude this field in exclude_fields continue converted_field = convert_django_field(field) cls.add_to_class(field.name, converted_field) @@ -74,7 +74,7 @@ class DjangoInterface(six.with_metaclass( class DjangoConnection(Connection): @classmethod def from_list(cls, iterable, *args, **kwargs): - iterable = lazy_map(iterable, cls.edge_type.node_type) + iterable = maybe_queryset(iterable) return super(DjangoConnection, cls).from_list(iterable, *args, **kwargs) diff --git a/graphene/contrib/django/utils.py b/graphene/contrib/django/utils.py index 0d557e9a..54c6420c 100644 --- a/graphene/contrib/django/utils.py +++ b/graphene/contrib/django/utils.py @@ -1,8 +1,5 @@ from django.db import models from django.db.models.manager import Manager -from django.db.models.query import QuerySet - -from ...utils import LazyMap def get_type_for_model(schema, model): @@ -22,9 +19,7 @@ def get_reverse_fields(model): yield related -def lazy_map(value, func): +def maybe_queryset(value): if isinstance(value, Manager): value = value.get_queryset() - if isinstance(value, QuerySet): - return LazyMap(value, func) return value From 137ba498682a1b559f0e746da2a503f6add37eb4 Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Sat, 21 Nov 2015 10:58:49 -0800 Subject: [PATCH 003/173] Removed LazyMap --- graphene/utils/__init__.py | 3 +- graphene/utils/lazymap.py | 43 ---------------------------- graphene/utils/tests/test_lazymap.py | 23 --------------- 3 files changed, 1 insertion(+), 68 deletions(-) delete mode 100644 graphene/utils/lazymap.py delete mode 100644 graphene/utils/tests/test_lazymap.py diff --git a/graphene/utils/__init__.py b/graphene/utils/__init__.py index bb1a2150..52fb6417 100644 --- a/graphene/utils/__init__.py +++ b/graphene/utils/__init__.py @@ -1,11 +1,10 @@ from .str_converters import to_camel_case, to_snake_case from .proxy_snake_dict import ProxySnakeDict from .caching import cached_property, memoize -from .lazymap import LazyMap from .misc import enum_to_graphql_enum from .resolve_only_args import resolve_only_args __all__ = ['to_camel_case', 'to_snake_case', 'ProxySnakeDict', - 'cached_property', 'memoize', 'LazyMap', 'enum_to_graphql_enum', + 'cached_property', 'memoize', 'enum_to_graphql_enum', 'resolve_only_args'] diff --git a/graphene/utils/lazymap.py b/graphene/utils/lazymap.py deleted file mode 100644 index 236f91eb..00000000 --- a/graphene/utils/lazymap.py +++ /dev/null @@ -1,43 +0,0 @@ -class LazyMap(object): - - def __init__(self, origin, _map, state=None): - self._origin = origin - self._origin_iter = origin.__iter__() - self._state = state or [] - self._finished = False - self._map = _map - - def __iter__(self): - return self if not self._finished else iter(self._state) - - def iter(self): - return self.__iter__() - - def __len__(self): - return self._origin.__len__() - - def __next__(self): - try: - n = next(self._origin_iter) - n = self._map(n) - except StopIteration as e: - self._finished = True - raise e - else: - self._state.append(n) - return n - - def next(self): - return self.__next__() - - def __getitem__(self, key): - item = self._origin[key] - if isinstance(key, slice): - return LazyMap(item, self._map) - return self._map(item) - - def __getattr__(self, name): - return getattr(self._origin, name) - - def __repr__(self): - return "" % repr(self._origin) diff --git a/graphene/utils/tests/test_lazymap.py b/graphene/utils/tests/test_lazymap.py deleted file mode 100644 index e6ee1f36..00000000 --- a/graphene/utils/tests/test_lazymap.py +++ /dev/null @@ -1,23 +0,0 @@ -from py.test import raises - -from ..lazymap import LazyMap - - -def test_lazymap(): - data = list(range(10)) - lm = LazyMap(data, lambda x: 2 * x) - assert len(lm) == 10 - assert lm[1] == 2 - assert isinstance(lm[1:4], LazyMap) - assert lm.append == data.append - assert repr(lm) == '' - - -def test_lazymap_iter(): - data = list(range(2)) - lm = LazyMap(data, lambda x: 2 * x) - iter_lm = iter(lm) - assert iter_lm.next() == 0 - assert iter_lm.next() == 2 - with raises(StopIteration): - iter_lm.next() From 79c7d070db664c864a74b7f4d2faa13cfb8472c8 Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Sat, 21 Nov 2015 18:16:31 -0800 Subject: [PATCH 004/173] Fixed isort --- graphene/contrib/django/types.py | 1 + graphene/relay/types.py | 1 + setup.cfg | 3 +++ 3 files changed, 5 insertions(+) diff --git a/graphene/contrib/django/types.py b/graphene/contrib/django/types.py index 55b76fa7..b5097c72 100644 --- a/graphene/contrib/django/types.py +++ b/graphene/contrib/django/types.py @@ -72,6 +72,7 @@ class DjangoInterface(six.with_metaclass( class DjangoConnection(Connection): + @classmethod def from_list(cls, iterable, *args, **kwargs): iterable = maybe_queryset(iterable) diff --git a/graphene/relay/types.py b/graphene/relay/types.py index 3969a09e..9fa673ef 100644 --- a/graphene/relay/types.py +++ b/graphene/relay/types.py @@ -2,6 +2,7 @@ import inspect import warnings from collections import Iterable from functools import wraps + from graphql_relay.connection.arrayconnection import connection_from_list from graphql_relay.node.node import to_global_id diff --git a/setup.cfg b/setup.cfg index 11382a78..21db934b 100644 --- a/setup.cfg +++ b/setup.cfg @@ -4,3 +4,6 @@ max-line-length = 120 [coverage:run] omit = core/ntypes/tests/* + +[isort] +known_first_party=graphene From c28b0466061bd91d3cba0b4814eea0d2df508414 Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Sat, 21 Nov 2015 19:04:58 -0800 Subject: [PATCH 005/173] Added DjangoConnection to the public --- graphene/contrib/django/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/graphene/contrib/django/__init__.py b/graphene/contrib/django/__init__.py index ca89906a..ec39b7f9 100644 --- a/graphene/contrib/django/__init__.py +++ b/graphene/contrib/django/__init__.py @@ -1,4 +1,5 @@ from graphene.contrib.django.types import ( + DjangoConnection, DjangoObjectType, DjangoInterface, DjangoNode @@ -9,4 +10,4 @@ from graphene.contrib.django.fields import ( ) __all__ = ['DjangoObjectType', 'DjangoInterface', 'DjangoNode', - 'DjangoConnectionField', 'DjangoModelField'] + 'DjangoConnection', 'DjangoConnectionField', 'DjangoModelField'] From 36ab537bf28e4164dba663f5b1540eb12e25f5f2 Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Sat, 21 Nov 2015 19:14:45 -0800 Subject: [PATCH 006/173] Updated to version 0.4.2 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 100e2321..4be1ad98 100644 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ class PyTest(TestCommand): setup( name='graphene', - version='0.4.1.1', + version='0.4.2', description='Graphene: Python DSL for GraphQL', long_description=open('README.rst').read(), From fe860774e8525cb50095f857c6013cffbc41f117 Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Sun, 22 Nov 2015 16:04:14 -0800 Subject: [PATCH 007/173] Fixed return ConnectionType instance in ConnectionField resolver --- graphene/relay/fields.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/graphene/relay/fields.py b/graphene/relay/fields.py index a54140ee..b3829ad8 100644 --- a/graphene/relay/fields.py +++ b/graphene/relay/fields.py @@ -30,8 +30,9 @@ class ConnectionField(Field): schema = info.schema.graphene_schema connection_type = self.get_type(schema) resolved = super(ConnectionField, self).resolver(instance, args, info) - if not isinstance(resolved, connection_type): - return connection_type.from_list(resolved, args, info) + if isinstance(resolved, connection_type): + return resolved + return connection_type.from_list(resolved, args, info) def get_connection_type(self, node): connection_type = self.connection_type or node.get_connection_type() From b564e144dfea7c28047ae609de4af72b7d984ffd Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Sun, 22 Nov 2015 17:29:30 -0800 Subject: [PATCH 008/173] Improved examples. Fixed #45 --- examples/complex_example.py | 31 +++++++++++++++++++ .../{field_example.py => simple_example.py} | 2 +- 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 examples/complex_example.py rename examples/{field_example.py => simple_example.py} (98%) diff --git a/examples/complex_example.py b/examples/complex_example.py new file mode 100644 index 00000000..dd801fff --- /dev/null +++ b/examples/complex_example.py @@ -0,0 +1,31 @@ +import graphene + + +class GeoInput(graphene.InputObjectType): + lat = graphene.Float(required=True) + lng = graphene.Float(required=True) + + +class Address(graphene.ObjectType): + latlng = graphene.String() + + +class Query(graphene.ObjectType): + address = graphene.Field(Address, geo=graphene.Argument(GeoInput)) + + def resolve_address(self, args, info): + geo = args.get('geo') + return Address(latlng="({},{})".format(geo.get('lat'), geo.get('lng'))) + + +schema = graphene.Schema(query=Query) +query = ''' + query something{ + address(geo: {lat:32.2, lng:12}) { + latlng + } + } +''' + +result = schema.execute(query) +print(result.data['address']['latlng']) diff --git a/examples/field_example.py b/examples/simple_example.py similarity index 98% rename from examples/field_example.py rename to examples/simple_example.py index be41969d..bc4b9d34 100644 --- a/examples/field_example.py +++ b/examples/simple_example.py @@ -21,7 +21,7 @@ query = ''' id name } -} + } ''' result = schema.execute(query) print(result.data['patron']) From a0d8b7162abd27e544f8de1eb2501e76e0e2b77a Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Tue, 24 Nov 2015 23:57:27 -0800 Subject: [PATCH 009/173] Remove blinker dependency --- graphene/signals.py | 7 ++++++- setup.py | 1 - 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/graphene/signals.py b/graphene/signals.py index ccb9ef0f..cdfa3d06 100644 --- a/graphene/signals.py +++ b/graphene/signals.py @@ -1,4 +1,9 @@ -from blinker import Signal +try: + from blinker import Signal +except ImportError: + class Signal(object): + def send(self, *args, **kwargs): + pass init_schema = Signal() class_prepared = Signal() diff --git a/setup.py b/setup.py index 4be1ad98..e8c61433 100644 --- a/setup.py +++ b/setup.py @@ -55,7 +55,6 @@ setup( install_requires=[ 'six>=1.10.0', - 'blinker', 'graphql-core==0.4.9', 'graphql-relay==0.3.3' ], From 0cf6cd65c7d54dc54536b22be23bf69bcaae98ec Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Sat, 21 Nov 2015 10:33:29 -0800 Subject: [PATCH 010/173] First draft for docs --- .travis.yml | 16 +- docs/.babelrc | 3 + docs/.gitignore | 29 + docs/README.md | 16 + docs/app.js | 11 + docs/assets/icon.js | 7 + docs/assets/logo.svg | 10 + docs/assets/starwars-icon.png | Bin 0 -> 1771 bytes docs/assets/starwars-icon@2x.png | Bin 0 -> 3899 bytes docs/config.toml | 1 + docs/css/main.styl | 212 ++++ docs/gatsby.config.js | 26 + docs/html.js | 25 + docs/package.json | 25 + docs/pages/_header.js | 150 +++ docs/pages/_template.js | 44 + docs/pages/community.md | 25 + docs/pages/docs/django_quickstart.md | 125 +++ docs/pages/docs/quickstart.md | 58 + docs/pages/guide/interface.md | 49 + docs/pages/guide/mutation.md | 67 ++ docs/pages/guide/objecttype.md | 45 + docs/pages/index.md | 14 + docs/vendor/glfx.optim.js | 796 +++++++++++++ docs/vendor/particles.js | 1545 ++++++++++++++++++++++++++ docs/wrappers/html.js | 15 + docs/wrappers/md.js | 27 + 27 files changed, 3338 insertions(+), 3 deletions(-) create mode 100644 docs/.babelrc create mode 100644 docs/.gitignore create mode 100644 docs/README.md create mode 100644 docs/app.js create mode 100644 docs/assets/icon.js create mode 100644 docs/assets/logo.svg create mode 100644 docs/assets/starwars-icon.png create mode 100644 docs/assets/starwars-icon@2x.png create mode 100644 docs/config.toml create mode 100644 docs/css/main.styl create mode 100644 docs/gatsby.config.js create mode 100644 docs/html.js create mode 100644 docs/package.json create mode 100644 docs/pages/_header.js create mode 100644 docs/pages/_template.js create mode 100644 docs/pages/community.md create mode 100644 docs/pages/docs/django_quickstart.md create mode 100644 docs/pages/docs/quickstart.md create mode 100644 docs/pages/guide/interface.md create mode 100644 docs/pages/guide/mutation.md create mode 100644 docs/pages/guide/objecttype.md create mode 100644 docs/pages/index.md create mode 100644 docs/vendor/glfx.optim.js create mode 100644 docs/vendor/particles.js create mode 100644 docs/wrappers/html.js create mode 100644 docs/wrappers/md.js diff --git a/.travis.yml b/.travis.yml index 6e25621b..afc82b45 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,13 +6,23 @@ python: - 3.4 - 3.5 - pypy -cache: pip +cache: + - pip + - directories: + - .cache/pip/ + - docs/node_modules install: -- pip install --cache-dir $HOME/.cache/pip pytest pytest-cov coveralls flake8 six blinker pytest-django -- pip install --cache-dir $HOME/.cache/pip -e .[django] +- pip install --download-cache .cache/pip/ pytest pytest-cov coveralls flake8 six + blinker pytest-django +- pip install --download-cache .cache/pip/ -e .[django] - python setup.py develop script: - py.test --cov=graphene - flake8 after_success: - coveralls +- cd docs && npm run deploy + +env: + matrix: + secure: e0iu1FvUcGNcsKEDsGQiGTJZMJ8tJMAQ+c+KCuh7I11likoJbninI9FX85efMglG93Xu4GtND1rUwKWnANM94Cz5IrLrT9ga62Cg1sinbzD+JUOG9EobtmcYcLbfNvA1ybkZf4K0KvkYfH1XUxtL3v6jFI6lLjZ1vKa2M6i5t/38pjgUOOh9KlVGi+rqSp2TUsCyjZkMxE2Wwceen5N/B1yZJDn9yHPA+kiV2ScOMgZOuVMqQd0IAPcjhqTbNdaW2VjNQFtS8CQ8FOjJh9NepRAyA42oII7Aq65YzZbifzYL1eSPKKfUHHdc7Bs+vq1kGuaWz+XBqByZAQvw7OtpkecG+KrcO7XDV38y6z33vgCC5MPu9e0BZwITIvyuUOKmFA9vTAx/w963vBDSzHgskgqYtYswxzOoE55TS9tHsc5rgoSatEGW2VXyI8ytWpgkuluCNwT+/ZvNaQ33SCPTwN7mQGWx+DC+eyMBjI1sP9s4aYCaTggCSFNtwhRpQqqM/0HFa7hHDksK/zJhl4fhFUrbmyrJo6wm6Z7/s/WiSulk+zZkrLC9eBs1+XNtU7PzcmgfFmcsJnPGBmBF8WOa8WiX9hOn9DutBT4mLtlOod3YvU22U0Vwj2TjzhDvx8uyYCpDA03a/q9QjE4+klcI2Mw5UNhJsmTpCZQE06aHDKg= diff --git a/docs/.babelrc b/docs/.babelrc new file mode 100644 index 00000000..ce840ab8 --- /dev/null +++ b/docs/.babelrc @@ -0,0 +1,3 @@ +{ + "stage": 0 +} \ No newline at end of file diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 00000000..548fd2f1 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,29 @@ +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules + +public/ diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..2a8f240f --- /dev/null +++ b/docs/README.md @@ -0,0 +1,16 @@ +# Graphene Docs +Docs for Graphene + + +## Installation + +For running locally this docs. You have to execute +```bash +npm install -g gatsby && npm install +``` + +And then + +```bash +gatsby develop +``` \ No newline at end of file diff --git a/docs/app.js b/docs/app.js new file mode 100644 index 00000000..148e5fd5 --- /dev/null +++ b/docs/app.js @@ -0,0 +1,11 @@ +exports.loadContext = function(callback) { + var context; + context = require.context('./pages', true); + if (module.hot) { + module.hot.accept(context.id, function() { + context = require.context('./pages', true); + return callback(context); + }); + } + return callback(context); +}; diff --git a/docs/assets/icon.js b/docs/assets/icon.js new file mode 100644 index 00000000..1d0b3c61 --- /dev/null +++ b/docs/assets/icon.js @@ -0,0 +1,7 @@ +import React from 'react'; + +export default class Icon extends React.Component { + render() { + return + } +} diff --git a/docs/assets/logo.svg b/docs/assets/logo.svg new file mode 100644 index 00000000..297830fe --- /dev/null +++ b/docs/assets/logo.svg @@ -0,0 +1,10 @@ + diff --git a/docs/assets/starwars-icon.png b/docs/assets/starwars-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b99a2a0a0ebd6560be3686debdca3a91488bacf6 GIT binary patch literal 1771 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 z + + + + + {title} + + + + + +
+