talent_scout 1.0.0 → 1.0.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1d013c77ffd08bf7bb7d36d4f30c10bc763a4ea79c437d80604985de86fadd74
4
- data.tar.gz: a4a996e5b44c64af45806849f3744f06bf7f192d346416943739f172abf45180
3
+ metadata.gz: e8762e9b2380fffc1760108d9519e9d6e936aa5a0372c0b4a15e426fdf002dde
4
+ data.tar.gz: fa0c26db874aea1c7a1fddcb0b8270bca03ba604d240c42e961ab3d7d2d21f49
5
5
  SHA512:
6
- metadata.gz: 24e7c840762d376d5dd9353e3f9b4f167424914e1320573fbcc5cf6dcb691ab5a78f4465261fd2ca029784dd5fac25192c8def19b1f2280401dd3a1452baed7a
7
- data.tar.gz: b6be4607619b5dcae29c012fb5194b640e5a5bf5ad9de94f1cd80532cf9cfdb12d8d61f615297da0531b8fe2fa9504a589d7f3816da2192f3e6b7f603231cb58
6
+ metadata.gz: 2b0d2cd202e33572ca6a24c4235f4e7a36f0975361ba09ed870e03a758c89cfafe07ba544d5e3737a1432535d466993b50383df57fa8ee5f8d7039f77b2acad7
7
+ data.tar.gz: 19e4fe92e92aa8c0b69151034adf430739bee6e538e8878bcb7606d7fb9738b3f1a2f259ce264b64388bf972853c877703c95d72536a9dfc4d6e38c54db18fbf
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # talent_scout
1
+ # talent_scout [![Build Status](https://travis-ci.org/jonathanhefner/talent_scout.svg?branch=master)](https://travis-ci.org/jonathanhefner/talent_scout)
2
2
 
3
3
  Model-backed searches in Rails. A whiz-bang example:
4
4
 
@@ -42,10 +42,16 @@ end
42
42
  ```html+erb
43
43
  <!-- app/views/posts/index.html.erb -->
44
44
 
45
- <%= form_with model: @search, method: :get do |form| %>
45
+ <%= form_with model: @search, local: true, method: :get do |form| %>
46
+ <%= form.label :title_includes %>
46
47
  <%= form.text_field :title_includes %>
48
+
49
+ <%= form.label :within %>
47
50
  <%= form.select :within, @search.each_choice(:within), include_blank: true %>
51
+
52
+ <%= form.label :only_published %>
48
53
  <%= form.check_box :only_published %>
54
+
49
55
  <%= form.submit %>
50
56
  <% end %>
51
57
 
@@ -519,15 +525,21 @@ Search forms can be rendered using Rails' form builder and a search
519
525
  object:
520
526
 
521
527
  ```html+erb
522
- <%= form_with model: @search, method: :get do |form| %>
528
+ <%= form_with model: @search, local: true, method: :get do |form| %>
529
+ <%= form.label :title_includes %>
523
530
  <%= form.text_field :title_includes %>
531
+
532
+ <%= form.label :created_on %>
524
533
  <%= form.date_field :created_on %>
534
+
535
+ <%= form.label :only_published %>
525
536
  <%= form.check_box :only_published %>
537
+
526
538
  <%= form.submit %>
527
539
  <% end %>
528
540
  ```
529
541
 
530
- Notice the `method: :get` argument to `form_with`; this is **required**.
542
+ Notice the `method: :get` argument to `form_with`; **this is required**.
531
543
 
532
544
  Form fields will be populated with the criteria input (or default)
533
545
  values of the same name from `@search`. Type-appropriate form fields
@@ -646,7 +658,7 @@ end
646
658
  ```
647
659
 
648
660
  ```html+erb
649
- <%= form_with model: @search, method: :get do |form| %>
661
+ <%= form_with model: @search, local: true, method: :get do |form| %>
650
662
  <%= form.select :category, @search.each_choice(:category) %>
651
663
  <%= form.submit %>
652
664
  <% end %>
@@ -668,7 +680,7 @@ end
668
680
  ```
669
681
 
670
682
  ```html+erb
671
- <%= form_with model: @search, method: :get do |form| %>
683
+ <%= form_with model: @search, local: true, method: :get do |form| %>
672
684
  <%= form.select :order, @search.each_choice(:order) %>
673
685
  <%= form.submit %>
674
686
  <% end %>
@@ -707,7 +719,6 @@ end
707
719
 
708
720
  Remember that only one order can be applied at a time, so only one value
709
721
  in the Hash, at most, will be non-`nil`.
710
- >>>>>>> b0d201c... Update README
711
722
 
712
723
 
713
724
  ## Installation
@@ -4,7 +4,7 @@ module TalentScout
4
4
 
5
5
  module ClassMethods
6
6
  # Returns the controller model search class. Defaults to a class
7
- # corresponding to the singular-form of the controller name. The
7
+ # corresponding to the singular form of the controller name. The
8
8
  # model search class can also be set with {model_search_class=}.
9
9
  # If the model search class has not been set, and the default
10
10
  # class does not exist, a +NameError+ will be raised.
@@ -32,8 +32,8 @@ module TalentScout
32
32
  end
33
33
 
34
34
  # Similar to {model_search_class}, but returns nil instead of
35
- # raising an error when the value has not been set (via
36
- # {model_search_class=}) and the default class does not exist.
35
+ # raising an error when the value has not been set and the default
36
+ # class does not exist.
37
37
  #
38
38
  # @return [Class<TalentScout::ModelSearch>, nil]
39
39
  def model_search_class?
@@ -47,11 +47,11 @@ module TalentScout
47
47
  @model_name ||= ModelName.new(self)
48
48
  end
49
49
 
50
- # Sets the default scope of the search. Like ActiveRecord's
50
+ # Sets the default scope of the search. Like Active Record's
51
51
  # +default_scope+, the scope here is specified as a block which is
52
52
  # evaluated in the context of the {model_class}. Also like
53
- # ActiveRecord, multiple calls to this method will be merged
54
- # together.
53
+ # Active Record, multiple calls of this method will append to the
54
+ # default scope.
55
55
  #
56
56
  # @example
57
57
  # class PostSearch < TalentScout::ModelSearch
@@ -88,26 +88,26 @@ module TalentScout
88
88
  # Model (e.g. +:string+, +:boolean+, +:integer+, etc), with the
89
89
  # addition of a +:void+ type. A +:void+ type is just like a
90
90
  # +:boolean+ type, except that the criteria is not evaluated when
91
- # the type-casted value is falsey.
91
+ # the typecasted value is falsey.
92
92
  #
93
- # Alternatively, instead of a type, an array or hash of +choices+
93
+ # Alternatively, instead of a type, an Array or Hash of +choices+
94
94
  # can be specified, and the criteria will be evaluated only if the
95
95
  # passed-in value matches one of the choices.
96
96
  #
97
- # Active Model +attribute_options+ can also be specified, most
98
- # notably +:default+ to provide the criteria a default value to
99
- # operate on.
97
+ # Active Model +attribute_options+ can also be specified. Most
98
+ # notably, the +:default+ option provides the criteria a default
99
+ # value to operate on.
100
100
  #
101
- # Each criteria can specify a block which recieves the corresponding
102
- # type-casted value as an argument. If the corresponding value is
103
- # not set on the search object (and no default value is defined),
101
+ # Each criteria can specify a block which recieves its corresponding
102
+ # typecasted value as an argument. If the corresponding value is
103
+ # not set on the search object, and no default value is defined,
104
104
  # the criteria will not be evaluated. Like an Active Record
105
105
  # +scope+ block, a criteria block is evaluated in the context of an
106
- # +ActiveRecord::Relation+ and should return an
106
+ # +ActiveRecord::Relation+, and should return an
107
107
  # +ActiveRecord::Relation+. A criteria block may also return nil,
108
108
  # in which case the criteria will be skipped. If no criteria block
109
109
  # is specified, the criteria will be evaluated as a +where+ clause
110
- # using the criteria name and type-casted value.
110
+ # using the criteria name and typecasted value.
111
111
  #
112
112
  # As a convenient shorthand, Active Record scopes which have been
113
113
  # defined on the {model_class} can be used directly as criteria
@@ -171,7 +171,7 @@ module TalentScout
171
171
  # PostSearch.new(only_edited: "1").results # == Post.where("modified_at > created_at")
172
172
  #
173
173
  #
174
- # @example Specifying choices (array)
174
+ # @example Specifying choices (Array)
175
175
  # class PostSearch < TalentScout::ModelSearch
176
176
  # criteria :category, choices: %w[science tech engineering math]
177
177
  # end
@@ -180,7 +180,7 @@ module TalentScout
180
180
  # PostSearch.new(category: "BLAH").results # == Post.all
181
181
  #
182
182
  #
183
- # @example Specifying choices (hash)
183
+ # @example Specifying choices (Hash)
184
184
  # class PostSearch < TalentScout::ModelSearch
185
185
  # criteria :within, choices: {
186
186
  # "Last 24 hours" => 24.hours,
@@ -209,15 +209,38 @@ module TalentScout
209
209
  # PostSearch.new(within_days: 2).results # == Post.where("created_at >= ?", 2.days.ago)
210
210
  #
211
211
  #
212
- # @param names [String, Symbol, Array<String>, Array<Symbol>]
213
- # @param type [Symbol, ActiveModel::Type]
214
- # @param choices [Array<String>, Array<Symbol>, Hash<String, Object>, Hash<Symbol, Object>]
215
- # @param attribute_options [Hash]
216
- # @option attribute_options :default [Object]
217
- # @yieldreturn [ActiveRecord::Relation, nil]
212
+ # @overload criteria(names, type = :string, **attribute_options, &block)
213
+ # @param names [String, Symbol, Array<String>, Array<Symbol>]
214
+ # @param type [Symbol, ActiveModel::Type]
215
+ # @param attribute_options [Hash]
216
+ # @option attribute_options :default [Object]
217
+ # @yieldparam value [Object]
218
+ # @yieldreturn [ActiveRecord::Relation, nil]
219
+ #
220
+ # @overload criteria(names, type = :string, **attribute_options)
221
+ # @param names [String, Symbol, Array<String>, Array<Symbol>]
222
+ # @param type [Symbol, ActiveModel::Type]
223
+ # @param attribute_options [Hash]
224
+ # @option attribute_options :default [Object]
225
+ #
226
+ # @overload criteria(names, choices:, **attribute_options, &block)
227
+ # @param names [String, Symbol, Array<String>, Array<Symbol>]
228
+ # @param choices [Array<String>, Array<Symbol>, Hash<String, Object>, Hash<Symbol, Object>]
229
+ # @param attribute_options [Hash]
230
+ # @option attribute_options :default [Object]
231
+ # @yieldparam value [Object]
232
+ # @yieldreturn [ActiveRecord::Relation, nil]
233
+ #
234
+ # @overload criteria(names, choices:, **attribute_options)
235
+ # @param names [String, Symbol, Array<String>, Array<Symbol>]
236
+ # @param choices [Array<String>, Array<Symbol>, Hash<String, Object>, Hash<Symbol, Object>]
237
+ # @param attribute_options [Hash]
238
+ # @option attribute_options :default [Object]
239
+ # @yieldreturn [ActiveRecord::Relation, nil]
240
+ #
218
241
  # @return [void]
219
242
  # @raise [ArgumentError]
220
- # if +choices+ are specified and +type+ is other than +:string+
243
+ # if +choices+ is specified and +type+ is not +:string+
221
244
  def self.criteria(names, type = :string, choices: nil, **attribute_options, &block)
222
245
  if choices
223
246
  if type != :string
@@ -269,7 +292,7 @@ module TalentScout
269
292
  # +:default+ option in the order definition. (Note that only one
270
293
  # order can be designated as the default order.)
271
294
  #
272
- # See also {toggle_order}.
295
+ # @see toggle_order
273
296
  #
274
297
  #
275
298
  # @example Single-column order
@@ -346,25 +369,30 @@ module TalentScout
346
369
  order_type.add_definition(definition)
347
370
  end
348
371
 
349
- # Initializes a +ModelSearch+ instance. Assigns values in +params+
350
- # to appropriate criteria attributes.
372
+ # Initializes a +ModelSearch+ instance. Assigns values from
373
+ # +params+ to corresponding criteria attributes.
351
374
  #
352
375
  # If +params+ is a +ActionController::Parameters+, blank values are
353
376
  # ignored. This behavior prevents empty search form fields from
354
377
  # affecting search results.
355
378
  #
356
379
  # @param params [Hash<String, Object>, Hash<Symbol, Object>, ActionController::Parameters]
380
+ # @raise [ActiveModel::UnknownAttributeError]
381
+ # if +params+ is a Hash, and it contains an unrecognized key
357
382
  def initialize(params = {})
383
+ # HACK initialize ActiveRecord state required by ActiveRecord::AttributeMethods::BeforeTypeCast
384
+ @transaction_state ||= nil
385
+
358
386
  if params.is_a?(ActionController::Parameters)
359
387
  params = params.permit(self.class.attribute_types.keys).reject!{|key, value| value.blank? }
360
388
  end
361
389
  super(params)
362
390
  end
363
391
 
364
- # Applies search {criteria} with set or default attribute values,
365
- # and the set or default {order} on top of the {default_scope}.
366
- # Returns an +ActiveRecord::Relation+, allowing further scopes, such
367
- # as pagination, to be applied post-hoc.
392
+ # Applies the {default_scope}, search {criteria} with set or default
393
+ # attribute values, and the set or default {order} to the
394
+ # {model_class}. Returns an +ActiveRecord::Relation+, allowing
395
+ # further scopes, such as pagination, to be applied post-hoc.
368
396
  #
369
397
  # @example
370
398
  # class PostSearch < TalentScout::ModelSearch
@@ -383,14 +411,15 @@ module TalentScout
383
411
  #
384
412
  # @return [ActiveRecord::Relation]
385
413
  def results
386
- self.class.criteria_list.reduce(self.class.model_class) do |scope, crit|
414
+ self.class.criteria_list.reduce(self.class.model_class.all) do |scope, crit|
387
415
  crit.apply(scope, attribute_set)
388
416
  end
389
417
  end
390
418
 
391
419
  # Builds a new model search object with +criteria_values+ merged on
392
- # top of the subject search object's criteria values. Does not
393
- # modify the subject search object.
420
+ # top of the subject search object's criteria values.
421
+ #
422
+ # Does not modify the subject search object.
394
423
  #
395
424
  # @example
396
425
  # class PostSearch < TalentScout::ModelSearch
@@ -414,8 +443,9 @@ module TalentScout
414
443
 
415
444
  # Builds a new model search object with the subject search object's
416
445
  # criteria values, excluding values specified by +criteria_names+.
417
- # Default criteria values will still be applied. Does not modify
418
- # the subject search object.
446
+ # Default criteria values will still be applied.
447
+ #
448
+ # Does not modify the subject search object.
419
449
  #
420
450
  # @example
421
451
  # class PostSearch < TalentScout::ModelSearch
@@ -479,10 +509,10 @@ module TalentScout
479
509
 
480
510
  # Iterates over a specified {criteria}'s defined choices. If the
481
511
  # given block accepts a 2nd argument, a boolean will be passed
482
- # indicating whether that choice is currently used by the subject
483
- # search object. If no block is given, an +Enumerator+ will be
484
- # returned.
512
+ # indicating whether that choice is currently assigned to the
513
+ # specified criteria.
485
514
  #
515
+ # An Enumerator is returned if no block is given.
486
516
  #
487
517
  # @example With block
488
518
  # class PostSearch < TalentScout::ModelSearch
@@ -549,7 +579,7 @@ module TalentScout
549
579
  # {order}. Each key's associated value indicates that order's
550
580
  # currently applied direction -- +:asc+, +:desc+, or +nil+ if the
551
581
  # order is not applied. Note that only one order can be applied at
552
- # a time, so only one value in the Hash, at most, will be non-+nil+.
582
+ # a time, so, at most, one value in the Hash will be non-+nil+.
553
583
  #
554
584
  # @example
555
585
  # class PostSearch < TalentScout::ModelSearch
@@ -1,3 +1,3 @@
1
1
  module TalentScout
2
- VERSION = "1.0.0"
2
+ VERSION = "1.0.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: talent_scout
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Hefner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-17 00:00:00.000000000 Z
11
+ date: 2019-11-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -58,6 +58,20 @@ dependencies:
58
58
  - - "<"
59
59
  - !ruby/object:Gem::Version
60
60
  version: '4.0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: webdrivers
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
61
75
  - !ruby/object:Gem::Dependency
62
76
  name: yard
63
77
  requirement: !ruby/object:Gem::Requirement
@@ -88,7 +102,7 @@ dependencies:
88
102
  version: '4.0'
89
103
  description:
90
104
  email:
91
- - jonathan.hefner@gmail.com
105
+ - jonathan@hefner.pro
92
106
  executables: []
93
107
  extensions: []
94
108
  extra_rdoc_files: []