wallaby-active_record 0.2.4 → 0.2.5

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 (24) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -1
  3. data/lib/adapters/wallaby/active_record.rb +2 -1
  4. data/lib/adapters/wallaby/active_record/cancancan_provider.rb +1 -1
  5. data/lib/adapters/wallaby/active_record/default_provider.rb +1 -1
  6. data/lib/adapters/wallaby/active_record/model_decorator.rb +28 -26
  7. data/lib/adapters/wallaby/active_record/model_decorator/fields_builder.rb +3 -2
  8. data/lib/adapters/wallaby/active_record/model_decorator/fields_builder/association_builder.rb +6 -4
  9. data/lib/adapters/wallaby/active_record/model_decorator/fields_builder/polymorphic_builder.rb +3 -2
  10. data/lib/adapters/wallaby/active_record/model_decorator/fields_builder/sti_builder.rb +17 -13
  11. data/lib/adapters/wallaby/active_record/model_decorator/title_field_finder.rb +6 -9
  12. data/lib/adapters/wallaby/active_record/model_finder.rb +16 -29
  13. data/lib/adapters/wallaby/active_record/model_pagination_provider.rb +5 -13
  14. data/lib/adapters/wallaby/active_record/model_service_provider.rb +8 -17
  15. data/lib/adapters/wallaby/active_record/model_service_provider/permitter.rb +1 -1
  16. data/lib/adapters/wallaby/active_record/model_service_provider/querier.rb +1 -1
  17. data/lib/adapters/wallaby/active_record/model_service_provider/querier/escaper.rb +14 -0
  18. data/lib/adapters/wallaby/active_record/model_service_provider/querier/wrapper.rb +4 -1
  19. data/lib/adapters/wallaby/active_record/model_service_provider/validator.rb +6 -4
  20. data/lib/adapters/wallaby/active_record/pundit_provider.rb +2 -2
  21. data/lib/wallaby/active_record.rb +0 -1
  22. data/lib/wallaby/active_record/version.rb +1 -1
  23. metadata +6 -7
  24. data/lib/adapters/wallaby/active_record/logger.rb +0 -21
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 77775377884b090f9d0c0679a0eda24caccaece57e0429f8307457d91ebce2a5
4
- data.tar.gz: 23bdf49c685c9b938cfea121ab3bf44fad2f2bffeba964a4bfcfacd3595368f8
3
+ metadata.gz: 3326a29a32d97399d5d5e5381ca283b5fefc1601bbe212250c2753deb26d9509
4
+ data.tar.gz: e61f519c75994ffce103baee81a573941869487dec966e6060299ec24fe73e12
5
5
  SHA512:
6
- metadata.gz: 35d9dcf0387cae97199ad0aa47628bbc4719c1f3b48cccd0e04450b87c5b54c5358e8fe5ab3a9fc960e5fa410990438a4b5d00bb7431ab0d8ade6ea7f2aa26af
7
- data.tar.gz: 07c885247c19f20b71db0f4f85b07e7cb955e68d4cbdec727057dc55938ecac103e4e42f813584869df932638dd7559f2544372aead0903beb86089f75d18c04
6
+ metadata.gz: 05003c11197eeab16a351e202b3f7ee97a593abb0b7bf99505d516acb924950522805e6a0198fa274a635d737f1a4a9b69a8591f961304a0e4085706de86800a
7
+ data.tar.gz: 8f34233e937848899b6d16a7143a990cd584ccaf23b9c29700ac1cc8837214f1184b34e0fd0fd1f93eaeef15fcaab0898276d63e5529aac4da2a9aac064a378d
data/README.md CHANGED
@@ -7,7 +7,8 @@
7
7
  [![Test Coverage](https://api.codeclimate.com/v1/badges/9ba0a610043a2e1a9e74/test_coverage)](https://codeclimate.com/github/wallaby-rails/wallaby-active_record/test_coverage)
8
8
  [![Inch CI](https://inch-ci.org/github/wallaby-rails/wallaby-active_record.svg?branch=master)](https://inch-ci.org/github/wallaby-rails/wallaby-active_record)
9
9
 
10
- Wallaby::ActiveRecord is the ActiveRecord adapter for [Wallaby::Core](https://github.com/wallaby-rails/wallaby-core).
10
+ Wallaby::ActiveRecord is the ActiveRecord adapter that implements the [Wallaby::Core](https://github.com/wallaby-rails/wallaby-core)
11
+ interfaces to handle ActiveRecord model/instance(s) in all the CRUD/authorization/pagination operations.
11
12
 
12
13
  ## Install
13
14
 
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Wallaby
4
- # ActiveRecord mode
4
+ # The Wallaby::ActiveRecord mode that implements the {Wallaby::Core} interfaces
5
+ # to handle ActiveRecord model/instance in all CRUD operations
5
6
  class ActiveRecord < Mode
6
7
  end
7
8
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Wallaby
4
4
  class ActiveRecord
5
- # Cancancan provider for ActiveRecord
5
+ # Cancancan provider for {Wallaby::ActiveRecord}
6
6
  class CancancanProvider < CancancanAuthorizationProvider
7
7
  end
8
8
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Wallaby
4
4
  class ActiveRecord
5
- # Default provider for ActiveRecord
5
+ # Default provider for {Wallaby::ActiveRecord}
6
6
  class DefaultProvider < DefaultAuthorizationProvider
7
7
  end
8
8
  end
@@ -2,24 +2,25 @@
2
2
 
3
3
  module Wallaby
4
4
  class ActiveRecord
5
- # Modal decorator for ActiveRecord
5
+ # Modal decorator for {Wallaby::ActiveRecord}
6
6
  class ModelDecorator < ::Wallaby::ModelDecorator
7
- # Data types to exclude for index page
8
- INDEX_EXCLUSIVE_DATA_TYPES =
9
- (['', 'medium', 'long'] * 2)
10
- .zip(%w(blob text) * 3).map(&:join)
11
- .concat(%w(binary citext hstore json jsonb tsvector xml)).freeze
7
+ # Data types to exclude for {#index_field_names}
8
+ INDEX_EXCLUSIVE_DATA_TYPES = %w(
9
+ binary citext hstore json jsonb tsvector xml
10
+ blob mediumblob longblob text mediumtext longtext
11
+ ).freeze
12
12
 
13
- # Class to exclude for show page
13
+ # Classes to exclude for {#show_field_names}
14
14
  SHOW_EXCLUSIVE_CLASS_NAMES = %w(ActiveStorage::Attachment ActiveStorage::Blob).freeze
15
15
 
16
- # Data types to exclude for form page
16
+ # Fields to exclude for {#form_field_names}
17
17
  FORM_EXCLUSIVE_DATA_TYPES = %w(created_at updated_at).freeze
18
18
 
19
- # Origin metadata directly coming from ActiveRecord.
19
+ # Original metadata information of the primative and association fields
20
+ # pulling out from the ActiveRecord model.
20
21
  #
21
- # It needs to be frozen so that we can keep the metadata integrity
22
- # @example sample fields:
22
+ # It needs to be frozen so that we can keep the metadata intact.
23
+ # @example sample fields metadata:
23
24
  # model_decorator.fields
24
25
  # # =>
25
26
  # {
@@ -27,28 +28,29 @@ module Wallaby
27
28
  # id: { name: 'id', type: 'integer', label: 'Id' },
28
29
  # # association field
29
30
  # category: {
30
- # 'name' => 'category',
31
- # 'type' => 'belongs_to',
32
- # 'label' => 'Category',
33
- # 'is_association' => true,
34
- # 'is_through' => false,
35
- # 'has_scope' => false,
36
- # 'foreign_key' => 'category_id',
37
- # 'class' => Category
31
+ # name: 'category',
32
+ # type: 'belongs_to',
33
+ # label: 'Category',
34
+ # is_association: true,
35
+ # is_through: false,
36
+ # has_scope: false,
37
+ # foreign_key: 'category_id',
38
+ # class: Category
38
39
  # }
39
40
  # }
40
41
  # @return [ActiveSupport::HashWithIndifferentAccess] metadata
41
42
  def fields
43
+ # NOTE: Need to check the database and table's existence before building up the metadata
44
+ # so that the database creation and migration related task can be executed.
42
45
  @fields ||= ::ActiveSupport::HashWithIndifferentAccess.new.tap do |hash|
43
- # NOTE: Need to check database and table's existence
44
- # before pulling out the metadata from model.
45
- # So that the database and migration related task can be executed.
46
- next unless ::ActiveRecord::Base.connected? && @model_class.table_exists?
46
+ next unless @model_class.table_exists?
47
47
 
48
48
  hash.merge! general_fields
49
49
  hash.merge! association_fields
50
50
  hash.except!(*foreign_keys_from_associations)
51
51
  end.freeze
52
+ rescue ::ActiveRecord::NoDatabaseError
53
+ Hash.new({})
52
54
  end
53
55
 
54
56
  # A copy of {#fields} for index page
@@ -86,7 +88,8 @@ module Wallaby
86
88
  end.keys
87
89
  end
88
90
 
89
- # @return [Array<String>] a list of field names for form (new/edit) page (note: complex fields are excluded).
91
+ # @return [Array<String>] a list of field names for form (new/edit) page
92
+ # (note: timestamps fields (e.g. created_at/updated_at) and complex relation fields are excluded).
90
93
  def form_field_names
91
94
  @form_field_names ||=
92
95
  form_fields.reject do |field_name, metadata|
@@ -109,9 +112,8 @@ module Wallaby
109
112
  # To guess the title for resource.
110
113
  #
111
114
  # It will go through the fields and try to find out the one that looks
112
- # like a name or text to represent this resource. Otherwise, it will fall
115
+ # like a name or text representing this resource. Otherwise, it will fall
113
116
  # back to primary key.
114
- #
115
117
  # @param resource [Object]
116
118
  # @return [String] the title of given resource
117
119
  def guess_title(resource)
@@ -3,7 +3,7 @@
3
3
  module Wallaby
4
4
  class ActiveRecord
5
5
  class ModelDecorator
6
- # To search and build the metadata for fields
6
+ # To build the metadata for fields
7
7
  class FieldsBuilder
8
8
  # @param model_class [Class]
9
9
  def initialize(model_class)
@@ -22,7 +22,8 @@ module Wallaby
22
22
  end
23
23
  end
24
24
 
25
- # @return [Hash<String, Hash>] a hash for general fields
25
+ # @return [Hash<String, Hash>] a hash for association fields
26
+ # (e.g. belongs_to / has_one / has_many / has_and_belongs_to_many)
26
27
  def association_fields
27
28
  @model_class.reflections.each_with_object({}) do |(name, ref), fields|
28
29
  metadata = {
@@ -4,7 +4,7 @@ module Wallaby
4
4
  class ActiveRecord
5
5
  class ModelDecorator
6
6
  class FieldsBuilder
7
- # To build the metadata for associations
7
+ # To build the metadata for associations fields
8
8
  class AssociationBuilder
9
9
  # Update the metadata
10
10
  # @param metadata [Hash]
@@ -18,7 +18,7 @@ module Wallaby
18
18
  metadata[:foreign_key] = foreign_key_for(reflection, type)
19
19
  end
20
20
 
21
- private
21
+ protected
22
22
 
23
23
  # @param reflection [ActiveRecord::Reflection]
24
24
  # @param type [Symbol]
@@ -35,13 +35,15 @@ module Wallaby
35
35
  end
36
36
 
37
37
  # @param reflection [ActiveRecord::Reflection]
38
- # @return [Boolean] whether it's a through relation
38
+ # @return [true] if it's a through relation
39
+ # @return [false] otherwise
39
40
  def through?(reflection)
40
41
  reflection.is_a? ::ActiveRecord::Reflection::ThroughReflection
41
42
  end
42
43
 
43
44
  # @param reflection [ActiveRecord::Reflection]
44
- # @return [Boolean] whether it has scope
45
+ # @return [true] if it has scope
46
+ # @return [false] otherwise
45
47
  def scope?(reflection)
46
48
  reflection.scope.present?
47
49
  end
@@ -19,7 +19,7 @@ module Wallaby
19
19
  end
20
20
  end
21
21
 
22
- private
22
+ protected
23
23
 
24
24
  # @param reflection [ActiveRecord::Reflection]
25
25
  # @return [Array<Class>] a list of classes for this polymorphism
@@ -38,7 +38,8 @@ module Wallaby
38
38
 
39
39
  # @param model_class [Class]
40
40
  # @param polymorphic_name [String] polymorphic name
41
- # @return [Boolean] if polymorphism defined?
41
+ # @return [true] if polymorphism defined?
42
+ # @return [false] otherwise
42
43
  def polymorphic_defined?(model_class, polymorphic_name)
43
44
  polymorphic_name_sym = polymorphic_name.try(:to_sym)
44
45
  model_class.reflections.any? do |_field_name, reflection|
@@ -4,44 +4,48 @@ module Wallaby
4
4
  class ActiveRecord
5
5
  class ModelDecorator
6
6
  class FieldsBuilder
7
- # To build the metadata for sti column
7
+ # This class updates the field metadata's value of **type** and **sti_class_list**
8
+ # for STI (Single Table Inheritance) model
8
9
  class StiBuilder
9
10
  # @param model_class [Class]
10
11
  def initialize(model_class)
11
12
  @model_class = model_class
12
13
  end
13
14
 
14
- # update the metadata
15
+ # Update the field metadata's value for **type** and **sti_class_list**
15
16
  # @param metadata [Hash]
16
17
  # @param column [ActiveRecord::ConnectionAdapters::Column]
17
18
  def update(metadata, column)
18
19
  return unless @model_class.inheritance_column == column.name
19
20
 
20
21
  metadata[:type] = 'sti'
21
- metadata[:sti_class_list] = sti_list(find_parent_of(@model_class))
22
+ metadata[:sti_class_list] = sti_list(find_sti_parent_of(@model_class))
22
23
  end
23
24
 
24
- private
25
+ protected
25
26
 
27
+ # Return the alphabet-order STI list
28
+ # by traversing the inheritance tree for given model.
26
29
  # @param klass [Class]
27
- # @return [Array<Class>] a list of STI classes for this model
30
+ # @return [Array<Class>]
28
31
  def sti_list(klass)
29
- list = klass.descendants << klass
30
- list.sort_by(&:name)
32
+ (klass.descendants << klass).sort_by(&:name)
31
33
  end
32
34
 
35
+ # Find out which parent is the one that can give us the STI list.
33
36
  # @param klass [Class]
34
- # @return [Class] the top parent class in the STI hierarchy
35
- def find_parent_of(klass)
37
+ # @return [Class]
38
+ def find_sti_parent_of(klass)
36
39
  parent = klass
37
- parent = parent.superclass until top_parent?(parent.superclass)
40
+ parent = parent.superclass until not_sti_parent?(parent.superclass)
38
41
  parent
39
42
  end
40
43
 
41
44
  # @param klass [Class]
42
- # @return [Boolean] whether the class is ActiveRecord base class
43
- def top_parent?(klass)
44
- klass == ModelFinder.base || klass.try(:abstract_class?)
45
+ # @return [true] if klass is ActiveRecord::Base or abstract
46
+ # @return [false] otherwise
47
+ def not_sti_parent?(klass)
48
+ klass == ::ActiveRecord::Base || klass.try(:abstract_class?)
45
49
  end
46
50
  end
47
51
  end
@@ -16,15 +16,12 @@ module Wallaby
16
16
 
17
17
  # @return [String] field name that can be used as title
18
18
  def find
19
- possible_title_fields = @fields.select do |_field_name, metadata|
20
- TITLE_FIELD_TYPES.include? metadata[:type]
21
- end
22
- target_field = possible_title_fields.keys.find do |field_name|
23
- TITLE_NAMES.any? { |v| field_name.to_s.index v }
24
- end
25
- target_field \
26
- || possible_title_fields.keys.first \
27
- || @model_class.primary_key
19
+ FieldUtils.first_field_by(
20
+ {
21
+ name: /title|name|label|string/,
22
+ type: 'string'
23
+ }, @fields
24
+ ) || @model_class.primary_key
28
25
  end
29
26
  end
30
27
  end
@@ -2,43 +2,30 @@
2
2
 
3
3
  module Wallaby
4
4
  class ActiveRecord
5
- # Model finder
5
+ # Finder to return all the appropriate ActiveRecord models.
6
6
  class ModelFinder < ::Wallaby::ModelFinder
7
- # @return [Array<Class>] a list of ActiveRecord subclasses
7
+ # Return a list of ActiveRecord::Base subclasses that aren't one of the following types:
8
+ #
9
+ # 1. abstract class
10
+ # 2. anonymous class
11
+ # 3. the HABTM relation class
12
+ # @return [Array<Class>]
8
13
  def all
9
- self.class.base.descendants.reject do |model_class|
10
- abstract?(model_class) || anonymous?(model_class) || habtm?(model_class)
14
+ ::ActiveRecord::Base.descendants.reject do |model_class|
15
+ defined?(::ApplicationRecord) && model_class == ::ApplicationRecord ||
16
+ model_class.abstract_class? ||
17
+ anonymous?(model_class) ||
18
+ model_class.name.index('HABTM')
11
19
  end.sort_by(&:to_s)
12
20
  end
13
21
 
14
- # This is only for ActiveRecord
15
- # @return [ApplicationRecord, ActiveRecord::Base] base ActiveRecord class
16
- def self.base
17
- return ::ApplicationRecord if defined? ::ApplicationRecord
18
-
19
- ::ActiveRecord::Base
20
- end
21
-
22
- private
23
-
24
- # Is model class abstract?
25
- # @param model_class [Class]
26
- # @return [Boolean]
27
- def abstract?(model_class)
28
- model_class.abstract_class?
29
- end
22
+ protected
30
23
 
31
24
  # @see Wallaby::ModuleUtils.anonymous_class?
32
25
  def anonymous?(model_class)
33
- ModuleUtils.anonymous_class? model_class
34
- end
35
-
36
- # Check and see if given model class is intermediate class that generated
37
- # for has and belongs to many assocation
38
- # @param model_class [Class]
39
- # @return [Boolean]
40
- def habtm?(model_class)
41
- model_class.name.index('HABTM')
26
+ ModuleUtils.anonymous_class?(model_class).tap do |result|
27
+ Logger.warn "Anonymous class is detected for table #{model_class.try :table_name}" if result
28
+ end
42
29
  end
43
30
  end
44
31
  end
@@ -8,25 +8,17 @@ module Wallaby
8
8
  # @return [true] if paginatable
9
9
  # @return [false] if not paginatable
10
10
  def paginatable?
11
- paginatable =
12
- # kaminari
13
- @collection.respond_to?(:total_count) || \
14
- @collection.respond_to?(:total_entries) # will_paginate
15
- Logger.warn "#{@collection.inspect} is not paginatable." unless paginatable
16
-
17
- paginatable
11
+ (@collection.respond_to?(:unscope) && @collection.respond_to?(:count)).tap do |paginatable|
12
+ Logger.warn "#{@collection} is not paginatable." unless paginatable
13
+ end
18
14
  end
19
15
 
20
16
  # @return [Integer] total count for the collection
21
17
  def total
22
- # kaminari
23
- @collection.try(:total_count) || \
24
- @collection.try(:total_entries) # will_paginate
18
+ @collection.unscope(:offset, :limit).count
25
19
  end
26
20
 
27
- # @return [Integer] page size from parameters or
28
- # {https://rubydoc.info/gems/wallaby-core/Wallaby/Configuration/Pagination#page_size-instance_method page_size}
29
- # Wallaby configuration
21
+ # @return [Integer] page size from parameters or Wallaby configuration
30
22
  def page_size
31
23
  (@params[:per] || Wallaby.configuration.pagination.page_size).to_i
32
24
  end
@@ -8,7 +8,6 @@ module Wallaby
8
8
  # @param action [String, Symbol]
9
9
  # @param authorizer
10
10
  # @return [ActionController::Parameters] whitelisted parameters
11
- # @see Wallaby::ModelServiceProvider#permit
12
11
  def permit(params, action, authorizer)
13
12
  authorized_fields = authorizer.permit_params action, @model_class
14
13
  params.require(param_key).permit(authorized_fields || permitted_fields)
@@ -18,7 +17,6 @@ module Wallaby
18
17
  # @param params [ActionController::Parameters]
19
18
  # @param authorizer [Ability] for now
20
19
  # @return [ActiveRecord::Relation] relation
21
- # @see Wallaby::ModelServiceProvider#collection
22
20
  def collection(params, authorizer)
23
21
  query = querier.search params
24
22
  query = query.order params[:sort] if params[:sort].present?
@@ -28,19 +26,15 @@ module Wallaby
28
26
  # @param query [ActiveRecord::Relation]
29
27
  # @param params [ActionController::Parameters]
30
28
  # @return [ActiveRecord::Relation] paginated query
31
- # @see Wallaby::ModelServiceProvider#paginate
32
29
  def paginate(query, params)
33
- # NOTE: do not take out the `.to_i` as will_paginate requires an integer `per_page`
34
30
  per = (params[:per] || Wallaby.configuration.pagination.page_size).to_i
35
- query = query.page params[:page] if query.respond_to? :page
36
- query = query.per per if query.respond_to? :per # kaminari
37
- query = query.per_page per if query.respond_to? :per_page # will_paginate
31
+ page = [params[:page].to_i, 1].max # starting from page 1
32
+ query = query.offset((page - 1) * per).limit(per)
38
33
  query
39
34
  end
40
35
 
41
36
  # @note No mass assignment happens here!
42
37
  # @return [Object] new resource object
43
- # @see Wallaby::ModelServiceProvider#new
44
38
  def new(_params, _authorizer)
45
39
  @model_class.new
46
40
  end
@@ -50,7 +44,6 @@ module Wallaby
50
44
  # @param id [Integer, String]
51
45
  # @return [Object] persisted resource object
52
46
  # @raise [Wallaby::ResourceNotFound] when record is not found
53
- # @see Wallaby::ModelServiceProvider#find
54
47
  def find(id, _params, _authorizer)
55
48
  @model_class.find id
56
49
  rescue ::ActiveRecord::RecordNotFound
@@ -61,7 +54,6 @@ module Wallaby
61
54
  # @param resource [Object]
62
55
  # @param params [ActionController::Parameters]
63
56
  # @param authorizer [Wallaby::ModelAuthorizer]
64
- # @see Wallaby::ModelServiceProvider#create
65
57
  def create(resource, params, authorizer)
66
58
  save __callee__, resource, params, authorizer
67
59
  end
@@ -70,14 +62,12 @@ module Wallaby
70
62
  # @param resource [Object]
71
63
  # @param params [ActionController::Parameters]
72
64
  # @param authorizer [Wallaby::ModelAuthorizer]
73
- # @see Wallaby::ModelServiceProvider#update
74
65
  def update(resource, params, authorizer)
75
66
  save __callee__, resource, params, authorizer
76
67
  end
77
68
 
78
69
  # Remove a record from database
79
70
  # @param resource [Object]
80
- # @see Wallaby::ModelServiceProvider#destroy
81
71
  def destroy(resource, _params, _authorizer)
82
72
  resource.destroy
83
73
  end
@@ -109,7 +99,8 @@ module Wallaby
109
99
 
110
100
  # See if a resource is valid
111
101
  # @param resource [Object]
112
- # @return [Boolean]
102
+ # @return [true] if valid
103
+ # @return [false] otherwise
113
104
  def valid?(resource)
114
105
  validator.valid? resource
115
106
  end
@@ -137,22 +128,22 @@ module Wallaby
137
128
  permitter.simple_field_names << permitter.compound_hashed_fields
138
129
  end
139
130
 
140
- # @see Wallaby::ModelServiceProvider::Permitter
131
+ # @return [Wallaby::ActiveRecord::ModelServiceProvider::Permitter]
141
132
  def permitter
142
133
  @permitter ||= Permitter.new @model_decorator
143
134
  end
144
135
 
145
- # @see Wallaby::ModelServiceProvider::Querier
136
+ # @return [Wallaby::ActiveRecord::ModelServiceProvider::Querier]
146
137
  def querier
147
138
  @querier ||= Querier.new @model_decorator
148
139
  end
149
140
 
150
- # @see Wallaby::ModelServiceProvider::Normalizer
141
+ # @return [Wallaby::ActiveRecord::ModelServiceProvider::Normalizer]
151
142
  def normalizer
152
143
  @normalizer ||= Normalizer.new @model_decorator
153
144
  end
154
145
 
155
- # @see Wallaby::ModelServiceProvider::Validator
146
+ # @return [Wallaby::ActiveRecord::ModelServiceProvider::Validator]
156
147
  def validator
157
148
  @validator ||= Validator.new @model_decorator
158
149
  end
@@ -3,7 +3,7 @@
3
3
  module Wallaby
4
4
  class ActiveRecord
5
5
  class ModelServiceProvider
6
- # Filter the params
6
+ # Whitelist the params for mass-assignment
7
7
  class Permitter
8
8
  # @param model_decorator [Wallaby::ModelDecorator]
9
9
  def initialize(model_decorator)
@@ -26,7 +26,7 @@ module Wallaby
26
26
  scope.where query
27
27
  end
28
28
 
29
- private
29
+ protected
30
30
 
31
31
  # @return [Arel::Table] arel table
32
32
  def table
@@ -11,6 +11,14 @@ module Wallaby
11
11
  PCT = '%' # :nodoc:
12
12
 
13
13
  class << self
14
+ # @example Return the escaped keyword if the first/last char of the keyword is `%`/`_`
15
+ # Wallaby::ActiveRecord::ModelServiceProvider::Querier::Escaper.execute('%something_else%')
16
+ # # => '%something\_else%'
17
+ # @example Return the escaped keyword wrapped with `%` if the first/last char of the keyword is NOT `%`/`_`
18
+ # Wallaby::ActiveRecord::ModelServiceProvider::Querier::Escaper.execute('keyword')
19
+ # # => '%keyword%'
20
+ # @param keyword [String]
21
+ # @return [String] escaped string for LIKE query
14
22
  def execute(keyword)
15
23
  first = keyword.first
16
24
  last = keyword.last
@@ -23,6 +31,12 @@ module Wallaby
23
31
  "#{starting}#{escaped}#{ending}"
24
32
  end
25
33
 
34
+ protected
35
+
36
+ # @param first_condition [Boolean] first condition
37
+ # @param first_char [Boolean] first char
38
+ # @param second_condition [nil, String] second condition
39
+ # @param default_sign [String]
26
40
  def sign(
27
41
  first_condition, first_char, second_condition, default_sign = PCT
28
42
  )
@@ -4,7 +4,9 @@ module Wallaby
4
4
  class ActiveRecord
5
5
  class ModelServiceProvider
6
6
  class Querier
7
- # Wrapper for the transform result
7
+ # Wrapper for the {Wallaby::ActiveRecord::ModelServiceProvider::Querier::Transformer} result.
8
+ # It's only used by {Wallaby::ActiveRecord::ModelServiceProvider::Querier} to tell it apart
9
+ # with non-{Wallaby::ActiveRecord::ModelServiceProvider::Querier::Transformer} result
8
10
  class Wrapper
9
11
  attr_reader :list
10
12
  delegate :push, to: :list
@@ -12,6 +14,7 @@ module Wallaby
12
14
  delegate :last, to: :list
13
15
  delegate :[], to: :last
14
16
 
17
+ # @param list [Array]
15
18
  def initialize(list = [])
16
19
  @list = list
17
20
  end
@@ -3,7 +3,7 @@
3
3
  module Wallaby
4
4
  class ActiveRecord
5
5
  class ModelServiceProvider
6
- # Validator
6
+ # Validate values for record create / update
7
7
  class Validator
8
8
  # @param model_decorator [Wallaby::ModelDecorator]
9
9
  def initialize(model_decorator)
@@ -11,7 +11,8 @@ module Wallaby
11
11
  end
12
12
 
13
13
  # @param resource [Object] resource object
14
- # @return [Boolean] whether the resource object is valid
14
+ # @return [true] if the resource object is valid
15
+ # @return [false] otherwise
15
16
  def valid?(resource)
16
17
  resource.attributes.each do |field_name, values|
17
18
  metadata = @model_decorator.fields[field_name]
@@ -22,10 +23,11 @@ module Wallaby
22
23
  resource.errors.blank?
23
24
  end
24
25
 
25
- private
26
+ protected
26
27
 
27
28
  # @param values [Array]
28
- # @return [Boolean] whether the values are valid range values
29
+ # @return [true] if the values are valid range values
30
+ # @return [false] otherwise
29
31
  def valid_range_type?(values, metadata)
30
32
  !metadata \
31
33
  || !%w(daterange tsrange tstzrange).include?(metadata[:type]) \
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Wallaby
4
4
  class ActiveRecord
5
- # Pundit provider for ActiveRecord
5
+ # Pundit provider for {Wallaby::ActiveRecord}
6
6
  class PunditProvider < PunditAuthorizationProvider
7
7
  # Filter a scope
8
8
  # @param _action [Symbol, String]
@@ -11,7 +11,7 @@ module Wallaby
11
11
  def accessible_for(_action, scope)
12
12
  Pundit.policy_scope! user, scope
13
13
  rescue Pundit::NotDefinedError
14
- Logger.warn "Cannot find scope policy for #{scope.inspect}."
14
+ Logger.warn "Cannot find scope policy for `#{scope}`."
15
15
  scope
16
16
  end
17
17
  end
@@ -6,7 +6,6 @@ require 'wallaby/active_record/version'
6
6
 
7
7
  # All files required for ActiveRecord ORM
8
8
  require 'adapters/wallaby/active_record'
9
- require 'adapters/wallaby/active_record/logger'
10
9
  require 'adapters/wallaby/active_record/model_finder'
11
10
 
12
11
  # ModelPaginationProvider: begin
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Wallaby
4
4
  module ActiveRecordGem
5
- VERSION = '0.2.4' # :nodoc:
5
+ VERSION = '0.2.5' # :nodoc:
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wallaby-active_record
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tian Chen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-21 00:00:00.000000000 Z
11
+ date: 2020-04-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -28,16 +28,16 @@ dependencies:
28
28
  name: wallaby-core
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: 0.2.0
33
+ version: 0.2.2
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: 0.2.0
40
+ version: 0.2.2
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: cancancan
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -106,7 +106,6 @@ files:
106
106
  - lib/adapters/wallaby/active_record.rb
107
107
  - lib/adapters/wallaby/active_record/cancancan_provider.rb
108
108
  - lib/adapters/wallaby/active_record/default_provider.rb
109
- - lib/adapters/wallaby/active_record/logger.rb
110
109
  - lib/adapters/wallaby/active_record/model_decorator.rb
111
110
  - lib/adapters/wallaby/active_record/model_decorator/fields_builder.rb
112
111
  - lib/adapters/wallaby/active_record/model_decorator/fields_builder/association_builder.rb
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Wallaby
4
- class ActiveRecord
5
- # move this to wallaby-core later
6
- class Logger
7
- class << self
8
- %w(debug warn info).each do |method_id|
9
- define_method method_id do |message, replacements = {}|
10
- source = caller(replacements.delete(:sourcing).try(:to_i) || 1, 1).first
11
- Rails.logger.public_send(
12
- method_id,
13
- "#{method_id.upcase}: #{format message, replacements}\nfrom #{source}"
14
- )
15
- nil
16
- end
17
- end
18
- end
19
- end
20
- end
21
- end