querylane 0.1.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 (68) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +84 -0
  3. data/CONTRIBUTING.md +118 -0
  4. data/LICENSE +21 -0
  5. data/README.md +287 -0
  6. data/SECURITY.md +29 -0
  7. data/app/assets/stylesheets/querylane.css +300 -0
  8. data/app/helpers/querylane/search_helper.rb +111 -0
  9. data/app/javascript/querylane/controllers/box_controller.js +170 -0
  10. data/app/javascript/querylane/controllers/options_controller.js +54 -0
  11. data/app/javascript/querylane/controllers/results_controller.js +137 -0
  12. data/app/javascript/querylane/controllers/suggest_controller.js +187 -0
  13. data/app/javascript/querylane/index.js +33 -0
  14. data/app/javascript/querylane/overlay.js +46 -0
  15. data/app/javascript/querylane/package.json +7 -0
  16. data/app/views/querylane/_chips.html.erb +15 -0
  17. data/app/views/querylane/_denied.html.erb +6 -0
  18. data/app/views/querylane/_empty.html.erb +17 -0
  19. data/app/views/querylane/_facets.html.erb +30 -0
  20. data/app/views/querylane/_first_load.html.erb +15 -0
  21. data/app/views/querylane/_form.html.erb +46 -0
  22. data/app/views/querylane/_group.html.erb +21 -0
  23. data/app/views/querylane/_help.html.erb +29 -0
  24. data/app/views/querylane/_options.html.erb +32 -0
  25. data/app/views/querylane/_options_row.html.erb +51 -0
  26. data/app/views/querylane/_outcome.html.erb +16 -0
  27. data/app/views/querylane/_pager.html.erb +19 -0
  28. data/app/views/querylane/_preview.html.erb +39 -0
  29. data/app/views/querylane/_record.html.erb +16 -0
  30. data/app/views/querylane/_related.html.erb +17 -0
  31. data/app/views/querylane/_results.html.erb +66 -0
  32. data/app/views/querylane/_rows.html.erb +13 -0
  33. data/app/views/querylane/_saved.html.erb +31 -0
  34. data/app/views/querylane/_suggest_box.html.erb +45 -0
  35. data/app/views/querylane/_suggestions.html.erb +47 -0
  36. data/app/views/querylane/_toolbar.html.erb +28 -0
  37. data/app/views/querylane/_unavailable.html.erb +7 -0
  38. data/app/views/querylane/_writes.html.erb +16 -0
  39. data/config/importmap.rb +34 -0
  40. data/config/locales/querylane.en.yml +136 -0
  41. data/lib/querylane/ast.rb +17 -0
  42. data/lib/querylane/chips.rb +85 -0
  43. data/lib/querylane/compiler.rb +52 -0
  44. data/lib/querylane/configuration.rb +49 -0
  45. data/lib/querylane/context.rb +11 -0
  46. data/lib/querylane/controller.rb +85 -0
  47. data/lib/querylane/definition.rb +447 -0
  48. data/lib/querylane/doctor.rb +52 -0
  49. data/lib/querylane/engine.rb +61 -0
  50. data/lib/querylane/errors.rb +27 -0
  51. data/lib/querylane/filter.rb +75 -0
  52. data/lib/querylane/group_token.rb +33 -0
  53. data/lib/querylane/parser.rb +178 -0
  54. data/lib/querylane/presenter.rb +160 -0
  55. data/lib/querylane/preview.rb +45 -0
  56. data/lib/querylane/query.rb +183 -0
  57. data/lib/querylane/request.rb +66 -0
  58. data/lib/querylane/result.rb +90 -0
  59. data/lib/querylane/rewriter.rb +245 -0
  60. data/lib/querylane/saving.rb +49 -0
  61. data/lib/querylane/scope.rb +53 -0
  62. data/lib/querylane/search.rb +347 -0
  63. data/lib/querylane/searchers/meilisearch.rb +226 -0
  64. data/lib/querylane/suggest.rb +67 -0
  65. data/lib/querylane/version.rb +5 -0
  66. data/lib/querylane.rb +60 -0
  67. data/lib/tasks/querylane.rake +14 -0
  68. metadata +132 -0
data/lib/querylane.rb ADDED
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ # querylane — a Gmail-style search language, chips, facets and keyboard-driven
4
+ # results for Rails on Hotwire.
5
+ #
6
+ # Flow: Request (params) → Query (parse, interpret, validate) → Compiler
7
+ # (text + filters per index) → Searcher (backend) → Result (hits, chips,
8
+ # facets, state) → engine partials and Stimulus controllers.
9
+ require "rails"
10
+ require "active_support"
11
+ require "active_support/core_ext/object/blank"
12
+ require "active_support/core_ext/string/inflections"
13
+ require "strscan"
14
+
15
+ require "querylane/version"
16
+ require "querylane/errors"
17
+ require "querylane/configuration"
18
+ require "querylane/filter"
19
+ require "querylane/scope"
20
+ require "querylane/context"
21
+ require "querylane/definition"
22
+ require "querylane/ast"
23
+ require "querylane/parser"
24
+ require "querylane/query"
25
+ require "querylane/compiler"
26
+ require "querylane/chips"
27
+ require "querylane/rewriter"
28
+ require "querylane/preview"
29
+ require "querylane/group_token"
30
+ require "querylane/suggest"
31
+ require "querylane/saving"
32
+ require "querylane/request"
33
+ require "querylane/result"
34
+ require "querylane/search"
35
+ require "querylane/searchers/meilisearch"
36
+ require "querylane/doctor"
37
+ require "querylane/presenter"
38
+ require "querylane/controller"
39
+ require "querylane/engine"
40
+
41
+ module Querylane
42
+ class << self
43
+ # @return [Querylane::Configuration]
44
+ def configuration
45
+ @configuration ||= Configuration.new
46
+ end
47
+
48
+ # Configures querylane once, at boot (an initializer in the host).
49
+ #
50
+ # @yieldparam config [Querylane::Configuration]
51
+ def configure
52
+ yield configuration
53
+ end
54
+
55
+ # Test hook.
56
+ def reset_configuration!
57
+ @configuration = nil
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ namespace :querylane do
4
+ desc "Check the indexes behind a definition, e.g. rake querylane:doctor[PEOPLE] or querylane:doctor[MemberSearch::Definition.current]"
5
+ task :doctor, [:definition] => :environment do |_task, args|
6
+ receiver, method = args.fetch(:definition).split(".", 2)
7
+ definition = method ? receiver.constantize.public_send(method) : receiver.constantize
8
+ client = Querylane.configuration.searcher.send(:client)
9
+ problems = Querylane::Doctor.check(definition, client: client)
10
+ problems.each { |problem| puts problem }
11
+ puts problems.empty? ? "querylane: #{definition.name} indexes are ready" : "querylane: #{problems.size} problem(s)"
12
+ exit(1) if problems.any?
13
+ end
14
+ end
metadata ADDED
@@ -0,0 +1,132 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: querylane
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Ajaya Agrawalla
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2026-10-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 8.1.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 8.1.0
27
+ description: 'A Rails engine: server-parsed query language, interpretation chips,
28
+ disjunctive facets and keyboard-driven results on Turbo Frames and Stimulus, with
29
+ a Meilisearch searcher.'
30
+ email:
31
+ - ajaya@clearstack.io
32
+ executables: []
33
+ extensions: []
34
+ extra_rdoc_files: []
35
+ files:
36
+ - CHANGELOG.md
37
+ - CONTRIBUTING.md
38
+ - LICENSE
39
+ - README.md
40
+ - SECURITY.md
41
+ - app/assets/stylesheets/querylane.css
42
+ - app/helpers/querylane/search_helper.rb
43
+ - app/javascript/querylane/controllers/box_controller.js
44
+ - app/javascript/querylane/controllers/options_controller.js
45
+ - app/javascript/querylane/controllers/results_controller.js
46
+ - app/javascript/querylane/controllers/suggest_controller.js
47
+ - app/javascript/querylane/index.js
48
+ - app/javascript/querylane/overlay.js
49
+ - app/javascript/querylane/package.json
50
+ - app/views/querylane/_chips.html.erb
51
+ - app/views/querylane/_denied.html.erb
52
+ - app/views/querylane/_empty.html.erb
53
+ - app/views/querylane/_facets.html.erb
54
+ - app/views/querylane/_first_load.html.erb
55
+ - app/views/querylane/_form.html.erb
56
+ - app/views/querylane/_group.html.erb
57
+ - app/views/querylane/_help.html.erb
58
+ - app/views/querylane/_options.html.erb
59
+ - app/views/querylane/_options_row.html.erb
60
+ - app/views/querylane/_outcome.html.erb
61
+ - app/views/querylane/_pager.html.erb
62
+ - app/views/querylane/_preview.html.erb
63
+ - app/views/querylane/_record.html.erb
64
+ - app/views/querylane/_related.html.erb
65
+ - app/views/querylane/_results.html.erb
66
+ - app/views/querylane/_rows.html.erb
67
+ - app/views/querylane/_saved.html.erb
68
+ - app/views/querylane/_suggest_box.html.erb
69
+ - app/views/querylane/_suggestions.html.erb
70
+ - app/views/querylane/_toolbar.html.erb
71
+ - app/views/querylane/_unavailable.html.erb
72
+ - app/views/querylane/_writes.html.erb
73
+ - config/importmap.rb
74
+ - config/locales/querylane.en.yml
75
+ - lib/querylane.rb
76
+ - lib/querylane/ast.rb
77
+ - lib/querylane/chips.rb
78
+ - lib/querylane/compiler.rb
79
+ - lib/querylane/configuration.rb
80
+ - lib/querylane/context.rb
81
+ - lib/querylane/controller.rb
82
+ - lib/querylane/definition.rb
83
+ - lib/querylane/doctor.rb
84
+ - lib/querylane/engine.rb
85
+ - lib/querylane/errors.rb
86
+ - lib/querylane/filter.rb
87
+ - lib/querylane/group_token.rb
88
+ - lib/querylane/parser.rb
89
+ - lib/querylane/presenter.rb
90
+ - lib/querylane/preview.rb
91
+ - lib/querylane/query.rb
92
+ - lib/querylane/request.rb
93
+ - lib/querylane/result.rb
94
+ - lib/querylane/rewriter.rb
95
+ - lib/querylane/saving.rb
96
+ - lib/querylane/scope.rb
97
+ - lib/querylane/search.rb
98
+ - lib/querylane/searchers/meilisearch.rb
99
+ - lib/querylane/suggest.rb
100
+ - lib/querylane/version.rb
101
+ - lib/tasks/querylane.rake
102
+ homepage: https://github.com/clearstackio/querylane
103
+ licenses:
104
+ - MIT
105
+ metadata:
106
+ homepage_uri: https://github.com/clearstackio/querylane
107
+ source_code_uri: https://github.com/clearstackio/querylane/tree/master
108
+ changelog_uri: https://github.com/clearstackio/querylane/blob/master/CHANGELOG.md
109
+ bug_tracker_uri: https://github.com/clearstackio/querylane/issues
110
+ documentation_uri: https://github.com/clearstackio/querylane/tree/master/docs/guides
111
+ rubygems_mfa_required: 'true'
112
+ allowed_push_host: https://rubygems.org
113
+ post_install_message:
114
+ rdoc_options: []
115
+ require_paths:
116
+ - lib
117
+ required_ruby_version: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: '3.3'
122
+ required_rubygems_version: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ requirements: []
128
+ rubygems_version: 3.5.22
129
+ signing_key:
130
+ specification_version: 4
131
+ summary: Gmail-style search box, operators, chips and facets for Rails on Hotwire
132
+ test_files: []