graphql-connections 0.1.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a9c9ec5b3fb2eff5eb12781de11a726576630f03381b4d0d12f334bf1c0daad5
4
- data.tar.gz: 57fc193b3559ae72cd6ffb75b14ceafe4e3e73371e09b6204f2ead111b9023a9
3
+ metadata.gz: ef27f5fb3f9d555769a1328f85b342b65b472e2d282a0e46296ba91441572641
4
+ data.tar.gz: dc5a4b2884b5266acad35c37b400fade1ea3850beaa2a03eb2d2974276bcd02a
5
5
  SHA512:
6
- metadata.gz: 84d109d7e71943db1522c6d0beb12403a8c442dfd208e39048b175e9410f0d44cec75a1b77942fec35fcf1925532a6909ba706b80525c6d36c64f4d3bf426846
7
- data.tar.gz: d5c7ebc8dd7d72b30069f619fedb548cf6b3828db686cefbe490d65b9ae0dd0e5454a83634386293d7c0a473969b93eccaf315d89740f061635046ff4ccba2f4
6
+ metadata.gz: 2b7ba37f332c49b5238969a683c1cdfbdcec8c76074d1e3d3903e1d2f8668bed48ea069a55cd65ed49f8ee6dceb7b5022dbfee2d95b1ca8452bb15d1b5d04053
7
+ data.tar.gz: 5375969fb009a1e7e7691f19fab5c0c60befc071d4cebf5e73a7854831508ee240e9209daeb4c33cf1f972cda56524fc97862105d2b0e8c0161a14e142fc3f3c
data/README.md CHANGED
@@ -21,6 +21,8 @@ gem "graphql-connections"
21
21
 
22
22
  ## Usage
23
23
 
24
+ ### ActiveRecord
25
+
24
26
  You can use a stable connection wrapper on a specific field:
25
27
 
26
28
  ```ruby
@@ -31,17 +33,70 @@ def messages
31
33
  end
32
34
  ```
33
35
 
36
+ Records are sorted by model's primary key by default. You can change this behaviour by providing `primary_key` param:
37
+
38
+ ```ruby
39
+ GraphQL::Connections::Stable.new(Message.all, primary_key: :created_at)
40
+ ```
41
+
42
+ In case when you want records to be sorted by more than one field (i.e., _keyset pagination_), you can use `keys` param:
43
+
44
+ ```ruby
45
+ GraphQL::Connections::Stable.new(Message.all, keys: %w[name id])
46
+ ```
47
+
48
+ When you pass only one key, a primary key will be added as a second one:
49
+
50
+ ```ruby
51
+ GraphQL::Connections::Stable.new(Message.all, keys: [:name])
52
+ ```
53
+
54
+ **NOTE:** Currently we support maximum two keys in the keyset.
55
+
56
+ Also, you can pass the `:desc` option to reverse the relation:
57
+
58
+ ```ruby
59
+ GraphQL::Connections::Stable.new(Message.all, keys: %w[name id], desc: true)
60
+ ```
61
+
62
+ **NOTE:** `:desc` option is not implemented for stable connections with `:primary_key` passed; if you need it—use keyset pagination or implement `:desc` option for us 🙂.
63
+
64
+ Also, you can disable opaque cursors by setting `opaque_cursor` param:
65
+
66
+ ```ruby
67
+ GraphQL::Connections::Stable.new(Message.all, opaque_cursor: false)
68
+ ```
69
+
34
70
  Or you can apply a stable connection to all Active Record relations returning by any field:
35
71
 
36
72
  ```ruby
37
73
  class ApplicationSchema < GraphQL::Schema
38
- use GraphQL::Pagination::Connections
39
-
40
74
  connections.add(ActiveRecord::Relation, GraphQL::Connections::Stable)
41
75
  end
42
76
  ```
43
77
 
44
- **NOTE:** Don't use stable connections for relations whose ordering is too complicated for cursor generation.
78
+ **NOTE:** Don't use stable connections for relations whose ordering is too complicated for cursor generation.
79
+
80
+ ### Elasticsearch via Chewy
81
+
82
+ Register connection for all Chewy requests:
83
+
84
+ ```ruby
85
+ class ApplicationSchema < GraphQL::Schema
86
+ connections.add(Chewy::Search::Request, GraphQL::Connections::ChewyConnection)
87
+ end
88
+ ```
89
+
90
+ And define field like below:
91
+
92
+ ```ruby
93
+ field :messages, Types::Message.connection_type, null: false
94
+
95
+ def messages
96
+ CitiesIndex.query(match: {name: "Moscow"})
97
+ end
98
+
99
+ **NOTE:** Using `first` and `last`arguments simultaneously is not supported yet.
45
100
 
46
101
  ## Development
47
102
 
@@ -9,3 +9,12 @@ module GraphQL
9
9
  end
10
10
 
11
11
  require "graphql/connections/stable"
12
+
13
+ require "graphql/connections/base"
14
+ require "graphql/connections/key_asc"
15
+
16
+ require "graphql/connections/keyset/base"
17
+ require "graphql/connections/keyset/asc"
18
+ require "graphql/connections/keyset/desc"
19
+
20
+ require "graphql/connections/chewy"
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQL
4
+ module Connections
5
+ # Base class for pagination implementations
6
+ class Base < ::GraphQL::Pagination::Connection
7
+ attr_reader :opaque_cursor
8
+
9
+ delegate :arel_table, to: :items
10
+
11
+ def initialize(*args, opaque_cursor: true, **kwargs)
12
+ @opaque_cursor = opaque_cursor
13
+
14
+ super(*args, **kwargs)
15
+ end
16
+
17
+ def primary_key
18
+ @primary_key ||= items.model.primary_key
19
+ end
20
+
21
+ def nodes
22
+ @nodes ||= limited_relation
23
+ end
24
+
25
+ def has_previous_page # rubocop:disable Naming/PredicateName
26
+ raise NotImplementedError
27
+ end
28
+
29
+ def has_next_page # rubocop:disable Naming/PredicateName
30
+ raise NotImplementedError
31
+ end
32
+
33
+ def cursor_for(item)
34
+ raise NotImplementedError
35
+ end
36
+
37
+ private
38
+
39
+ def serialize(cursor)
40
+ case cursor
41
+ when Time, DateTime, Date
42
+ cursor.iso8601
43
+ else
44
+ cursor.to_s
45
+ end
46
+ end
47
+
48
+ def limited_relation
49
+ raise NotImplementedError
50
+ end
51
+
52
+ def sliced_relation
53
+ raise NotImplementedError
54
+ end
55
+
56
+ def after_cursor
57
+ @after_cursor ||= opaque_cursor ? decode(after) : after
58
+ end
59
+
60
+ def before_cursor
61
+ @before_cursor ||= opaque_cursor ? decode(before) : before
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQL
4
+ module Connections
5
+ class Chewy < ::GraphQL::Pagination::RelationConnection
6
+ private
7
+
8
+ def load_nodes
9
+ @nodes ||= limited_nodes.objects
10
+ end
11
+
12
+ def relation_count(relation)
13
+ offset = relation_offset(relation) || 0
14
+ limit = relation_limit(relation)
15
+ count = relation.count - offset
16
+
17
+ if limit.nil?
18
+ count
19
+ else
20
+ [count, limit].min
21
+ end
22
+ end
23
+
24
+ def relation_limit(relation)
25
+ relation.send(:raw_limit_value)&.to_i
26
+ end
27
+
28
+ def relation_offset(relation)
29
+ relation.send(:raw_offset_value)&.to_i
30
+ end
31
+
32
+ def null_relation(relation)
33
+ relation.none
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQL
4
+ module Connections
5
+ # Implements pagination by one field with asc order
6
+ class KeyAsc < ::GraphQL::Connections::Base
7
+ def initialize(*args, primary_key: nil, **kwargs)
8
+ @primary_key = primary_key
9
+
10
+ super(*args, **kwargs)
11
+ end
12
+
13
+ def has_previous_page # rubocop:disable Naming/PredicateName, Metrics/AbcSize
14
+ if last
15
+ nodes.any? && items.where(arel_table[primary_key].lt(nodes.first[primary_key])).exists?
16
+ elsif after
17
+ items.where(arel_table[primary_key].lteq(after_cursor)).exists?
18
+ else
19
+ false
20
+ end
21
+ end
22
+
23
+ def has_next_page # rubocop:disable Naming/PredicateName, Metrics/AbcSize
24
+ if first
25
+ nodes.any? && items.where(arel_table[primary_key].gt(nodes.last[primary_key])).exists?
26
+ elsif before
27
+ items.where(arel_table[primary_key].gteq(before_cursor)).exists?
28
+ else
29
+ false
30
+ end
31
+ end
32
+
33
+ def cursor_for(item)
34
+ cursor = serialize(item[primary_key])
35
+ cursor = encode(cursor) if opaque_cursor
36
+ cursor
37
+ end
38
+
39
+ private
40
+
41
+ def limited_relation # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
42
+ scope = sliced_relation
43
+ nodes = []
44
+
45
+ if first
46
+ nodes |= scope
47
+ .reorder(arel_table[primary_key].asc)
48
+ .limit(first)
49
+ .to_a
50
+ end
51
+
52
+ if last
53
+ nodes |= scope
54
+ .reorder(arel_table[primary_key].desc)
55
+ .limit(last)
56
+ .to_a.reverse!
57
+ end
58
+
59
+ nodes
60
+ end
61
+
62
+ def sliced_relation # rubocop:disable Metrics/AbcSize
63
+ items
64
+ .yield_self { |s| after ? s.where(arel_table[primary_key].gt(after_cursor)) : s }
65
+ .yield_self { |s| before ? s.where(arel_table[primary_key].lt(before_cursor)) : s }
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQL
4
+ module Connections
5
+ module Keyset
6
+ # Implements keyset pagination by two fields with asc order
7
+ class Asc < ::GraphQL::Connections::Keyset::Base
8
+ # rubocop:disable Naming/PredicateName, Metrics/AbcSize, Metrics/MethodLength
9
+ def has_previous_page
10
+ if last
11
+ nodes.any? &&
12
+ items.where(arel_table[field_key].eq(nodes.first[field_key]))
13
+ .where(arel_table[primary_key].lt(nodes.first[primary_key]))
14
+ .or(items.where(arel_table[field_key].lt(nodes.first[field_key])))
15
+ .exists?
16
+ elsif after
17
+ items
18
+ .where(arel_table[field_key].lt(after_cursor_date))
19
+ .or(
20
+ items.where(arel_table[field_key].eq(after_cursor_date))
21
+ .where(arel_table[primary_key].lt(after_cursor_primary_key))
22
+ ).exists?
23
+ else
24
+ false
25
+ end
26
+ end
27
+
28
+ def has_next_page
29
+ if first
30
+ nodes.any? &&
31
+ items.where(arel_table[field_key].eq(nodes.last[field_key]))
32
+ .where(arel_table[primary_key].gt(nodes.last[primary_key]))
33
+ .or(items.where(arel_table[field_key].gt(nodes.last[field_key])))
34
+ .exists?
35
+ elsif before
36
+ items
37
+ .where(arel_table[field_key].gt(before_cursor_date))
38
+ .or(
39
+ items.where(arel_table[field_key].eq(before_cursor_date))
40
+ .where(arel_table[primary_key].gt(before_cursor_primary_key))
41
+ ).exists?
42
+ else
43
+ false
44
+ end
45
+ end
46
+ # rubocop:enable Naming/PredicateName, Metrics/AbcSize, Metrics/MethodLength
47
+
48
+ private
49
+
50
+ def limited_relation # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
51
+ scope = sliced_relation
52
+ nodes = []
53
+
54
+ if first
55
+ nodes |= scope
56
+ .reorder(arel_table[field_key].asc, arel_table[primary_key].asc)
57
+ .limit(first).to_a
58
+ end
59
+
60
+ if last
61
+ nodes |= scope
62
+ .reorder(arel_table[field_key].desc, arel_table[primary_key].desc)
63
+ .limit(last).to_a.reverse!
64
+ end
65
+
66
+ nodes
67
+ end
68
+
69
+ def sliced_relation_after(relation) # rubocop:disable Metrics/AbcSize
70
+ relation
71
+ .where(arel_table[field_key].eq(after_cursor_date))
72
+ .where(arel_table[primary_key].gt(after_cursor_primary_key))
73
+ .or(relation.where(arel_table[field_key].gt(after_cursor_date)))
74
+ end
75
+
76
+ def sliced_relation_before(relation) # rubocop:disable Metrics/AbcSize
77
+ relation
78
+ .where(arel_table[field_key].eq(before_cursor_date))
79
+ .where(arel_table[primary_key].lt(before_cursor_primary_key))
80
+ .or(relation.where(arel_table[field_key].lt(before_cursor_date)))
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQL
4
+ module Connections
5
+ module Keyset
6
+ # Base class for keyset pagination implementations
7
+ class Base < ::GraphQL::Connections::Base
8
+ attr_reader :field_key
9
+
10
+ SEPARATOR = "/"
11
+
12
+ def initialize(*args, keys:, separator: SEPARATOR, **kwargs)
13
+ @field_key, @primary_key = keys
14
+ @separator = separator
15
+
16
+ super(*args, **kwargs)
17
+ end
18
+
19
+ def cursor_for(item)
20
+ cursor = [item[field_key], item[primary_key]].map { |value| serialize(value) }.join(@separator)
21
+ cursor = encode(cursor) if opaque_cursor
22
+ cursor
23
+ end
24
+
25
+ private
26
+
27
+ def sliced_relation
28
+ items
29
+ .yield_self { |s| after ? sliced_relation_after(s) : s }
30
+ .yield_self { |s| before ? sliced_relation_before(s) : s }
31
+ end
32
+
33
+ def after_cursor_date
34
+ @after_cursor_date ||= after_cursor.first
35
+ end
36
+
37
+ def after_cursor_primary_key
38
+ @after_cursor_primary_key ||= after_cursor.last
39
+ end
40
+
41
+ def after_cursor
42
+ @after_cursor ||= super.split(SEPARATOR)
43
+ end
44
+
45
+ def before_cursor_date
46
+ @before_cursor_date ||= before_cursor.first
47
+ end
48
+
49
+ def before_cursor_primary_key
50
+ @before_cursor_primary_key ||= before_cursor.last
51
+ end
52
+
53
+ def before_cursor
54
+ @before_cursor ||= super.split(SEPARATOR)
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQL
4
+ module Connections
5
+ module Keyset
6
+ # Implements keyset pagination by two fields with desc order
7
+ class Desc < ::GraphQL::Connections::Keyset::Base
8
+ # rubocop:disable Naming/PredicateName, Metrics/AbcSize, Metrics/MethodLength
9
+ def has_previous_page
10
+ if last
11
+ nodes.any? &&
12
+ items.where(arel_table[field_key].eq(nodes.first[field_key]))
13
+ .where(arel_table[primary_key].gt(nodes.first[primary_key]))
14
+ .or(items.where(arel_table[field_key].gt(nodes.first[field_key])))
15
+ .exists?
16
+ elsif after
17
+ items
18
+ .where(arel_table[field_key].gt(after_cursor_date))
19
+ .or(
20
+ items.where(arel_table[field_key].eq(after_cursor_date))
21
+ .where(arel_table[primary_key].gt(after_cursor_primary_key))
22
+ ).exists?
23
+ else
24
+ false
25
+ end
26
+ end
27
+
28
+ def has_next_page
29
+ if first
30
+ nodes.any? &&
31
+ items.where(arel_table[field_key].eq(nodes.last[field_key]))
32
+ .where(arel_table[primary_key].lt(nodes.last[primary_key]))
33
+ .or(items.where(arel_table[field_key].lt(nodes.last[field_key])))
34
+ .exists?
35
+ elsif before
36
+ items
37
+ .where(arel_table[field_key].lt(before_cursor_date))
38
+ .or(
39
+ items.where(arel_table[field_key].eq(before_cursor_date))
40
+ .where(arel_table[primary_key].lt(before_cursor_primary_key))
41
+ ).exists?
42
+ else
43
+ false
44
+ end
45
+ end
46
+ # rubocop:enable Naming/PredicateName, Metrics/AbcSize, Metrics/MethodLength
47
+
48
+ def cursor_for(item)
49
+ cursor = [item[field_key], item[primary_key]].map { |value| serialize(value) }.join(@separator)
50
+ cursor = encode(cursor) if opaque_cursor
51
+ cursor
52
+ end
53
+
54
+ private
55
+
56
+ def limited_relation # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
57
+ scope = sliced_relation
58
+ nodes = []
59
+
60
+ if first
61
+ nodes |= scope
62
+ .reorder(arel_table[field_key].desc, arel_table[primary_key].desc)
63
+ .limit(first).to_a
64
+ end
65
+
66
+ if last
67
+ nodes |= scope
68
+ .reorder(arel_table[field_key].asc, arel_table[primary_key].asc)
69
+ .limit(last)
70
+ .to_a.reverse!
71
+ end
72
+
73
+ nodes
74
+ end
75
+
76
+ def sliced_relation_after(relation) # rubocop:disable Metrics/AbcSize
77
+ relation
78
+ .where(arel_table[field_key].eq(after_cursor_date))
79
+ .where(arel_table[primary_key].lt(after_cursor_primary_key))
80
+ .or(relation.where(arel_table[field_key].lt(after_cursor_date)))
81
+ end
82
+
83
+ def sliced_relation_before(relation) # rubocop:disable Metrics/AbcSize
84
+ relation
85
+ .where(arel_table[field_key].eq(before_cursor_date))
86
+ .where(arel_table[primary_key].gt(before_cursor_primary_key))
87
+ .or(relation.where(arel_table[field_key].gt(before_cursor_date)))
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -11,73 +11,18 @@ module GraphQL
11
11
  #
12
12
  # For more information see GraphQL Cursor Connections Specification
13
13
  # https://relay.dev/graphql/connections.htm
14
- class Stable < ::GraphQL::Pagination::Connection
15
- delegate :arel_table, to: :items
16
- delegate :primary_key, to: "items.model"
14
+ module Stable
15
+ def self.new(*args, desc: false, keys: nil, **kwargs)
16
+ if kwargs[:primary_key] || keys.nil?
17
+ raise NotImplementedError, "desc connection is not implemented yet" if desc
17
18
 
18
- def nodes
19
- @nodes ||= limited_relation
20
- end
21
-
22
- def has_previous_page # rubocop:disable Naming/PredicateName
23
- if last
24
- nodes.any? && items.where(arel_table[primary_key].lt(nodes.first.id)).exists?
25
- elsif after
26
- items.where(arel_table[primary_key].lteq(after_cursor)).exists?
27
- else
28
- false
29
- end
30
- end
31
-
32
- def has_next_page # rubocop:disable Naming/PredicateName
33
- if first
34
- nodes.any? && items.where(arel_table[primary_key].gt(nodes.last.id)).exists?
35
- elsif before
36
- items.where(arel_table[primary_key].gteq(before_cursor)).exists?
37
- else
38
- false
19
+ return GraphQL::Connections::KeyAsc.new(*args, **kwargs)
39
20
  end
40
- end
41
-
42
- def cursor_for(item)
43
- encode(item.id.to_s)
44
- end
45
-
46
- private
47
-
48
- def limited_relation
49
- scope = sliced_relation
50
- nodes = []
51
21
 
52
- if first
53
- nodes |= scope.
54
- reorder(arel_table[primary_key].asc).
55
- limit(first).
56
- to_a
57
- end
58
-
59
- if last
60
- nodes |= scope.
61
- reorder(arel_table[primary_key].desc).
62
- limit(last).
63
- to_a.reverse!
64
- end
65
-
66
- nodes
67
- end
68
-
69
- def sliced_relation
70
- items.
71
- yield_self { |s| after ? s.where(arel_table[primary_key].gt(after_cursor)) : s }.
72
- yield_self { |s| before ? s.where(arel_table[primary_key].lt(before_cursor)) : s }
73
- end
74
-
75
- def after_cursor
76
- @after_cursor ||= decode(after)
77
- end
22
+ raise ArgumentError, "keyset for more that 2 keys is not implemented yet" if keys.length > 2
78
23
 
79
- def before_cursor
80
- @before_cursor ||= decode(before)
24
+ klass = desc ? GraphQL::Connections::Keyset::Desc : GraphQL::Connections::Keyset::Asc
25
+ klass.new(*args, **kwargs.merge(keys: keys))
81
26
  end
82
27
  end
83
28
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module GraphQL
4
4
  module Paging
5
- VERSION = "0.1.0"
5
+ VERSION = "1.1.0"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,27 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphql-connections
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Misha Merkushin
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-07-04 00:00:00.000000000 Z
11
+ date: 2021-07-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '5'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '5'
27
27
  - !ruby/object:Gem::Dependency
@@ -52,6 +52,48 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.16'
55
+ - !ruby/object:Gem::Dependency
56
+ name: factory_bot_rails
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '6.2'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '6.2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: faker
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '2.7'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '2.7'
83
+ - !ruby/object:Gem::Dependency
84
+ name: chewy
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '7.2'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '7.2'
55
97
  - !ruby/object:Gem::Dependency
56
98
  name: combustion
57
99
  requirement: !ruby/object:Gem::Requirement
@@ -114,43 +156,43 @@ dependencies:
114
156
  requirements:
115
157
  - - "~>"
116
158
  - !ruby/object:Gem::Version
117
- version: '4.0'
159
+ version: '5.0'
118
160
  type: :development
119
161
  prerelease: false
120
162
  version_requirements: !ruby/object:Gem::Requirement
121
163
  requirements:
122
164
  - - "~>"
123
165
  - !ruby/object:Gem::Version
124
- version: '4.0'
166
+ version: '5.0'
125
167
  - !ruby/object:Gem::Dependency
126
- name: rubocop
168
+ name: standard
127
169
  requirement: !ruby/object:Gem::Requirement
128
170
  requirements:
129
171
  - - "~>"
130
172
  - !ruby/object:Gem::Version
131
- version: '0.58'
173
+ version: '1.1'
132
174
  type: :development
133
175
  prerelease: false
134
176
  version_requirements: !ruby/object:Gem::Requirement
135
177
  requirements:
136
178
  - - "~>"
137
179
  - !ruby/object:Gem::Version
138
- version: '0.58'
180
+ version: '1.1'
139
181
  - !ruby/object:Gem::Dependency
140
182
  name: test-prof
141
183
  requirement: !ruby/object:Gem::Requirement
142
184
  requirements:
143
185
  - - "~>"
144
186
  - !ruby/object:Gem::Version
145
- version: '0.11'
187
+ version: '1.0'
146
188
  type: :development
147
189
  prerelease: false
148
190
  version_requirements: !ruby/object:Gem::Requirement
149
191
  requirements:
150
192
  - - "~>"
151
193
  - !ruby/object:Gem::Version
152
- version: '0.11'
153
- description:
194
+ version: '1.0'
195
+ description:
154
196
  email:
155
197
  - merkushin.m.s@gmail.com
156
198
  executables: []
@@ -160,6 +202,12 @@ files:
160
202
  - LICENSE.txt
161
203
  - README.md
162
204
  - lib/graphql/connections.rb
205
+ - lib/graphql/connections/base.rb
206
+ - lib/graphql/connections/chewy.rb
207
+ - lib/graphql/connections/key_asc.rb
208
+ - lib/graphql/connections/keyset/asc.rb
209
+ - lib/graphql/connections/keyset/base.rb
210
+ - lib/graphql/connections/keyset/desc.rb
163
211
  - lib/graphql/connections/stable.rb
164
212
  - lib/graphql/connections/version.rb
165
213
  homepage: https://github.com/bibendi/graphql-connections
@@ -167,15 +215,15 @@ licenses:
167
215
  - MIT
168
216
  metadata:
169
217
  allowed_push_host: https://rubygems.org
170
- post_install_message:
218
+ post_install_message:
171
219
  rdoc_options: []
172
220
  require_paths:
173
221
  - lib
174
222
  required_ruby_version: !ruby/object:Gem::Requirement
175
223
  requirements:
176
- - - ">="
224
+ - - ">"
177
225
  - !ruby/object:Gem::Version
178
- version: '0'
226
+ version: '2.5'
179
227
  required_rubygems_version: !ruby/object:Gem::Requirement
180
228
  requirements:
181
229
  - - ">="
@@ -183,7 +231,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
183
231
  version: '0'
184
232
  requirements: []
185
233
  rubygems_version: 3.1.2
186
- signing_key:
234
+ signing_key:
187
235
  specification_version: 4
188
236
  summary: GraphQL cursor-based stable pagination to work with Active Record relations
189
237
  test_files: []