readymade 0.2.4 → 0.2.7

Sign up to get free protection for your applications and to get access to all the features.
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