quo 1.0.0.beta2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/.devcontainer/Dockerfile +17 -0
  3. data/.devcontainer/compose.yml +10 -0
  4. data/.devcontainer/devcontainer.json +12 -0
  5. data/Appraisals +4 -12
  6. data/CHANGELOG.md +112 -1
  7. data/CLAUDE.md +19 -0
  8. data/Gemfile +7 -1
  9. data/LICENSE.txt +1 -1
  10. data/README.md +496 -203
  11. data/Rakefile +66 -6
  12. data/UPGRADING.md +216 -0
  13. data/badges/coverage_badge_total.svg +35 -0
  14. data/badges/rubycritic_badge_score.svg +35 -0
  15. data/claude-skill/README.md +100 -0
  16. data/claude-skill/SKILL.md +442 -0
  17. data/claude-skill/references/API_REFERENCE.md +462 -0
  18. data/claude-skill/references/COMPOSITION.md +396 -0
  19. data/claude-skill/references/PAGINATION.md +396 -0
  20. data/claude-skill/references/QUERY_TYPES.md +297 -0
  21. data/claude-skill/references/TRANSFORMERS.md +282 -0
  22. data/context/01-core-architecture.md +247 -0
  23. data/context/02-query-types-implementation.md +355 -0
  24. data/context/03-composition-transformation.md +441 -0
  25. data/context/04-pagination-results.md +485 -0
  26. data/context/05-testing-configuration.md +491 -0
  27. data/context/06-advanced-patterns-examples.md +153 -0
  28. data/gemfiles/rails_8.0.gemfile +10 -5
  29. data/gemfiles/rails_8.1.gemfile +20 -0
  30. data/lib/generators/quo/install/USAGE +21 -0
  31. data/lib/generators/quo/install/install_generator.rb +63 -0
  32. data/lib/quo/collection_backed_query.rb +21 -15
  33. data/lib/quo/collection_results.rb +1 -0
  34. data/lib/quo/composed_collection_backed_query.rb +42 -0
  35. data/lib/quo/composed_instance.rb +144 -0
  36. data/lib/quo/composed_query.rb +43 -178
  37. data/lib/quo/composed_relation_backed_query.rb +42 -0
  38. data/lib/quo/composing/base_strategy.rb +22 -0
  39. data/lib/quo/composing/class_strategy.rb +86 -0
  40. data/lib/quo/composing/class_strategy_registry.rb +31 -0
  41. data/lib/quo/composing/query_classes_strategy.rb +38 -0
  42. data/lib/quo/composing.rb +81 -0
  43. data/lib/quo/engine.rb +1 -0
  44. data/lib/quo/minitest/helpers.rb +14 -24
  45. data/lib/quo/preloadable.rb +1 -0
  46. data/lib/quo/query.rb +22 -5
  47. data/lib/quo/relation_backed_query.rb +24 -18
  48. data/lib/quo/relation_backed_query_specification.rb +44 -25
  49. data/lib/quo/relation_results.rb +1 -0
  50. data/lib/quo/results.rb +31 -2
  51. data/lib/quo/rspec/helpers.rb +15 -26
  52. data/lib/quo/testing/collection_backed_fake.rb +1 -0
  53. data/lib/quo/testing/fake_helpers.rb +30 -0
  54. data/lib/quo/testing/relation_backed_fake.rb +1 -0
  55. data/lib/quo/version.rb +1 -1
  56. data/lib/quo/wrapped_collection_backed_query.rb +21 -0
  57. data/lib/quo/wrapped_relation_backed_query.rb +21 -0
  58. data/lib/quo.rb +8 -0
  59. data/quo.png +0 -0
  60. data/sig/generated/quo/collection_backed_query.rbs +10 -4
  61. data/sig/generated/quo/collection_results.rbs +1 -0
  62. data/sig/generated/quo/composed_collection_backed_query.rbs +25 -0
  63. data/sig/generated/quo/composed_instance.rbs +61 -0
  64. data/sig/generated/quo/composed_query.rbs +23 -56
  65. data/sig/generated/quo/composed_relation_backed_query.rbs +25 -0
  66. data/sig/generated/quo/composing/base_strategy.rbs +16 -0
  67. data/sig/generated/quo/composing/class_strategy.rbs +38 -0
  68. data/sig/generated/quo/composing/class_strategy_registry.rbs +16 -0
  69. data/sig/generated/quo/composing/query_classes_strategy.rbs +24 -0
  70. data/sig/generated/quo/composing.rbs +40 -0
  71. data/sig/generated/quo/engine.rbs +1 -0
  72. data/sig/generated/quo/minitest/helpers.rbs +12 -0
  73. data/sig/generated/quo/preloadable.rbs +1 -0
  74. data/sig/generated/quo/query.rbs +15 -4
  75. data/sig/generated/quo/relation_backed_query.rbs +15 -5
  76. data/sig/generated/quo/relation_backed_query_specification.rbs +47 -39
  77. data/sig/generated/quo/relation_results.rbs +1 -0
  78. data/sig/generated/quo/results.rbs +11 -0
  79. data/sig/generated/quo/rspec/helpers.rbs +12 -0
  80. data/sig/generated/quo/testing/collection_backed_fake.rbs +1 -0
  81. data/sig/generated/quo/testing/fake_helpers.rbs +14 -0
  82. data/sig/generated/quo/testing/relation_backed_fake.rbs +1 -0
  83. data/sig/generated/quo/wrapped_collection_backed_query.rbs +13 -0
  84. data/sig/generated/quo/wrapped_relation_backed_query.rbs +13 -0
  85. data/sig/generated/quo.rbs +1 -0
  86. data/website/.gitignore +6 -0
  87. data/website/.nojekyll +0 -0
  88. data/website/404.html +26 -0
  89. data/website/Gemfile +24 -0
  90. data/website/_config.yml +50 -0
  91. data/website/_data/navigation.yml +8 -0
  92. data/website/_data/sidebar.yml +2 -0
  93. data/website/_data/social_links.yml +3 -0
  94. data/website/_docs/api.md +261 -0
  95. data/website/_docs/get-started.md +289 -0
  96. data/website/assets/quo.png +0 -0
  97. data/website/index.md +141 -0
  98. metadata +70 -13
  99. data/gemfiles/rails_7.0.gemfile +0 -15
  100. data/gemfiles/rails_7.1.gemfile +0 -15
  101. data/gemfiles/rails_7.2.gemfile +0 -15
@@ -1,6 +1,7 @@
1
1
  # Generated from lib/quo/preloadable.rb with RBS::Inline
2
2
 
3
3
  module Quo
4
+ # Mixin for adding preload/includes support to collection-backed queries
4
5
  module Preloadable
5
6
  def self.included: (untyped base) -> untyped
6
7
 
@@ -1,16 +1,21 @@
1
1
  # Generated from lib/quo/query.rb with RBS::Inline
2
2
 
3
3
  module Quo
4
+ # Base class for query objects with pagination and composition support
4
5
  class Query < Literal::Struct
5
6
  include Literal::Types
6
7
 
7
- def self.inspect: () -> untyped
8
+ # @rbs override
9
+ def self.inspect: ...
8
10
 
9
- def self.to_s: () -> untyped
11
+ # @rbs override
12
+ def self.to_s: ...
10
13
 
11
- def inspect: () -> untyped
14
+ # @rbs override
15
+ def inspect: ...
12
16
 
13
- def to_s: () -> untyped
17
+ # @rbs override
18
+ def to_s: ...
14
19
 
15
20
  # TODO: put this in a module with the composer and merge_instances methods
16
21
  # Compose is aliased as `+`. Can optionally take `joins` parameters to add joins on merged relation.
@@ -19,6 +24,12 @@ module Quo
19
24
  # @rbs return: Quo::Query & Quo::ComposedQuery
20
25
  def self.compose: (Quo::Query | ActiveRecord::Relation | Object & Enumerable[untyped] right, ?joins: Symbol | Hash[Symbol, untyped] | Array[Symbol | Hash[Symbol, untyped]]) -> (Quo::Query & Quo::ComposedQuery)
21
26
 
27
+ # Helper method to define properties on a dynamically created class
28
+ # @rbs klass: Class
29
+ # @rbs props: Hash[Symbol, untyped]
30
+ # @rbs return: void
31
+ def self.define_props_on_class: (Class klass, Hash[Symbol, untyped] props) -> void
32
+
22
33
  COERCE_TO_INT: untyped
23
34
 
24
35
  attr_accessor page(): Integer?
@@ -1,12 +1,17 @@
1
1
  # Generated from lib/quo/relation_backed_query.rb with RBS::Inline
2
2
 
3
3
  module Quo
4
+ # Query object backed by ActiveRecord relations
4
5
  class RelationBackedQuery < Query
5
- # @rbs query: ActiveRecord::Relation | Quo::Query
6
+ # @rbs query: ActiveRecord::Relation | Quo::RelationBackedQuery
6
7
  # @rbs props: Hash[Symbol, untyped]
7
- # @rbs &block: () -> ActiveRecord::Relation | Quo::Query | Object & Enumerable[untyped]
8
+ # @rbs &block: ? () -> (ActiveRecord::Relation | Quo::Query)
8
9
  # @rbs return: Quo::RelationBackedQuery
9
- def self.wrap: (?ActiveRecord::Relation | Quo::Query query, ?props: Hash[Symbol, untyped]) ?{ (?) -> untyped } -> Quo::RelationBackedQuery
10
+ def self.wrap: (?ActiveRecord::Relation | Quo::RelationBackedQuery query, ?props: Hash[Symbol, untyped]) ?{ () -> (ActiveRecord::Relation | Quo::Query) } -> Quo::RelationBackedQuery
11
+
12
+ # @rbs relation: ActiveRecord::Relation
13
+ # @rbs return: Quo::WrappedRelationBackedQuery
14
+ def self.from: (ActiveRecord::Relation relation) -> Quo::WrappedRelationBackedQuery
10
15
 
11
16
  # @rbs conditions: untyped?
12
17
  # @rbs return: String
@@ -32,13 +37,18 @@ module Quo
32
37
  # @rbs return: Quo::Query
33
38
  def with: (?Hash[Symbol, untyped] options) -> Quo::Query
34
39
 
40
+ def model: () -> (untyped | nil)
41
+
42
+ def klass: () -> (untyped | nil)
43
+
44
+ # @rbs total_count: Integer?
35
45
  # @rbs return: Quo::CollectionBackedQuery
36
- def to_collection: (?total_count: untyped) -> Quo::CollectionBackedQuery
46
+ def to_collection: (?total_count: Integer?) -> Quo::CollectionBackedQuery
37
47
 
38
48
  def results: () -> Quo::Results
39
49
 
40
50
  # Return the SQL string for this query if its a relation type query object
41
- def to_sql: () -> String
51
+ def to_sql: () -> String?
42
52
 
43
53
  # Implements a fluent API for query methods
44
54
  # This allows methods to be chained like query.where(...).order(...).limit(...)
@@ -13,82 +13,90 @@ module Quo
13
13
  def initialize: (?Hash[Symbol, untyped] options) -> untyped
14
14
 
15
15
  # Creates a new specification with merged options
16
- # @rbs new_options: Hash[Symbol, untyped]
17
- # @rbs return: Quo::QuerySpecification
18
- def merge: (Hash[Symbol, untyped] new_options) -> Quo::QuerySpecification
16
+ # @rbs new_options: Hash[Symbol, untyped] | RelationBackedQuerySpecification
17
+ # @rbs return: Quo::RelationBackedQuerySpecification
18
+ def merge: (Hash[Symbol, untyped] | RelationBackedQuerySpecification new_options) -> Quo::RelationBackedQuerySpecification
19
19
 
20
20
  # Apply all the specification options to the given ActiveRecord relation
21
21
  # @rbs relation: ActiveRecord::Relation
22
22
  # @rbs return: ActiveRecord::Relation
23
23
  def apply_to: (ActiveRecord::Relation relation) -> ActiveRecord::Relation
24
24
 
25
+ # @rbs key: Symbol
26
+ # @rbs return: bool
27
+ def has?: (Symbol key) -> bool
28
+
29
+ # @rbs key: Symbol
30
+ # @rbs return: untyped
31
+ def []: (Symbol key) -> untyped
32
+
25
33
  # @rbs *fields: untyped
26
- # @rbs return: Quo::QuerySpecification
27
- def select: (*untyped fields) -> Quo::QuerySpecification
34
+ # @rbs return: Quo::RelationBackedQuerySpecification
35
+ def select: (*untyped fields) -> Quo::RelationBackedQuerySpecification
28
36
 
29
37
  # @rbs conditions: untyped
30
- # @rbs return: Quo::QuerySpecification
31
- def where: (untyped conditions) -> Quo::QuerySpecification
38
+ # @rbs return: Quo::RelationBackedQuerySpecification
39
+ def where: (untyped conditions) -> Quo::RelationBackedQuerySpecification
32
40
 
33
41
  # @rbs order_clause: untyped
34
- # @rbs return: Quo::QuerySpecification
35
- def order: (untyped order_clause) -> Quo::QuerySpecification
42
+ # @rbs return: Quo::RelationBackedQuerySpecification
43
+ def order: (untyped order_clause) -> Quo::RelationBackedQuerySpecification
36
44
 
37
45
  # @rbs *columns: untyped
38
- # @rbs return: Quo::QuerySpecification
39
- def group: (*untyped columns) -> Quo::QuerySpecification
46
+ # @rbs return: Quo::RelationBackedQuerySpecification
47
+ def group: (*untyped columns) -> Quo::RelationBackedQuerySpecification
40
48
 
41
49
  # @rbs value: Integer
42
- # @rbs return: Quo::QuerySpecification
43
- def limit: (Integer value) -> Quo::QuerySpecification
50
+ # @rbs return: Quo::RelationBackedQuerySpecification
51
+ def limit: (Integer value) -> Quo::RelationBackedQuerySpecification
44
52
 
45
53
  # @rbs value: Integer
46
- # @rbs return: Quo::QuerySpecification
47
- def offset: (Integer value) -> Quo::QuerySpecification
54
+ # @rbs return: Quo::RelationBackedQuerySpecification
55
+ def offset: (Integer value) -> Quo::RelationBackedQuerySpecification
48
56
 
49
- # @rbs tables: untyped
50
- # @rbs return: Quo::QuerySpecification
51
- def joins: (untyped tables) -> Quo::QuerySpecification
57
+ # @rbs *tables: untyped
58
+ # @rbs return: Quo::RelationBackedQuerySpecification
59
+ def joins: (*untyped tables) -> Quo::RelationBackedQuerySpecification
52
60
 
53
- # @rbs tables: untyped
54
- # @rbs return: Quo::QuerySpecification
55
- def left_outer_joins: (untyped tables) -> Quo::QuerySpecification
61
+ # @rbs *tables: untyped
62
+ # @rbs return: Quo::RelationBackedQuerySpecification
63
+ def left_outer_joins: (*untyped tables) -> Quo::RelationBackedQuerySpecification
56
64
 
57
65
  # @rbs *associations: untyped
58
- # @rbs return: Quo::QuerySpecification
59
- def includes: (*untyped associations) -> Quo::QuerySpecification
66
+ # @rbs return: Quo::RelationBackedQuerySpecification
67
+ def includes: (*untyped associations) -> Quo::RelationBackedQuerySpecification
60
68
 
61
69
  # @rbs *associations: untyped
62
- # @rbs return: Quo::QuerySpecification
63
- def preload: (*untyped associations) -> Quo::QuerySpecification
70
+ # @rbs return: Quo::RelationBackedQuerySpecification
71
+ def preload: (*untyped associations) -> Quo::RelationBackedQuerySpecification
64
72
 
65
73
  # @rbs *associations: untyped
66
- # @rbs return: Quo::QuerySpecification
67
- def eager_load: (*untyped associations) -> Quo::QuerySpecification
74
+ # @rbs return: Quo::RelationBackedQuerySpecification
75
+ def eager_load: (*untyped associations) -> Quo::RelationBackedQuerySpecification
68
76
 
69
77
  # @rbs enabled: bool
70
- # @rbs return: Quo::QuerySpecification
71
- def distinct: (?bool enabled) -> Quo::QuerySpecification
78
+ # @rbs return: Quo::RelationBackedQuerySpecification
79
+ def distinct: (?bool enabled) -> Quo::RelationBackedQuerySpecification
72
80
 
73
81
  # @rbs order_clause: untyped
74
- # @rbs return: Quo::QuerySpecification
75
- def reorder: (untyped order_clause) -> Quo::QuerySpecification
82
+ # @rbs return: Quo::RelationBackedQuerySpecification
83
+ def reorder: (untyped order_clause) -> Quo::RelationBackedQuerySpecification
76
84
 
77
85
  # @rbs *modules: untyped
78
- # @rbs return: Quo::QuerySpecification
79
- def extending: (*untyped modules) -> Quo::QuerySpecification
86
+ # @rbs return: Quo::RelationBackedQuerySpecification
87
+ def extending: (*untyped modules) -> Quo::RelationBackedQuerySpecification
80
88
 
81
89
  # @rbs *args: untyped
82
- # @rbs return: Quo::QuerySpecification
83
- def unscope: (*untyped args) -> Quo::QuerySpecification
90
+ # @rbs return: Quo::RelationBackedQuerySpecification
91
+ def unscope: (*untyped args) -> Quo::RelationBackedQuerySpecification
84
92
 
85
93
  # Builds a new specification from a hash of options
86
94
  # @rbs options: Hash[Symbol, untyped]
87
- # @rbs return: Quo::QuerySpecification
88
- def self.build: (?Hash[Symbol, untyped] options) -> Quo::QuerySpecification
95
+ # @rbs return: Quo::RelationBackedQuerySpecification
96
+ def self.build: (?Hash[Symbol, untyped] options) -> Quo::RelationBackedQuerySpecification
89
97
 
90
98
  # Returns a blank specification
91
- # @rbs return: Quo::QuerySpecification
92
- def self.blank: () -> Quo::QuerySpecification
99
+ # @rbs return: Quo::RelationBackedQuerySpecification
100
+ def self.blank: () -> Quo::RelationBackedQuerySpecification
93
101
  end
94
102
  end
@@ -1,6 +1,7 @@
1
1
  # Generated from lib/quo/relation_results.rb with RBS::Inline
2
2
 
3
3
  module Quo
4
+ # Results wrapper for relation-backed queries providing pagination and counting
4
5
  class RelationResults < Results
5
6
  # @rbs query: Quo::Query
6
7
  # @rbs transformer: (^(untyped, ?Integer) -> untyped)?
@@ -1,6 +1,7 @@
1
1
  # Generated from lib/quo/results.rb with RBS::Inline
2
2
 
3
3
  module Quo
4
+ # Base results wrapper providing enumeration with optional transformation
4
5
  class Results
5
6
  def empty?: () -> bool
6
7
 
@@ -13,6 +14,12 @@ module Quo
13
14
  # Alias for page_count
14
15
  def page_size: () -> Integer
15
16
 
17
+ FILTER_METHODS: untyped
18
+
19
+ PAIR_FILTER_METHODS: untyped
20
+
21
+ PASSTHROUGH_METHODS: untyped
22
+
16
23
  # @rbs &block: (untyped, *untyped) -> untyped
17
24
  # @rbs return: Hash[untyped, Array[untyped]]
18
25
  def group_by: () { (untyped, *untyped) -> untyped } -> Hash[untyped, Array[untyped]]
@@ -35,5 +42,9 @@ module Quo
35
42
  # @rbs results: untyped
36
43
  # @rbs return: untyped
37
44
  def transform_results: (untyped results) -> untyped
45
+
46
+ # @rbs pair: untyped
47
+ # @rbs return: untyped
48
+ def transform_pair: (untyped pair) -> untyped
38
49
  end
39
50
  end
@@ -0,0 +1,12 @@
1
+ # Generated from lib/quo/rspec/helpers.rb with RBS::Inline
2
+
3
+ module Quo
4
+ module Rspec
5
+ # Test helpers for stubbing query objects in RSpec
6
+ module Helpers
7
+ include Quo::Testing::FakeHelpers
8
+
9
+ def fake_query: (untyped query_class, ?with: untyped, ?results: untyped, ?total_count: untyped, ?page_count: untyped) ?{ (?) -> untyped } -> untyped
10
+ end
11
+ end
12
+ end
@@ -2,6 +2,7 @@
2
2
 
3
3
  module Quo
4
4
  module Testing
5
+ # Test helper for creating fake collection-backed queries with predefined results
5
6
  class CollectionBackedFake
6
7
  def collection: () -> untyped
7
8
 
@@ -0,0 +1,14 @@
1
+ # Generated from lib/quo/testing/fake_helpers.rb with RBS::Inline
2
+
3
+ module Quo
4
+ module Testing
5
+ # Shared helpers for creating fake query objects in tests
6
+ module FakeHelpers
7
+ private
8
+
9
+ # @rbs query_class: Class
10
+ # @rbs return: Class
11
+ def build_fake_class: (Class query_class) -> Class
12
+ end
13
+ end
14
+ end
@@ -2,6 +2,7 @@
2
2
 
3
3
  module Quo
4
4
  module Testing
5
+ # Test helper for creating fake relation-backed queries with predefined results
5
6
  class RelationBackedFake
6
7
  def query: () -> untyped
7
8
 
@@ -0,0 +1,13 @@
1
+ # Generated from lib/quo/wrapped_collection_backed_query.rb with RBS::Inline
2
+
3
+ module Quo
4
+ class WrappedCollectionBackedQuery
5
+ @wrapped: Enumerable[untyped]
6
+
7
+ # @rbs override
8
+ def collection: ...
9
+
10
+ # @rbs override
11
+ def inspect: ...
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # Generated from lib/quo/wrapped_relation_backed_query.rb with RBS::Inline
2
+
3
+ module Quo
4
+ class WrappedRelationBackedQuery
5
+ @wrapped: ActiveRecord::Relation
6
+
7
+ # @rbs override
8
+ def query: ...
9
+
10
+ # @rbs override
11
+ def inspect: ...
12
+ end
13
+ end
@@ -1,5 +1,6 @@
1
1
  # Generated from lib/quo.rb with RBS::Inline
2
2
 
3
+ # Query object library for ActiveRecord with composable queries and pagination
3
4
  module Quo
4
5
  extend ActiveSupport::Autoload
5
6
 
@@ -0,0 +1,6 @@
1
+ _site
2
+ .sass-cache
3
+ .jekyll-cache
4
+ .jekyll-metadata
5
+ vendor
6
+ Gemfile.lock
data/website/.nojekyll ADDED
File without changes
data/website/404.html ADDED
@@ -0,0 +1,26 @@
1
+ ---
2
+ permalink: /404.html
3
+ layout: default
4
+ title: Page not found
5
+ ---
6
+
7
+ <style type="text/css" media="screen">
8
+ .container {
9
+ margin: 10px auto;
10
+ max-width: 600px;
11
+ text-align: center;
12
+ }
13
+ h1 {
14
+ margin: 30px 0;
15
+ font-size: 4em;
16
+ line-height: 1;
17
+ letter-spacing: -1px;
18
+ }
19
+ </style>
20
+
21
+ <div class="container">
22
+ <h1>404</h1>
23
+
24
+ <p><strong>Page not found</strong></p>
25
+ <p>The requested page could not be found.</p>
26
+ </div>
data/website/Gemfile ADDED
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "jekyll", "~> 4.4"
6
+ gem "jekyll-vitepress-theme", "~> 1.4"
7
+
8
+ group :jekyll_plugins do
9
+ gem "jekyll-feed", "~> 0.12"
10
+ end
11
+
12
+ # Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem
13
+ # and associated library.
14
+ platforms :mingw, :x64_mingw, :mswin, :jruby do
15
+ gem "tzinfo", ">= 1", "< 3"
16
+ gem "tzinfo-data"
17
+ end
18
+
19
+ # Performance-booster for watching directories on Windows
20
+ gem "wdm", "~> 0.1", platforms: [:mingw, :x64_mingw, :mswin]
21
+
22
+ # Lock `http_parser.rb` gem to `v0.6.x` on JRuby builds since newer versions of the gem
23
+ # do not have a Java counterpart.
24
+ gem "http_parser.rb", "~> 0.6.0", platforms: [:jruby]
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ title: Quo
4
+ email: stevegeek@gmail.com
5
+ description: >-
6
+ Quo is a query object gem for Ruby on Rails. Query objects are composable, testable, and reusable.
7
+ Build complex database queries and collection transformations with a clean, fluent API.
8
+ baseurl: ""
9
+ url: ""
10
+ github_username: stevegeek
11
+ github_repo: quo
12
+
13
+ theme: jekyll-vitepress-theme
14
+ plugins:
15
+ - jekyll-feed
16
+ - jekyll-vitepress-theme
17
+
18
+ collections:
19
+ docs:
20
+ output: true
21
+ permalink: /:path/
22
+
23
+ defaults:
24
+ - scope:
25
+ path: ""
26
+ type: docs
27
+ values:
28
+ layout: default
29
+
30
+ jekyll_vitepress:
31
+ branding:
32
+ site_title: Quo
33
+ logo:
34
+ default: /assets/quo.png
35
+ alt: Quo
36
+ width: 28
37
+ height: 28
38
+ syntax:
39
+ light_theme: github
40
+ dark_theme: github.dark
41
+ github_star:
42
+ repository: stevegeek/quo
43
+ text: Star
44
+ show_count: true
45
+ footer:
46
+ enabled: true
47
+ show_on_docs: true
48
+ copyright: >-
49
+ Quo | Copyright &copy; 2025. Licensed under the
50
+ <a href="https://github.com/stevegeek/quo/blob/main/LICENSE.txt">MIT License</a>.
@@ -0,0 +1,8 @@
1
+ - title: Guide
2
+ url: /get-started/
3
+ collections: [docs]
4
+ - title: API
5
+ url: /api/
6
+ collections: [docs]
7
+ - title: GitHub
8
+ url: https://github.com/stevegeek/quo
@@ -0,0 +1,2 @@
1
+ - title: Documentation
2
+ collection: docs
@@ -0,0 +1,3 @@
1
+ - icon: github
2
+ label: Quo on GitHub
3
+ url: https://github.com/stevegeek/quo