readymade 0.2.4 → 0.2.7

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: 1a6e8e90fddf55567acfe262c31551b786d880250075f4cd9c5c651cc4838dfe
4
- data.tar.gz: e2349c3664e83acbeb0321d822ae80ddab1ad3a8ec8f97377cc0b2a2117ede68
3
+ metadata.gz: 78de03a88081398d6f7a8a5f3a16b5311d12488e9e0418e9cd3c8fba74295605
4
+ data.tar.gz: '0924386861d20eb8bb83426e1cbd824d35b7c72d027b8bc812ca21d8df858984'
5
5
  SHA512:
6
- metadata.gz: e71191a5f142db70281225f3593f26b3f1e063c5a700ee029db55ca99486ed5e734490da0bd9ed360abb0544f8d4d567949c10f8baef33653a6497934dc99320
7
- data.tar.gz: e1c077924ee5fa51a9e2e2ce9f7e520fcf75dda30c3a1400afc938154366abb587b8a0fda092d4dfb283d576a66b90ea34ee7823d21e4a8c880fd09f08c898ef
6
+ metadata.gz: 5a8182a959f3f8509835963292334ab7eb7912557ac04a312e86d746f77f406c4eb5252da002ba85226881e61e5ac7c8c37a5b818cd48b0c4270355320682834
7
+ data.tar.gz: 9b716935a3c69428018453240eb60d95a871b3a5862ad2e684258f8f152c737226766b33813a97047df86f3833825c2d4df184f7a7ff27cfe02cf1442f6548f0
data/CHANGELOG.md CHANGED
@@ -1,6 +1,24 @@
1
1
  Changelog
2
2
  All notable changes to this project will be documented in this file.
3
3
 
4
+ ## [0.2.7] - 2022-06-03
5
+
6
+ ### Improvement
7
+
8
+ * Update `Readymade::Model::ApiAttachable` to support browser native base64 encoding
9
+
10
+ ## [0.2.6] - 2022-05-24
11
+
12
+ ### Features
13
+
14
+ * Add `Readymade::Model::Filterable` - model concern for scopes filtering
15
+
16
+ ## [0.2.5] - 2022-05-19
17
+
18
+ ### Improvements
19
+
20
+ * Form#required_attributes returns `[]` if `params[:_destroy]` present
21
+
4
22
  ## [0.2.4] - 2022-05-12
5
23
 
6
24
  ### Fixes
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- readymade (0.2.4)
4
+ readymade (0.2.6)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -195,6 +195,21 @@ let(:avatar) { Rack::Test::UploadedFile.new(Rails.root.join('spec/support/assets
195
195
  let(:params) { { user: attributes_for(:user).merge!(avatar: to_api_file(avatar)) } }
196
196
  ```
197
197
 
198
+ ### Readymade::Model::Filterable
199
+
200
+ ```ruby
201
+ class User < ApplicationRecord
202
+ include Readyamde::Model::Filterable
203
+
204
+ scope :by_status, ->(status) { where(status: status) }
205
+ scope :by_role, ->(role) { where(role: role) }
206
+ end
207
+ ```
208
+
209
+ ```ruby
210
+ User.all.filter_collection({ by_status: 'active', by_role: 'manager' })
211
+ ```
212
+
198
213
  ## Development
199
214
 
200
215
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -45,6 +45,8 @@ module Readymade
45
45
  end
46
46
 
47
47
  def required_attributes
48
+ return [] if params.try(:[], :_destroy).present?
49
+
48
50
  @required_attributes ||= self.class::REQUIRED_ATTRIBUTES
49
51
  end
50
52
 
@@ -79,9 +81,17 @@ module Readymade
79
81
 
80
82
  # copy errors from nested forms into parent form
81
83
  def sync_nested_errors(nested_forms)
82
- nested_forms.each do |n_form|
83
- n_form.errors.each do |code, text|
84
- errors.add("#{n_form.humanized_name}.#{code}", text)
84
+ if rails_errors_v2?
85
+ nested_forms.each do |n_form|
86
+ n_form.errors.each do |code|
87
+ errors.add("#{n_form.humanized_name}.#{code.attribute}", code.message)
88
+ end
89
+ end
90
+ else
91
+ nested_forms.each do |n_form|
92
+ n_form.errors.each do |code, text|
93
+ errors.add("#{n_form.humanized_name}.#{code}", text)
94
+ end
85
95
  end
86
96
  end
87
97
 
@@ -92,7 +102,7 @@ module Readymade
92
102
  def sync_errors(from: self, to: record)
93
103
  return if [from, to].any?(&:blank?)
94
104
 
95
- if Rails.version.to_f > 6.0
105
+ if rails_errors_v2?
96
106
  from.errors.messages.each do |key, values|
97
107
  Array.wrap(values).uniq.each do |uv|
98
108
  to.errors.add(key, uv)
@@ -145,6 +155,12 @@ module Readymade
145
155
  {}
146
156
  end
147
157
 
158
+ private
159
+
160
+ def rails_errors_v2?
161
+ Rails.version.to_f > 6.0
162
+ end
163
+
148
164
  # EXAMPLE
149
165
  # class Items::Forms::Create::Value < ::Readymade::Form
150
166
  # PERMITTED_ATTRIBUTES = %i[vat_percent price_type item_category].freeze
@@ -49,7 +49,7 @@ module Readymade
49
49
  ActionDispatch::Http::UploadedFile.new(
50
50
  tempfile: Tempfile.new(attachment_file[:filename]).tap do |tf|
51
51
  tf.binmode
52
- tf.write(Base64.decode64(attachment_file[:base64]))
52
+ tf.write(Base64.decode64(attachment_file[:base64].split('base64,')[-1]))
53
53
  end,
54
54
  filename: attachment_file[:filename],
55
55
  type: Mime::Type.lookup_by_extension(File.extname(attachment_file[:filename])[1..]).to_s
@@ -58,4 +58,3 @@ module Readymade
58
58
  end
59
59
  end
60
60
  end
61
-
@@ -0,0 +1,34 @@
1
+ require 'active_support/concern'
2
+
3
+ module Readymade
4
+ module Model
5
+ module Filterable
6
+ extend ActiveSupport::Concern
7
+
8
+ module ClassMethods
9
+ def send_chain(methods, scope = self)
10
+ return scope if methods.blank?
11
+
12
+ if methods.respond_to?(:keys)
13
+ methods.inject(scope) do |obj, (method, value)|
14
+ obj.send(method, value)
15
+ end
16
+ else
17
+ methods.inject(scope) do |obj, method|
18
+ obj.send(method)
19
+ end
20
+ end
21
+ end
22
+
23
+ def filter_collection(filtering_params)
24
+ filtering_params.permit! if filtering_params.respond_to?(:permit)
25
+
26
+ regular_params = filtering_params.select { |_key, value| value.present? }.to_h
27
+ custom_params = filtering_params.to_h.select { |_key, value| value.is_a?(String) && value.start_with?('without_') }.values
28
+
29
+ send_chain(regular_params, send_chain(custom_params)).distinct
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Readymade
4
- VERSION = '0.2.4'
4
+ VERSION = '0.2.7'
5
5
  end
data/lib/readymade.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'readymade/model/api_attachable'
4
+ require 'readymade/model/filterable'
4
5
  require 'readymade/controller/serialization'
5
6
  require 'readymade/action'
6
7
  require 'readymade/form'
data/readymade.gemspec CHANGED
@@ -26,6 +26,7 @@ Gem::Specification.new do |spec|
26
26
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
27
27
  end
28
28
  spec.files << 'lib/readymade/model/api_attachable.rb'
29
+ spec.files << 'lib/readymade/model/filterable.rb'
29
30
  spec.files << 'lib/readymade/controller/serialization.rb'
30
31
  spec.bindir = 'exe'
31
32
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: readymade
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - OrestF
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-05-12 00:00:00.000000000 Z
11
+ date: 2022-06-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: byebug
@@ -77,6 +77,7 @@ files:
77
77
  - lib/readymade/form.rb
78
78
  - lib/readymade/instant_form.rb
79
79
  - lib/readymade/model/api_attachable.rb
80
+ - lib/readymade/model/filterable.rb
80
81
  - lib/readymade/operation.rb
81
82
  - lib/readymade/response.rb
82
83
  - lib/readymade/version.rb