effective_resources 2.8.1 → 2.8.3
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 +4 -4
- data/README.md +13 -0
- data/app/models/concerns/acts_as_purchasable_wizard.rb +3 -1
- data/app/models/effective/resources/relation.rb +8 -6
- data/app/validators/content_type_validator.rb +50 -0
- data/app/validators/size_validator.rb +23 -0
- data/lib/effective_resources/version.rb +1 -1
- metadata +33 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a3306eaeb2757f8d71427567e38353c13c2ff2b7ebc9bfd4fa59dbfe24af3ed9
|
4
|
+
data.tar.gz: 561544b09df06f7210d0dd07a48547ac3b2d8661654fb0129e92f7ad413a4a56
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e7ca40c7ee7b3aa67659a45f62ecc86bd34e1ca3454f1baf0c601cd4437b960064ad9b58645dca6cfac931e327e86cbb39875dcda44eff32459caa7c94d6649c
|
7
|
+
data.tar.gz: 1489d7f93a9a8429f4cabe58c113864e7193f681feb6fc012ed2788d79b9be7f0ced3e12ae3622b30fd7beb122716249e987705f0b981f3f5df8b09e9c909a59
|
data/README.md
CHANGED
@@ -213,6 +213,19 @@ Just put another `app/views/posts/index.html.haml` in the posts directory to ove
|
|
213
213
|
|
214
214
|
Sure why not. These don't really fit into my code base anywhere else.
|
215
215
|
|
216
|
+
### acts_as_paginable
|
217
|
+
|
218
|
+
Quickly adds a `paginate` scope to your model that can then be used in your views and also integrates well with `effective_bootstrap`. The pagination method is `Limit and Offset`.
|
219
|
+
|
220
|
+
```ruby
|
221
|
+
# Given any model you just need to call it like
|
222
|
+
class Thing < ApplicationRecord
|
223
|
+
acts_as_paginable
|
224
|
+
end
|
225
|
+
|
226
|
+
# Now you can use it like:
|
227
|
+
Thing.all.paginate(page: 1, per_page: 5)
|
228
|
+
```
|
216
229
|
### acts_as_tokened
|
217
230
|
|
218
231
|
Quickly adds rails 5 `has_secure_token` to your model, along with some `Post.find()` enhancements to work with tokens instead of IDs.
|
@@ -72,8 +72,10 @@ module ActsAsPurchasableWizard
|
|
72
72
|
# From Billing Step
|
73
73
|
order.billing_address = owner.billing_address if owner.try(:billing_address).present?
|
74
74
|
|
75
|
+
# This will update all order items to match the prices from their
|
76
|
+
order.try(:update_purchasable_attributes)
|
77
|
+
|
75
78
|
# Important to add/remove anything
|
76
|
-
# This will update the prices, but the purchasables must be persisted
|
77
79
|
order.save!
|
78
80
|
|
79
81
|
order
|
@@ -313,11 +313,10 @@ module Effective
|
|
313
313
|
)
|
314
314
|
|
315
315
|
if as == :date
|
316
|
-
|
317
|
-
|
316
|
+
relation.where("#{sql_column} >= ? AND #{sql_column} < ?", term.to_date, (end_at + 1.day).to_date)
|
317
|
+
else
|
318
|
+
relation.where("#{sql_column} >= ? AND #{sql_column} <= ?", term, end_at)
|
318
319
|
end
|
319
|
-
|
320
|
-
relation.where("#{sql_column} >= ? AND #{sql_column} <= ?", term, end_at)
|
321
320
|
elsif value.respond_to?(:strftime) && operation == :eq
|
322
321
|
relation.where(attribute.matches(value))
|
323
322
|
end
|
@@ -347,7 +346,7 @@ module Effective
|
|
347
346
|
|
348
347
|
case operation
|
349
348
|
when :eq then relation.where("#{sql_column} = ?", term)
|
350
|
-
when :matches then search_columns_by_ilike_term(relation, term, columns: name)
|
349
|
+
when :matches then search_columns_by_ilike_term(relation, term, columns: (sql_column.presence || name))
|
351
350
|
when :not_eq then relation.where(attribute.not_eq(term))
|
352
351
|
when :does_not_match then relation.where(attribute.does_not_match("%#{term}%"))
|
353
352
|
when :starts_with then relation.where(attribute.matches("#{term}%"))
|
@@ -426,7 +425,10 @@ module Effective
|
|
426
425
|
|
427
426
|
# Do any of these columns contain all the terms?
|
428
427
|
conditions = columns.map do |name|
|
429
|
-
|
428
|
+
column = (name.to_s.include?('.') ? name : sql_column(name))
|
429
|
+
raise("expected an sql column for #{name}") if column.blank?
|
430
|
+
|
431
|
+
keys = terms.keys.map { |key| (fuzzy ? "#{column} #{ilike} :#{key}" : "#{column} = :#{key}") }
|
430
432
|
'(' + keys.join(' AND ') + ')'
|
431
433
|
end.join(' OR ')
|
432
434
|
|
@@ -0,0 +1,50 @@
|
|
1
|
+
#
|
2
|
+
# Custom validator for attachments' content types
|
3
|
+
#
|
4
|
+
# @example
|
5
|
+
#
|
6
|
+
# -> validates :image, content_type: :image
|
7
|
+
# -> validates :image, content_type: [:jpg, :webp]
|
8
|
+
# -> validates :image, content_type: [:image, :pdf]
|
9
|
+
# -> validates :image, content_type: { in: :image, message: 'must be a valid image' }
|
10
|
+
#
|
11
|
+
class ContentTypeValidator < ActiveModel::EachValidator
|
12
|
+
EXPANSIONS = {
|
13
|
+
image: %i[png jpeg jpg jpe pjpeg gif bmp svg webp],
|
14
|
+
document: %i[text txt docx doc xml pdf csv],
|
15
|
+
calendar: %i[ics],
|
16
|
+
spreadsheet: %i[xlsx xls],
|
17
|
+
video: %i[mpeg mpg mp3 m4a mpg4 aac webm mp4 m4v],
|
18
|
+
}.freeze
|
19
|
+
|
20
|
+
def validate_each(record, attribute, value)
|
21
|
+
# Support for optional attachments
|
22
|
+
return unless value.present? && value.attached?
|
23
|
+
|
24
|
+
keys = EXPANSIONS.keys
|
25
|
+
values = EXPANSIONS.values.flatten
|
26
|
+
options = instance_values["options"]
|
27
|
+
message = options.try(:[], :message) || "must have a valid content type"
|
28
|
+
types = options[:with] || options[:in]
|
29
|
+
|
30
|
+
# Ensure array and ensure symbols
|
31
|
+
types = [types].flatten.compact.map(&:to_sym)
|
32
|
+
|
33
|
+
allowed_types = []
|
34
|
+
types.each do |types|
|
35
|
+
if types.in?(keys)
|
36
|
+
allowed_types << EXPANSIONS[types]
|
37
|
+
elsif types.in?(values)
|
38
|
+
allowed_types << types
|
39
|
+
else
|
40
|
+
raise("unknown content_type types: #{types}")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
allowed_types = allowed_types.flatten.map(&:to_sym).uniq
|
44
|
+
|
45
|
+
unless value.filename.extension.to_sym.in?(allowed_types)
|
46
|
+
record.errors.add(attribute, message)
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
#
|
2
|
+
# Custom validator for file sizes
|
3
|
+
#
|
4
|
+
# @example
|
5
|
+
#
|
6
|
+
# -> validates :image, size: { less_than: 2.megabytes }
|
7
|
+
# -> validates :image, size: { less_than: 2.megabytes, message: 'is too large, please upload a file smaller than 2MB' }
|
8
|
+
#
|
9
|
+
class SizeValidator < ActiveModel::EachValidator
|
10
|
+
def validate_each(record, attribute, value)
|
11
|
+
return unless value.present? && value.attached?
|
12
|
+
|
13
|
+
options = instance_values["options"]
|
14
|
+
|
15
|
+
max_size = options.try(:[], :less_than) || 2.megabytes
|
16
|
+
message = options.try(:[], :message) || "is too large, please upload a file smaller than #{max_size / 1.megabyte}MB"
|
17
|
+
|
18
|
+
if value.blob.byte_size > max_size
|
19
|
+
record.errors.add(attribute, message)
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: effective_resources
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.8.
|
4
|
+
version: 2.8.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Code and Effect
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-06-
|
11
|
+
date: 2023-06-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -122,6 +122,34 @@ dependencies:
|
|
122
122
|
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: psych
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "<"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '4'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "<"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '4'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: net-smtp
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
125
153
|
description: Make any controller an effective resource controller.
|
126
154
|
email:
|
127
155
|
- info@codeandeffect.com
|
@@ -195,6 +223,8 @@ files:
|
|
195
223
|
- app/models/effective/resources/relation.rb
|
196
224
|
- app/models/effective/resources/sql.rb
|
197
225
|
- app/models/effective/resources/tenants.rb
|
226
|
+
- app/validators/content_type_validator.rb
|
227
|
+
- app/validators/size_validator.rb
|
198
228
|
- app/views/application/_flash.html.haml
|
199
229
|
- app/views/application/create.js.erb
|
200
230
|
- app/views/application/destroy.js.erb
|
@@ -244,7 +274,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
244
274
|
- !ruby/object:Gem::Version
|
245
275
|
version: '0'
|
246
276
|
requirements: []
|
247
|
-
rubygems_version: 3.
|
277
|
+
rubygems_version: 3.3.7
|
248
278
|
signing_key:
|
249
279
|
specification_version: 4
|
250
280
|
summary: Make any controller an effective resource controller.
|