eyepiece 0.2.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: '08654fe33f75242a2fd23359c80926349ee83aa9e5484eb98f6fce5039999e52'
4
+ data.tar.gz: 65babcceac0433ca6b777ab1a81e3225cf659e74d3a34529b0becc6e0beabb8b
5
+ SHA512:
6
+ metadata.gz: a262903b867dbeab1be576b71b4cac255bd2445973f90b1ce10ac009cee64e7417d5a60022392c8e67a62a7980d2f8d32e3bd2959d5df3a2947aa13f364a0d8a
7
+ data.tar.gz: be685e3fe2c9ad286217820062c01e6d7f2f6449b7b9b0eced86b4697505e0b98964173266e00f3f719b4af1830dc4826691f52c88e4e044950252b360036fc2
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Eyepiece
4
+ class QuickBriefScope < Module
5
+ def initialize(*fields, method: :brief)
6
+ @module = Module.new do
7
+ define_method method do
8
+ reselect(*fields)
9
+ end
10
+ end
11
+ end
12
+
13
+ def included(base)
14
+ base.send(:extend, @module)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Eyepiece
4
+ class QuickSearch < Module
5
+ class Searcher
6
+ def self.call(...)
7
+ new(...).call
8
+ end
9
+
10
+ def initialize(*fields, scope:, txt:, require_one:)
11
+ self.scope = scope
12
+ self.fields = fields
13
+ self.txt = Array(txt)
14
+ self.require_one = require_one
15
+ end
16
+
17
+ def call
18
+ phrases =
19
+ txt.map.with_index(1).to_h do |phrase, index|
20
+ key = format("txt%<index>d", index: index).to_sym
21
+ [key, "%#{phrase}%"]
22
+ end
23
+
24
+ records = scope.where(query, **phrases)
25
+
26
+ if require_one
27
+ raise_error(records.length) if records.length > 1
28
+ records.first
29
+ else
30
+ records
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ def columns
37
+ fields.map do |field|
38
+ ActiveRecord::Base.connection.quote_column_name(field)
39
+ end
40
+ end
41
+
42
+ def query
43
+ queries =
44
+ txt.flat_map.with_index(1) do |_, index|
45
+ columns.map do |field|
46
+ "#{field}::text ILIKE :txt#{index}"
47
+ end
48
+ end
49
+
50
+ queries.join(" OR ")
51
+ end
52
+
53
+ def raise_error(count)
54
+ raise(
55
+ Eyepiece::TooManyRecordsError,
56
+ format(
57
+ "too many records (%<count>d) for \"%<query>s\"",
58
+ count: count,
59
+ query: txt.join(", "),
60
+ ),
61
+ )
62
+ end
63
+
64
+ attr_accessor :fields, :scope, :txt, :require_one
65
+ end
66
+
67
+ def included(base)
68
+ base.send(:extend, @module)
69
+ end
70
+
71
+ def initialize(*fields)
72
+ @module = Module.new do
73
+ define_method :like do |*txt, require_one: true|
74
+ Searcher.call(*fields, scope: self, txt: txt, require_one: require_one)
75
+ end
76
+
77
+ define_method :mlike do |*txt, require_one: false|
78
+ Searcher.call(*fields, scope: self, txt: txt, require_one: require_one)
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Eyepiece
4
+ VERSION = "0.2.0"
5
+ end
data/lib/eyepiece.rb ADDED
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "eyepiece/version"
4
+ require_relative "eyepiece/quick_search"
5
+ require_relative "eyepiece/quick_brief_scope"
6
+
7
+ module Eyepiece
8
+ class Error < StandardError; end
9
+ class TooManyRecordsError < Error; end
10
+ end
data/sig/eyepiece.rbs ADDED
@@ -0,0 +1,4 @@
1
+ module Eyepiece
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end
metadata ADDED
@@ -0,0 +1,62 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: eyepiece
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - John Doe
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: activerecord
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '6.0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '6.0'
26
+ description: Provides parameterized modules for fast ILIKE searching and brief scope
27
+ selection on ActiveRecord models.
28
+ email:
29
+ - test@example.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - lib/eyepiece.rb
35
+ - lib/eyepiece/quick_brief_scope.rb
36
+ - lib/eyepiece/quick_search.rb
37
+ - lib/eyepiece/version.rb
38
+ - sig/eyepiece.rbs
39
+ homepage: https://github.com/example/eyepiece
40
+ licenses:
41
+ - MIT
42
+ metadata:
43
+ homepage_uri: https://github.com/example/eyepiece
44
+ source_code_uri: https://github.com/example/eyepiece
45
+ rdoc_options: []
46
+ require_paths:
47
+ - lib
48
+ required_ruby_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 3.2.0
53
+ required_rubygems_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ requirements: []
59
+ rubygems_version: 3.6.9
60
+ specification_version: 4
61
+ summary: QuickSearch and QuickBriefScope for ActiveRecord models
62
+ test_files: []