readymade 0.1.8 → 0.2.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/CHANGELOG.md +18 -0
- data/Gemfile.lock +1 -1
- data/README.md +53 -2
- data/lib/readymade/action.rb +1 -2
- data/lib/readymade/controller/serialization.rb +1 -1
- data/lib/readymade/form.rb +1 -1
- data/lib/readymade/model/api_attachable.rb +61 -0
- data/lib/readymade/version.rb +1 -1
- data/lib/readymade.rb +1 -0
- data/readymade.gemspec +1 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f26bb52b5176c6325c252ac67735fbd6f21f26ad194d0dbdc9e915e421421840
|
4
|
+
data.tar.gz: b0500fc448b0681c6e436ad2f22fd2f43d880542500042a7bb9853a69d58fdd0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 93cde55d0896d28b379fa699846abed6e3d8e72d2dbae8f7027b2813cc4a5fa277d8b1c07f8d0fe1905890cbf0b2fa654caeed7a8b791ff4ada4ac995d0edfd9
|
7
|
+
data.tar.gz: b1928db06558f7d28c83cda0827f065f3e8278567647844ab9f768fdf70183b2b1126e6fc016cb93df0d36f258152713372c0f8ef899bfbb026b1d11e35c327f
|
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.3] - 2022-05-03
|
5
|
+
|
6
|
+
### Features
|
7
|
+
|
8
|
+
* Add `Readymade::Model::ApiAttachable` - add base64 format to your ActiveStorage
|
9
|
+
|
10
|
+
## [0.2.1] - 2022-04-21
|
11
|
+
|
12
|
+
### Improvements
|
13
|
+
|
14
|
+
* Update collection_response controller helper
|
15
|
+
|
16
|
+
## [0.2.0] - 2022-04-13
|
17
|
+
|
18
|
+
### Improvements
|
19
|
+
|
20
|
+
* Add support for ruby 3.0, 3.1
|
21
|
+
|
4
22
|
## [0.1.8] - 2022-03-30
|
5
23
|
|
6
24
|
### Improvements
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,15 @@
|
|
1
|
-
# Readymade
|
1
|
+
# Readymade
|
2
|
+
|
3
|
+
[](https://badge.fury.io/rb/readymade)
|
2
4
|
|
3
5
|
This gems contains basic components to follow [ABDI architecture](https://github.com/OrestF/OrestF/blob/master/abdi/ABDI_architecture.md)
|
4
6
|
|
7
|
+
### Tested with ruby:
|
8
|
+
|
9
|
+
- 3.1
|
10
|
+
- 3.0
|
11
|
+
- 2.7
|
12
|
+
|
5
13
|
## Installation
|
6
14
|
|
7
15
|
Add this line to your application's Gemfile:
|
@@ -32,7 +40,7 @@ Inherit your components from:
|
|
32
40
|
```ruby
|
33
41
|
response = Readymade::Response.new(:success, my_data: data)
|
34
42
|
response.success? # true
|
35
|
-
response =Readymade::Response.new(:fail, errors: errors)
|
43
|
+
response = Readymade::Response.new(:fail, errors: errors)
|
36
44
|
response.success? # false
|
37
45
|
response.fail? # true
|
38
46
|
response.status # 'fail'
|
@@ -143,6 +151,49 @@ class Orders::Operations::Create < Readymade::Operation
|
|
143
151
|
end
|
144
152
|
```
|
145
153
|
|
154
|
+
### Readymade::Controller::Serialization
|
155
|
+
|
156
|
+
```ruby
|
157
|
+
class MyController < ApplicationController
|
158
|
+
include Readymade::Controller::Serialization
|
159
|
+
end
|
160
|
+
```
|
161
|
+
|
162
|
+
Serialization helpers for controllers.
|
163
|
+
Dependencies that must be installed on your own:
|
164
|
+
- [blueprinter](https://rubygems.org/gems/blueprinter/)
|
165
|
+
- [pagy](https://rubygems.org/gems/pagy)
|
166
|
+
- [api-pagination](https://rubygems.org/gems/api-pagination)
|
167
|
+
|
168
|
+
### Readymade::Model::ApiAttachable
|
169
|
+
|
170
|
+
Add base64 attachments format for your models
|
171
|
+
|
172
|
+
```ruby
|
173
|
+
class User < ApplicationRecord
|
174
|
+
has_one_attached :avatar
|
175
|
+
has_many_attached :images
|
176
|
+
include Readymade::Model::ApiAttachable
|
177
|
+
# must be included after has_one_attached, has_many_attached declaration
|
178
|
+
# api_file = {
|
179
|
+
# base64: 'iVBORw0KGgoAAA....',
|
180
|
+
# filename: 'my_avatar.png'
|
181
|
+
# }
|
182
|
+
# record.avatar = api_file 🎉
|
183
|
+
end
|
184
|
+
```
|
185
|
+
|
186
|
+
copy [spec/support/api_attachable.rb](./spec/support/api_attachable.rb)
|
187
|
+
```ruby
|
188
|
+
def to_api_file(file)
|
189
|
+
{ base64: Base64.encode64(file.read), filename: file.original_filename }
|
190
|
+
end
|
191
|
+
```
|
192
|
+
```ruby
|
193
|
+
# rspec example
|
194
|
+
let(:avatar) { Rack::Test::UploadedFile.new(Rails.root.join('spec/support/assets/test-image.png'), 'image/png') }
|
195
|
+
let(:params) { { user: attributes_for(:user).merge!(avatar: to_api_file(avatar)) } }
|
196
|
+
```
|
146
197
|
|
147
198
|
## Development
|
148
199
|
|
data/lib/readymade/action.rb
CHANGED
@@ -12,11 +12,10 @@ module Readymade
|
|
12
12
|
|
13
13
|
attr_reader :args, :data
|
14
14
|
|
15
|
-
def initialize(
|
15
|
+
def initialize(args = {})
|
16
16
|
raise NonKeywordArgumentsError if args.present? && !args.is_a?(Hash)
|
17
17
|
|
18
18
|
@args = @data = args
|
19
|
-
|
20
19
|
@args.each do |name, value|
|
21
20
|
instance_variable_set("@#{name}", value)
|
22
21
|
end
|
@@ -25,7 +25,7 @@ module Readymade
|
|
25
25
|
|
26
26
|
render_json(
|
27
27
|
{
|
28
|
-
|
28
|
+
(options.delete(:root).presence || :items) => serialize_collection(paginate(collection, options), options),
|
29
29
|
count: collection.count
|
30
30
|
},
|
31
31
|
options[:status] || :ok
|
data/lib/readymade/form.rb
CHANGED
@@ -177,7 +177,7 @@ module Readymade
|
|
177
177
|
end
|
178
178
|
|
179
179
|
def to_h
|
180
|
-
raise Readymade::Error.new('define form_options on your form') unless (f = @f_class.new({},
|
180
|
+
raise Readymade::Error.new('define form_options on your form') unless (f = @f_class.new({}, **@args)).respond_to?(:form_options)
|
181
181
|
|
182
182
|
f.form_options
|
183
183
|
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'active_support/concern'
|
2
|
+
|
3
|
+
module Readymade
|
4
|
+
module Model
|
5
|
+
module ApiAttachable
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
# must be included after has_one_attached, has_many_attached declaration
|
8
|
+
# api_file = {
|
9
|
+
# base64: 'iVBORw0KGgoAAA....',
|
10
|
+
# filename: 'my_avatar.png'
|
11
|
+
# }
|
12
|
+
# record.avatar = api_file 🎉
|
13
|
+
|
14
|
+
included do
|
15
|
+
has_one_attached_reflections.map(&:name).each do |attachment_method_name|
|
16
|
+
define_method("#{attachment_method_name}=") do |attachment_file|
|
17
|
+
attachment_file = api_attachment_to_uploaded(attachment_file) if api_attachable_format?(attachment_file)
|
18
|
+
super(attachment_file)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
has_many_attached_reflections.map(&:name).each do |attachment_method_name|
|
23
|
+
define_method("#{attachment_method_name}=") do |attachment_file|
|
24
|
+
attachment_file = Array.wrap(attachment_file).map do |af|
|
25
|
+
api_attachment_to_uploaded(af) if api_attachable_format?(af)
|
26
|
+
end
|
27
|
+
super(attachment_file)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class_methods do
|
33
|
+
# rubocop:disable Naming/PredicateName
|
34
|
+
def has_one_attached_reflections
|
35
|
+
reflect_on_all_attachments.filter { |association| association.instance_of?(ActiveStorage::Reflection::HasOneAttachedReflection) }
|
36
|
+
end
|
37
|
+
|
38
|
+
def has_many_attached_reflections
|
39
|
+
reflect_on_all_attachments.filter { |association| association.instance_of?(ActiveStorage::Reflection::HasManyAttachedReflection) }
|
40
|
+
end
|
41
|
+
# rubocop:enable Naming/PredicateName
|
42
|
+
end
|
43
|
+
|
44
|
+
def api_attachable_format?(attachment_file)
|
45
|
+
attachment_file.respond_to?(:key?) && attachment_file.key?('base64') && attachment_file.key?('filename')
|
46
|
+
end
|
47
|
+
|
48
|
+
def api_attachment_to_uploaded(attachment_file)
|
49
|
+
ActionDispatch::Http::UploadedFile.new(
|
50
|
+
tempfile: Tempfile.new(attachment_file[:filename]).tap do |tf|
|
51
|
+
tf.binmode
|
52
|
+
tf.write(Base64.decode64(attachment_file[:base64]))
|
53
|
+
end,
|
54
|
+
filename: attachment_file[:filename],
|
55
|
+
type: Mime::Type.lookup_by_extension(File.extname(attachment_file[:filename])[1..]).to_s
|
56
|
+
)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
data/lib/readymade/version.rb
CHANGED
data/lib/readymade.rb
CHANGED
data/readymade.gemspec
CHANGED
@@ -25,6 +25,7 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
26
26
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
27
27
|
end
|
28
|
+
spec.files << 'lib/readymade/model/api_attachable.rb'
|
28
29
|
spec.files << 'lib/readymade/controller/serialization.rb'
|
29
30
|
spec.bindir = 'exe'
|
30
31
|
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.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- OrestF
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-03
|
11
|
+
date: 2022-05-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: byebug
|
@@ -76,6 +76,7 @@ files:
|
|
76
76
|
- lib/readymade/controller/serialization.rb
|
77
77
|
- lib/readymade/form.rb
|
78
78
|
- lib/readymade/instant_form.rb
|
79
|
+
- lib/readymade/model/api_attachable.rb
|
79
80
|
- lib/readymade/operation.rb
|
80
81
|
- lib/readymade/response.rb
|
81
82
|
- lib/readymade/version.rb
|
@@ -102,7 +103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
102
103
|
- !ruby/object:Gem::Version
|
103
104
|
version: '0'
|
104
105
|
requirements: []
|
105
|
-
rubygems_version: 3.
|
106
|
+
rubygems_version: 3.3.7
|
106
107
|
signing_key:
|
107
108
|
specification_version: 4
|
108
109
|
summary: Set of base classes for ABDI architecture
|