quo 0.1.0 → 0.2.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: 5abae18b00be2197c2d35ed322af099766deaaa13f77f14fe53f597f2ed544b2
4
- data.tar.gz: 95e1b9e161ad9e4d6fb627194cc6b408878945aa08c43ef498bbbfa0ea5c3dd3
3
+ metadata.gz: 6f8a79b64bd0db1439df6ffcfb820786ed082405bb24d56ac2ac08cb47c052b7
4
+ data.tar.gz: 0b46427745aa9433130c4ec495cf2c9d79bff517b00ea99f17029b3a2714b604
5
5
  SHA512:
6
- metadata.gz: 9c6ce18b7bb3de2243561ad14da26117e7053a0c04255dc94b8408d942a1382e2c4eb2c6071c22f52d1a7cef9bf9fceeeb7746788f921c0c1c6a9896fa2f4717
7
- data.tar.gz: 063f2dd88dcd09bd1b3778b8c6bc77b09a000daae113425fc3c7152c058c2e836cb5630fa58ef060fb099179eddf6119592e25e51cb7ad0380791cd7468a1cac
6
+ metadata.gz: 514f649e606616d7a46de0c409b4c3f635c11fe900f179e0f94952a594adb49877e82ced68e9541e2dd398e2b0e35e9ea8ff1c4995701ed8f30361de48f8ae78
7
+ data.tar.gz: 7562f9cfc712ac473e6a32bb1c9f5b9e88123fb0abaa696f29dbf24e90dcedaaf716d42e0cd8bf6b8a5594a6f888fbf20f3e2b665ff9dda108ddc7ededfbe9a9
data/Gemfile CHANGED
@@ -5,12 +5,16 @@ source "https://rubygems.org"
5
5
  # Specify your gem's dependencies in quo.gemspec
6
6
  gemspec
7
7
 
8
- gem "sqlite3"
8
+ group :development, :test do
9
+ gem "sqlite3"
9
10
 
10
- gem "rails", ">= 6"
11
+ gem "rails", ">= 6", "< 8"
11
12
 
12
- gem "rake", "~> 13.0"
13
+ gem "rake", "~> 13.0"
13
14
 
14
- gem "minitest", "~> 5.0"
15
+ gem "minitest", "~> 5.0"
15
16
 
16
- gem "standard", "~> 1.3"
17
+ gem "standard", "~> 1.3"
18
+
19
+ gem "steep", "~> 1.2"
20
+ end
data/README.md CHANGED
@@ -148,9 +148,14 @@ class RegistrationToBeApproved < Quo::Query
148
148
  def query
149
149
  done = Registration.where(step: "complete")
150
150
  approved = CompanyToBeApproved.new
151
- done + approved
151
+ # Here we use `.compose` utility method to wrap our Relation in a Query and
152
+ # then compose with the other Query
153
+ Quo::Query.compose(done, approved)
152
154
  end
153
155
  end
156
+
157
+ # A Relation can be composed directly to a Quo::Query
158
+ query = RegistrationToBeApproved.new + Registration.where(blocked: false)
154
159
  ```
155
160
 
156
161
  Also you can use joins:
data/Steepfile ADDED
@@ -0,0 +1,34 @@
1
+ # D = Steep::Diagnostic
2
+ #
3
+ # target :lib do
4
+ # signature "sig"
5
+ #
6
+ # check "lib" # Directory name
7
+ # check "Gemfile" # File name
8
+ # check "app/models/**/*.rb" # Glob
9
+ # # ignore "lib/templates/*.rb"
10
+ #
11
+ # # library "pathname", "set" # Standard libraries
12
+ # # library "strong_json" # Gems
13
+ #
14
+ # # configure_code_diagnostics(D::Ruby.strict) # `strict` diagnostics setting
15
+ # # configure_code_diagnostics(D::Ruby.lenient) # `lenient` diagnostics setting
16
+ # # configure_code_diagnostics do |hash| # You can setup everything yourself
17
+ # # hash[D::Ruby::NoMethod] = :information
18
+ # # end
19
+ # end
20
+
21
+ # target :test do
22
+ # signature "sig", "sig-private"
23
+ #
24
+ # check "test"
25
+ #
26
+ # # library "pathname", "set" # Standard libraries
27
+ # end
28
+
29
+ target :lib do
30
+ check "lib/quo"
31
+ signature "sig"
32
+
33
+ library "forwardable"
34
+ end
@@ -7,7 +7,9 @@ module Quo
7
7
  super(**options.except(:collection))
8
8
  end
9
9
 
10
- # Optionally return the `total_count` option
10
+ # Optionally return the `total_count` option if it has been set.
11
+ # This is useful when the total count is known and not equal to size
12
+ # of wrapped collection.
11
13
  def count
12
14
  options[:total_count] || super
13
15
  end
@@ -19,7 +21,6 @@ module Quo
19
21
  options[:total_count].nil? && current_page.present?
20
22
  end
21
23
 
22
- # Return the underlying collection
23
24
  def query
24
25
  preload_includes(collection) if options[:includes]
25
26
  collection
@@ -33,7 +34,7 @@ module Quo
33
34
  true
34
35
  end
35
36
 
36
- protected
37
+ private
37
38
 
38
39
  attr_reader :collection
39
40
 
@@ -53,8 +53,8 @@ module Quo
53
53
  end
54
54
  end
55
55
 
56
- def respond_to_missing?(method, include_private = false)
57
- Enumerable.instance_methods.include?(method) || super
56
+ def respond_to_missing?(name, include_private = false)
57
+ Enumerable.instance_methods.include?(name)
58
58
  end
59
59
 
60
60
  private
data/lib/quo/query.rb CHANGED
@@ -14,12 +14,10 @@ module Quo
14
14
  extend Quo::Utilities::Wrap
15
15
 
16
16
  class << self
17
- # Execute the query and return the first item
18
17
  def call(**options)
19
18
  new(**options).first
20
19
  end
21
20
 
22
- # Execute the query and return the first item, or raise an error if no item is found
23
21
  def call!(**options)
24
22
  new(**options).first!
25
23
  end
@@ -201,7 +199,7 @@ module Quo
201
199
 
202
200
  delegate :distinct, to: :configured_query
203
201
 
204
- protected
202
+ private
205
203
 
206
204
  def formatted_queries?
207
205
  Quo.configuration&.formatted_query_log
@@ -20,15 +20,18 @@ module Quo
20
20
  attr_reader :left, :right, :joins
21
21
 
22
22
  def merge
23
- left_rel, right_rel = unwrap_relations
24
- left_type, right_type = relation_types?
23
+ left_rel = unwrap_relation(left)
24
+ right_rel = unwrap_relation(right)
25
+ left_type = relation_type?(left)
26
+ right_type = relation_type?(right)
27
+
25
28
  if both_relations?(left_type, right_type)
26
29
  apply_joins(left_rel, joins).merge(right_rel)
27
30
  elsif left_relation_right_eager?(left_type, right_type)
28
31
  left_rel.to_a + right_rel
29
- elsif left_eager_right_relation?(left_rel, left_type, right_type)
32
+ elsif left_eager_right_relation?(left_type, right_type) && left_rel.respond_to?(:+)
30
33
  left_rel + right_rel.to_a
31
- elsif both_eager_loaded?(left_rel, left_type, right_type)
34
+ elsif both_eager_loaded?(left_type, right_type) && left_rel.respond_to?(:+)
32
35
  left_rel + right_rel
33
36
  else
34
37
  raise_error
@@ -42,13 +45,15 @@ module Quo
42
45
  {}
43
46
  end
44
47
 
45
- def relation_types?
46
- [left, right].map do |query|
47
- if query.is_a?(Quo::Query)
48
- query.relation?
49
- else
50
- query.is_a?(ActiveRecord::Relation)
51
- end
48
+ def unwrap_relation(query)
49
+ query.is_a?(Quo::Query) ? query.unwrap : query
50
+ end
51
+
52
+ def relation_type?(query)
53
+ if query.is_a?(::Quo::Query)
54
+ query.relation?
55
+ else
56
+ query.is_a?(::ActiveRecord::Relation)
52
57
  end
53
58
  end
54
59
 
@@ -64,16 +69,12 @@ module Quo
64
69
  left_rel_type && !right_rel_type
65
70
  end
66
71
 
67
- def left_eager_right_relation?(left_rel, left_rel_type, right_rel_type)
68
- !left_rel_type && right_rel_type && left_rel.respond_to?(:+)
69
- end
70
-
71
- def both_eager_loaded?(left_rel, left_rel_type, right_rel_type)
72
- !left_rel_type && !right_rel_type && left_rel.respond_to?(:+)
72
+ def left_eager_right_relation?(left_rel_type, right_rel_type)
73
+ !left_rel_type && right_rel_type
73
74
  end
74
75
 
75
- def unwrap_relations
76
- [left, right].map { |query| query.is_a?(Quo::Query) ? query.unwrap : query }
76
+ def both_eager_loaded?(left_rel_type, right_rel_type)
77
+ !left_rel_type && !right_rel_type
77
78
  end
78
79
 
79
80
  def raise_error
data/lib/quo/railtie.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module Quo
2
2
  class Railtie < ::Rails::Railtie
3
- # rake_tasks do
4
- # load "tasks/quo.rake"
5
- # end
3
+ rake_tasks do
4
+ load "tasks/quo.rake"
5
+ end
6
6
  end
7
7
  end
@@ -2,15 +2,14 @@
2
2
 
3
3
  module Quo
4
4
  module Utilities
5
+ # Combine two query-like or composeable entities:
6
+ # These can be Quo::Query, Quo::MergedQuery, Quo::EagerQuery and ActiveRecord::Relations.
7
+ # See the `README.md` docs for more details.
5
8
  module Compose
6
- # Combine two query-like or composeable entities:
7
- # These can be Quo::Query, Quo::MergedQuery, Quo::EagerQuery and ActiveRecord::Relations.
8
- # See the `README.md` docs for more details.
9
9
  def compose(query1, query2, joins = nil)
10
10
  Quo::QueryComposer.new(query1, query2, joins).compose
11
11
  end
12
12
 
13
- # Determines if the object `query` is something which can be composed with query objects
14
13
  def composable_with?(query)
15
14
  query.is_a?(Quo::Query) || query.is_a?(ActiveRecord::Relation)
16
15
  end
@@ -3,7 +3,6 @@
3
3
  module Quo
4
4
  module Utilities
5
5
  module Sanitize
6
- # ActiveRecord::Sanitization wrappers
7
6
  def sanitize_sql_for_conditions(conditions)
8
7
  ActiveRecord::Base.sanitize_sql_for_conditions(conditions)
9
8
  end
@@ -2,17 +2,21 @@
2
2
 
3
3
  module Quo
4
4
  module Utilities
5
+ # Wrap a ActiveRecord::Relation or data collection in a Query.
6
+ #
7
+ # If the passed in object is already a Query object then just return it or copy it if new options are passed in.
8
+ # Otherwise if a Relation wrap it in a new Query object or else in an EagerQuery .
5
9
  module Wrap
6
- # Wrap a relation in a Query. If the passed in object is already a query object then just return it
7
10
  def wrap(query_rel_or_data, **options)
8
- if query_rel_or_data.is_a?(Quo::Query) && options.present?
9
- return query_rel_or_data.copy(**options)
11
+ if query_rel_or_data.is_a? Quo::Query
12
+ return options.present? ? query_rel_or_data.copy(**options) : query_rel_or_data
10
13
  end
11
- return query_rel_or_data if query_rel_or_data.is_a? Quo::Query
14
+
12
15
  if query_rel_or_data.is_a? ActiveRecord::Relation
13
- return new(**options.merge(scope: query_rel_or_data))
16
+ new(**options.merge(scope: query_rel_or_data))
17
+ else
18
+ Quo::EagerQuery.new(**options.merge(collection: query_rel_or_data))
14
19
  end
15
- Quo::EagerQuery.new(**options.merge(collection: query_rel_or_data))
16
20
  end
17
21
  end
18
22
  end
data/lib/quo/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Quo
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.0"
5
5
  end
data/lib/quo.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "quo/version"
4
+ require_relative "quo/railtie" if defined?(Rails)
4
5
  require_relative "quo/query"
5
6
  require_relative "quo/eager_query"
6
7
  require_relative "quo/merged_query"
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ desc "List all the query objects in the app"
4
+ namespace :quo do
5
+ task list: :environment do
6
+ # In development classes are lazily loaded, so can't use Quo::Query.descendants.
7
+ # Instead we search all *_query.rb files
8
+ Dir["#{Rails.root}/**/*_query.rb"].each do |file|
9
+ source_code = File.read(file)
10
+ result = source_code.match(/class\s+([A-Za-z0-9_:]+)\s*<\s*(::)?Quo::Query/)
11
+ puts (result && result[1]) ? "\n\n> #{result[1]}" : "Class name could not be determined"
12
+ puts "\n"
13
+ comments = source_code.match(/((#[^\n]+\n)*)[^\n]+lass/)
14
+ puts (comments && comments[1].present?) ? comments[1] : "No description for class found"
15
+ puts "\n"
16
+ puts "Found in:"
17
+ puts " - #{file}"
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,26 @@
1
+ # Download sources
2
+ sources:
3
+ - name: ruby/gem_rbs_collection
4
+ remote: https://github.com/ruby/gem_rbs_collection.git
5
+ revision: main
6
+ repo_dir: gems
7
+
8
+ # A directory to install the downloaded RBSs
9
+ path: .gem_rbs_collection
10
+
11
+ gems:
12
+ - name: quo
13
+ ignore: true
14
+ - name: forwardable
15
+ # Skip loading rbs gem's RBS.
16
+ # It's unnecessary if you don't use rbs as a library.
17
+ - name: rbs
18
+ ignore: true
19
+ - name: rake
20
+ ignore: true
21
+ - name: minitest
22
+ ignore: true
23
+ - name: standard
24
+ ignore: true
25
+ - name: steep
26
+ ignore: true
data/sig/quo.rbs CHANGED
@@ -1,4 +1,205 @@
1
1
  module Quo
2
2
  VERSION: String
3
- # See the writing guide of rbs: https://github.com/ruby/rbs#guides
3
+
4
+ interface _Enumerable
5
+ def each: { (untyped) -> void } -> untyped
6
+ end
7
+
8
+ interface _Collection
9
+ include _Enumerable
10
+ def is_a?: (Class) -> bool
11
+ def class: -> Class
12
+ def +: (untyped) -> _Collection
13
+ end
14
+
15
+ type query = Quo::MergedQuery | Quo::EagerQuery | Quo::Query
16
+ type merge_composable = query | ActiveRecord::Relation
17
+ type enumerable = _Collection
18
+ type query_like = ActiveRecord::Relation | enumerable
19
+ type composable = query | query_like
20
+
21
+ module Utilities
22
+ module Callstack
23
+ def debug_callstack: () -> void
24
+ end
25
+
26
+ module Compose
27
+ # Combine two query-like or composeable entities:
28
+ # These can be Quo::Query, Quo::MergedQuery, Quo::EagerQuery and ActiveRecord::Relations.
29
+ # See the `README.md` docs for more details.
30
+ def compose: (composable query1, composable query2, ?untyped? joins) -> Quo::MergedQuery
31
+
32
+ # Determines if the object `query` is something which can be composed with query objects
33
+ def composable_with?: (merge_composable query) -> bool
34
+ end
35
+
36
+ module Sanitize
37
+ def sanitize_sql_for_conditions: (untyped conditions) -> (untyped | nil)
38
+
39
+ def sanitize_sql_string: (untyped string) -> (untyped | nil)
40
+
41
+ def sanitize_sql_parameter: (untyped value) -> (untyped | nil)
42
+ end
43
+
44
+ interface _Wrapable
45
+ def new: (**untyped options) -> query
46
+ end
47
+
48
+ module Wrap : _Wrapable
49
+ def wrap: (composable query_rel_or_data, **untyped options) -> query
50
+ end
51
+
52
+ end
53
+
54
+ class Enumerator
55
+ extend Forwardable
56
+
57
+ include Quo::Utilities::Callstack
58
+
59
+ def initialize: (Quo::Query query, ?transformer: ^(untyped, ?Integer) -> untyped) -> void
60
+
61
+ @query: Quo::Query
62
+
63
+ def respond_to_missing?: (Symbol name, ?bool include_private) -> bool
64
+
65
+ private
66
+
67
+ attr_reader transformer: ^(untyped, ?Integer) -> untyped
68
+ attr_reader unwrapped: ActiveRecord::Relation
69
+
70
+ def transform_results: (untyped) -> untyped
71
+ end
72
+
73
+
74
+ class Query
75
+ include Quo::Utilities::Callstack
76
+ extend Quo::Utilities::Compose
77
+ extend Quo::Utilities::Sanitize
78
+ extend Quo::Utilities::Wrap
79
+
80
+ def self.call: (**untyped options) -> untyped
81
+ def self.call!: (**untyped options) -> untyped
82
+ def self.description: (?String) -> (String | nil)
83
+ self.@description: String | nil
84
+
85
+ @scope: ActiveRecord::Relation | nil
86
+
87
+ attr_reader current_page: (Integer | nil)
88
+ attr_reader page_size: (Integer | nil)
89
+ attr_reader options: Hash[untyped, untyped]
90
+
91
+ def initialize: (**untyped options) -> void
92
+ def query: () -> composable
93
+ def compose: (composable right, ?untyped? joins) -> Quo::MergedQuery
94
+ alias + compose
95
+
96
+ def copy: (**untyped options) -> query
97
+
98
+ def limit: (untyped limit) -> query
99
+ def order: (untyped options) -> query
100
+ def group: (*untyped options) -> query
101
+ def includes: (*untyped options) -> query
102
+ def preload: (*untyped options) -> query
103
+ def select: (*untyped options) -> query
104
+
105
+ def sum: (?untyped column_name) -> Numeric
106
+ def average: (untyped column_name) -> Numeric
107
+ def minimum: (untyped column_name) -> Numeric
108
+ def maximum: (untyped column_name) -> Numeric
109
+ def count: () -> Integer
110
+
111
+ alias total_count count
112
+
113
+ alias size count
114
+ def page_count: () -> Integer
115
+ def first: (*untyped args) -> untyped
116
+ def first!: (*untyped args) -> untyped
117
+ def last: (*untyped args) -> untyped
118
+ def to_a: () -> Array[untyped]
119
+ def to_eager: (?::Hash[untyped, untyped] more_opts) -> Quo::EagerQuery
120
+ alias load to_eager
121
+ def enumerator: () -> Quo::Enumerator
122
+
123
+ # Set a block used to transform data after query fetching
124
+ def transform: () ?{ () -> untyped } -> self
125
+
126
+ def exists?: () -> bool
127
+ def none?: () -> bool
128
+ alias empty? none?
129
+ def relation?: () -> bool
130
+ def eager?: () -> bool
131
+ def paged?: () -> bool
132
+
133
+ def model: () -> (untyped | nil)
134
+ def klass: () -> (untyped | nil)
135
+
136
+ def transform?: () -> bool
137
+ def to_sql: () -> (String | nil)
138
+ def unwrap: () -> query_like
139
+
140
+ private
141
+
142
+ def formatted_queries?: () -> bool
143
+ def trim_query: (String sql) -> String
144
+ def format_query: (String sql_str) -> String
145
+ def transformer: () -> (nil | ^(untyped) -> untyped)
146
+ def offset: () -> Integer
147
+ def configured_query: () -> ActiveRecord::Relation
148
+ def sanitised_page_size: () -> Integer
149
+ def query_with_logging: () -> ActiveRecord::Relation
150
+ def underlying_query: () -> ActiveRecord::Relation
151
+ def unwrap_relation: (composable query) -> ActiveRecord::Relation
152
+ def test_eager: (composable rel) -> bool
153
+ def test_relation: (composable rel) -> bool
154
+ end
155
+
156
+ class MergedQuery < Quo::Query
157
+ def initialize: (untyped options, ?untyped source_queries) -> void
158
+
159
+ def query: () -> composable
160
+
161
+ def to_s: () -> ::String
162
+
163
+ private
164
+
165
+ def source_queries_left: () -> composable
166
+ def source_queries_right: () -> composable
167
+ attr_reader source_queries: Array[composable]
168
+ def operand_desc: (untyped operand) -> (nil | String)
169
+ end
170
+
171
+ class EagerQuery < Quo::Query
172
+ def initialize: (**untyped options) -> void
173
+ def query: () -> enumerable
174
+ def relation?: () -> false
175
+ def eager?: () -> true
176
+ attr_reader collection: enumerable
177
+
178
+ private
179
+
180
+ def preload_includes: (untyped records, ?untyped? preload) -> untyped
181
+ end
182
+
183
+ class QueryComposer
184
+ def initialize: (composable left, composable right, ?untyped? joins) -> void
185
+ def compose: () -> Quo::MergedQuery
186
+
187
+ private
188
+
189
+ attr_reader left: composable
190
+ attr_reader right: composable
191
+ attr_reader joins: untyped
192
+
193
+ def merge: () -> (ActiveRecord::Relation | Array[untyped] | void)
194
+ def merged_options: () -> ::Hash[untyped, untyped]
195
+ def unwrap_relation: (composable) -> query_like
196
+ def relation_type?: (composable) -> bool
197
+ def apply_joins: (ActiveRecord::Relation left_rel, untyped joins) -> ActiveRecord::Relation
198
+ def both_relations?: (bool left_rel_type, bool right_rel_type) -> bool
199
+ def left_relation_right_eager?: (bool left_rel_type, bool right_rel_type) -> bool
200
+ def left_eager_right_relation?: (bool left_rel_type, bool right_rel_type) -> bool
201
+ def both_eager_loaded?: (bool left_rel_type, bool right_rel_type) -> bool
202
+
203
+ def raise_error: () -> void
204
+ end
4
205
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: quo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephen Ierodiaconou
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-11-22 00:00:00.000000000 Z
11
+ date: 2022-12-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -17,6 +17,9 @@ dependencies:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '6'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '8'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -24,6 +27,29 @@ dependencies:
24
27
  - - ">="
25
28
  - !ruby/object:Gem::Version
26
29
  version: '6'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '8'
33
+ - !ruby/object:Gem::Dependency
34
+ name: activesupport
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '6'
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '8'
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '6'
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '8'
27
53
  description: Quo query objects are composable.
28
54
  email:
29
55
  - stevegeek@gmail.com
@@ -37,6 +63,7 @@ files:
37
63
  - LICENSE.txt
38
64
  - README.md
39
65
  - Rakefile
66
+ - Steepfile
40
67
  - lib/quo.rb
41
68
  - lib/quo/eager_query.rb
42
69
  - lib/quo/enumerator.rb
@@ -50,6 +77,8 @@ files:
50
77
  - lib/quo/utilities/sanitize.rb
51
78
  - lib/quo/utilities/wrap.rb
52
79
  - lib/quo/version.rb
80
+ - lib/tasks/quo.rake
81
+ - rbs_collection.yaml
53
82
  - sig/quo.rbs
54
83
  homepage: https://github.com/stevegeek/quo
55
84
  licenses:
@@ -72,7 +101,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
72
101
  - !ruby/object:Gem::Version
73
102
  version: '0'
74
103
  requirements: []
75
- rubygems_version: 3.3.7
104
+ rubygems_version: 3.3.26
76
105
  signing_key:
77
106
  specification_version: 4
78
107
  summary: Quo is a query object gem for Rails