trailblazer-rails 0.2.4 → 2.4.1
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 +5 -5
- data/.github/workflows/ci.yml +32 -0
- data/.gitignore +8 -2
- data/Appraisals +19 -0
- data/CHANGES.md +130 -0
- data/Gemfile +11 -5
- data/LICENSE.txt +1 -1
- data/README.md +20 -8
- data/Rakefile +10 -2
- data/TESTING.md +9 -0
- data/gemfiles/rails_5.2.gemfile +17 -0
- data/gemfiles/rails_5.2.gemfile.lock +187 -0
- data/gemfiles/rails_6.0.gemfile +17 -0
- data/gemfiles/rails_6.0.gemfile.lock +187 -0
- data/gemfiles/rails_6.1.gemfile +17 -0
- data/gemfiles/rails_6.1.gemfile.lock +186 -0
- data/gemfiles/rails_7.0.gemfile +17 -0
- data/gemfiles/rails_7.0.gemfile.lock +185 -0
- data/lib/trailblazer/rails/cell.rb +32 -0
- data/lib/trailblazer/rails/controller.rb +75 -0
- data/lib/trailblazer/rails/form.rb +21 -0
- data/lib/trailblazer/rails/railtie.rb +13 -28
- data/lib/trailblazer/rails/version.rb +1 -1
- data/lib/trailblazer/rails.rb +4 -20
- data/lib/trailblazer-rails.rb +1 -0
- data/trailblazer-rails.gemspec +9 -19
- metadata +37 -122
- data/.travis.yml +0 -4
- data/lib/trailblazer/operation/controller/active_record.rb +0 -21
- data/lib/trailblazer/operation/model/active_model.rb +0 -11
- data/lib/trailblazer/operation/responder.rb +0 -23
- data/lib/trailblazer/operation/worker.rb +0 -112
- data/lib/trailblazer/rails/autoloading.rb +0 -3
- data/lib/trailblazer/rails/test/integration.rb +0 -6
@@ -0,0 +1,21 @@
|
|
1
|
+
module Trailblazer
|
2
|
+
class Rails::Form < SimpleDelegator
|
3
|
+
def initialize(delegated, model_class)
|
4
|
+
super(delegated)
|
5
|
+
@model_class = model_class
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.name
|
9
|
+
# for whatever reason, validations climb up the inheritance tree and require _every_ class to have a name (4.1).
|
10
|
+
"Reform::Form"
|
11
|
+
end
|
12
|
+
|
13
|
+
def model_name
|
14
|
+
::ActiveModel::Name.new(self, nil, @model_class.to_s.camelize)
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_model
|
18
|
+
self
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -1,40 +1,25 @@
|
|
1
1
|
require "rails/railtie"
|
2
|
-
require "trailblazer/loader"
|
3
2
|
|
4
3
|
module Trailblazer
|
5
4
|
class Railtie < ::Rails::Railtie
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
# This is to autoload Operation::Dispatch, etc. I'm simply assuming people find this helpful in Rails.
|
11
|
-
initializer "trailblazer.library_autoloading" do
|
12
|
-
require "trailblazer/autoloading"
|
13
|
-
end
|
5
|
+
config.trailblazer = ActiveSupport::OrderedOptions.new
|
6
|
+
## Accept also an Array of controllers
|
7
|
+
config.trailblazer.application_controller ||= %w[ActionController::Base ActionController::API]
|
8
|
+
config.trailblazer.enable_tracing ||= false
|
14
9
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
# initializers.
|
19
|
-
ActionDispatch::Reloader.to_prepare do
|
20
|
-
Trailblazer::Railtie.load_concepts(app)
|
10
|
+
initializer "trailblazer.application_controller", before: "finisher_hook" do
|
11
|
+
ActiveSupport.on_load(:action_controller) do |app|
|
12
|
+
Trailblazer::Railtie.extend_application_controller!(app)
|
21
13
|
end
|
22
14
|
end
|
23
15
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
ActiveSupport.on_load(:action_controller) do
|
30
|
-
include Trailblazer::Operation::Controller
|
16
|
+
def extend_application_controller!(app)
|
17
|
+
controllers = Array(::Rails.application.config.trailblazer.application_controller).map(&:to_s)
|
18
|
+
if controllers.include? app.to_s
|
19
|
+
app.send :include, Trailblazer::Rails::Controller
|
20
|
+
app.send :include, Trailblazer::Rails::Controller::Cell if defined?(::Cell)
|
31
21
|
end
|
32
|
-
|
33
|
-
|
34
|
-
# Prepend model file, before the concept files like operation.rb get loaded.
|
35
|
-
ModelFile = ->(input, options) do
|
36
|
-
model = "app/models/#{options[:name]}.rb"
|
37
|
-
File.exist?(model) ? [model]+input : input
|
22
|
+
app
|
38
23
|
end
|
39
24
|
end
|
40
25
|
end
|
data/lib/trailblazer/rails.rb
CHANGED
@@ -2,27 +2,11 @@ require "trailblazer/rails/version"
|
|
2
2
|
|
3
3
|
module Trailblazer
|
4
4
|
module Rails
|
5
|
-
# Your code goes here...
|
6
5
|
end
|
7
6
|
end
|
8
7
|
|
8
|
+
require "trailblazer/rails/controller"
|
9
|
+
require "trailblazer/rails/cell"
|
10
|
+
require "trailblazer/rails/form"
|
9
11
|
require "trailblazer/rails/railtie"
|
10
|
-
|
11
|
-
require "trailblazer/operation"
|
12
|
-
# TODO: remove that once i18n, validations etc in Reform/AM are sorted.
|
13
|
-
Trailblazer::Operation.contract_class.class_eval do
|
14
|
-
def self.name
|
15
|
-
# for whatever reason, validations climb up the inheritance tree and require _every_ class to have a name (4.1).
|
16
|
-
"Reform::Form"
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
# Automatically set model_name on operation's contract when `Op::Model` is included.
|
21
|
-
require "trailblazer/operation/model"
|
22
|
-
require "trailblazer/operation/model/active_model"
|
23
|
-
Trailblazer::Operation::Model::DSL.module_eval do
|
24
|
-
include Trailblazer::Operation::Model::ActiveModel # ::contract.
|
25
|
-
end
|
26
|
-
|
27
|
-
require "trailblazer/autoloading"
|
28
|
-
require "trailblazer/rails/autoloading"
|
12
|
+
require "trailblazer"
|
@@ -0,0 +1 @@
|
|
1
|
+
require "trailblazer/rails" # rubocop:disable Naming/FileName
|
data/trailblazer-rails.gemspec
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
-
|
2
|
-
lib = File.expand_path('../lib', __FILE__)
|
1
|
+
lib = File.expand_path("lib", __dir__)
|
3
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
3
|
+
require "trailblazer/rails/version"
|
5
4
|
|
6
5
|
Gem::Specification.new do |spec|
|
7
6
|
spec.name = "trailblazer-rails"
|
@@ -9,26 +8,17 @@ Gem::Specification.new do |spec|
|
|
9
8
|
spec.authors = ["Nick Sutterer"]
|
10
9
|
spec.email = ["apotonick@gmail.com"]
|
11
10
|
|
12
|
-
spec.summary =
|
13
|
-
spec.homepage = "
|
11
|
+
spec.summary = "Convenient Rails support for Trailblazer."
|
12
|
+
spec.homepage = "https://trailblazer.to/2.1/docs/trailblazer.html#trailblazer-rails"
|
14
13
|
spec.license = "MIT"
|
15
14
|
|
16
|
-
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test
|
17
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
15
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test)/}) }
|
18
16
|
spec.require_paths = ["lib"]
|
19
17
|
|
20
|
-
spec.add_dependency "
|
21
|
-
spec.add_dependency "trailblazer
|
18
|
+
spec.add_dependency "railties", ">= 5.2.0"
|
19
|
+
spec.add_dependency "trailblazer", ">= 2.1.0", "< 2.2.0"
|
22
20
|
|
23
|
-
spec.add_development_dependency "bundler"
|
24
|
-
spec.add_development_dependency "rake", "~> 10.0"
|
21
|
+
spec.add_development_dependency "bundler"
|
25
22
|
spec.add_development_dependency "minitest"
|
26
|
-
spec.add_development_dependency "
|
27
|
-
spec.add_development_dependency "actionpack", '>= 3.0.0' # Rails is optional.
|
28
|
-
spec.add_development_dependency "sqlite3"
|
29
|
-
spec.add_development_dependency "responders"
|
30
|
-
spec.add_development_dependency "database_cleaner"
|
31
|
-
spec.add_development_dependency "sidekiq", ">= 3.1.0"
|
32
|
-
|
33
|
-
spec.add_development_dependency "multi_json"
|
23
|
+
spec.add_development_dependency "rake"
|
34
24
|
end
|
metadata
CHANGED
@@ -1,129 +1,51 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trailblazer-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Sutterer
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-06-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 1.0.4
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: 1.0.4
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: trailblazer-loader
|
14
|
+
name: railties
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
30
16
|
requirements:
|
31
17
|
- - ">="
|
32
18
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
19
|
+
version: 5.2.0
|
34
20
|
type: :runtime
|
35
21
|
prerelease: false
|
36
22
|
version_requirements: !ruby/object:Gem::Requirement
|
37
23
|
requirements:
|
38
24
|
- - ">="
|
39
25
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: bundler
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '1.10'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '1.10'
|
26
|
+
version: 5.2.0
|
55
27
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '10.0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '10.0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: minitest
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: rails
|
28
|
+
name: trailblazer
|
85
29
|
requirement: !ruby/object:Gem::Requirement
|
86
30
|
requirements:
|
87
31
|
- - ">="
|
88
32
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
90
|
-
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: actionpack
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - ">="
|
33
|
+
version: 2.1.0
|
34
|
+
- - "<"
|
102
35
|
- !ruby/object:Gem::Version
|
103
|
-
version:
|
104
|
-
type: :
|
36
|
+
version: 2.2.0
|
37
|
+
type: :runtime
|
105
38
|
prerelease: false
|
106
39
|
version_requirements: !ruby/object:Gem::Requirement
|
107
40
|
requirements:
|
108
41
|
- - ">="
|
109
42
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
111
|
-
-
|
112
|
-
name: sqlite3
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - ">="
|
43
|
+
version: 2.1.0
|
44
|
+
- - "<"
|
116
45
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - ">="
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '0'
|
46
|
+
version: 2.2.0
|
125
47
|
- !ruby/object:Gem::Dependency
|
126
|
-
name:
|
48
|
+
name: bundler
|
127
49
|
requirement: !ruby/object:Gem::Requirement
|
128
50
|
requirements:
|
129
51
|
- - ">="
|
@@ -137,7 +59,7 @@ dependencies:
|
|
137
59
|
- !ruby/object:Gem::Version
|
138
60
|
version: '0'
|
139
61
|
- !ruby/object:Gem::Dependency
|
140
|
-
name:
|
62
|
+
name: minitest
|
141
63
|
requirement: !ruby/object:Gem::Requirement
|
142
64
|
requirements:
|
143
65
|
- - ">="
|
@@ -151,21 +73,7 @@ dependencies:
|
|
151
73
|
- !ruby/object:Gem::Version
|
152
74
|
version: '0'
|
153
75
|
- !ruby/object:Gem::Dependency
|
154
|
-
name:
|
155
|
-
requirement: !ruby/object:Gem::Requirement
|
156
|
-
requirements:
|
157
|
-
- - ">="
|
158
|
-
- !ruby/object:Gem::Version
|
159
|
-
version: 3.1.0
|
160
|
-
type: :development
|
161
|
-
prerelease: false
|
162
|
-
version_requirements: !ruby/object:Gem::Requirement
|
163
|
-
requirements:
|
164
|
-
- - ">="
|
165
|
-
- !ruby/object:Gem::Version
|
166
|
-
version: 3.1.0
|
167
|
-
- !ruby/object:Gem::Dependency
|
168
|
-
name: multi_json
|
76
|
+
name: rake
|
169
77
|
requirement: !ruby/object:Gem::Requirement
|
170
78
|
requirements:
|
171
79
|
- - ">="
|
@@ -178,35 +86,43 @@ dependencies:
|
|
178
86
|
- - ">="
|
179
87
|
- !ruby/object:Gem::Version
|
180
88
|
version: '0'
|
181
|
-
description:
|
89
|
+
description:
|
182
90
|
email:
|
183
91
|
- apotonick@gmail.com
|
184
92
|
executables: []
|
185
93
|
extensions: []
|
186
94
|
extra_rdoc_files: []
|
187
95
|
files:
|
96
|
+
- ".github/workflows/ci.yml"
|
188
97
|
- ".gitignore"
|
189
|
-
-
|
98
|
+
- Appraisals
|
190
99
|
- CHANGES.md
|
191
100
|
- Gemfile
|
192
101
|
- LICENSE.txt
|
193
102
|
- README.md
|
194
103
|
- Rakefile
|
195
|
-
-
|
196
|
-
-
|
197
|
-
-
|
198
|
-
-
|
104
|
+
- TESTING.md
|
105
|
+
- gemfiles/rails_5.2.gemfile
|
106
|
+
- gemfiles/rails_5.2.gemfile.lock
|
107
|
+
- gemfiles/rails_6.0.gemfile
|
108
|
+
- gemfiles/rails_6.0.gemfile.lock
|
109
|
+
- gemfiles/rails_6.1.gemfile
|
110
|
+
- gemfiles/rails_6.1.gemfile.lock
|
111
|
+
- gemfiles/rails_7.0.gemfile
|
112
|
+
- gemfiles/rails_7.0.gemfile.lock
|
113
|
+
- lib/trailblazer-rails.rb
|
199
114
|
- lib/trailblazer/rails.rb
|
200
|
-
- lib/trailblazer/rails/
|
115
|
+
- lib/trailblazer/rails/cell.rb
|
116
|
+
- lib/trailblazer/rails/controller.rb
|
117
|
+
- lib/trailblazer/rails/form.rb
|
201
118
|
- lib/trailblazer/rails/railtie.rb
|
202
|
-
- lib/trailblazer/rails/test/integration.rb
|
203
119
|
- lib/trailblazer/rails/version.rb
|
204
120
|
- trailblazer-rails.gemspec
|
205
|
-
homepage:
|
121
|
+
homepage: https://trailblazer.to/2.1/docs/trailblazer.html#trailblazer-rails
|
206
122
|
licenses:
|
207
123
|
- MIT
|
208
124
|
metadata: {}
|
209
|
-
post_install_message:
|
125
|
+
post_install_message:
|
210
126
|
rdoc_options: []
|
211
127
|
require_paths:
|
212
128
|
- lib
|
@@ -221,9 +137,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
221
137
|
- !ruby/object:Gem::Version
|
222
138
|
version: '0'
|
223
139
|
requirements: []
|
224
|
-
|
225
|
-
|
226
|
-
signing_key:
|
140
|
+
rubygems_version: 3.1.6
|
141
|
+
signing_key:
|
227
142
|
specification_version: 4
|
228
143
|
summary: Convenient Rails support for Trailblazer.
|
229
144
|
test_files: []
|
data/.travis.yml
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
# Assigns an additional instance variable for +@model+ named after the model's table name (e.g. @comment).
|
2
|
-
#
|
3
|
-
# THIS MODULE IS DEPRECATED!
|
4
|
-
#
|
5
|
-
# Please don't use this module. Instead, use @model in your controller or pass the
|
6
|
-
# operation instance to a cell to present it.
|
7
|
-
module Trailblazer::Operation::Controller::ActiveRecord
|
8
|
-
private
|
9
|
-
def setup_operation_instance_variables!(operation, options)
|
10
|
-
super
|
11
|
-
instance_variable_set(:"@#{operation_model_name}", @model)
|
12
|
-
end
|
13
|
-
|
14
|
-
def operation_model_name
|
15
|
-
# set the right variable name if collection
|
16
|
-
if @operation.is_a?(Trailblazer::Operation::Collection)
|
17
|
-
return @model.model.table_name.split(".").last
|
18
|
-
end
|
19
|
-
@model.class.table_name.split(".").last.singularize
|
20
|
-
end
|
21
|
-
end
|
@@ -1,11 +0,0 @@
|
|
1
|
-
module Trailblazer
|
2
|
-
module Operation::Model
|
3
|
-
# Automatically set model_name on operation's contract.
|
4
|
-
module ActiveModel
|
5
|
-
def contract(*, &block)
|
6
|
-
super
|
7
|
-
contract_class.model(model_class) # this assumes that Form::ActiveModel is mixed in.
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
module Trailblazer::Operation::Responder
|
2
|
-
def self.included(base)
|
3
|
-
base.extend ClassMethods
|
4
|
-
end
|
5
|
-
|
6
|
-
module ClassMethods
|
7
|
-
def model_name
|
8
|
-
model_class.model_name
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
extend Forwardable
|
13
|
-
def_delegators :@model, :to_param, :destroyed?, :persisted?
|
14
|
-
|
15
|
-
def errors
|
16
|
-
return [] if @valid
|
17
|
-
[1]
|
18
|
-
end
|
19
|
-
|
20
|
-
def to_model
|
21
|
-
@model
|
22
|
-
end
|
23
|
-
end
|
@@ -1,112 +0,0 @@
|
|
1
|
-
require 'sidekiq/worker'
|
2
|
-
require 'active_support/core_ext/hash/indifferent_access'
|
3
|
-
|
4
|
-
#setup in initialize: when Op.run() with Worker, the policy will be run "delayed" and not with the actual permission set. this will result in many crashing sidekiq workers.
|
5
|
-
|
6
|
-
class Trailblazer::Operation
|
7
|
-
# only kicks in when Operation::run, #run will still do it real-time
|
8
|
-
# Works with Reform 2, only.
|
9
|
-
module Worker
|
10
|
-
def self.included(base)
|
11
|
-
base.send(:include, Sidekiq::Worker)
|
12
|
-
base.extend(ClassMethods)
|
13
|
-
end
|
14
|
-
|
15
|
-
module ClassMethods
|
16
|
-
def run(params)
|
17
|
-
if background?
|
18
|
-
return perform_async(serializable(params))
|
19
|
-
end
|
20
|
-
|
21
|
-
super(params)
|
22
|
-
end
|
23
|
-
|
24
|
-
def new(*args)
|
25
|
-
return super if args.any?
|
26
|
-
# sidekiq behavior: (not a big fan of this)
|
27
|
-
self
|
28
|
-
end
|
29
|
-
|
30
|
-
def perform(params) # called by Sidekiq.
|
31
|
-
build_operation(params).perform
|
32
|
-
end
|
33
|
-
|
34
|
-
def jid=(jid)
|
35
|
-
puts "@@@@@ #{jid.inspect}"
|
36
|
-
end
|
37
|
-
|
38
|
-
private
|
39
|
-
def perform_async(*args)
|
40
|
-
client_push('class' => self, 'args' => args) # calls class.new.perform(params)
|
41
|
-
end
|
42
|
-
|
43
|
-
def background? # TODO: make configurable.
|
44
|
-
true
|
45
|
-
# if Rails.env == "production" or Rails.env == "staging"
|
46
|
-
end
|
47
|
-
|
48
|
-
def serializable(params)
|
49
|
-
params # this is where we convert file uloads into Trailblazer::UploadedFile, etc. soon.
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
|
54
|
-
def perform#(params)
|
55
|
-
# the serialized params hash from Sidekiq contains a Op::UploadedFile hash.
|
56
|
-
|
57
|
-
# the following code is basically what happens in a controller.
|
58
|
-
# this is a bug in Rails, it doesn't work without requiring as/hash/ina
|
59
|
-
# params = ActiveSupport::HashWithIndifferentAccess.new_from_hash_copying_default(params) # TODO: this might make it ultra-slow as Reform converts it back to strings.
|
60
|
-
params = @params.with_indifferent_access
|
61
|
-
@params = deserializable(params)
|
62
|
-
run
|
63
|
-
end
|
64
|
-
|
65
|
-
private
|
66
|
-
def deserializable(params)
|
67
|
-
params # this is where we convert file uloads into Trailblazer::UploadedFile, etc. soon.
|
68
|
-
end
|
69
|
-
|
70
|
-
|
71
|
-
# Overrides ::serializable and #deserializable and handles file properties from the Contract schema.
|
72
|
-
module FileMarshaller
|
73
|
-
# NOTE: this is WIP and the implementation will be more understandable and performant soon.
|
74
|
-
def self.included(base)
|
75
|
-
base.extend ClassMethods
|
76
|
-
end
|
77
|
-
|
78
|
-
|
79
|
-
private
|
80
|
-
module ClassMethods
|
81
|
-
def file_marshaller_representer
|
82
|
-
@file_marshaller_representer ||= contract_class.schema(include: [Representable::Hash]).apply do |dfn|
|
83
|
-
dfn.merge!(
|
84
|
-
getter: lambda { |*| self[dfn.name.to_sym] },
|
85
|
-
setter: lambda { |fragment, *| self[dfn.name.to_s] = fragment }
|
86
|
-
) # FIXME: allow both sym and str.
|
87
|
-
|
88
|
-
dfn.merge!(class: Hash) and next if dfn[:form] or dfn[:twin] # nested properties need a class for deserialization.
|
89
|
-
next unless dfn[:file]
|
90
|
-
|
91
|
-
# TODO: where do we set /tmp/uploads?
|
92
|
-
dfn.merge!(
|
93
|
-
serialize: lambda { |file, *| Trailblazer::Operation::UploadedFile.new(file, tmp_dir: "/tmp/uploads").to_hash },
|
94
|
-
deserialize: lambda { |object, hash, *| Trailblazer::Operation::UploadedFile.from_hash(hash) },
|
95
|
-
class: Hash
|
96
|
-
)
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
def serializable(params)
|
101
|
-
file_marshaller_representer.new(params).to_hash
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
# todo: do with_indifferent_access in #deserialize and call super here.
|
106
|
-
def deserializable(hash)
|
107
|
-
# self.class.file_marshaller_representer.new({}).extend(Representable::Debug).from_hash(hash)
|
108
|
-
self.class.file_marshaller_representer.new({}.with_indifferent_access).from_hash(hash)
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|